#pragma once #include "CComponent.h" #include "CScriptingEngine.h" #include "CScriptClassesManager.h" #include "CObjectFactory.h" #include #include #include #include class CScriptingManager : public CComponent { public: CScriptingManager(); template void CallHook(const std::string& name, Args... args) { for(auto& kv : ScriptingEngines) { PushCurrentEngine(kv.second.get()); kv.second->CallHook(name, args...); PopCurrentEngine(); } } template void CallSingleHook(const std::string& name, const std::string& hookName, Args... args) { for(auto& kv : ScriptingEngines) { PushCurrentEngine(kv.second.get()); kv.second->CallSingleHook(name, hookName, args...); PopCurrentEngine(); } } void AddScriptEngine(const std::string& name, std::unique_ptr&& eng); void DeleteScriptEngine(const std::string& name); bool IsScriptEngineExist(const std::string& name); bool IsScriptComponentRegistered(const std::string& type); bool RemoveRegisteredComponent(const std::string& type); //true - removed, false - not CGenericComponent* CreateScriptComponent(const std::string& type); void V_DeInit() override; void Trace(const std::function& func); sol::state& GetStateReference(lua_State* state); std::shared_ptr GetStateSharedPtr(lua_State* state); CScriptingEngine* GetEngine(sol::state_view state); CScriptingEngine* GetEngine(const std::string& name); CScriptingEngine* GetCurrentEngine(); void PushCurrentEngine(CScriptingEngine* eng); void PopCurrentEngine(); void ResetEngineClasses(CScriptingEngine* engine); CScriptClassesManager ScriptClassesFactory; std::unordered_map> ScriptingEngines; DEFINE_COMPONENT(); private: std::stack m_processEngines; };