/* ================== CL_ParseBaseline ================== */ void CL_ParseBaseline( sizebuf_t *msg ) { int newnum; float timebase; cl_entity_t *ent; Delta_InitClient (); // finalize client delta's newnum = BF_ReadWord( msg ); if( newnum < 0 ) Host_Error( "CL_SpawnEdict: invalid number %i\n", newnum ); if( newnum >= clgame.maxEntities ) Host_Error( "CL_AllocEdict: no free edicts\n" ); ent = CL_EDICT_NUM( newnum ); if( !ent ) Host_Error( "CL_ParseBaseline: got invalid entity"); Q_memset( &ent->prevstate, 0, sizeof( ent->prevstate )); ent->index = newnum; if( cls.state == ca_active ) timebase = cl.mtime[0]; else timebase = 1.0f; // sv.state == ss_loading MSG_ReadDeltaEntity( msg, &ent->prevstate, &ent->baseline, newnum, CL_IsPlayerIndex( newnum ), timebase ); }
void CL_DeltaEntity( sizebuf_t *msg, frame_t *frame, int newnum, entity_state_t *old, qboolean unchanged ) { cl_entity_t *ent; entity_state_t *state; qboolean newent = (old) ? false : true; qboolean result = true; ent = CL_EDICT_NUM( newnum ); state = &cls.packet_entities[cls.next_client_entities % cls.num_client_entities]; ent->index = newnum; if( newent ) old = &ent->baseline; if( unchanged ) *state = *old; else result = MSG_ReadDeltaEntity( msg, old, state, newnum, CL_IsPlayerIndex( newnum ), cl.mtime[0] ); if( !result ) { if( newent ) Host_Error( "Cl_DeltaEntity: tried to release new entity\n" ); CL_KillDeadBeams( ent ); // release dead beams #if 0 // this is for reference if( state->number == -1 ) Msg( "Entity %i was removed from server\n", newnum ); else Msg( "Entity %i was removed from delta-message\n", newnum ); #endif if( state->number == -1 ) { ent->curstate.messagenum = 0; ent->baseline.number = 0; } // entity was delta removed return; } // entity is present in newframe state->messagenum = cl.parsecount; state->msg_time = cl.mtime[0]; cls.next_client_entities++; frame->num_entities++; // set player state ent->player = CL_IsPlayerIndex( ent->index ); if( state->effects & EF_NOINTERP || newent ) { // duplicate the current state so lerping doesn't hurt anything ent->prevstate = *state; } else { // shuffle the last state to previous ent->prevstate = ent->curstate; } // NOTE: always check modelindex for new state not current if( Mod_GetType( state->modelindex ) == mod_studio ) { CL_UpdateStudioVars( ent, state, newent ); } else if( Mod_GetType( state->modelindex ) == mod_brush ) { CL_UpdateBmodelVars( ent, state, newent ); } // set right current state ent->curstate = *state; CL_UpdatePositions( ent ); }