qboolean Nehahrademcompatibility; // LordHavoc: to allow playback of the early Nehahra movie segments
int dpprotocol; // LordHavoc: version of network protocol, or 0 if not DarkPlaces
-/*
-===============
-CL_EntityNum
-
-This error checks and tracks the total number of entities
-===============
-*/
-entity_t *CL_EntityNum (int num)
-{
- if (num >= MAX_EDICTS)
- Host_Error ("CL_EntityNum: %i is an invalid number",num);
-
- return &cl_entities[num];
-}
-
-
/*
==================
CL_ParseStartSoundPacket
float attenuation;
int i;
- field_mask = MSG_ReadByte();
+ field_mask = MSG_ReadByte();
if (field_mask & SND_VOLUME)
volume = MSG_ReadByte ();
// local state
ent = &cl_entities[0];
// entire entity array was cleared, so just fill in a few fields
+ ent->state_current.active = true;
ent->render.model = cl.worldmodel = cl.model_precache[1];
ent->render.scale = 1;
ent->render.alpha = 1;
if (num < 1)
Host_Error("CL_ParseUpdate: invalid entity number (%i)\n", num);
- // mark as visible (no kill this frame)
- entlife[num] = 2;
-
- ent = CL_EntityNum (num);
+ ent = cl_entities + num;
for (i = 0;i < 32;i++)
if (bits & (1 << i))
else
new = ent->state_baseline;
+ new.number = num;
new.time = cl.mtime[0];
-
new.flags = 0;
if (bits & U_MODEL) new.modelindex = (new.modelindex & 0xFF00) | MSG_ReadByte();
if (bits & U_FRAME) new.frame = (new.frame & 0xFF00) | MSG_ReadByte();
ent->state_previous = ent->state_current;
ent->state_current = new;
}
+ if (ent->state_current.active)
+ {
+ cl_entities_active[ent->state_current.number] = true;
+ // mark as visible (no kill this frame)
+ entlife[ent->state_current.number] = 2;
+ }
}
void CL_ReadEntityFrame(void)
EntityFrame_FetchFrame(&cl.entitydatabase, EntityFrame_MostRecentlyRecievedFrameNum(&cl.entitydatabase), &entityframe);
for (i = 0;i < entityframe.numentities;i++)
{
- // the entity lives again...
- entlife[entityframe.entitydata[i].number] = 2;
// copy the states
ent = &cl_entities[entityframe.entitydata[i].number];
ent->state_previous = ent->state_current;
ent->state_current = entityframe.entitydata[i];
ent->state_current.time = cl.mtime[0];
+ // the entity lives again...
+ entlife[ent->state_current.number] = 2;
+ cl_entities_active[ent->state_current.number] = true;
}
VectorCopy(cl.viewentoriginnew, cl.viewentoriginold);
VectorCopy(entityframe.eye, cl.viewentoriginnew);
case svc_setview:
cl.viewentity = MSG_ReadShort ();
+ // LordHavoc: assume first setview recieved is the real player entity
+ if (!cl.playerentity)
+ cl.playerentity = cl.viewentity;
break;
case svc_lightstyle:
case svc_spawnbaseline:
i = MSG_ReadShort ();
- // must use CL_EntityNum() to force cl.num_entities up
- CL_ParseBaseline (CL_EntityNum(i), false);
+ if (i < 0 || i >= MAX_EDICTS)
+ Host_Error ("CL_ParseServerMessage: svc_spawnbaseline: invalid entity number %i", i);
+ CL_ParseBaseline (cl_entities + i, false);
break;
case svc_spawnbaseline2:
i = MSG_ReadShort ();
- // must use CL_EntityNum() to force cl.num_entities up
- CL_ParseBaseline (CL_EntityNum(i), true);
+ if (i < 0 || i >= MAX_EDICTS)
+ Host_Error ("CL_ParseServerMessage: svc_spawnbaseline2: invalid entity number %i", i);
+ CL_ParseBaseline (cl_entities + i, true);
break;
case svc_spawnstatic:
CL_ParseStatic (false);