diff options
Diffstat (limited to 'source/protocol.h')
-rw-r--r-- | source/protocol.h | 398 |
1 files changed, 201 insertions, 197 deletions
diff --git a/source/protocol.h b/source/protocol.h index 926c8fd..1f46205 100644 --- a/source/protocol.h +++ b/source/protocol.h @@ -22,23 +22,25 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // protocol.h -- communications protocols // -#define MAX_MSGLEN 0x8000 // max length of a message, 32k - -#define PROTOCOL_VERSION_OLD 26 -#define PROTOCOL_VERSION_DEFAULT 34 -#define PROTOCOL_VERSION_R1Q2 35 -#define PROTOCOL_VERSION_Q2PRO 36 -#define PROTOCOL_VERSION_MVD 37 // not used for UDP connections - -#define PROTOCOL_VERSION_R1Q2_MINIMUM 1903 // b6377 -#define PROTOCOL_VERSION_R1Q2_UCMD 1904 // b7387 -#define PROTOCOL_VERSION_R1Q2_CURRENT 1904 // b7387 -#define PROTOCOL_VERSION_Q2PRO_MINIMUM 1011 // r161 -#define PROTOCOL_VERSION_Q2PRO_UCMD 1012 // r179 -#define PROTOCOL_VERSION_Q2PRO_CLIENTFIX 1013 // r226 -#define PROTOCOL_VERSION_Q2PRO_CURRENT 1013 // r226 -#define PROTOCOL_VERSION_MVD_MINIMUM 2009 // r168 -#define PROTOCOL_VERSION_MVD_CURRENT 2010 // r177 +#define MAX_MSGLEN 0x8000 // max length of a message, 32k + +#define PROTOCOL_VERSION_OLD 26 +#define PROTOCOL_VERSION_DEFAULT 34 +#define PROTOCOL_VERSION_R1Q2 35 +#define PROTOCOL_VERSION_Q2PRO 36 +#define PROTOCOL_VERSION_MVD 37 // not used for UDP connections + +#define PROTOCOL_VERSION_R1Q2_MINIMUM 1903 // b6377 +#define PROTOCOL_VERSION_R1Q2_UCMD 1904 // b7387 +#define PROTOCOL_VERSION_R1Q2_LONG_SOLID 1905 // b7759 +#define PROTOCOL_VERSION_R1Q2_CURRENT 1905 // b7387 +#define PROTOCOL_VERSION_Q2PRO_MINIMUM 1011 // r161 +#define PROTOCOL_VERSION_Q2PRO_UCMD 1012 // r179 +#define PROTOCOL_VERSION_Q2PRO_CLIENTNUM_FIX 1013 // r226 +#define PROTOCOL_VERSION_Q2PRO_LONG_SOLID 1014 // r243 +#define PROTOCOL_VERSION_Q2PRO_CURRENT 1014 // r243 +#define PROTOCOL_VERSION_MVD_MINIMUM 2009 // r168 +#define PROTOCOL_VERSION_MVD_CURRENT 2010 // r177 #define R1Q2_SUPPORTED( x ) ( (x) >= PROTOCOL_VERSION_R1Q2_MINIMUM && \ (x) <= PROTOCOL_VERSION_R1Q2_CURRENT ) @@ -47,48 +49,52 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. (x) <= PROTOCOL_VERSION_Q2PRO_CURRENT ) #define MVD_SUPPORTED( x ) ( (x) >= PROTOCOL_VERSION_MVD_MINIMUM && \ - (x) <= PROTOCOL_VERSION_MVD_CURRENT ) + (x) <= PROTOCOL_VERSION_MVD_CURRENT ) + +#define LONG_SOLID_SUPPORTED( major, minor ) \ + ( ( (major) == PROTOCOL_VERSION_Q2PRO && (minor) >= PROTOCOL_VERSION_Q2PRO_LONG_SOLID ) || \ + ( (major) == PROTOCOL_VERSION_R1Q2 && (minor) >= PROTOCOL_VERSION_R1Q2_LONG_SOLID ) ) //========================================= -#define PORT_MASTER 27900 -#define PORT_CLIENT 27901 -#define PORT_SERVER 27910 -#define PORT_MAX_SEARCH 5 +#define PORT_MASTER 27900 +#define PORT_CLIENT 27901 +#define PORT_SERVER 27910 +#define PORT_MAX_SEARCH 5 //========================================= -#define UPDATE_BACKUP 16 // copies of entity_state_t to keep buffered - // must be power of two -#define UPDATE_MASK ( UPDATE_BACKUP - 1 ) +#define UPDATE_BACKUP 16 // copies of entity_state_t to keep buffered + // must be power of two +#define UPDATE_MASK ( UPDATE_BACKUP - 1 ) -#define CMD_BACKUP 128 // allow a lot of command backups for very fast systems - // increased from 64 -#define CMD_MASK ( CMD_BACKUP - 1 ) +#define CMD_BACKUP 128 // allow a lot of command backups for very fast systems + // increased from 64 +#define CMD_MASK ( CMD_BACKUP - 1 ) -#define SVCMD_BITS 5 -#define SVCMD_MASK ( ( 1 << SVCMD_BITS ) - 1 ) +#define SVCMD_BITS 5 +#define SVCMD_MASK ( ( 1 << SVCMD_BITS ) - 1 ) -#define FRAMENUM_BITS 27 -#define FRAMENUM_MASK ( ( 1 << FRAMENUM_BITS ) - 1 ) +#define FRAMENUM_BITS 27 +#define FRAMENUM_MASK ( ( 1 << FRAMENUM_BITS ) - 1 ) -#define SURPRESSCOUNT_BITS 4 -#define SURPRESSCOUNT_MASK ( ( 1 << SURPRESSCOUNT_BITS ) - 1 ) +#define SURPRESSCOUNT_BITS 4 +#define SURPRESSCOUNT_MASK ( ( 1 << SURPRESSCOUNT_BITS ) - 1 ) -#define MAX_PACKET_ENTITIES 128 -#define MAX_PARSE_ENTITIES 2048 // should be MAX_PACKET_ENTITIES * UPDATE_BACKUP -#define PARSE_ENTITIES_MASK ( MAX_PARSE_ENTITIES - 1 ) +#define MAX_PACKET_ENTITIES 128 +#define MAX_PARSE_ENTITIES 2048 // should be MAX_PACKET_ENTITIES * UPDATE_BACKUP +#define PARSE_ENTITIES_MASK ( MAX_PARSE_ENTITIES - 1 ) -#define MAX_PACKET_USERCMDS 32 -#define MAX_PACKET_FRAMES 4 +#define MAX_PACKET_USERCMDS 32 +#define MAX_PACKET_FRAMES 4 -#define MAX_PACKET_STRINGCMDS 8 -#define MAX_PACKET_USERINFOS 8 +#define MAX_PACKET_STRINGCMDS 8 +#define MAX_PACKET_USERINFOS 8 -#define CS_BITMAP_BYTES (MAX_CONFIGSTRINGS/8) // 260 -#define CS_BITMAP_LONGS (CS_BITMAP_BYTES/4) +#define CS_BITMAP_BYTES ( MAX_CONFIGSTRINGS / 8 ) // 260 +#define CS_BITMAP_LONGS ( CS_BITMAP_BYTES / 4 ) #define MVD_MAGIC MakeLong( 'M', 'V', 'D', '2' ) @@ -96,36 +102,36 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. // server to client // typedef enum svc_ops_e { - svc_bad, - - // these ops are known to the game dll - svc_muzzleflash, - svc_muzzleflash2, - svc_temp_entity, - svc_layout, - svc_inventory, - - // the rest are private to the client and server - svc_nop, - svc_disconnect, - svc_reconnect, - svc_sound, // <see code> - svc_print, // [byte] id [string] null terminated string - svc_stufftext, // [string] stuffed into client's console buffer + svc_bad, + + // these ops are known to the game dll + svc_muzzleflash, + svc_muzzleflash2, + svc_temp_entity, + svc_layout, + svc_inventory, + + // the rest are private to the client and server + svc_nop, + svc_disconnect, + svc_reconnect, + svc_sound, // <see code> + svc_print, // [byte] id [string] null terminated string + svc_stufftext, // [string] stuffed into client's console buffer // should be \n terminated - svc_serverdata, // [long] protocol ... - svc_configstring, // [short] [string] - svc_spawnbaseline, - svc_centerprint, // [string] to put in center of the screen - svc_download, // [short] size [size bytes] - svc_playerinfo, // variable - svc_packetentities, // [...] - svc_deltapacketentities, // [...] - svc_frame, - - // r1q2 specific operations - svc_zpacket, - svc_zdownload, + svc_serverdata, // [long] protocol ... + svc_configstring, // [short] [string] + svc_spawnbaseline, + svc_centerprint, // [string] to put in center of the screen + svc_download, // [short] size [size bytes] + svc_playerinfo, // variable + svc_packetentities, // [...] + svc_deltapacketentities, // [...] + svc_frame, + + // r1q2 specific operations + svc_zpacket, + svc_zdownload, svc_gamestate, // q2pro specific, means svc_playerupdate in r1q2 svc_setting, @@ -142,14 +148,14 @@ typedef enum mvd_ops_e { mvd_configstring, mvd_frame, mvd_frame_nodelta, - mvd_unicast, + mvd_unicast, mvd_unicast_r, - mvd_multicast_all, - mvd_multicast_pvs, - mvd_multicast_phs, - mvd_multicast_all_r, - mvd_multicast_pvs_r, - mvd_multicast_phs_r, + mvd_multicast_all, + mvd_multicast_pvs, + mvd_multicast_phs, + mvd_multicast_all_r, + mvd_multicast_pvs_r, + mvd_multicast_phs_r, mvd_sound, mvd_print, // reserved mvd_stufftext, // reserved @@ -163,81 +169,81 @@ typedef enum mvd_ops_e { // client to server // typedef enum clc_ops_e { - clc_bad, - clc_nop, - clc_move, // [usercmd_t] - clc_userinfo, // [userinfo string] - clc_stringcmd, // [string] message - - // r1q2 specific operations - clc_setting, - - // q2pro specific operations - clc_move_nodelta = 10, - clc_move_batched, - clc_userinfo_delta + clc_bad, + clc_nop, + clc_move, // [usercmd_t] + clc_userinfo, // [userinfo string] + clc_stringcmd, // [string] message + + // r1q2 specific operations + clc_setting, + + // q2pro specific operations + clc_move_nodelta = 10, + clc_move_batched, + clc_userinfo_delta } clc_ops_t; //============================================== // player_state_t communication -#define PS_M_TYPE (1<<0) -#define PS_M_ORIGIN (1<<1) -#define PS_M_VELOCITY (1<<2) -#define PS_M_TIME (1<<3) -#define PS_M_FLAGS (1<<4) -#define PS_M_GRAVITY (1<<5) -#define PS_M_DELTA_ANGLES (1<<6) - -#define PS_VIEWOFFSET (1<<7) -#define PS_VIEWANGLES (1<<8) -#define PS_KICKANGLES (1<<9) -#define PS_BLEND (1<<10) -#define PS_FOV (1<<11) -#define PS_WEAPONINDEX (1<<12) -#define PS_WEAPONFRAME (1<<13) -#define PS_RDFLAGS (1<<14) -#define PS_RESERVED (1<<15) - -#define PS_BITS 16 -#define PS_MASK ( ( 1 << PS_BITS ) - 1 ) +#define PS_M_TYPE (1<<0) +#define PS_M_ORIGIN (1<<1) +#define PS_M_VELOCITY (1<<2) +#define PS_M_TIME (1<<3) +#define PS_M_FLAGS (1<<4) +#define PS_M_GRAVITY (1<<5) +#define PS_M_DELTA_ANGLES (1<<6) + +#define PS_VIEWOFFSET (1<<7) +#define PS_VIEWANGLES (1<<8) +#define PS_KICKANGLES (1<<9) +#define PS_BLEND (1<<10) +#define PS_FOV (1<<11) +#define PS_WEAPONINDEX (1<<12) +#define PS_WEAPONFRAME (1<<13) +#define PS_RDFLAGS (1<<14) +#define PS_RESERVED (1<<15) + +#define PS_BITS 16 +#define PS_MASK ( ( 1 << PS_BITS ) - 1 ) // r1q2 protocol specific extra flags -#define EPS_GUNOFFSET (1<<0) -#define EPS_GUNANGLES (1<<1) -#define EPS_M_VELOCITY2 (1<<2) -#define EPS_M_ORIGIN2 (1<<3) -#define EPS_VIEWANGLE2 (1<<4) -#define EPS_STATS (1<<5) +#define EPS_GUNOFFSET (1<<0) +#define EPS_GUNANGLES (1<<1) +#define EPS_M_VELOCITY2 (1<<2) +#define EPS_M_ORIGIN2 (1<<3) +#define EPS_VIEWANGLE2 (1<<4) +#define EPS_STATS (1<<5) // q2pro protocol specific extra flags -#define EPS_CLIENTNUM (1<<6) +#define EPS_CLIENTNUM (1<<6) -#define EPS_BITS 7 -#define EPS_MASK ( ( 1 << EPS_BITS ) - 1 ) +#define EPS_BITS 7 +#define EPS_MASK ( ( 1 << EPS_BITS ) - 1 ) //============================================== // packetized player_state_t communication (MVD specific) -#define PPS_M_TYPE (1<<0) -#define PPS_M_ORIGIN (1<<1) -#define PPS_M_ORIGIN2 (1<<2) - -#define PPS_VIEWOFFSET (1<<3) -#define PPS_VIEWANGLES (1<<4) -#define PPS_VIEWANGLE2 (1<<5) -#define PPS_KICKANGLES (1<<6) -#define PPS_BLEND (1<<7) -#define PPS_FOV (1<<8) -#define PPS_WEAPONINDEX (1<<9) -#define PPS_WEAPONFRAME (1<<10) -#define PPS_GUNOFFSET (1<<11) -#define PPS_GUNANGLES (1<<12) -#define PPS_RDFLAGS (1<<13) -#define PPS_STATS (1<<14) -#define PPS_REMOVE (1<<15) +#define PPS_M_TYPE (1<<0) +#define PPS_M_ORIGIN (1<<1) +#define PPS_M_ORIGIN2 (1<<2) + +#define PPS_VIEWOFFSET (1<<3) +#define PPS_VIEWANGLES (1<<4) +#define PPS_VIEWANGLE2 (1<<5) +#define PPS_KICKANGLES (1<<6) +#define PPS_BLEND (1<<7) +#define PPS_FOV (1<<8) +#define PPS_WEAPONINDEX (1<<9) +#define PPS_WEAPONFRAME (1<<10) +#define PPS_GUNOFFSET (1<<11) +#define PPS_GUNANGLES (1<<12) +#define PPS_RDFLAGS (1<<13) +#define PPS_STATS (1<<14) +#define PPS_REMOVE (1<<15) #define PPS_NUM( ps ) (ps)->pmove.pm_flags #define PPS_INUSE( ps ) (ps)->pmove.pm_time @@ -247,17 +253,17 @@ typedef enum clc_ops_e { // user_cmd_t communication // ms and light always sent, the others are optional -#define CM_ANGLE1 (1<<0) -#define CM_ANGLE2 (1<<1) -#define CM_ANGLE3 (1<<2) -#define CM_FORWARD (1<<3) -#define CM_SIDE (1<<4) -#define CM_UP (1<<5) -#define CM_BUTTONS (1<<6) -#define CM_IMPULSE (1<<7) +#define CM_ANGLE1 (1<<0) +#define CM_ANGLE2 (1<<1) +#define CM_ANGLE3 (1<<2) +#define CM_FORWARD (1<<3) +#define CM_SIDE (1<<4) +#define CM_UP (1<<5) +#define CM_BUTTONS (1<<6) +#define CM_IMPULSE (1<<7) // r1q2 button byte hacks -#define BUTTON_MASK (BUTTON_ATTACK|BUTTON_USE|BUTTON_ANY) +#define BUTTON_MASK (BUTTON_ATTACK|BUTTON_USE|BUTTON_ANY) #define BUTTON_FORWARD 4 #define BUTTON_SIDE 8 #define BUTTON_UP 16 @@ -267,13 +273,13 @@ typedef enum clc_ops_e { //============================================== // a sound without an ent or pos will be a local only sound -#define SND_VOLUME (1<<0) // a byte -#define SND_ATTENUATION (1<<1) // a byte -#define SND_POS (1<<2) // three coordinates -#define SND_ENT (1<<3) // a short 0-2: channel, 3-12: entity -#define SND_OFFSET (1<<4) // a byte, msec offset from frame start +#define SND_VOLUME (1<<0) // a byte +#define SND_ATTENUATION (1<<1) // a byte +#define SND_POS (1<<2) // three coordinates +#define SND_ENT (1<<3) // a short 0-2: channel, 3-12: entity +#define SND_OFFSET (1<<4) // a byte, msec offset from frame start -#define DEFAULT_SOUND_PACKET_VOLUME 1.0 +#define DEFAULT_SOUND_PACKET_VOLUME 1.0 #define DEFAULT_SOUND_PACKET_ATTENUATION 1.0 //============================================== @@ -281,59 +287,63 @@ typedef enum clc_ops_e { // entity_state_t communication // try to pack the common update flags into the first byte -#define U_ORIGIN1 (1<<0) -#define U_ORIGIN2 (1<<1) -#define U_ANGLE2 (1<<2) -#define U_ANGLE3 (1<<3) -#define U_FRAME8 (1<<4) // frame is a byte -#define U_EVENT (1<<5) -#define U_REMOVE (1<<6) // REMOVE this entity, don't add it -#define U_MOREBITS1 (1<<7) // read one additional byte +#define U_ORIGIN1 (1<<0) +#define U_ORIGIN2 (1<<1) +#define U_ANGLE2 (1<<2) +#define U_ANGLE3 (1<<3) +#define U_FRAME8 (1<<4) // frame is a byte +#define U_EVENT (1<<5) +#define U_REMOVE (1<<6) // REMOVE this entity, don't add it +#define U_MOREBITS1 (1<<7) // read one additional byte // second byte -#define U_NUMBER16 (1<<8) // NUMBER8 is implicit if not set -#define U_ORIGIN3 (1<<9) -#define U_ANGLE1 (1<<10) -#define U_MODEL (1<<11) -#define U_RENDERFX8 (1<<12) // fullbright, etc -#define U_EFFECTS8 (1<<14) // autorotate, trails, etc -#define U_MOREBITS2 (1<<15) // read one additional byte +#define U_NUMBER16 (1<<8) // NUMBER8 is implicit if not set +#define U_ORIGIN3 (1<<9) +#define U_ANGLE1 (1<<10) +#define U_MODEL (1<<11) +#define U_RENDERFX8 (1<<12) // fullbright, etc +#define U_EFFECTS8 (1<<14) // autorotate, trails, etc +#define U_MOREBITS2 (1<<15) // read one additional byte // third byte -#define U_SKIN8 (1<<16) -#define U_FRAME16 (1<<17) // frame is a short -#define U_RENDERFX16 (1<<18) // 8 + 16 = 32 -#define U_EFFECTS16 (1<<19) // 8 + 16 = 32 -#define U_MODEL2 (1<<20) // weapons, flags, etc -#define U_MODEL3 (1<<21) -#define U_MODEL4 (1<<22) -#define U_MOREBITS3 (1<<23) // read one additional byte +#define U_SKIN8 (1<<16) +#define U_FRAME16 (1<<17) // frame is a short +#define U_RENDERFX16 (1<<18) // 8 + 16 = 32 +#define U_EFFECTS16 (1<<19) // 8 + 16 = 32 +#define U_MODEL2 (1<<20) // weapons, flags, etc +#define U_MODEL3 (1<<21) +#define U_MODEL4 (1<<22) +#define U_MOREBITS3 (1<<23) // read one additional byte // fourth byte -#define U_OLDORIGIN (1<<24) // FIXME: get rid of this -#define U_SKIN16 (1<<25) -#define U_SOUND (1<<26) -#define U_SOLID (1<<27) +#define U_OLDORIGIN (1<<24) // FIXME: get rid of this +#define U_SKIN16 (1<<25) +#define U_SOUND (1<<26) +#define U_SOLID (1<<27) +#define U_MASK ((1<<28)-1) + +// not sent over the network +#define U_SOLID32 (1<<31) // ============================================================== -#define CLIENTNUM_NONE ( MAX_CLIENTS - 1 ) -#define CLIENTNUM_RESERVED ( MAX_CLIENTS - 1 ) +#define CLIENTNUM_NONE ( MAX_CLIENTS - 1 ) +#define CLIENTNUM_RESERVED ( MAX_CLIENTS - 1 ) typedef enum clientSetting_e { - // r1q2 specific - CLS_NOGUN, - CLS_NOBLEND, - CLS_RECORDING, + // r1q2 specific + CLS_NOGUN, + CLS_NOBLEND, + CLS_RECORDING, CLS_PLAYERUPDATES, CLS_FPS, - // q2pro specific - CLS_NOGIBS = 10, - CLS_NOFOOTSTEPS, - CLS_NOPREDICT, + // q2pro specific + CLS_NOGIBS = 10, + CLS_NOFOOTSTEPS, + CLS_NOPREDICT, - CLS_MAX + CLS_MAX } clientSetting_t; typedef enum serverSetting_e { @@ -344,12 +354,6 @@ typedef enum serverSetting_e { SVS_MAX } serverSetting_t; -typedef enum gametype_e { - GT_SINGLEPLAYER, - GT_COOP, - GT_DEATHMATCH -} gametype_t; - typedef enum { // these are sent by the server FF_SURPRESSED = ( 1 << 0 ), |