Example #1
0
        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);
        }