31
31
-- a UniqueID is just a number, so SaveLoadHandler will save it as such instead of using its special MO method. UniqueIDs reset on game load too,
32
32
-- so they are no longer the same anyway.
33
33
34
- -- Also, SaveLoadHandler's MO parsing method relies on trawling through entities owned by MovableMan, which means entities that actually exist in the simulation,
35
- -- including those in the inventory of Actors that exist in the simulation.
36
- -- Yes, this means that valid entities that only exist in the lua state and not in the simulation can't really be saved and loaded. Those are wiped
37
- -- as soon a the lua state is deleted (i.e. you save and quit a game).
34
+ -- Note that still-valid entities that nonetheless only exist in the lua state and not in the simulation can't really be saved and loaded. Those are wiped
35
+ -- as soon as the lua state is deleted (i.e. you save and quit a game).
38
36
39
37
local SaveLoadHandler = {}
40
38
@@ -93,7 +91,6 @@ function SaveLoadHandler:SerializeTable(val, name, skipnewlines, depth)
93
91
elseif val .Magnitude then -- ghetto vector check
94
92
tmp = tmp .. string.format (" %q" , " Vector(" .. val .X .. " ," .. val .Y .. " )" )
95
93
elseif val .PresetName and IsMOSRotating (val ) then -- IsMOSRotating freaks out if we give it something that isn't a preset at all... ghetto here too
96
- val :SetNumberValue (" saveLoadHandlerUniqueID" , val .UniqueID );
97
94
tmp = tmp .. string.format (" %q" , " SAVELOADHANDLERUNIQUEID_" .. tostring (val .UniqueID ))
98
95
elseif val .FirstBox then -- ghetto area check
99
96
tmp = tmp .. string.format (" %q" , " SAVELOADHANDLERAREA_" .. tostring (val .Name ))
@@ -112,109 +109,14 @@ function SaveLoadHandler:SerializeTable(val, name, skipnewlines, depth)
112
109
return tmp
113
110
end
114
111
115
- function SaveLoadHandler :FindMOWithId (id )
116
- for act in MovableMan .AddedActors do
117
- if math.abs (act :GetNumberValue (" saveLoadHandlerUniqueID" )) == id then
118
- -- act:removeNumberValue("saveLoadHandlerUniqueID");
119
- return act ;
120
- end
121
- for item in act .Inventory do
122
- if math.abs (item :GetNumberValue (" saveLoadHandlerUniqueID" )) == id then
123
- -- item:removeNumberValue("saveLoadHandlerUniqueID");
124
- return item ;
125
- end
126
- end
127
- for att in ToMOSRotating (act ).Attachables do
128
- if math.abs (att :GetNumberValue (" saveLoadHandlerUniqueID" )) == id then
129
- -- item:removeNumberValue("saveLoadHandlerUniqueID");
130
- return att ;
131
- end
132
- end
133
- end
134
- for act in MovableMan .Actors do
135
- if math.abs (act :GetNumberValue (" saveLoadHandlerUniqueID" )) == id then
136
- -- act:removeNumberValue("saveLoadHandlerUniqueID");
137
- return act ;
138
- end
139
- for item in act .Inventory do
140
- if math.abs (item :GetNumberValue (" saveLoadHandlerUniqueID" )) == id then
141
- -- item:removeNumberValue("saveLoadHandlerUniqueID");
142
- return item ;
143
- end
144
- end
145
- for att in ToMOSRotating (act ).Attachables do
146
- if math.abs (att :GetNumberValue (" saveLoadHandlerUniqueID" )) == id then
147
- -- item:removeNumberValue("saveLoadHandlerUniqueID");
148
- return att ;
149
- end
150
- end
151
- end
152
-
153
- for item in MovableMan .AddedItems do
154
- if math.abs (item :GetNumberValue (" saveLoadHandlerUniqueID" )) == id then
155
- -- item:removeNumberValue("saveLoadHandlerUniqueID");
156
- return item ;
157
- end
158
- for att in ToMOSRotating (item ).Attachables do
159
- if math.abs (att :GetNumberValue (" saveLoadHandlerUniqueID" )) == id then
160
- -- item:removeNumberValue("saveLoadHandlerUniqueID");
161
- return att ;
162
- end
163
- end
164
- end
165
- for item in MovableMan .Items do
166
- if math.abs (item :GetNumberValue (" saveLoadHandlerUniqueID" )) == id then
167
- -- item:removeNumberValue("saveLoadHandlerUniqueID");
168
- return item ;
169
- end
170
- for att in ToMOSRotating (item ).Attachables do
171
- if math.abs (att :GetNumberValue (" saveLoadHandlerUniqueID" )) == id then
172
- -- item:removeNumberValue("saveLoadHandlerUniqueID");
173
- return att ;
174
- end
175
- end
176
- end
177
-
178
- for particle in MovableMan .AddedParticles do
179
- if math.abs (particle :GetNumberValue (" saveLoadHandlerUniqueID" )) == id then
180
- -- particle:removeNumberValue("saveLoadHandlerUniqueID");
181
- return particle ;
182
- end
183
- if IsMOSRotating (particle ) then
184
- for att in ToMOSRotating (particle ).Attachables do
185
- if math.abs (att :GetNumberValue (" saveLoadHandlerUniqueID" )) == id then
186
- -- item:removeNumberValue("saveLoadHandlerUniqueID");
187
- return att ;
188
- end
189
- end
190
- end
191
- end
192
- for particle in MovableMan .Particles do
193
- if math.abs (particle :GetNumberValue (" saveLoadHandlerUniqueID" )) == id then
194
- -- particle:removeNumberValue("saveLoadHandlerUniqueID");
195
- return particle ;
196
- end
197
- if IsMOSRotating (particle ) then
198
- for att in ToMOSRotating (particle ).Attachables do
199
- if math.abs (att :GetNumberValue (" saveLoadHandlerUniqueID" )) == id then
200
- -- item:removeNumberValue("saveLoadHandlerUniqueID");
201
- return att ;
202
- end
203
- end
204
- end
205
- end
206
-
207
- return nil ;
208
- end
209
-
210
112
function SaveLoadHandler :ParseTableForMOs (tab )
211
113
for k , v in pairs (tab ) do
212
114
if type (v ) == " string" and string.find (v , " SAVELOADHANDLERUNIQUEID_" ) then
213
115
local id = math.abs (tonumber (string.sub (v , 25 , - 1 )));
214
116
if SaveLoadHandler .verboseLogging then
215
- print (" INFO: SaveLoadHandler is parsing looking for this ID: " .. id )
117
+ print (" INFO: SaveLoadHandler is looking for this ID: " .. id )
216
118
end
217
- local mo = self : FindMOWithId (id );
119
+ local mo = MovableMan : FindObjectByUniqueID (id );
218
120
if mo then
219
121
tab [k ] = mo ;
220
122
if SaveLoadHandler .verboseLogging then
@@ -223,7 +125,7 @@ function SaveLoadHandler:ParseTableForMOs(tab)
223
125
end
224
126
else
225
127
print (" ERROR: SaveLoadHandler could not resolve a saved MO UniqueID! A loaded table is likely broken." );
226
- print (" The saved ID was: " .. v )
128
+ print (" The saved ID including SaveLoadHandler prefix was: " .. v )
227
129
end
228
130
elseif type (v ) == " table" then
229
131
self :ParseTableForMOs (v );
278
180
279
181
function SaveLoadHandler :DeserializeTable (serializedTable , name )
280
182
183
+ -- for mo in MovableMan.AddedParticles do
184
+ -- print(mo.UniqueID)
185
+ -- end
186
+ -- for mo in MovableMan.AddedActors do
187
+ -- print(mo.UniqueID)
188
+ -- end
189
+
281
190
local tab = loadstring (" return " .. serializedTable )()
282
191
-- Parse for saved MOSRotatings
283
192
-- Very mildly inefficient in terms of looping even after resolving a value, but it happens once on startup
@@ -318,92 +227,24 @@ function SaveLoadHandler:SaveTableAsString(name, tab)
318
227
end
319
228
320
229
function SaveLoadHandler :SaveMOLocally (self , name , mo )
321
- mo :SetNumberValue (" saveLoadHandlerUniqueID" , mo .UniqueID );
322
- self :SetStringValue (name , " SAVELOADHANDLERUNIQUEID_" .. tostring (mo .UniqueID ));
230
+ self :SetNumberValue (name , mo .UniqueID );
323
231
end
324
232
325
233
function SaveLoadHandler :LoadLocallySavedMO (self , name )
326
- local v = self :GetStringValue (name );
327
- local didNotFindAnMO = false ;
234
+ local id = self :GetNumberValue (name );
235
+ self : RemoveNumberValue ( name ) ;
328
236
329
- local notFound = true ;
330
237
if SaveLoadHandler .verboseLogging then
331
238
print (" INFO: SaveLoadHandler is finding this locally saved MO: " .. name );
332
239
end
333
- local id = math.abs (tonumber (string.sub (v , 25 , - 1 )));
334
- for particle in MovableMan .AddedParticles do
335
- if math.abs (particle :GetNumberValue (" saveLoadHandlerUniqueID" )) == id then
336
- -- particle:removeNumberValue("saveLoadHandlerUniqueID");
337
- v = particle ;
338
- notFound = false ;
339
- break ;
340
- end
341
- end
342
- for act in MovableMan .AddedActors do
343
- if math.abs (act :GetNumberValue (" saveLoadHandlerUniqueID" )) == id then
344
- -- act:removeNumberValue("saveLoadHandlerUniqueID");
345
- v = act ;
346
- notFound = false ;
347
- break ;
348
- end
349
- for item in act .Inventory do
350
- if math.abs (item :GetNumberValue (" saveLoadHandlerUniqueID" )) == id then
351
- -- item:removeNumberValue("saveLoadHandlerUniqueID");
352
- v = item ;
353
- notFound = false ;
354
- break ;
355
- end
356
- end
357
- end
358
- for item in MovableMan .AddedItems do
359
- if math.abs (item :GetNumberValue (" saveLoadHandlerUniqueID" )) == id then
360
- -- item:removeNumberValue("saveLoadHandlerUniqueID");
361
- v = item ;
362
- notFound = false ;
363
- break ;
364
- end
365
- end
366
- for particle in MovableMan .Particles do
367
- if math.abs (particle :GetNumberValue (" saveLoadHandlerUniqueID" )) == id then
368
- -- particle:removeNumberValue("saveLoadHandlerUniqueID");
369
- v = particle ;
370
- notFound = false ;
371
- break ;
372
- end
373
- end
374
- for act in MovableMan .Actors do
375
- if math.abs (act :GetNumberValue (" saveLoadHandlerUniqueID" )) == id then
376
- -- act:removeNumberValue("saveLoadHandlerUniqueID");
377
- v = act ;
378
- notFound = false ;
379
- break ;
380
- end
381
- for item in act .Inventory do
382
- if math.abs (item :GetNumberValue (" saveLoadHandlerUniqueID" )) == id then
383
- -- item:removeNumberValue("saveLoadHandlerUniqueID");
384
- v = item ;
385
- notFound = false ;
386
- break ;
387
- end
388
- end
389
- end
390
- for item in MovableMan .Items do
391
- if math.abs (item :GetNumberValue (" saveLoadHandlerUniqueID" )) == id then
392
- -- item:removeNumberValue("saveLoadHandlerUniqueID");
393
- v = item ;
394
- notFound = false ;
395
- break ;
396
- end
397
- end
240
+ local mo = MovableMan :FindObjectByUniqueID (id );
398
241
399
- if notFound then
242
+ if mo then
243
+ return mo ;
244
+ else
400
245
print (" ERROR: SaveLoadHandler could not resolve a locally saved MO!" );
401
246
return false ;
402
247
end
403
-
404
- self :RemoveStringValue (name );
405
-
406
- return v ;
407
248
408
249
end
409
250
0 commit comments