X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=protocol.h;h=0d1f87d82fb8c96a7047102cefcd0dda0a20a18f;hb=6f9648053b91bc82a2d0ae0e982ddd9f764b4f75;hp=3950fa499b0cf4f8b4ee258e8bdf7aa15323c930;hpb=dcd2cabc9492a9d4929025e520157c1fa596a26f;p=xonotic%2Fdarkplaces.git diff --git a/protocol.h b/protocol.h index 3950fa49..0d1f87d8 100644 --- a/protocol.h +++ b/protocol.h @@ -22,13 +22,15 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #ifndef PROTOCOL_H #define PROTOCOL_H -#define PROTOCOL_VERSION 15 -#define DPPROTOCOL_VERSION1 96 -#define DPPROTOCOL_VERSION2 97 +#define PROTOCOL_QUAKE 15 +#define PROTOCOL_NEHAHRAMOVIE 250 +#define PROTOCOL_DARKPLACES1 96 +#define PROTOCOL_DARKPLACES2 97 // LordHavoc: I think the 96-99 range was going to run out too soon... // so here I jump to 3500 -#define DPPROTOCOL_VERSION3 3500 -#define DPPROTOCOL_VERSION4 3501 +#define PROTOCOL_DARKPLACES3 3500 +#define PROTOCOL_DARKPLACES4 3501 +#define PROTOCOL_DARKPLACES5 3502 // model effects #define EF_ROCKET 1 // leave a trail @@ -59,6 +61,11 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #define EF_STEP 0x80000000 // internal client use only - present on MOVETYPE_STEP entities, not QC accessible (too many bits) +// flags for the pflags field of entities +#define PFLAGS_NOSHADOW 1 +#define PFLAGS_CORONA 2 +#define PFLAGS_FULLDYNAMIC 128 // must be set or the light fields are ignored + // if the high bit of the servercmd is set, the low bits are fast update flags: #define U_MOREBITS (1<<0) #define U_ORIGIN1 (1<<1) @@ -86,7 +93,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #define U_ALPHA (1<<17) // 1 byte, 0.0-1.0 maps to 0-255, not sent if exactly 1, and the entity is not sent if <=0 unless it has effects (model effects are checked as well) #define U_SCALE (1<<18) // 1 byte, scale / 16 positive, not sent if 1.0 #define U_EFFECTS2 (1<<19) // 1 byte, this is .effects & 0xFF00 (second byte) -#define U_GLOWSIZE (1<<20) // 1 byte, encoding is float/8.0, signed (negative is darklight), not sent if 0 +#define U_GLOWSIZE (1<<20) // 1 byte, encoding is float/4.0, unsigned, not sent if 0 #define U_GLOWCOLOR (1<<21) // 1 byte, palette index, default is 254 (white), this IS used for darklight (allowing colored darklight), however the particles from a darklight are always black, not sent if default value (even if glowsize or glowtrail is set) // LordHavoc: colormod feature has been removed, because no one used it #define U_COLORMOD (1<<22) // 1 byte, 3 bit red, 3 bit green, 2 bit blue, this lets you tint an object artifically, so you could make a red rocket, or a blue fiend... @@ -306,6 +313,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #define RENDER_LOWPRECISION 16 // send as low precision coordinates to save bandwidth #define RENDER_COLORMAPPED 32 #define RENDER_SHADOW 64 // cast shadow +#define RENDER_LIGHT 128 // receive light typedef struct { @@ -318,24 +326,29 @@ typedef struct unsigned short frame; unsigned short effects; unsigned short tagentity; - unsigned short specialvisibilityradius; + unsigned short specialvisibilityradius; // larger if it has effects/light unsigned short viewmodelforclient; unsigned short exteriormodelforclient; unsigned short nodrawtoclient; unsigned short drawonlytoclient; + unsigned short light[4]; // color*256 (0.00 to almost 64.00), and radius*1 + qbyte lightstyle; + qbyte lightpflags; qbyte colormap; - qbyte skin; + qbyte skin; // also chooses cubemap for rtlights if there is no model qbyte alpha; qbyte scale; qbyte glowsize; qbyte glowcolor; qbyte flags; qbyte tagindex; + // padding to a multiple of 8 bytes (to align the double time) + qbyte unused[6]; } entity_state_t; /* -DPPROTOCOL_VERSION3 +PROTOCOL_DARKPLACES3 server updates entities according to some (unmentioned) scheme. a frame consists of all visible entities, some of which are up to date, @@ -367,7 +380,7 @@ if server receives ack message in put packet it performs these steps: */ /* -DPPROTOCOL_VERSION4 +PROTOCOL_DARKPLACES4 a frame consists of some visible entities in a range (this is stored as start and end, note that end may be less than start if it wrapped). these entities are stored in a range (firstentity/endentity) of structs in the entitydata[] buffer. @@ -470,20 +483,23 @@ entity_frame_t; #define E_EFFECTS2 (1<<18) #define E_GLOWSIZE (1<<19) #define E_GLOWCOLOR (1<<20) -#define E_UNUSED1 (1<<21) -#define E_UNUSED2 (1<<22) +#define E_LIGHT (1<<21) +#define E_LIGHTPFLAGS (1<<22) #define E_EXTEND3 (1<<23) #define E_SOUND1 (1<<24) #define E_SOUNDVOL (1<<25) #define E_SOUNDATTEN (1<<26) #define E_TAGATTACHMENT (1<<27) -#define E_UNUSED5 (1<<28) +#define E_LIGHTSTYLE (1<<28) #define E_UNUSED6 (1<<29) #define E_UNUSED7 (1<<30) #define E_EXTEND4 (1<<31) +// clears a state to baseline values void ClearStateToDefault(entity_state_t *s); +// used by some of the DP protocols +void EntityState_Write(entity_state_t *ent, sizebuf_t *msg, entity_state_t *delta); // (server) clears the database to contain no frames (thus delta compression // compresses against nothing) @@ -531,11 +547,21 @@ typedef struct entity_database4_s // commits waiting to be applied to the reference database when confirmed // (commit[i]->numentities == 0 means it is empty) entity_database4_commit_t commit[MAX_ENTITY_HISTORY]; - // used only while building a commit + // (server only) the current commit being worked on entity_database4_commit_t *currentcommit; + // (server only) if a commit won't fit entirely, continue where it left + // off next frame + int currententitynumber; + // (client only) most recently received frame number to be sent in next + // input update + int ackframenum; } entity_database4_t; +// should-be-private functions that aren't +entity_state_t *EntityFrame4_GetReferenceEntity(entity_database4_t *d, int number); +void EntityFrame4_AddCommitEntity(entity_database4_t *d, entity_state_t *s); + // allocate a database entity_database4_t *EntityFrame4_AllocDatabase(mempool_t *pool); // free a database @@ -543,18 +569,16 @@ void EntityFrame4_FreeDatabase(entity_database4_t *d); // reset a database (resets compression but does not reallocate anything) void EntityFrame4_ResetDatabase(entity_database4_t *d); // updates database to account for a frame-received acknowledgment -void EntityFrame4_AckFrame(entity_database4_t *d, int framenum); +int EntityFrame4_AckFrame(entity_database4_t *d, int framenum); -// begin writing a frame -void EntityFrame4_SV_WriteFrame_Begin(entity_database4_t *d, sizebuf_t *msg, int framenum); // write an entity in the frame // returns false if full int EntityFrame4_SV_WriteFrame_Entity(entity_database4_t *d, sizebuf_t *msg, int maxbytes, entity_state_t *s); -// end writing a frame -void EntityFrame4_SV_WriteFrame_End(entity_database4_t *d, sizebuf_t *msg); // reads a frame from the network stream void EntityFrame4_CL_ReadFrame(entity_database4_t *d); +extern cvar_t developer_networkentities; + #endif