示例#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));
                }
            }
        }
        /// <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);
        }