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.

82 lines
2.6KB

  1. using System.Collections.Generic;
  2. using System.Linq;
  3. using RobocraftX.StateSync;
  4. using Svelto.ECS;
  5. using TechbloxModdingAPI.Engines;
  6. namespace TechbloxModdingAPI.Utility
  7. {
  8. /// <summary>
  9. /// Keeps track of custom game-modifying engines
  10. /// </summary>
  11. public static class GameEngineManager
  12. {
  13. private static Dictionary<string, IApiEngine> _gameEngines = new Dictionary<string, IApiEngine>();
  14. private static EnginesRoot _lastEngineRoot;
  15. public static void AddGameEngine(IApiEngine engine)
  16. {
  17. _gameEngines[engine.Name] = engine;
  18. if (_lastEngineRoot != null)
  19. {
  20. Logging.MetaDebugLog($"Registering Game IApiEngine {engine.Name}");
  21. _lastEngineRoot.AddEngine(engine);
  22. if (engine is IFactoryEngine factoryEngine)
  23. factoryEngine.Factory = _lastEngineRoot.GenerateEntityFactory();
  24. if (engine is IFunEngine funEngine)
  25. funEngine.Functions = _lastEngineRoot.GenerateEntityFunctions();
  26. }
  27. }
  28. public static bool ExistsGameEngine(string name)
  29. {
  30. return _gameEngines.ContainsKey(name);
  31. }
  32. public static bool ExistsGameEngine(IApiEngine engine)
  33. {
  34. return ExistsGameEngine(engine.Name);
  35. }
  36. public static IApiEngine GetGameEngine(string name)
  37. {
  38. return _gameEngines[name];
  39. }
  40. public static string[] GetGameEngineNames()
  41. {
  42. return _gameEngines.Keys.ToArray();
  43. }
  44. public static void RemoveGameEngine(string name)
  45. {
  46. if (_gameEngines[name].isRemovable)
  47. {
  48. _gameEngines.Remove(name);
  49. }
  50. }
  51. public static void RegisterEngines(StateSyncRegistrationHelper helper)
  52. {
  53. var enginesRoot = helper.enginesRoot;
  54. _lastEngineRoot = enginesRoot;
  55. IEntityFactory factory = enginesRoot.GenerateEntityFactory();
  56. IEntityFunctions functions = enginesRoot.GenerateEntityFunctions();
  57. foreach (var key in _gameEngines.Keys)
  58. {
  59. Logging.MetaDebugLog($"Registering Game IApiEngine {_gameEngines[key].Name}");
  60. if (_gameEngines[key] is IDeterministicEngine detEngine)
  61. helper.AddDeterministicEngine(detEngine);
  62. else
  63. enginesRoot.AddEngine(_gameEngines[key]);
  64. if (_gameEngines[key] is IFactoryEngine factEngine)
  65. factEngine.Factory = factory;
  66. if (_gameEngines[key] is IFunEngine funEngine)
  67. funEngine.Functions = functions;
  68. }
  69. }
  70. }
  71. }