Всем привет. Мне нужна функция, чтобы найти игроков на определенном расстоянии. Но так, чтобы она не игнорировала стены и пропы, то есть если между игроками есть что-то, то тогда нужно исключить данного игрока из поиска.
Я использовал эту функцию из плагина для турели, которая находит ближайшего игрока:
Но она очень плохо работает, зачастую не видит игрока в упор, даже если между ними ничего нет. Не подскажите, как можно сделать нормальную функцию? Заранее спаибо
Я использовал эту функцию из плагина для турели, которая находит ближайшего игрока:
C-подобный:
stock FindFirstTargetInRange(client, Float:vAngle[3], Float:vEntPosition[3], Float:entHeight = 60.0)
{
new Float:vClientPosition[3];
GetEntPropVector(client, Prop_Send, "m_vecOrigin", vEntPosition);
vEntPosition[2] += entHeight;
new Float:fDistance[MAXPLAYERS + 1];
new iTager[MAXPLAYERS + 1];
new numb = 0;
for (new i = 1; i <= MaxClients; i++)
{
if (IsClientConnected(i) && IsClientInGame(i) && IsPlayerAlive(i) && GetClientTeam(client) != GetClientTeam(i))
{
GetClientEyePosition(i, vClientPosition);
fDistance[numb] = GetVectorDistance(vClientPosition, vEntPosition, false);
if(fDistance[numb] <= 9000000 && fDistance[numb] > 50)
{
iTager[numb] = i;
numb++;
}
}
}
new zombie = GetZombieMinDistance(iTager, fDistance, numb+1);
if(zombie < 1 || !IsClientInGame(zombie) || !IsPlayerAlive(zombie))
{
return (-1);
}
GetClientEyePosition(zombie, vClientPosition);
vClientPosition[2] -= 10.0;
MakeVectorFromPoints(vEntPosition, vClientPosition, vAngle);
vClientPosition[2] += 10.0;
//NormalizeVector(vAngle, vAngle);
GetVectorAngles(vAngle, vAngle);
new Handle:trace = TR_TraceRayFilterEx(vEntPosition, vClientPosition, MASK_SHOT, RayType_EndPoint, TraceASDF, client);
if(!TR_DidHit(trace))
{
CloseHandle(trace);
return (zombie);
}
CloseHandle(trace);
return (-1);
}
GetZombieMinDistance(clients[], Float:distance[], max_clients)
{
if(max_clients < 1)
{
return -1;
}
new Float:min_distance = 999999999.0;
new zombie = -1;
for(new i = 0; i < max_clients; i++)
{
// 999999999 > 10000000
if(min_distance > distance[I])
{
if(distance[I] <= 9000000009 && distance[I] > 50)
{
min_distance = distance[I];
zombie = clients[I];
}
}
}
return zombie;
}
public bool:TraceASDF(entity, mask, any:data)
{
return (data != entity);
}
Но она очень плохо работает, зачастую не видит игрока в упор, даже если между ними ничего нет. Не подскажите, как можно сделать нормальную функцию? Заранее спаибо

Последнее редактирование: