// make zombies die if necessary ============================================================ // public static bool ShouldDie(this JobDriver_Stumble driver, Zombie zombie) { if (zombie.Dead || zombie.Spawned == false) { driver.EndJobWith(JobCondition.InterruptForced); return(true); } if (zombie.state == ZombieState.ShouldDie) { driver.EndJobWith(JobCondition.InterruptForced); zombie.Kill(null); return(true); } if (zombie.IsSuicideBomber) { if (zombie.bombWillGoOff && zombie.EveryNTick(NthTick.Every10)) { zombie.bombTickingInterval -= 2f; } if (zombie.bombTickingInterval <= 0f) { zombie.Kill(null); return(true); } } if (zombie.EveryNTick(NthTick.Every10)) { if (ZombieSettings.Values.zombiesDieVeryEasily) { if (zombie.hasTankySuit <= 0f && zombie.health.hediffSet.GetHediffs <Hediff_Injury>().Any()) { zombie.Kill(null); return(true); } } else { var hediffs = zombie.health.hediffSet.hediffs .Where(hediff => hediff.def == HediffDefOf.WoundInfection) .ToArray(); foreach (var hediff in hediffs) { zombie.health.RemoveHediff(hediff); } } } return(false); }
// handle downed zombies ==================================================================== // public static bool Downed(Zombie zombie) { if (zombie.IsDowned() == false) { return(false); } if (ZombieSettings.Values.zombiesDieVeryEasily || zombie.IsSuicideBomber || ZombieSettings.Values.doubleTapRequired == false) { zombie.Kill(null); return(true); } var walkCapacity = PawnCapacityUtility.CalculateCapacityLevel(zombie.health.hediffSet, PawnCapacityDefOf.Moving); var missingBrain = zombie.health.hediffSet.GetBrain() == null; if (walkCapacity < 0.25f || missingBrain) { zombie.Kill(null); return(true); } if (++zombie.healCounter >= Constants.ZOMBIE_HEALING_TICKS) { zombie.healCounter = 0; var injuries = zombie.health.hediffSet.GetHediffs <Hediff_Injury>(); foreach (var injury in injuries) { if (ZombieSettings.Values.zombiesDieVeryEasily) { zombie.Kill(null); return(true); } if (Tools.IsCombatExtendedInstalled()) { injury.Heal(combatExtendedHealAmount); } else { injury.Heal(injury.Severity + 0.5f); } break; } } return(false); }