UserCmd strings
From Valve Developer Community
This modification allows a mod to send messages from the client to the server without using commands. This allows for a more secure method of communication from the client to the server. A possible implementation would be with VGUI Screens.
Note: This method should only be used on multiplayer servers, where cheating has a negative effect on gameplay.| Table of contents |
|
|
[edit]
Changes
[edit]
UserCmd.cpp
Note how WriteUsercmd only writes data if there is a delta (change). Notice how the count is tested, the data is then sent, and all of the saved data is then purged. This means only delta data will be sent.
[edit]
WriteUsercmd
At the end:
C_BasePlayer *pLocalPlayer = C_BasePlayer::GetLocalPlayer();
byte count = pLocalPlayer->GetUserDataCount();
if(count)
{
buf->WriteOneBit( 1 );
buf->WriteByte(count);
for(byte x=0;x<count;x++)
{
buf->WriteString(pLocalPlayer->GetUserData(x));
}
pLocalPlayer->ClearUserData();
}
else
{
buf->WriteOneBit( 0 );
}
[edit]
ReadUsercmd
void ReadUsercmd( bf_read *buf, CUserCmd *move, CUserCmd *from, CBasePlayer *pPlayer /*= NULL*/ )
At the end:
if( buf->ReadOneBit() )
{
int count = buf->ReadByte();
for(int x=0;x<count;x++)
{
bool bOverflow = false;
char *cmd = buf->ReadAndAllocateString(&bOverflow);
Assert(!bOverflow);
#ifndef CLIENT_DLL
Assert(pPlayer);
pPlayer->EvaluateUserData(cmd);
#endif
delete cmd;
}
}
[edit]
UserCmd.h
#include "baseplayer_shared.h"
void ReadUsercmd( bf_read *buf, CUserCmd *move, CUserCmd *from, CBasePlayer *pPlayer = NULL );
[edit]
Changes to gameinterface.cpp
ReadUsercmd( buf, to, from, pPlayer );
[edit]
Implementation
[edit]
C_BasePlayer
- protected
CUtlLinkedList<const char *, byte> m_UserDatastores all of the data to send (The player should never have to send over 255 strings for 1 usercmd). - public
void AddUserData(const char *pNewData)adds data to send. - public
byte GetUserDataCount(void)returnsm_UserData.Count(). - public
const char *GetUserData(byte index)returnsm_UserData.Element(index). - public
void ClearUserData(void)callsm_UserData.PurgeAndDeleteElements(). See strdup to make sure you don't accidentally get any null pointers.
[edit]
CBasePlayer
- public
void EvaluateUserData(const char *pData)evaluates what to do with the command stored in pData.
