public static GameDataSnapshot CreateGameDataSnapshot(TempGameData data) { XmlNode gameNode = data.SaveData.DocumentElement["game"]; XmlNode mapsNode = gameNode["maps"]; var dataSnapshot = new GameDataSnapshot(); foreach (XmlNode mapNode in mapsNode) { int id = int.Parse(mapNode["uniqueID"].InnerText); byte[] mapData = ScribeUtil.XmlToByteArray(mapNode); dataSnapshot.mapData[id] = mapData; dataSnapshot.mapCmds[id] = new List <ScheduledCommand>(Find.Maps.First(m => m.uniqueID == id).AsyncTime().cmds); } gameNode["currentMapIndex"].RemoveFromParent(); mapsNode.RemoveAll(); byte[] gameData = ScribeUtil.XmlToByteArray(data.SaveData); dataSnapshot.cachedAtTime = TickPatch.Timer; dataSnapshot.gameData = gameData; dataSnapshot.semiPersistentData = data.SemiPersistent; dataSnapshot.mapCmds[ScheduledCommand.Global] = new List <ScheduledCommand>(Multiplayer.WorldComp.cmds); return(dataSnapshot); }
static bool Prefix() { if (gameToLoad == null) { return(true); } SaveCompression.doSaveCompression = true; try { ScribeUtil.StartLoading(gameToLoad.SaveData); ScribeMetaHeaderUtility.LoadGameDataHeader(ScribeMetaHeaderUtility.ScribeHeaderMode.Map, false); Scribe.EnterNode("game"); Current.Game = new Game(); Current.Game.LoadGame(); // calls Scribe.loader.FinalizeLoading() SemiPersistent.ReadSemiPersistent(gameToLoad.SemiPersistent); } finally { SaveCompression.doSaveCompression = false; gameToLoad = null; } Log.Message("Game loaded"); if (Multiplayer.Client != null) { LongEventHandler.ExecuteWhenFinished(() => { // Inits all caches foreach (ITickable tickable in TickPatch.AllTickables.Where(t => !(t is ConstantTicker))) { tickable.Tick(); } if (!Current.Game.Maps.Any()) { MemoryUtility.UnloadUnusedUnityAssets(); Find.World.renderer.RegenerateAllLayersNow(); } }); } return(false); }
public static void LoadInMainThread(TempGameData gameData) { DeepProfiler.Start("Multiplayer LoadInMainThread"); ClearState(); MemoryUtility.ClearAllMapsAndWorld(); LoadPatch.gameToLoad = gameData; CancelRootPlayStartLongEvents.cancel = true; Find.Root.Start(); CancelRootPlayStartLongEvents.cancel = false; // SaveCompression enabled in the patch SavedGameLoaderNow.LoadGameFromSaveFileNow(null); Log.Message($"loading stack {FactionContext.stack.Count}"); DeepProfiler.End(); }