static void Postfix(Pawn_HealthTracker __instance, ref bool __result) { Pawn pawn = Traverse.Create(__instance).Field("pawn").GetValue <Pawn>(); if (!pawn.RaceProps.IsMechanoid) { return; } if (__result == true) { if (__instance.hediffSet.HasHediff(WTH_DefOf.WTH_HeavilyDamaged)) { __result = false; return; } if (Rand.Chance(Base.downedOnDeathThresholdChance.Value / 100f))//Chance mech goes down instead of dying when lethal threshold is achieved. { __instance.AddHediff(WTH_DefOf.WTH_HeavilyDamaged); if (pawn.mindState == null) { pawn.mindState = new Pawn_MindState(pawn); } __result = false; } } else { if (__instance.hediffSet.HasHediff(WTH_DefOf.WTH_HeavilyDamaged)) { __instance.RemoveHediff(__instance.hediffSet.GetFirstHediffOfDef(WTH_DefOf.WTH_HeavilyDamaged)); } } }
public override void OnIntervalPassed(Pawn pawn, Hediff cause) { foreach (PartStateRule rule in rules) { Pawn_HealthTracker pawnHealth = pawn.health; float partEfficiency = PawnCapacityUtility.CalculateTagEfficiency(pawnHealth.hediffSet, rule.tag); float severity = rule.curve.Evaluate(partEfficiency); Hediff hediff = pawnHealth.hediffSet.GetFirstHediffOfDef(rule.hediff); if (hediff == null) { if (severity == 0f) { continue; } hediff = HediffMaker.MakeHediff(rule.hediff, pawn, null); pawnHealth.AddHediff(hediff); } if (rule.mode != PartStateMode.AddRemove || severity == 0f) { hediff.Severity = severity; } } }
static void Postfix(Pawn_HealthTracker __instance) { List <Hediff> removedHediffs = __instance.hediffSet.hediffs.FindAll((Hediff h) => h.def.GetModExtension <DefModextension_Hediff>() is DefModextension_Hediff modExt && Rand.Chance(modExt.destroyOnDeathChance)); foreach (Hediff hediff in removedHediffs) { __instance.AddHediff(WTH_DefOf.WTH_DestroyedModule, hediff.Part); } __instance.hediffSet.hediffs = __instance.hediffSet.hediffs.Except(removedHediffs).ToList(); }
static void Postfix(Pawn_HealthTracker __instance, ref bool __result) { Pawn pawn = Traverse.Create(__instance).Field("pawn").GetValue <Pawn>(); if (!pawn.RaceProps.IsMechanoid) { return; } if (pawn.Faction != Faction.OfPlayer && !pawn.Faction.HostileTo(Faction.OfPlayer))//make sure allied mechs always die to prevent issues with relation penalties when the player hacks their mechs. { return; } if (__result == true) { if (__instance.hediffSet.HasHediff(WTH_DefOf.WTH_HeavilyDamaged)) { __result = false; return; } if (Rand.Chance(Base.downedOnDeathThresholdChance.Value / 100f))//Chance mech goes down instead of dying when lethal threshold is achieved. { __instance.AddHediff(WTH_DefOf.WTH_HeavilyDamaged); if (pawn.mindState == null) { pawn.mindState = new Pawn_MindState(pawn); } __result = false; } } else { if (__instance.hediffSet.HasHediff(WTH_DefOf.WTH_HeavilyDamaged)) { __instance.RemoveHediff(__instance.hediffSet.GetFirstHediffOfDef(WTH_DefOf.WTH_HeavilyDamaged)); } } }