Files
K-C-Multiplayer/LoadSaveOverrides/LoadSaveLoadHooks.cs
2025-12-13 23:58:12 +01:00

80 lines
2.6 KiB
C#

using Harmony;
using KCM.LoadSaveOverrides;
using System;
using UnityEngine;
namespace KCM
{
public static class LoadSaveLoadAtPathHook
{
public static byte[] saveData = new byte[1];
public static string lastLoadedPath = string.Empty;
}
public static class LoadSaveLoadHook
{
public static byte[] saveBytes = null;
public static bool memoryStreamHook = false;
public static MultiplayerSaveContainer saveContainer = null;
}
[HarmonyPatch(typeof(LoadSave), "LoadAtPath")]
public class LoadSaveLoadAtPathCaptureHook
{
public static void Prefix(string path)
{
try
{
if (string.IsNullOrEmpty(path))
return;
LoadSaveLoadAtPathHook.lastLoadedPath = path;
if (!FileExists(path))
return;
LoadSaveLoadAtPathHook.saveData = ReadAllBytes(path);
Main.Log($"Captured save bytes from: {path} ({LoadSaveLoadAtPathHook.saveData.Length} bytes)");
}
catch (Exception ex)
{
Main.Log("Failed capturing save bytes from LoadSave.LoadAtPath");
Main.Log(ex);
}
}
private static bool FileExists(string path)
{
object result = InvokeSystemIoFile("Exists", new Type[] { typeof(string) }, new object[] { path });
return result is bool && (bool)result;
}
private static byte[] ReadAllBytes(string path)
{
object result = InvokeSystemIoFile("ReadAllBytes", new Type[] { typeof(string) }, new object[] { path });
return result as byte[];
}
private static object InvokeSystemIoFile(string methodName, Type[] parameterTypes, object[] args)
{
// Avoid direct references to System.IO in IL (some mod loaders forbid it).
const string typeName = "System.IO.File";
Type fileType =
Type.GetType(typeName) ??
Type.GetType(typeName + ", mscorlib") ??
Type.GetType(typeName + ", System") ??
Type.GetType(typeName + ", System.Runtime") ??
Type.GetType(typeName + ", System.Private.CoreLib");
if (fileType == null)
return null;
var method = fileType.GetMethod(methodName, System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.Static, null, parameterTypes, null);
if (method == null)
return null;
return method.Invoke(null, args);
}
}
}