Exemplo n.º 1
0
        public virtual void ExplosionAffectCell(Explosion explosion, IntVec3 c, List <Thing> damagedThings, bool canThrowMotes)
        {
            if (this.def.explosionCellMote != null && canThrowMotes)
            {
                float t     = Mathf.Clamp01((explosion.Position - c).LengthHorizontal / explosion.radius);
                Color color = Color.Lerp(this.def.explosionColorCenter, this.def.explosionColorEdge, t);
                MoteMaker.ThrowExplosionCell(c, explosion.Map, this.def.explosionCellMote, color);
            }
            DamageWorker.thingsToAffect.Clear();
            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)
                {
                    DamageWorker.thingsToAffect.Add(thing);
                    if (thing.def.Fillage == FillCategory.Full && thing.def.Altitude > num)
                    {
                        flag = true;
                        num  = thing.def.Altitude;
                    }
                }
            }
            for (int j = 0; j < DamageWorker.thingsToAffect.Count; j++)
            {
                if (DamageWorker.thingsToAffect[j].def.Altitude >= num)
                {
                    this.defaultDamageThing(explosion, DamageWorker.thingsToAffect[j], damagedThings, c);
                }
            }
            if (!flag)
            {
                this.defaultDamageTerrain(explosion, c);
            }
            if (this.def.explosionSnowMeltAmount > 0.0001f)
            {
                float lengthHorizontal = (c - explosion.Position).LengthHorizontal;
                float num2             = 1f - lengthHorizontal / explosion.radius;
                if (num2 > 0f)
                {
                    explosion.Map.snowGrid.AddDepth(c, -num2 * this.def.explosionSnowMeltAmount);
                }
            }
            if (this.def == DamageDefOf.Bomb || this.def == DamageDefOf.Flame)
            {
                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);
                    }
                }
            }
        }
Exemplo n.º 2
0
 public virtual void ExplosionAffectCell(Explosion explosion, IntVec3 c, List <Thing> damagedThings, bool canThrowMotes)
 {
     if (c.InBounds(explosion.Map))
     {
         if (this.def.explosionCellMote != null && canThrowMotes)
         {
             float t     = Mathf.Clamp01((explosion.Position - c).LengthHorizontal / explosion.radius);
             Color color = Color.Lerp(this.def.explosionColorCenter, this.def.explosionColorEdge, t);
             MoteMaker.ThrowExplosionCell(c, explosion.Map, this.def.explosionCellMote, color);
         }
         List <Thing> list = explosion.Map.thingGrid.ThingsListAt(c);
         DamageWorker.thingsToAffect.Clear();
         float num = -3.40282347E+38f;
         for (int i = 0; i < list.Count; i++)
         {
             Thing thing = list[i];
             DamageWorker.thingsToAffect.Add(thing);
             if (thing.def.Fillage == FillCategory.Full && thing.def.Altitude > num)
             {
                 num = thing.def.Altitude;
             }
         }
         for (int j = 0; j < DamageWorker.thingsToAffect.Count; j++)
         {
             if (DamageWorker.thingsToAffect[j].def.Altitude >= num)
             {
                 this.ExplosionDamageThing(explosion, DamageWorker.thingsToAffect[j], damagedThings, c);
             }
         }
         if (this.def.explosionSnowMeltAmount > 9.9999997473787516E-05)
         {
             float lengthHorizontal = (c - explosion.Position).LengthHorizontal;
             float num2             = (float)(1.0 - lengthHorizontal / explosion.radius);
             if (num2 > 0.0)
             {
                 explosion.Map.snowGrid.AddDepth(c, (float)((0.0 - num2) * this.def.explosionSnowMeltAmount));
             }
         }
         if (this.def != DamageDefOf.Bomb && this.def != DamageDefOf.Flame)
         {
             return;
         }
         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);
             }
         }
     }
 }