DarkPlaces
Game engine based on the Quake 1 engine by id Software, developed by LadyHavoc
 
sv_ents.c
Go to the documentation of this file.
1#include "quakedef.h"
2#include "protocol.h"
3
5
7{
8 unsigned int bits;
9 // if o is not active, delta from default
10 if (o->active != ACTIVE_NETWORK)
11 o = &defaultstate;
12 bits = 0;
13 if (fabs(n->origin[0] - o->origin[0]) > (1.0f / 256.0f))
14 bits |= E_ORIGIN1;
15 if (fabs(n->origin[1] - o->origin[1]) > (1.0f / 256.0f))
16 bits |= E_ORIGIN2;
17 if (fabs(n->origin[2] - o->origin[2]) > (1.0f / 256.0f))
18 bits |= E_ORIGIN3;
19 if ((unsigned char) (n->angles[0] * (256.0f / 360.0f)) != (unsigned char) (o->angles[0] * (256.0f / 360.0f)))
20 bits |= E_ANGLE1;
21 if ((unsigned char) (n->angles[1] * (256.0f / 360.0f)) != (unsigned char) (o->angles[1] * (256.0f / 360.0f)))
22 bits |= E_ANGLE2;
23 if ((unsigned char) (n->angles[2] * (256.0f / 360.0f)) != (unsigned char) (o->angles[2] * (256.0f / 360.0f)))
24 bits |= E_ANGLE3;
25 if ((n->modelindex ^ o->modelindex) & 0x00FF)
26 bits |= E_MODEL1;
27 if ((n->modelindex ^ o->modelindex) & 0xFF00)
28 bits |= E_MODEL2;
29 if ((n->frame ^ o->frame) & 0x00FF)
30 bits |= E_FRAME1;
31 if ((n->frame ^ o->frame) & 0xFF00)
32 bits |= E_FRAME2;
33 if ((n->effects ^ o->effects) & 0x00FF)
34 bits |= E_EFFECTS1;
35 if ((n->effects ^ o->effects) & 0xFF00)
36 bits |= E_EFFECTS2;
37 if (n->colormap != o->colormap)
38 bits |= E_COLORMAP;
39 if (n->skin != o->skin)
40 bits |= E_SKIN;
41 if (n->alpha != o->alpha)
42 bits |= E_ALPHA;
43 if (n->scale != o->scale)
44 bits |= E_SCALE;
45 if (n->glowsize != o->glowsize)
46 bits |= E_GLOWSIZE;
47 if (n->glowcolor != o->glowcolor)
48 bits |= E_GLOWCOLOR;
49 if (n->flags != o->flags)
50 bits |= E_FLAGS;
51 if (n->tagindex != o->tagindex || n->tagentity != o->tagentity)
52 bits |= E_TAGATTACHMENT;
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])
54 bits |= E_LIGHT;
55 if (n->lightstyle != o->lightstyle)
56 bits |= E_LIGHTSTYLE;
57 if (n->lightpflags != o->lightpflags)
58 bits |= E_LIGHTPFLAGS;
59
60 if (bits)
61 {
62 if (bits & 0xFF000000)
63 bits |= 0x00800000;
64 if (bits & 0x00FF0000)
65 bits |= 0x00008000;
66 if (bits & 0x0000FF00)
67 bits |= 0x00000080;
68 }
69 return bits;
70}
71
72void EntityState_WriteExtendBits(sizebuf_t *msg, unsigned int bits)
73{
74 MSG_WriteByte(msg, bits & 0xFF);
75 if (bits & 0x00000080)
76 {
77 MSG_WriteByte(msg, (bits >> 8) & 0xFF);
78 if (bits & 0x00008000)
79 {
80 MSG_WriteByte(msg, (bits >> 16) & 0xFF);
81 if (bits & 0x00800000)
82 MSG_WriteByte(msg, (bits >> 24) & 0xFF);
83 }
84 }
85}
86
87void EntityState_WriteFields(const entity_state_t *ent, sizebuf_t *msg, unsigned int bits)
88{
90 {
91 if (bits & E_ORIGIN1)
92 MSG_WriteCoord16i(msg, ent->origin[0]);
93 if (bits & E_ORIGIN2)
94 MSG_WriteCoord16i(msg, ent->origin[1]);
95 if (bits & E_ORIGIN3)
96 MSG_WriteCoord16i(msg, ent->origin[2]);
97 }
98 else
99 {
100 // LadyHavoc: have to write flags first, as they can modify protocol
101 if (bits & E_FLAGS)
102 MSG_WriteByte(msg, ent->flags);
103 if (ent->flags & RENDER_LOWPRECISION)
104 {
105 if (bits & E_ORIGIN1)
106 MSG_WriteCoord16i(msg, ent->origin[0]);
107 if (bits & E_ORIGIN2)
108 MSG_WriteCoord16i(msg, ent->origin[1]);
109 if (bits & E_ORIGIN3)
110 MSG_WriteCoord16i(msg, ent->origin[2]);
111 }
112 else
113 {
114 if (bits & E_ORIGIN1)
115 MSG_WriteCoord32f(msg, ent->origin[0]);
116 if (bits & E_ORIGIN2)
117 MSG_WriteCoord32f(msg, ent->origin[1]);
118 if (bits & E_ORIGIN3)
119 MSG_WriteCoord32f(msg, ent->origin[2]);
120 }
121 }
123 {
124 if (bits & E_ANGLE1)
125 MSG_WriteAngle8i(msg, ent->angles[0]);
126 if (bits & E_ANGLE2)
127 MSG_WriteAngle8i(msg, ent->angles[1]);
128 if (bits & E_ANGLE3)
129 MSG_WriteAngle8i(msg, ent->angles[2]);
130 }
131 else
132 {
133 if (bits & E_ANGLE1)
134 MSG_WriteAngle16i(msg, ent->angles[0]);
135 if (bits & E_ANGLE2)
136 MSG_WriteAngle16i(msg, ent->angles[1]);
137 if (bits & E_ANGLE3)
138 MSG_WriteAngle16i(msg, ent->angles[2]);
139 }
140 if (bits & E_MODEL1)
141 MSG_WriteByte(msg, ent->modelindex & 0xFF);
142 if (bits & E_MODEL2)
143 MSG_WriteByte(msg, (ent->modelindex >> 8) & 0xFF);
144 if (bits & E_FRAME1)
145 MSG_WriteByte(msg, ent->frame & 0xFF);
146 if (bits & E_FRAME2)
147 MSG_WriteByte(msg, (ent->frame >> 8) & 0xFF);
148 if (bits & E_EFFECTS1)
149 MSG_WriteByte(msg, ent->effects & 0xFF);
150 if (bits & E_EFFECTS2)
151 MSG_WriteByte(msg, (ent->effects >> 8) & 0xFF);
152 if (bits & E_COLORMAP)
153 MSG_WriteByte(msg, ent->colormap);
154 if (bits & E_SKIN)
155 MSG_WriteByte(msg, ent->skin);
156 if (bits & E_ALPHA)
157 MSG_WriteByte(msg, ent->alpha);
158 if (bits & E_SCALE)
159 MSG_WriteByte(msg, ent->scale);
160 if (bits & E_GLOWSIZE)
161 MSG_WriteByte(msg, ent->glowsize);
162 if (bits & E_GLOWCOLOR)
163 MSG_WriteByte(msg, ent->glowcolor);
165 if (bits & E_FLAGS)
166 MSG_WriteByte(msg, ent->flags);
167 if (bits & E_TAGATTACHMENT)
168 {
169 MSG_WriteShort(msg, ent->tagentity);
170 MSG_WriteByte(msg, ent->tagindex);
171 }
172 if (bits & E_LIGHT)
173 {
174 MSG_WriteShort(msg, ent->light[0]);
175 MSG_WriteShort(msg, ent->light[1]);
176 MSG_WriteShort(msg, ent->light[2]);
177 MSG_WriteShort(msg, ent->light[3]);
178 }
179 if (bits & E_LIGHTSTYLE)
180 MSG_WriteByte(msg, ent->lightstyle);
181 if (bits & E_LIGHTPFLAGS)
182 MSG_WriteByte(msg, ent->lightpflags);
183}
184
186{
187 prvm_prog_t *prog = SVVM_prog;
188 unsigned int bits;
189 if (ent->active == ACTIVE_NETWORK)
190 {
191 // entity is active, check for changes from the delta
192 if ((bits = EntityState_DeltaBits(delta, ent)))
193 {
194 // write the update number, bits, and fields
195 ENTITYSIZEPROFILING_START(msg, ent->number, bits);
196 MSG_WriteShort(msg, ent->number);
198 EntityState_WriteFields(ent, msg, bits);
199 ENTITYSIZEPROFILING_END(msg, ent->number, bits);
200 }
201 }
202 else
203 {
204 // entity is inactive, check if the delta was active
205 if (delta->active == ACTIVE_NETWORK)
206 {
207 // write the remove number
208 ENTITYSIZEPROFILING_START(msg, ent->number, 0);
209 MSG_WriteShort(msg, ent->number | 0x8000);
210 ENTITYSIZEPROFILING_END(msg, ent->number, 0);
211 }
212 }
213}
214
215// (server) adds a entity_frame to the database, for future reference
216void EntityFrame_AddFrame_Server(entityframe_database_t *d, vec3_t eye, int framenum, int numentities, const entity_state_t **entitydata)
217{
218 int n, e;
219 entity_frameinfo_t *info;
220
221 VectorCopy(eye, d->eye);
222
223 // figure out how many entity slots are used already
224 if (d->numframes)
225 {
226 n = d->frames[d->numframes - 1].endentity - d->frames[0].firstentity;
227 if (n + numentities > MAX_ENTITY_DATABASE || d->numframes >= MAX_ENTITY_HISTORY)
228 {
229 // ran out of room, dump database
231 }
232 }
233
234 info = &d->frames[d->numframes];
235 info->framenum = framenum;
236 e = -1000;
237 // make sure we check the newly added frame as well, but we haven't incremented numframes yet
238 for (n = 0;n <= d->numframes;n++)
239 {
240 if (e >= d->frames[n].framenum)
241 {
242 if (e == framenum)
243 Con_Print("EntityFrame_AddFrame: tried to add out of sequence frame to database\n");
244 else
245 Con_Print("EntityFrame_AddFrame: out of sequence frames in database\n");
246 return;
247 }
248 e = d->frames[n].framenum;
249 }
250 // if database still has frames after that...
251 if (d->numframes)
252 info->firstentity = d->frames[d->numframes - 1].endentity;
253 else
254 info->firstentity = 0;
255 info->endentity = info->firstentity + numentities;
256 d->numframes++;
257
260 if (e > numentities)
261 e = numentities;
262 memcpy(d->entitydata + n, entitydata, sizeof(entity_state_t) * e);
263 if (numentities > e)
264 memcpy(d->entitydata, entitydata + e, sizeof(entity_state_t) * (numentities - e));
265}
266
267// (server) writes a frame to network stream
268qbool EntityFrame_WriteFrame(sizebuf_t *msg, int maxsize, entityframe_database_t *d, int numstates, const entity_state_t **states, int viewentnum)
269{
270 prvm_prog_t *prog = SVVM_prog;
271 int i, onum, number;
272 entity_frame_t *o = &d->deltaframe;
273 const entity_state_t *ent, *delta;
274 vec3_t eye;
275
276 d->latestframenum++;
277
278 VectorClear(eye);
279 for (i = 0;i < numstates;i++)
280 {
281 ent = states[i];
282 if (ent->number == viewentnum)
283 {
284 VectorSet(eye, ent->origin[0], ent->origin[1], ent->origin[2] + 22);
285 break;
286 }
287 }
288
289 EntityFrame_AddFrame_Server(d, eye, d->latestframenum, numstates, states);
290
292
294 MSG_WriteLong (msg, o->framenum);
296 MSG_WriteFloat (msg, eye[0]);
297 MSG_WriteFloat (msg, eye[1]);
298 MSG_WriteFloat (msg, eye[2]);
299
300 onum = 0;
301 for (i = 0;i < numstates;i++)
302 {
303 ent = states[i];
304 number = ent->number;
305
306 if (PRVM_serveredictfunction((&prog->edicts[number]), SendEntity))
307 continue;
308 for (;onum < o->numentities && o->entitydata[onum].number < number;onum++)
309 {
310 // write remove message
311 MSG_WriteShort(msg, o->entitydata[onum].number | 0x8000);
312 }
313 if (onum < o->numentities && (o->entitydata[onum].number == number))
314 {
315 // delta from previous frame
316 delta = o->entitydata + onum;
317 // advance to next entity in delta frame
318 onum++;
319 }
320 else
321 {
322 // delta from defaults
323 delta = &defaultstate;
324 }
325 EntityState_WriteUpdate(ent, msg, delta);
326 }
327 for (;onum < o->numentities;onum++)
328 {
329 // write remove message
330 MSG_WriteShort(msg, o->entitydata[onum].number | 0x8000);
331 }
332 MSG_WriteShort(msg, 0xFFFF);
333
334 return true;
335}
336
337void SV_WriteEntitiesToClient(client_t *client, prvm_edict_t *clent, sizebuf_t *msg, int maxsize)
338{
339 prvm_prog_t *prog = SVVM_prog;
340 qbool need_empty = false;
341 int i, numsendstates, numcsqcsendstates;
343 prvm_edict_t *camera;
344 qbool success;
345 vec3_t eye;
346
347 // if there isn't enough space to accomplish anything, skip it
348 if (msg->cursize + 25 > maxsize)
349 return;
350
353
359
360 // get eye location
361 sv.writeentitiestoclient_cliententitynumber = PRVM_EDICT_TO_PROG(clent); // LadyHavoc: for comparison purposes
362 camera = PRVM_EDICT_NUM( client->clientcamera );
364 // get the PVS values for the eye location, later FatPVS calls will merge
365 if (sv.worldmodel && sv.worldmodel->brush.FatPVS)
366 sv.worldmodel->brush.FatPVS(sv.worldmodel, eye, 8, &sv.writeentitiestoclient_pvs, sv_mempool, false);
367 else
369
370 // add the eye to a list for SV_CanSeeBox tests
373
374 // calculate predicted eye origin for SV_CanSeeBox tests
376 {
378 vec3_t predeye;
379 VectorMA(eye, predtime, PRVM_serveredictvector(camera, velocity), predeye);
380 if (SV_CanSeeBox(1, 0, 0, 0, eye, predeye, predeye))
381 {
384 }
385 //if (!sv.writeentitiestoclient_useprediction)
386 // Con_DPrintf("Trying to walk into solid in a pingtime... not predicting for culling\n");
387 }
388
390
391 // build PVS from the new eyes
392 if (sv.worldmodel && sv.worldmodel->brush.FatPVS)
393 for(i = 1; i < sv.writeentitiestoclient_numeyes; ++i)
395
397
398 for (i = 0;i < sv.numsendentities;i++)
400
401 numsendstates = 0;
402 numcsqcsendstates = 0;
403 for (i = 0;i < sv.numsendentities;i++)
404 {
405 s = &sv.sendentities[i];
407 {
408 if(s->active == ACTIVE_NETWORK)
409 {
411 {
414 else
415 s->flags &= ~RENDER_EXTERIORMODEL;
416 }
417 sv.writeentitiestoclient_sendstates[numsendstates++] = s;
418 }
420 sv.writeentitiestoclient_csqcsendstates[numcsqcsendstates++] = s->number;
421 else
422 Con_Printf("entity %d is in sv.sendentities and marked, but not active, please breakpoint me\n", s->number);
423 }
424 }
425
428
429 if(client->entitydatabase5)
430 need_empty = EntityFrameCSQC_WriteFrame(msg, maxsize, numcsqcsendstates, sv.writeentitiestoclient_csqcsendstates, client->entitydatabase5->latestframenum + 1);
431 else
432 EntityFrameCSQC_WriteFrame(msg, maxsize, numcsqcsendstates, sv.writeentitiestoclient_csqcsendstates, 0);
433
434 // force every 16th frame to be not empty (or cl_movement replay takes
435 // too long)
436 // BTW, this should normally not kick in any more due to the check
437 // below, except if the client stopped sending movement frames
438 if(client->num_skippedentityframes >= 16)
439 need_empty = true;
440
441 // help cl_movement a bit more
442 if(client->movesequence != client->lastmovesequence)
443 need_empty = true;
444 client->lastmovesequence = client->movesequence;
445
446 if (client->entitydatabase5)
447 success = EntityFrame5_WriteFrame(msg, maxsize, client->entitydatabase5, numsendstates, sv.writeentitiestoclient_sendstates, client - svs.clients + 1, client->movesequence, need_empty);
448 else if (client->entitydatabase4)
449 {
450 success = EntityFrame4_WriteFrame(msg, maxsize, client->entitydatabase4, numsendstates, sv.writeentitiestoclient_sendstates);
452 }
453 else if (client->entitydatabase)
454 {
455 success = EntityFrame_WriteFrame(msg, maxsize, client->entitydatabase, numsendstates, sv.writeentitiestoclient_sendstates, client - svs.clients + 1);
457 }
458 else
459 {
460 success = EntityFrameQuake_WriteFrame(msg, maxsize, numsendstates, sv.writeentitiestoclient_sendstates);
462 }
463
464 if(success)
465 client->num_skippedentityframes = 0;
466 else
467 ++client->num_skippedentityframes;
468}
void EntityFrame_FetchFrame(entityframe_database_t *d, int framenum, entity_frame_t *f)
Definition com_ents.c:50
void EntityFrame_ClearDatabase(entityframe_database_t *d)
Definition com_ents.c:17
void MSG_WriteCoord32f(sizebuf_t *sb, float f)
Definition com_msg.c:197
void MSG_WriteShort(sizebuf_t *sb, int c)
Definition com_msg.c:138
void MSG_WriteAngle16i(sizebuf_t *sb, float f)
Definition com_msg.c:227
void MSG_WriteLong(sizebuf_t *sb, int c)
Definition com_msg.c:147
void MSG_WriteByte(sizebuf_t *sb, int c)
Definition com_msg.c:130
void MSG_WriteFloat(sizebuf_t *sb, float f)
Definition com_msg.c:158
void MSG_WriteAngle8i(sizebuf_t *sb, float f)
Definition com_msg.c:222
void MSG_WriteCoord16i(sizebuf_t *sb, float f)
Definition com_msg.c:192
@ PROTOCOL_DARKPLACES2
various changes
Definition common.h:140
@ PROTOCOL_DARKPLACES4
various changes
Definition common.h:138
@ PROTOCOL_DARKPLACES3
uses EntityFrame4 entity snapshot encoder/decoder which is broken, this attempted to do partial snaps...
Definition common.h:139
@ PROTOCOL_DARKPLACES1
uses EntityFrame entity snapshot encoder/decoder which is a QuakeWorld-like entity snapshot delta com...
Definition common.h:141
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
vector velocity
vector origin
#define n(x, y)
#define VectorClear(a)
Definition mathlib.h:97
#define bound(min, num, max)
Definition mathlib.h:34
#define VectorSet(vec, x, y, z)
Definition mathlib.h:96
#define VectorCopy(in, out)
Definition mathlib.h:101
#define VectorAdd(a, b, out)
Definition mathlib.h:100
#define VectorMA(a, scale, b, out)
Definition mathlib.h:114
float fabs(float f)
vector view_ofs
Definition progsdefs.qc:151
#define PRVM_serveredictvector(ed, fieldname)
Definition progsvm.h:173
#define PRVM_EDICT_TO_PROG(e)
Definition progsvm.h:875
#define PRVM_EDICT_NUM(n)
Definition progsvm.h:867
#define PRVM_serveredictfunction(ed, fieldname)
Definition progsvm.h:176
#define SVVM_prog
Definition progsvm.h:766
entity_state_t defaultstate
Definition protocol.c:4
void Protocol_WriteStatsReliable(void)
Definition protocol.c:151
#define E_TAGATTACHMENT
Definition protocol.h:645
#define E_ANGLE2
Definition protocol.h:617
#define RENDER_EXTERIORMODEL
Definition protocol.h:359
#define MAX_ENTITY_DATABASE
Definition protocol.h:554
#define ENTITYSIZEPROFILING_START(msg, num, flags)
Definition protocol.h:39
#define E_ORIGIN2
Definition protocol.h:614
#define E_ORIGIN3
Definition protocol.h:615
#define E_LIGHTSTYLE
Definition protocol.h:646
#define E_SCALE
Definition protocol.h:626
#define MAX_ENTITY_HISTORY
Definition protocol.h:553
#define E_EFFECTS1
Definition protocol.h:624
#define E_FLAGS
Definition protocol.h:629
#define svc_entities
Definition protocol.h:277
#define E_COLORMAP
Definition protocol.h:627
qbool EntityFrameQuake_WriteFrame(struct sizebuf_s *msg, int maxsize, int numstates, const entity_state_t **states)
#define E_MODEL2
Definition protocol.h:634
#define E_SKIN
Definition protocol.h:628
#define E_FRAME2
Definition protocol.h:633
qbool EntityFrameCSQC_WriteFrame(struct sizebuf_s *msg, int maxsize, int numnumbers, const unsigned short *numbers, int framenum)
#define E_LIGHT
Definition protocol.h:638
qbool EntityFrame4_WriteFrame(struct sizebuf_s *msg, int maxsize, entityframe4_database_t *d, int numstates, const entity_state_t **states)
#define E_GLOWSIZE
Definition protocol.h:636
#define E_EFFECTS2
Definition protocol.h:635
#define E_GLOWCOLOR
Definition protocol.h:637
#define E_MODEL1
Definition protocol.h:619
#define ENTITYSIZEPROFILING_END(msg, num, flags)
Definition protocol.h:42
#define E_LIGHTPFLAGS
Definition protocol.h:639
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 E_ANGLE1
Definition protocol.h:616
#define RENDER_LOWPRECISION
Definition protocol.h:360
#define E_ORIGIN1
Definition protocol.h:613
@ ACTIVE_SHARED
Definition protocol.h:434
@ ACTIVE_NETWORK
Definition protocol.h:433
#define E_FRAME1
Definition protocol.h:623
#define E_ALPHA
Definition protocol.h:625
#define E_ANGLE3
Definition protocol.h:618
int i
#define NULL
Definition qtypes.h:12
float vec_t
Definition qtypes.h:68
vec_t vec3_t[3]
Definition qtypes.h:71
bool qbool
Definition qtypes.h:9
cvar_t sv_cullentities_stats
Definition sv_main.c:83
server_t sv
local server
Definition sv_main.c:223
void SV_AddCameraEyes(void)
Definition sv_send.c:1063
cvar_t sv_cullentities_trace_prediction
Definition sv_main.c:90
mempool_t * sv_mempool
Definition sv_main.c:226
qbool SV_CanSeeBox(int numsamples, vec_t eyejitter, vec_t enlarge, vec_t entboxexpand, vec3_t eye, vec3_t entboxmins, vec3_t entboxmaxs)
Definition sv_send.c:723
void SV_MarkWriteEntityStateToClient(entity_state_t *s, client_t *client)
Definition sv_send.c:863
server_static_t svs
persistant server info
Definition sv_main.c:224
client_t * host_client
Definition sv_main.c:29
entityframe_database_t * entitydatabase
Definition server.h:272
unsigned int movesequence
Definition server.h:212
entityframe5_database_t * entitydatabase5
Definition server.h:274
char name[MAX_SCOREBOARDNAME]
Definition server.h:235
entityframe4_database_t * entitydatabase4
Definition server.h:273
int clientcamera
clientcamera (entity to use as camera)
Definition server.h:270
unsigned int lastmovesequence
Definition server.h:305
int num_skippedentityframes
Definition server.h:301
float ping
LadyHavoc: can be used for prediction or whatever...
Definition server.h:224
Definition cvar.h:66
float value
Definition cvar.h:74
int integer
Definition cvar.h:73
entity_state_t entitydata[MAX_ENTITY_DATABASE]
Definition protocol.h:565
unsigned char flags
Definition protocol.h:468
unsigned char skin
Definition protocol.h:463
unsigned char glowcolor
Definition protocol.h:467
unsigned char glowsize
Definition protocol.h:466
float origin[3]
Definition protocol.h:444
unsigned short tagentity
Definition protocol.h:451
unsigned char lightstyle
Definition protocol.h:460
unsigned char colormap
Definition protocol.h:462
unsigned short modelindex
Definition protocol.h:449
unsigned char alpha
Definition protocol.h:464
unsigned short light[4]
Definition protocol.h:458
unsigned short exteriormodelforclient
Definition protocol.h:454
unsigned char tagindex
Definition protocol.h:470
float angles[3]
Definition protocol.h:445
unsigned char active
Definition protocol.h:459
unsigned short frame
Definition protocol.h:450
unsigned short number
Definition protocol.h:448
unsigned char scale
Definition protocol.h:465
unsigned char lightpflags
Definition protocol.h:461
entity_frameinfo_t frames[MAX_ENTITY_HISTORY]
Definition protocol.h:596
entity_state_t entitydata[MAX_ENTITY_DATABASE]
Definition protocol.h:598
entity_frame_t deltaframe
Definition protocol.h:601
prvm_edict_t * edicts
Definition progsvm.h:680
struct client_s * clients
client slots
Definition server.h:30
unsigned char * writeentitiestoclient_pvs
Definition server.h:155
vec3_t writeentitiestoclient_eyes[MAX_CLIENTNETWORKEYES]
Definition server.h:153
int writeentitiestoclient_stats_culled_pvs
Definition server.h:146
int sententitiesmark
Definition server.h:163
int writeentitiestoclient_stats_totalentities
Definition server.h:149
int sententities[MAX_EDICTS]
Definition server.h:164
int writeentitiestoclient_cliententitynumber
Definition server.h:150
int writeentitiestoclient_numeyes
Definition server.h:154
int numsendentities
Definition server.h:159
sizebuf_t * writeentitiestoclient_msg
Definition server.h:152
const entity_state_t * writeentitiestoclient_sendstates[MAX_EDICTS]
Definition server.h:156
int writeentitiestoclient_stats_visibleentities
Definition server.h:148
unsigned short writeentitiestoclient_csqcsendstates[MAX_EDICTS]
Definition server.h:157
entity_state_t sendentities[MAX_EDICTS]
Definition server.h:160
int writeentitiestoclient_stats_culled_trace
Definition server.h:147
struct model_s * worldmodel
Definition server.h:112
int writeentitiestoclient_clientnumber
Definition server.h:151
protocolversion_t protocol
one of the PROTOCOL_ values
Definition server.h:74
int cursize
Definition common.h:54
void EntityState_WriteExtendBits(sizebuf_t *msg, unsigned int bits)
Definition sv_ents.c:72
void EntityState_WriteUpdate(const entity_state_t *ent, sizebuf_t *msg, const entity_state_t *delta)
Definition sv_ents.c:185
int EntityState_DeltaBits(const entity_state_t *o, const entity_state_t *n)
Definition sv_ents.c:6
void SV_WriteEntitiesToClient(client_t *client, prvm_edict_t *clent, sizebuf_t *msg, int maxsize)
Definition sv_ents.c:337
void EntityState_WriteFields(const entity_state_t *ent, sizebuf_t *msg, unsigned int bits)
Definition sv_ents.c:87
void EntityFrame_AddFrame_Server(entityframe_database_t *d, vec3_t eye, int framenum, int numentities, const entity_state_t **entitydata)
Definition sv_ents.c:216
qbool EntityFrame_WriteFrame(sizebuf_t *msg, int maxsize, entityframe_database_t *d, int numstates, const entity_state_t **states, int viewentnum)
Definition sv_ents.c:268
cvar_t sv_cullentities_trace_prediction_time
Definition sv_main.c:91