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)); } } }
/// <summary> /// Initializes this instance. /// </summary> /// this is always called before enter and after loading a pawn protected override void Init() { base.Init(); Pawn_HealthTracker health = Pawn?.health; HediffSet hDiffs = health?.hediffSet; if (health == null || hDiffs == null) return; //fix for old saves HediffDef hDef = SapienceStateDefOf.FormerHuman.forcedHediff; Hediff hDiff = hDiffs.GetFirstHediffOfDef(hDef); if (hDiff != null) health.RemoveHediff(hDiff); }
// Token: 0x0600002E RID: 46 RVA: 0x00003F40 File Offset: 0x00002140 public override void CompPostTick(ref float severityAdjustment) { if (this.curing && this.ticksToCure > 0) { this.ticksToCure--; return; } if (this.curing) { this.parent.Severity = 0f; if (this.parent != null) { Pawn pawn = base.Pawn; if (pawn != null) { Pawn_HealthTracker health = pawn.health; if (health != null) { health.RemoveHediff(this.parent); } } } Messages.Message("MSRegen.CureMsg".Translate(base.Pawn.LabelShort.CapitalizeFirst(), base.Def.label.CapitalizeFirst()), base.Pawn, MessageTypeDefOf.PositiveEvent, true); return; } _ = new List <string>(); List <string> Immunities; if (MSRegenUtility.ImmuneTo(base.Pawn, base.Def, out Immunities)) { int ImmunitiesAsCure = 0; for (int i = 0; i < Immunities.Count; i++) { if (Immunities[i] != "MSCondom_High") { ImmunitiesAsCure++; } } if (ImmunitiesAsCure > 0) { this.SetTicksToCure(); this.curing = true; } } }
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)); } } }
public static bool HealthTick(Pawn_HealthTracker __instance) { if (__instance.Dead) { return(false); } for (int index = __instance.hediffSet.hediffs.Count - 1; index >= 0; --index) { Hediff hediff = __instance.hediffSet.hediffs[index]; try { hediff.Tick(); hediff.PostTick(); } catch (Exception ex1) { Log.Error("Exception ticking hediff " + hediff.ToStringSafe <Hediff>() + " for pawn " + __instance.pawn.ToStringSafe <Pawn>() + ". Removing hediff... Exception: " + (object)ex1); try { __instance.RemoveHediff(hediff); } catch (Exception ex2) { Log.Error("Error while removing hediff: " + (object)ex2); } } if (__instance.Dead) { return(false); } } bool flag1 = false; lock (__instance.hediffSet) //added { List <Hediff> newHediffs = new List <Hediff>(__instance.hediffSet.hediffs); //added for (int index = newHediffs.Count - 1; index >= 0; --index) //changed { Hediff hediff = newHediffs[index]; if (hediff.ShouldRemove) { newHediffs.RemoveAt(index); //changed __instance.hediffSet.hediffs = newHediffs; //added hediff.PostRemoved(); flag1 = true; } } } if (flag1) { __instance.Notify_HediffChanged((Hediff)null); } if (__instance.Dead) { return(false); } __instance.immunity.ImmunityHandlerTick(); if (__instance.pawn.RaceProps.IsFlesh && __instance.pawn.IsHashIntervalTick(600) && (__instance.pawn.needs.food == null || !__instance.pawn.needs.food.Starving)) { bool flag2 = false; if (__instance.hediffSet.HasNaturallyHealingInjury()) { float num = 8f; if (__instance.pawn.GetPosture() != PawnPosture.Standing) { num += 4f; Building_Bed buildingBed = __instance.pawn.CurrentBed(); if (buildingBed != null) { num += buildingBed.def.building.bed_healPerDay; } } foreach (Hediff hediff in __instance.hediffSet.hediffs) { HediffStage curStage = hediff.CurStage; if (curStage != null && (double)curStage.naturalHealingFactor != -1.0) { num *= curStage.naturalHealingFactor; } } __instance.hediffSet.GetHediffs <Hediff_Injury>().Where <Hediff_Injury>((Func <Hediff_Injury, bool>)(x => x.CanHealNaturally())).RandomElement <Hediff_Injury>().Heal((float)((double)num * (double)__instance.pawn.HealthScale * 0.00999999977648258) * __instance.pawn.GetStatValue(StatDefOf.InjuryHealingFactor)); flag2 = true; } if (__instance.hediffSet.HasTendedAndHealingInjury() && (__instance.pawn.needs.food == null || !__instance.pawn.needs.food.Starving)) { Hediff_Injury hd = __instance.hediffSet.GetHediffs <Hediff_Injury>().Where <Hediff_Injury>((Func <Hediff_Injury, bool>)(x => x.CanHealFromTending())).RandomElement <Hediff_Injury>(); hd.Heal((float)(8.0 * (double)GenMath.LerpDouble(0.0f, 1f, 0.5f, 1.5f, Mathf.Clamp01(hd.TryGetComp <HediffComp_TendDuration>().tendQuality)) * (double)__instance.pawn.HealthScale * 0.00999999977648258) * __instance.pawn.GetStatValue(StatDefOf.InjuryHealingFactor)); flag2 = true; } if (flag2 && !__instance.HasHediffsNeedingTendByPlayer() && (!HealthAIUtility.ShouldSeekMedicalRest(__instance.pawn) && !__instance.hediffSet.HasTendedAndHealingInjury()) && PawnUtility.ShouldSendNotificationAbout(__instance.pawn)) { Messages.Message((string)"MessageFullyHealed".Translate((NamedArgument)__instance.pawn.LabelCap, (NamedArgument)(Thing)__instance.pawn), (LookTargets)(Thing)__instance.pawn, MessageTypeDefOf.PositiveEvent); } } if (__instance.pawn.RaceProps.IsFlesh && (double)__instance.hediffSet.BleedRateTotal >= 0.100000001490116) { float num = __instance.hediffSet.BleedRateTotal * __instance.pawn.BodySize; if ((double)Rand.Value < (__instance.pawn.GetPosture() != PawnPosture.Standing ? (double)(num * 0.0004f) : (double)(num * 0.004f))) { __instance.DropBloodFilth(); } } if (!__instance.pawn.IsHashIntervalTick(60)) { return(false); } List <HediffGiverSetDef> hediffGiverSets = __instance.pawn.RaceProps.hediffGiverSets; if (hediffGiverSets != null) { for (int index1 = 0; index1 < hediffGiverSets.Count; ++index1) { List <HediffGiver> hediffGivers = hediffGiverSets[index1].hediffGivers; for (int index2 = 0; index2 < hediffGivers.Count; ++index2) { hediffGivers[index2].OnIntervalPassed(__instance.pawn, (Hediff)null); if (__instance.pawn.Dead) { return(false); } } } } if (__instance.pawn.story == null) { return(false); } List <Trait> allTraits = __instance.pawn.story.traits.allTraits; for (int index = 0; index < allTraits.Count; ++index) { TraitDegreeData currentData = allTraits[index].CurrentData; if ((double)currentData.randomDiseaseMtbDays > 0.0 && Rand.MTBEventOccurs(currentData.randomDiseaseMtbDays, 60000f, 60f)) { BiomeDef biome = __instance.pawn.Tile == -1 ? DefDatabase <BiomeDef> .GetRandom() : Find.WorldGrid[__instance.pawn.Tile].biome; IncidentDef incidentDef = DefDatabase <IncidentDef> .AllDefs.Where <IncidentDef>((Func <IncidentDef, bool>)(d => d.category == IncidentCategoryDefOf.DiseaseHuman)).RandomElementByWeightWithFallback <IncidentDef>((Func <IncidentDef, float>)(d => biome.CommonalityOfDisease(d))); if (incidentDef != null) { string blockedInfo; List <Pawn> pawns = ((IncidentWorker_Disease)incidentDef.Worker).ApplyToPawns(Gen.YieldSingle <Pawn>(__instance.pawn), out blockedInfo); if (PawnUtility.ShouldSendNotificationAbout(__instance.pawn)) { if (pawns.Contains(__instance.pawn)) { Find.LetterStack.ReceiveLetter("LetterLabelTraitDisease".Translate((NamedArgument)incidentDef.diseaseIncident.label), "LetterTraitDisease".Translate((NamedArgument)__instance.pawn.LabelCap, (NamedArgument)incidentDef.diseaseIncident.label, __instance.pawn.Named("PAWN")).AdjustedFor(__instance.pawn), LetterDefOf.NegativeEvent, (LookTargets)(Thing)__instance.pawn); } else if (!blockedInfo.NullOrEmpty()) { Messages.Message(blockedInfo, (LookTargets)(Thing)__instance.pawn, MessageTypeDefOf.NeutralEvent); } } } } } return(false); }