From 3ade7f5743b2063dfb3bdc4c17ad40c7e6a2e91f Mon Sep 17 00:00:00 2001 From: Tixx <83774803+WiserTixx@users.noreply.github.com> Date: Sat, 28 Sep 2024 13:35:25 +0200 Subject: [PATCH] Add MP.SendNotification --- include/LuaAPI.h | 1 + src/LuaAPI.cpp | 31 +++++++++++++++++++++++++++++++ src/TLuaEngine.cpp | 9 +++++++++ 3 files changed, 41 insertions(+) diff --git a/include/LuaAPI.h b/include/LuaAPI.h index 49819db..eb6fab8 100644 --- a/include/LuaAPI.h +++ b/include/LuaAPI.h @@ -35,6 +35,7 @@ namespace MP { inline size_t GetPlayerCount() { return Engine->Server().ClientCount(); } std::pair DropPlayer(int ID, std::optional MaybeReason); std::pair SendChatMessage(int ID, const std::string& Message); + std::pair SendNotification(int ID, const std::string& Message, const std::string& Icon, const std::string& Category); std::pair RemoveVehicle(int PlayerID, int VehicleID); void Set(int ConfigID, sol::object NewValue); bool IsPlayerGuest(int ID); diff --git a/src/LuaAPI.cpp b/src/LuaAPI.cpp index bc8c94f..c378e83 100644 --- a/src/LuaAPI.cpp +++ b/src/LuaAPI.cpp @@ -205,6 +205,37 @@ std::pair LuaAPI::MP::SendChatMessage(int ID, const std::stri return Result; } +std::pair LuaAPI::MP::SendNotification(int ID, const std::string& Message, const std::string& Icon, const std::string& Category) { + std::pair Result; + std::string Packet = "N" + Category + ":" + Icon + ":" + Message; + if (ID == -1) { + Engine->Network().SendToAll(nullptr, StringToVector(Packet), true, true); + Result.first = true; + } else { + auto MaybeClient = GetClient(Engine->Server(), ID); + if (MaybeClient) { + auto c = MaybeClient.value().lock(); + if (!c->IsSynced()) { + Result.first = false; + Result.second = "Player still syncing data"; + return Result; + } + if (!Engine->Network().Respond(*c, StringToVector(Packet), true)) { + beammp_errorf("Failed to send notification back to sender (id {}) - did the sender disconnect?", ID); + Result.first = false; + Result.second = "Failed to send packet"; + } + Result.first = true; + } else { + beammp_lua_error("SendNotification invalid argument [1] invalid ID"); + Result.first = false; + Result.second = "Invalid Player ID"; + } + return Result; + } + return Result; +} + std::pair LuaAPI::MP::RemoveVehicle(int PID, int VID) { std::pair Result; auto MaybeClient = GetClient(Engine->Server(), PID); diff --git a/src/TLuaEngine.cpp b/src/TLuaEngine.cpp index 9810c99..ed048c3 100644 --- a/src/TLuaEngine.cpp +++ b/src/TLuaEngine.cpp @@ -869,6 +869,15 @@ TLuaEngine::StateThreadData::StateThreadData(const std::string& Name, TLuaStateI return Lua_GetPositionRaw(PID, VID); }); MPTable.set_function("SendChatMessage", &LuaAPI::MP::SendChatMessage); + MPTable.set_function("SendNotification", [&](sol::variadic_args Args) { + if (Args.size() == 3) { + LuaAPI::MP::SendNotification(Args.get(0), Args.get(1), Args.get(2), Args.get(1)); + } else if (Args.size() == 4) { + LuaAPI::MP::SendNotification(Args.get(0), Args.get(1), Args.get(2), Args.get(3)); + } else { + beammp_lua_error("SendNotification expects 2 or 3 arguments."); + } + }); MPTable.set_function("GetPlayers", [&]() -> sol::table { return Lua_GetPlayers(); });