Esempio n. 1
0
        public override bool Simulate(float dt)
        {
            dt = MathUtils.Clamp(dt, 0f, 0.1f);
            float num = MathUtils.Pow(0.015f, dt);

            m_time += dt;
            bool flag = false;

            for (int i = 0; i < base.Particles.Length; i++)
            {
                Particle particle = base.Particles[i];
                if (!particle.IsActive)
                {
                    continue;
                }
                flag = true;
                particle.Position   += particle.Velocity * dt;
                particle.Velocity.Y += -10f * dt;
                particle.Velocity   *= num;
                particle.Color      *= MathUtils.Saturate(particle.TimeToLive);
                particle.TimeToLive -= dt;
                particle.TextureSlot = (int)(3.99f * particle.TimeToLive / particle.Duration);
                particle.FlipX       = (m_random.Sign() > 0);
                particle.FlipY       = (m_random.Sign() > 0);
                if (particle.TimeToLive <= 0f || particle.Size.X <= 0f)
                {
                    particle.IsActive = false;
                    continue;
                }
                int cellValue = m_subsystemTerrain.Terrain.GetCellValue(Terrain.ToCell(particle.Position.X), Terrain.ToCell(particle.Position.Y), Terrain.ToCell(particle.Position.Z));
                int num2      = Terrain.ExtractContents(cellValue);
                if (num2 == 0)
                {
                    continue;
                }
                Block block = BlocksManager.Blocks[num2];
                if (block.IsCollidable)
                {
                    particle.IsActive = true;
                }
                else if (block is MagmaBlock)
                {
                    int   level       = FluidBlock.GetLevel(Terrain.ExtractData(cellValue));
                    float levelHeight = ((MagmaBlock)block).GetLevelHeight(level);
                    if (particle.Position.Y <= MathUtils.Floor(particle.Position.Y) + levelHeight)
                    {
                        particle.Velocity.Y = 0f;
                        float num3 = Vector2.Distance(new Vector2(particle.Position.X, particle.Position.Z), new Vector2(m_position.X, m_position.Z));
                        float num4 = 0.02f * MathUtils.Sin(2f * num3 + 10f * m_time);
                        particle.Position.Y  = MathUtils.Floor(particle.Position.Y) + levelHeight + num4;
                        particle.TimeToLive -= 1f * dt;
                        particle.Size       -= new Vector2(0.04f * dt);
                    }
                }
            }
            return(!flag);
        }