protected override void ApplySpecialEffectsToPart(Pawn pawn, float totalDamage, DamageInfo dinfo, DamageWorker.DamageResult result) { totalDamage = base.ReduceDamageToPreserveOutsideParts(totalDamage, dinfo, pawn); List <BodyPartRecord> list = new List <BodyPartRecord>(); for (BodyPartRecord bodyPartRecord = dinfo.HitPart; bodyPartRecord != null; bodyPartRecord = bodyPartRecord.parent) { list.Add(bodyPartRecord); if (bodyPartRecord.depth == BodyPartDepth.Outside) { break; } } for (int i = 0; i < list.Count; i++) { BodyPartRecord bodyPartRecord2 = list[i]; float totalDamage2; if (list.Count == 1) { totalDamage2 = totalDamage; } else { totalDamage2 = ((bodyPartRecord2.depth != BodyPartDepth.Outside) ? (totalDamage * 0.4f) : (totalDamage * 0.75f)); } DamageInfo dinfo2 = dinfo; dinfo2.SetHitPart(bodyPartRecord2); base.FinalizeAndAddInjury(pawn, totalDamage2, dinfo2, result); } }
protected override void ApplySpecialEffectsToPart(Pawn pawn, float totalDamage, DamageInfo dinfo, ref DamageResult result) { totalDamage = base.ReduceDamageToPreserveOutsideParts(totalDamage, dinfo, pawn); List <BodyPartRecord> list = new List <BodyPartRecord>(); BodyPartRecord bodyPartRecord = dinfo.HitPart; while (bodyPartRecord != null) { list.Add(bodyPartRecord); if (bodyPartRecord.depth != BodyPartDepth.Outside) { bodyPartRecord = bodyPartRecord.parent; continue; } break; } float totalDamage2 = (float)(totalDamage * (1.0 + base.def.stabPierceBonus) / ((float)list.Count + base.def.stabPierceBonus)); for (int i = 0; i < list.Count; i++) { DamageInfo dinfo2 = dinfo; dinfo2.SetHitPart(list[i]); base.FinalizeAndAddInjury(pawn, totalDamage2, dinfo2, ref result); } }
protected override void ApplySpecialEffectsToPart(Pawn pawn, float totalDamage, DamageInfo dinfo, ref DamageResult result) { bool flag = Rand.Chance(base.def.bluntInnerHitFrequency); float num = (float)((!flag) ? 0.0 : base.def.bluntInnerHitConverted.RandomInRange); float num2 = (float)(totalDamage * (1.0 - num)); while (true) { num2 -= base.FinalizeAndAddInjury(pawn, num2, dinfo, ref result); if (pawn.health.hediffSet.PartIsMissing(dinfo.HitPart) && !(num2 <= 1.0)) { BodyPartRecord parent = dinfo.HitPart.parent; if (parent != null) { dinfo.SetHitPart(parent); continue; } } break; } if (flag && !dinfo.HitPart.def.IsSolid(dinfo.HitPart, pawn.health.hediffSet.hediffs) && dinfo.HitPart.depth == BodyPartDepth.Outside) { IEnumerable <BodyPartRecord> source = from x in pawn.health.hediffSet.GetNotMissingParts(BodyPartHeight.Undefined, BodyPartDepth.Undefined) where x.parent == dinfo.HitPart && x.def.IsSolid(x, pawn.health.hediffSet.hediffs) && x.depth == BodyPartDepth.Inside select x; BodyPartRecord hitPart = default(BodyPartRecord); if (source.TryRandomElementByWeight <BodyPartRecord>((Func <BodyPartRecord, float>)((BodyPartRecord x) => x.coverageAbs), out hitPart)) { DamageInfo dinfo2 = dinfo; dinfo2.SetHitPart(hitPart); base.FinalizeAndAddInjury(pawn, totalDamage * num + totalDamage * base.def.bluntInnerHitAdded.RandomInRange, dinfo2, ref result); } } }
protected override void ApplySpecialEffectsToPart(Pawn pawn, float totalDamage, DamageInfo dinfo, DamageResult result) { if (dinfo.HitPart.depth == BodyPartDepth.Inside) { List <BodyPartRecord> list = new List <BodyPartRecord>(); for (BodyPartRecord bodyPartRecord = dinfo.HitPart; bodyPartRecord != null; bodyPartRecord = bodyPartRecord.parent) { list.Add(bodyPartRecord); if (bodyPartRecord.depth == BodyPartDepth.Outside) { break; } } float num = (float)(list.Count - 1) + 0.5f; for (int i = 0; i < list.Count; i++) { DamageInfo dinfo2 = dinfo; dinfo2.SetHitPart(list[i]); FinalizeAndAddInjury(pawn, totalDamage / num * ((i == 0) ? 0.5f : 1f), dinfo2, result); } return; } int num2 = (def.cutExtraTargetsCurve != null) ? GenMath.RoundRandom(def.cutExtraTargetsCurve.Evaluate(Rand.Value)) : 0; List <BodyPartRecord> list2 = null; if (num2 != 0) { IEnumerable <BodyPartRecord> enumerable = dinfo.HitPart.GetDirectChildParts(); if (dinfo.HitPart.parent != null) { enumerable = enumerable.Concat(dinfo.HitPart.parent); if (dinfo.HitPart.parent.parent != null) { enumerable = enumerable.Concat(dinfo.HitPart.parent.GetDirectChildParts()); } } list2 = (from x in enumerable.Except(dinfo.HitPart).InRandomOrder().Take(num2) where !x.def.conceptual select x).ToList(); } else { list2 = new List <BodyPartRecord>(); } list2.Add(dinfo.HitPart); float num3 = totalDamage * (1f + def.cutCleaveBonus) / ((float)list2.Count + def.cutCleaveBonus); if (num2 == 0) { num3 = ReduceDamageToPreserveOutsideParts(num3, dinfo, pawn); } for (int j = 0; j < list2.Count; j++) { DamageInfo dinfo3 = dinfo; dinfo3.SetHitPart(list2[j]); FinalizeAndAddInjury(pawn, num3, dinfo3, result); } }
private void CheckDuplicateSmallPawnDamageToPartParent(DamageInfo dinfo, Pawn pawn, ref DamageResult result) { if (dinfo.AllowDamagePropagation && result.LastHitPart != null && dinfo.Def.harmsHealth && result.LastHitPart != pawn.RaceProps.body.corePart && result.LastHitPart.parent != null && pawn.health.hediffSet.GetPartHealth(result.LastHitPart.parent) > 0.0 && dinfo.Amount >= 10 && pawn.HealthScale <= 0.50010001659393311) { DamageInfo dinfo2 = dinfo; dinfo2.SetHitPart(result.LastHitPart.parent); this.ApplyDamageToPart(dinfo2, pawn, ref result); } }
private void ApplySmallPawnDamagePropagation(DamageInfo dinfo, Pawn pawn, DamageResult result) { if (dinfo.AllowDamagePropagation && result.LastHitPart != null && dinfo.Def.harmsHealth && result.LastHitPart != pawn.RaceProps.body.corePart && result.LastHitPart.parent != null && pawn.health.hediffSet.GetPartHealth(result.LastHitPart.parent) > 0f && result.LastHitPart.parent.coverageAbs > 0f && dinfo.Amount >= 10f && pawn.HealthScale <= 0.5001f) { DamageInfo dinfo2 = dinfo; dinfo2.SetHitPart(result.LastHitPart.parent); ApplyDamageToPart(dinfo2, pawn, result); } }
protected override void ApplySpecialEffectsToPart(Pawn pawn, float totalDamage, DamageInfo dinfo, ref DamageResult result) { if (dinfo.HitPart.depth == BodyPartDepth.Inside) { List <BodyPartRecord> list = new List <BodyPartRecord>(); BodyPartRecord bodyPartRecord = dinfo.HitPart; while (bodyPartRecord != null) { list.Add(bodyPartRecord); if (bodyPartRecord.depth != BodyPartDepth.Outside) { bodyPartRecord = bodyPartRecord.parent; continue; } break; } float num = (float)((float)(list.Count - 1) + 0.5); for (int i = 0; i < list.Count; i++) { DamageInfo dinfo2 = dinfo; dinfo2.SetHitPart(list[i]); base.FinalizeAndAddInjury(pawn, (float)(totalDamage / num * ((i != 0) ? 1.0 : 0.5)), dinfo2, ref result); } } else { int num2 = (base.def.cutExtraTargetsCurve != null) ? GenMath.RoundRandom(base.def.cutExtraTargetsCurve.Evaluate(Rand.Value)) : 0; List <BodyPartRecord> list2 = null; if (num2 != 0) { IEnumerable <BodyPartRecord> lhs = dinfo.HitPart.GetDirectChildParts(); if (dinfo.HitPart.parent != null) { lhs = lhs.Concat(dinfo.HitPart.parent); lhs = lhs.Concat(dinfo.HitPart.parent.GetDirectChildParts()); } list2 = lhs.Except(dinfo.HitPart).InRandomOrder(null).Take(num2) .ToList(); } else { list2 = new List <BodyPartRecord>(); } list2.Add(dinfo.HitPart); float num3 = (float)(totalDamage * (1.0 + base.def.cutCleaveBonus) / ((float)list2.Count + base.def.cutCleaveBonus)); if (num2 == 0) { num3 = base.ReduceDamageToPreserveOutsideParts(num3, dinfo, pawn); } for (int j = 0; j < list2.Count; j++) { DamageInfo dinfo3 = dinfo; dinfo3.SetHitPart(list2[j]); base.FinalizeAndAddInjury(pawn, num3, dinfo3, ref result); } } }
private void ApplyDamageToPart(DamageInfo dinfo, Pawn pawn, ref DamageResult result) { BodyPartRecord exactPartFromDamageInfo = this.GetExactPartFromDamageInfo(dinfo, pawn); if (exactPartFromDamageInfo != null) { dinfo.SetHitPart(exactPartFromDamageInfo); int num = dinfo.Amount; if (!dinfo.InstantOldInjury) { num = ArmorUtility.GetPostArmorDamage(pawn, dinfo.Amount, dinfo.HitPart, dinfo.Def); } if (num <= 0) { result.deflected = true; } else { if (DamageWorker_AddInjury.IsHeadshot(dinfo, pawn)) { result.headshot = true; } if (dinfo.InstantOldInjury) { HediffDef hediffDefFromDamage = HealthUtility.GetHediffDefFromDamage(dinfo.Def, pawn, dinfo.HitPart); if (hediffDefFromDamage.CompPropsFor(typeof(HediffComp_GetsOld)) == null) { return; } if (dinfo.HitPart.def.oldInjuryBaseChance == 0.0) { return; } if (dinfo.HitPart.def.IsSolid(dinfo.HitPart, pawn.health.hediffSet.hediffs)) { return; } if (pawn.health.hediffSet.PartOrAnyAncestorHasDirectlyAddedParts(dinfo.HitPart)) { return; } } if (!dinfo.AllowDamagePropagation) { this.FinalizeAndAddInjury(pawn, (float)num, dinfo, ref result); } else { this.ApplySpecialEffectsToPart(pawn, (float)num, dinfo, ref result); } } } }
private void ApplyDamageToPart(DamageInfo dinfo, Pawn pawn, DamageWorker.DamageResult result) { BodyPartRecord exactPartFromDamageInfo = this.GetExactPartFromDamageInfo(dinfo, pawn); if (exactPartFromDamageInfo != null) { dinfo.SetHitPart(exactPartFromDamageInfo); float num = dinfo.Amount; bool flag = !dinfo.InstantPermanentInjury; bool deflectedByMetalArmor = false; if (flag) { DamageDef def = dinfo.Def; bool diminishedByMetalArmor; num = ArmorUtility.GetPostArmorDamage(pawn, num, dinfo.ArmorPenetrationInt, dinfo.HitPart, ref def, out deflectedByMetalArmor, out diminishedByMetalArmor); dinfo.Def = def; if (num < dinfo.Amount) { result.diminished = true; result.diminishedByMetalArmor = diminishedByMetalArmor; } } if (num <= 0f) { result.AddPart(pawn, dinfo.HitPart); result.deflected = true; result.deflectedByMetalArmor = deflectedByMetalArmor; } else { if (DamageWorker_AddInjury.IsHeadshot(dinfo, pawn)) { result.headshot = true; } if (dinfo.InstantPermanentInjury) { HediffDef hediffDefFromDamage = HealthUtility.GetHediffDefFromDamage(dinfo.Def, pawn, dinfo.HitPart); if (hediffDefFromDamage.CompPropsFor(typeof(HediffComp_GetsPermanent)) == null || dinfo.HitPart.def.permanentInjuryBaseChance == 0f || dinfo.HitPart.def.IsSolid(dinfo.HitPart, pawn.health.hediffSet.hediffs) || pawn.health.hediffSet.PartOrAnyAncestorHasDirectlyAddedParts(dinfo.HitPart)) { return; } } if (!dinfo.AllowDamagePropagation) { this.FinalizeAndAddInjury(pawn, num, dinfo, result); } else { this.ApplySpecialEffectsToPart(pawn, num, dinfo, result); } } } }
private void ApplyDamageToPart(DamageInfo dinfo, Pawn pawn, DamageResult result) { BodyPartRecord exactPartFromDamageInfo = GetExactPartFromDamageInfo(dinfo, pawn); if (exactPartFromDamageInfo == null) { return; } dinfo.SetHitPart(exactPartFromDamageInfo); float num = dinfo.Amount; bool num2 = !dinfo.InstantPermanentInjury && !dinfo.IgnoreArmor; bool deflectedByMetalArmor = false; if (num2) { DamageDef damageDef = dinfo.Def; num = ArmorUtility.GetPostArmorDamage(pawn, num, dinfo.ArmorPenetrationInt, dinfo.HitPart, ref damageDef, out deflectedByMetalArmor, out bool diminishedByMetalArmor); dinfo.Def = damageDef; if (num < dinfo.Amount) { result.diminished = true; result.diminishedByMetalArmor = diminishedByMetalArmor; } } if (dinfo.Def.ExternalViolenceFor(pawn)) { num *= pawn.GetStatValue(StatDefOf.IncomingDamageFactor); } if (num <= 0f) { result.AddPart(pawn, dinfo.HitPart); result.deflected = true; result.deflectedByMetalArmor = deflectedByMetalArmor; return; } if (IsHeadshot(dinfo, pawn)) { result.headshot = true; } if (!dinfo.InstantPermanentInjury || (HealthUtility.GetHediffDefFromDamage(dinfo.Def, pawn, dinfo.HitPart).CompPropsFor(typeof(HediffComp_GetsPermanent)) != null && dinfo.HitPart.def.permanentInjuryChanceFactor != 0f && !pawn.health.hediffSet.PartOrAnyAncestorHasDirectlyAddedParts(dinfo.HitPart))) { if (!dinfo.AllowDamagePropagation) { FinalizeAndAddInjury(pawn, num, dinfo, result); } else { ApplySpecialEffectsToPart(pawn, num, dinfo, result); } } }
protected override void ApplySpecialEffectsToPart(Pawn pawn, float totalDamage, DamageInfo dinfo, DamageWorker.DamageResult result) { if (dinfo.HitPart.depth == BodyPartDepth.Inside) { List <BodyPartRecord> list = new List <BodyPartRecord>(); for (BodyPartRecord bodyPartRecord = dinfo.HitPart; bodyPartRecord != null; bodyPartRecord = bodyPartRecord.parent) { list.Add(bodyPartRecord); if (bodyPartRecord.depth == BodyPartDepth.Outside) { break; } } float num = (float)list.Count; for (int i = 0; i < list.Count; i++) { DamageInfo dinfo2 = dinfo; dinfo2.SetHitPart(list[i]); base.FinalizeAndAddInjury(pawn, totalDamage / num, dinfo2, result); } } else { IEnumerable <BodyPartRecord> enumerable = dinfo.HitPart.GetDirectChildParts(); if (dinfo.HitPart.parent != null) { enumerable = enumerable.Concat(dinfo.HitPart.parent); if (dinfo.HitPart.parent.parent != null) { enumerable = enumerable.Concat(dinfo.HitPart.parent.GetDirectChildParts()); } } enumerable = from target in enumerable where target != dinfo.HitPart && !target.def.conceptual && target.depth == BodyPartDepth.Outside && !pawn.health.hediffSet.PartIsMissing(target) select target; BodyPartRecord bodyPartRecord2 = enumerable.RandomElementWithFallback(null); if (bodyPartRecord2 == null) { base.FinalizeAndAddInjury(pawn, base.ReduceDamageToPreserveOutsideParts(totalDamage, dinfo, pawn), dinfo, result); } else { base.FinalizeAndAddInjury(pawn, base.ReduceDamageToPreserveOutsideParts(totalDamage * this.def.scratchSplitPercentage, dinfo, pawn), dinfo, result); DamageInfo dinfo3 = dinfo; dinfo3.SetHitPart(bodyPartRecord2); base.FinalizeAndAddInjury(pawn, base.ReduceDamageToPreserveOutsideParts(totalDamage * this.def.scratchSplitPercentage, dinfo3, pawn), dinfo3, result); } } }
protected override void ApplySpecialEffectsToPart(Pawn pawn, float totalDamage, DamageInfo dinfo, ref DamageWorker.DamageResult result) { bool flag = Rand.Chance(this.def.bluntInnerHitFrequency); float num = (!flag) ? 0f : this.def.bluntInnerHitConverted.RandomInRange; float num2 = totalDamage * (1f - num); while (true) { num2 -= base.FinalizeAndAddInjury(pawn, num2, dinfo, ref result); if (!pawn.health.hediffSet.PartIsMissing(dinfo.HitPart)) { break; } if (num2 <= 1f) { break; } BodyPartRecord parent = dinfo.HitPart.parent; if (parent == null) { break; } dinfo.SetHitPart(parent); } if (flag && !dinfo.HitPart.def.IsSolid(dinfo.HitPart, pawn.health.hediffSet.hediffs) && dinfo.HitPart.depth == BodyPartDepth.Outside) { IEnumerable <BodyPartRecord> source = from x in pawn.health.hediffSet.GetNotMissingParts(BodyPartHeight.Undefined, BodyPartDepth.Undefined) where x.parent == dinfo.HitPart && x.def.IsSolid(x, pawn.health.hediffSet.hediffs) && x.depth == BodyPartDepth.Inside select x; BodyPartRecord hitPart; if (source.TryRandomElementByWeight((BodyPartRecord x) => x.coverageAbs, out hitPart)) { DamageInfo lastInfo = dinfo; lastInfo.SetHitPart(hitPart); base.FinalizeAndAddInjury(pawn, totalDamage * num + totalDamage * this.def.bluntInnerHitAdded.RandomInRange, lastInfo, ref result); } } }
protected override void ApplySpecialEffectsToPart(Pawn pawn, float totalDamage, DamageInfo dinfo, DamageWorker.DamageResult result) { bool flag = Rand.Chance(this.def.bluntInnerHitChance); float num = (!flag) ? 0f : this.def.bluntInnerHitDamageFractionToConvert.RandomInRange; float num2 = totalDamage * (1f - num); DamageInfo lastInfo = dinfo; for (;;) { num2 -= base.FinalizeAndAddInjury(pawn, num2, lastInfo, result); if (!pawn.health.hediffSet.PartIsMissing(lastInfo.HitPart)) { break; } if (num2 <= 1f) { break; } BodyPartRecord parent = lastInfo.HitPart.parent; if (parent == null) { break; } lastInfo.SetHitPart(parent); } if (flag && !lastInfo.HitPart.def.IsSolid(lastInfo.HitPart, pawn.health.hediffSet.hediffs) && lastInfo.HitPart.depth == BodyPartDepth.Outside) { IEnumerable <BodyPartRecord> source = from x in pawn.health.hediffSet.GetNotMissingParts(BodyPartHeight.Undefined, BodyPartDepth.Undefined, null) where x.parent == lastInfo.HitPart && x.def.IsSolid(x, pawn.health.hediffSet.hediffs) && x.depth == BodyPartDepth.Inside select x; BodyPartRecord hitPart; if (source.TryRandomElementByWeight((BodyPartRecord x) => x.coverageAbs, out hitPart)) { DamageInfo lastInfo2 = lastInfo; lastInfo2.SetHitPart(hitPart); float totalDamage2 = totalDamage * num + totalDamage * this.def.bluntInnerHitDamageFractionToAdd.RandomInRange; base.FinalizeAndAddInjury(pawn, totalDamage2, lastInfo2, result); } } if (!pawn.Dead) { SimpleCurve simpleCurve = null; if (lastInfo.HitPart.parent == null) { simpleCurve = this.def.bluntStunChancePerDamagePctOfCorePartToBodyCurve; } else { foreach (BodyPartRecord lhs in pawn.RaceProps.body.GetPartsWithTag(BodyPartTagDefOf.ConsciousnessSource)) { if (this.InSameBranch(lhs, lastInfo.HitPart)) { simpleCurve = this.def.bluntStunChancePerDamagePctOfCorePartToHeadCurve; break; } } } if (simpleCurve != null) { float x2 = totalDamage / pawn.def.race.body.corePart.def.GetMaxHealth(pawn); if (Rand.Chance(simpleCurve.Evaluate(x2))) { DamageInfo dinfo2 = dinfo; dinfo2.Def = DamageDefOf.Stun; dinfo2.SetAmount((float)3.5f.SecondsToTicks() / 30f); pawn.TakeDamage(dinfo2); } } } }
protected override void ApplySpecialEffectsToPart(Pawn pawn, float totalDamage, DamageInfo dinfo, DamageResult result) { bool flag = Rand.Chance(def.bluntInnerHitChance); float num = (flag ? def.bluntInnerHitDamageFractionToConvert.RandomInRange : 0f); float num2 = totalDamage * (1f - num); DamageInfo lastInfo = dinfo; while (true) { num2 -= FinalizeAndAddInjury(pawn, num2, lastInfo, result); if (!pawn.health.hediffSet.PartIsMissing(lastInfo.HitPart) || num2 <= 1f) { break; } BodyPartRecord parent = lastInfo.HitPart.parent; if (parent == null) { break; } lastInfo.SetHitPart(parent); } if (flag && !lastInfo.HitPart.def.IsSolid(lastInfo.HitPart, pawn.health.hediffSet.hediffs) && lastInfo.HitPart.depth == BodyPartDepth.Outside && (from x in pawn.health.hediffSet.GetNotMissingParts() where x.parent == lastInfo.HitPart && x.def.IsSolid(x, pawn.health.hediffSet.hediffs) && x.depth == BodyPartDepth.Inside select x).TryRandomElementByWeight((BodyPartRecord x) => x.coverageAbs, out var result2)) { DamageInfo dinfo2 = lastInfo; dinfo2.SetHitPart(result2); float totalDamage2 = totalDamage * num + totalDamage * def.bluntInnerHitDamageFractionToAdd.RandomInRange; FinalizeAndAddInjury(pawn, totalDamage2, dinfo2, result); } if (pawn.Dead) { return; } SimpleCurve simpleCurve = null; if (lastInfo.HitPart.parent == null) { simpleCurve = def.bluntStunChancePerDamagePctOfCorePartToBodyCurve; } else { foreach (BodyPartRecord item in pawn.RaceProps.body.GetPartsWithTag(BodyPartTagDefOf.ConsciousnessSource)) { if (InSameBranch(item, lastInfo.HitPart)) { simpleCurve = def.bluntStunChancePerDamagePctOfCorePartToHeadCurve; break; } } } if (simpleCurve != null) { float x2 = totalDamage / pawn.def.race.body.corePart.def.GetMaxHealth(pawn); if (Rand.Chance(simpleCurve.Evaluate(x2))) { DamageInfo dinfo3 = dinfo; dinfo3.Def = DamageDefOf.Stun; dinfo3.SetAmount((float)def.bluntStunDuration.SecondsToTicks() / 30f); pawn.TakeDamage(dinfo3); } } }