Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions include/LuaAPI.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@ namespace MP {
std::tuple<int, int, int> GetServerVersion();
std::pair<bool, std::string> TriggerClientEvent(int PlayerID, const std::string& EventName, const sol::object& Data);
std::pair<bool, std::string> TriggerClientEventJson(int PlayerID, const std::string& EventName, const sol::table& Data);
std::pair<bool, std::string> TriggerClientEventUnreliable(int PlayerID, const std::string& EventName, const sol::object& Data);
std::pair<bool, std::string> TriggerClientEventJsonUnreliable(int PlayerID, const std::string& EventName, const sol::table& Data);
inline size_t GetPlayerCount() { return Engine->Server().ClientCount(); }
std::pair<bool, std::string> DropPlayer(int ID, std::optional<std::string> MaybeReason);
std::pair<bool, std::string> SendChatMessage(int ID, const std::string& Message, const bool& LogChat = true);
Expand Down
21 changes: 15 additions & 6 deletions src/LuaAPI.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -136,10 +136,10 @@ TEST_CASE("LuaAPI::MP::GetServerVersion") {
CHECK(pa == real.patch);
}

static inline std::pair<bool, std::string> InternalTriggerClientEvent(int PlayerID, const std::string& EventName, const std::string& Data) {
std::string Packet = "E:" + EventName + ":" + Data;
static inline std::pair<bool, std::string> InternalTriggerClientEvent(int PlayerID, const std::string& EventName, const std::string& Data, bool Rel) {
std::string Packet = std::string(Rel ? "E:" : "e:") + EventName + ":" + Data;
if (PlayerID == -1) {
LuaAPI::MP::Engine->Network().SendToAll(nullptr, StringToVector(Packet), true, true);
LuaAPI::MP::Engine->Network().SendToAll(nullptr, StringToVector(Packet), true, Rel);
return { true, "" };
} else {
auto MaybeClient = GetClient(LuaAPI::MP::Engine->Server(), PlayerID);
Expand All @@ -149,7 +149,7 @@ static inline std::pair<bool, std::string> InternalTriggerClientEvent(int Player
return { false, "Player hasn't joined yet" };
}

if (!LuaAPI::MP::Engine->Network().Respond(*c, StringToVector(Packet), true)) {
if (!LuaAPI::MP::Engine->Network().Respond(*c, StringToVector(Packet), Rel)) {
beammp_lua_errorf("Respond failed, dropping client {}", PlayerID);
LuaAPI::MP::Engine->Network().ClientKick(*c, "Disconnected after failing to receive packets");
return { false, "Respond failed, dropping client" };
Expand All @@ -165,7 +165,12 @@ static inline std::pair<bool, std::string> InternalTriggerClientEvent(int Player

std::pair<bool, std::string> LuaAPI::MP::TriggerClientEvent(int PlayerID, const std::string& EventName, const sol::object& DataObj) {
std::string Data = DataObj.as<std::string>();
return InternalTriggerClientEvent(PlayerID, EventName, Data);
return InternalTriggerClientEvent(PlayerID, EventName, Data, true);
}

std::pair<bool, std::string> LuaAPI::MP::TriggerClientEventUnreliable(int PlayerID, const std::string& EventName, const sol::object& DataObj) {
std::string Data = DataObj.as<std::string>();
return InternalTriggerClientEvent(PlayerID, EventName, Data, false);
}

std::pair<bool, std::string> LuaAPI::MP::DropPlayer(int ID, std::optional<std::string> MaybeReason) {
Expand Down Expand Up @@ -865,5 +870,9 @@ std::string LuaAPI::MP::JsonUnflatten(const std::string& json) {
}

std::pair<bool, std::string> LuaAPI::MP::TriggerClientEventJson(int PlayerID, const std::string& EventName, const sol::table& Data) {
return InternalTriggerClientEvent(PlayerID, EventName, JsonEncode(Data));
return InternalTriggerClientEvent(PlayerID, EventName, JsonEncode(Data), true);
}

std::pair<bool, std::string> LuaAPI::MP::TriggerClientEventJsonUnreliable(int PlayerID, const std::string& EventName, const sol::table& Data) {
return InternalTriggerClientEvent(PlayerID, EventName, JsonEncode(Data), false);
}
2 changes: 2 additions & 0 deletions src/TLuaEngine.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -922,6 +922,8 @@ TLuaEngine::StateThreadData::StateThreadData(const std::string& Name, TLuaStateI
});
MPTable.set_function("TriggerClientEvent", &LuaAPI::MP::TriggerClientEvent);
MPTable.set_function("TriggerClientEventJson", &LuaAPI::MP::TriggerClientEventJson);
MPTable.set_function("TriggerClientEventUnreliable", &LuaAPI::MP::TriggerClientEventUnreliable);
MPTable.set_function("TriggerClientEventJsonUnreliable", &LuaAPI::MP::TriggerClientEventJsonUnreliable);
MPTable.set_function("GetPlayerCount", &LuaAPI::MP::GetPlayerCount);
MPTable.set_function("IsPlayerConnected", &LuaAPI::MP::IsPlayerConnected);
MPTable.set_function("GetPlayerIDByName", [&](const std::string& Name) -> int {
Expand Down
3 changes: 3 additions & 0 deletions src/TServer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -286,6 +286,9 @@ void TServer::GlobalParser(const std::weak_ptr<TClient>& Client, std::vector<uin
beammp_debugf("Received 'E' packet over UDP from client '{}' ({}), ignoring it", LockedClient->GetName(), LockedClient->GetID());
return;
}
// 'E' (reliable) and 'e' (unreliable) both route through HandleEvent
[[fallthrough]];
case 'e':
HandleEvent(*LockedClient, StringPacket);
return;
case 'N':
Expand Down