PDA

Просмотр полной версии : [Античит] Анти Invisible Fly-Hack



vovandolg
27.01.2016, 04:31
Описание:


И так часто играя на серверах замечал появились летуны которых не видит радар GetPlayerVelocity, не мог засечь их скорость так скажем.
В общем вижу спидометр написанный на GetPlayerPos, начал пробовать писать с нуля свой же,
не получалось с начало, ибо цифры не мог преобразовать правильно(пользователь Profyan помог)
Потом я начал писать Анти-SH и Анти FlyHack'и на новом измерении скорости,
да вот только всё бы не чего пока не дошёл до того момента когда игроки любят кататься на крышах авто,
я сделал всё таки проверку на то что авто рядом, но это возня под конец второго дня меня привела к тому что у каждого свой пинг
и будет по разному определять есть ли авто рядом или нет, потом я перенаправился с мыслями,
потёр это всё и решил подумать что написать так, чтобы часто не проверяло на новую скорость.

Исследование:

При использовании такого чита игрок игнорирует GetPlayerVelocity, но не GetPlayerPos.

Рассуждение:

Как бы не двигался игрок или не толкали его, у него всегда меняется координация и значение скорости в GetPlayerVelocity.

Вывод:

Пишем проверку на обе скорости.

Код:



new Float:pos_x[MAX_PLAYERS], Float:pos_y[MAX_PLAYERS],
Float:pos_z[MAX_PLAYERS], SpeedCheck[MAX_PLAYERS];

stock SetPlayerPosEx(playerid, Float:X, Float:Y, Float:Z)
{
SetPVarInt(playerid, "PauseUpdate", 3);
SetPlayerPos(playerid, X, Y, Z);
return 1;
}
#if defined _ALS_SetPlayerPos
#undef SetPlayerPos
#else
#define _ALS_SetPlayerPos
#endif
#define SetPlayerPos SetPlayerPosEx

public OnPlayerSpawn(playerid)
{
SpeedCheck[playerid] = SetTimerEx("UpdatePosition", 250, 1, "i", playerid);
//под секунду тоже настроить можно, только цифры p_distance свои вычисляйте
return 1;
}

public OnPlayerDisconnect(playerid, reason)
{
KillTimer(SpeedCheck[playerid]);
return 1;
}

forward UpdatePosition(playerid);
public UpdatePosition(playerid)
{
new Float:p_x, Float:p_y, Float:p_z;
GetPlayerPos(playerid, p_x, p_y, p_z);
new Float:p_distance =
floatpower(p_x - pos_x[playerid],2.0) +
floatpower(p_y - pos_y[playerid],2.0) +
floatpower(p_z - pos_z[playerid],2.0);
pos_x[playerid] = p_x;
pos_y[playerid] = p_y;
pos_z[playerid] = p_z;
//у меня 2 разные функции на проверку скорости Onfoot и Vehicle(мне так удобнее),
//у вас может быть другая функция на проверку скорости через GetPlayerVelocity вот её и юзайте в проверке
if((SpeedOnfoot(playerid) == 0 || SpeedVehicle(playerid) == 0) && p_distance > 50.0 && !GetPVarInt(playerid,"PauseUpdate"))
{
SetPVarInt(playerid,"KickPlayer",GetPVarInt(playerid,"KickPlayer")+1);
//Ложные срабатывания при смерти и ТП к администрации
//Почему 2 спросите? Потому что может стоять костыль на респ после смерти который меняет респу при смерти и перед её респом
if(GetPVarInt(playerid,"KickPlayer") > 2) //Можно поставить 3 и тем самым дать чуток форы читеру на 250 мсек =D
{
//Ставим здесь наказание негодяю)
}
}
if(p_distance == 0.0 && GetPVarInt(playerid,"KickPlayer")) DeletePVar(playerid,"KickPlayer"); //Если не шевелимся, то обнуляем..
// 4 раза в секунду это стабильное обновление проверки, можно поменять, но тут придется менять и значение p_distance
return 1;
}

В какой-нибудь секундный таймер чёркаем этот код:

if(GetPVarInt(playerid,"PauseUpdate") > 0)
{
SetPVarInt(playerid,"PauseUpdate",GetPVarInt(playerid,"PauseUpdate")-1);
if(GetPVarInt(playerid,"PauseUpdate") == 1)
{
DeletePVar(playerid,"PauseUpdate");
}
}


Вот и всё теперь Invisible Fly-Hack пресечён как пешком так и на авто + ТП по карте за малость метров
P.S. Я написал этот код под все версии SA-MP которые сейчас используются,
вы можете упростить для себя этот код используя этот native VectorSize (http://pro-pawn.ru/showthread.php?6407), но только если у вас версия Server SA-MP 0.3z RC3 и выше!

Автор урока:

vovandolg

Помогали:

Profyan, Daniel_Cortez

seriu
28.01.2016, 03:53
Вот этого что то я не понял.

return SetTimerEx("UpdatePosition", 250, 0, "i", playerid);

Почему не сделал так

SpeedCheck[playerid] = SetTimerEx("UpdatePosition", 4000,true, "i", playerid);

vovandolg
28.01.2016, 04:49
Привычка такая) я с большими таймерами работаю у себя, времени не было проверять успевают ли они за время обновления выполнить все проверки, а так будет уверено после всех действий апдейтить.
Ну вот возьмем пример, работа в цеху детали на конвейере подаются тебе и они подаются быстрее чем ты успеваешь их взять
или вот так
детали подаются нажатием на кнопку которая у тебя под рукой, то есть ты знаешь что успеешь и детали мимо не пробегут)

Prolific
02.02.2016, 21:48
Суть в целом интересная (сверять скорости).

vovandolg
06.02.2016, 01:49
Обновил шапку темы, мелкий фикс.

vasyok28
03.03.2017, 16:32
Вопрос к автору, каким образом античит ловит ТП ?
Вроде ТП не будет ловить, так как не пройдет через эту проверку:


if(GetPVarInt(playerid,"KickPlayer") > 2)
{
//Ставим здесь наказание негодяю)
}


Прошу поправить меня если я не прав

Nexius_Tailer
03.03.2017, 17:55
1. Нет функций SpeedVehicle и SpeedOnfoot
2. SetPlayerPosEx всегда будет возвращать 1, а также в ней нет проверки входных данных на валидность

Ну и название подменяемой функции я бы всё-же делал не таким банальным (под Ex обычно понимается "Extended", т.е. расширенная, где есть какие-то дополнительные параметры)

vovandolg
03.03.2017, 18:12
Вопрос к автору, каким образом античит ловит ТП ?
Вроде ТП не будет ловить, так как не пройдет через эту проверку:


if(GetPVarInt(playerid,"KickPlayer") > 2)
{
//Ставим здесь наказание негодяю)
}


Прошу поправить меня если я не прав


SetPVarInt(playerid,"KickPlayer",GetPVarInt(playerid,"KickPlayer")+1);
//Ложные срабатывания при смерти и ТП к администрации

Ctrl + F нажми с открытыми спойлерам и введи туда это если не веришь мне))

- - - Добавлено - - -


1. Нет функций SpeedVehicle и SpeedOnfoot
2. SetPlayerPosEx всегда будет возвращать 1, а также в ней нет проверки входных данных на валидность

Ну и название подменяемой функции я бы всё-же делал не таким банальным (под Ex обычно понимается "Extended", т.е. расширенная, где есть какие-то дополнительные параметры)

Я как мануал это раньше писал, редактировать не стал,
так как забросил мод в котором это делал
да и саму систему можно гораздо лучше и проще реализовать,
это первый мой мануал бы всё таки:pardon:

Дописывать не чего не стану так как больше в сампце не ковыряюсь и pawn в мозгах так ради забавы остался.

Суть кода остаётся всё равно понятной:

Суть в целом интересная (сверять скорости).

Morris
06.06.2019, 12:58
Хороший урок, интересно такое можно реализовать на С++?

codestation
01.07.2019, 19:19
Хороший урок, интересно такое можно реализовать на С++?

Естественно, вот https://github.com/Zeex/sampgdk