/* ==================== SV_AddLaddersToPmove ==================== */ void SV_AddLaddersToPmove( areanode_t *node, const vec3_t pmove_mins, const vec3_t pmove_maxs ) { link_t *l, *next; edict_t *check; physent_t *pe; // get water edicts for( l = node->water_edicts.next; l != &node->water_edicts; l = next ) { next = l->next; check = EDICT_FROM_AREA( l ); if( check->v.solid != SOLID_NOT ) // disabled ? continue; // only brushes can have special contents if( Mod_GetType( check->v.modelindex ) != mod_brush ) continue; if( !BoundsIntersect( pmove_mins, pmove_maxs, check->v.absmin, check->v.absmax )) continue; if( svgame.pmove->nummoveent == MAX_MOVEENTS ) return; pe = &svgame.pmove->moveents[svgame.pmove->nummoveent]; if( SV_CopyEdictToPhysEnt( pe, check )) svgame.pmove->nummoveent++; } // recurse down both sides if( node->axis == -1 ) return; if( pmove_maxs[node->axis] > node->dist ) SV_AddLaddersToPmove( node->children[0], pmove_mins, pmove_maxs ); if( pmove_mins[node->axis] < node->dist ) SV_AddLaddersToPmove( node->children[1], pmove_mins, pmove_maxs ); }
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 ); }
/* ================== CL_ParseStaticEntity static client entity ================== */ void CL_ParseStaticEntity( sizebuf_t *msg ) { entity_state_t state; cl_entity_t *ent; int i; Q_memset( &state, 0, sizeof( state )); state.modelindex = BF_ReadShort( msg ); state.sequence = BF_ReadByte( msg ); state.frame = BF_ReadByte( msg ); state.colormap = BF_ReadWord( msg ); state.skin = BF_ReadByte( msg ); for( i = 0; i < 3; i++ ) { state.origin[i] = BF_ReadCoord( msg ); state.angles[i] = BF_ReadBitAngle( msg, 16 ); } state.rendermode = BF_ReadByte( msg ); if( state.rendermode != kRenderNormal ) { state.renderamt = BF_ReadByte( msg ); state.rendercolor.r = BF_ReadByte( msg ); state.rendercolor.g = BF_ReadByte( msg ); state.rendercolor.b = BF_ReadByte( msg ); state.renderfx = BF_ReadByte( msg ); } i = clgame.numStatics; if( i >= MAX_STATIC_ENTITIES ) { MsgDev( D_ERROR, "CL_ParseStaticEntity: static entities limit exceeded!\n" ); return; } ent = &clgame.static_entities[i]; clgame.numStatics++; ent->index = 0; // ??? ent->baseline = state; ent->curstate = state; ent->prevstate = state; // statics may be respawned in game e.g. for demo recording if( cls.state == ca_connected ) ent->trivial_accept = INVALID_HANDLE; // setup the new static entity CL_UpdateEntityFields( ent ); if( Mod_GetType( state.modelindex ) == mod_studio ) { CL_UpdateStudioVars( ent, &state, true ); // animate studio model ent->curstate.animtime = cl.time; ent->curstate.framerate = 1.0f; ent->latched.prevframe = 0.0f; } R_AddEfrags( ent ); // add link }