Skip to content

Commit 53eba71

Browse files
authored
Fix del() handling on /particle objects (#2550)
1 parent b71efce commit 53eba71

4 files changed

Lines changed: 77 additions & 65 deletions

File tree

OpenDreamRuntime/Objects/Types/DreamObjectMovable.cs

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,8 @@ protected override void HandleDeletion(bool possiblyThreaded) {
5959
}
6060

6161
WalkManager.StopWalks(this);
62+
_particles?.Delete();
63+
_particles = null;
6264
AtomManager.DeleteMovableEntity(this);
6365

6466
base.HandleDeletion(possiblyThreaded);
@@ -144,20 +146,15 @@ protected override void SetVar(string varName, DreamValue value) {
144146
break;
145147
case "particles":
146148
if (value.TryGetValueAsDreamObject<DreamObjectParticles>(out var particles)) {
147-
if(particles == _particles){
148-
ParticlesSystem!.MarkDirty((Entity, _particles.ParticlesComponent));
149-
return;
150-
}
149+
if (_particles == particles)
150+
break;
151151

152-
if (_particles != null)
153-
EntityManager.RemoveComponent(Entity, _particles.ParticlesComponent);
152+
_particles?.Owner = null;
154153
_particles = particles;
155-
EntityManager.AddComponent(Entity, _particles.ParticlesComponent);
156-
ParticlesSystem!.MarkDirty((Entity, _particles.ParticlesComponent));
154+
_particles.Owner = this;
157155
} else {
156+
_particles?.Owner = null;
158157
_particles = null;
159-
if (_particles != null)
160-
EntityManager.RemoveComponent(Entity, _particles.ParticlesComponent);
161158
}
162159

163160
break;

OpenDreamRuntime/Objects/Types/DreamObjectParticles.cs

Lines changed: 68 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,23 @@
44
namespace OpenDreamRuntime.Objects.Types;
55

66
public sealed class DreamObjectParticles : DreamObject {
7-
public readonly DreamParticlesComponent ParticlesComponent;
7+
public DreamObjectMovable? Owner {
8+
set {
9+
if (field != null)
10+
EntityManager.RemoveComponent(field.Entity, _particlesComponent);
11+
12+
field = value;
13+
if (field != null)
14+
EntityManager.AddComponent(field.Entity, _particlesComponent);
15+
}
16+
}
817

9-
private readonly List<MutableAppearance> _icons = new();
10-
private readonly List<string> _iconStates = new();
18+
private DreamParticlesComponent _particlesComponent;
19+
private List<MutableAppearance> _icons = new();
20+
private List<string> _iconStates = new();
1121

1222
public DreamObjectParticles(DreamObjectDefinition objectDefinition) : base(objectDefinition) {
13-
ParticlesComponent = new DreamParticlesComponent();
23+
_particlesComponent = new DreamParticlesComponent();
1424

1525
//populate component with settings from type
1626
foreach (KeyValuePair<string,DreamValue> kv in ObjectDefinition.Variables) {
@@ -19,31 +29,40 @@ public DreamObjectParticles(DreamObjectDefinition objectDefinition) : base(objec
1929
}
2030
}
2131

32+
protected override void HandleDeletion(bool possiblyThreaded) {
33+
Owner = null;
34+
_icons = null!;
35+
_iconStates = null!;
36+
_particlesComponent = null!;
37+
38+
base.HandleDeletion(possiblyThreaded);
39+
}
40+
2241
protected override void SetVar(string varName, DreamValue value) {
2342
//good news, these only update on assignment, so we don't need to track the generator, list, or matrix objects
2443
switch (varName) {
2544
case "width": //num
26-
ParticlesComponent.Width = (int)value.UnsafeGetValueAsFloat();
45+
_particlesComponent.Width = (int)value.UnsafeGetValueAsFloat();
2746
break;
2847
case "height": //num
29-
ParticlesComponent.Height = (int)value.UnsafeGetValueAsFloat();
48+
_particlesComponent.Height = (int)value.UnsafeGetValueAsFloat();
3049
break;
3150
case "count": //num
3251
if (!value.TryGetValueAsInteger(out var count))
3352
break;
3453

35-
ParticlesComponent.Count = count;
54+
_particlesComponent.Count = count;
3655
break;
3756
case "spawning": //num
38-
ParticlesComponent.Spawning = value.UnsafeGetValueAsFloat();
57+
_particlesComponent.Spawning = value.UnsafeGetValueAsFloat();
3958
break;
4059
case "bound1": //list or vector
4160
if (value.TryGetValueAsDreamList(out var bound1List) && bound1List.GetLength() >= 3) {
4261
var boundX = bound1List.GetValue(new(1)).UnsafeGetValueAsFloat();
4362
var boundY = bound1List.GetValue(new(2)).UnsafeGetValueAsFloat();
4463
var boundZ = bound1List.GetValue(new(3)).UnsafeGetValueAsFloat();
4564

46-
ParticlesComponent.Bound1 = new Vector3(boundX, boundY, boundZ);
65+
_particlesComponent.Bound1 = new Vector3(boundX, boundY, boundZ);
4766
} //else if vector
4867

4968
break;
@@ -53,7 +72,7 @@ protected override void SetVar(string varName, DreamValue value) {
5372
var boundY = bound2List.GetValue(new(2)).UnsafeGetValueAsFloat();
5473
var boundZ = bound2List.GetValue(new(3)).UnsafeGetValueAsFloat();
5574

56-
ParticlesComponent.Bound2 = new Vector3(boundX, boundY, boundZ);
75+
_particlesComponent.Bound2 = new Vector3(boundX, boundY, boundZ);
5776
} //else if vector
5877

5978
break;
@@ -63,7 +82,7 @@ protected override void SetVar(string varName, DreamValue value) {
6382
var gravityY = gravityList.GetValue(new(2)).UnsafeGetValueAsFloat();
6483
var gravityZ = gravityList.GetValue(new(3)).UnsafeGetValueAsFloat();
6584

66-
ParticlesComponent.Gravity = new Vector3(gravityX, gravityY, gravityZ);
85+
_particlesComponent.Gravity = new Vector3(gravityX, gravityY, gravityZ);
6786
} //else if vector
6887

6988
break;
@@ -80,14 +99,14 @@ protected override void SetVar(string varName, DreamValue value) {
8099
grad[i++] = c;
81100
}
82101

83-
ParticlesComponent.Gradient = grad;
102+
_particlesComponent.Gradient = grad;
84103
}
85104

86105
break;
87106
case "transform": //matrix
88107
if (value.TryGetValueAsDreamObject<DreamObjectMatrix>(out var matrix)) {
89108
float[] m = DreamObjectMatrix.MatrixToTransformFloatArray(matrix);
90-
ParticlesComponent.Transform = new(m[0], m[1], m[2], m[3], m[4], m[5]);
109+
_particlesComponent.Transform = new(m[0], m[1], m[2], m[3], m[4], m[5]);
91110
}
92111

93112
break;
@@ -117,7 +136,7 @@ protected override void SetVar(string varName, DreamValue value) {
117136
}
118137
}
119138

120-
ParticlesComponent.TextureList = immutableAppearances.ToArray();
139+
_particlesComponent.TextureList = immutableAppearances.ToArray();
121140
break;
122141
case "icon_state": //list or string
123142
_iconStates.Clear();
@@ -141,117 +160,117 @@ protected override void SetVar(string varName, DreamValue value) {
141160
}
142161
}
143162

144-
ParticlesComponent.TextureList = immutableAppearances.ToArray();
163+
_particlesComponent.TextureList = immutableAppearances.ToArray();
145164
break;
146165
case "lifespan": //num or generator
147166
if (value.TryGetValueAsFloat(out float floatValue)) {
148-
ParticlesComponent.Lifespan = new GeneratorNum(floatValue);
167+
_particlesComponent.Lifespan = new GeneratorNum(floatValue);
149168
} else if (value.TryGetValueAsDreamObject<DreamObjectGenerator>(out var generator)) {
150-
ParticlesComponent.Lifespan = generator.RequireType<IGeneratorNum>();
169+
_particlesComponent.Lifespan = generator.RequireType<IGeneratorNum>();
151170
}
152171

153172
break;
154173
case "fadein": //num or generator
155174
if (value.TryGetValueAsInteger(out int intValue)) {
156-
ParticlesComponent.FadeIn = new GeneratorNum(intValue);
175+
_particlesComponent.FadeIn = new GeneratorNum(intValue);
157176
} else if (value.TryGetValueAsDreamObject<DreamObjectGenerator>(out var generator)) {
158-
ParticlesComponent.FadeIn = generator.RequireType<IGeneratorNum>();
177+
_particlesComponent.FadeIn = generator.RequireType<IGeneratorNum>();
159178
}
160179

161180
break;
162181
case "fade": //num or generator
163182
if (value.TryGetValueAsInteger(out intValue)) {
164-
ParticlesComponent.FadeOut = new GeneratorNum(intValue);
183+
_particlesComponent.FadeOut = new GeneratorNum(intValue);
165184
} else if (value.TryGetValueAsDreamObject<DreamObjectGenerator>(out var generator)) {
166-
ParticlesComponent.FadeOut = generator.RequireType<IGeneratorNum>();
185+
_particlesComponent.FadeOut = generator.RequireType<IGeneratorNum>();
167186
}
168187

169188
break;
170189
case "position": //num, list, vector, or generator
171190
if (value.TryGetValueAsFloat(out floatValue)) {
172-
ParticlesComponent.SpawnPosition = new GeneratorNum(floatValue);
191+
_particlesComponent.SpawnPosition = new GeneratorNum(floatValue);
173192
} else if (value.TryGetValueAsDreamObject<DreamObjectGenerator>(out var generator)) {
174-
ParticlesComponent.SpawnPosition = generator.RequireType<IGeneratorVector>();
193+
_particlesComponent.SpawnPosition = generator.RequireType<IGeneratorVector>();
175194
} else if (DreamObjectVector.TryCreateFromValue(value, ObjectTree, out var vector)) {
176-
ParticlesComponent.SpawnPosition = new GeneratorVector2(vector.AsVector2);
195+
_particlesComponent.SpawnPosition = new GeneratorVector2(vector.AsVector2);
177196
} else {
178-
ParticlesComponent.SpawnPosition = new GeneratorVector2(Vector2.Zero);
197+
_particlesComponent.SpawnPosition = new GeneratorVector2(Vector2.Zero);
179198
}
180199

181200
break;
182201
case "velocity": //num, list, vector, or generator
183202
if (value.TryGetValueAsFloat(out floatValue)) {
184-
ParticlesComponent.SpawnVelocity = new GeneratorNum(floatValue);
203+
_particlesComponent.SpawnVelocity = new GeneratorNum(floatValue);
185204
} else if (value.TryGetValueAsDreamObject<DreamObjectGenerator>(out var generator)) {
186-
ParticlesComponent.SpawnVelocity = generator.RequireType<IGeneratorVector>();
205+
_particlesComponent.SpawnVelocity = generator.RequireType<IGeneratorVector>();
187206
} else if (DreamObjectVector.TryCreateFromValue(value, ObjectTree, out var vector)) {
188-
ParticlesComponent.SpawnVelocity = new GeneratorVector2(vector.AsVector2);
207+
_particlesComponent.SpawnVelocity = new GeneratorVector2(vector.AsVector2);
189208
} else {
190-
ParticlesComponent.SpawnVelocity = new GeneratorVector2(Vector2.Zero);
209+
_particlesComponent.SpawnVelocity = new GeneratorVector2(Vector2.Zero);
191210
}
192211

193212
break;
194213
case "scale": //num, list, vector, or generator
195214
if (value.TryGetValueAsFloat(out floatValue)) {
196-
ParticlesComponent.Scale = new GeneratorNum(floatValue);
215+
_particlesComponent.Scale = new GeneratorNum(floatValue);
197216
} else if (value.TryGetValueAsDreamObject<DreamObjectGenerator>(out var generator)) {
198-
ParticlesComponent.Scale = generator.RequireType<IGeneratorVector>();
217+
_particlesComponent.Scale = generator.RequireType<IGeneratorVector>();
199218
} else if (DreamObjectVector.TryCreateFromValue(value, ObjectTree, out var vector)) {
200-
ParticlesComponent.Scale = new GeneratorVector2(vector.AsVector2);
219+
_particlesComponent.Scale = new GeneratorVector2(vector.AsVector2);
201220
} else {
202-
ParticlesComponent.Scale = new GeneratorVector2(Vector2.One);
221+
_particlesComponent.Scale = new GeneratorVector2(Vector2.One);
203222
}
204223

205224
break;
206225
case "grow": //num, list, vector, or generator
207226
if (value.TryGetValueAsFloat(out floatValue)) {
208-
ParticlesComponent.Growth = new GeneratorNum(floatValue);
227+
_particlesComponent.Growth = new GeneratorNum(floatValue);
209228
} else if (value.TryGetValueAsDreamObject<DreamObjectGenerator>(out var generator)) {
210-
ParticlesComponent.Growth = generator.RequireType<IGeneratorVector>();
229+
_particlesComponent.Growth = generator.RequireType<IGeneratorVector>();
211230
} else if (DreamObjectVector.TryCreateFromValue(value, ObjectTree, out var vector)) {
212-
ParticlesComponent.Growth = new GeneratorVector2(vector.AsVector2);
231+
_particlesComponent.Growth = new GeneratorVector2(vector.AsVector2);
213232
} else {
214-
ParticlesComponent.Growth = new GeneratorVector2(Vector2.Zero);
233+
_particlesComponent.Growth = new GeneratorVector2(Vector2.Zero);
215234
}
216235

217236
break;
218237
case "rotation": //num or generator
219238
if (value.TryGetValueAsFloat(out floatValue)) {
220-
ParticlesComponent.Rotation = new GeneratorNum(floatValue);
239+
_particlesComponent.Rotation = new GeneratorNum(floatValue);
221240
} else if (value.TryGetValueAsDreamObject<DreamObjectGenerator>(out var generator)) {
222-
ParticlesComponent.Rotation = generator.RequireType<IGeneratorNum>();
241+
_particlesComponent.Rotation = generator.RequireType<IGeneratorNum>();
223242
}
224243

225244
break;
226245
case "spin": //num or generator
227246
if (value.TryGetValueAsFloat(out floatValue)) {
228-
ParticlesComponent.Spin = new GeneratorNum(floatValue);
247+
_particlesComponent.Spin = new GeneratorNum(floatValue);
229248
} else if (value.TryGetValueAsDreamObject<DreamObjectGenerator>(out var generator)) {
230-
ParticlesComponent.Spin = generator.RequireType<IGeneratorNum>();
249+
_particlesComponent.Spin = generator.RequireType<IGeneratorNum>();
231250
}
232251

233252
break;
234253
case "friction": //num, vector, or generator
235254
if (value.TryGetValueAsFloat(out floatValue)) {
236-
ParticlesComponent.Friction = new GeneratorNum(floatValue);
255+
_particlesComponent.Friction = new GeneratorNum(floatValue);
237256
} else if (value.TryGetValueAsDreamObject<DreamObjectGenerator>(out var generator)) {
238-
ParticlesComponent.Friction = generator.RequireType<IGeneratorVector>();
257+
_particlesComponent.Friction = generator.RequireType<IGeneratorVector>();
239258
} else if (DreamObjectVector.TryCreateFromValue(value, ObjectTree, out var vector)) {
240-
ParticlesComponent.Friction = new GeneratorVector2(vector.AsVector2);
259+
_particlesComponent.Friction = new GeneratorVector2(vector.AsVector2);
241260
} else {
242-
ParticlesComponent.Friction = new GeneratorVector2(Vector2.Zero);
261+
_particlesComponent.Friction = new GeneratorVector2(Vector2.Zero);
243262
}
244263

245264
break;
246265
case "drift": //num, vector, or generator
247266
if (value.TryGetValueAsFloat(out floatValue)) {
248-
ParticlesComponent.Drift = new GeneratorNum(floatValue);
267+
_particlesComponent.Drift = new GeneratorNum(floatValue);
249268
} else if (value.TryGetValueAsDreamObject<DreamObjectGenerator>(out var generator)) {
250-
ParticlesComponent.Drift = generator.RequireType<IGeneratorVector>();
269+
_particlesComponent.Drift = generator.RequireType<IGeneratorVector>();
251270
} else if (DreamObjectVector.TryCreateFromValue(value, ObjectTree, out var vector)) {
252-
ParticlesComponent.Drift = new GeneratorVector2(vector.AsVector2);
271+
_particlesComponent.Drift = new GeneratorVector2(vector.AsVector2);
253272
} else {
254-
ParticlesComponent.Drift = new GeneratorVector2(Vector2.Zero);
273+
_particlesComponent.Drift = new GeneratorVector2(Vector2.Zero);
255274
}
256275

257276
break;

OpenDreamRuntime/Rendering/ServerDreamParticleSystem.cs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,4 @@
22

33
namespace OpenDreamRuntime.Rendering;
44

5-
public sealed class ServerDreamParticlesSystem : SharedDreamParticlesSystem {
6-
public void MarkDirty(Entity<DreamParticlesComponent> ent){
7-
Dirty(ent, ent.Comp);
8-
}
9-
}
5+
public sealed class ServerDreamParticlesSystem : SharedDreamParticlesSystem;

OpenDreamShared/Rendering/DreamParticlesComponent.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
namespace OpenDreamShared.Rendering;
1010

11-
[RegisterComponent, NetworkedComponent, AutoGenerateComponentState(true)]
11+
[RegisterComponent, NetworkedComponent, AutoGenerateComponentState(true, fieldDeltas: true)]
1212
public sealed partial class DreamParticlesComponent : Component {
1313
[ViewVariables(VVAccess.ReadWrite), AutoNetworkedField] public int Width;
1414
[ViewVariables(VVAccess.ReadWrite), AutoNetworkedField] public int Height;

0 commit comments

Comments
 (0)