#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_UNUSED16 65536
+#define EF_NOSELFSHADOW 65536 // LordHavoc: does not cast a shadow on itself (or any other EF_NOSELFSHADOW entities)
#define EF_UNUSED17 131072
#define EF_UNUSED18 262144
#define EF_UNUSED19 524288
#define EF_UNUSED20 1048576
-#define EF_UNUSED21 2197152
+#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 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 (PROTOCOL_DARKPLACES8)
+#define svc_pointparticles1 62 // [short] effectnum [vector] start, same as svc_pointparticles except velocity is zero and count is 1
//
// client to server
#define RENDER_EXTERIORMODEL 8
#define RENDER_LOWPRECISION 16 // send as low precision coordinates to save bandwidth
#define RENDER_COLORMAPPED 32
+#define RENDER_NOCULL 64 // do not cull this entity with r_cullentities
+
#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_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
+
+typedef enum entity_state_active_e
+{
+ ACTIVE_NOT = 0,
+ ACTIVE_NETWORK = 1,
+ ACTIVE_SHARED = 2
+}
+entity_state_active_t;
-// this is 80 bytes
+// this is 96 bytes
typedef struct entity_state_s
{
// ! means this is not sent to client
float origin[3];
float angles[3];
int effects;
+ unsigned int customizeentityforclient; // !
unsigned short number; // entity number this state is for
unsigned short modelindex;
unsigned short frame;
unsigned short tagentity;
+ unsigned short specialvisibilityradius; // ! larger if it has effects/light
+ unsigned short viewmodelforclient; // !
+ 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 light[4]; // color*256 (0.00 to 255.996), and radius*1
unsigned char active; // true if a valid state
unsigned char lightstyle;
unsigned char internaleffects; // INTEF_FLAG1QW and so on
unsigned char tagindex;
unsigned char colormod[3];
+ unsigned char glowmod[3];
// padding to a multiple of 8 bytes (to align the double time)
- unsigned char unused;
+ unsigned char unused[2];
}
entity_state_t;
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);
// reference
void EntityFrame_AddFrame(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
// 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);
// bits >= (1<<24)
#define E5_EXTEND3 (1<<23)
-// unused
-#define E5_UNUSED24 (1<<24)
+// byte[3] = s->glowmod[0], s->glowmod[1], s->glowmod[2]
+#define E5_GLOWMOD (1<<24)
// unused
#define E5_UNUSED25 (1<<25)
// unused
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 movesequence);
+qboolean EntityFrame5_WriteFrame(sizebuf_t *msg, int maxsize, entityframe5_database_t *d, int numstates, const entity_state_t *states, int viewentnum, int movesequence, qboolean need_empty);
extern cvar_t developer_networkentities;
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