示例#1
0
 public static void ExplosionDamageTerrain(DamageWorker __instance, Explosion explosion, IntVec3 c)
 {
     if (__instance.def == DamageDefOf.Bomb && explosion.Map.terrainGrid.CanRemoveTopLayerAt(c))
     {
         TerrainDef terrain = c.GetTerrain(explosion.Map);
         if (!(terrain.destroyOnBombDamageThreshold < 0f) && (float)explosion.GetDamageAmountAt(c) >= terrain.destroyOnBombDamageThreshold)
         {
             explosion.Map.terrainGrid.Notify_TerrainDestroyed(c);
         }
     }
 }
示例#2
0
 private static bool Prefix(DamageWorker __instance, Explosion explosion, IntVec3 c)
 {
     if (c.GetTerrain(explosion.Map) == ZLevelsDefOf.ZL_RoofTerrain)
     {
         if ((float)explosion.GetDamageAmountAt(c) >= ZLevelsDefOf.ZL_RoofTerrain.destroyOnBombDamageThreshold)
         {
             explosion.Map.terrainGrid.Notify_TerrainDestroyed(c);
         }
         return(false);
     }
     return(true);
 }
示例#3
0
        public override void Tick()
        {
            base.Tick();
            Burnticks--;
            Burnticks2--;
            --this.drillticksRemaining;

            if (Burnticks == 0)
            {
                skydrillerEffect = new Laser_Beam(base.Map, this.Position);
                base.Map.weatherManager.eventHandler.AddEvent(skydrillerEffect);
                Burnticks = 4;
            }

            if (Burnticks2 == 0)
            {
                float radius = Laser_Beam_MeshMaker.MeshWidth * 0.66f + (0.5f + Mathf.Sin((float)this.drillticksRemaining / 150)) * Laser_Beam_MeshMaker.MeshWidth * 0.33f;
                MoteMaker.MakeStaticMote(base.Position, base.Map, ThingDefOf.Mote_ShotFlash, 9f);
                GenExplosion.DoExplosion(base.Position, base.Map, radius, DamageDefOf.Flame, (Thing)null, PlasmaDrill, (ThingDef)null);
                var worker = new DamageWorker();
                IEnumerable <IntVec3> cells = worker.ExplosionCellsToHit(base.Position, base.Map, radius);
                foreach (IntVec3 cell in cells)
                {
                    TerrainDef current = base.Map.terrainGrid.TerrainAt(cell);
                    if (!(current.defName.Contains("_Scorched")) & (current.changeable) & !(current.layerable))
                    {
                        if (current.driesTo != null)
                        {
                            base.Map.terrainGrid.SetTerrain(cell, current.driesTo);
                            current = current.driesTo;
                        }
                        TerrainDef scorched = DefDatabase <TerrainDef> .GetNamed(current.defName + "_Scorched", true);

                        base.Map.terrainGrid.SetTerrain(cell, scorched);
                    }
                }
                //GenTemperature.PushHeat(base.Position, base.Map, 100000f);
                Burnticks2 = 4;
            }

            if (drillticksRemaining == 0)
            {
                Messages.Message("OPAL_LaserComplete".Translate(), MessageSound.Standard);
                //GenSpawn.Spawn(ThingDef.Named("Ind_MiningHole"), this.Position, base.Map);
                SoundStarter.PlayOneShot(Building_LaserAction.PlasmaDrillFire, new TargetInfo(base.Position, base.Map, false));
                ((Thing)this).Destroy((DestroyMode)0);
            }
        }
示例#4
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);
            }
        }
示例#5
0
        public static bool ExplosionAffectCell(DamageWorker __instance, Explosion explosion, IntVec3 c, List <Thing> damagedThings, List <Thing> ignoredThings, bool canThrowMotes)
        {
            if (__instance.def.explosionCellMote != null && canThrowMotes)
            {
                Mote mote = c.GetFirstThing(explosion.Map, __instance.def.explosionCellMote) as Mote;
                if (mote != null)
                {
                    mote.spawnTick = Find.TickManager.TicksGame;
                }
                else
                {
                    float t     = Mathf.Clamp01((explosion.Position - c).LengthHorizontal / explosion.radius);
                    Color color = Color.Lerp(__instance.def.explosionColorCenter, __instance.def.explosionColorEdge, t);
                    MoteMaker.ThrowExplosionCell(c, explosion.Map, __instance.def.explosionCellMote, color);
                }
            }

            //thingsToAffect.Clear();
            List <Thing> thingsToAffect = new List <Thing>();
            float        num            = float.MinValue;
            bool         flag           = false;
            List <Thing> list           = explosion.Map.thingGrid.ThingsListAt(c);

            for (int i = 0; i < list.Count; i++)
            {
                Thing thing = list[i];
                if (thing.def.category != ThingCategory.Mote && thing.def.category != ThingCategory.Ethereal)
                {
                    thingsToAffect.Add(thing);
                    if (thing.def.Fillage == FillCategory.Full && thing.def.Altitude > num)
                    {
                        flag = true;
                        num  = thing.def.Altitude;
                    }
                }
            }

            for (int j = 0; j < thingsToAffect.Count; j++)
            {
                if (thingsToAffect[j].def.Altitude >= num) //Null Reference Exception
                {
                    ExplosionDamageThing(__instance, explosion, thingsToAffect[j], damagedThings, ignoredThings, c);
                }
            }

            if (!flag)
            {
                ExplosionDamageTerrain(__instance, explosion, c);
            }

            if (__instance.def.explosionSnowMeltAmount > 0.0001f)
            {
                float lengthHorizontal = (c - explosion.Position).LengthHorizontal;
                float num2             = 1f - lengthHorizontal / explosion.radius;
                if (num2 > 0f)
                {
                    explosion.Map.snowGrid.AddDepth(c, (0f - num2) * __instance.def.explosionSnowMeltAmount);
                }
            }

            if (__instance.def != DamageDefOf.Bomb && __instance.def != DamageDefOf.Flame)
            {
                return(false);
            }

            List <Thing> list2 = explosion.Map.listerThings.ThingsOfDef(ThingDefOf.RectTrigger);

            for (int k = 0; k < list2.Count; k++)
            {
                RectTrigger rectTrigger = (RectTrigger)list2[k];
                if (rectTrigger.activateOnExplosion && rectTrigger.Rect.Contains(c))
                {
                    rectTrigger.ActivatedBy(null);
                }
            }
            return(false);
        }
示例#6
0
 public static void ExplosionDamageVehicle(Explosion explosion, Thing t, List <Thing> damagedThings, List <Thing> ignoredThings, IntVec3 cell, DamageWorker __instance, ref List <Thing> ___thingsToAffect)
 {
     if (t is VehiclePawn vehicle && !vehicle.statHandler.explosionsAffectingVehicle.Contains(explosion))
     {
         DamageInfo dinfo = new DamageInfo(__instance.def, explosion.GetDamageAmountAt(cell), explosion.GetArmorPenetrationAt(cell),
                                           Quaternion.LookRotation((vehicle.Position - explosion.Position).ToVector3()).eulerAngles.y, explosion.instigator, null,
                                           explosion.weapon, DamageInfo.SourceCategory.ThingOrUnknown, explosion.intendedTarget);
         vehicle.statHandler.TakeDamage(dinfo, cell, true);
         vehicle.statHandler.explosionsAffectingVehicle.Add(explosion);
     }
 }