SRMP-Public/SRMP/Patches/Patch_AutoSaveDirector.cs
2023-05-29 22:23:11 +02:00

79 lines
No EOL
3.3 KiB
C#

using HarmonyLib;
using MonomiPark.SlimeRancher.DataModel;
using MonomiPark.SlimeRancher.Persist;
using SRMultiplayer;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using UnityEngine;
namespace SRMultiplayer.Patches
{
[HarmonyPatch(typeof(AutoSaveDirector))]
[HarmonyPatch("SaveGame")]
class AutoSaveDirector_SaveGame
{
static bool Prefix()
{
if(Globals.IsServer)
{
foreach(var player in Globals.Players.Values)
{
if(player.UUID != null && player.UUID != Guid.Empty)
{
player.Save();
}
}
return true;
}
else if(Globals.ClientLoaded && !string.IsNullOrWhiteSpace(Globals.CurrentGameName))
{
try
{
using (FileStream file = new FileStream(Path.Combine(SRMP.ModDataPath, Globals.CurrentGameName + ".player"), FileMode.Create))
{
using (BinaryWriter writer = new BinaryWriter(file))
{
var ammo = SRSingleton<SceneContext>.Instance.PlayerState.model.ammoDict;
Debug.Log($"Saving {Path.Combine(SRMP.ModDataPath, Globals.CurrentGameName + ".player")}");
writer.Write(ammo.Count);
foreach(var state in ammo.Keys)
{
writer.Write((byte)state);
writer.Write(ammo[state].usableSlots);
writer.Write(ammo[state].slots.Length);
for (int i = 0; i < ammo[state].slots.Length; i++)
{
writer.Write(ammo[state].slots[i] != null);
if(ammo[state].slots[i] != null)
{
writer.Write((ushort)ammo[state].slots[i].id);
writer.Write(ammo[state].slots[i].count);
writer.Write(ammo[state].slots[i].emotions != null);
if(ammo[state].slots[i].emotions != null)
{
writer.Write(ammo[state].slots[i].emotions.Count);
foreach(var emotion in ammo[state].slots[i].emotions)
{
writer.Write((ushort)emotion.Key);
writer.Write(emotion.Value);
}
}
}
}
}
}
}
}
catch(Exception ex)
{
Debug.Log($"Couldn't save playerdata for {Globals.CurrentGameName}: {ex.Message}");
}
}
return !Globals.IsClient;
}
}
}