diff options
Diffstat (limited to 'src/Plugin.cpp')
-rw-r--r-- | src/Plugin.cpp | 71 |
1 files changed, 65 insertions, 6 deletions
diff --git a/src/Plugin.cpp b/src/Plugin.cpp index 9641e0f..4ef1240 100644 --- a/src/Plugin.cpp +++ b/src/Plugin.cpp @@ -8,9 +8,11 @@ #include "GameState.hpp" #include "Game.hpp" +#include "Event.hpp" struct Plugin { + int errors; const std::string name; const std::string displayName; const std::function<void()> onLoad; @@ -28,6 +30,7 @@ namespace PluginApi { void RegisterPlugin(sol::table plugin) { Plugin nativePlugin { + 0, plugin["name"].get_or<std::string>(""), plugin["displayName"].get_or<std::string>(""), plugin["onLoad"].get_or(std::function<void()>()), @@ -62,7 +65,7 @@ void PluginSystem::Init() { OPTICK_EVENT(); LOG(INFO) << "Initializing plugin system"; for (Plugin &plugin : plugins) { - if (plugin.onUnload) + if (plugin.onUnload && plugin.errors < 10) plugin.onUnload(); } @@ -75,16 +78,70 @@ void PluginSystem::Init() { lua.new_usertype<GameState>("GameState", "GetPlayer", &GameState::GetPlayer, - "GetWorld", &GameState::GetWorld); - - lua.new_usertype<World>("World"); + "GetWorld", &GameState::GetWorld, + "GetTimeStatus", &GameState::GetTimeStatus, + "GetGameStatus", &GameState::GetGameStatus, + "GetPlayerStatus", &GameState::GetPlayerStatus, + "GetSelectionStatus", &GameState::GetSelectionStatus, + "GetInventory", &GameState::GetInventory); + + lua.new_usertype<TimeStatus>("TimeStatus", + "interpolatedTimeOfDay", &TimeStatus::interpolatedTimeOfDay, + "worldAge", &TimeStatus::worldAge, + "timeOfDay", &TimeStatus::timeOfDay, + "doDaylightCycle", &TimeStatus::doDaylightCycle); + + lua.new_usertype<GameStatus>("GameStatus", + "levelType", &GameStatus::levelType, + "spawnPosition", &GameStatus::spawnPosition, + "gamemode", &GameStatus::gamemode, + "dimension", &GameStatus::dimension, + "difficulty", &GameStatus::difficulty, + "maxPlayers", &GameStatus::maxPlayers, + "isGameStarted", &GameStatus::isGameStarted, + "reducedDebugInfo", &GameStatus::reducedDebugInfo); + + lua.new_usertype<SelectionStatus>("SelectionStatus", + "raycastHit", &SelectionStatus::raycastHit, + "selectedBlock", &SelectionStatus::selectedBlock, + "distanceToSelectedBlock", &SelectionStatus::distanceToSelectedBlock, + "isBlockSelected", &SelectionStatus::isBlockSelected); + + lua.new_usertype<PlayerStatus>("PlayerStatus", + "uid", &PlayerStatus::uid, + "name", &PlayerStatus::name, + "flyingSpeed", &PlayerStatus::flyingSpeed, + "fovModifier", &PlayerStatus::fovModifier, + "health", &PlayerStatus::health, + "eid", &PlayerStatus::eid, + "invulnerable", &PlayerStatus::invulnerable, + "flying", &PlayerStatus::flying, + "allowFlying", &PlayerStatus::allowFlying, + "creativeMode", &PlayerStatus::creativeMode); + + lua.new_usertype<World>("World", + "GetEntitiesList", &World::GetEntitiesList, + "GetEntity",&World::GetEntityPtr, + "Raycast", &World::Raycast, + "GetBlockId", &World::GetBlockId, + "SetBlockId", &World::SetBlockId); + + lua.new_usertype<BlockId>("BlockId", + "id", sol::property( + [](BlockId & bid) { return bid.id; }, + [](BlockId & bid, unsigned short id) { bid.id = id; }), + "state", sol::property( + [](BlockId & bid) { return bid.state; }, + [](BlockId & bid, unsigned char state) { bid.state = state; })); lua.new_usertype<Vector>("Vector", + sol::constructors<Vector(),Vector(long long, long long, long long)>(), "x", &Vector::x, "y", &Vector::y, "z", &Vector::z); lua.new_usertype<VectorF>("VectorF", + sol::constructors<VectorF(), VectorF(double, double, double)>(), "x", &VectorF::x, "y", &VectorF::y, "z", &VectorF::z); @@ -112,12 +169,13 @@ void PluginSystem::Execute(const std::string &luaCode, bool except) { void PluginSystem::CallOnChangeState(std::string newState) { OPTICK_EVENT(); for (Plugin &plugin : plugins) { - if (plugin.onChangeState) + if (plugin.onChangeState && plugin.errors < 10) try { plugin.onChangeState(newState); } catch (sol::error &e) { LOG(ERROR) << e.what(); + plugin.errors++; } } } @@ -125,12 +183,13 @@ void PluginSystem::CallOnChangeState(std::string newState) { void PluginSystem::CallOnTick(double deltaTime) { OPTICK_EVENT(); for (Plugin& plugin : plugins) { - if (plugin.onTick) + if (plugin.onTick && plugin.errors < 10) try { plugin.onTick(deltaTime); } catch (sol::error &e) { LOG(ERROR) << e.what(); + plugin.errors++; } } } |