#pragma once #include "CFunctionBase.h" #include "U_ScriptingStates.h" #include "U_SafeLuaCall.h" #include "sol/sol.hpp" #include #include template class CLuaFunction : public virtual CFunctionBase { public: //out - CPP to LUA //in - LUA TO CPP using CustomOutCallerFunction = std::function; CLuaFunction(const sol::function& _func) : State(ScriptStates::GetStateSharedPtr(_func.lua_state())) { Function = std::make_shared(_func); } CLuaFunction(const sol::function& _func, const CustomOutCallerFunction& _outcaller) : State(ScriptStates::GetStateSharedPtr(_func.lua_state())) { Function = std::make_shared(_func); MakeCustomOutCaller(_outcaller); } ~CLuaFunction() { Function.reset(); } ReturnValue Call(Args... args) const override { if (CustomOutCaller && Function && Function->valid()) { return (*CustomOutCaller)(*Function, args...); } sol::object ret; if(Function && Function->valid()) { ret = SafeCallLuaReturn((*Function), args...); //ret = (*Function)(args...); } if constexpr (!std::is_void_v) { return ret.valid() ? ret.as() : ReturnValue{}; } } bool IsValid() const override { return Function && Function->valid(); } void MakeCustomOutCaller(const CustomOutCallerFunction& outcaller) { CustomOutCaller.reset(); CustomOutCaller = std::make_unique(outcaller); } std::unique_ptr CustomOutCaller; std::shared_ptr State; std::shared_ptr Function; };