summaryrefslogtreecommitdiffstats
path: root/src/Plugin.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/Plugin.cpp')
-rw-r--r--src/Plugin.cpp75
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();
+ }
+ }
+}