private void OnMeleeHit(EntityUid uid, ZombieComponent component, MeleeHitEvent args)
        {
            if (!EntityManager.TryGetComponent <ZombieComponent>(args.User, out var zombieComp))
            {
                return;
            }

            if (!args.HitEntities.Any())
            {
                return;
            }

            foreach (EntityUid entity in args.HitEntities)
            {
                if (args.User == entity)
                {
                    continue;
                }

                if (!TryComp <MobStateComponent>(entity, out var mobState) || HasComp <DroneComponent>(entity))
                {
                    continue;
                }

                if (HasComp <DiseaseCarrierComponent>(entity) && _robustRandom.Prob(GetZombieInfectionChance(entity, component)))
                {
                    _disease.TryAddDisease(entity, "ActiveZombieVirus");
                }

                if (HasComp <ZombieComponent>(entity))
                {
                    args.BonusDamage = -args.BaseDamage * zombieComp.OtherZombieDamageCoefficient;
                }

                if ((mobState.IsDead() || mobState.IsCritical()) &&
                    !HasComp <ZombieComponent>(entity))
                {
                    _zombify.ZombifyEntity(entity);
                    args.BonusDamage = -args.BaseDamage;
                }
                else if (mobState.IsAlive()) //heals when zombies bite live entities
                {
                    var healingSolution = new Solution();
                    healingSolution.AddReagent("Bicaridine", 1.00); //if OP, reduce/change chem
                    _bloodstream.TryAddToChemicals(args.User, healingSolution);
                }
            }
        }
        private float GetZombieInfectionChance(EntityUid uid, ZombieComponent component)
        {
            float baseChance = component.MaxZombieInfectionChance;

            if (!TryComp <InventoryComponent>(uid, out var inventoryComponent))
            {
                return(baseChance);
            }

            var enumerator =
                new InventorySystem.ContainerSlotEnumerator(uid, inventoryComponent.TemplateId, _protoManager, _inv,
                                                            SlotFlags.FEET |
                                                            SlotFlags.HEAD |
                                                            SlotFlags.EYES |
                                                            SlotFlags.GLOVES |
                                                            SlotFlags.MASK |
                                                            SlotFlags.NECK |
                                                            SlotFlags.INNERCLOTHING |
                                                            SlotFlags.OUTERCLOTHING);

            var items = 0f;
            var total = 0f;

            while (enumerator.MoveNext(out var con))
            {
                total++;

                if (con.ContainedEntity != null)
                {
                    items++;
                }
            }

            var max = component.MaxZombieInfectionChance;
            var min = component.MinZombieInfectionChance;
            //gets a value between the max and min based on how many items the entity is wearing
            float chance = (max - min) * ((total - items) / total) + min;

            return(chance);
        }
        private void OnRefreshSpeed(EntityUid uid, ZombieComponent component, RefreshMovementSpeedModifiersEvent args)
        {
            var mod = component.ZombieMovementSpeedDebuff;

            args.ModifySpeed(mod, mod);
        }