diff --git a/Server/mods/deathmatch/logic/CGame.cpp b/Server/mods/deathmatch/logic/CGame.cpp index 16e7b7312bd..6b114ed01f0 100644 --- a/Server/mods/deathmatch/logic/CGame.cpp +++ b/Server/mods/deathmatch/logic/CGame.cpp @@ -1641,7 +1641,7 @@ void CGame::AddBuiltInEvents() m_Events.AddEvent("onPlayerResourceStart", "resource", NULL, false); m_Events.AddEvent("onPlayerProjectileCreation", "weaponType, posX, posY, posZ, force, target, rotX, rotY, rotZ, velX, velY, velZ", nullptr, false); m_Events.AddEvent("onPlayerDetonateSatchels", "", nullptr, false); - m_Events.AddEvent("onPlayerTriggerEventThreshold", "", nullptr, false); + m_Events.AddEvent("onPlayerTriggerEventThreshold", "eventName", nullptr, false); m_Events.AddEvent("onPlayerTeamChange", "oldTeam, newTeam", nullptr, false); m_Events.AddEvent("onPlayerTriggerInvalidEvent", "eventName, isAdded, isRemote", nullptr, false); m_Events.AddEvent("onPlayerChangesProtectedData", "element, key, value", nullptr, false); @@ -2680,7 +2680,7 @@ void CGame::Packet_LuaEvent(CLuaEventPacket& Packet) m_pScriptDebugging->LogError(NULL, "Client (%s) triggered serverside event %s, but event is not added serverside", pCaller->GetNick(), szName); } - RegisterClientTriggeredEventUsage(pCaller); + RegisterClientTriggeredEventUsage(pCaller, szName); } } @@ -4982,7 +4982,7 @@ void CGame::HandleCrashDumpEncryption() #endif } -void CGame::RegisterClientTriggeredEventUsage(CPlayer* pPlayer) +void CGame::RegisterClientTriggeredEventUsage(CPlayer* pPlayer, const char* szEventName) { if (!pPlayer || !pPlayer->IsPlayer() || pPlayer->IsBeingDeleted()) return; @@ -4994,8 +4994,13 @@ void CGame::RegisterClientTriggeredEventUsage(CPlayer* pPlayer) m_mapClientTriggeredEvents[pPlayer].m_llTicks = now; // Only increment if we haven't reached the interval time already - if (now - m_mapClientTriggeredEvents[pPlayer].m_llTicks <= m_iClientTriggeredEventsIntervalMs) - m_mapClientTriggeredEvents[pPlayer].m_uiCounter++; + ClientTriggeredEventsInfo& info = m_mapClientTriggeredEvents[pPlayer]; + + if (now - info.m_llTicks <= m_iClientTriggeredEventsIntervalMs) + info.m_uiCounter++; + + if (szEventName) + info.m_strLastEventName = szEventName; } void CGame::ProcessClientTriggeredEventSpam() @@ -5010,7 +5015,11 @@ void CGame::ProcessClientTriggeredEventSpam() if (GetTickCount64_() - data.m_llTicks >= m_iClientTriggeredEventsIntervalMs) { if (data.m_uiCounter > m_iMaxClientTriggeredEventsPerInterval) - player->CallEvent("onPlayerTriggerEventThreshold", {}); + { + CLuaArguments args; + args.PushString(data.m_strLastEventName); + player->CallEvent("onPlayerTriggerEventThreshold", args); + } remove = true; } diff --git a/Server/mods/deathmatch/logic/CGame.h b/Server/mods/deathmatch/logic/CGame.h index bffd2970e37..8a84594f892 100644 --- a/Server/mods/deathmatch/logic/CGame.h +++ b/Server/mods/deathmatch/logic/CGame.h @@ -526,7 +526,7 @@ class CGame static void PlayerCompleteConnect(CPlayer* pPlayer); void ProcessClientTriggeredEventSpam(); - void RegisterClientTriggeredEventUsage(CPlayer* pPlayer); + void RegisterClientTriggeredEventUsage(CPlayer* pPlayer, const char* szEventName); // Technically, this could be put somewhere else. It's a callback function // which the voice server library will call to send out data. @@ -687,6 +687,7 @@ class CGame { long long m_llTicks = 0; uint32_t m_uiCounter = 0; + std::string m_strLastEventName; }; std::map m_mapClientTriggeredEvents;