Skip to content

Commit 07013d2

Browse files
authored
More changes for #3251 (#3253)
1 parent 86846f1 commit 07013d2

File tree

2 files changed

+80
-50
lines changed

2 files changed

+80
-50
lines changed

Server/mods/deathmatch/logic/CGame.cpp

Lines changed: 73 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -71,12 +71,12 @@
7171
#include "net/SimHeaders.h"
7272
#include <signal.h>
7373

74-
#define MAX_BULLETSYNC_DISTANCE 400.0f
75-
#define MAX_EXPLOSION_SYNC_DISTANCE 400.0f
74+
#define MAX_BULLETSYNC_DISTANCE 400.0f
75+
#define MAX_EXPLOSION_SYNC_DISTANCE 400.0f
7676
#define MAX_PROJECTILE_SYNC_DISTANCE 400.0f
7777

78-
#define RELEASE_MIN_CLIENT_VERSION "1.6.0-0.00000"
79-
#define FIREBALLDESTRUCT_MIN_CLIENT_VERSION "1.6.0-9.22199"
78+
#define RELEASE_MIN_CLIENT_VERSION "1.6.0-0.00000"
79+
#define FIREBALLDESTRUCT_MIN_CLIENT_VERSION "1.6.0-9.22199"
8080

8181
#ifndef WIN32
8282
#include <limits.h>
@@ -403,14 +403,14 @@ CGame::~CGame()
403403
// Clear our global pointer
404404
g_pGame = NULL;
405405

406-
// Remove our console control handler
407-
#ifdef WIN32
406+
// Remove our console control handler
407+
#ifdef WIN32
408408
SetConsoleCtrlHandler(ConsoleEventHandler, FALSE);
409-
#else
409+
#else
410410
signal(SIGTERM, SIG_DFL);
411411
signal(SIGINT, SIG_DFL);
412412
signal(SIGPIPE, SIG_DFL);
413-
#endif
413+
#endif
414414
}
415415

416416
void CGame::GetTag(char* szInfoTag, int iInfoTag)
@@ -528,8 +528,7 @@ void CGame::DoPulse()
528528
// Process our resource stop/restart queue
529529
CLOCK_CALL1(m_pResourceManager->ProcessQueue(););
530530

531-
if (GetTickCount64_() + m_iClientTriggeredEventsIntervalMs > m_lClientTriggeredEventsLastCheck)
532-
ProcessClientTriggeredEventSpam();
531+
ProcessClientTriggeredEventSpam();
533532

534533
// Delete all items requested
535534
CLOCK_CALL1(m_ElementDeleter.DoDeleteAll(););
@@ -657,9 +656,9 @@ bool CGame::Start(int iArgumentCount, char* szArguments[])
657656
// Encrypt crash dumps for uploading
658657
HandleCrashDumpEncryption();
659658

660-
// Check Windows server is using correctly compiled Lua dll
661-
#ifndef MTA_DEBUG
662-
#ifdef WIN32
659+
// Check Windows server is using correctly compiled Lua dll
660+
#ifndef MTA_DEBUG
661+
#ifdef WIN32
663662
HMODULE hModule = LoadLibrary("lua5.1.dll");
664663
// Release server should not have this function
665664
PVOID pFunc = static_cast<PVOID>(GetProcAddress(hModule, "luaX_is_apicheck_enabled"));
@@ -669,8 +668,8 @@ bool CGame::Start(int iArgumentCount, char* szArguments[])
669668
CLogger::ErrorPrintf("Problem with Lua dll\n");
670669
return false;
671670
}
672-
#endif
673671
#endif
672+
#endif
674673

675674
// Read some settings
676675
m_pACLManager->SetFileName(m_pMainConfig->GetAccessControlListFile().c_str());
@@ -880,16 +879,16 @@ bool CGame::Start(int iArgumentCount, char* szArguments[])
880879

881880
m_pPlayerManager->SetScriptDebugging(m_pScriptDebugging);
882881

883-
// Set our console control handler
884-
#ifdef WIN32
882+
// Set our console control handler
883+
#ifdef WIN32
885884
SetConsoleCtrlHandler(ConsoleEventHandler, TRUE);
886-
// Hide the close box
887-
// DeleteMenu ( GetSystemMenu ( GetConsoleWindow(), FALSE ), SC_CLOSE, MF_BYCOMMAND );
888-
#else
885+
// Hide the close box
886+
// DeleteMenu ( GetSystemMenu ( GetConsoleWindow(), FALSE ), SC_CLOSE, MF_BYCOMMAND );
887+
#else
889888
signal(SIGTERM, &sighandler);
890889
signal(SIGINT, &sighandler);
891890
signal(SIGPIPE, SIG_IGN);
892-
#endif
891+
#endif
893892

894893
// Add our builtin events
895894
AddBuiltInEvents();
@@ -1309,10 +1308,11 @@ void CGame::JoinPlayer(CPlayer& Player)
13091308
marker.Set("Start");
13101309

13111310
// Let him join
1312-
Player.Send(CPlayerJoinCompletePacket(
1313-
Player.GetID(), m_pMapManager->GetRootElement()->GetID(), m_pMainConfig->GetHTTPDownloadType(), m_pMainConfig->GetHTTPPort(),
1314-
m_pMainConfig->GetHTTPDownloadURL().c_str(), m_pMainConfig->GetHTTPMaxConnectionsPerClient(), m_pMainConfig->GetEnableClientChecks(),
1315-
m_pMainConfig->IsVoiceEnabled(), m_pMainConfig->GetVoiceSampleRate(), m_pMainConfig->GetVoiceQuality(), m_pMainConfig->GetVoiceBitrate(), m_pMainConfig->GetServerName().c_str()));
1311+
Player.Send(CPlayerJoinCompletePacket(Player.GetID(), m_pMapManager->GetRootElement()->GetID(), m_pMainConfig->GetHTTPDownloadType(),
1312+
m_pMainConfig->GetHTTPPort(), m_pMainConfig->GetHTTPDownloadURL().c_str(),
1313+
m_pMainConfig->GetHTTPMaxConnectionsPerClient(), m_pMainConfig->GetEnableClientChecks(),
1314+
m_pMainConfig->IsVoiceEnabled(), m_pMainConfig->GetVoiceSampleRate(), m_pMainConfig->GetVoiceQuality(),
1315+
m_pMainConfig->GetVoiceBitrate(), m_pMainConfig->GetServerName().c_str()));
13161316

13171317
marker.Set("CPlayerJoinCompletePacket");
13181318

@@ -1753,13 +1753,13 @@ void CGame::Packet_PlayerJoinData(CPlayerJoinDataPacket& Packet)
17531753
strExtra = SStringX(strExtraTemp);
17541754
strPlayerVersion = SStringX(strPlayerVersionTemp);
17551755
}
1756-
#if MTASA_VERSION_TYPE < VERSION_TYPE_UNSTABLE
1756+
#if MTASA_VERSION_TYPE < VERSION_TYPE_UNSTABLE
17571757
if (atoi(ExtractVersionStringBuildNumber(Packet.GetPlayerVersion())) != 0)
17581758
{
17591759
// Use player version from packet if it contains a valid build number
17601760
strPlayerVersion = Packet.GetPlayerVersion();
17611761
}
1762-
#endif
1762+
#endif
17631763

17641764
SString strIP = pPlayer->GetSourceIP();
17651765
SString strIPAndSerial("IP: %s Serial: %s Version: %s", strIP.c_str(), strSerial.c_str(), strPlayerVersion.c_str());
@@ -1897,7 +1897,7 @@ void CGame::Packet_PlayerJoinData(CPlayerJoinDataPacket& Packet)
18971897
return;
18981898
}
18991899

1900-
#if MTASA_VERSION_TYPE > VERSION_TYPE_UNSTABLE
1900+
#if MTASA_VERSION_TYPE > VERSION_TYPE_UNSTABLE
19011901
if (Packet.GetPlayerVersion().length() > 0 && Packet.GetPlayerVersion() != pPlayer->GetPlayerVersion())
19021902
{
19031903
// Tell the console
@@ -1907,7 +1907,7 @@ void CGame::Packet_PlayerJoinData(CPlayerJoinDataPacket& Packet)
19071907
DisconnectPlayer(this, *pPlayer, CPlayerDisconnectedPacket::VERSION_MISMATCH);
19081908
return;
19091909
}
1910-
#endif
1910+
#endif
19111911

19121912
PlayerCompleteConnect(pPlayer);
19131913
}
@@ -2791,23 +2791,23 @@ void CGame::Packet_ProjectileSync(CProjectileSyncPacket& Packet)
27912791
}
27922792

27932793
CLuaArguments arguments;
2794-
arguments.PushNumber(Packet.m_ucWeaponType); // "weaponType"
2795-
arguments.PushNumber(vecPosition.fX); // "posX"
2796-
arguments.PushNumber(vecPosition.fY); // "posY"
2797-
arguments.PushNumber(vecPosition.fZ); // "posZ"
2798-
arguments.PushNumber(Packet.m_fForce); // "force"
2794+
arguments.PushNumber(Packet.m_ucWeaponType); // "weaponType"
2795+
arguments.PushNumber(vecPosition.fX); // "posX"
2796+
arguments.PushNumber(vecPosition.fY); // "posY"
2797+
arguments.PushNumber(vecPosition.fZ); // "posZ"
2798+
arguments.PushNumber(Packet.m_fForce); // "force"
27992799

28002800
CElement* pTarget = nullptr;
28012801
if (Packet.m_bHasTarget && Packet.m_TargetID != INVALID_ELEMENT_ID)
28022802
pTarget = CElementIDs::GetElement(Packet.m_TargetID);
28032803

2804-
arguments.PushElement(pTarget); // "target"
2805-
arguments.PushNumber(Packet.m_vecRotation.fX); // "rotX"
2806-
arguments.PushNumber(Packet.m_vecRotation.fY); // "rotY"
2807-
arguments.PushNumber(Packet.m_vecRotation.fZ); // "rotZ"
2808-
arguments.PushNumber(Packet.m_vecMoveSpeed.fX); // "velX"
2809-
arguments.PushNumber(Packet.m_vecMoveSpeed.fY); // "velY"
2810-
arguments.PushNumber(Packet.m_vecMoveSpeed.fZ); // "velZ"
2804+
arguments.PushElement(pTarget); // "target"
2805+
arguments.PushNumber(Packet.m_vecRotation.fX); // "rotX"
2806+
arguments.PushNumber(Packet.m_vecRotation.fY); // "rotY"
2807+
arguments.PushNumber(Packet.m_vecRotation.fZ); // "rotZ"
2808+
arguments.PushNumber(Packet.m_vecMoveSpeed.fX); // "velX"
2809+
arguments.PushNumber(Packet.m_vecMoveSpeed.fY); // "velY"
2810+
arguments.PushNumber(Packet.m_vecMoveSpeed.fZ); // "velZ"
28112811

28122812
// Trigger Lua event and see if we are allowed to continue
28132813
if (!pPlayer->CallEvent("onPlayerProjectileCreation", arguments))
@@ -4511,7 +4511,7 @@ void CGame::SendPacketBatchEnd()
45114511
bool CGame::IsBulletSyncActive()
45124512
{
45134513
bool bConfigSaysEnable = m_pMainConfig->GetBulletSyncEnabled();
4514-
#if 0 // No auto bullet sync as there are some problems with it
4514+
#if 0 // No auto bullet sync as there are some problems with it
45154515
bool bGlitchesSayEnable = ( m_Glitches [ GLITCH_FASTFIRE ] || m_Glitches [ GLITCH_CROUCHBUG ] );
45164516
#else
45174517
bool bGlitchesSayEnable = false;
@@ -4711,17 +4711,42 @@ void CGame::RegisterClientTriggeredEventUsage(CPlayer* pPlayer)
47114711
if (!pPlayer || !pPlayer->IsPlayer() || pPlayer->IsBeingDeleted())
47124712
return;
47134713

4714-
m_mapClientTriggeredEvents[pPlayer]++;
4714+
auto now = GetTickCount64_();
4715+
4716+
// If key/player doesn't exist in map, store time of entry
4717+
if (m_mapClientTriggeredEvents.find(pPlayer) == m_mapClientTriggeredEvents.end())
4718+
m_mapClientTriggeredEvents[pPlayer].m_llTicks = now;
4719+
4720+
// Only increment if we haven't reached the interval time already
4721+
if (now - m_mapClientTriggeredEvents[pPlayer].m_llTicks <= m_iClientTriggeredEventsIntervalMs)
4722+
m_mapClientTriggeredEvents[pPlayer].m_uiCounter++;
47154723
}
47164724

47174725
void CGame::ProcessClientTriggeredEventSpam()
47184726
{
4719-
for (const auto& [player, count]: m_mapClientTriggeredEvents)
4727+
for (auto it = m_mapClientTriggeredEvents.begin(); it != m_mapClientTriggeredEvents.end();)
47204728
{
4721-
if (player && player->IsPlayer() && !player->IsBeingDeleted() && count > m_iMaxClientTriggeredEventsPerInterval)
4722-
player->CallEvent("onPlayerTriggerEventThreshold", {});
4723-
}
4729+
const auto& [player, data] = *it;
4730+
bool remove = false;
47244731

4725-
m_mapClientTriggeredEvents.clear();
4726-
m_lClientTriggeredEventsLastCheck = GetTickCount64_();
4732+
if (player && player->IsPlayer() && !player->IsBeingDeleted())
4733+
{
4734+
if (GetTickCount64_() - data.m_llTicks >= m_iClientTriggeredEventsIntervalMs)
4735+
{
4736+
if (data.m_uiCounter > m_iMaxClientTriggeredEventsPerInterval)
4737+
player->CallEvent("onPlayerTriggerEventThreshold", {});
4738+
4739+
remove = true;
4740+
}
4741+
}
4742+
else
4743+
{
4744+
remove = true;
4745+
}
4746+
4747+
if (remove)
4748+
it = m_mapClientTriggeredEvents.erase(it);
4749+
else
4750+
it++;
4751+
}
47274752
}

Server/mods/deathmatch/logic/CGame.h

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -665,7 +665,12 @@ class CGame
665665

666666
int m_iMaxClientTriggeredEventsPerInterval = 100;
667667
int m_iClientTriggeredEventsIntervalMs = 1000;
668-
long long m_lClientTriggeredEventsLastCheck = 0;
669668

670-
std::map<CPlayer*, int> m_mapClientTriggeredEvents;
669+
struct ClientTriggeredEventsInfo
670+
{
671+
long long m_llTicks = 0;
672+
uint32_t m_uiCounter = 0;
673+
};
674+
675+
std::map<CPlayer*, ClientTriggeredEventsInfo> m_mapClientTriggeredEvents;
671676
};

0 commit comments

Comments
 (0)