71
71
#include " net/SimHeaders.h"
72
72
#include < signal.h>
73
73
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
76
76
#define MAX_PROJECTILE_SYNC_DISTANCE 400 .0f
77
77
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"
80
80
81
81
#ifndef WIN32
82
82
#include < limits.h>
@@ -403,14 +403,14 @@ CGame::~CGame()
403
403
// Clear our global pointer
404
404
g_pGame = NULL ;
405
405
406
- // Remove our console control handler
407
- #ifdef WIN32
406
+ // Remove our console control handler
407
+ #ifdef WIN32
408
408
SetConsoleCtrlHandler (ConsoleEventHandler, FALSE );
409
- #else
409
+ #else
410
410
signal (SIGTERM, SIG_DFL);
411
411
signal (SIGINT, SIG_DFL);
412
412
signal (SIGPIPE, SIG_DFL);
413
- #endif
413
+ #endif
414
414
}
415
415
416
416
void CGame::GetTag (char * szInfoTag, int iInfoTag)
@@ -528,8 +528,7 @@ void CGame::DoPulse()
528
528
// Process our resource stop/restart queue
529
529
CLOCK_CALL1 (m_pResourceManager->ProcessQueue (););
530
530
531
- if (GetTickCount64_ () + m_iClientTriggeredEventsIntervalMs > m_lClientTriggeredEventsLastCheck)
532
- ProcessClientTriggeredEventSpam ();
531
+ ProcessClientTriggeredEventSpam ();
533
532
534
533
// Delete all items requested
535
534
CLOCK_CALL1 (m_ElementDeleter.DoDeleteAll (););
@@ -657,9 +656,9 @@ bool CGame::Start(int iArgumentCount, char* szArguments[])
657
656
// Encrypt crash dumps for uploading
658
657
HandleCrashDumpEncryption ();
659
658
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
663
662
HMODULE hModule = LoadLibrary (" lua5.1.dll" );
664
663
// Release server should not have this function
665
664
PVOID pFunc = static_cast <PVOID>(GetProcAddress (hModule, " luaX_is_apicheck_enabled" ));
@@ -669,8 +668,8 @@ bool CGame::Start(int iArgumentCount, char* szArguments[])
669
668
CLogger::ErrorPrintf (" Problem with Lua dll\n " );
670
669
return false ;
671
670
}
672
- #endif
673
671
#endif
672
+ #endif
674
673
675
674
// Read some settings
676
675
m_pACLManager->SetFileName (m_pMainConfig->GetAccessControlListFile ().c_str ());
@@ -880,16 +879,16 @@ bool CGame::Start(int iArgumentCount, char* szArguments[])
880
879
881
880
m_pPlayerManager->SetScriptDebugging (m_pScriptDebugging);
882
881
883
- // Set our console control handler
884
- #ifdef WIN32
882
+ // Set our console control handler
883
+ #ifdef WIN32
885
884
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
889
888
signal (SIGTERM, &sighandler);
890
889
signal (SIGINT, &sighandler);
891
890
signal (SIGPIPE, SIG_IGN);
892
- #endif
891
+ #endif
893
892
894
893
// Add our builtin events
895
894
AddBuiltInEvents ();
@@ -1309,10 +1308,11 @@ void CGame::JoinPlayer(CPlayer& Player)
1309
1308
marker.Set (" Start" );
1310
1309
1311
1310
// 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 ()));
1316
1316
1317
1317
marker.Set (" CPlayerJoinCompletePacket" );
1318
1318
@@ -1753,13 +1753,13 @@ void CGame::Packet_PlayerJoinData(CPlayerJoinDataPacket& Packet)
1753
1753
strExtra = SStringX (strExtraTemp);
1754
1754
strPlayerVersion = SStringX (strPlayerVersionTemp);
1755
1755
}
1756
- #if MTASA_VERSION_TYPE < VERSION_TYPE_UNSTABLE
1756
+ #if MTASA_VERSION_TYPE < VERSION_TYPE_UNSTABLE
1757
1757
if (atoi (ExtractVersionStringBuildNumber (Packet.GetPlayerVersion ())) != 0 )
1758
1758
{
1759
1759
// Use player version from packet if it contains a valid build number
1760
1760
strPlayerVersion = Packet.GetPlayerVersion ();
1761
1761
}
1762
- #endif
1762
+ #endif
1763
1763
1764
1764
SString strIP = pPlayer->GetSourceIP ();
1765
1765
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)
1897
1897
return ;
1898
1898
}
1899
1899
1900
- #if MTASA_VERSION_TYPE > VERSION_TYPE_UNSTABLE
1900
+ #if MTASA_VERSION_TYPE > VERSION_TYPE_UNSTABLE
1901
1901
if (Packet.GetPlayerVersion ().length () > 0 && Packet.GetPlayerVersion () != pPlayer->GetPlayerVersion ())
1902
1902
{
1903
1903
// Tell the console
@@ -1907,7 +1907,7 @@ void CGame::Packet_PlayerJoinData(CPlayerJoinDataPacket& Packet)
1907
1907
DisconnectPlayer (this , *pPlayer, CPlayerDisconnectedPacket::VERSION_MISMATCH);
1908
1908
return ;
1909
1909
}
1910
- #endif
1910
+ #endif
1911
1911
1912
1912
PlayerCompleteConnect (pPlayer);
1913
1913
}
@@ -2791,23 +2791,23 @@ void CGame::Packet_ProjectileSync(CProjectileSyncPacket& Packet)
2791
2791
}
2792
2792
2793
2793
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"
2799
2799
2800
2800
CElement* pTarget = nullptr ;
2801
2801
if (Packet.m_bHasTarget && Packet.m_TargetID != INVALID_ELEMENT_ID)
2802
2802
pTarget = CElementIDs::GetElement (Packet.m_TargetID );
2803
2803
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"
2811
2811
2812
2812
// Trigger Lua event and see if we are allowed to continue
2813
2813
if (!pPlayer->CallEvent (" onPlayerProjectileCreation" , arguments))
@@ -4511,7 +4511,7 @@ void CGame::SendPacketBatchEnd()
4511
4511
bool CGame::IsBulletSyncActive ()
4512
4512
{
4513
4513
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
4515
4515
bool bGlitchesSayEnable = ( m_Glitches [ GLITCH_FASTFIRE ] || m_Glitches [ GLITCH_CROUCHBUG ] );
4516
4516
#else
4517
4517
bool bGlitchesSayEnable = false ;
@@ -4711,17 +4711,42 @@ void CGame::RegisterClientTriggeredEventUsage(CPlayer* pPlayer)
4711
4711
if (!pPlayer || !pPlayer->IsPlayer () || pPlayer->IsBeingDeleted ())
4712
4712
return ;
4713
4713
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 ++;
4715
4723
}
4716
4724
4717
4725
void CGame::ProcessClientTriggeredEventSpam ()
4718
4726
{
4719
- for (const auto & [player, count]: m_mapClientTriggeredEvents)
4727
+ for (auto it = m_mapClientTriggeredEvents. begin (); it != m_mapClientTriggeredEvents. end (); )
4720
4728
{
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 ;
4724
4731
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
+ }
4727
4752
}
0 commit comments