UserCmd strings: Difference between revisions

From Valve Developer Community
Jump to navigation Jump to search
No edit summary
 
Line 5: Line 5:
===UserCmd.cpp===
===UserCmd.cpp===
====WriteUsercmd====
====WriteUsercmd====
At the end:
  if(g_pLocalPlayer&&g_pLocalPlayer->UserDataChanged())
  if(g_pLocalPlayer&&g_pLocalPlayer->UserDataChanged())
  {
  {
Line 22: Line 23:
====ReadUsercmd====
====ReadUsercmd====
  void ReadUsercmd( bf_read *buf, CUserCmd *move, CUserCmd *from<font color="green">, CBasePlayer *pPlayer</font> )
  void ReadUsercmd( bf_read *buf, CUserCmd *move, CUserCmd *from<font color="green">, CBasePlayer *pPlayer</font> )
 
At the end:
  if( buf->ReadOneBit() )
  if( buf->ReadOneBit() )
  {
  {
Line 40: Line 41:
====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==
===Client===
===Client===

Revision as of 23:37, 16 June 2006

Warning.pngWarning:These changes are only theoretical and haven't been tested whatsoever.

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:

	if(g_pLocalPlayer&&g_pLocalPlayer->UserDataChanged())
	{
		buf->WriteOneBit( 1 );
		KeyValues *data = g_pLocalPlayer->GetUserData();
		CUtlBuffer databuf;
		data->WriteAsBinary(databuf);
		int len = strlen(static_cast<char*>(databuf.Base()));
		buf->WriteShort(len);
		buf->WriteBits(databuf, len);
		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->ReadShort();
		char data[count+1];
		buf->ReadBytes(data,count);
#ifndef CLIENT_DLL
		pPlayer->EvaluateUserData(data);
#endif
	}

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

Client

  • KeyValues *GetUserData(void) returns the KeyValues data stored on the player.
  • void ClearUserData(void) clears the client-side KeyValues and sets the boolean so they don't get sent twice.
  • bool UserDataChanged(void) returns the boolean modified by ClearUserData.

Server

  • void EvaluateUserData(const char *pData) reads pData to a KeyValues and evaluates what to do with the commands stored within them.