]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - protocol.h
Redesigned TaskQueue to have a queue and distributor model so that threads can keep...
[xonotic/darkplaces.git] / protocol.h
index 8cb06002419da7f79652484bb2456dcb1d92b349..8770d82be5ce3bc11d94f590cb084696329750a9 100644 (file)
@@ -49,21 +49,21 @@ void Protocol_Names(char *buffer, size_t buffersize);
 #define EF_ADDITIVE                            32
 #define EF_BLUE                                        64
 #define EF_RED                                 128
-#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_NOGUNBOB                            256                     // LadyHavoc: 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                     // LadyHavoc: fullbright
+#define EF_FLAME                               1024            // LadyHavoc: on fire
+#define EF_STARDUST                            2048            // LadyHavoc: showering sparks
+#define EF_NOSHADOW                            4096            // LadyHavoc: does not cast a shadow
+#define EF_NODEPTHTEST                 8192            // LadyHavoc: shows through walls
+#define EF_SELECTABLE                  16384           // LadyHavoc: highlights when PRYDON_CLIENTCURSOR mouse is over it
 #define EF_DOUBLESIDED                 32768           //[515]: disable cull face for this entity
-#define EF_UNUSED16                            65536
-#define EF_UNUSED17                            131072
+#define EF_NOSELFSHADOW                        65536           // LadyHavoc: 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_UNUSED20                            1048576
-#define EF_UNUSED21                            2197152
-#define EF_LOWPRECISION                        4194304         // LordHavoc: entity is low precision (integer coordinates) to save network bandwidth  (serverside only)
+#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         // LadyHavoc: 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
@@ -89,7 +89,7 @@ void Protocol_Names(char *buffer, size_t buffersize);
 #define U_ORIGIN2              (1<<2)
 #define U_ORIGIN3              (1<<3)
 #define U_ANGLE2               (1<<4)
-// LordHavoc: U_NOLERP was only ever used for monsters, so I renamed it U_STEP
+// LadyHavoc: U_NOLERP was only ever used for monsters, so I renamed it U_STEP
 #define U_STEP                 (1<<5)
 #define U_FRAME                        (1<<6)
 // just differentiates from other updates
@@ -103,9 +103,9 @@ void Protocol_Names(char *buffer, size_t buffersize);
 #define U_EFFECTS              (1<<13)
 #define U_LONGENTITY   (1<<14)
 
-// LordHavoc: protocol extension
+// LadyHavoc: protocol extension
 #define U_EXTEND1              (1<<15)
-// LordHavoc: first extend byte
+// LadyHavoc: first extend byte
 #define U_DELTA                        (1<<16) // no data, while this is set the entity is delta compressed (uses previous frame as a baseline, meaning only things that have changed from the previous frame are sent, except for the forced full update every half second)
 #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
@@ -114,7 +114,7 @@ void Protocol_Names(char *buffer, size_t buffersize);
 #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)
 #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...
 #define U_EXTEND2              (1<<23) // another byte to follow
-// LordHavoc: second extend byte
+// LadyHavoc: second extend byte
 #define U_GLOWTRAIL            (1<<24) // leaves a trail of particles (of color .glowcolor, or black if it is a negative glowsize)
 #define U_VIEWMODEL            (1<<25) // attachs the model to the view (origin and angles become relative to it), only shown to owner, a more powerful alternative to .weaponmodel and such
 #define U_FRAME2               (1<<26) // 1 byte, this is .frame & 0xFF00 (second byte)
@@ -165,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
@@ -238,7 +239,7 @@ 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-69
+// LadyHavoc: 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
@@ -263,7 +264,7 @@ void Protocol_Names(char *buffer, size_t buffersize);
 #define        clc_move                3                       // [usercmd_t]
 #define        clc_stringcmd   4               // [string] message
 
-// LordHavoc: my clc_ range, 50-59
+// LadyHavoc: my clc_ range, 50-59
 #define clc_ackframe   50              // [int] framenumber
 #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
@@ -300,7 +301,7 @@ void Protocol_Names(char *buffer, size_t buffersize);
 #define        TE_EXPLOSION3           16 // [vector] origin [coord] red [coord] green [coord] blue
 #define TE_LIGHTNING4NEH       17 // [string] model [entity] entity [vector] start [vector] end
 
-// LordHavoc: added some TE_ codes (block1 - 50-60)
+// LadyHavoc: added some TE_ codes (block1 - 50-60)
 #define        TE_BLOOD                        50 // [vector] origin [byte] xvel [byte] yvel [byte] zvel [byte] count
 #define        TE_SPARK                        51 // [vector] origin [byte] xvel [byte] yvel [byte] zvel [byte] count
 #define        TE_BLOODSHOWER          52 // [vector] min [vector] max [coord] explosionspeed [short] count
@@ -311,14 +312,14 @@ void Protocol_Names(char *buffer, size_t buffersize);
 #define TE_GUNSHOTQUAD         57 // [vector] origin
 #define TE_SPIKEQUAD           58 // [vector] origin
 #define TE_SUPERSPIKEQUAD      59 // [vector] origin
-// LordHavoc: block2 - 70-80
+// LadyHavoc: block2 - 70-80
 #define TE_EXPLOSIONQUAD       70 // [vector] origin
 #define        TE_UNUSED1                      71 // unused
 #define TE_SMALLFLASH          72 // [vector] origin
 #define TE_CUSTOMFLASH         73 // [vector] origin [byte] radius / 8 - 1 [byte] lifetime / 256 - 1 [byte] red [byte] green [byte] blue
 #define TE_FLAMEJET                    74 // [vector] origin [vector] velocity [byte] count
 #define TE_PLASMABURN          75 // [vector] origin
-// LordHavoc: Tei grabbed these codes
+// LadyHavoc: Tei grabbed these codes
 #define TE_TEI_G3                      76 // [vector] start [vector] end [vector] angles
 #define TE_TEI_SMOKE           77 // [vector] origin [vector] dir [byte] count
 #define TE_TEI_BIGEXPLOSION    78 // [vector] origin
@@ -332,12 +333,50 @@ 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_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_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 96 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
@@ -356,6 +395,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;
@@ -370,8 +410,10 @@ typedef struct entity_state_s
        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[5];
+       unsigned char glowmod[3];
+       // LadyHavoc: very big data here :(
+       framegroupblend_t framegroupblend[4];
+       skeleton_t skeletonobject;
 }
 entity_state_t;
 
@@ -388,7 +430,7 @@ void Protocol_UpdateClientStats(const int *stats);
 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 maxsize, 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);
 
@@ -502,7 +544,7 @@ typedef struct entityframe_database_s
 }
 entityframe_database_t;
 
-// LordHavoc: these are in approximately sorted order, according to cost and
+// LadyHavoc: these are in approximately sorted order, according to cost and
 // likelyhood of being used for numerous objects in a frame
 
 // note that the bytes are not written/read in this order, this is only the
@@ -573,11 +615,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, int maxsize, 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
@@ -631,7 +674,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, int maxsize, 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);
 
@@ -697,12 +740,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
@@ -788,7 +836,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, int maxsize, entityframe5_database_t *d, int numstates, const entity_state_t *states, int viewentnum, 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;
 
@@ -967,5 +1015,9 @@ 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