dimko1994
Новичок
Предисловие
Как известно у оригинально sa-mp клиента, да и у sa-mp сервера, почти нет никакой защиты от читеров. Сервер без античита - потенциальная жертва нечестных игроков! Как же тогда делают все эти античиты? Дело в том, что читерские программы могут имитировать только, встроенные в sa-mp функции, что нибудь простое типа SetPlayerPos (чит телепорта) или GivePlayerWeapon (чит на оружие)... Ни один чит не сможет имитировать сложную функцию, например запустить десматч или гонку, ни один чит на прямую не сможет изменить переменную введенную вами в скрипте, например цену дома. Эту слабость читерских программ и используют при написании античитов.
Как это делается?
Метод простой и сердитый - в sa-mp для игроков встроены команды двух типов "Дать" и "Узнать" или "Set" и "Get", то есть, если мы "дали" безоружному игроку, скажем, 500 патронов к минигану, а спустя 5 секунд мы "узнали" что у него их 1000, то можно смело говорить что это чит... То есть нужно сделать следующее - ввести переменные для каждого игрока - сколько патронов и на какое оружие ему давали. Даем "Set" игроку оружие и записываем кому сколько и чего дали в переменные. Спустя 5 секунд проверяем "Get" - если у игрока больше чем мы ему дали, то он чит!
Перейдем от слов к делу
Рассмотрим некоторые особенности... Перед нами стоит цель разработать безопасную функцию выдачи оружия, такую, в которую встроен независимый счетчик. Значит все оружие в моде теперь должно выдаваться только через эту функцию. НО. Есть одна проблема - встроенные в саму игру механизмы получения оружия, например выдача шотгана в полицейской машине, которую мы никак не сможем проконтролировать. Как это не печально, но наш античит будет проверять не все оружие. Начнем с того что определим максимальное количество видов оружия, в самом начале своего pwn пишем:
теперь введем список "зеленого оружия" в нем будет оружие которое дается самой игрой (например в машине полиции):
Оружие в этом списке будет игнорироваться сканером. Вы можете сами отредактировать список как вам удобно!
Далее введем массив переменных в которых будет храниться количество оружия у определенного игрока:
Задержка, препятствует срабатыванию сканера в момент выдачи оружия:
Далее напишем
это нам потом пригодится.
Итак мы ввели основные переменные с которыми будет работать наш античит. Теперь перейдем к функциям.
Функции
Функции можно писать в самом "низу" своего pwn. Первой функцией будет функция безопасной выдачи оружия в которую мы встроим счетчик патронов:
Еще раз напоминаю. что теперь ВСЕ оружие в вашем моде должно выдаваться через ACSGivePlayerWeapon.
Второй функцией будет функция проверки "зеленого оружия":
Функция возвращает 1 если проверяемое оружие есть в списке и 0 если его там нет.
Далее функция которая определяет холодное оружие:
Теперь напишем функцию сброса счетчиков игрока (если заметили, это модифицированная функция изъятия у игрока всего оружия):
Если используете в своем моде функцию изъятия оружия у игрока, то теперь надо отнимать все оружие ТОЛЬКО при помощи ACSResetPlayerWeapons(playerid).
Последней функцией будет сама функция проверки, которая будет удалять читеров с сервера:
Поскольку это public функция, ей нужен заголовок, его мы уже написали в самом начале ( forward ACSCheckBudWeapons(); )
Подключение
Все, теперь осталось подключить этот античит.
Первое что надо сделать - очищать счетчик игрока, если он вышел с сервера, для этого находим в своем pwn паблик OnPlayerDisconnect и пишем в него строку:
Теперь надо поставить функцию проверки оружия игроков на таймер, чтобы проверка выполнялась каждые 5 секунд - находим паблик OnGameModInit и добавляем в него строку:
Послесловие
Все, теперь ваш сервер хоть немного защищен от читеров.
Обо всех найденных ошибках в работе античита, а также свои вопросы, пишите здесь
Надеюсь эта тема вам помогла ставьте ++
Урок от OFFREAL.
Как известно у оригинально sa-mp клиента, да и у sa-mp сервера, почти нет никакой защиты от читеров. Сервер без античита - потенциальная жертва нечестных игроков! Как же тогда делают все эти античиты? Дело в том, что читерские программы могут имитировать только, встроенные в sa-mp функции, что нибудь простое типа SetPlayerPos (чит телепорта) или GivePlayerWeapon (чит на оружие)... Ни один чит не сможет имитировать сложную функцию, например запустить десматч или гонку, ни один чит на прямую не сможет изменить переменную введенную вами в скрипте, например цену дома. Эту слабость читерских программ и используют при написании античитов.
Как это делается?
Метод простой и сердитый - в sa-mp для игроков встроены команды двух типов "Дать" и "Узнать" или "Set" и "Get", то есть, если мы "дали" безоружному игроку, скажем, 500 патронов к минигану, а спустя 5 секунд мы "узнали" что у него их 1000, то можно смело говорить что это чит... То есть нужно сделать следующее - ввести переменные для каждого игрока - сколько патронов и на какое оружие ему давали. Даем "Set" игроку оружие и записываем кому сколько и чего дали в переменные. Спустя 5 секунд проверяем "Get" - если у игрока больше чем мы ему дали, то он чит!
Перейдем от слов к делу
Рассмотрим некоторые особенности... Перед нами стоит цель разработать безопасную функцию выдачи оружия, такую, в которую встроен независимый счетчик. Значит все оружие в моде теперь должно выдаваться только через эту функцию. НО. Есть одна проблема - встроенные в саму игру механизмы получения оружия, например выдача шотгана в полицейской машине, которую мы никак не сможем проконтролировать. Как это не печально, но наш античит будет проверять не все оружие. Начнем с того что определим максимальное количество видов оружия, в самом начале своего pwn пишем:
PHP:
#define MAX_WEAPONS 47
PHP:
new GreenWeaponList[] = {22,23,24,25};
Далее введем массив переменных в которых будет храниться количество оружия у определенного игрока:
PHP:
new pWeapons[MAX_PLAYERS][MAX_WEAPONS];
PHP:
new pWeaponDelay[MAX_PLAYERS];
PHP:
forward ACSCheckBudWeapons();
Итак мы ввели основные переменные с которыми будет работать наш античит. Теперь перейдем к функциям.
Функции
Функции можно писать в самом "низу" своего pwn. Первой функцией будет функция безопасной выдачи оружия в которую мы встроим счетчик патронов:
PHP:
ACSGivePlayerWeapon(playerid, weaponid, ammo)
{
pWeaponDelay[playerid] = 1;
if(IsColdWeapon(weaponid))
{ ammo = 1; pWeapons[playerid][weaponid] = ammo; } else {
pWeapons[playerid][weaponid] = pWeapons[playerid][weaponid] + ammo;}
GivePlayerWeapon(playerid, weaponid, ammo);
}
Второй функцией будет функция проверки "зеленого оружия":
PHP:
IsGreenWeapon(weaponid)
{
for(new i= 0;i<sizeof(GreenWeaponList);i++) {
if(GreenWeaponList[i] == weaponid) {return 1;}
}
return 0;
}
Далее функция которая определяет холодное оружие:
PHP:
IsColdWeapon(weaponid)
{
if(weaponid > 0 && weaponid < 16) {return 1;}
if(weaponid == 46) {return 1;}
return 0;
}
PHP:
ACSResetPlayerWeapons(playerid)
{
pWeaponDelay[playerid] = 1;
ResetPlayerWeapons(playerid);
for(new i=0;i<MAX_WEAPONS;i++)
{pWeapons[playerid][i] = 0;}
}
Последней функцией будет сама функция проверки, которая будет удалять читеров с сервера:
PHP:
public ACSCheckBudWeapons()
{
new wid, amm;
for(new i=0;i<MAX_PLAYERS;i++)
{
if(!IsPlayerConnected(i)) {continue;}
if(pWeaponDelay[i] > 0){pWeaponDelay[i]--; continue;}
for(new s=1;s<13;s++)
{
GetPlayerWeaponData(i, s, wid, amm);
if(amm == -1 && IsColdWeapon(wid)) {amm = 1;}
if(pWeapons[i][wid] < amm)
{
if(!IsGreenWeapon(wid))
{
ACSResetPlayerWeapons(i);
Kick(i);
continue;
}
}
if(amm >= 0) {pWeapons[i][wid] = amm;}
}
}
}
Подключение
Все, теперь осталось подключить этот античит.
Первое что надо сделать - очищать счетчик игрока, если он вышел с сервера, для этого находим в своем pwn паблик OnPlayerDisconnect и пишем в него строку:
PHP:
ACSResetPlayerWeapons(playerid);
PHP:
SetTimer("ACSCheckBudWeapons",5000,1);
Все, теперь ваш сервер хоть немного защищен от читеров.
Обо всех найденных ошибках в работе античита, а также свои вопросы, пишите здесь
Надеюсь эта тема вам помогла ставьте ++
Урок от OFFREAL.
Последнее редактирование:
