Pawno-SAMP
Главная
Вход
Регистрация
Вторник, 15.07.2025, 10:47Приветствую Вас Гость | RSS
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
[АнтиЧит] Оружее
UlkiorraJeezyДата: Суббота, 14.07.2012, 15:15 | Сообщение # 1
Лейтенант
Группа: Администраторы
Сообщений: 71
Репутация: 0
Статус: Offline
1. Рассмотрим некоторые особенности... Перед нами стоит цель разработать безопасную функцию выдачи оружия, такую, в которую встроен независимый счетчик. Значит все оружие в моде теперь должно выдаваться только через эту функцию. НО. Есть одна проблема - встроенные в саму игру механизмы получения оружия, например выдача шотгана в полицейской машине, которую мы никак не сможем проконтролировать. Как это не печально, но наш античит будет проверять не все оружие. Начнем с того что определим максимальное количество видов оружия, в самом начале своего pwn пишем:
Code
#define MAX_WEAPONS 47  

2. теперь введем список "зеленого оружия" в нем будет оружие которое дается самой игрой (например в машине полиции):
Code
new GreenWeaponList[] = {22,23,24,25};

3. Оружие в этом списке будет игнорироваться сканером. Вы можете сами отредактировать список как вам удобно!
Далее введем массив переменных в которых будет храниться количество оружия у определенного игрока:
Code
new pWeapons[MAX_PLAYERS][MAX_WEAPONS];  

4. Задержка, препятствует срабатыванию сканера в момент выдачи оружия:
Code
new pWeaponDelay[MAX_PLAYERS];  

5. Далее напишем
Code
forward ACSCheckBudWeapons();  

6. forward ACSCheckBudWeapons();
это нам потом пригодится.
Итак мы ввели основные переменные с которыми будет работать наш античит. Теперь перейдем к функциям.
Функции
Функции можно писать в самом "низу" своего pwn. Первой функцией будет функция безопасной выдачи оружия в которую мы встроим счетчик патронов:
Code
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);
}  

7. Еще раз напоминаю. что теперь ВСЕ оружие в вашем моде должно выдаваться через ACSGivePlayerWeapon.
Второй функцией будет функция проверки "зеленого оружия":
Code
IsGreenWeapon(weaponid)
{
for(new i= 0;i<sizeof(GreenWeaponList);i++) {
if(GreenWeaponList[i] == weaponid) {return 1;}
}
return 0;
}

8. Функция возвращает 1 если проверяемое оружие есть в списке и 0 если его там нет.
Далее функция которая определяет холодное оружие:
Code
IsColdWeapon(weaponid)
{
if(weaponid > 0 && weaponid < 16) {return 1;}
if(weaponid == 46) {return 1;}
return 0;
}  

9. Теперь напишем функцию сброса счетчиков игрока (если заметили, это модифицированная функция изъятия у игрока всего оружия):
Code
ACSResetPlayerWeapons(playerid)
{
pWeaponDelay[playerid] = 1;
ResetPlayerWeapons(playerid);
for(new i=0;i<MAX_WEAPONS;i++)
{pWeapons[playerid][i] = 0;}
}

10. Если используете в своем моде функцию изъятия оружия у игрока, то теперь надо отнимать все оружие ТОЛЬКО при помощи ACSResetPlayerWeapons(playerid).
Последней функцией будет сама функция проверки, которая будет удалять читеров с сервера:
Code
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;}
}
}
}

11.Поскольку это public функция, ей нужен заголовок, его мы уже написали в самом начале ( forward ACSCheckBudWeapons(); )
Подключение
Все, теперь осталось подключить этот античит.
Первое что надо сделать - очищать счетчик игрока, если он вышел с сервера, для этого находим в своем pwn паблик OnPlayerDisconnect и пишем в него строку:
Code
ACSResetPlayerWeapons(playerid);

12. Теперь надо поставить функцию проверки оружия игроков на таймер, чтобы проверка выполнялась каждые 5 секунд - находим паблик OnGameModInit и добавляем в него строку:
Code
SetTimer("ACSCheckBudWeapons",5000,1);  


Защита поставится 100%,если в чем-то не промахнетесь.
 
  • Страница 1 из 1
  • 1
Поиск:


Пожертвования на развитие сайта. Yandex: 410011459268530 © 2025
Создать бесплатный сайт с uCoz