Survivalcraft API 1.8.2.3 v1.8.2.3
Survivalcraft 2.4
载入中...
搜索中...
未找到
BurntDebrisParticleSystem.cs
浏览该文件的文档.
1using Engine;
3
4namespace Game {
5 public class BurntDebrisParticleSystem : ParticleSystem<BurntDebrisParticleSystem.Particle> {
6 public class Particle : Game.Particle {
8
9 public float TimeToLive;
10 }
11
12 public Random m_random = new();
13
15
16 public BurntDebrisParticleSystem(SubsystemTerrain terrain, int x, int y, int z) : this(terrain, new Vector3(x + 0.5f, y + 0.5f, z + 0.5f)) { }
17
18 public BurntDebrisParticleSystem(SubsystemTerrain terrain, Vector3 position) : base(15) {
19 m_subsystemTerrain = terrain;
20 Texture = ContentManager.Get<Texture2D>("Textures/FireParticle");
21 int num = Terrain.ToCell(position.X);
22 int num2 = Terrain.ToCell(position.Y);
23 int num3 = Terrain.ToCell(position.Z);
24 int x = 0;
25 x = MathUtils.Max(x, terrain.Terrain.GetCellLight(num + 1, num2, num3));
26 x = MathUtils.Max(x, terrain.Terrain.GetCellLight(num - 1, num2, num3));
27 x = MathUtils.Max(x, terrain.Terrain.GetCellLight(num, num2 + 1, num3));
28 x = MathUtils.Max(x, terrain.Terrain.GetCellLight(num, num2 - 1, num3));
29 x = MathUtils.Max(x, terrain.Terrain.GetCellLight(num, num2, num3 + 1));
30 x = MathUtils.Max(x, terrain.Terrain.GetCellLight(num, num2, num3 - 1));
32 Color white = Color.White;
34 white *= num4;
35 white.A = 255;
36 for (int i = 0; i < Particles.Length; i++) {
37 Particle obj = Particles[i];
38 obj.IsActive = true;
39 obj.Position = position + 0.5f * new Vector3(m_random.Float(-1f, 1f), m_random.Float(-1f, 1f), m_random.Float(-1f, 1f));
40 obj.Color = white;
41 obj.Size = new Vector2(0.5f);
42 obj.TimeToLive = m_random.Float(0.75f, 2f);
43 obj.Velocity = new Vector3(3f * m_random.Float(-1f, 1f), 2f * m_random.Float(-1f, 1f), 3f * m_random.Float(-1f, 1f));
44 obj.TextureSlot = 8;
45 }
46 }
47
48 public override bool Simulate(float dt) {
49 dt = Math.Clamp(dt, 0f, 0.1f);
50 float num = MathF.Pow(0.04f, dt);
51 bool flag = false;
52 for (int i = 0; i < Particles.Length; i++) {
53 Particle particle = Particles[i];
54 if (!particle.IsActive) {
55 continue;
56 }
57 flag = true;
58 particle.TimeToLive -= dt;
59 if (particle.TimeToLive > 0f) {
60 Vector3 position = particle.Position;
61 Vector3 vector = position + particle.Velocity * dt;
62 TerrainRaycastResult? terrainRaycastResult = m_subsystemTerrain.Raycast(
63 position,
64 vector,
65 false,
66 true,
67 (value, _) => BlocksManager.Blocks[Terrain.ExtractContents(value)].IsCollidable_(value)
68 );
69 if (terrainRaycastResult.HasValue) {
70 Plane plane = terrainRaycastResult.Value.CellFace.CalculatePlane();
71 vector = position;
72 if (plane.Normal.X != 0f) {
73 particle.Velocity *= new Vector3(-0.1f, 0.1f, 0.1f);
74 }
75 if (plane.Normal.Y != 0f) {
76 particle.Velocity *= new Vector3(0.1f, -0.1f, 0.1f);
77 }
78 if (plane.Normal.Z != 0f) {
79 particle.Velocity *= new Vector3(0.1f, 0.1f, -0.1f);
80 }
81 }
82 particle.Position = vector;
83 particle.Velocity.Y += -10f * dt;
84 particle.Velocity *= num;
85 particle.Color *= MathUtils.Saturate(particle.TimeToLive);
86 particle.TextureSlot = (int)(8.99f * MathUtils.Saturate(2f - particle.TimeToLive));
87 }
88 else {
89 particle.IsActive = false;
90 }
91 }
92 return !flag;
93 }
94 }
95}
Engine.Vector3 Vector3
static float Saturate(float x)
static int Max(int x1, int x2)
virtual bool IsCollidable_(int value)
BurntDebrisParticleSystem(SubsystemTerrain terrain, Vector3 position)
BurntDebrisParticleSystem(SubsystemTerrain terrain, int x, int y, int z)
static object Get(Type type, string name)
static readonly float[] LightIntensityByLightValue
ParticleSystem(int particlesCount)
static int ExtractContents(int value)
virtual int GetCellLight(int x, int y, int z)
static int ToCell(float x)
static Color White
Vector3 Normal
定义 Plane.cs:3