ref: 955a62fe39dcc3c475e6a44d50e9f3f62a7b05aa
dir: /protocol.h/
// protocol.h -- communications protocols enum { PROTO_NQ, PROTO_RMQ, PROTO_NUM, }; // these are the only ones supported with RMQ atm enum { PF_RMQ_ANGLE_INT16 = 1<<1, PF_RMQ_COORD_INT32 = 1<<7, }; enum { DEFAULT_ALPHA, ZERO_ALPHA, }; #define defalpha(a) ((a) == DEFAULT_ALPHA || (a) == 0xff) #define zeroalpha(a) (!defalpha(a) && (a) <= ZERO_ALPHA) #define f2alpha(f) ((f) == 0.0 ? DEFAULT_ALPHA : clamp((f)*254+1, 1, 255)) #define alpha2f(a) (zeroalpha(a) ? 0.0 : (float)(a)/255.0) typedef struct protocol_t protocol_t; struct protocol_t { int version; int flags; char *name; // flexible limits - messages change u32int fl_large_entity; int large_entity; u32int fl_large_channel; int large_channel; u32int fl_large_sound; int large_sound; u32int fl_large_frame; int large_frame; u32int fl_large_model; int large_model; u32int fl_large_weaponframe; u32int fl_large_weaponmodel; u32int fl_large_baseline_model; u32int fl_large_baseline_frame; u32int fl_alpha; u32int fl_baseline_alpha; u32int fl_weapon_alpha; u32int fl_baseline_effects; /* FIXME(sigrid): this is absolutely made up and NOT a standard anywhere */ // absolute limits for the protocol int limit_entity; int limit_channel; int limit_model; int limit_frame; int limit_sound; void (*MSG_WriteCoord)(sizebuf_t *sb, float f); void (*MSG_WriteAngle)(sizebuf_t *sb, float f); float (*MSG_ReadCoord)(void); float (*MSG_ReadAngle)(void); void (*MSG_WriteProtocolInfo)(sizebuf_t *sb, protocol_t *proto); void (*MSG_ReadProtocolInfo)(protocol_t *proto); }; extern protocol_t protos[PROTO_NUM]; // defaults for clientinfo messages #define DEFAULT_VIEWHEIGHT 22 // if the high bit of the servercmd is set, the low bits are fast update flags: enum { // game types sent by serverinfo // these determine which intermission screen plays GAME_COOP = 0, GAME_DEATHMATCH, U_MOREBITS = 1<<0, U_ORIGIN1 = 1<<1, U_ORIGIN2 = 1<<2, U_ORIGIN3 = 1<<3, U_ANGLE2 = 1<<4, U_NOLERP = 1<<5, // don't interpolate movement U_FRAME = 1<<6, U_SIGNAL = 1<<7, // just differentiates from other updates // svc_update can pass all of the fast update bits, plus more U_ANGLE1 = 1<<8, U_ANGLE3 = 1<<9, U_MODEL = 1<<10, U_COLORMAP = 1<<11, U_SKIN = 1<<12, U_EFFECTS = 1<<13, U_LONGENTITY = 1<<14, U_MOREBITS2 = 1<<15, // some of the bits here (1<<16…1<<22) are reserved by specific protocols U_MOREBITS3 = 1<<23, SU_VIEWHEIGHT = 1<<0, SU_IDEALPITCH = 1<<1, SU_PUNCH1 = 1<<2, SU_PUNCH2 = 1<<3, SU_PUNCH3 = 1<<4, SU_VELOCITY1 = 1<<5, SU_VELOCITY2 = 1<<6, SU_VELOCITY3 = 1<<7, //SU_AIMENT = 1<<8, AVAILABLE BIT SU_ITEMS = 1<<9, SU_ONGROUND = 1<<10, // no data follows, the bit is it SU_INWATER = 1<<11, // no data follows, the bit is it SU_WEAPONFRAME = 1<<12, SU_ARMOR = 1<<13, SU_WEAPON = 1<<14, SU_MOREBITS = 1<<15, // some of the bits here (1<<16…1<<22) are reserved by specific protocols SU_MOREBITS2 = 1<<23, // a sound with no channel is a local only sound SND_VOLUME = 1<<0, // a byte SND_ATTENUATION = 1<<1, // a byte SND_LOOPING = 1<<2, // a long // server to client svc_bad = 0, svc_nop, svc_disconnect, svc_updatestat, // [byte] [long] svc_version, // [long] server version svc_setview, // [short] entity number svc_sound, // <see code> svc_time, // [float] server time svc_print, // [string] null terminated string svc_stufftext, // [string] stuffed into client's console buffer // the string should be \n terminated svc_setangle, // [angle3] set the view angle to this absolute value svc_serverinfo, // [long] version // [string] signon string // [string]..[0]model cache // [string]...[0]sounds cache svc_lightstyle, // [byte] [string] svc_updatename, // [byte] [string] svc_updatefrags, // [byte] [short] svc_clientdata, // <shortbits + data> svc_stopsound, // <see code> svc_updatecolors, // [byte] [byte] svc_particle, // [vec3] <variable> svc_damage, svc_spawnstatic, svc_spawnbinary, // unused svc_spawnbaseline, svc_temp_entity, svc_setpause, // [byte] on / off svc_signonnum, // [byte] used for the signon sequence svc_centerprint, // [string] to put in center of the screen svc_killedmonster, svc_foundsecret, svc_spawnstaticsound, // [coord3] [byte] samp [byte] vol [byte] aten svc_intermission, // [string] music svc_finale, // [string] music [string] text svc_cdtrack, // [byte] track [byte] looptrack svc_sellscreen, svc_cutscene, // non-NQ stuff svc_spawnbaseline2 = 42, svc_spawnstatic2, svc_spawnstaticsound2, // Nehahra svc_showlmp = 35, // [string] iconlabel [string] lmpfile [byte] x [byte] y svc_hidelmp, // [string] iconlabel svc_skybox, // [string] skyname svc_skyboxsize = 50, // [coord] size svc_fog, // [byte] enabled; if enabled: [float] density [byte] R [byte] G [byte] B // client to server clc_bad = 0, clc_nop, clc_disconnect, clc_move, // [usercmd_t] clc_stringcmd, // [string] message // temp entity events TE_SPIKE = 0, TE_SUPERSPIKE, TE_GUNSHOT, TE_EXPLOSION, TE_TAREXPLOSION, TE_LIGHTNING1, TE_LIGHTNING2, TE_WIZSPIKE, TE_KNIGHTSPIKE, TE_LIGHTNING3, TE_LAVASPLASH, TE_TELEPORT, TE_EXPLOSION2, TE_BEAM, };