Skip to content

Commit 146bd15

Browse files
Fix #741: Add new CServerRPCControlPacket to toggle RPCs from server (#1978)
* Move server RPC function enums to Shared * Add new CServerRPCGatePacket and use it to share rpc function state * Move IsServerRPCFunctionEnabled check into CNetAPI::RPC * Rename CServerRPCGatePacket to CServerRPCControlPacket * Remove bitstream bump and check * Remove unused GetAllHandles function * Some small nit cleanup * Use std::array instead * Move duplicate broadcast code under a shared private function * Merge assignment into if statement * Rename Toggle to Disable for clarity * Move SEvent* out from the for loop
1 parent 5c9b50f commit 146bd15

21 files changed

+433
-283
lines changed

Client/mods/deathmatch/StdInc.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
#include <ijsify.h>
4848
#include <Common.h>
4949
#include "net/Packets.h"
50+
#include "net/rpc_enums.h"
5051
#include "Enums.h"
5152
#include "net/SyncStructures.h"
5253
#include "CIdArray.h"

Client/mods/deathmatch/logic/CClientGame.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -440,6 +440,12 @@ class CClientGame
440440

441441
void TriggerDiscordJoin(SString strSecret);
442442

443+
inline const bool IsServerRPCFunctionDisabled(const eServerRPCFunctions eServerRPCFunction) const { return m_disabledServerRPCFunctions[eServerRPCFunction]; };
444+
inline void SetServerRPCFunctionDisabled(const eServerRPCFunctions eServerRPCFunction, const bool bDisabled = true)
445+
{
446+
m_disabledServerRPCFunctions[eServerRPCFunction] = bDisabled;
447+
};
448+
443449
private:
444450
// CGUI Callbacks
445451
bool OnKeyDown(CGUIKeyEventArgs Args);
@@ -824,6 +830,8 @@ class CClientGame
824830
SString m_strACInfo;
825831
std::map<uint, uint> m_SentMessageIds;
826832

833+
std::array<bool, eServerRPCFunctions::NUM_SERVER_RPC_FUNCS> m_disabledServerRPCFunctions;
834+
827835
bool m_bLastKeyWasEscapeCancelled;
828836
std::set<SString> m_AllowKeyUpMap;
829837
uint m_uiPrecisionCallDepth;

Client/mods/deathmatch/logic/CNetAPI.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1993,6 +1993,9 @@ void CNetAPI::WriteCameraSync(NetBitStreamInterface& BitStream)
19931993

19941994
void CNetAPI::RPC(eServerRPCFunctions ID, NetBitStreamInterface* pBitStream)
19951995
{
1996+
if (g_pClientGame->IsServerRPCFunctionDisabled(ID))
1997+
return;
1998+
19961999
NetBitStreamInterface* pRPCBitStream = g_pNet->AllocateNetBitStream();
19972000
if (pRPCBitStream)
19982001
{

Client/mods/deathmatch/logic/CNetAPI.h

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -25,17 +25,6 @@ class CNetAPI;
2525
#define CAM_SYNC_RATE ( g_TickRateSettings.iCamSync )
2626
#define TICK_RATE_AIM ( std::min ( TICK_RATE, g_TickRateSettings.iKeySyncRotation ) ) // Keysync or puresync update the aim, so use the shortest interval
2727

28-
enum eServerRPCFunctions
29-
{
30-
PLAYER_INGAME_NOTICE,
31-
INITIAL_DATA_STREAM,
32-
PLAYER_TARGET,
33-
PLAYER_WEAPON,
34-
KEY_BIND,
35-
CURSOR_EVENT,
36-
REQUEST_STEALTH_KILL,
37-
};
38-
3928
class CNetAPI
4029
{
4130
public:

Client/mods/deathmatch/logic/CPacketHandler.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,10 @@ bool CPacketHandler::ProcessPacket(unsigned char ucPacketID, NetBitStreamInterfa
210210
Packet_ServerInfoSync(bitStream);
211211
return true;
212212

213+
case PACKET_ID_SERVER_RPC_CONTROL:
214+
Packet_ServerRPCControl(bitStream);
215+
return true;
216+
213217
default:
214218
break;
215219
}
@@ -5320,6 +5324,21 @@ void CPacketHandler::Packet_ServerInfoSync(NetBitStreamInterface& bitStream)
53205324
}
53215325
}
53225326

5327+
void CPacketHandler::Packet_ServerRPCControl(NetBitStreamInterface& bitStream)
5328+
{
5329+
unsigned short usNumFunctions;
5330+
if (bitStream.ReadCompressed(usNumFunctions))
5331+
{
5332+
for (unsigned short us = 0; us < usNumFunctions; us++)
5333+
{
5334+
unsigned int uiServerRPCFunction;
5335+
bool bDisabled;
5336+
if (bitStream.Read(uiServerRPCFunction) && bitStream.ReadBit(bDisabled))
5337+
g_pClientGame->SetServerRPCFunctionDisabled(static_cast<eServerRPCFunctions>(uiServerRPCFunction), bDisabled);
5338+
}
5339+
}
5340+
}
5341+
53235342
//
53245343
//
53255344
//

Client/mods/deathmatch/logic/CPacketHandler.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ class CPacketHandler
100100
void Packet_ChatClear(NetBitStreamInterface& bitStream);
101101
void Packet_ServerInfoSync(NetBitStreamInterface& bitStream);
102102
void Packet_PolygonHeight(NetBitStreamInterface& bitStream);
103+
void Packet_ServerRPCControl(NetBitStreamInterface& bitStream);
103104

104105
// For debugging protocol errors during ENTITY_ADD packet
105106
void EntityAddDebugBegin(uint uiNumEntities, NetBitStreamInterface* pBitStream);

Client/mods/deathmatch/logic/rpc/CRPCFunctions.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,8 @@ CBlendedWeather* CRPCFunctions::m_pBlendedWeather;
4949
CClientGame* CRPCFunctions::m_pClientGame;
5050
CClientWaterManager* CRPCFunctions::m_pWaterManager;
5151

52-
SFixedArray<CRPCFunctions::SRPCHandler, CRPCFunctions::NUM_RPC_FUNCS> CRPCFunctions::m_RPCHandlers;
53-
SFixedArray<CRPCFunctions::SElementRPCHandler, CRPCFunctions::NUM_RPC_FUNCS> CRPCFunctions::m_ElementRPCHandlers;
52+
SFixedArray<CRPCFunctions::SRPCHandler, eElementRPCFunctions::NUM_RPC_FUNCS> CRPCFunctions::m_RPCHandlers;
53+
SFixedArray<CRPCFunctions::SElementRPCHandler, eElementRPCFunctions::NUM_RPC_FUNCS> CRPCFunctions::m_ElementRPCHandlers;
5454

5555
CRPCFunctions::CRPCFunctions(CClientGame* pClientGame)
5656
{

Server/mods/deathmatch/StdInc.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ struct SAclRequest;
4040
#include "CBox.h"
4141
#include "CMatrix.h"
4242
#include "net/Packets.h"
43+
#include "net/rpc_enums.h"
4344
#include "Enums.h"
4445
#include <bochs_internal/bochs_crc32.h>
4546
#include "CChecksum.h"
@@ -95,6 +96,7 @@ struct SAclRequest;
9596
#include "packets/CResourceStopPacket.h"
9697
#include "packets/CResourceClientScriptsPacket.h"
9798
#include "packets/CReturnSyncPacket.h"
99+
#include "packets/CServerRPCControlPacket.h"
98100
#include "packets/CServerTextItemPacket.h"
99101
#include "packets/CUpdateInfoPacket.h"
100102
#include "packets/CUnoccupiedVehicleStartSyncPacket.h"

Server/mods/deathmatch/logic/CEvents.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ CEvents::CEvents()
1717
m_bEventCancelled = false;
1818
}
1919

20-
bool CEvents::AddEvent(const char* szName, const char* szArguments, CLuaMain* pLuaMain, bool bAllowRemoteTrigger)
20+
bool CEvents::AddEvent(const char* szName, const char* szArguments, CLuaMain* pLuaMain, bool bAllowRemoteTrigger, eServerRPCFunctions eServerRPCFunction)
2121
{
2222
assert(szName);
2323
assert(szArguments);
@@ -32,6 +32,7 @@ bool CEvents::AddEvent(const char* szName, const char* szArguments, CLuaMain* pL
3232
pEvent->strArguments = szArguments;
3333
pEvent->pLuaMain = pLuaMain;
3434
pEvent->bAllowRemoteTrigger = bAllowRemoteTrigger;
35+
pEvent->eServerRPCFunction = eServerRPCFunction;
3536

3637
m_EventHashMap[szName] = pEvent;
3738

Server/mods/deathmatch/logic/CEvents.h

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,11 @@
1717

1818
struct SEvent
1919
{
20-
class CLuaMain* pLuaMain;
21-
std::string strName;
22-
std::string strArguments;
23-
bool bAllowRemoteTrigger;
20+
class CLuaMain* pLuaMain;
21+
std::string strName;
22+
std::string strArguments;
23+
bool bAllowRemoteTrigger;
24+
eServerRPCFunctions eServerRPCFunction;
2425
};
2526

2627
class CEvents
@@ -29,7 +30,8 @@ class CEvents
2930
CEvents();
3031
~CEvents() { RemoveAllEvents(); };
3132

32-
bool AddEvent(const char* szName, const char* szArguments, class CLuaMain* pLuaMain, bool bAllowRemoteTrigger);
33+
bool AddEvent(const char* szName, const char* szArguments, class CLuaMain* pLuaMain, bool bAllowRemoteTrigger,
34+
eServerRPCFunctions eServerRPCFunction = eServerRPCFunctions::NUM_SERVER_RPC_FUNCS);
3335
void RemoveEvent(SEvent* pEvent);
3436
void RemoveEvent(const char* szName);
3537
void RemoveAllEvents(class CLuaMain* pMain);

0 commit comments

Comments
 (0)