public static IEnumerable <BodyPartRecord> GetPartsWithTag(this BodyDef def, List <BodyPartTagDef> tags) { int num; for (int i = 0; i < def.AllParts.Count; i = num + 1) { BodyPartRecord bodyPartRecord = def.AllParts[i]; for (int ii = 0; ii < tags.Count; ii++) { BodyPartTagDef tag = tags[ii]; if (bodyPartRecord.def.tags.Contains(tag)) { yield return(bodyPartRecord); } } num = i; } yield break; }
public static bool ThisOrAnyChildHasTag(this BodyPartRecord part, BodyPartTagDef tag) { if (part?.def?.tags == null) { return(false); } if (part.def.tags.Contains(tag)) { return(true); } if (part.parts.NullOrEmpty()) { return(false); } return(part.parts.Any(p => p.ThisOrAnyChildHasTag(tag))); }
private float CalculateForLimbs(HediffSet diffSet, BodyPartTagDef limbCore, List <PawnCapacityUtility.CapacityImpactor> impactors) { BodyDef body = diffSet.pawn.RaceProps.body; float totalValue = 0; int partCount = 0; foreach (BodyPartRecord limb in body.GetPartsWithTag(limbCore)) { var conduitParts = limb.GetChildParts(GethCoolingTags.GethCoolantConduit); if (!conduitParts.Any()) { continue; } float value = 1; foreach (BodyPartRecord conduitPart in conduitParts) { value *= PawnCapacityUtility.CalculateImmediatePartEfficiencyAndRecord(diffSet, conduitPart, impactors); } float heatExchangerValue = 0; int heatExchangerCount = 0; foreach (BodyPartRecord heatExchangerPart in limb.GetChildParts(GethCoolingTags.GethHeatExchanger)) { heatExchangerValue += PawnCapacityUtility.CalculateImmediatePartEfficiencyAndRecord(diffSet, heatExchangerPart, impactors); heatExchangerCount++; } totalValue += value * (heatExchangerValue / heatExchangerCount); partCount++; } if (partCount == 0) { return(0f); } return(totalValue / partCount); }
public override float CalculateCapacityLevel(HediffSet diffSet, List <PawnCapacityUtility.CapacityImpactor> impactors = null) { float functionalPercentage = 0f; float num = PawnCapacityUtility.CalculateLimbEfficiency(diffSet, BodyPartTagDefOf.MovingLimbCore, BodyPartTagDefOf.MovingLimbSegment, BodyPartTagDefOf.MovingLimbDigit, 0.4f, out functionalPercentage, impactors); if (functionalPercentage < 0.4999f) { return(0f); } float num2 = num; BodyPartTagDef pelvis = BodyPartTagDefOf.Pelvis; num = num2 * PawnCapacityUtility.CalculateTagEfficiency(diffSet, pelvis, 3.40282347E+38f, default(FloatRange), impactors); float num3 = num; pelvis = BodyPartTagDefOf.Spine; num = num3 * PawnCapacityUtility.CalculateTagEfficiency(diffSet, pelvis, 3.40282347E+38f, default(FloatRange), impactors); num = Mathf.Lerp(num, num * CalculateCapacityAndRecord(diffSet, PawnCapacityDefOf.Breathing, impactors), 0.2f); num = Mathf.Lerp(num, num * CalculateCapacityAndRecord(diffSet, PawnCapacityDefOf.BloodPumping, impactors), 0.2f); return(num * Mathf.Min(CalculateCapacityAndRecord(diffSet, PawnCapacityDefOf.Consciousness, impactors), 1f)); }
public override float CalculateCapacityLevel(HediffSet diffSet, List <PawnCapacityUtility.CapacityImpactor> impactors = null) { float num = 0f; float num2 = PawnCapacityUtility.CalculateLimbEfficiency(diffSet, BodyPartTagDefOf.MovingLimbCore, BodyPartTagDefOf.MovingLimbSegment, BodyPartTagDefOf.MovingLimbDigit, 0.4f, out num, impactors); if (num < 0.4999f) { return(0f); } float arg_5E_0 = num2; BodyPartTagDef tag = BodyPartTagDefOf.Pelvis; num2 = arg_5E_0 * PawnCapacityUtility.CalculateTagEfficiency(diffSet, tag, 3.40282347E+38f, default(FloatRange), impactors, -1f); float arg_89_0 = num2; tag = BodyPartTagDefOf.Spine; num2 = arg_89_0 * PawnCapacityUtility.CalculateTagEfficiency(diffSet, tag, 3.40282347E+38f, default(FloatRange), impactors, -1f); num2 = Mathf.Lerp(num2, num2 * base.CalculateCapacityAndRecord(diffSet, PawnCapacityDefOf.Breathing, impactors), 0.2f); num2 = Mathf.Lerp(num2, num2 * base.CalculateCapacityAndRecord(diffSet, PawnCapacityDefOf.BloodPumping, impactors), 0.2f); return(num2 * Mathf.Min(base.CalculateCapacityAndRecord(diffSet, PawnCapacityDefOf.Consciousness, impactors), 1f)); }
public static bool ApplyHediffOnBodyPartTag(Pawn pawn, BodyPartTagDef BPTag, HediffDef hediffDef, bool myDebug) { pawn.RaceProps.body.GetPartsWithTag(BPTag).TryRandomElement(out BodyPartRecord bodyPart); if (bodyPart == null) { Tools.Warn("null body part", myDebug); return(false); } Hediff hediff = HediffMaker.MakeHediff(hediffDef, pawn, bodyPart); if (hediff == null) { Tools.Warn("hediff maker null", myDebug); return(false); } pawn.health.AddHediff(hediff, bodyPart, null); return(true); }
// Token: 0x060039CE RID: 14798 RVA: 0x001B7F74 File Offset: 0x001B6374 protected override DamageWorker.DamageResult ApplyMeleeDamageToTarget(LocalTargetInfo target) { DamageWorker.DamageResult damageResult = new DamageWorker.DamageResult(); if (this.tool == null) { Log.ErrorOnce("Attempted to apply melee hediff without a tool", 38381735, false); return damageResult; } Pawn pawn = target.Thing as Pawn; if (pawn == null) { Log.ErrorOnce("Attempted to apply melee hediff without pawn target", 78330053, false); return damageResult; } HediffSet hediffSet = pawn.health.hediffSet; BodyPartTagDef bodypartTagTarget = this.verbProps.bodypartTagTarget; foreach (BodyPartRecord part in hediffSet.GetNotMissingParts(BodyPartHeight.Undefined, BodyPartDepth.Undefined, bodypartTagTarget, null)) { damageResult.AddHediff(pawn.health.AddHediff(this.tool.hediff, part, null, null)); damageResult.AddPart(pawn, part); damageResult.wounded = true; } return damageResult; }
public override float CalculateCapacityLevel(HediffSet diffSet, List <PawnCapacityUtility.CapacityImpactor> impactors = null) { BodyPartTagDef sightSource = BodyPartTagDefOf.SightSource; return(PawnCapacityUtility.CalculateTagEfficiency(diffSet, sightSource, 3.40282347E+38f, default(FloatRange), impactors, 0.75f)); }
public override float CalculateCapacityLevel(HediffSet diffSet, List <PawnCapacityUtility.CapacityImpactor> impactors = null) { BodyPartTagDef metabolismSource = BodyPartTagDefOf.MetabolismSource; return(PawnCapacityUtility.CalculateTagEfficiency(diffSet, metabolismSource, float.MaxValue, default(FloatRange), impactors, -1f)); }
private float CalculateForDirectChildren(HediffSet diffSet, BodyPartRecord part, BodyPartTagDef partTag, List <PawnCapacityUtility.CapacityImpactor> impactors) { float value = 0; int partCount = 0; foreach (BodyPartRecord partWithTag in part.parts.Where(t => t.def.tags.Contains(partTag))) { value += PawnCapacityUtility.CalculateImmediatePartEfficiencyAndRecord(diffSet, partWithTag, impactors); partCount++; } if (partCount == 0) { return(0f); } return(value / partCount); }
public override float CalculateCapacityLevel(HediffSet diffSet, List <PawnCapacityUtility.CapacityImpactor> impactors = null) { BodyPartTagDef EVKidney = BodyPartTagDefOf.EVKidney; return(PawnCapacityUtility.CalculateTagEfficiency(diffSet, EVKidney, float.MaxValue, default(FloatRange), impactors, -1f)); }
public static bool Patch_CalculateLimbEfficiency(ref float __result, HediffSet diffSet, BodyPartTagDef limbCoreTag, BodyPartTagDef limbSegmentTag, BodyPartTagDef limbDigitTag, float appendageWeight, out float functionalPercentage, List <CapacityImpactor> impactors) { functionalPercentage = 0f; if (limbCoreTag != BodyPartTagDefOf.MovingLimbCore) { return(true); } var hediff = diffSet.GetFirstHediffOfDef(LifeSupportDefOf.QE_LifeSupport); if (hediff is null) { return(true); } if (hediff.Severity < 1f) { return(true); } __result = 0f; if (!(impactors is null)) { var capacityImpactor = new CapacityImpactorHediff(); capacityImpactor.hediff = hediff; impactors.Add(capacityImpactor); } return(false); }
public override float CalculateCapacityLevel(HediffSet diffSet, List <PawnCapacityUtility.CapacityImpactor> impactors = null) { BodyPartTagDef bloodPumpingSource = BodyPartTagDefOf.BloodPumpingSource; return(PawnCapacityUtility.CalculateTagEfficiency(diffSet, bloodPumpingSource, float.MaxValue, default(FloatRange), impactors)); }