UserCmd strings: Difference between revisions
Jump to navigation
Jump to search
Note:This method should only be used on multiplayer servers, where cheating has a negative effect on gameplay.
m (→ReadUsercmd) |
Brandished (talk | contribs) m (→UserCmd.cpp: need nowiki tags to avoid parsing) |
||
(5 intermediate revisions by 3 users not shown) | |||
Line 1: | Line 1: | ||
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 Screen]]s. | 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 Screen]]s. | ||
{{note|This method should only be used on multiplayer servers, where cheating has a negative effect on gameplay.}} | {{note|This method should only be used on multiplayer servers, where cheating has a negative effect on gameplay.}} | ||
==Changes== | ==Changes== | ||
===UserCmd.cpp=== | ===UserCmd.cpp=== | ||
<nowiki> | |||
#include "baseplayer_shared.h" before memdbgon.h | |||
</nowiki> | |||
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. | 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. | ||
====WriteUsercmd==== | ====WriteUsercmd==== | ||
At the end: | At the end: | ||
#ifdef CLIENT_DLL | |||
CBasePlayer *pLocalPlayer = CBasePlayer::GetLocalPlayer(); | |||
byte count = pLocalPlayer->GetUserDataCount(); | byte count = pLocalPlayer->GetUserDataCount(); | ||
if(count) | if(count) | ||
Line 27: | Line 35: | ||
buf->WriteOneBit( 0 ); | buf->WriteOneBit( 0 ); | ||
} | } | ||
#endif | |||
====ReadUsercmd==== | ====ReadUsercmd==== | ||
void ReadUsercmd( bf_read *buf, CUserCmd *move, CUserCmd *from<font color="green">, CBasePlayer *pPlayer /*= NULL*/</font> ) | void ReadUsercmd( bf_read *buf, CUserCmd *move, CUserCmd *from<font color="green">, CBasePlayer *pPlayer /*= NULL*/</font> ) | ||
At the end: | At the end: | ||
if( buf->ReadOneBit() ) | if( buf->ReadOneBit() ) | ||
{ | { | ||
Line 47: | Line 60: | ||
====UserCmd.h==== | ====UserCmd.h==== | ||
//Forward declaration. | |||
class CBasePlayer; | |||
void ReadUsercmd( bf_read *buf, CUserCmd *move, CUserCmd *from<font color="green">, CBasePlayer *pPlayer = NULL</font> ); | void ReadUsercmd( bf_read *buf, CUserCmd *move, CUserCmd *from<font color="green">, CBasePlayer *pPlayer = NULL</font> ); | ||
====Changes to gameinterface.cpp==== | ====Changes to gameinterface.cpp==== | ||
ReadUsercmd( buf, to, from<font color="green">, pPlayer</font> ); | ReadUsercmd( buf, to, from<font color="green">, pPlayer</font> ); | ||
==Implementation== | ==Implementation== | ||
===C_BasePlayer=== | ===C_BasePlayer=== | ||
*protected <code>CUtlLinkedList<const char *, byte> m_UserData</code> stores all of the data to send (The player should '''never''' have to send over 255 strings for 1 usercmd). | *protected <code>CUtlLinkedList<const char *, byte> m_UserData</code> stores all of the data to send (The player should '''never''' have to send over 255 strings for 1 usercmd). | ||
*public <code>void AddUserData(const char *pNewData)</code> adds data to send. | *public <code>void AddUserData(const char *pNewData)</code> adds data to send. | ||
Line 62: | Line 80: | ||
===CBasePlayer=== | ===CBasePlayer=== | ||
*public <code>void EvaluateUserData(const char *pData)</code> evaluates what to do with the command stored in pData. | *public <code>void EvaluateUserData(const char *pData)</code> evaluates what to do with the command stored in pData. | ||
[[Category: | |||
[[Category:Networking]] | |||
[[Category:Tutorials]] |
Latest revision as of 13:04, 14 July 2009
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.

Changes
UserCmd.cpp
#include "baseplayer_shared.h" before memdbgon.h
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.
WriteUsercmd
At the end:
#ifdef CLIENT_DLL CBasePlayer *pLocalPlayer = CBasePlayer::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 ); } #endif
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; } }
UserCmd.h
//Forward declaration. class CBasePlayer; void ReadUsercmd( bf_read *buf, CUserCmd *move, CUserCmd *from, CBasePlayer *pPlayer = NULL );
Changes to gameinterface.cpp
ReadUsercmd( buf, to, from, pPlayer );
Implementation
C_BasePlayer
- protected
CUtlLinkedList<const char *, byte> m_UserData
stores 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.
CBasePlayer
- public
void EvaluateUserData(const char *pData)
evaluates what to do with the command stored in pData.