Здравствуйте, уважаемые форумчане!
В этой теме я научу Вас, как написать античит на оружие.
Урок опубликован для SAMP-Портала: ISAMP.3DN.RU.
Автор темы: ARTEM_SKOROBAGACH.
В самом начале своего pwn пишем:
Код
#define MAX_WEAPONS 47
теперь введем список "зеленого оружия", в нем будет оружие, которое дается самой игрой (например в машине полиции):
Код
new pWeapons[MAX_PLAYERS][MAX_WEAPONS];
Задержка, препятствует срабатыванию сканера в момент выдачи оружия:
Код
new pWeaponDelay[MAX_PLAYERS];
Далее напишем:
Код
forward ACSCheckBudWeapons();
Это нам потом пригодится.
Итак, мы ввели основные переменные, с которыми будет работать наш античит. Теперь перейдем к функциям:
Функции можно писать в самом "низу" своего pwn. Первой функцией будет функция безопасной выдачи оружия, в которую мы встроим счетчик патронов.
Код
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);
}
Еще раз напоминаю. что теперь ВСЕ оружие в вашем моде должно выдаваться через ACSGivePlayerWeapon.
Второй функцией будет функция проверки "зеленого оружия":
Код
IsGreenWeapon(weaponid)
{
for(new i= 0;i<sizeof(GreenWeaponList);i++) {
if(GreenWeaponList [i]== weaponid) {return 1;}
}
return 0;
}
Функция возвращает 1, если проверяемое оружие есть в списке и 0, если его там нет.
Далее функция, которая определяет холодное оружие:
Код
IsColdWeapon(weaponid)
{
if(weaponid > 0 && weaponid < 16) {return 1;}
if(weaponid == 46) {return 1;}
return 0;
}
Теперь напишем функцию сброса счетчиков игрока (если заметили, это модифицированная функция изъятия у игрока всего оружия):
Код
ACSResetPlayerWeapons(playerid)
{
pWeaponDelay [playerid]= 1;
ResetPlayerWeapons(playerid);
for(new i=0;i<MAX_WEAPONS;i++)
{pWeapons [playerid][i]= 0;}
}
Если используете в своем моде функцию изъятия оружия у игрока, то теперь надо отнимать все оружие ТОЛЬКО при помощи ACSResetPlayerWeapons(playerid).
Последней функцией будет сама функция проверки, которая будет удалять читеров с сервера.
Код
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;}
}
}
}
Поскольку это public функция, ей нужен заголовок, его мы уже написали в самом начале ( forward ACSCheckBudWeapons(); )
Подключение:
Все, теперь осталось подключить этот античит.
Первое что надо сделать - очищать счетчик игрока, если он вышел с сервера, для этого находим в своем pwn паблик OnPlayerDisconnect и пишем в него строку
Код
ACSResetPlayerWeapons(playerid);
Теперь надо поставить функцию проверки оружия игроков на таймер, чтобы проверка выполнялась каждые 5 секунд - находим паблик OnGameModInit и добавляем в него строку:
Код
SetTimer("ACSCheckBudWeapons",5000,1);
Защита поставится 100%, если в чем-то не промахнетесь.