Files
SlayTheSpire2.LAN.Multiplayer/SlayTheSpire2.LAN.Multiplayer/Patchs/RunSaveManagerPatch.cs
T

87 lines
3.6 KiB
C#

using System.Text.Json;
using HarmonyLib;
using MegaCrit.Sts2.Core.Helpers;
using MegaCrit.Sts2.Core.Multiplayer.Game;
using MegaCrit.Sts2.Core.Platform;
using MegaCrit.Sts2.Core.Rooms;
using MegaCrit.Sts2.Core.Runs;
using MegaCrit.Sts2.Core.Saves;
using MegaCrit.Sts2.Core.Saves.Managers;
using SlayTheSpire2.LAN.Multiplayer.Models;
using SlayTheSpire2.LAN.Multiplayer.Services;
// ReSharper disable UnusedMember.Global
// ReSharper disable UnusedType.Global
namespace SlayTheSpire2.LAN.Multiplayer.Patchs
{
[HarmonyPatch(typeof(RunSaveManager), "SaveRun", new[] { typeof(AbstractRoom) })]
internal class RunSaveManagerSaveRunPatch
{
private static bool Prefix(RunSaveManager __instance, AbstractRoom? preFinishedRoom, bool ____forceSynchronous,
ISaveStore ____saveStore, Action? ___Saved, ref Task __result)
{
__result = TaskHelper.RunSafely(SaveRun(__instance, preFinishedRoom, ____forceSynchronous, ____saveStore,
___Saved));
return false;
}
private static async Task SaveRun(RunSaveManager runSaveManager, AbstractRoom? preFinishedRoom,
bool forceSynchronous,
ISaveStore saveStore, Action? saved)
{
if (!RunManager.Instance.ShouldSave || (RunManager.Instance.NetService.Type != NetGameType.Singleplayer &&
RunManager.Instance.NetService.Type != NetGameType.Host))
return;
var value = RunManager.Instance.ToSave(preFinishedRoom);
var isMultiplayer = RunManager.Instance.NetService.Type.IsMultiplayer();
var isNonePlatform = RunManager.Instance.NetService.Platform == PlatformType.None;
var savePath = isMultiplayer
? isNonePlatform
? LanRunSaveManagerService.Instance.CurrentMultiplayerRunSavePath
: Traverse.Create(runSaveManager).Property("CurrentMultiplayerRunSavePath").GetValue<string>()
: Traverse.Create(runSaveManager).Property("CurrentRunSavePath").GetValue<string>();
using var stream = new MemoryStream();
if (!forceSynchronous)
{
await JsonSerializer.SerializeAsync(stream, value,
JsonSerializationUtility.GetTypeInfo<SerializableRun>(), CancellationToken.None);
}
else
{
await JsonSerializer.SerializeAsync(stream, value,
JsonSerializationUtility.GetTypeInfo<SerializableRun>());
}
stream.Seek(0L, SeekOrigin.Begin);
await saveStore.WriteFileAsync(savePath, stream.ToArray());
if (isMultiplayer && isNonePlatform)
{
var lanPlayerNameService = LanPlayerNameService.Instance;
using var playerNamesStream = new MemoryStream();
if (!forceSynchronous)
{
await JsonSerializer.SerializeAsync(playerNamesStream, lanPlayerNameService.PlayerNames,
PlayerNamesContext.Default.PlayerNames, CancellationToken.None);
}
else
{
await JsonSerializer.SerializeAsync(playerNamesStream, lanPlayerNameService.PlayerNames,
PlayerNamesContext.Default.PlayerNames);
}
playerNamesStream.Seek(0L, SeekOrigin.Begin);
await saveStore.WriteFileAsync(LanRunSaveManagerService.Instance.CurrentMultiplayerRunPlayerNamesPath,
playerNamesStream.ToArray());
}
saved?.Invoke();
}
}
}