Max Rhine
Участник
- Сообщения
- 176
- Реакции
- 30
Всем доброго времени суток. Кратко обо мне :Оффтоп
Теперь к делу - на днях, нужно было сделать проверку дистанции между игроками. Нашёл 2 примера, переписал под свои нужды. В итоге - плагин скомпилировался без ошибок, а условие работало не корректно.
Первый пример, я взял с античита Little Anti-Cheat.
И
Отдельно тестировал aimlock в Little Anti-Cheat, проверка дистанции отказывалась работать
Второй пример нашёл на форуме, к сожалению, он отказался работать корректно.
В переделке 100% есть ошибки, т.к. сделал на коленке для примера
Вся проблема в том, чтобы сделать рабочую проверку дистанции двух игроков через
С sourcepawn'ом имею дело с 2017 года и до 2020 года просто ковырял коды. Начиная с прошлого месяца, sourcepawn начал наступать на пятки и давить своей массой. Знания английского и технического языка - 0.0001%
Теперь к делу - на днях, нужно было сделать проверку дистанции между игроками. Нашёл 2 примера, переписал под свои нужды. В итоге - плагин скомпилировался без ошибок, а условие работало не корректно.
Первый пример, я взял с античита Little Anti-Cheat.
Быдлокод первой версии:
public Action timer_check_aimlock(Handle timer)
{
float pos[3], pos2[3];
for (int i = 1; i <= MaxClients; i++)
{
if (!is_player_valid(i) || IsFakeClient(i))
{
continue;
}
if (!IsPlayerAlive(i) || GetClientTeam(i) < 2)
{
continue;
}
GetClientEyePosition(i, pos);
for (int k = 1; k <= MaxClients; k++)
{
if (!is_player_valid(k) || k == i)
{
continue;
}
if (GetClientTeam(k) == GetClientTeam(i))
{
continue;
}
if (!IsPlayerAlive(k) || GetClientTeam(k) < 2)
{
continue;
}
GetClientEyePosition(k, pos2);
if (GetVectorDistance(pos, pos2) < 300.0)
{
continue;
}
}
}
}
bool is_player_valid(int client)
{
return (client >= 1 && client <= MaxClients
&& IsClientConnected(client) && IsClientInGame(client));
}
Быдлокод второй версии:
public Action timer_check_aimlock(Handle timer)
{
float pos[3], pos2[3];
for (int i = 1; i <= MaxClients; i++)
{
if (!is_player_valid(i) || IsFakeClient(i))
{
GetClientEyePosition(i, pos);
}
for (int k = 1; k <= MaxClients; k++)
{
if (!is_player_valid(k) || k == i)
{
GetClientEyePosition(k, pos2);
}
if (GetVectorDistance(pos, pos2) < 5.0)
{
PrintToChatAll("Близко, условие не работает", client); // тест
}
else
{
PrintToChatAll("Далеко, условие работает", client); // тест
}
}
}
}
bool is_player_valid(int client)
{
return (client >= 1 && client <= MaxClients
&& IsClientConnected(client) && IsClientInGame(client));
}
Второй пример нашёл на форуме, к сожалению, он отказался работать корректно.
Оригинальный вид:
static const float HULL_SIZES[][] = {{-2.0, -2.0, -2.0}, {2.0, 2.0, 2.0}}; // 4x4x4
stock int GetAvailableTargets(int client, int targets[], int maxsize)
{
int i, t, num;
static float pos[3], eye[3];
GetClientEyePosition(client, eye);
for(i = 1, t = GetClientTeam(client); i <= MaxClients && num < maxsize; ++i)
if(i != client && IsClientInGame(i) && IsPlayerAlive(i) && t != GetClientTeam(i))
{
GetClientEyePosition(i, pos);
// проверяем есть ли препятствия м/у глазами игроков
TR_TraceHullFilter(eye, pos, HULL_SIZES[0], HULL_SIZES[1], CONTENTS_SOLID|CONTENTS_MOVEABLE|CONTENTS_MONSTER|CONTENTS_DEBRIS|CONTENTS_HITBOX, DontHitOwnerOrNade, client);
// если препятствий нет, то заносим в массив
if(TR_GetEntityIndex() == i) targets[num++] = i;
}
return num;
}
Переделка:
int i, t, num;
static float pos[3], eye[3];
GetClientEyePosition(client, eye);
for(i = 1, t = GetClientTeam(client); i <= MaxClients && num < maxsize; ++i)
if(i != client && IsClientInGame(i) && IsPlayerAlive(i) && t != GetClientTeam(i))
{
GetClientEyePosition(i, pos);
if (GetVectorDistance(eye, pos) < 5.0)
{
PrintToChatAll("Близко, условие не работает", client); // тест
}
else
{
PrintToChatAll("Далеко, условие работает", client); // тест
}
}
return num;
Вся проблема в том, чтобы сделать рабочую проверку дистанции двух игроков через
GetVectorDistance() <= 0.0
. Игра : сss v34