public static void ExplosionDamageThing(DamageWorker __instance, Explosion explosion, Thing t, List <Thing> damagedThings, List <Thing> ignoredThings, IntVec3 cell) { if (t.def.category == ThingCategory.Mote || t.def.category == ThingCategory.Ethereal || damagedThings.Contains(t)) { return; } damagedThings.Add(t); if (ignoredThings != null && ignoredThings.Contains(t)) { return; } if (__instance.def == DamageDefOf.Bomb && t.def == ThingDefOf.Fire && !t.Destroyed) { t.Destroy(); return; } DamageInfo dinfo = new DamageInfo(angle: (!(t.Position == explosion.Position)) ? (t.Position - explosion.Position).AngleFlat : ((float)Rand.RangeInclusive(0, 359)), def: __instance.def, amount: explosion.GetDamageAmountAt(cell), armorPenetration: explosion.GetArmorPenetrationAt(cell), instigator: explosion.instigator, hitPart: null, weapon: explosion.weapon, category: DamageInfo.SourceCategory.ThingOrUnknown, intendedTarget: explosion.intendedTarget); if (__instance.def.explosionAffectOutsidePartsOnly) { dinfo.SetBodyRegion(BodyPartHeight.Undefined, BodyPartDepth.Outside); } BattleLogEntry_ExplosionImpact battleLogEntry_ExplosionImpact = null; Pawn pawn = t as Pawn; if (pawn != null) { battleLogEntry_ExplosionImpact = new BattleLogEntry_ExplosionImpact(explosion.instigator, t, explosion.weapon, explosion.projectile, __instance.def); Find.BattleLog.Add(battleLogEntry_ExplosionImpact); } DamageResult damageResult = t.TakeDamage(dinfo); damageResult.AssociateWithLog(battleLogEntry_ExplosionImpact); if (pawn != null && damageResult.wounded && pawn.stances != null) { pawn.stances.StaggerFor(95); } }
/// <summary> /// does explosive damage to a thing /// </summary> /// <param name="explosion">The explosion.</param> /// <param name="t">The t.</param> /// <param name="damagedThings">The damaged things.</param> /// <param name="ignoredThings">The ignored things.</param> /// <param name="cell">The cell.</param> protected override void ExplosionDamageThing(Explosion explosion, Thing t, List <Thing> damagedThings, List <Thing> ignoredThings, IntVec3 cell) { if (t.def.category == ThingCategory.Mote || t.def.category == ThingCategory.Ethereal) { return; } if (damagedThings.Contains(t)) { return; } damagedThings.Add(t); //it puts out fires if (def == DamageDefOf.Bomb && t.def == ThingDefOf.Fire && !t.Destroyed) { t.Destroy(); return; } //only affects pawns if (!(t is Pawn pawn)) { ignoredThings?.Add(t); return; } if (!MutagenDefOf.defaultMutagen.CanInfect(pawn)) { ignoredThings?.Add(pawn); return; //only affects susceptible pawns } float num; if (t.Position == explosion.Position) { num = Rand.RangeInclusive(0, 359); } else { num = (t.Position - explosion.Position).AngleFlat; } DamageDef damageDef = def; var amount = (float)explosion.GetDamageAmountAt(cell); float armorPenetrationAt = explosion.GetArmorPenetrationAt(cell); float angle = num; Thing instigator = explosion.instigator; ThingDef weapon = explosion.weapon; var dinfo = new DamageInfo(damageDef, amount, armorPenetrationAt, angle, instigator, null, weapon, DamageInfo.SourceCategory.ThingOrUnknown, explosion.intendedTarget); float severityPerDamage = dinfo.GetSeverityPerDamage(); MutagenicDamageUtilities.ApplyPureMutagenicDamage(dinfo, pawn, severityPerDamage: severityPerDamage); BattleLogEntry_ExplosionImpact battleLogEntry_ExplosionImpact = null; battleLogEntry_ExplosionImpact = new BattleLogEntry_ExplosionImpact(explosion.instigator, t, explosion.weapon, explosion.projectile, def); Find.BattleLog.Add(battleLogEntry_ExplosionImpact); pawn.stances?.StaggerFor(95); }