protected float FinalizeAndAddInjury(Pawn pawn, Hediff_Injury injury, DamageInfo dinfo, DamageResult result) { injury.TryGetComp <HediffComp_GetsPermanent>()?.PreFinalizeInjury(); float partHealth = pawn.health.hediffSet.GetPartHealth(injury.Part); if (pawn.IsColonist && !dinfo.IgnoreInstantKillProtection && dinfo.Def.ExternalViolenceFor(pawn) && !Rand.Chance(Find.Storyteller.difficultyValues.allowInstantKillChance)) { float num = ((injury.def.lethalSeverity > 0f) ? (injury.def.lethalSeverity * 1.1f) : 1f); float min = 1f; float max = Mathf.Min(injury.Severity, partHealth); for (int i = 0; i < 7; i++) { if (!pawn.health.WouldDieAfterAddingHediff(injury)) { break; } float num2 = Mathf.Clamp(partHealth - num, min, max); if (DebugViewSettings.logCauseOfDeath) { Log.Message($"CauseOfDeath: attempt to prevent death for {pawn.Name} on {injury.Part.Label} attempt:{i + 1} severity:{injury.Severity}->{num2} part health:{partHealth}"); } injury.Severity = num2; num *= 2f; min = 0f; } } pawn.health.AddHediff(injury, null, dinfo, result); float num3 = Mathf.Min(injury.Severity, partHealth); result.totalDamageDealt += num3; result.wounded = true; result.AddPart(pawn, injury.Part); result.AddHediff(injury); return(num3); }
protected float FinalizeAndAddInjury(Pawn pawn, Hediff_Injury injury, DamageInfo dinfo, ref DamageResult result) { this.CalculateOldInjuryDamageThreshold(pawn, injury); pawn.health.AddHediff(injury, null, dinfo); float num = Mathf.Min(injury.Severity, pawn.health.hediffSet.GetPartHealth(injury.Part)); result.totalDamageDealt += num; result.wounded = true; result.AddPart(pawn, injury.Part); return(num); }
protected float FinalizeAndAddInjury(Pawn pawn, Hediff_Injury injury, DamageInfo dinfo, DamageResult result) { injury.TryGetComp <HediffComp_GetsPermanent>()?.PreFinalizeInjury(); pawn.health.AddHediff(injury, null, dinfo, result); float num = Mathf.Min(injury.Severity, pawn.health.hediffSet.GetPartHealth(injury.Part)); result.totalDamageDealt += num; result.wounded = true; result.AddPart(pawn, injury.Part); result.AddHediff(injury); return(num); }
private void ApplyDamageToPart(DamageInfo dinfo, Pawn pawn, DamageResult result) { BodyPartRecord exactPartFromDamageInfo = GetExactPartFromDamageInfo(dinfo, pawn); if (exactPartFromDamageInfo != null) { dinfo.SetHitPart(exactPartFromDamageInfo); float num = dinfo.Amount; bool flag = !dinfo.InstantPermanentInjury; bool deflectedByMetalArmor = false; if (flag) { 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 (num <= 0f) { result.AddPart(pawn, dinfo.HitPart); result.deflected = true; result.deflectedByMetalArmor = deflectedByMetalArmor; } else { if (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.permanentInjuryChanceFactor == 0f || pawn.health.hediffSet.PartOrAnyAncestorHasDirectlyAddedParts(dinfo.HitPart)) { return; } } if (!dinfo.AllowDamagePropagation) { FinalizeAndAddInjury(pawn, num, dinfo, result); } else { 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); } } }