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
- -- 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).
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).
36
38
37
39
local SaveLoadHandler = {}
38
40
@@ -91,6 +93,7 @@ function SaveLoadHandler:SerializeTable(val, name, skipnewlines, depth)
91
93
elseif val .Magnitude then -- ghetto vector check
92
94
tmp = tmp .. string.format (" %q" , " Vector(" .. val .X .. " ," .. val .Y .. " )" )
93
95
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 );
94
97
tmp = tmp .. string.format (" %q" , " SAVELOADHANDLERUNIQUEID_" .. tostring (val .UniqueID ))
95
98
elseif val .FirstBox then -- ghetto area check
96
99
tmp = tmp .. string.format (" %q" , " SAVELOADHANDLERAREA_" .. tostring (val .Name ))
@@ -109,14 +112,109 @@ function SaveLoadHandler:SerializeTable(val, name, skipnewlines, depth)
109
112
return tmp
110
113
end
111
114
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
+
112
210
function SaveLoadHandler :ParseTableForMOs (tab )
113
211
for k , v in pairs (tab ) do
114
212
if type (v ) == " string" and string.find (v , " SAVELOADHANDLERUNIQUEID_" ) then
115
213
local id = math.abs (tonumber (string.sub (v , 25 , - 1 )));
116
214
if SaveLoadHandler .verboseLogging then
117
- print (" INFO: SaveLoadHandler is looking for this ID: " .. id )
215
+ print (" INFO: SaveLoadHandler is parsing looking for this ID: " .. id )
118
216
end
119
- local mo = MovableMan : FindObjectByUniqueID (id );
217
+ local mo = self : FindMOWithId (id );
120
218
if mo then
121
219
tab [k ] = mo ;
122
220
if SaveLoadHandler .verboseLogging then
@@ -125,7 +223,7 @@ function SaveLoadHandler:ParseTableForMOs(tab)
125
223
end
126
224
else
127
225
print (" ERROR: SaveLoadHandler could not resolve a saved MO UniqueID! A loaded table is likely broken." );
128
- print (" The saved ID including SaveLoadHandler prefix was: " .. v )
226
+ print (" The saved ID was: " .. v )
129
227
end
130
228
elseif type (v ) == " table" then
131
229
self :ParseTableForMOs (v );
180
278
181
279
function SaveLoadHandler :DeserializeTable (serializedTable , name )
182
280
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
-
190
281
local tab = loadstring (" return " .. serializedTable )()
191
282
-- Parse for saved MOSRotatings
192
283
-- Very mildly inefficient in terms of looping even after resolving a value, but it happens once on startup
@@ -227,24 +318,92 @@ function SaveLoadHandler:SaveTableAsString(name, tab)
227
318
end
228
319
229
320
function SaveLoadHandler :SaveMOLocally (self , name , mo )
230
- self :SetNumberValue (name , mo .UniqueID );
321
+ mo :SetNumberValue (" saveLoadHandlerUniqueID" , mo .UniqueID );
322
+ self :SetStringValue (name , " SAVELOADHANDLERUNIQUEID_" .. tostring (mo .UniqueID ));
231
323
end
232
324
233
325
function SaveLoadHandler :LoadLocallySavedMO (self , name )
234
- local id = self :GetNumberValue (name );
235
- self : RemoveNumberValue ( name ) ;
326
+ local v = self :GetStringValue (name );
327
+ local didNotFindAnMO = false ;
236
328
329
+ local notFound = true ;
237
330
if SaveLoadHandler .verboseLogging then
238
331
print (" INFO: SaveLoadHandler is finding this locally saved MO: " .. name );
239
332
end
240
- local mo = MovableMan :FindObjectByUniqueID (id );
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
241
398
242
- if mo then
243
- return mo ;
244
- else
399
+ if notFound then
245
400
print (" ERROR: SaveLoadHandler could not resolve a locally saved MO!" );
246
401
return false ;
247
402
end
403
+
404
+ self :RemoveStringValue (name );
405
+
406
+ return v ;
248
407
249
408
end
250
409
0 commit comments