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.
Note:This method should only be used on multiplayer servers, where cheating has a negative effect on gameplay.
		
	
| m (→ReadUsercmd) |  (confirmed that this works) | ||
| Line 1: | Line 1: | ||
| ==Introduction== | ==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 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. | ||
Revision as of 22:58, 29 July 2007
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.
 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
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.
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 );
	}
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
#include "baseplayer_shared.h"
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_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.
CBasePlayer
- public void EvaluateUserData(const char *pData)evaluates what to do with the command stored in pData.