44namespace OpenDreamRuntime . Objects . Types ;
55
66public 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 ;
0 commit comments