13 if (
fabs(
n->origin[0] - o->
origin[0]) > (1.0f / 256.0f))
15 if (
fabs(
n->origin[1] - o->
origin[1]) > (1.0f / 256.0f))
17 if (
fabs(
n->origin[2] - o->
origin[2]) > (1.0f / 256.0f))
19 if ((
unsigned char) (
n->angles[0] * (256.0f / 360.0f)) != (
unsigned char) (o->
angles[0] * (256.0f / 360.0f)))
21 if ((
unsigned char) (
n->angles[1] * (256.0f / 360.0f)) != (
unsigned char) (o->
angles[1] * (256.0f / 360.0f)))
23 if ((
unsigned char) (
n->angles[2] * (256.0f / 360.0f)) != (
unsigned char) (o->
angles[2] * (256.0f / 360.0f)))
29 if ((
n->frame ^ o->
frame) & 0x00FF)
31 if ((
n->frame ^ o->
frame) & 0xFF00)
33 if ((
n->effects ^ o->
effects) & 0x00FF)
35 if ((
n->effects ^ o->
effects) & 0xFF00)
39 if (
n->skin != o->
skin)
53 if (
n->light[0] != o->
light[0] ||
n->light[1] != o->
light[1] ||
n->light[2] != o->
light[2] ||
n->light[3] != o->
light[3])
62 if (bits & 0xFF000000)
64 if (bits & 0x00FF0000)
66 if (bits & 0x0000FF00)
75 if (bits & 0x00000080)
78 if (bits & 0x00008000)
81 if (bits & 0x00800000)
243 Con_Print(
"EntityFrame_AddFrame: tried to add out of sequence frame to database\n");
245 Con_Print(
"EntityFrame_AddFrame: out of sequence frames in database\n");
279 for (i = 0;i < numstates;i++)
282 if (ent->
number == viewentnum)
301 for (i = 0;i < numstates;i++)
340 qbool need_empty =
false;
341 int i, numsendstates, numcsqcsendstates;
348 if (msg->
cursize + 25 > maxsize)
351 sv.writeentitiestoclient_msg = msg;
352 sv.writeentitiestoclient_clientnumber = client -
svs.clients;
354 sv.writeentitiestoclient_stats_culled_pvs = 0;
355 sv.writeentitiestoclient_stats_culled_trace = 0;
356 sv.writeentitiestoclient_stats_visibleentities = 0;
357 sv.writeentitiestoclient_stats_totalentities = 0;
358 sv.writeentitiestoclient_numeyes = 0;
365 if (
sv.worldmodel &&
sv.worldmodel->brush.FatPVS)
366 sv.worldmodel->brush.FatPVS(
sv.worldmodel, eye, 8, &
sv.writeentitiestoclient_pvs,
sv_mempool,
false);
368 sv.writeentitiestoclient_pvs =
NULL;
371 VectorCopy(eye,
sv.writeentitiestoclient_eyes[
sv.writeentitiestoclient_numeyes]);
372 sv.writeentitiestoclient_numeyes++;
382 VectorCopy(predeye,
sv.writeentitiestoclient_eyes[
sv.writeentitiestoclient_numeyes]);
383 sv.writeentitiestoclient_numeyes++;
392 if (
sv.worldmodel &&
sv.worldmodel->brush.FatPVS)
393 for(i = 1; i <
sv.writeentitiestoclient_numeyes; ++i)
394 sv.worldmodel->brush.FatPVS(
sv.worldmodel,
sv.writeentitiestoclient_eyes[i], 8, &
sv.writeentitiestoclient_pvs,
sv_mempool,
sv.writeentitiestoclient_pvs !=
NULL);
396 sv.sententitiesmark++;
398 for (i = 0;i <
sv.numsendentities;i++)
402 numcsqcsendstates = 0;
403 for (i = 0;i <
sv.numsendentities;i++)
405 s = &
sv.sendentities[i];
406 if (
sv.sententities[s->
number] ==
sv.sententitiesmark)
417 sv.writeentitiestoclient_sendstates[numsendstates++] = s;
420 sv.writeentitiestoclient_csqcsendstates[numcsqcsendstates++] = s->
number;
422 Con_Printf(
"entity %d is in sv.sendentities and marked, but not active, please breakpoint me\n", s->
number);
427 Con_Printf(
"client \"%s\" entities: %d total, %d visible, %d culled by: %d pvs %d trace\n", client->
name,
sv.writeentitiestoclient_stats_totalentities,
sv.writeentitiestoclient_stats_visibleentities,
sv.writeentitiestoclient_stats_culled_pvs +
sv.writeentitiestoclient_stats_culled_trace,
sv.writeentitiestoclient_stats_culled_pvs,
sv.writeentitiestoclient_stats_culled_trace);
void EntityFrame_FetchFrame(entityframe_database_t *d, int framenum, entity_frame_t *f)
void EntityFrame_ClearDatabase(entityframe_database_t *d)
void MSG_WriteCoord32f(sizebuf_t *sb, float f)
void MSG_WriteShort(sizebuf_t *sb, int c)
void MSG_WriteAngle16i(sizebuf_t *sb, float f)
void MSG_WriteLong(sizebuf_t *sb, int c)
void MSG_WriteByte(sizebuf_t *sb, int c)
void MSG_WriteFloat(sizebuf_t *sb, float f)
void MSG_WriteAngle8i(sizebuf_t *sb, float f)
void MSG_WriteCoord16i(sizebuf_t *sb, float f)
@ PROTOCOL_DARKPLACES2
various changes
@ PROTOCOL_DARKPLACES4
various changes
@ PROTOCOL_DARKPLACES3
uses EntityFrame4 entity snapshot encoder/decoder which is broken, this attempted to do partial snaps...
@ PROTOCOL_DARKPLACES1
uses EntityFrame entity snapshot encoder/decoder which is a QuakeWorld-like entity snapshot delta com...
void Con_Print(const char *msg)
Prints to all appropriate console targets, and adds timestamps.
void Con_Printf(const char *fmt,...)
Prints to all appropriate console targets.
#define bound(min, num, max)
#define VectorSet(vec, x, y, z)
#define VectorCopy(in, out)
#define VectorAdd(a, b, out)
#define VectorMA(a, scale, b, out)
#define PRVM_serveredictvector(ed, fieldname)
#define PRVM_EDICT_TO_PROG(e)
#define PRVM_EDICT_NUM(n)
#define PRVM_serveredictfunction(ed, fieldname)
entity_state_t defaultstate
void Protocol_WriteStatsReliable(void)
#define RENDER_EXTERIORMODEL
#define MAX_ENTITY_DATABASE
#define ENTITYSIZEPROFILING_START(msg, num, flags)
#define MAX_ENTITY_HISTORY
qbool EntityFrameQuake_WriteFrame(struct sizebuf_s *msg, int maxsize, int numstates, const entity_state_t **states)
qbool EntityFrameCSQC_WriteFrame(struct sizebuf_s *msg, int maxsize, int numnumbers, const unsigned short *numbers, int framenum)
qbool EntityFrame4_WriteFrame(struct sizebuf_s *msg, int maxsize, entityframe4_database_t *d, int numstates, const entity_state_t **states)
#define ENTITYSIZEPROFILING_END(msg, num, flags)
qbool EntityFrame5_WriteFrame(struct sizebuf_s *msg, int maxsize, entityframe5_database_t *d, int numstates, const entity_state_t **states, int viewentnum, unsigned int movesequence, qbool need_empty)
#define RENDER_LOWPRECISION
cvar_t sv_cullentities_stats
void SV_AddCameraEyes(void)
cvar_t sv_cullentities_trace_prediction
qbool SV_CanSeeBox(int numsamples, vec_t eyejitter, vec_t enlarge, vec_t entboxexpand, vec3_t eye, vec3_t entboxmins, vec3_t entboxmaxs)
void SV_MarkWriteEntityStateToClient(entity_state_t *s, client_t *client)
server_static_t svs
persistant server info
entityframe_database_t * entitydatabase
unsigned int movesequence
entityframe5_database_t * entitydatabase5
char name[MAX_SCOREBOARDNAME]
entityframe4_database_t * entitydatabase4
int clientcamera
clientcamera (entity to use as camera)
unsigned int lastmovesequence
int num_skippedentityframes
entity_state_t entitydata[MAX_ENTITY_DATABASE]
unsigned short modelindex
unsigned short exteriormodelforclient
unsigned char lightpflags
entity_frameinfo_t frames[MAX_ENTITY_HISTORY]
entity_state_t entitydata[MAX_ENTITY_DATABASE]
entity_frame_t deltaframe
void EntityState_WriteExtendBits(sizebuf_t *msg, unsigned int bits)
void EntityState_WriteUpdate(const entity_state_t *ent, sizebuf_t *msg, const entity_state_t *delta)
int EntityState_DeltaBits(const entity_state_t *o, const entity_state_t *n)
void SV_WriteEntitiesToClient(client_t *client, prvm_edict_t *clent, sizebuf_t *msg, int maxsize)
void EntityState_WriteFields(const entity_state_t *ent, sizebuf_t *msg, unsigned int bits)
void EntityFrame_AddFrame_Server(entityframe_database_t *d, vec3_t eye, int framenum, int numentities, const entity_state_t **entitydata)
qbool EntityFrame_WriteFrame(sizebuf_t *msg, int maxsize, entityframe_database_t *d, int numstates, const entity_state_t **states, int viewentnum)
cvar_t sv_cullentities_trace_prediction_time