hl2_src-leak-2017/src/common/netmessages.h

918 lines
21 KiB
C++

//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
//=============================================================================//
#ifndef NETMESSAGES_H
#define NETMESSAGES_H
#ifdef _WIN32
#pragma once
#pragma warning(disable : 4100) // unreferenced formal parameter
#endif
#include <inetmessage.h>
#include <checksum_crc.h>
#include <checksum_md5.h>
#include <const.h>
#include <utlvector.h>
#include "qlimits.h"
#include "mathlib/vector.h"
#include <soundflags.h>
#include <bitbuf.h>
#include <inetchannel.h>
#include "protocol.h"
#include <inetmsghandler.h>
#include <igameevents.h>
#include <bitvec.h>
#include <engine/iserverplugin.h>
#include <Color.h>
#include "proto_version.h"
#if !defined( _X360 )
#include "xbox/xboxstubs.h"
#endif
class SendTable;
class KeyValue;
class KeyValues;
class INetMessageHandler;
class IServerMessageHandler;
class IClientMessageHandler;
#define DECLARE_BASE_MESSAGE( msgtype ) \
public: \
bool ReadFromBuffer( bf_read &buffer ); \
bool WriteToBuffer( bf_write &buffer ); \
const char *ToString() const; \
int GetType() const { return msgtype; } \
const char *GetName() const { return #msgtype;}\
#define DECLARE_NET_MESSAGE( name ) \
DECLARE_BASE_MESSAGE( net_##name ); \
INetMessageHandler *m_pMessageHandler; \
bool Process() { return m_pMessageHandler->Process##name( this ); }\
#define DECLARE_SVC_MESSAGE( name ) \
DECLARE_BASE_MESSAGE( svc_##name ); \
IServerMessageHandler *m_pMessageHandler;\
bool Process() { return m_pMessageHandler->Process##name( this ); }\
#define DECLARE_CLC_MESSAGE( name ) \
DECLARE_BASE_MESSAGE( clc_##name ); \
IClientMessageHandler *m_pMessageHandler;\
bool Process() { return m_pMessageHandler->Process##name( this ); }\
#define DECLARE_MM_MESSAGE( name ) \
DECLARE_BASE_MESSAGE( mm_##name ); \
IMatchmakingMessageHandler *m_pMessageHandler;\
bool Process() { return m_pMessageHandler->Process##name( this ); }\
class CNetMessage : public INetMessage
{
public:
CNetMessage() { m_bReliable = true;
m_NetChannel = NULL; }
virtual ~CNetMessage() {};
virtual int GetGroup() const { return INetChannelInfo::GENERIC; }
INetChannel *GetNetChannel() const { return m_NetChannel; }
virtual void SetReliable( bool state) {m_bReliable = state;};
virtual bool IsReliable() const { return m_bReliable; };
virtual void SetNetChannel(INetChannel * netchan) { m_NetChannel = netchan; }
virtual bool Process() { Assert( 0 ); return false; }; // no handler set
protected:
bool m_bReliable; // true if message should be send reliable
INetChannel *m_NetChannel; // netchannel this message is from/for
};
///////////////////////////////////////////////////////////////////////////////////////
// bidirectional net messages:
///////////////////////////////////////////////////////////////////////////////////////
class NET_SetConVar : public CNetMessage
{
DECLARE_NET_MESSAGE( SetConVar );
int GetGroup() const { return INetChannelInfo::STRINGCMD; }
NET_SetConVar() {}
NET_SetConVar( const char * name, const char * value)
{
cvar_t localCvar;
Q_strncpy( localCvar.name, name, MAX_OSPATH );
Q_strncpy( localCvar.value, value, MAX_OSPATH );
m_ConVars.AddToTail( localCvar );
}
public:
typedef struct cvar_s
{
char name[MAX_OSPATH];
char value[MAX_OSPATH];
} cvar_t;
CUtlVector<cvar_t> m_ConVars;
};
class NET_StringCmd : public CNetMessage
{
DECLARE_NET_MESSAGE( StringCmd );
int GetGroup() const { return INetChannelInfo::STRINGCMD; }
NET_StringCmd() { m_szCommand = NULL; };
NET_StringCmd(const char *cmd) { m_szCommand = cmd; };
public:
const char *m_szCommand; // execute this command
private:
char m_szCommandBuffer[1024]; // buffer for received messages
};
class NET_Tick : public CNetMessage
{
DECLARE_NET_MESSAGE( Tick );
NET_Tick()
{
m_bReliable = false;
#if PROTOCOL_VERSION > 10
m_flHostFrameTime = 0;
m_flHostFrameTimeStdDeviation = 0;
#endif
};
NET_Tick( int tick, float hostFrametime, float hostFrametime_stddeviation )
{
m_bReliable = false;
m_nTick = tick;
#if PROTOCOL_VERSION > 10
m_flHostFrameTime = hostFrametime;
m_flHostFrameTimeStdDeviation = hostFrametime_stddeviation;
#else
NOTE_UNUSED( hostFrametime );
NOTE_UNUSED( hostFrametime_stddeviation );
#endif
};
public:
int m_nTick;
#if PROTOCOL_VERSION > 10
float m_flHostFrameTime;
float m_flHostFrameTimeStdDeviation;
#endif
};
class NET_SignonState : public CNetMessage
{
DECLARE_NET_MESSAGE( SignonState );
int GetGroup() const { return INetChannelInfo::SIGNON; }
NET_SignonState() {};
NET_SignonState( int state, int spawncount ) { m_nSignonState = state; m_nSpawnCount = spawncount; };
public:
int m_nSignonState; // See SIGNONSTATE_ defines
int m_nSpawnCount; // server spawn count (session number)
};
///////////////////////////////////////////////////////////////////////////////////////
// Client messages:
///////////////////////////////////////////////////////////////////////////////////////
class CLC_ClientInfo : public CNetMessage
{
DECLARE_CLC_MESSAGE( ClientInfo );
public:
CRC32_t m_nSendTableCRC;
int m_nServerCount;
bool m_bIsHLTV;
#if defined( REPLAY_ENABLED )
bool m_bIsReplay;
#endif
uint32 m_nFriendsID;
char m_FriendsName[MAX_PLAYER_NAME_LENGTH];
CRC32_t m_nCustomFiles[MAX_CUSTOM_FILES];
};
class CLC_Move : public CNetMessage
{
DECLARE_CLC_MESSAGE( Move );
int GetGroup() const { return INetChannelInfo::MOVE; }
CLC_Move() { m_bReliable = false; }
public:
int m_nBackupCommands;
int m_nNewCommands;
int m_nLength;
bf_read m_DataIn;
bf_write m_DataOut;
};
class CLC_VoiceData : public CNetMessage
{
DECLARE_CLC_MESSAGE( VoiceData );
int GetGroup() const { return INetChannelInfo::VOICE; }
CLC_VoiceData() { m_bReliable = false; };
public:
int m_nLength;
bf_read m_DataIn;
bf_write m_DataOut;
uint64 m_xuid;
};
class CLC_BaselineAck : public CNetMessage
{
DECLARE_CLC_MESSAGE( BaselineAck );
CLC_BaselineAck() {};
CLC_BaselineAck(int tick, int baseline ) { m_nBaselineTick = tick; m_nBaselineNr = baseline; }
int GetGroup() const { return INetChannelInfo::ENTITIES; }
public:
int m_nBaselineTick; // sequence number of baseline
int m_nBaselineNr; // 0 or 1
};
class CLC_ListenEvents : public CNetMessage
{
DECLARE_CLC_MESSAGE( ListenEvents );
int GetGroup() const { return INetChannelInfo::SIGNON; }
public:
CBitVec<MAX_EVENT_NUMBER> m_EventArray;
};
#if defined( REPLAY_ENABLED )
class CLC_SaveReplay : public CNetMessage
{
DECLARE_CLC_MESSAGE( SaveReplay );
CLC_SaveReplay() {}
int m_nStartSendByte;
char m_szFilename[ MAX_OSPATH ];
float m_flPostDeathRecordTime;
};
#endif
class CLC_RespondCvarValue : public CNetMessage
{
public:
DECLARE_CLC_MESSAGE( RespondCvarValue );
QueryCvarCookie_t m_iCookie;
const char *m_szCvarName;
const char *m_szCvarValue; // The sender sets this, and it automatically points it at m_szCvarNameBuffer when receiving.
EQueryCvarValueStatus m_eStatusCode;
private:
char m_szCvarNameBuffer[256];
char m_szCvarValueBuffer[256];
};
class CLC_FileCRCCheck : public CNetMessage
{
public:
DECLARE_CLC_MESSAGE( FileCRCCheck );
char m_szPathID[MAX_PATH];
char m_szFilename[MAX_PATH];
MD5Value_t m_MD5;
CRC32_t m_CRCIOs;
int m_eFileHashType;
int m_cbFileLen;
int m_nPackFileNumber;
int m_PackFileID;
int m_nFileFraction;
};
class CLC_FileMD5Check : public CNetMessage
{
public:
DECLARE_CLC_MESSAGE( FileMD5Check );
char m_szPathID[MAX_PATH];
char m_szFilename[MAX_PATH];
MD5Value_t m_MD5;
};
class Base_CmdKeyValues : public CNetMessage
{
protected:
explicit Base_CmdKeyValues( KeyValues *pKeyValues = NULL ); // takes ownership
~Base_CmdKeyValues();
public:
KeyValues * GetKeyValues() const { return m_pKeyValues; }
public:
bool ReadFromBuffer( bf_read &buffer );
bool WriteToBuffer( bf_write &buffer );
const char * ToString() const;
protected:
KeyValues *m_pKeyValues;
};
class CLC_CmdKeyValues : public Base_CmdKeyValues
{
public:
DECLARE_CLC_MESSAGE( CmdKeyValues );
public:
explicit CLC_CmdKeyValues( KeyValues *pKeyValues = NULL ); // takes ownership
};
class SVC_CmdKeyValues : public Base_CmdKeyValues
{
public:
DECLARE_SVC_MESSAGE( CmdKeyValues );
public:
explicit SVC_CmdKeyValues( KeyValues *pKeyValues = NULL ); // takes ownership
};
///////////////////////////////////////////////////////////////////////////////////////
// server messages:
///////////////////////////////////////////////////////////////////////////////////////
class SVC_Print : public CNetMessage
{
DECLARE_SVC_MESSAGE( Print );
SVC_Print() { m_bReliable = false; m_szText = NULL; };
SVC_Print(const char * text) { m_bReliable = false; m_szText = text; };
public:
const char *m_szText; // show this text
private:
char m_szTextBuffer[2048]; // buffer for received messages
};
class SVC_ServerInfo : public CNetMessage
{
DECLARE_SVC_MESSAGE( ServerInfo );
int GetGroup() const { return INetChannelInfo::SIGNON; }
public: // member vars are public for faster handling
int m_nProtocol; // protocol version
int m_nServerCount; // number of changelevels since server start
bool m_bIsDedicated; // dedicated server ?
bool m_bIsHLTV; // HLTV server ?
#if defined( REPLAY_ENABLED )
bool m_bIsReplay; // Replay server ?
#endif
char m_cOS; // L = linux, W = Win32
CRC32_t m_nMapCRC; // server map CRC (only used by older demos)
MD5Value_t m_nMapMD5; // server map MD5
int m_nMaxClients; // max number of clients on server
int m_nMaxClasses; // max number of server classes
int m_nPlayerSlot; // our client slot number
float m_fTickInterval;// server tick interval
const char *m_szGameDir; // game directory eg "tf2"
const char *m_szMapName; // name of current map
const char *m_szSkyName; // name of current skybox
const char *m_szHostName; // server name
private:
char m_szGameDirBuffer[MAX_OSPATH];// game directory eg "tf2"
char m_szMapNameBuffer[MAX_OSPATH];// name of current map
char m_szSkyNameBuffer[MAX_OSPATH];// name of current skybox
char m_szHostNameBuffer[MAX_OSPATH];// name of current skybox
};
class SVC_SendTable : public CNetMessage
{
DECLARE_SVC_MESSAGE( SendTable );
int GetGroup() const { return INetChannelInfo::SIGNON; }
public:
bool m_bNeedsDecoder;
int m_nLength;
bf_read m_DataIn;
bf_write m_DataOut;
};
class SVC_ClassInfo : public CNetMessage
{
DECLARE_SVC_MESSAGE( ClassInfo );
int GetGroup() const { return INetChannelInfo::SIGNON; }
SVC_ClassInfo() {};
SVC_ClassInfo( bool createFromSendTables, int numClasses )
{ m_bCreateOnClient = createFromSendTables;
m_nNumServerClasses = numClasses; };
public:
typedef struct class_s
{
int classID;
char datatablename[256];
char classname[256];
} class_t;
bool m_bCreateOnClient; // if true, client creates own SendTables & classinfos from game.dll
CUtlVector<class_t> m_Classes;
int m_nNumServerClasses;
};
class SVC_SetPause : public CNetMessage
{
DECLARE_SVC_MESSAGE( SetPause );
SVC_SetPause() {}
SVC_SetPause( bool state, float end = -1.f ) { m_bPaused = state; }
public:
bool m_bPaused; // true or false, what else
};
class SVC_SetPauseTimed : public CNetMessage
{
DECLARE_SVC_MESSAGE( SetPauseTimed );
SVC_SetPauseTimed() {}
SVC_SetPauseTimed( bool bState, float flExpireTime = -1.f ) { m_bPaused = bState; m_flExpireTime = flExpireTime; }
public:
bool m_bPaused;
float m_flExpireTime;
};
class CNetworkStringTable;
class SVC_CreateStringTable : public CNetMessage
{
DECLARE_SVC_MESSAGE( CreateStringTable );
int GetGroup() const { return INetChannelInfo::SIGNON; }
public:
SVC_CreateStringTable();
public:
const char *m_szTableName;
int m_nMaxEntries;
int m_nNumEntries;
bool m_bUserDataFixedSize;
int m_nUserDataSize;
int m_nUserDataSizeBits;
bool m_bIsFilenames;
int m_nLength;
bf_read m_DataIn;
bf_write m_DataOut;
bool m_bDataCompressed;
private:
char m_szTableNameBuffer[256];
};
class SVC_UpdateStringTable : public CNetMessage
{
DECLARE_SVC_MESSAGE( UpdateStringTable );
int GetGroup() const { return INetChannelInfo::STRINGTABLE; }
public:
int m_nTableID; // table to be updated
int m_nChangedEntries; // number of how many entries has changed
int m_nLength; // data length in bits
bf_read m_DataIn;
bf_write m_DataOut;
};
// SVC_VoiceInit
// v2 - 2017/02/07
// - Can detect v2 packets by nLegacyQuality == 255 and presence of additional nSampleRate field.
// - Added nSampleRate field. Previously, nSampleRate was hard-coded per codec type. ::ReadFromBuffer does a
// one-time conversion of these old types (which can no longer change)
// - Marked quality field as deprecated. This was already being ignored. v2 clients send 255
// - Prior to this the sv_use_steam_voice convar was used to switch to steam voice. With this, we properly set
// szVoiceCodec to "steam". See ::ReadFromBuffer for shim to fallback to the convar for old streams.
// - We no longer pass "svc_voiceinit NULL" as szVoiceCodec if it is not selected, just the empty string. Nothing
// used this that I could find.
class SVC_VoiceInit : public CNetMessage
{
DECLARE_SVC_MESSAGE( VoiceInit );
int GetGroup() const { return INetChannelInfo::SIGNON; }
SVC_VoiceInit()
: m_nSampleRate( 0 )
{
V_memset( m_szVoiceCodec, 0, sizeof( m_szVoiceCodec ) );
}
SVC_VoiceInit( const char * codec, int nSampleRate )
: m_nSampleRate( nSampleRate )
{
V_strncpy( m_szVoiceCodec, codec ? codec : "", sizeof( m_szVoiceCodec ) );
}
public:
// Used voice codec for voice_init.
//
// This used to be a DLL name, then became a whitelisted list of codecs.
char m_szVoiceCodec[MAX_OSPATH];
// DEPRECATED:
//
// This field used to be a custom quality setting, but it was not honored for a long time: codecs use their own
// pre-configured quality settings. We never sent anything besides 5, which was then ignored for some codecs.
//
// New clients always set 255 here, old clients probably send 5. This could be re-purposed in the future, but beware
// that very old demos may have non-5 values. It would take more archaeology to determine how to properly interpret
// those packets -- they're probably using settings we simply don't support any longer.
//
// int m_nQuality;
// The sample rate we are using
int m_nSampleRate;
};
class SVC_VoiceData : public CNetMessage
{
DECLARE_SVC_MESSAGE( VoiceData );
int GetGroup() const { return INetChannelInfo::VOICE; }
SVC_VoiceData() { m_bReliable = false; }
public:
int m_nFromClient; // client who has spoken
bool m_bProximity;
int m_nLength; // data length in bits
uint64 m_xuid; // X360 player ID
bf_read m_DataIn;
void *m_DataOut;
};
class SVC_Sounds : public CNetMessage
{
DECLARE_SVC_MESSAGE( Sounds );
int GetGroup() const { return INetChannelInfo::SOUNDS; }
public:
bool m_bReliableSound;
int m_nNumSounds;
int m_nLength;
bf_read m_DataIn;
bf_write m_DataOut;
};
class SVC_Prefetch : public CNetMessage
{
DECLARE_SVC_MESSAGE( Prefetch );
int GetGroup() const { return INetChannelInfo::SOUNDS; }
enum
{
SOUND = 0,
};
public:
unsigned short m_fType;
unsigned short m_nSoundIndex;
};
class SVC_SetView : public CNetMessage
{
DECLARE_SVC_MESSAGE( SetView );
SVC_SetView() {}
SVC_SetView( int entity ) { m_nEntityIndex = entity; }
public:
int m_nEntityIndex;
};
class SVC_FixAngle: public CNetMessage
{
DECLARE_SVC_MESSAGE( FixAngle );
SVC_FixAngle() { m_bReliable = false; };
SVC_FixAngle( bool bRelative, QAngle angle )
{ m_bReliable = false; m_bRelative = bRelative; m_Angle = angle; }
public:
bool m_bRelative;
QAngle m_Angle;
};
class SVC_CrosshairAngle : public CNetMessage
{
DECLARE_SVC_MESSAGE( CrosshairAngle );
SVC_CrosshairAngle() {}
SVC_CrosshairAngle( QAngle angle ) { m_Angle = angle; }
public:
QAngle m_Angle;
};
class SVC_BSPDecal : public CNetMessage
{
DECLARE_SVC_MESSAGE( BSPDecal );
public:
Vector m_Pos;
int m_nDecalTextureIndex;
int m_nEntityIndex;
int m_nModelIndex;
bool m_bLowPriority;
};
class SVC_GameEvent : public CNetMessage
{
DECLARE_SVC_MESSAGE( GameEvent );
int GetGroup() const { return INetChannelInfo::EVENTS; }
public:
int m_nLength; // data length in bits
bf_read m_DataIn;
bf_write m_DataOut;
};
class SVC_UserMessage: public CNetMessage
{
DECLARE_SVC_MESSAGE( UserMessage );
SVC_UserMessage() { m_bReliable = false; }
int GetGroup() const { return INetChannelInfo::USERMESSAGES; }
public:
int m_nMsgType;
int m_nLength; // data length in bits
bf_read m_DataIn;
bf_write m_DataOut;
};
class SVC_EntityMessage : public CNetMessage
{
DECLARE_SVC_MESSAGE( EntityMessage );
SVC_EntityMessage() { m_bReliable = false; }
int GetGroup() const { return INetChannelInfo::ENTMESSAGES ; }
public:
int m_nEntityIndex;
int m_nClassID;
int m_nLength; // data length in bits
bf_read m_DataIn;
bf_write m_DataOut;
};
/* class SVC_SpawnBaseline: public CNetMessage
{
DECLARE_SVC_MESSAGE( SpawnBaseline );
int GetGroup() const { return INetChannelInfo::SIGNON; }
public:
int m_nEntityIndex;
int m_nClassID;
int m_nLength;
bf_read m_DataIn;
bf_write m_DataOut;
}; */
class SVC_PacketEntities: public CNetMessage
{
DECLARE_SVC_MESSAGE( PacketEntities );
int GetGroup() const { return INetChannelInfo::ENTITIES ; }
public:
int m_nMaxEntries;
int m_nUpdatedEntries;
bool m_bIsDelta;
bool m_bUpdateBaseline;
int m_nBaseline;
int m_nDeltaFrom;
int m_nLength;
bf_read m_DataIn;
bf_write m_DataOut;
};
class SVC_TempEntities: public CNetMessage
{
DECLARE_SVC_MESSAGE( TempEntities );
SVC_TempEntities() { m_bReliable = false; }
int GetGroup() const { return INetChannelInfo::EVENTS; }
int m_nNumEntries;
int m_nLength;
bf_read m_DataIn;
bf_write m_DataOut;
};
class SVC_Menu : public CNetMessage
{
public:
DECLARE_SVC_MESSAGE( Menu );
SVC_Menu() { m_bReliable = true; m_Type = DIALOG_MENU; m_MenuKeyValues = NULL; };
SVC_Menu( DIALOG_TYPE type, KeyValues *data );
~SVC_Menu();
KeyValues *m_MenuKeyValues;
DIALOG_TYPE m_Type;
int m_iLength;
};
class SVC_GameEventList : public CNetMessage
{
public:
DECLARE_SVC_MESSAGE( GameEventList );
int m_nNumEvents;
int m_nLength;
bf_read m_DataIn;
bf_write m_DataOut;
};
///////////////////////////////////////////////////////////////////////////////////////
// Matchmaking messages:
///////////////////////////////////////////////////////////////////////////////////////
class MM_Heartbeat : public CNetMessage
{
public:
DECLARE_MM_MESSAGE( Heartbeat );
};
class MM_ClientInfo : public CNetMessage
{
public:
DECLARE_MM_MESSAGE( ClientInfo );
XNADDR m_xnaddr; // xbox net address
uint64 m_id; // machine ID
uint64 m_xuids[MAX_PLAYERS_PER_CLIENT];
byte m_cVoiceState[MAX_PLAYERS_PER_CLIENT];
bool m_bInvited;
char m_cPlayers;
char m_iControllers[MAX_PLAYERS_PER_CLIENT];
char m_iTeam[MAX_PLAYERS_PER_CLIENT];
char m_szGamertags[MAX_PLAYERS_PER_CLIENT][MAX_PLAYER_NAME_LENGTH];
};
class MM_RegisterResponse : public CNetMessage
{
public:
DECLARE_MM_MESSAGE( RegisterResponse );
};
class MM_Mutelist : public CNetMessage
{
public:
DECLARE_MM_MESSAGE( Mutelist );
uint64 m_id;
byte m_cPlayers;
byte m_cRemoteTalkers[MAX_PLAYERS_PER_CLIENT];
XUID m_xuid[MAX_PLAYERS_PER_CLIENT];
byte m_cMuted[MAX_PLAYERS_PER_CLIENT];
CUtlVector< XUID > m_Muted[MAX_PLAYERS_PER_CLIENT];
};
class MM_Checkpoint : public CNetMessage
{
public:
DECLARE_MM_MESSAGE( Checkpoint );
enum eCheckpoint
{
CHECKPOINT_CHANGETEAM,
CHECKPOINT_GAME_LOBBY,
CHECKPOINT_PREGAME,
CHECKPOINT_LOADING_COMPLETE,
CHECKPOINT_CONNECT,
CHECKPOINT_SESSION_DISCONNECT,
CHECKPOINT_REPORT_STATS,
CHECKPOINT_REPORTING_COMPLETE,
CHECKPOINT_POSTGAME,
};
byte m_Checkpoint;
};
// NOTE: The following messages are not network-endian compliant, due to the
// transmission of structures instead of their component parts
class MM_JoinResponse : public CNetMessage
{
public:
DECLARE_MM_MESSAGE( JoinResponse );
MM_JoinResponse()
{
m_ContextCount = 0;
m_PropertyCount = 0;
}
enum
{
JOINRESPONSE_APPROVED,
JOINRESPONSE_APPROVED_JOINGAME,
JOINRESPONSE_SESSIONFULL,
JOINRESPONSE_NOTHOSTING,
JOINRESPONSE_MODIFY_SESSION,
};
uint m_ResponseType;
// host info
uint64 m_id; // Host's machine ID
uint64 m_Nonce; // Session nonce
uint m_SessionFlags;
uint m_nOwnerId;
int m_iTeam;
int m_nTotalTeams;
int m_PropertyCount;
int m_ContextCount;
CUtlVector< XUSER_PROPERTY >m_SessionProperties;
CUtlVector< XUSER_CONTEXT >m_SessionContexts;
};
class MM_Migrate : public CNetMessage
{
public:
DECLARE_MM_MESSAGE( Migrate );
enum eMsgType
{
MESSAGE_HOSTING,
MESSAGE_MIGRATED,
MESSAGE_STANDBY,
};
byte m_MsgType;
uint64 m_Id;
XNKID m_sessionId;
XNADDR m_xnaddr;
XNKEY m_key;
};
class SVC_GetCvarValue : public CNetMessage
{
public:
DECLARE_SVC_MESSAGE( GetCvarValue );
QueryCvarCookie_t m_iCookie;
const char *m_szCvarName; // The sender sets this, and it automatically points it at m_szCvarNameBuffer when receiving.
private:
char m_szCvarNameBuffer[256];
};
#endif // NETMESSAGES_H