From 2f5064a41d7117844effc202b828135260b3fc25 Mon Sep 17 00:00:00 2001 From: NGnius Date: Sun, 26 Jan 2020 14:28:57 -0500 Subject: [PATCH] Make engines get registered ASAP instead of on next engine root switch --- GamecraftModdingAPI/Commands/CommandManager.cs | 8 ++++++++ GamecraftModdingAPI/Events/EventManager.cs | 13 +++++++++++++ .../Events/SimpleEventHandlerEngine.cs | 10 ++++++++++ GamecraftModdingAPI/Utility/GameEngineManager.cs | 8 ++++++++ GamecraftModdingAPI/Utility/MenuEngineManager.cs | 8 ++++++++ 5 files changed, 47 insertions(+) diff --git a/GamecraftModdingAPI/Commands/CommandManager.cs b/GamecraftModdingAPI/Commands/CommandManager.cs index fe411a3..f2f79b4 100644 --- a/GamecraftModdingAPI/Commands/CommandManager.cs +++ b/GamecraftModdingAPI/Commands/CommandManager.cs @@ -18,9 +18,16 @@ namespace GamecraftModdingAPI.Commands { private static Dictionary _customCommands = new Dictionary(); + private static EnginesRoot _lastEngineRoot; + public static void AddCommand(ICustomCommandEngine engine) { _customCommands[engine.Name] = engine; + if (_lastEngineRoot != null) + { + Logging.MetaDebugLog($"Registering ICustomCommandEngine {engine.Name}"); + _lastEngineRoot.AddEngine(engine); + } } public static bool ExistsCommand(string name) @@ -50,6 +57,7 @@ namespace GamecraftModdingAPI.Commands public static void RegisterEngines(EnginesRoot enginesRoot) { + _lastEngineRoot = enginesRoot; foreach (var key in _customCommands.Keys) { Logging.MetaDebugLog($"Registering ICustomCommandEngine {_customCommands[key].Name}"); diff --git a/GamecraftModdingAPI/Events/EventManager.cs b/GamecraftModdingAPI/Events/EventManager.cs index 06bcffc..227c7fd 100644 --- a/GamecraftModdingAPI/Events/EventManager.cs +++ b/GamecraftModdingAPI/Events/EventManager.cs @@ -20,11 +20,18 @@ namespace GamecraftModdingAPI.Events private static Dictionary _eventHandlers = new Dictionary(); + private static EnginesRoot _lastEngineRoot; + // event handler management public static void AddEventHandler(IEventHandlerEngine engine) { _eventHandlers[engine.Name] = engine; + if (_lastEngineRoot != null) + { + Logging.MetaDebugLog($"Registering IEventHandlerEngine {engine.Name}"); + _lastEngineRoot.AddEngine(engine); + } } public static bool ExistsEventHandler(string name) @@ -57,6 +64,11 @@ namespace GamecraftModdingAPI.Events public static void AddEventEmitter(IEventEmitterEngine engine) { _eventEmitters[engine.Name] = engine; + if (_lastEngineRoot != null) + { + Logging.MetaDebugLog($"Registering IEventEmitterEngine {engine.Name}"); + _lastEngineRoot.AddEngine(engine); + } } public static bool ExistsEventEmitter(string name) @@ -89,6 +101,7 @@ namespace GamecraftModdingAPI.Events public static void RegisterEngines(EnginesRoot enginesRoot) { + _lastEngineRoot = enginesRoot; // Register handlers before emitters so no events are missed var entityFactory = enginesRoot.GenerateEntityFactory(); foreach (var key in _eventHandlers.Keys) diff --git a/GamecraftModdingAPI/Events/SimpleEventHandlerEngine.cs b/GamecraftModdingAPI/Events/SimpleEventHandlerEngine.cs index 2afffa6..9d9cd4c 100644 --- a/GamecraftModdingAPI/Events/SimpleEventHandlerEngine.cs +++ b/GamecraftModdingAPI/Events/SimpleEventHandlerEngine.cs @@ -33,6 +33,16 @@ namespace GamecraftModdingAPI.Events } } + /// + /// Manually activate the EventHandler. + /// Once activated, the next remove event will not be ignored. + /// + /// Whether to invoke the activated action + public void Activate(bool handle = false) + { + isActivated = true; + } + public void Ready() { } public void Remove(ref ModEventEntityStruct entityView, EGID egid) diff --git a/GamecraftModdingAPI/Utility/GameEngineManager.cs b/GamecraftModdingAPI/Utility/GameEngineManager.cs index b50d37c..5a52fd0 100644 --- a/GamecraftModdingAPI/Utility/GameEngineManager.cs +++ b/GamecraftModdingAPI/Utility/GameEngineManager.cs @@ -15,9 +15,16 @@ namespace GamecraftModdingAPI.Utility { private static Dictionary _gameEngines = new Dictionary(); + private static EnginesRoot _lastEngineRoot; + public static void AddGameEngine(IApiEngine engine) { _gameEngines[engine.Name] = engine; + if (_lastEngineRoot != null) + { + Logging.MetaDebugLog($"Registering Game IApiEngine {engine.Name}"); + _lastEngineRoot.AddEngine(engine); + } } public static bool ExistsGameEngine(string name) @@ -47,6 +54,7 @@ namespace GamecraftModdingAPI.Utility public static void RegisterEngines(EnginesRoot enginesRoot) { + _lastEngineRoot = enginesRoot; foreach (var key in _gameEngines.Keys) { Logging.MetaDebugLog($"Registering Game IApiEngine {_gameEngines[key].Name}"); diff --git a/GamecraftModdingAPI/Utility/MenuEngineManager.cs b/GamecraftModdingAPI/Utility/MenuEngineManager.cs index aedc77c..b5d7be1 100644 --- a/GamecraftModdingAPI/Utility/MenuEngineManager.cs +++ b/GamecraftModdingAPI/Utility/MenuEngineManager.cs @@ -15,10 +15,17 @@ namespace GamecraftModdingAPI.Utility { private static Dictionary _menuEngines = new Dictionary(); + private static EnginesRoot _lastEngineRoot; + // menu engine management public static void AddMenuEngine(IApiEngine engine) { _menuEngines[engine.Name] = engine; + if (_lastEngineRoot != null) + { + Logging.MetaDebugLog($"Registering Menu IApiEngine {engine.Name}"); + _lastEngineRoot.AddEngine(engine); + } } public static bool ExistsMenuEngine(string name) @@ -48,6 +55,7 @@ namespace GamecraftModdingAPI.Utility public static void RegisterEngines(EnginesRoot enginesRoot) { + _lastEngineRoot = enginesRoot; foreach (var key in _menuEngines.Keys) { Logging.MetaDebugLog($"Registering Menu IApiEngine {_menuEngines[key].Name}");