Поиск ближайшего игрока

Der Helfer

[WCS] Пытается оживить Страйкера
Сообщения
60
Реакции
20
Всем доброго времени суток, может кто подсказать, как найти ближайшего игрока в некотором радиусе?
 
Решение
C-подобный:
int UTIL_FindNearestPlayer(int iClient, float &flDistance = 0.0)
{
    int iTarget;
    float vecPosition[2][3];

    GetEntPropVector(iClient, Prop_Send, "m_vecOrigin", vecPosition[0]);
    int iClientTeam = GetClientTeam(iClient);
    int iTargetTeam = 0;
    float flTempDistance;

    for (int iPlayer = MaxClients; iPlayer != 0; --iPlayer)
    {
        if (!IsClientInGame(iPlayer) || IsFakeClient(iPlayer) || iPlayer == iClient || !IsPlayerAlive(iPlayer))
        {
            continue;
        }

        iTargetTeam = GetClientTeam(iPlayer);
        if (iTargetTeam < 2 || iTargetTeam == iClientTeam)
        {
            continue;
        }

        GetEntPropVector(iPlayer, Prop_Send, "m_vecOrigin", vecPosition[1])...

Kruzya

Участник
Сообщения
12,970
Реакции
10,914
  • Команда форума
  • #2
C-подобный:
int UTIL_FindNearestPlayer(int iClient, float &flDistance = 0.0)
{
    int iTarget;
    float vecPosition[2][3];

    GetEntPropVector(iClient, Prop_Send, "m_vecOrigin", vecPosition[0]);
    int iClientTeam = GetClientTeam(iClient);
    int iTargetTeam = 0;
    float flTempDistance;

    for (int iPlayer = MaxClients; iPlayer != 0; --iPlayer)
    {
        if (!IsClientInGame(iPlayer) || IsFakeClient(iPlayer) || iPlayer == iClient || !IsPlayerAlive(iPlayer))
        {
            continue;
        }

        iTargetTeam = GetClientTeam(iPlayer);
        if (iTargetTeam < 2 || iTargetTeam == iClientTeam)
        {
            continue;
        }

        GetEntPropVector(iPlayer, Prop_Send, "m_vecOrigin", vecPosition[1]);
        flTempDistance = GetVectorDistance(vecPosition[0], vecPosition[1], true);

        // DBG("UTIL_FindNearestPlayer(): %d %f %f", iPlayer, flTempDistance, flDistance)
        if (iTarget == 0 || flTempDistance < flDistance) {
            iTarget = iPlayer;
            flDistance = flTempDistance;
        }
    }

    // DBG("UTIL_FindNearestPlayer(): %L %f", iTarget, flDistance)
    return iTarget;
}

Такое писал лет 7 назад ещё, но оно ищет строго вражеского игрока. Код сами увидите, думаю, который нужно подрезать.
 
Решение

Der Helfer

[WCS] Пытается оживить Страйкера
Сообщения
60
Реакции
20
C-подобный:
int UTIL_FindNearestPlayer(int iClient, float &flDistance = 0.0)
{
    int iTarget;
    float vecPosition[2][3];

    GetEntPropVector(iClient, Prop_Send, "m_vecOrigin", vecPosition[0]);
    int iClientTeam = GetClientTeam(iClient);
    int iTargetTeam = 0;
    float flTempDistance;

    for (int iPlayer = MaxClients; iPlayer != 0; --iPlayer)
    {
        if (!IsClientInGame(iPlayer) || IsFakeClient(iPlayer) || iPlayer == iClient || !IsPlayerAlive(iPlayer))
        {
            continue;
        }

        iTargetTeam = GetClientTeam(iPlayer);
        if (iTargetTeam < 2 || iTargetTeam == iClientTeam)
        {
            continue;
        }

        GetEntPropVector(iPlayer, Prop_Send, "m_vecOrigin", vecPosition[1]);
        flTempDistance = GetVectorDistance(vecPosition[0], vecPosition[1], true);

        // DBG("UTIL_FindNearestPlayer(): %d %f %f", iPlayer, flTempDistance, flDistance)
        if (iTarget == 0 || flTempDistance < flDistance) {
            iTarget = iPlayer;
            flDistance = flTempDistance;
        }
    }

    // DBG("UTIL_FindNearestPlayer(): %L %f", iTarget, flDistance)
    return iTarget;
}

Такое писал лет 7 назад ещё, но оно ищет строго вражеского игрока. Код сами увидите, думаю, который нужно подрезать.
Спасибо, немного изменил под свою задачу и все работает отлично
 
Сверху Снизу