Главный редактор форума: Doc-John | Текущая дата: 30.11.2024, 06:46
  • Страница 1 из 1
  • 1
[Урок] Античит на оружие
Оффлайн
Суббота, 19.07.2014, 15:37 | Сообщение # 1
Сообщений:
12
2
Здравствуйте, уважаемые форумчане!
В этой теме я научу Вас, как написать античит на оружие.
Урок опубликован для 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%, если в чем-то не промахнетесь.
  • Страница 1 из 1
  • 1
Поиск: