This repository has been archived on 2024-06-01. You can view files and clone it, but cannot push or open issues or pull requests.
cathook/include/netmessage.hpp
2017-11-13 09:41:53 +03:00

244 lines
7.2 KiB
C++

/*
* netmessage.h
*
* Created on: Dec 3, 2016
* Author: nullifiedcat
*/
#ifndef NETMESSAGE_HPP_
#define NETMESSAGE_HPP_
#include <bitbuf.h>
#include <fixsdk.hpp>
#include <utlvector.h>
#include <inetchannel.h>
#include <inetmessage.h>
#include <inetmsghandler.h>
#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 false; }\
#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 = 0; }
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() { 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
};
#define net_NOP 0 // nop command used for padding
#define net_Disconnect 1 // disconnect, last message in connection
#define net_File 2 // file transmission message request/deny
#define net_Tick 3 // send last world tick
#define net_StringCmd 4 // a string command
#define net_SetConVar 5 // sends one/multiple convar settings
#define net_SignonState 6 // signals current signon state
//
// server to client
//
#define svc_Print 7 // print text to console
#define svc_ServerInfo 8 // first message from server about game, map etc
#define svc_SendTable 9 // sends a sendtable description for a game class
#define svc_ClassInfo 10 // Info about classes (first byte is a CLASSINFO_ define).
#define svc_SetPause 11 // tells client if server paused or unpaused
#define svc_CreateStringTable 12 // inits shared string tables
#define svc_UpdateStringTable 13 // updates a string table
#define svc_VoiceInit 14 // inits used voice codecs & quality
#define svc_VoiceData 15 // Voicestream data from the server
// #define svc_HLTV 16 // HLTV control messages
#define svc_Sounds 17 // starts playing sound
#define svc_SetView 18 // sets entity as point of view
#define svc_FixAngle 19 // sets/corrects players viewangle
#define svc_CrosshairAngle 20 // adjusts crosshair in auto aim mode to lock on traget
#define svc_BSPDecal 21 // add a static decal to the worl BSP
// NOTE: This is now unused!
//#define svc_TerrainMod 22 // modification to the terrain/displacement
// Message from server side to client side entity
#define svc_UserMessage 23 // a game specific message
#define svc_EntityMessage 24 // a message for an entity
#define svc_GameEvent 25 // global game event fired
#define svc_PacketEntities 26 // non-delta compressed entities
#define svc_TempEntities 27 // non-reliable event object
#define svc_Prefetch 28 // only sound indices for now
#define svc_Menu 29 // display a menu from a plugin
#define svc_GameEventList 30 // list of known games events and fields
#define svc_GetCvarValue 31 // Server wants to know the value of a cvar on the client.
#define SVC_LASTMSG 31 // last known server messages
//
// client to server
//
#define clc_ClientInfo 8 // client info (table CRC etc)
#define clc_Move 9 // [CUserCmd]
#define clc_VoiceData 10 // Voicestream data from a client
#define clc_BaselineAck 11 // client acknowledges a new baseline seqnr
#define clc_ListenEvents 12 // client acknowledges a new baseline seqnr
#define clc_RespondCvarValue 13 // client is responding to a svc_GetCvarValue message.
#define clc_FileCRCCheck 14 // client is sending a file's CRC to the server to be verified.
#define CLC_LASTMSG 14 // last known client message
#define MAX_OSPATH 260
#define NETMSG_TYPE_BITS 5
typedef int QueryCvarCookie_t;
typedef enum
{
eQueryCvarValueStatus_ValueIntact=0, // It got the value fine.
eQueryCvarValueStatus_CvarNotFound=1,
eQueryCvarValueStatus_NotACvar=2, // There's a ConCommand, but it's not a ConVar.
eQueryCvarValueStatus_CvarProtected=3 // The cvar was marked with FCVAR_SERVER_CAN_NOT_QUERY, so the server is not allowed to have its value.
} EQueryCvarValueStatus;
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 NET_NOP : public CNetMessage {
DECLARE_NET_MESSAGE( NOP );
int GetGroup() const { return INetChannelInfo::GENERIC; }
NET_NOP() {};
};
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)
};
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];
};
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 cvar;
strncpy( cvar.name, name, MAX_OSPATH );
strncpy( cvar.value, value, MAX_OSPATH );
convar = cvar;
}
public:
typedef struct cvar_s
{
char name[MAX_OSPATH];
char value[MAX_OSPATH];
} cvar_t;
cvar_t convar;
//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
};
#endif /* NETMESSAGE_HPP_ */