UserCmd strings: Difference between revisions
Jump to navigation
Jump to search
Warning:These changes are only theoretical and haven't been tested whatsoever.
m (added debugging code) |
mNo edit summary |
||
| Line 6: | Line 6: | ||
====WriteUsercmd==== | ====WriteUsercmd==== | ||
At the end: | At the end: | ||
if(g_pLocalPlayer&& | byte count = g_pLocalPlayer->GetUserDataCount(); | ||
if(g_pLocalPlayer&&count) | |||
{ | { | ||
buf->WriteOneBit( 1 ); | buf->WriteOneBit( 1 ); | ||
buf->WriteByte(count); | buf->WriteByte(count); | ||
for( | |||
for(byte x=0;x<count;x++) | |||
{ | { | ||
buf->WriteString(g_pLocalPlayer->GetUserData(x)); | buf->WriteString(g_pLocalPlayer->GetUserData(x)); | ||
} | } | ||
g_pLocalPlayer->ClearUserData(); | g_pLocalPlayer->ClearUserData(); | ||
} | } | ||
| Line 51: | Line 53: | ||
==Implementation== | ==Implementation== | ||
=== | ===C_BasePlayer=== | ||
*<code> | *<code>CUtlLinkedList<const char *, byte> m_pUserData</code> stores all of the data to send. | ||
*<code>const char *GetUserData( | *<code>void AddUserData(const char *pNewData)</code> adds data to send. | ||
*<code>void ClearUserData(void)</code> | *<code>byte GetUserDataCount(void)</code> returns <code>m_pUserData.Count()</code>. | ||
*<code>const char *GetUserData(byte index)</code> returns <code>m_pUserData.Element(index)</code>. | |||
=== | *<code>void ClearUserData(void)</code> calls <code>m_pUserData.PurgeAndDeleteElements()</code>. See [[CloneString]] to make sure you don't accidentally get any null pointers. | ||
*<code>void EvaluateUserData(const char *pData)</code> evaluates what to do with the | ===CBasePlayer=== | ||
*<code>void EvaluateUserData(const char *pData)</code> evaluates what to do with the command stored in pData. | |||
[[Category:Programming]][[Category:Tutorials]] | [[Category:Programming]][[Category:Tutorials]] | ||
Revision as of 17:58, 17 June 2006
Introduction
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
WriteUsercmd
At the end:
byte count = g_pLocalPlayer->GetUserDataCount();
if(g_pLocalPlayer&&count)
{
buf->WriteOneBit( 1 );
buf->WriteByte(count);
for(byte x=0;x<count;x++)
{
buf->WriteString(g_pLocalPlayer->GetUserData(x));
}
g_pLocalPlayer->ClearUserData();
}
else
{
buf->WriteOneBit( 0 );
}
ReadUsercmd
void ReadUsercmd( bf_read *buf, CUserCmd *move, CUserCmd *from, CBasePlayer *pPlayer )
At the end:
if( buf->ReadOneBit() )
{
int count = buf->ReadByte();
for(int x=0;x<count;x++)
{
#ifdef DEBUG
bool bOverflow = false;
#endif
char *cmd = buf->ReadAndAllocateString(&bOverflow);
Assert(!bOverflow);
#ifndef CLIENT_DLL
pPlayer->EvaluateUserData(cmd);
#endif
delete cmd;
}
}
UserCmd.h
#include "baseplayer_shared.h"
void ReadUsercmd( bf_read *buf, CUserCmd *move, CUserCmd *from, CBasePlayer *pPlayer );
in_main.cpp
ReadUsercmd( buf, to, from, NULL );
Changes to gameinterface.cpp
ReadUsercmd( buf, to, from, pPlayer );
Implementation
C_BasePlayer
CUtlLinkedList<const char *, byte> m_pUserDatastores all of the data to send.void AddUserData(const char *pNewData)adds data to send.byte GetUserDataCount(void)returnsm_pUserData.Count().const char *GetUserData(byte index)returnsm_pUserData.Element(index).void ClearUserData(void)callsm_pUserData.PurgeAndDeleteElements(). See CloneString to make sure you don't accidentally get any null pointers.
CBasePlayer
void EvaluateUserData(const char *pData)evaluates what to do with the command stored in pData.