#include "CScriptingManager.h" #include "CEngine.h" #include "CGenericComponent.h" #include "CGenericConsole.h" #include "CGenericResource.h" #include "ENT_Generic.h" #include "CLogger.h" CScriptingManager::CScriptingManager() { ScriptClassesFactory.SetFunction(CEngine::GetInstance()->ComponentsFactory); ScriptClassesFactory.SetFunction(CEngine::GetInstance()->ConsoleFactory); ScriptClassesFactory.SetFunction(CEngine::GetInstance()->EntitiesFactory); ScriptClassesFactory.SetFunction(CEngine::GetInstance()->ResourcesFactory); } void CScriptingManager::AddScriptEngine(const std::string& name, std::unique_ptr&& eng) { if(name.empty() || ScriptingEngines.find(name) != ScriptingEngines.end()) { throw std::runtime_error("Trying to add existing script engine or with empty name"); } ScriptingEngines.insert({ name, std::move(eng) }); PushCurrentEngine(ScriptingEngines[name].get()); ScriptingEngines[name]->Name = name; ScriptingEngines[name]->Init(); PopCurrentEngine(); } void CScriptingManager::DeleteScriptEngine(const std::string& name) { auto it = ScriptingEngines.find(name); if(it == ScriptingEngines.end()) { return; } ScriptingEngines.erase(it); } bool CScriptingManager::IsScriptEngineExist(const std::string& name) { return ScriptingEngines.find(name) != ScriptingEngines.end(); } CScriptingEngine* CScriptingManager::GetEngine(const std::string& name) { auto it = ScriptingEngines.find(name); return (it != ScriptingEngines.end()) ? it->second.get() : nullptr; } void CScriptingManager::Trace(const std::function& func) { for(auto& kv : ScriptingEngines) { func(kv.second.get()); } } sol::state& CScriptingManager::GetStateReference(lua_State* state) { for(auto& kv : ScriptingEngines) { if(kv.second->State->lua_state() == state) { return *kv.second->State; } } throw std::runtime_error("No such state"); } std::shared_ptr CScriptingManager::GetStateSharedPtr(lua_State* state) { for(auto& kv : ScriptingEngines) { if(kv.second->State->lua_state() == state) { return kv.second->State; } } return nullptr; //throw std::runtime_error("No such state"); } CScriptingEngine* CScriptingManager::GetEngine(sol::state_view state) { for(auto& kv : ScriptingEngines) { if(kv.second->State->lua_state() == state.lua_state()) { return kv.second.get(); } } throw std::runtime_error("No such state"); } CScriptingEngine* CScriptingManager::GetCurrentEngine() { return m_processEngines.empty() ? nullptr : m_processEngines.top(); } void CScriptingManager::PushCurrentEngine(CScriptingEngine* eng) { if(!eng) { return; } m_processEngines.push(eng); } void CScriptingManager::PopCurrentEngine() { if(m_processEngines.empty()) { return; } m_processEngines.pop(); } bool CScriptingManager::IsScriptComponentRegistered(const std::string& type) { for(auto& kv : ScriptingEngines) { if(kv.second->ComponentsManager.IsPresent(type)) { return true; } } return false; } CGenericComponent* CScriptingManager::CreateScriptComponent(const std::string& type) { for(auto& kv : ScriptingEngines) { if(kv.second->ComponentsManager.IsPresent(type)) { return kv.second->ComponentsManager.Create(type); } } return nullptr; } bool CScriptingManager::RemoveRegisteredComponent(const std::string& type) { for(auto& kv : ScriptingEngines) { if(kv.second->ComponentsManager.IsPresent(type)) { kv.second->ComponentsManager.Remove(type); return true; } } return false; } void CScriptingManager::ResetEngineClasses(CScriptingEngine* engine) { ScriptClassesFactory.ResetEngineClassesEverywhere(engine); } void CScriptingManager::V_DeInit() { ScriptingEngines.clear(); } LINK_COMPONENT_TO_CLASS(CScriptingManager, scripting);