public static DamageWorker.DamageResult Apply(DamageInfo dinfo, Thing victim) { DamageWorker.DamageResult damageResult = new DamageWorker.DamageResult(); if (victim.SpawnedOrAnyParentSpawned) { ImpactSoundUtility.PlayImpactSound(victim, dinfo.Def.impactSoundType, victim.MapHeld); } if (victim.def.useHitPoints && dinfo.Def.harmsHealth) { float amount = dinfo.Amount; if (victim.def.category == ThingCategory.Building) { amount *= dinfo.Def.buildingDamageFactor; } if (victim.def.category == ThingCategory.Plant) { amount *= dinfo.Def.plantDamageFactor; } damageResult.totalDamageDealt = (float)Mathf.Min(victim.HitPoints, GenMath.RoundRandom(amount)); victim.HitPoints -= Mathf.RoundToInt(damageResult.totalDamageDealt); if (victim.HitPoints <= 0) { victim.HitPoints = 0; victim.Kill(new DamageInfo?(dinfo), (Hediff)null); } } return(damageResult); }
public override DamageWorker.DamageResult Apply(DamageInfo dinfo, Thing victim) { Building wall = victim as Building; if ((wall != null) && ((wall.def.building.isNaturalRock) || (wall.def == ThingDefOf.Wall))) { Log.Message("wall hit"); DamageWorker.DamageResult damageResult = new DamageWorker.DamageResult(); if (victim.SpawnedOrAnyParentSpawned) { ImpactSoundUtility.PlayImpactSound(victim, dinfo.Def.impactSoundType, victim.MapHeld); } if (victim.def.useHitPoints && dinfo.Def.harmsHealth) { damageResult.totalDamageDealt = Mathf.Min((float)victim.HitPoints, dinfo.Amount * 8); victim.HitPoints -= (int)damageResult.totalDamageDealt; if (victim.HitPoints <= 0) { victim.HitPoints = 0; victim.Kill(new DamageInfo?(dinfo), null); } } return(damageResult); } else { return(base.Apply(dinfo, victim)); } }
public virtual DamageWorker.DamageResult Apply(DamageInfo dinfo, Thing victim) { DamageWorker.DamageResult damageResult = new DamageWorker.DamageResult(); if (victim.SpawnedOrAnyParentSpawned) { ImpactSoundUtility.PlayImpactSound(victim, dinfo.Def.impactSoundType, victim.MapHeld); } if (victim.def.useHitPoints && dinfo.Def.harmsHealth) { damageResult.totalDamageDealt = Mathf.Min((float)victim.HitPoints, dinfo.Amount); victim.HitPoints -= (int)damageResult.totalDamageDealt; if (victim.HitPoints <= 0) { victim.HitPoints = 0; victim.Kill(new DamageInfo?(dinfo), null); } } return(damageResult); }
public virtual DamageResult Apply(DamageInfo dinfo, Thing victim) { DamageResult result = DamageResult.MakeNew(); if (victim.SpawnedOrAnyParentSpawned) { ImpactSoundUtility.PlayImpactSound(victim, dinfo.Def.impactSoundType, victim.MapHeld); } if (victim.def.useHitPoints && dinfo.Def.harmsHealth) { result.totalDamageDealt = (float)Mathf.Min(victim.HitPoints, dinfo.Amount); victim.HitPoints -= (int)result.totalDamageDealt; if (victim.HitPoints <= 0) { victim.HitPoints = 0; victim.Kill(dinfo, null); } } return(result); }
private float ApplyToPawn(DamageInfo dinfo, Pawn pawn) { if (dinfo.Amount <= 0) { return(0f); } if (!DebugSettings.enablePlayerDamage && pawn.Faction == Faction.OfPlayer) { return(0f); } if (!dinfo.Part.HasValue) { dinfo.SetPart(new BodyPartDamageInfo(null, null)); } DamageWorker_AddInjuryCR.LocalInjuryResult localInjuryResult = DamageWorker_AddInjuryCR.LocalInjuryResult.MakeNew(); if (dinfo.Def.spreadOut) { if (pawn.apparel != null) { List <Apparel> wornApparel = pawn.apparel.WornApparel; for (int i = wornApparel.Count - 1; i >= 0; i--) { this.CheckApplySpreadDamage(dinfo, wornApparel[i]); } } if (pawn.equipment != null && pawn.equipment.Primary != null) { this.CheckApplySpreadDamage(dinfo, pawn.equipment.Primary); } if (pawn.inventory != null) { ThingContainer container = pawn.inventory.container; for (int j = container.Count - 1; j >= 0; j--) { this.CheckApplySpreadDamage(dinfo, container[j]); } } } if (!this.FragmentDamageForDamageType(dinfo, pawn, ref localInjuryResult)) { this.ApplyDamagePartial(dinfo, pawn, ref localInjuryResult); this.CheckDuplicateSmallPawnDamageToPartParent(dinfo, pawn, ref localInjuryResult); } if (localInjuryResult.wounded) { DamageWorker_AddInjuryCR.PlayWoundedVoiceSound(dinfo, pawn); pawn.Drawer.Notify_DamageApplied(dinfo); DamageWorker_AddInjuryCR.InformPsychology(dinfo, pawn); } if (localInjuryResult.headshot && pawn.Spawned) { MoteThrower.ThrowText(new Vector3((float)pawn.Position.x + 1f, (float)pawn.Position.y, (float)pawn.Position.z + 1f), "Headshot".Translate(), Color.white, -1); if (dinfo.Instigator != null) { Pawn pawn2 = dinfo.Instigator as Pawn; if (pawn2 != null) { pawn2.records.Increment(RecordDefOf.Headshots); } } } if (localInjuryResult.absorbed) { if (pawn.health.deflectionEffecter == null) { pawn.health.deflectionEffecter = EffecterDef.Named("ArmorRating").Spawn(); } pawn.health.deflectionEffecter.Trigger(pawn, pawn); } else { ImpactSoundUtility.PlayImpactSound(pawn, dinfo.Def.impactSoundType); } return(localInjuryResult.totalDamageDealt); }
private DamageWorker.DamageResult ApplyToPawn(DamageInfo dinfo, Pawn pawn) { DamageWorker.DamageResult damageResult = new DamageWorker.DamageResult(); if (dinfo.Amount <= 0f) { return(damageResult); } if (!DebugSettings.enablePlayerDamage && pawn.Faction == Faction.OfPlayer) { return(damageResult); } Map mapHeld = pawn.MapHeld; bool spawnedOrAnyParentSpawned = pawn.SpawnedOrAnyParentSpawned; if (dinfo.AllowDamagePropagation && dinfo.Amount >= (float)dinfo.Def.minDamageToFragment) { int num = Rand.RangeInclusive(2, 4); for (int i = 0; i < num; i++) { DamageInfo dinfo2 = dinfo; dinfo2.SetAmount(dinfo.Amount / (float)num); this.ApplyDamageToPart(dinfo2, pawn, damageResult); } } else { this.ApplyDamageToPart(dinfo, pawn, damageResult); this.ApplySmallPawnDamagePropagation(dinfo, pawn, damageResult); } if (damageResult.wounded) { DamageWorker_AddInjury.PlayWoundedVoiceSound(dinfo, pawn); pawn.Drawer.Notify_DamageApplied(dinfo); } if (damageResult.headshot && pawn.Spawned) { MoteMaker.ThrowText(new Vector3((float)pawn.Position.x + 1f, (float)pawn.Position.y, (float)pawn.Position.z + 1f), pawn.Map, "Headshot".Translate(), Color.white, -1f); if (dinfo.Instigator != null) { Pawn pawn2 = dinfo.Instigator as Pawn; if (pawn2 != null) { pawn2.records.Increment(RecordDefOf.Headshots); } } } if ((damageResult.deflected || damageResult.diminished) && spawnedOrAnyParentSpawned) { EffecterDef effecterDef; if (damageResult.deflected) { if (damageResult.deflectedByMetalArmor && dinfo.Def.canUseDeflectMetalEffect) { if (dinfo.Def == DamageDefOf.Bullet) { effecterDef = EffecterDefOf.Deflect_Metal_Bullet; } else { effecterDef = EffecterDefOf.Deflect_Metal; } } else if (dinfo.Def == DamageDefOf.Bullet) { effecterDef = EffecterDefOf.Deflect_General_Bullet; } else { effecterDef = EffecterDefOf.Deflect_General; } } else if (damageResult.diminishedByMetalArmor) { effecterDef = EffecterDefOf.DamageDiminished_Metal; } else { effecterDef = EffecterDefOf.DamageDiminished_General; } if (pawn.health.deflectionEffecter == null || pawn.health.deflectionEffecter.def != effecterDef) { if (pawn.health.deflectionEffecter != null) { pawn.health.deflectionEffecter.Cleanup(); pawn.health.deflectionEffecter = null; } pawn.health.deflectionEffecter = effecterDef.Spawn(); } pawn.health.deflectionEffecter.Trigger(pawn, dinfo.Instigator ?? pawn); if (damageResult.deflected) { pawn.Drawer.Notify_DamageDeflected(dinfo); } } if (!damageResult.deflected && spawnedOrAnyParentSpawned) { ImpactSoundUtility.PlayImpactSound(pawn, dinfo.Def.impactSoundType, mapHeld); } return(damageResult); }
private DamageResult ApplyToPawn(DamageInfo dinfo, Pawn pawn) { DamageResult result = DamageResult.MakeNew(); if (dinfo.Amount <= 0) { return(result); } if (!DebugSettings.enablePlayerDamage && pawn.Faction == Faction.OfPlayer) { return(result); } Map mapHeld = pawn.MapHeld; bool spawnedOrAnyParentSpawned = pawn.SpawnedOrAnyParentSpawned; if (dinfo.Def.spreadOut) { if (pawn.apparel != null) { List <Apparel> wornApparel = pawn.apparel.WornApparel; for (int num = wornApparel.Count - 1; num >= 0; num--) { this.CheckApplySpreadDamage(dinfo, wornApparel[num]); } } if (pawn.equipment != null && pawn.equipment.Primary != null) { this.CheckApplySpreadDamage(dinfo, pawn.equipment.Primary); } if (pawn.inventory != null) { ThingOwner <Thing> innerContainer = pawn.inventory.innerContainer; for (int num2 = innerContainer.Count - 1; num2 >= 0; num2--) { this.CheckApplySpreadDamage(dinfo, innerContainer[num2]); } } } if (this.ShouldFragmentDamageForDamageType(dinfo)) { int num3 = Rand.RangeInclusive(3, 4); for (int i = 0; i < num3; i++) { DamageInfo dinfo2 = dinfo; dinfo2.SetAmount(dinfo.Amount / num3); this.ApplyDamageToPart(dinfo2, pawn, ref result); } } else { this.ApplyDamageToPart(dinfo, pawn, ref result); this.CheckDuplicateSmallPawnDamageToPartParent(dinfo, pawn, ref result); } if (result.wounded) { DamageWorker_AddInjury.PlayWoundedVoiceSound(dinfo, pawn); pawn.Drawer.Notify_DamageApplied(dinfo); DamageWorker_AddInjury.InformPsychology(dinfo, pawn); } if (result.headshot && pawn.Spawned) { IntVec3 position = pawn.Position; double x = (float)position.x + 1.0; IntVec3 position2 = pawn.Position; float y = (float)position2.y; IntVec3 position3 = pawn.Position; MoteMaker.ThrowText(new Vector3((float)x, y, (float)((float)position3.z + 1.0)), pawn.Map, "Headshot".Translate(), Color.white, -1f); if (dinfo.Instigator != null) { Pawn pawn2 = dinfo.Instigator as Pawn; if (pawn2 != null) { pawn2.records.Increment(RecordDefOf.Headshots); } } } if (result.deflected) { if (pawn.health.deflectionEffecter == null) { pawn.health.deflectionEffecter = EffecterDefOf.ArmorDeflect.Spawn(); } pawn.health.deflectionEffecter.Trigger(pawn, pawn); } else if (spawnedOrAnyParentSpawned) { ImpactSoundUtility.PlayImpactSound(pawn, dinfo.Def.impactSoundType, mapHeld); } return(result); }
private float ApplyToPawn(DamageInfo dinfo, Pawn pawn) { if (dinfo.Amount <= 0) { return(0f); } if (!DebugSettings.enablePlayerDamage && pawn.Faction == Faction.OfPlayer) { return(0f); } LocalInjuryResult localInjuryResult = LocalInjuryResult.MakeNew(); Map mapHeld = pawn.MapHeld; bool spawnedOrAnyParentSpawned = pawn.SpawnedOrAnyParentSpawned; if (dinfo.Def.spreadOut) { if (pawn.apparel != null) { List <Apparel> wornApparel = pawn.apparel.WornApparel; for (int i = wornApparel.Count - 1; i >= 0; i--) { this.CheckApplySpreadDamage(dinfo, wornApparel[i]); } } if (pawn.equipment != null && pawn.equipment.Primary != null) { this.CheckApplySpreadDamage(dinfo, pawn.equipment.Primary); } if (pawn.inventory != null) { ThingOwner <Thing> innerContainer = pawn.inventory.innerContainer; for (int j = innerContainer.Count - 1; j >= 0; j--) { this.CheckApplySpreadDamage(dinfo, innerContainer[j]); } } } if (this.ShouldFragmentDamageForDamageType(dinfo)) { int num = Rand.RangeInclusive(3, 4); for (int k = 0; k < num; k++) { DamageInfo dinfo2 = dinfo; dinfo2.SetAmount(dinfo.Amount / num); this.ApplyDamageToPart(dinfo2, pawn, ref localInjuryResult); } } else { this.ApplyDamageToPart(dinfo, pawn, ref localInjuryResult); this.CheckDuplicateSmallPawnDamageToPartParent(dinfo, pawn, ref localInjuryResult); } if (localInjuryResult.wounded) { PlayWoundedVoiceSound(dinfo, pawn); pawn.Drawer.Notify_DamageApplied(dinfo); InformPsychology(dinfo, pawn); } if (localInjuryResult.headshot && pawn.Spawned) { MoteMaker.ThrowText(new Vector3((float)pawn.Position.x + 1f, (float)pawn.Position.y, (float)pawn.Position.z + 1f), pawn.Map, "Headshot".Translate(), Color.white, -1f); if (dinfo.Instigator != null) { Pawn pawn2 = dinfo.Instigator as Pawn; if (pawn2 != null) { pawn2.records.Increment(RecordDefOf.Headshots); } } } if (localInjuryResult.deflected) { if (pawn.health.deflectionEffecter == null) { pawn.health.deflectionEffecter = EffecterDefOf.ArmorDeflect.Spawn(); } pawn.health.deflectionEffecter.Trigger(pawn, pawn); } else if (spawnedOrAnyParentSpawned) { ImpactSoundUtility.PlayImpactSound(pawn, dinfo.Def.impactSoundType, mapHeld); } return(localInjuryResult.totalDamageDealt); }