Survivalcraft API 1.8.2.3 v1.8.2.3
Survivalcraft 2.4
载入中...
搜索中...
未找到
MagmaSplashParticleSystem.cs
浏览该文件的文档.
1using Engine;
3
4namespace Game {
5 public class MagmaSplashParticleSystem : ParticleSystem<MagmaSplashParticleSystem.Particle> {
6 public class Particle : Game.Particle {
8
9 public float TimeToLive;
10
11 public float Duration;
12 }
13
14 public Random m_random = new();
15
17
19
20 public float m_time;
21
22 public MagmaSplashParticleSystem(SubsystemTerrain terrain, Vector3 position, bool large) : base(40) {
23 m_subsystemTerrain = terrain;
24 m_position = position;
25 Texture = ContentManager.Get<Texture2D>("Textures/MagmaSplashParticle");
27 int num = Terrain.ToCell(position.X);
28 int num2 = Terrain.ToCell(position.Y);
29 int num3 = Terrain.ToCell(position.Z);
30 int x = 0;
31 x = MathUtils.Max(x, terrain.Terrain.GetCellLight(num + 1, num2, num3));
32 x = MathUtils.Max(x, terrain.Terrain.GetCellLight(num - 1, num2, num3));
33 x = MathUtils.Max(x, terrain.Terrain.GetCellLight(num, num2 + 1, num3));
34 x = MathUtils.Max(x, terrain.Terrain.GetCellLight(num, num2 - 1, num3));
35 x = MathUtils.Max(x, terrain.Terrain.GetCellLight(num, num2, num3 + 1));
36 x = MathUtils.Max(x, terrain.Terrain.GetCellLight(num, num2, num3 - 1));
37 Color white = Color.White;
39 white *= num4;
40 white.A = 255;
41 float num5 = large ? 1.5f : 1f;
42 for (int i = 0; i < Particles.Length; i++) {
43 Particle obj = Particles[i];
44 obj.IsActive = true;
45 obj.Position = position;
46 obj.Color = white;
47 obj.Size = new Vector2(0.2f * num5);
48 obj.TimeToLive = obj.Duration = m_random.Float(0.5f, 3.5f);
49 Vector3 v = 4f * m_random.Float(0.1f, 1f) * Vector3.Normalize(new Vector3(m_random.Float(-1f, 1f), 0f, m_random.Float(-1f, 1f)));
50 obj.Velocity = num5 * (v + new Vector3(0f, m_random.Float(0f, 4f), 0f));
51 }
52 }
53
54 public override bool Simulate(float dt) {
55 dt = Math.Clamp(dt, 0f, 0.1f);
56 float num = MathF.Pow(0.015f, dt);
57 m_time += dt;
58 bool flag = false;
59 for (int i = 0; i < Particles.Length; i++) {
60 Particle particle = Particles[i];
61 if (!particle.IsActive) {
62 continue;
63 }
64 flag = true;
65 particle.Position += particle.Velocity * dt;
66 particle.Velocity.Y += -10f * dt;
67 particle.Velocity *= num;
68 particle.Color *= MathUtils.Saturate(particle.TimeToLive);
69 particle.TimeToLive -= dt;
70 particle.TextureSlot = (int)(3.99f * particle.TimeToLive / particle.Duration);
71 particle.FlipX = m_random.Sign() > 0;
72 particle.FlipY = m_random.Sign() > 0;
73 if (particle.TimeToLive <= 0f
74 || particle.Size.X <= 0f) {
75 particle.IsActive = false;
76 continue;
77 }
78 int cellValue = m_subsystemTerrain.Terrain.GetCellValue(
79 Terrain.ToCell(particle.Position.X),
80 Terrain.ToCell(particle.Position.Y),
81 Terrain.ToCell(particle.Position.Z)
82 );
83 int num2 = Terrain.ExtractContents(cellValue);
84 if (num2 == 0) {
85 continue;
86 }
87 Block block = BlocksManager.Blocks[num2];
88 if (block.IsCollidable_(cellValue)) {
89 particle.IsActive = true;
90 }
91 else if (block is MagmaBlock) {
92 int level = FluidBlock.GetLevel(Terrain.ExtractData(cellValue));
93 float levelHeight = ((MagmaBlock)block).GetLevelHeight(level);
94 if (particle.Position.Y <= MathF.Floor(particle.Position.Y) + levelHeight) {
95 particle.Velocity.Y = 0f;
96 float num3 = Vector2.Distance(new Vector2(particle.Position.X, particle.Position.Z), new Vector2(m_position.X, m_position.Z));
97 float num4 = 0.02f * MathF.Sin(2f * num3 + 10f * m_time);
98 particle.Position.Y = MathF.Floor(particle.Position.Y) + levelHeight + num4;
99 particle.TimeToLive -= 1f * dt;
100 particle.Size -= new Vector2(0.04f * dt);
101 }
102 }
103 }
104 return !flag;
105 }
106 }
107}
Engine.Vector3 Vector3
static float Saturate(float x)
static int Max(int x1, int x2)
virtual bool IsCollidable_(int value)
static object Get(Type type, string name)
static int GetLevel(int data)
static readonly float[] LightIntensityByLightValue
MagmaSplashParticleSystem(SubsystemTerrain terrain, Vector3 position, bool large)
ParticleSystem(int particlesCount)
static int ExtractContents(int value)
virtual int GetCellLight(int x, int y, int z)
static int ToCell(float x)
static int ExtractData(int value)
static Color White
static float Distance(Vector2 v1, Vector2 v2)
static Vector3 Normalize(Vector3 v)