Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion Source/Client/AsyncTime/AsyncWorldTimeComp.cs
Original file line number Diff line number Diff line change
Expand Up @@ -276,7 +276,10 @@ public void ExecuteCmd(ScheduledCommand cmd)

private static void CreateJoinPointAndSendIfHost()
{
Multiplayer.session.dataSnapshot = SaveLoad.CreateGameDataSnapshot(SaveLoad.SaveAndReload(true), Multiplayer.GameComp.multifaction);
Multiplayer.session.dataSnapshot = SaveLoad.SaveReloadAndCreateSnapshot(
Multiplayer.GameComp.multifaction,
ReloadOptimizationMode.ForJoinPointSnapshot
);

if (!TickPatch.Simulating && !Multiplayer.IsReplay)
{
Expand Down
164 changes: 0 additions & 164 deletions Source/Client/Saving/CacheForReloading.cs

This file was deleted.

53 changes: 53 additions & 0 deletions Source/Client/Saving/ReloadOptimization.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
using System;
using Verse;

namespace Multiplayer.Client
{
public enum ReloadOptimizationMode
{
None,
ForJoinPointSnapshot,
}

internal static class ReloadOptimization
{
public static ReloadOptimizationPlan PlanFor(ReloadOptimizationMode mode)
{
return mode switch
{
ReloadOptimizationMode.ForJoinPointSnapshot => new(
RegenerateMapDrawersWhenRestoringFaction: false,
RegenerateMapDrawersAfterSnapshot: true
),
_ => new(
RegenerateMapDrawersWhenRestoringFaction: true,
RegenerateMapDrawersAfterSnapshot: false
),
};
}

public static void Complete(ReloadOptimizationMode mode)
{
Complete(mode, RegenerateMapDrawers);
}

internal static void Complete(ReloadOptimizationMode mode, Action regenerateMapDrawers)
{
if (!PlanFor(mode).RegenerateMapDrawersAfterSnapshot)
return;

regenerateMapDrawers();
}

private static void RegenerateMapDrawers()
{
foreach (var map in Find.Maps)
map.mapDrawer.RegenerateEverythingNow();
}
}

internal readonly record struct ReloadOptimizationPlan(
bool RegenerateMapDrawersWhenRestoringFaction,
bool RegenerateMapDrawersAfterSnapshot
);
}
47 changes: 26 additions & 21 deletions Source/Client/Saving/SaveLoad.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,13 +20,23 @@ public record TempGameData(XmlDocument SaveData, byte[] SessionData);

public static class SaveLoad
{
public static TempGameData SaveAndReload(bool cache = false)
public static TempGameData SaveAndReload()
{
return SaveAndReload(ReloadOptimizationMode.None);
}

public static TempGameData SaveAndReload(ReloadOptimizationMode optimizationMode)
{
var data = SaveAndReloadCore(optimizationMode);
ReloadOptimization.Complete(optimizationMode);
return data;
}

private static TempGameData SaveAndReloadCore(ReloadOptimizationMode optimizationMode)
{
Multiplayer.reloading = true;

var worldGridSaved = Find.WorldGrid;
var tweenedPos = new Dictionary<int, Vector3>();
var drawers = new Dictionary<int, MapDrawer>();
var localFactionId = Multiplayer.RealPlayerFaction.loadID;
var mapCmds = new Dictionary<int, Queue<ScheduledCommand>>();
var planetRenderMode = Find.World.renderer.wantedMode;
Expand All @@ -37,8 +47,6 @@ public static TempGameData SaveAndReload(bool cache = false)

foreach (Map map in Find.Maps)
{
drawers[map.uniqueID] = map.mapDrawer;

foreach (Pawn p in map.mapPawns.AllPawnsSpawned)
tweenedPos[p.thingIDNumber] = p.drawer.tweener.tweenedPos;

Expand All @@ -58,21 +66,6 @@ public static TempGameData SaveAndReload(bool cache = false)
gameData = SaveGameData();
}

if (cache)
{
MapDrawerRegenPatch.copyFrom = drawers;
WorldGridCachePatch.copyFrom = worldGridSaved;
WorldGridExposeDataPatch.copyFrom = worldGridSaved;
WorldRendererCachePatch.copyFrom = worldGridSaved;
}
else
{
MapDrawerRegenPatch.copyFrom.Clear();
WorldGridCachePatch.copyFrom = null;
WorldGridExposeDataPatch.copyFrom = null;
WorldRendererCachePatch.copyFrom = null;
}

MusicManagerPlay musicManager = null;
if (Find.MusicManagerPlay.gameObjectCreated)
{
Expand All @@ -88,7 +81,11 @@ public static TempGameData SaveAndReload(bool cache = false)
if (musicManager != null)
Current.Root_Play.musicManagerPlay = musicManager;

Multiplayer.game.ChangeRealPlayerFaction(Find.FactionManager.GetById(localFactionId));
var reloadPlan = ReloadOptimization.PlanFor(optimizationMode);
Multiplayer.game.ChangeRealPlayerFaction(
Find.FactionManager.GetById(localFactionId),
reloadPlan.RegenerateMapDrawersWhenRestoringFaction
);

foreach (Map m in Find.Maps)
{
Expand Down Expand Up @@ -118,6 +115,14 @@ public static TempGameData SaveAndReload(bool cache = false)
return gameData;
}

public static GameDataSnapshot SaveReloadAndCreateSnapshot(bool removeCurrentMapId, ReloadOptimizationMode optimizationMode)
{
var data = SaveAndReloadCore(optimizationMode);
var snapshot = CreateGameDataSnapshot(data, removeCurrentMapId);
ReloadOptimization.Complete(optimizationMode);
return snapshot;
}

public static void LoadInMainThread(TempGameData gameData)
{
DeepProfiler.Start("Multiplayer LoadInMainThread");
Expand Down
Loading