X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fdarkplaces.git;a=blobdiff_plain;f=protocol.h;h=a3a267774ecfd1ce120068f1e00bc53166af1637;hp=20f655d8f63a031e07601838aff5e10cce00a292;hb=46a67647b115154668877ed632b38d95aac7066d;hpb=b84125ed0d5fc6922a9ea18b7762b489e377175d diff --git a/protocol.h b/protocol.h index 20f655d8..a3a26777 100644 --- a/protocol.h +++ b/protocol.h @@ -31,14 +31,15 @@ int Protocol_NumberForEnum(protocolversion_t p); void Protocol_Names(char *buffer, size_t buffersize); // model effects -#define EF_ROCKET 1 // leave a trail -#define EF_GRENADE 2 // leave a trail -#define EF_GIB 4 // leave a trail -#define EF_ROTATE 8 // rotate (bonus items) -#define EF_TRACER 16 // green split trail -#define EF_ZOMGIB 32 // small blood trail -#define EF_TRACER2 64 // orange split trail + rotate -#define EF_TRACER3 128 // purple trail +#define MF_ROCKET 1 // leave a trail +#define MF_GRENADE 2 // leave a trail +#define MF_GIB 4 // leave a trail +#define MF_ROTATE 8 // rotate (bonus items) +#define MF_TRACER 16 // green split trail +#define MF_ZOMGIB 32 // small blood trail +#define MF_TRACER2 64 // orange split trail + rotate +#define MF_TRACER3 128 // purple trail + // entity effects #define EF_BRIGHTFIELD 1 #define EF_MUZZLEFLASH 2 @@ -48,19 +49,34 @@ void Protocol_Names(char *buffer, size_t buffersize); #define EF_ADDITIVE 32 #define EF_BLUE 64 #define EF_RED 128 -#define EF_DELTA 8388608 // LordHavoc: (obsolete) entity is delta compressed to save network bandwidth (no longer used) -#define EF_LOWPRECISION 4194304 // LordHavoc: entity is low precision (integer coordinates) to save network bandwidth -// effects/model (can be used as model flags or entity effects) -#define EF_REFLECTIVE 256 // LordHavoc: shiny metal objects :) (not currently supported) -#define EF_FULLBRIGHT 512 // LordHavoc: fullbright -#define EF_FLAME 1024 // LordHavoc: on fire -#define EF_STARDUST 2048 // LordHavoc: showering sparks -#define EF_NOSHADOW 4096 // LordHavoc: does not cast a shadow -#define EF_NODEPTHTEST 8192 // LordHavoc: shows through walls -#define EF_SELECTABLE 16384 // LordHavoc: highlights when PRYDON_CLIENTCURSOR mouse is over it -#define EF_DOUBLESIDED 32768 //[515]: disable cull face for this entity - -#define EF_STEP 0x80000000 // internal client use only - present on MOVETYPE_STEP entities, not QC accessible (too many bits) +#define EF_NOGUNBOB 256 // LordHavoc: when used with .viewmodelforclient this makes the entity attach to the view without gun bobbing and such effects, it also works on the player entity to disable gun bobbing of the engine-managed .viewmodel (without affecting any .viewmodelforclient entities attached to the player) +#define EF_FULLBRIGHT 512 // LordHavoc: fullbright +#define EF_FLAME 1024 // LordHavoc: on fire +#define EF_STARDUST 2048 // LordHavoc: showering sparks +#define EF_NOSHADOW 4096 // LordHavoc: does not cast a shadow +#define EF_NODEPTHTEST 8192 // LordHavoc: shows through walls +#define EF_SELECTABLE 16384 // LordHavoc: highlights when PRYDON_CLIENTCURSOR mouse is over it +#define EF_DOUBLESIDED 32768 //[515]: disable cull face for this entity +#define EF_NOSELFSHADOW 65536 // LordHavoc: does not cast a shadow on itself (or any other EF_NOSELFSHADOW entities) +#define EF_DYNAMICMODELLIGHT 131072 +#define EF_UNUSED18 262144 +#define EF_UNUSED19 524288 +#define EF_RESTARTANIM_BIT 1048576 // div0: restart animation bit (like teleport bit, but lerps between end and start of the anim, and doesn't stop player lerping) +#define EF_TELEPORT_BIT 2097152 // div0: teleport bit (toggled when teleporting, prevents lerping when the bit has changed) +#define EF_LOWPRECISION 4194304 // LordHavoc: entity is low precision (integer coordinates) to save network bandwidth (serverside only) +#define EF_NOMODELFLAGS 8388608 // indicates the model's .effects should be ignored (allows overriding them) +#define EF_ROCKET 16777216 // leave a trail +#define EF_GRENADE 33554432 // leave a trail +#define EF_GIB 67108864 // leave a trail +#define EF_ROTATE 134217728 // rotate (bonus items) +#define EF_TRACER 268435456 // green split trail +#define EF_ZOMGIB 536870912 // small blood trail +#define EF_TRACER2 1073741824 // orange split trail + rotate +#define EF_TRACER3 0x80000000 // purple trail + +// internaleffects bits (no overlap with EF_ bits): +#define INTEF_FLAG1QW 1 +#define INTEF_FLAG2QW 2 // flags for the pflags field of entities #define PFLAGS_NOSHADOW 1 @@ -149,6 +165,7 @@ void Protocol_Names(char *buffer, size_t buffersize); #define SND_LOOPING (1<<2) // a long #define SND_LARGEENTITY (1<<3) // a short and a byte (instead of a short) #define SND_LARGESOUND (1<<4) // a short (instead of a byte) +#define SND_SPEEDUSHORT4000 (1<<5) // ushort speed*4000 (speed is usually 1.0, a value of 0.0 is the same as 1.0) // defaults for clientinfo messages @@ -222,8 +239,8 @@ void Protocol_Names(char *buffer, size_t buffersize); #define svc_hidelmp 36 // [string] slotname #define svc_skybox 37 // [string] skyname -// LordHavoc: my svc_ range, 50-59 -#define svc_cgame 50 // [short] length [bytes] data +// LordHavoc: my svc_ range, 50-69 +#define svc_downloaddata 50 // [int] start [short] size #define svc_updatestatubyte 51 // [byte] stat [byte] value #define svc_effect 52 // [vector] org [byte] modelindex [byte] startframe [byte] framecount [byte] framerate #define svc_effect2 53 // [vector] org [short] modelindex [short] startframe [byte] framecount [byte] framerate @@ -234,6 +251,9 @@ void Protocol_Names(char *buffer, size_t buffersize); #define svc_entities 57 // [int] deltaframe [int] thisframe [float vector] eye [variable length] entitydata #define svc_csqcentities 58 // [short] entnum [variable length] entitydata ... [short] 0x0000 #define svc_spawnstaticsound2 59 // [coord3] [short] samp [byte] vol [byte] aten +#define svc_trailparticles 60 // [short] entnum [short] effectnum [vector] start [vector] end +#define svc_pointparticles 61 // [short] effectnum [vector] start [vector] velocity [short] count +#define svc_pointparticles1 62 // [short] effectnum [vector] start, same as svc_pointparticles except velocity is zero and count is 1 // // client to server @@ -246,7 +266,7 @@ void Protocol_Names(char *buffer, size_t buffersize); // LordHavoc: my clc_ range, 50-59 #define clc_ackframe 50 // [int] framenumber -#define clc_unusedlh1 51 +#define clc_ackdownloaddata 51 // [int] start [short] size (note: exact echo of latest values received in svc_downloaddata, packet-loss handling is in the server) #define clc_unusedlh2 52 #define clc_unusedlh3 53 #define clc_unusedlh4 54 @@ -313,21 +333,61 @@ void Protocol_Names(char *buffer, size_t buffersize); #define RENDER_EXTERIORMODEL 8 #define RENDER_LOWPRECISION 16 // send as low precision coordinates to save bandwidth #define RENDER_COLORMAPPED 32 +#define RENDER_WORLDOBJECT 64 // do not cull this entity with r_cullentities +#define RENDER_COMPLEXANIMATION 128 + #define RENDER_SHADOW 65536 // cast shadow #define RENDER_LIGHT 131072 // receive light -#define RENDER_TRANSPARENT 262144 // can't light during opaque stage -#define RENDER_NOCULLFACE 524288 // render as double sided (disable GL_CULL_FACE) +#define RENDER_NOSELFSHADOW 262144 // render lighting on this entity before its own shadow is added to the scene +// (note: all RENDER_NOSELFSHADOW entities are grouped together and rendered in a batch before their shadows are rendered, so they can not shadow eachother either) +#define RENDER_EQUALIZE 524288 // (subflag of RENDER_LIGHT) equalize the light from the light grid hitting this ent (less invasive EF_FULLBRIGHT implementation) +#define RENDER_NODEPTHTEST 1048576 +#define RENDER_ADDITIVE 2097152 +#define RENDER_DOUBLESIDED 4194304 +#define RENDER_CUSTOMIZEDMODELLIGHT 4096 +#define RENDER_DYNAMICMODELLIGHT 8388608 // origin dependent model light + +#define MAX_FRAMEGROUPBLENDS 4 +typedef struct framegroupblend_s +{ + // animation number and blend factor + // (for most models this is the frame number) + int frame; + float lerp; + // time frame began playing (for framegroup animations) + double start; +} +framegroupblend_t; + +struct matrix4x4_s; +struct model_s; + +typedef struct skeleton_s +{ + const struct model_s *model; + struct matrix4x4_s *relativetransforms; +} +skeleton_t; -// this is 88 bytes +typedef enum entity_state_active_e +{ + ACTIVE_NOT = 0, + ACTIVE_NETWORK = 1, + ACTIVE_SHARED = 2 +} +entity_state_active_t; + +// this was 96 bytes, now 168 bytes (32bit) or 176 bytes (64bit) typedef struct entity_state_s { // ! means this is not sent to client double time; // ! time this state was built (used on client for interpolation) + float netcenter[3]; // ! for network prioritization, this is the center of the bounding box (which may differ from the origin) float origin[3]; float angles[3]; - int number; // entity number this state is for int effects; unsigned int customizeentityforclient; // ! + unsigned short number; // entity number this state is for unsigned short modelindex; unsigned short frame; unsigned short tagentity; @@ -336,6 +396,7 @@ typedef struct entity_state_s unsigned short exteriormodelforclient; // ! not shown if first person viewing from this entity, shown in all other cases unsigned short nodrawtoclient; // ! unsigned short drawonlytoclient; // ! + unsigned short traileffectnum; unsigned short light[4]; // color*256 (0.00 to 255.996), and radius*1 unsigned char active; // true if a valid state unsigned char lightstyle; @@ -347,10 +408,13 @@ typedef struct entity_state_s unsigned char glowsize; unsigned char glowcolor; unsigned char flags; + unsigned char internaleffects; // INTEF_FLAG1QW and so on unsigned char tagindex; unsigned char colormod[3]; - // padding to a multiple of 8 bytes (to align the double time) - unsigned char unused[6]; + unsigned char glowmod[3]; + // LordHavoc: very big data here :( + framegroupblend_t framegroupblend[4]; + skeleton_t skeletonobject; } entity_state_t; @@ -358,9 +422,16 @@ entity_state_t; extern entity_state_t defaultstate; // reads a quake entity from the network stream void EntityFrameQuake_ReadEntity(int bits); +// checks for stats changes and sets corresponding host_client->statsdeltabits +// (also updates host_client->stats array) +void Protocol_UpdateClientStats(const int *stats); +// writes reliable messages updating stats (not used by DP6 and later +// protocols which send updates in their WriteFrame function using a different +// method of reliable messaging) +void Protocol_WriteStatsReliable(void); // writes a list of quake entities to the network stream // (or as many will fit) -void EntityFrameQuake_WriteFrame(sizebuf_t *msg, int numstates, const entity_state_t *states); +qboolean EntityFrameQuake_WriteFrame(sizebuf_t *msg, int maxsize, int numstates, const entity_state_t **states); // cleans up dead entities each frame after ReadEntity (which doesn't clear unused entities) void EntityFrameQuake_ISeeDeadEntities(void); @@ -421,6 +492,22 @@ the Write function performs these steps: server updates entities in looping ranges, a frame consists of a range of visible entities (not always all visible entities), */ +#define MAX_ENTITY_HISTORY 64 +#define MAX_ENTITY_DATABASE (MAX_EDICTS * 2) + +// build entity data in this, to pass to entity read/write functions +typedef struct entity_frame_s +{ + double time; + int framenum; + int numentities; + int firstentitynum; + int lastentitynum; + vec3_t eye; + entity_state_t entitydata[MAX_ENTITY_DATABASE]; +} +entity_frame_t; + typedef struct entity_frameinfo_s { double time; @@ -430,9 +517,6 @@ typedef struct entity_frameinfo_s } entity_frameinfo_t; -#define MAX_ENTITY_HISTORY 64 -#define MAX_ENTITY_DATABASE (MAX_EDICTS * 2) - typedef struct entityframe_database_s { // note: these can be far out of range, modulo with MAX_ENTITY_DATABASE to get a valid range (which may wrap) @@ -454,21 +538,12 @@ typedef struct entityframe_database_s entity_frameinfo_t frames[MAX_ENTITY_HISTORY]; // entities entity_state_t entitydata[MAX_ENTITY_DATABASE]; -} -entityframe_database_t; -// build entity data in this, to pass to entity read/write functions -typedef struct entity_frame_s -{ - double time; - int framenum; - int numentities; - int firstentitynum; - int lastentitynum; - vec3_t eye; - entity_state_t entitydata[MAX_ENTITY_DATABASE]; + // structs for building new frames and reading them + entity_frame_t deltaframe; + entity_frame_t framedata; } -entity_frame_t; +entityframe_database_t; // LordHavoc: these are in approximately sorted order, according to cost and // likelyhood of being used for numerous objects in a frame @@ -541,11 +616,12 @@ void EntityFrame_AckFrame(entityframe_database_t *d, int frame); void EntityFrame_Clear(entity_frame_t *f, vec3_t eye, int framenum); // (server and client) reads a frame from the database void EntityFrame_FetchFrame(entityframe_database_t *d, int framenum, entity_frame_t *f); -// (server and client) adds a entity_frame to the database, for future -// reference -void EntityFrame_AddFrame(entityframe_database_t *d, vec3_t eye, int framenum, int numentities, const entity_state_t *entitydata); +// (client) adds a entity_frame to the database, for future reference +void EntityFrame_AddFrame_Client(entityframe_database_t *d, vec3_t eye, int framenum, int numentities, const entity_state_t *entitydata); +// (server) adds a entity_frame to the database, for future reference +void EntityFrame_AddFrame_Server(entityframe_database_t *d, vec3_t eye, int framenum, int numentities, const entity_state_t **entitydata); // (server) writes a frame to network stream -void EntityFrame_WriteFrame(sizebuf_t *msg, entityframe_database_t *d, int numstates, const entity_state_t *states, int viewentnum); +qboolean EntityFrame_WriteFrame(sizebuf_t *msg, int maxsize, entityframe_database_t *d, int numstates, const entity_state_t **states, int viewentnum); // (client) reads a frame from network stream void EntityFrame_CL_ReadFrame(void); // (client) returns the frame number of the most recent frame recieved @@ -599,7 +675,7 @@ void EntityFrame4_ResetDatabase(entityframe4_database_t *d); // updates database to account for a frame-received acknowledgment int EntityFrame4_AckFrame(entityframe4_database_t *d, int framenum, int servermode); // writes a frame to the network stream -void EntityFrame4_WriteFrame(sizebuf_t *msg, entityframe4_database_t *d, int numstates, const entity_state_t *states); +qboolean EntityFrame4_WriteFrame(sizebuf_t *msg, int maxsize, entityframe4_database_t *d, int numstates, const entity_state_t **states); // reads a frame from the network stream void EntityFrame4_CL_ReadFrame(void); @@ -665,12 +741,17 @@ void EntityFrame4_CL_ReadFrame(void); // bits >= (1<<24) #define E5_EXTEND3 (1<<23) -// unused -#define E5_UNUSED24 (1<<24) -// unused -#define E5_UNUSED25 (1<<25) -// unused -#define E5_UNUSED26 (1<<26) +// byte[3] = s->glowmod[0], s->glowmod[1], s->glowmod[2] +#define E5_GLOWMOD (1<<24) +// byte type=0 short frames[1] short times[1] +// byte type=1 short frames[2] short times[2] byte lerps[2] +// byte type=2 short frames[3] short times[3] byte lerps[3] +// byte type=3 short frames[4] short times[4] byte lerps[4] +// byte type=4 short modelindex byte numbones {short pose7s[7]} +// see also RENDER_COMPLEXANIMATION +#define E5_COMPLEXANIMATION (1<<25) +// ushort traileffectnum +#define E5_TRAILEFFECTNUM (1<<26) // unused #define E5_UNUSED27 (1<<27) // unused @@ -684,6 +765,7 @@ void EntityFrame4_CL_ReadFrame(void); #define ENTITYFRAME5_MAXPACKETLOGS 64 #define ENTITYFRAME5_MAXSTATES 1024 +#define ENTITYFRAME5_PRIORITYLEVELS 32 typedef struct entityframe5_changestate_s { @@ -729,10 +811,6 @@ typedef struct entityframe5_database_s // (derived from states) unsigned char *visiblebits; // [(maxedicts+7)/8] - // delta compression of stats - unsigned char statsdeltabits[(MAX_CL_STATS+7)/8]; - int stats[MAX_CL_STATS]; - // old notes // this is used to decide which changestates to set each frame @@ -745,6 +823,10 @@ typedef struct entityframe5_database_s // rather than a memmove to remove them from the start. //int numchangestates; //entityframe5_changestate_t changestates[MAX_EDICTS]; + + // buffers for building priority info + int prioritychaincounts[ENTITYFRAME5_PRIORITYLEVELS]; + unsigned short prioritychains[ENTITYFRAME5_PRIORITYLEVELS][ENTITYFRAME5_MAXSTATES]; } entityframe5_database_t; @@ -755,7 +837,7 @@ int EntityState5_DeltaBitsForState(entity_state_t *o, entity_state_t *n); void EntityFrame5_CL_ReadFrame(void); void EntityFrame5_LostFrame(entityframe5_database_t *d, int framenum); void EntityFrame5_AckFrame(entityframe5_database_t *d, int framenum); -void EntityFrame5_WriteFrame(sizebuf_t *msg, entityframe5_database_t *d, int numstates, const entity_state_t *states, int viewentnum, int *stats, int movesequence); +qboolean EntityFrame5_WriteFrame(sizebuf_t *msg, int maxsize, entityframe5_database_t *d, int numstates, const entity_state_t **states, int viewentnum, unsigned int movesequence, qboolean need_empty); extern cvar_t developer_networkentities; @@ -818,19 +900,19 @@ extern cvar_t developer_networkentities; #define qw_clc_upload 7 // teleport request, spectator only // QUAKEWORLD // playerinfo flags from server -// playerinfo allways sends: playernum, flags, origin[] and framenumber -#define PF_MSEC (1<<0) -#define PF_COMMAND (1<<1) -#define PF_VELOCITY1 (1<<2) -#define PF_VELOCITY2 (1<<3) -#define PF_VELOCITY3 (1<<4) -#define PF_MODEL (1<<5) -#define PF_SKINNUM (1<<6) -#define PF_EFFECTS (1<<7) -#define PF_WEAPONFRAME (1<<8) // only sent for view player -#define PF_DEAD (1<<9) // don't block movement any more -#define PF_GIB (1<<10) // offset the view height differently -#define PF_NOGRAV (1<<11) // don't apply gravity for prediction +// playerinfo always sends: playernum, flags, origin[] and framenumber +#define QW_PF_MSEC (1<<0) +#define QW_PF_COMMAND (1<<1) +#define QW_PF_VELOCITY1 (1<<2) +#define QW_PF_VELOCITY2 (1<<3) +#define QW_PF_VELOCITY3 (1<<4) +#define QW_PF_MODEL (1<<5) +#define QW_PF_SKINNUM (1<<6) +#define QW_PF_EFFECTS (1<<7) +#define QW_PF_WEAPONFRAME (1<<8) // only sent for view player +#define QW_PF_DEAD (1<<9) // don't block movement any more +#define QW_PF_GIB (1<<10) // offset the view height differently +#define QW_PF_NOGRAV (1<<11) // don't apply gravity for prediction // QUAKEWORLD // if the high bit of the client to server byte is set, the low bits are // client move cmd bits @@ -877,6 +959,66 @@ extern cvar_t developer_networkentities; #define QW_TE_TELEPORT 11 #define QW_TE_BLOOD 12 #define QW_TE_LIGHTNINGBLOOD 13 +// QUAKEWORLD +// effect flags +#define QW_EF_BRIGHTFIELD 1 +#define QW_EF_MUZZLEFLASH 2 +#define QW_EF_BRIGHTLIGHT 4 +#define QW_EF_DIMLIGHT 8 +#define QW_EF_FLAG1 16 +#define QW_EF_FLAG2 32 +#define QW_EF_BLUE 64 +#define QW_EF_RED 128 + +#define QW_UPDATE_BACKUP 64 +#define QW_UPDATE_MASK (QW_UPDATE_BACKUP - 1) +#define QW_MAX_PACKET_ENTITIES 64 + +// note: QW stats are directly compatible with NQ +// (but FRAGS, WEAPONFRAME, and VIEWHEIGHT are unused) +// so these defines are not actually used by darkplaces, but kept for reference +#define QW_STAT_HEALTH 0 +//#define QW_STAT_FRAGS 1 +#define QW_STAT_WEAPON 2 +#define QW_STAT_AMMO 3 +#define QW_STAT_ARMOR 4 +//#define QW_STAT_WEAPONFRAME 5 +#define QW_STAT_SHELLS 6 +#define QW_STAT_NAILS 7 +#define QW_STAT_ROCKETS 8 +#define QW_STAT_CELLS 9 +#define QW_STAT_ACTIVEWEAPON 10 +#define QW_STAT_TOTALSECRETS 11 +#define QW_STAT_TOTALMONSTERS 12 +#define QW_STAT_SECRETS 13 // bumped on client side by svc_foundsecret +#define QW_STAT_MONSTERS 14 // bumped by svc_killedmonster +#define QW_STAT_ITEMS 15 +//#define QW_STAT_VIEWHEIGHT 16 + +// build entity data in this, to pass to entity read/write functions +typedef struct entityframeqw_snapshot_s +{ + double time; + qboolean invalid; + int num_entities; + entity_state_t entities[QW_MAX_PACKET_ENTITIES]; +} +entityframeqw_snapshot_t; + +typedef struct entityframeqw_database_s +{ + entityframeqw_snapshot_t snapshot[QW_UPDATE_BACKUP]; +} +entityframeqw_database_t; + +entityframeqw_database_t *EntityFrameQW_AllocDatabase(mempool_t *pool); +void EntityFrameQW_FreeDatabase(entityframeqw_database_t *d); +void EntityStateQW_ReadPlayerUpdate(void); +void EntityFrameQW_CL_ReadFrame(qboolean delta); + +struct client_s; +void EntityFrameCSQC_LostFrame(struct client_s *client, int framenum); +qboolean EntityFrameCSQC_WriteFrame (sizebuf_t *msg, int maxsize, int numnumbers, const unsigned short *numbers, int framenum); #endif