diff --git a/Content.Server/Zombies/ZombieSystem.cs b/Content.Server/Zombies/ZombieSystem.cs index b8f2bd56ed..d4f86fa96c 100644 --- a/Content.Server/Zombies/ZombieSystem.cs +++ b/Content.Server/Zombies/ZombieSystem.cs @@ -236,43 +236,47 @@ namespace Content.Server.Zombies return MathF.Max(chance, zombieComponent.MinZombieInfectionChance); } - private void OnMeleeHit(EntityUid uid, ZombieComponent component, MeleeHitEvent args) + private void OnMeleeHit(Entity entity, ref MeleeHitEvent args) { - if (!TryComp(args.User, out _)) + if (!args.IsHit) return; - if (!args.HitEntities.Any()) - return; + var cannotSpread = HasComp(args.User); - foreach (var entity in args.HitEntities) + foreach (var uid in args.HitEntities) { - if (args.User == entity) + if (args.User == uid) continue; - if (!TryComp(entity, out var mobState)) + if (!TryComp(uid, out var mobState)) continue; - if (HasComp(entity)) + if (HasComp(uid) || HasComp(uid)) { - args.BonusDamage = -args.BaseDamage; + // Don't infect, don't deal damage, do not heal from bites, don't pass go! + args.Handled = true; + continue; + } + + if (_mobState.IsAlive(uid, mobState)) + { + _damageable.TryChangeDamage(args.User, entity.Comp.HealingOnBite, true, false); + + // If we cannot infect the living target, the zed will just heal itself. + if (HasComp(uid) || cannotSpread || _random.Prob(GetZombieInfectionChance(uid, entity.Comp))) + continue; + + EnsureComp(uid); + EnsureComp(uid); } else { - if (!HasComp(entity) && !HasComp(args.User) && _random.Prob(GetZombieInfectionChance(entity, component))) - { - EnsureComp(entity); - EnsureComp(entity); - } - } + if (HasComp(uid) || cannotSpread) + continue; - if (_mobState.IsIncapacitated(entity, mobState) && !HasComp(entity) && !HasComp(entity) && !HasComp(args.User)) - { - ZombifyEntity(entity); - args.BonusDamage = -args.BaseDamage; - } - else if (mobState.CurrentState == MobState.Alive) //heals when zombies bite live entities - { - _damageable.TryChangeDamage(uid, component.HealingOnBite, true, false); + // If the target is dead and can be infected, infect. + ZombifyEntity(uid); + args.Handled = true; } } }