/** * Return the closest active player on the given team to the given position. * If 'distance' is non-NULL, the distance to the closest player is returned in it. */ extern CBasePlayer *UTIL_GetClosestPlayer( const Vector &pos, int team, float *distance ) { CBasePlayer *closePlayer = NULL; float closeDistSq = 999999999999.9f; for ( int i = 1; i <= gpGlobals->maxClients; ++i ) { CBasePlayer *player = static_cast<CBasePlayer *>( UTIL_PlayerByIndex( i ) ); if (!IsEntityValid( player )) continue; if (!player->IsAlive()) continue; if (player->GetTeamNumber() != team) continue; Vector playerOrigin = GetCentroid( player ); float distSq = (playerOrigin - pos).LengthSqr(); if (distSq < closeDistSq) { closeDistSq = distSq; closePlayer = static_cast<CBasePlayer *>( player ); } } if (distance) *distance = (float)sqrt( closeDistSq ); return closePlayer; }
// Return the closest active player on the given team to the given position. // If 'distance' is non-NULL, the distance to the closest player is returned in it. extern CBasePlayer *UTIL_GetClosestPlayer(const Vector *pos, int team, float *distance) { CBasePlayer *closePlayer = NULL; float closeDistSq = 1.0e12f; // 999999999999.9f for (int i = 1; i <= gpGlobals->maxClients; ++i) { CBasePlayer *player = static_cast<CBasePlayer *>(UTIL_PlayerByIndex(i)); if (!IsEntityValid(player)) continue; if (!player->IsAlive()) continue; if (player->m_iTeam != team) continue; float distSq = (player->pev->origin - *pos).LengthSquared(); if (distSq < closeDistSq) { closeDistSq = distSq; closePlayer = player; } } if (distance) *distance = Q_sqrt(closeDistSq); return closePlayer; }
CBasePlayer *CHostageImprov::__MAKE_VHOOK(GetClosestPlayerByTravelDistance)(int team, float *range) const { CBasePlayer *close = NULL; float closeRange = 9.9999998e10f; if (GetLastKnownArea() == NULL) return NULL; for (int i = 1; i <= gpGlobals->maxClients; ++i) { CBasePlayer *player = static_cast<CBasePlayer *>(UTIL_PlayerByIndex(i)); if (!IsEntityValid(player)) continue; if (player->IsAlive() && (team == UNASSIGNED || player->m_iTeam == team)) { ShortestPathCost cost; Vector vecCenter = player->Center(); float_precision range = NavAreaTravelDistance(GetLastKnownArea(), TheNavAreaGrid.GetNearestNavArea(&vecCenter), cost); if (range > 0 && range < closeRange) { closeRange = range; close = player; } } } if (range) *range = closeRange; return close; }
//-------------------------------------------------------------------------------------------------------------- static void PrefixChanged( IConVar *c, const char *oldPrefix, float flOldValue ) { if ( TheCFBots() && TheCFBots()->IsServerActive() ) { for( int i = 1; i <= gpGlobals->maxClients; ++i ) { CBasePlayer *player = static_cast<CBasePlayer *>( UTIL_PlayerByIndex( i ) ); if ( !player ) continue; if ( !player->IsBot() || !IsEntityValid( player ) ) continue; CCFBot *bot = dynamic_cast< CCFBot * >( player ); if ( !bot ) continue; // set the bot's name char botName[MAX_PLAYER_NAME_LENGTH]; UTIL_ConstructBotNetName( botName, MAX_PLAYER_NAME_LENGTH, bot->GetProfile() ); engine->SetFakeClientConVarValue( bot->edict(), "name", botName ); } } }
void World::KillEntity(Entity* entity) { ///DOC: Ignoré si l'entité est invalide if (IsEntityValid(entity)) m_killedEntities.UnboundedSet(entity->GetId(), true); }
/** * Return true if moving from "start" to "finish" will cross a player's line of fire. * The path from "start" to "finish" is assumed to be a straight line. * "start" and "finish" are assumed to be points on the ground. */ bool IsCrossingLineOfFire( const Vector &start, const Vector &finish, CBaseEntity *ignore, int ignoreTeam ) { for ( int p=1; p <= gpGlobals->maxClients; ++p ) { CBasePlayer *player = static_cast<CBasePlayer *>( UTIL_PlayerByIndex( p ) ); if (!IsEntityValid( player )) continue; if (player == ignore) continue; if (!player->IsAlive()) continue; if (ignoreTeam && player->GetTeamNumber() == ignoreTeam) continue; // compute player's unit aiming vector Vector viewForward; AngleVectors( player->EyeAngles() + player->GetPunchAngle(), &viewForward ); const float longRange = 5000.0f; Vector playerOrigin = GetCentroid( player ); Vector playerTarget = playerOrigin + longRange * viewForward; Vector result( 0, 0, 0 ); if (IsIntersecting2D( start, finish, playerOrigin, playerTarget, &result )) { // simple check to see if intersection lies in the Z range of the path float loZ, hiZ; if (start.z < finish.z) { loZ = start.z; hiZ = finish.z; } else { loZ = finish.z; hiZ = start.z; } if (result.z >= loZ && result.z <= hiZ + HumanHeight) return true; } } return false; }
CBasePlayer *CHostageImprov::__MAKE_VHOOK(IsAnyPlayerLookingAtMe)(int team, float cosTolerance) const { for (int i = 1; i <= gpGlobals->maxClients; ++i) { CBasePlayer *player = static_cast<CBasePlayer *>(UTIL_PlayerByIndex(i)); if (!IsEntityValid(player)) continue; if (player->IsAlive() && (team == UNASSIGNED || player->m_iTeam == team)) { if (IsPlayerLookingAtMe(player, cosTolerance)) { return player; } } } return NULL; }