if(developer_networkentities.integer >= 2) \
{ \
prvm_edict_t *ed = prog->edicts + num; \
- const char *cname = "(no classname)"; \
- if(prog->fieldoffsets.classname >= 0) \
- { \
- string_t handle = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.classname)->string; \
- if (handle) \
- cname = PRVM_GetString(handle); \
- } \
- Con_Printf("sent entity update of size %d for a %s\n", (msg->cursize - entityprofiling_startsize), cname); \
+ Con_Printf("sent entity update of size %d for a %s\n", (msg->cursize - entityprofiling_startsize), PRVM_serveredictstring(ed, classname) ? PRVM_GetString(PRVM_serveredictstring(ed, classname)) : "(no classname)"); \
}
// this is 88 bytes (must match entity_state_t in protocol.h)
0,//unsigned short exteriormodelforclient; // ! not shown if first person viewing from this entity, shown in all other cases
0,//unsigned short nodrawtoclient; // !
0,//unsigned short drawonlytoclient; // !
+ 0,//unsigned short traileffectnum;
{0,0,0,0},//unsigned short light[4]; // color*256 (0.00 to 255.996), and radius*1
ACTIVE_NOT,//unsigned char active; // true if a valid state
0,//unsigned char lightstyle;
// mark ALL csqc entities as requiring a FULL resend!
// I know this is a bad workaround, but better than nothing.
int i, n;
- prvm_eval_t *val;
prvm_edict_t *ed;
- if(prog->fieldoffsets.SendEntity < 0 || prog->fieldoffsets.Version < 0)
- return;
-
n = client->csqcnumedicts;
for(i = 0; i < n; ++i)
{
if(client->csqcentityglobalhistory[i])
{
ed = prog->edicts + i;
- val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.SendEntity);
- if (val->function)
+ if (PRVM_serveredictfunction(ed, SendEntity))
client->csqcentitysendflags[i] |= 0xFFFFFF; // FULL RESEND
else // if it was ever sent to that client as a CSQC entity
{
qboolean sectionstarted = false;
const unsigned short *n;
prvm_edict_t *ed;
- prvm_eval_t *val;
client_t *client = svs.clients + sv.writeentitiestoclient_clientnumber;
int dbframe = EntityFrameCSQC_AllocFrame(client, framenum);
csqcentityframedb_t *db = &client->csqcentityframehistory[dbframe];
maxsize -= 24; // always fit in an empty svc_entities message (for packet loss detection!)
- // if this server progs is not CSQC-aware, return early
- if(prog->fieldoffsets.SendEntity < 0 || prog->fieldoffsets.Version < 0)
- return false;
-
// make sure there is enough room to store the svc_csqcentities byte,
// the terminator (0x0000) and at least one entity update
if (msg->cursize + 32 >= maxsize)
}
}
ed = prog->edicts + number;
- val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.SendEntity);
- if (val->function)
+ if (PRVM_serveredictfunction(ed, SendEntity))
client->csqcentityscope[number] = 2;
else if (client->csqcentityscope[number])
{
{
number = *n;
ed = prog->edicts + number;
- val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.SendEntity);
- if (val->function)
+ if (PRVM_serveredictfunction(ed, SendEntity))
client->csqcentityscope[number] = 2;
}
*/
// save the cursize value in case we overflow and have to rollback
int oldcursize = msg->cursize;
client->csqcentityscope[number] = 1;
- val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.SendEntity);
- if (val->function)
+ if (PRVM_serveredictfunction(ed, SendEntity))
{
if(!sectionstarted)
MSG_WriteByte(msg, svc_csqcentities);
msg->allowoverflow = true;
PRVM_G_INT(OFS_PARM0) = sv.writeentitiestoclient_cliententitynumber;
PRVM_G_FLOAT(OFS_PARM1) = sendflags;
- prog->globals.server->self = number;
- PRVM_ExecuteProgram(val->function, "Null SendEntity\n");
+ PRVM_serverglobaledict(self) = number;
+ PRVM_ExecuteProgram(PRVM_serveredictfunction(ed, SendEntity), "Null SendEntity\n");
msg->allowoverflow = false;
if(PRVM_G_FLOAT(OFS_RETURN) && msg->cursize + 2 <= maxsize)
{
int i, bits;
sizebuf_t buf;
unsigned char data[128];
- prvm_eval_t *val;
qboolean success = false;
// prepare the buffer
{
ENTITYSIZEPROFILING_START(msg, states[i]->number);
s = states[i];
- val = PRVM_EDICTFIELDVALUE((&prog->edicts[s->number]), prog->fieldoffsets.SendEntity);
- if(val && val->function)
+ if(PRVM_serveredictfunction((&prog->edicts[s->number]), SendEntity))
continue;
// prepare the buffer
entity_frame_t *o = &d->deltaframe;
const entity_state_t *ent, *delta;
vec3_t eye;
- prvm_eval_t *val;
d->latestframenum++;
ent = states[i];
number = ent->number;
- val = PRVM_EDICTFIELDVALUE((&prog->edicts[number]), prog->fieldoffsets.SendEntity);
- if(val && val->function)
+ if (PRVM_serveredictfunction((&prog->edicts[number]), SendEntity))
continue;
for (;onum < o->numentities && o->entitydata[onum].number < number;onum++)
{
int i, n, startnumber;
sizebuf_t buf;
unsigned char data[128];
- prvm_eval_t *val;
// if there isn't enough space to accomplish anything, skip it
if (msg->cursize + 24 > maxsize)
d->currententitynumber = 1;
for (i = 0, n = startnumber;n < prog->max_edicts;n++)
{
- val = PRVM_EDICTFIELDVALUE((&prog->edicts[n]), prog->fieldoffsets.SendEntity);
- if(val && val->function)
+ if (PRVM_serveredictfunction((&prog->edicts[n]), SendEntity))
continue;
// find the old state to delta from
e = EntityFrame4_GetReferenceEntity(d, n);
//dp_model_t *model;
ENTITYSIZEPROFILING_START(msg, s->number);
- prvm_eval_t *val;
- val = PRVM_EDICTFIELDVALUE((&prog->edicts[s->number]), prog->fieldoffsets.SendEntity);
- if(val && val->function)
- return;
-
if (s->active != ACTIVE_NETWORK)
MSG_WriteShort(msg, number | 0x8000);
else
{
+ if (PRVM_serveredictfunction((&prog->edicts[s->number]), SendEntity))
+ return;
+
bits = changedbits;
if ((bits & E5_ORIGIN) && (!(s->flags & RENDER_LOWPRECISION) || s->exteriormodelforclient || s->tagentity || s->viewmodelforclient || (s->number >= 1 && s->number <= svs.maxclients) || s->origin[0] <= -4096.0625 || s->origin[0] >= 4095.9375 || s->origin[1] <= -4096.0625 || s->origin[1] >= 4095.9375 || s->origin[2] <= -4096.0625 || s->origin[2] >= 4095.9375))
// maybe also add: ((model = SV_GetModelByIndex(s->modelindex)) != NULL && model->name[0] == '*')
MSG_WriteShort(msg, (int)((sv.time - s->framegroupblend[0].start) * 1000.0));
}
}
+ if (bits & E5_TRAILEFFECTNUM)
+ MSG_WriteShort(msg, s->traileffectnum);
}
ENTITYSIZEPROFILING_END(msg, s->number);
break;
}
}
+ if (bits & E5_TRAILEFFECTNUM)
+ s->traileffectnum = (unsigned short) MSG_ReadShort();
if (developer_networkentities.integer >= 2)
bits |= E5_GLOWMOD;
if (n->flags & RENDER_COMPLEXANIMATION)
bits |= E5_COMPLEXANIMATION;
+ if (o->traileffectnum != n->traileffectnum)
+ bits |= E5_TRAILEFFECTNUM;
}
else
if (o->active == ACTIVE_NETWORK)
packetlog = d->packetlog + packetlognumber;
packetlog->packetnumber = framenum;
packetlog->numstates = 0;
+ memset(packetlog->statsdeltabits, 0, sizeof(packetlog->statsdeltabits));
}
packetlog->statsdeltabits[i>>3] |= (1<<(i&7));
if (host_client->stats[i] >= 0 && host_client->stats[i] < 256)
packetlog = d->packetlog + packetlognumber;
packetlog->packetnumber = framenum;
packetlog->numstates = 0;
+ memset(packetlog->statsdeltabits, 0, sizeof(packetlog->statsdeltabits));
}
// write state updates