115 lines
3.1 KiB
C#
115 lines
3.1 KiB
C#
using System.Reflection;
|
|
using HarmonyLib;
|
|
using RobocraftX;
|
|
using RobocraftX.CR.MainGame;
|
|
using RobocraftX.FrontEnd;
|
|
using RobocraftX.StateSync;
|
|
using Svelto.ECS;
|
|
using TechbloxModdingAPI.Commands;
|
|
using TechbloxModdingAPI.Utility;
|
|
using GameState = TechbloxModdingAPI.Client.App.GameState;
|
|
|
|
namespace TechbloxModdingAPI.Common.Engines
|
|
{
|
|
[HarmonyPatch]
|
|
static class GameLoadedTimeStoppedEnginePatch
|
|
{
|
|
public static void Postfix(StateSyncRegistrationHelper stateSyncReg)
|
|
{
|
|
Client.App.GameClient.CurrentState = GameState.InMachineEditor; // TODO: World editor
|
|
// register all game engines, including deterministic
|
|
GameEngineManager.RegisterEngines(stateSyncReg);
|
|
// register command engines
|
|
CommandManager.RegisterEngines(stateSyncReg.enginesRoot);
|
|
}
|
|
|
|
public static MethodBase TargetMethod()
|
|
{
|
|
return AccessTools.Method(typeof(MainGameCompositionRoot), "DeterministicTimeStoppedCompose").MakeGenericMethod(typeof(object));
|
|
}
|
|
}
|
|
|
|
[HarmonyPatch]
|
|
static class GameLoadedTimeRunningEnginePatch
|
|
{
|
|
public static void Postfix(StateSyncRegistrationHelper stateSyncReg)
|
|
{
|
|
Client.App.GameClient.CurrentState = GameState.InTestMode; // TODO: Client/server
|
|
GameEngineManager.RegisterEngines(stateSyncReg);
|
|
CommandManager.RegisterEngines(stateSyncReg.enginesRoot);
|
|
}
|
|
|
|
public static MethodBase TargetMethod()
|
|
{
|
|
return AccessTools.Method(typeof(MainGameCompositionRoot), "DeterministicTimeRunningCompose").MakeGenericMethod(typeof(object));
|
|
}
|
|
}
|
|
|
|
[HarmonyPatch]
|
|
static class GameReloadedPatch
|
|
{
|
|
internal static bool IsReload;
|
|
public static void Prefix()
|
|
{
|
|
IsReload = true;
|
|
Client.App.GameClient.CurrentState = GameState.Loading;
|
|
}
|
|
|
|
public static MethodBase TargetMethod() => AccessTools.Method(typeof(FullGameCompositionRoot), "ReloadGame");
|
|
}
|
|
|
|
[HarmonyPatch]
|
|
static class GameSwitchedToPatch
|
|
{
|
|
public static void Prefix()
|
|
{
|
|
GameReloadedPatch.IsReload = false;
|
|
Client.App.GameClient.CurrentState = GameState.Loading;
|
|
}
|
|
|
|
public static MethodBase TargetMethod() => AccessTools.Method(typeof(FullGameCompositionRoot), "SwitchToGame");
|
|
}
|
|
|
|
[HarmonyPatch]
|
|
static class MenuSwitchedToPatch
|
|
{
|
|
public static void Prefix()
|
|
{
|
|
GameReloadedPatch.IsReload = false;
|
|
Client.App.GameClient.CurrentState = GameState.Loading;
|
|
}
|
|
|
|
public static MethodBase TargetMethod() => AccessTools.Method(typeof(FullGameCompositionRoot), "SwitchToMenu");
|
|
}
|
|
|
|
[HarmonyPatch]
|
|
class MenuLoadedEnginePatch
|
|
{
|
|
public static void Postfix(EnginesRoot enginesRoot)
|
|
{
|
|
Client.App.GameClient.CurrentState = GameState.InMenu; // TODO: Loaded states
|
|
// register menu engines
|
|
MenuEngineManager.RegisterEngines(enginesRoot);
|
|
}
|
|
|
|
public static MethodBase TargetMethod()
|
|
{
|
|
return AccessTools.Method(typeof(FrontEndCompositionRoot), "Compose").MakeGenericMethod(typeof(object));
|
|
}
|
|
}
|
|
|
|
[HarmonyPatch]
|
|
class FullGameCreatedEnginePatch
|
|
{
|
|
public static void Postfix(FullGameCompositionRoot __instance)
|
|
{
|
|
Client.App.GameClient.CurrentState = GameState.Loading;
|
|
FullGameFields.Init(__instance);
|
|
}
|
|
|
|
public static MethodBase TargetMethod()
|
|
{
|
|
return AccessTools.DeclaredConstructor(typeof(FullGameCompositionRoot));
|
|
}
|
|
}
|
|
}
|