DarkPlaces
Game engine based on the Quake 1 engine by id Software, developed by LadyHavoc
 
cl_ents4.c File Reference
#include "quakedef.h"
#include "protocol.h"
+ Include dependency graph for cl_ents4.c:

Go to the source code of this file.

Functions

void EntityFrame4_CL_ReadFrame (void)
 

Function Documentation

◆ EntityFrame4_CL_ReadFrame()

void EntityFrame4_CL_ReadFrame ( void )

Definition at line 4 of file cl_ents4.c.

5{
6 int i, n, cnumber, referenceframenum, framenum, enumber, done, stopnumber, skip = false;
12 // read the number of the frame this refers to
13 referenceframenum = MSG_ReadLong(&cl_message);
14 // read the number of this frame
15 framenum = MSG_ReadLong(&cl_message);
16 CL_NewFrameReceived(framenum);
17 // read the start number
18 enumber = (unsigned short) MSG_ReadShort(&cl_message);
20 {
21 Con_Printf("recv svc_entities num:%i ref:%i database: ref:%i commits:", framenum, referenceframenum, d->referenceframenum);
22 for (i = 0;i < MAX_ENTITY_HISTORY;i++)
23 if (d->commit[i].numentities)
24 Con_Printf(" %i", d->commit[i].framenum);
25 Con_Print("\n");
26 }
27 if (!EntityFrame4_AckFrame(d, referenceframenum, false))
28 {
29 Con_Print("EntityFrame4_CL_ReadFrame: reference frame invalid (VERY BAD ERROR), this update will be skipped\n");
30 skip = true;
31 }
33 for (i = 0;i < MAX_ENTITY_HISTORY;i++)
34 {
35 if (!d->commit[i].numentities)
36 {
37 d->currentcommit = d->commit + i;
38 d->currentcommit->framenum = framenum;
40 }
41 }
42 if (d->currentcommit == NULL)
43 {
44 Con_Printf("EntityFrame4_CL_ReadFrame: error while decoding frame %i: database full, reading but not storing this update\n", framenum);
45 skip = true;
46 }
47 done = false;
48 while (!done && !cl_message.badread)
49 {
50 // read the number of the modified entity
51 // (gaps will be copied unmodified)
52 n = (unsigned short)MSG_ReadShort(&cl_message);
53 if (n == 0x8000)
54 {
55 // no more entities in this update, but we still need to copy the
56 // rest of the reference entities (final gap)
57 done = true;
58 // read end of range number, then process normally
59 n = (unsigned short)MSG_ReadShort(&cl_message);
60 }
61 // high bit means it's a remove message
62 cnumber = n & 0x7FFF;
63 // if this is a live entity we may need to expand the array
64 if (cl.num_entities <= cnumber && !(n & 0x8000))
65 {
66 cl.num_entities = cnumber + 1;
67 if (cnumber >= cl.max_entities)
68 CL_ExpandEntities(cnumber);
69 }
70 // add one (the changed one) if not done
71 stopnumber = cnumber + !done;
72 // process entities in range from the last one to the changed one
73 for (;enumber < stopnumber;enumber++)
74 {
75 if (skip || enumber >= cl.num_entities)
76 {
77 if (enumber == cnumber && (n & 0x8000) == 0)
78 {
79 entity_state_t tempstate;
81 }
82 continue;
83 }
84 // slide the current into the previous slot
86 // copy a new current from reference database
88 s = &cl.entities[enumber].state_current;
89 // if this is the one to modify, read more data...
90 if (enumber == cnumber)
91 {
92 if (n & 0x8000)
93 {
94 // simply removed
96 Con_Printf("entity %i: remove\n", enumber);
97 *s = defaultstate;
98 }
99 else
100 {
101 // read the changes
103 Con_Printf("entity %i: update\n", enumber);
106 }
107 }
109 Con_Printf("entity %i: copy\n", enumber);
110 // set the cl.entities_active flag
111 cl.entities_active[enumber] = (s->active == ACTIVE_NETWORK);
112 // set the update time
113 s->time = cl.mtime[0];
114 // fix the number (it gets wiped occasionally by copying from defaultstate)
115 s->number = enumber;
116 // check if we need to update the lerp stuff
117 if (s->active == ACTIVE_NETWORK)
119 // add this to the commit entry whether it is modified or not
120 if (d->currentcommit)
122 // print extra messages if desired
124 {
126 Con_Printf("entity #%i has become active\n", enumber);
127 else if (cl.entities[enumber].state_previous.active)
128 Con_Printf("entity #%i has become inactive\n", enumber);
129 }
130 }
131 }
132 d->currentcommit = NULL;
133 if (skip)
135}
void EntityState_ReadFields(entity_state_t *e, unsigned int bits)
Definition cl_ents.c:21
int EntityState_ReadExtendBits(void)
Definition cl_ents.c:4
void CL_NewFrameReceived(int num)
Definition cl_input.c:1737
client_state_t cl
Definition cl_main.c:117
client_static_t cls
Definition cl_main.c:116
void CL_ExpandEntities(int num)
Definition cl_main.c:300
void CL_MoveLerpEntityStates(entity_t *ent)
Definition cl_parse.c:1991
cvar_t developer_networkentities
Definition cl_parse.c:173
int EntityFrame4_AckFrame(entityframe4_database_t *d, int framenum, int servermode)
Definition com_ents4.c:74
entityframe4_database_t * EntityFrame4_AllocDatabase(mempool_t *pool)
Definition com_ents4.c:4
void EntityFrame4_ResetDatabase(entityframe4_database_t *d)
Definition com_ents4.c:24
entity_state_t * EntityFrame4_GetReferenceEntity(entityframe4_database_t *d, int number)
Definition com_ents4.c:34
void EntityFrame4_AddCommitEntity(entityframe4_database_t *d, const entity_state_t *s)
Definition com_ents4.c:57
#define MSG_ReadShort
Definition common.h:191
#define MSG_ReadLong
Definition common.h:192
void Con_Print(const char *msg)
Prints to all appropriate console targets, and adds timestamps.
Definition console.c:1504
void Con_Printf(const char *fmt,...)
Prints to all appropriate console targets.
Definition console.c:1514
#define n(x, y)
sizebuf_t cl_message
Definition netconn.c:71
entity_state_t defaultstate
Definition protocol.c:4
#define MAX_ENTITY_HISTORY
Definition protocol.h:553
@ ACTIVE_NETWORK
Definition protocol.h:433
int i
#define NULL
Definition qtypes.h:12
unsigned char * entities_active
Definition client.h:993
entity_t * entities
Definition client.h:991
int max_entities
Definition client.h:980
double mtime[2]
Definition client.h:861
entityframe4_database_t * entitydatabase4
Definition client.h:964
mempool_t * levelmempool
Definition client.h:571
int integer
Definition cvar.h:73
unsigned char active
Definition protocol.h:459
unsigned short number
Definition protocol.h:448
entity_state_t state_current
Definition client.h:471
entity_state_t state_previous
Definition client.h:469
entity_database4_commit_t commit[MAX_ENTITY_HISTORY]
Definition protocol.h:713
entity_database4_commit_t * currentcommit
Definition protocol.h:715
qbool badread
Definition common.h:56

References entity_state_t::active, ACTIVE_NETWORK, sizebuf_t::badread, cl, CL_ExpandEntities(), cl_message, CL_MoveLerpEntityStates(), CL_NewFrameReceived(), cls, entityframe4_database_t::commit, Con_Print(), Con_Printf(), entityframe4_database_t::currentcommit, defaultstate, developer_networkentities, client_state_t::entities, client_state_t::entities_active, client_state_t::entitydatabase4, EntityFrame4_AckFrame(), EntityFrame4_AddCommitEntity(), EntityFrame4_AllocDatabase(), EntityFrame4_GetReferenceEntity(), EntityFrame4_ResetDatabase(), EntityState_ReadExtendBits(), EntityState_ReadFields(), entity_database4_commit_t::framenum, i, cvar_t::integer, client_static_t::levelmempool, client_state_t::max_entities, MAX_ENTITY_HISTORY, MSG_ReadLong, MSG_ReadShort, client_state_t::mtime, n, NULL, client_state_t::num_entities, entity_state_t::number, entity_database4_commit_t::numentities, entityframe4_database_t::referenceframenum, entity_t::state_current, entity_t::state_previous, and entity_state_t::time.

Referenced by CL_ParseServerMessage().