A stable modding interface between Techblox and mods https://mod.exmods.org/
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

116 lines
3.3KB

  1. using System.Reflection;
  2. using HarmonyLib;
  3. using RobocraftX;
  4. using RobocraftX.CR.MainGame;
  5. using RobocraftX.FrontEnd;
  6. using RobocraftX.StateSync;
  7. using Svelto.ECS;
  8. using TechbloxModdingAPI.Commands;
  9. using TechbloxModdingAPI.Utility;
  10. using GameState = TechbloxModdingAPI.Client.App.GameState;
  11. namespace TechbloxModdingAPI.Common.Engines
  12. {
  13. [HarmonyPatch]
  14. static class GameLoadedTimeStoppedEnginePatch
  15. {
  16. public static void Postfix(StateSyncRegistrationHelper stateSyncReg)
  17. {
  18. Client.App.GameClient.CurrentState = GameState.InMachineEditor; // TODO: World editor
  19. // register all game engines, including deterministic
  20. EngineManager.RegisterEngines(stateSyncReg, stateSyncReg.enginesRoot, ApiEngineType.Build);
  21. // register command engines
  22. CommandManager.RegisterEngines(stateSyncReg.enginesRoot);
  23. }
  24. public static MethodBase TargetMethod()
  25. {
  26. return AccessTools.Method(typeof(MainGameCompositionRoot), "DeterministicTimeStoppedCompose").MakeGenericMethod(typeof(object));
  27. }
  28. }
  29. [HarmonyPatch]
  30. static class GameLoadedTimeRunningEnginePatch
  31. {
  32. public static void Postfix(StateSyncRegistrationHelper stateSyncReg)
  33. {
  34. Client.App.GameClient.CurrentState = GameState.InTestMode; // TODO: Client/server
  35. EngineManager.RegisterEngines(stateSyncReg, stateSyncReg.enginesRoot, ApiEngineType.PlayClient); // TODO: Client/server
  36. CommandManager.RegisterEngines(stateSyncReg.enginesRoot);
  37. }
  38. public static MethodBase TargetMethod()
  39. {
  40. return AccessTools.Method(typeof(MainGameCompositionRoot), "DeterministicTimeRunningCompose").MakeGenericMethod(typeof(object));
  41. }
  42. }
  43. [HarmonyPatch]
  44. static class GameReloadedPatch
  45. {
  46. internal static bool IsReload;
  47. public static void Prefix()
  48. {
  49. IsReload = true;
  50. Client.App.GameClient.CurrentState = GameState.Loading;
  51. }
  52. public static MethodBase TargetMethod() => AccessTools.Method(typeof(FullGameCompositionRoot), "ReloadGame");
  53. }
  54. [HarmonyPatch]
  55. static class GameSwitchedToPatch
  56. {
  57. public static void Prefix()
  58. {
  59. GameReloadedPatch.IsReload = false;
  60. Client.App.GameClient.CurrentState = GameState.Loading;
  61. }
  62. public static MethodBase TargetMethod() => AccessTools.Method(typeof(FullGameCompositionRoot), "SwitchToGame");
  63. }
  64. [HarmonyPatch]
  65. static class MenuSwitchedToPatch
  66. {
  67. public static void Prefix()
  68. {
  69. GameReloadedPatch.IsReload = false;
  70. Client.App.GameClient.CurrentState = GameState.Loading;
  71. }
  72. public static MethodBase TargetMethod() => AccessTools.Method(typeof(FullGameCompositionRoot), "SwitchToMenu");
  73. }
  74. [HarmonyPatch]
  75. class MenuLoadedEnginePatch
  76. {
  77. public static void Postfix(EnginesRoot enginesRoot)
  78. {
  79. Client.App.GameClient.CurrentState = GameState.InMenu; // TODO: Loaded states
  80. // register menu engines
  81. EngineManager.RegisterEngines(null, enginesRoot, ApiEngineType.Menu);
  82. }
  83. public static MethodBase TargetMethod()
  84. {
  85. return AccessTools.Method(typeof(FrontEndCompositionRoot), "Compose").MakeGenericMethod(typeof(object));
  86. }
  87. }
  88. [HarmonyPatch]
  89. class FullGameCreatedEnginePatch
  90. {
  91. public static void Postfix(FullGameCompositionRoot __instance)
  92. {
  93. Client.App.GameClient.CurrentState = GameState.Loading;
  94. FullGameFields.Init(__instance);
  95. }
  96. public static MethodBase TargetMethod()
  97. {
  98. return AccessTools.DeclaredConstructor(typeof(FullGameCompositionRoot));
  99. }
  100. }
  101. }