Exemple #1
0
        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));
                }
            }
        }