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); }