#include "CConsole.h" #include "CEngine.h" #include "CCommandProcessor.h" #include "CTerminal.h" template static std::function GetOutTransformer() { return [](const sol::function& func, CConsole* comp) -> Ret { sol::table comp_table = comp->GetScriptTable(func.lua_state()); if constexpr (std::is_void_v) { SafeCallLua(func, comp_table); //func(comp_table); } else { sol::object ret = SafeCallLuaReturn(func, comp_table); return ret.valid() ? ret.as() : false; } }; } template static std::function*, sol::variadic_args)> GetInTransformer() { return [](CFunctionBase* func, sol::variadic_args va) -> sol::object { if(va.size() < 1) { return sol::make_object(va.lua_state(), 1); } auto arg = va.get(0); if(!arg.valid()) { return sol::make_object(va.lua_state(), 2); } sol::state_view state(va.lua_state()); CConsole* console = nullptr; auto terminal = CEngine::GetInstance()->Components.GetComponentTyped(); if(terminal->Console && terminal->Console->GetScriptTable(state) == arg) { console = terminal->Console.get(); } if(!console) { return sol::make_object(va.lua_state(), 3); } sol::object ret = sol::lua_nil; if constexpr (!std::is_void_v) { ret = sol::make_object(va.lua_state(), func->Call(console)); } else { func->Call(console); } return ret; }; } CConsole::CConsole() { OnInit.SetupLuaTransformers(GetOutTransformer(), GetInTransformer()); OnUpdate.SetupLuaTransformers(GetOutTransformer(), GetInTransformer()); OnDestruct.SetupLuaTransformers(GetOutTransformer(), GetInTransformer()); OnScriptInit += [this](std::shared_ptr _state, sol::table _table) -> bool { _table.set_function("init", [this]() { Init(); }); _table.set_function("update", [this]() { Update(); }); auto fieldsMan_pair = CScriptFieldsManager::ValidateFieldsManager(_table); auto fieldsMan = fieldsMan_pair.first; fieldsMan->AddField("type", std::make_unique([this](sol::state_view ts) -> sol::object { return sol::make_object(ts, this->GetType()); })); fieldsMan->AddField("oninit", std::make_unique([this](sol::state_view ts) -> sol::object { return OnInit.GetScriptTable(ts); })); fieldsMan->AddField("onupdate", std::make_unique([this](sol::state_view ts) -> sol::object { return OnUpdate.GetScriptTable(ts); })); fieldsMan->AddField("ondestruct", std::make_unique([this](sol::state_view ts) -> sol::object { return OnDestruct.GetScriptTable(ts); })); fieldsMan->FieldCreationAbility = true; if(!fieldsMan_pair.second) { fieldsMan->CreateMetaTable(_table); } return true; }; } bool CConsole::IsInitted() const { return m_Initted; } void CConsole::Init() { V_Init(); OnInit(this); m_Initted = true; } void CConsole::DeInit() { V_DeInit(); OnDeInit(this); m_Initted = false; } void CConsole::Update() { V_Update(); OnUpdate(this); } CConsole::~CConsole() { OnDestruct(this); } void CConsole::V_Init() {} void CConsole::V_DeInit() {} void CConsole::V_Update() {} void CConsole::Print(const std::wstring& text) {} void CConsole::Error(const std::wstring& err) {} void CConsole::SetColor(const CColor& text, const CColor& bg) {} std::pair CConsole::GetColor() const { return { CColor::White, CColor::Black }; } void CConsole::SendCommand(const std::wstring& cmdline) { COMPONENT_CALL(CCommandProcessor, AddCommandToQueue(cmdline)); }