diff options
Diffstat (limited to 'src/Plugin.cpp')
-rw-r--r-- | src/Plugin.cpp | 75 |
1 files changed, 65 insertions, 10 deletions
diff --git a/src/Plugin.cpp b/src/Plugin.cpp index 41c690c..9641e0f 100644 --- a/src/Plugin.cpp +++ b/src/Plugin.cpp @@ -4,6 +4,11 @@ #include <easylogging++.h> #include <sol.hpp> +#include <optick.h> + +#include "GameState.hpp" +#include "Game.hpp" + struct Plugin { const std::string name; @@ -11,6 +16,7 @@ struct Plugin { const std::function<void()> onLoad; const std::function<void()> onUnload; const std::function<void(std::string)> onChangeState; + const std::function<void(double)> onTick; }; @@ -20,13 +26,14 @@ sol::state lua; namespace PluginApi { - void RegisterPlugin(sol::table self, sol::table plugin) { + void RegisterPlugin(sol::table plugin) { Plugin nativePlugin { - plugin["name"].get_or<std::string>("75"), + plugin["name"].get_or<std::string>(""), plugin["displayName"].get_or<std::string>(""), plugin["onLoad"].get_or(std::function<void()>()), plugin["onUnload"].get_or(std::function<void()>()), - plugin["onChangeState"].get_or(std::function<void(std::string)>()) + plugin["onChangeState"].get_or(std::function<void(std::string)>()), + plugin["onTick"].get_or(std::function<void(double)>()) }; plugins.push_back(nativePlugin); nativePlugin.onLoad(); @@ -34,14 +41,25 @@ namespace PluginApi { LOG(INFO) << "Loaded plugin " << (!nativePlugin.displayName.empty() ? nativePlugin.displayName : nativePlugin.name); } - void LogWarning(sol::table self, std::string text) { + void LogWarning(std::string text) { LOG(WARNING) << text; } + void LogInfo(std::string text) { + LOG(INFO) << text; + } + + void LogError(std::string text) { + LOG(ERROR) << text; + } + + GameState *GetGameState() { + return ::GetGameState(); + } } -void PluginSystem::Init() -{ +void PluginSystem::Init() { + OPTICK_EVENT(); LOG(INFO) << "Initializing plugin system"; for (Plugin &plugin : plugins) { if (plugin.onUnload) @@ -52,23 +70,47 @@ void PluginSystem::Init() lua = sol::state(); lua.open_libraries(); + lua.new_usertype<Entity>("Entity", + "pos", &Entity::pos); + + lua.new_usertype<GameState>("GameState", + "GetPlayer", &GameState::GetPlayer, + "GetWorld", &GameState::GetWorld); + + lua.new_usertype<World>("World"); + + lua.new_usertype<Vector>("Vector", + "x", &Vector::x, + "y", &Vector::y, + "z", &Vector::z); + + lua.new_usertype<VectorF>("VectorF", + "x", &VectorF::x, + "y", &VectorF::y, + "z", &VectorF::z); + sol::table apiTable = lua["AC"].get_or_create<sol::table>(); apiTable["RegisterPlugin"] = PluginApi::RegisterPlugin; apiTable["LogWarning"] = PluginApi::LogWarning; + apiTable["LogInfo"] = PluginApi::LogInfo; + apiTable["LogError"] = PluginApi::LogError; + apiTable["GetGameState"] = PluginApi::GetGameState; } -void PluginSystem::Execute(const std::string &luaCode) -{ +void PluginSystem::Execute(const std::string &luaCode, bool except) { + OPTICK_EVENT(); try { lua.safe_script(luaCode); } catch (sol::error &e) { LOG(ERROR) << e.what(); + if (except) + throw; } } -void PluginSystem::CallOnChangeState(std::string newState) -{ +void PluginSystem::CallOnChangeState(std::string newState) { + OPTICK_EVENT(); for (Plugin &plugin : plugins) { if (plugin.onChangeState) try { @@ -79,3 +121,16 @@ void PluginSystem::CallOnChangeState(std::string newState) } } } + +void PluginSystem::CallOnTick(double deltaTime) { + OPTICK_EVENT(); + for (Plugin& plugin : plugins) { + if (plugin.onTick) + try { + plugin.onTick(deltaTime); + } + catch (sol::error &e) { + LOG(ERROR) << e.what(); + } + } +} |