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.

99 lines
2.8KB

  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 Svelto.ECS.Schedulers;
  9. using TechbloxModdingAPI.Commands;
  10. using TechbloxModdingAPI.Utility;
  11. namespace TechbloxModdingAPI.Engines
  12. {
  13. [HarmonyPatch]
  14. static class GameLoadedTimeStoppedEnginePatch
  15. {
  16. public static void Postfix(StateSyncRegistrationHelper stateSyncReg)
  17. {
  18. // register all game engines, including deterministic
  19. GameEngineManager.RegisterEngines(stateSyncReg);
  20. // register command engines
  21. /*CommandLineCompositionRoot.Compose(contextHolder, stateSyncReg.enginesRoot, reloadGame, multiplayerParameters,
  22. stateSyncReg); - uREPL C# compilation not supported anymore */
  23. CommandManager.RegisterEngines(stateSyncReg.enginesRoot);
  24. }
  25. public static MethodBase TargetMethod()
  26. {
  27. return AccessTools.Method(typeof(MainGameCompositionRoot), "DeterministicTimeStoppedCompose").MakeGenericMethod(typeof(object));
  28. }
  29. }
  30. [HarmonyPatch]
  31. static class GameLoadedTimeRunningEnginePatch
  32. {
  33. public static void Postfix(StateSyncRegistrationHelper stateSyncReg)
  34. {
  35. GameEngineManager.RegisterEngines(stateSyncReg);
  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() => IsReload = true;
  48. public static MethodBase TargetMethod() => AccessTools.Method(typeof(FullGameCompositionRoot), "ReloadGame");
  49. }
  50. [HarmonyPatch]
  51. static class GameSwitchedToPatch
  52. {
  53. public static void Prefix() => GameReloadedPatch.IsReload = false;
  54. public static MethodBase TargetMethod() => AccessTools.Method(typeof(FullGameCompositionRoot), "SwitchToGame");
  55. }
  56. [HarmonyPatch]
  57. static class MenuSwitchedToPatch
  58. {
  59. public static void Prefix() => GameReloadedPatch.IsReload = false;
  60. public static MethodBase TargetMethod() => AccessTools.Method(typeof(FullGameCompositionRoot), "SwitchToMenu");
  61. }
  62. [HarmonyPatch]
  63. class MenuLoadedEnginePatch
  64. {
  65. public static void Postfix(EnginesRoot enginesRoot)
  66. {
  67. // register menu engines
  68. MenuEngineManager.RegisterEngines(enginesRoot);
  69. }
  70. public static MethodBase TargetMethod()
  71. {
  72. return AccessTools.Method(typeof(FrontEndCompositionRoot), "Compose").MakeGenericMethod(typeof(object));
  73. }
  74. }
  75. [HarmonyPatch]
  76. class FullGameCreatedEnginePatch
  77. {
  78. public static void Postfix(FullGameCompositionRoot __instance)
  79. {
  80. FullGameFields.Init(__instance);
  81. }
  82. public static MethodBase TargetMethod()
  83. {
  84. return AccessTools.DeclaredConstructor(typeof(FullGameCompositionRoot));
  85. }
  86. }
  87. }