Example #1
0
        public void MakeLightningStrike(Vector3 targetPosition)
        {
            if (m_lightningStrikePosition.HasValue || !(m_subsystemTime.GameTime - m_lastLightningStrikeTime > 1.0))
            {
                return;
            }
            m_lastLightningStrikeTime   = m_subsystemTime.GameTime;
            m_lightningStrikePosition   = targetPosition;
            m_lightningStrikeBrightness = 1f;
            float num = float.MaxValue;

            foreach (Vector3 listenerPosition in m_subsystemAudio.ListenerPositions)
            {
                float num2 = Vector2.Distance(new Vector2(listenerPosition.X, listenerPosition.Z), new Vector2(targetPosition.X, targetPosition.Z));
                if (num2 < num)
                {
                    num = num2;
                }
            }
            float delay = m_subsystemAudio.CalculateDelay(num);

            if (num < 40f)
            {
                m_subsystemAudio.PlayRandomSound("Audio/ThunderNear", 1f, m_random.Float(-0.2f, 0.2f), 0f, delay);
            }
            else if (num < 200f)
            {
                m_subsystemAudio.PlayRandomSound("Audio/ThunderFar", 0.8f, m_random.Float(-0.2f, 0.2f), 0f, delay);
            }
            if (m_subsystemGameInfo.WorldSettings.EnvironmentBehaviorMode != 0)
            {
                return;
            }
            DynamicArray <ComponentBody> dynamicArray = new DynamicArray <ComponentBody>();

            m_subsystemBodies.FindBodiesAroundPoint(new Vector2(targetPosition.X, targetPosition.Z), 4f, dynamicArray);
            for (int i = 0; i < dynamicArray.Count; i++)
            {
                ComponentBody componentBody = dynamicArray.Array[i];
                if (componentBody.Position.Y > targetPosition.Y - 1.5f && Vector2.Distance(new Vector2(componentBody.Position.X, componentBody.Position.Z), new Vector2(targetPosition.X, targetPosition.Z)) < 4f)
                {
                    componentBody.Entity.FindComponent <ComponentOnFire>()?.SetOnFire(null, m_random.Float(12f, 15f));
                }
                ComponentCreature componentCreature = componentBody.Entity.FindComponent <ComponentCreature>();
                if (componentCreature != null && componentCreature.PlayerStats != null)
                {
                    componentCreature.PlayerStats.StruckByLightning++;
                }
            }
            int   x        = Terrain.ToCell(targetPosition.X);
            int   num3     = Terrain.ToCell(targetPosition.Y);
            int   z        = Terrain.ToCell(targetPosition.Z);
            float pressure = (m_random.Float(0f, 1f) < 0.2f) ? 39 : 19;

            base.Project.FindSubsystem <SubsystemExplosions>(throwOnError: true).AddExplosion(x, num3 + 1, z, pressure, isIncendiary: false, noExplosionSound: true);
        }
Example #2
0
        public void PostprocessExplosions(bool playExplosionSound)
        {
            Point3 point = Point3.Zero;
            float  num   = float.MaxValue;
            float  num2  = 0f;

            foreach (KeyValuePair <Point3, float> item in m_pressureByPoint.ToDictionary())
            {
                num2 += item.Value;
                float num3 = m_subsystemAudio.CalculateListenerDistance(new Vector3(item.Key));
                if (num3 < num)
                {
                    num   = num3;
                    point = item.Key;
                }
                float num4 = 0.001f * MathUtils.Pow(num2, 0.5f);
                float num5 = MathUtils.Saturate(item.Value / 15f - num4) * m_random.Float(0.2f, 1f);
                if (num5 > 0.1f)
                {
                    m_explosionParticleSystem.SetExplosionCell(item.Key, num5);
                }
            }
            foreach (KeyValuePair <Point3, SurroundingPressurePoint> item2 in m_surroundingPressureByPoint.ToDictionary())
            {
                int cellValue = m_subsystemTerrain.Terrain.GetCellValue(item2.Key.X, item2.Key.Y, item2.Key.Z);
                int num6      = Terrain.ExtractContents(cellValue);
                SubsystemBlockBehavior[] blockBehaviors = m_subsystemBlockBehaviors.GetBlockBehaviors(num6);
                if (blockBehaviors.Length != 0)
                {
                    for (int i = 0; i < blockBehaviors.Length; i++)
                    {
                        blockBehaviors[i].OnExplosion(cellValue, item2.Key.X, item2.Key.Y, item2.Key.Z, item2.Value.Pressure);
                    }
                }
                float probability = item2.Value.IsIncendiary ? 0.5f : 0.2f;
                Block block       = BlocksManager.Blocks[num6];
                if (block.FireDuration > 0f && item2.Value.Pressure / block.ExplosionResilience > 0.2f && m_random.Bool(probability))
                {
                    m_subsystemFireBlockBehavior.SetCellOnFire(item2.Key.X, item2.Key.Y, item2.Key.Z, item2.Value.IsIncendiary ? 1f : 0.3f);
                }
            }
            foreach (ComponentBody body in m_subsystemBodies.Bodies)
            {
                CalculateImpulseAndDamage(body, null, out Vector3 impulse, out float damage);
                impulse *= m_random.Float(0.5f, 1.5f);
                damage  *= m_random.Float(0.5f, 1.5f);
                body.ApplyImpulse(impulse);
                body.Entity.FindComponent <ComponentHealth>()?.Injure(damage, null, ignoreInvulnerability: false, "Blasted by explosion");
                body.Entity.FindComponent <ComponentDamage>()?.Damage(damage);
                ComponentOnFire componentOnFire = body.Entity.FindComponent <ComponentOnFire>();
                if (componentOnFire != null && m_random.Float(0f, 1f) < MathUtils.Min(damage - 0.1f, 0.5f))
                {
                    componentOnFire.SetOnFire(null, m_random.Float(6f, 8f));
                }
            }
            foreach (Pickable pickable in m_subsystemPickables.Pickables)
            {
                Block block2 = BlocksManager.Blocks[Terrain.ExtractContents(pickable.Value)];
                CalculateImpulseAndDamage(pickable.Position + new Vector3(0f, 0.5f, 0f), 20f, null, out Vector3 impulse2, out float damage2);
                if (damage2 / block2.ExplosionResilience > 0.1f)
                {
                    TryExplodeBlock(Terrain.ToCell(pickable.Position.X), Terrain.ToCell(pickable.Position.Y), Terrain.ToCell(pickable.Position.Z), pickable.Value);
                    pickable.ToRemove = true;
                }
                else
                {
                    Vector3 vector = (impulse2 + new Vector3(0f, 0.1f * impulse2.Length(), 0f)) * m_random.Float(0.75f, 1f);
                    if (vector.Length() > 10f)
                    {
                        Projectile projectile = m_subsystemProjectiles.AddProjectile(pickable.Value, pickable.Position, pickable.Velocity + vector, m_random.Vector3(0f, 20f), null);
                        if (m_random.Float(0f, 1f) < 0.33f)
                        {
                            m_subsystemProjectiles.AddTrail(projectile, Vector3.Zero, new SmokeTrailParticleSystem(15, m_random.Float(0.75f, 1.5f), m_random.Float(1f, 6f), Color.White));
                        }
                        pickable.ToRemove = true;
                    }
                    else
                    {
                        pickable.Velocity += vector;
                    }
                }
            }
            foreach (Projectile projectile2 in m_subsystemProjectiles.Projectiles)
            {
                if (!m_generatedProjectiles.ContainsKey(projectile2))
                {
                    CalculateImpulseAndDamage(projectile2.Position + new Vector3(0f, 0.5f, 0f), 20f, null, out Vector3 impulse3, out float _);
                    projectile2.Velocity += (impulse3 + new Vector3(0f, 0.1f * impulse3.Length(), 0f)) * m_random.Float(0.75f, 1f);
                }
            }
            Vector3 position = new Vector3(point.X, point.Y, point.Z);
            float   delay    = m_subsystemAudio.CalculateDelay(num);

            if (num2 > 1000000f)
            {
                if (playExplosionSound)
                {
                    m_subsystemAudio.PlaySound("Audio/ExplosionEnormous", 1f, m_random.Float(-0.1f, 0.1f), position, 40f, delay);
                }
                m_subsystemNoise.MakeNoise(position, 1f, 100f);
            }
            else if (num2 > 100000f)
            {
                if (playExplosionSound)
                {
                    m_subsystemAudio.PlaySound("Audio/ExplosionHuge", 1f, m_random.Float(-0.2f, 0.2f), position, 30f, delay);
                }
                m_subsystemNoise.MakeNoise(position, 1f, 70f);
            }
            else if (num2 > 20000f)
            {
                if (playExplosionSound)
                {
                    m_subsystemAudio.PlaySound("Audio/ExplosionLarge", 1f, m_random.Float(-0.2f, 0.2f), position, 26f, delay);
                }
                m_subsystemNoise.MakeNoise(position, 1f, 50f);
            }
            else if (num2 > 4000f)
            {
                if (playExplosionSound)
                {
                    m_subsystemAudio.PlaySound("Audio/ExplosionMedium", 1f, m_random.Float(-0.2f, 0.2f), position, 24f, delay);
                }
                m_subsystemNoise.MakeNoise(position, 1f, 40f);
            }
            else if (num2 > 100f)
            {
                if (playExplosionSound)
                {
                    m_subsystemAudio.PlaySound("Audio/ExplosionSmall", 1f, m_random.Float(-0.2f, 0.2f), position, 22f, delay);
                }
                m_subsystemNoise.MakeNoise(position, 1f, 35f);
            }
            else if (num2 > 0f)
            {
                if (playExplosionSound)
                {
                    m_subsystemAudio.PlaySound("Audio/ExplosionTiny", 1f, m_random.Float(-0.2f, 0.2f), position, 20f, delay);
                }
                m_subsystemNoise.MakeNoise(position, 1f, 30f);
            }
        }