diff --git a/include/LuaAPI.h b/include/LuaAPI.h index 74286fd..4871a0b 100644 --- a/include/LuaAPI.h +++ b/include/LuaAPI.h @@ -12,7 +12,8 @@ namespace MP { std::string GetOSName(); std::tuple GetServerVersion(); - bool TriggerClientEvent(int PlayerID, const std::string& EventName, const std::string& Data); + bool TriggerClientEvent(int PlayerID, const std::string& EventName, const sol::object& Data); + bool TriggerClientEventJson(int PlayerID, const std::string& EventName, const sol::table& Data); inline size_t GetPlayerCount() { return Engine->Server().ClientCount(); } void DropPlayer(int ID, std::optional MaybeReason); void SendChatMessage(int ID, const std::string& Message); diff --git a/src/LuaAPI.cpp b/src/LuaAPI.cpp index faa0739..33488aa 100644 --- a/src/LuaAPI.cpp +++ b/src/LuaAPI.cpp @@ -102,18 +102,18 @@ void LuaAPI::Print(sol::variadic_args Args) { luaprint(ToPrint); } -bool LuaAPI::MP::TriggerClientEvent(int PlayerID, const std::string& EventName, const std::string& Data) { +static inline bool InternalTriggerClientEvent(int PlayerID, const std::string& EventName, const std::string& Data) { std::string Packet = "E:" + EventName + ":" + Data; if (PlayerID == -1) - Engine->Network().SendToAll(nullptr, Packet, true, true); + LuaAPI::MP::Engine->Network().SendToAll(nullptr, Packet, true, true); else { - auto MaybeClient = GetClient(Engine->Server(), PlayerID); + auto MaybeClient = GetClient(LuaAPI::MP::Engine->Server(), PlayerID); if (!MaybeClient || MaybeClient.value().expired()) { beammp_lua_error("TriggerClientEvent invalid Player ID"); return false; } auto c = MaybeClient.value().lock(); - if (!Engine->Network().Respond(*c, Packet, true)) { + if (!LuaAPI::MP::Engine->Network().Respond(*c, Packet, true)) { beammp_lua_error("Respond failed"); return false; } @@ -121,6 +121,11 @@ bool LuaAPI::MP::TriggerClientEvent(int PlayerID, const std::string& EventName, return true; } +bool LuaAPI::MP::TriggerClientEvent(int PlayerID, const std::string& EventName, const sol::object& DataObj) { + std::string Data = DataObj.as(); + return InternalTriggerClientEvent(PlayerID, EventName, Data); +} + void LuaAPI::MP::DropPlayer(int ID, std::optional MaybeReason) { auto MaybeClient = GetClient(Engine->Server(), ID); if (!MaybeClient || MaybeClient.value().expired()) { @@ -492,3 +497,7 @@ std::string LuaAPI::MP::JsonUnflatten(const std::string& json) { } return nlohmann::json::parse(json).unflatten().dump(-1); } + +bool LuaAPI::MP::TriggerClientEventJson(int PlayerID, const std::string& EventName, const sol::table& Data) { + return InternalTriggerClientEvent(PlayerID, EventName, JsonEncode(Data)); +} diff --git a/src/TConsole.cpp b/src/TConsole.cpp index 1682a3a..42e9bc4 100644 --- a/src/TConsole.cpp +++ b/src/TConsole.cpp @@ -548,7 +548,7 @@ TConsole::TConsole() { std::this_thread::yield(); // TODO: Add a timeout } if (Future->Error) { - beammp_lua_error(Future->ErrorMessage); + beammp_lua_error("error in " + mStateId + ": " + Future->ErrorMessage); } } } else { diff --git a/src/TLuaEngine.cpp b/src/TLuaEngine.cpp index f17a34f..274a032 100644 --- a/src/TLuaEngine.cpp +++ b/src/TLuaEngine.cpp @@ -385,7 +385,7 @@ sol::table TLuaEngine::StateThreadData::Lua_TriggerLocalEvent(const std::string& Result.add(FnRet); } else { sol::error Err = FnRet; - beammp_lua_error(Err.what()); + beammp_lua_error(std::string("TriggerLocalEvent: ") + Err.what()); } } } @@ -637,6 +637,7 @@ TLuaEngine::StateThreadData::StateThreadData(const std::string& Name, std::atomi return Lua_TriggerLocalEvent(EventName, EventArgs); }); MPTable.set_function("TriggerClientEvent", &LuaAPI::MP::TriggerClientEvent); + MPTable.set_function("TriggerClientEventJson", &LuaAPI::MP::TriggerClientEventJson); MPTable.set_function("GetPlayerCount", &LuaAPI::MP::GetPlayerCount); MPTable.set_function("IsPlayerConnected", &LuaAPI::MP::IsPlayerConnected); MPTable.set_function("GetPlayerIDByName", [&](const std::string& Name) -> int {