Антічит анти weapon

Анти Weapon / Ammo Hack

Зайшовши на більшість серверів з цікавою механікою прокачування скілів зброї або де багато різної зброї видатного за рангом або по якому те звання напевно спостерігали як гравці нубци які тільки увійшли на серв вже бігають з таким же арсеналом як і діди цього серва, зазвичай власники сервов пишуть антічит на зброю у ранзі або годинах, але знову ж таки отримали Ви ранг вище / нижче і можете додати собі патронів або зовсім включити їх нескінченність і так далі, я думаю це все не правильно і гравцям які давно грають не в кайф бачити такі печ Патерналізм картини, ще на 0.3e я почав писати цей Антич на зброю, єдино що не вистачало там так це відстеження пострілу (намагався знаєте зробити милицю з Key State мовляв мишкою клацнув і постріл), але як то набридло костилепісаніе це і поміняв версію на 0.3 .7 і домігся повного успіху в написанні цього антічита на зброї та набої до них, або мій антічит не кому не хочеться обходити, або він дійсно вже дійшов до успіху, але мені здається перший варіант








плюси
  • Бачить видачу будь-якого лівого зброї
  • Бачить видачу будь-якого лівого патрона
  • Бачить підміну зброї в слоті
  • Контролює б / к на нескінченність
  • Даний код буде ловити чітера як пішки так і в авто
  • Максимально пропорційний код без сміття
  • Все це без помилкових викликів (Якщо уважно прочитати код і поставити в потрібному місці свою перевірку на AFK)

мінуси
  • На водійському місці не функціонує один (важливий) каллбек, тим самим водійське місце довелося зафіксо


Список розробки:
# 91; 0.4 # 93;
- Патрони тепер записуються з кожного слота в окремий масив
(Так буде правильніше і зручніше для подальшої розробки мода на збройові механіки)
- Водійське місце було зафіксо приховуванням зброї з рук гравця
(Занадто багато уразливості на водійському місці)

# 91; 0.3 # 93;
- Перевірка на підміну зброї в слоті (наприклад: AK-47 можна було замінити на M4)
- Більш детальна перевірка на наявність парашута при десантуванні з повітряних транспортів

# 91; 0.2 # 93;
- Фікс помилкового виклику антічита при смерті
- Більш детальна перевірка на Infinity ammo
* /

#include
#include

#if defined FIX_DRIVER_WEAPONS
#define MAX_DHW_TIMER (1500)
// кількість мілісекунд для таймера (приховування зброї у водія при посадці)
#endif


new pPauseAC_one # 91; MAX_PLAYERS char # 93 ;,
pPauseAC_two # 91; MAX_PLAYERS char # 93 ;,
pState # 91; MAX_PLAYERS char # 93 ;,
pWeapon # 91; MAX_SLOT_WEAP # 93; # 91; MAX_PLAYERS char # 93 ;,
pAmmo # 91; MAX_SLOT_WEAP # 93; # 91; MAX_PLAYERS # 93 ;,
pUseVehicleID # 91; MAX_PLAYERS # 93 ;,
timglobal;

// -------------------- # 91; Перехопимо-ка функції: 3 # 93; ------------------------------
stock GivePlayerWeaponAC (playerid. weaponid. amount)
if (IsPlayerConnected (playerid) == 0) return 0;
new w_slot = weapon_slot # 91; weaponid # 93 ;;
pPauseAC_one = MAX_TICK_PAUSE_AC;
pWeapon # 91; w_slot # 93; = Weaponid;
pAmmo # 91; w_slot # 93; # 91; playerid # 93; + = Amount;
GivePlayerWeapon (playerid. Weaponid. Amount);
#if defined FIX_DRIVER_WEAPONS
if (pState == PLAYER_STATE_DRIVER)
SetTimerEx (! "DriverHidesWeapons". MAX_DHW_TIMER. False. "I". Playerid);
>
#endif
return 1;
>
#if defined _ALS_GivePlayerWeapon
#undef GivePlayerWeapon
#else
#define _ALS_GivePlayerWeapon
#endif
#define GivePlayerWeapon GivePlayerWeaponAC

stock ResetPlayerWeaponsAC (playerid)
if (IsPlayerConnected (playerid) == 0) return 0;
pPauseAC_one = MAX_TICK_PAUSE_AC;
ResetPlayerWeapons (playerid);
for (new i; i pWeapon # 91; i # 93; = 0;
pAmmo # 91; i # 93; # 91; playerid # 93; = 0;
>
return 1;
>
#if defined _ALS_ResetPlayerWeapons
#undef ResetPlayerWeapons
#else
#define _ALS_ResetPlayerWeapons
#endif
#define ResetPlayerWeapons ResetPlayerWeaponsAC

// Для перехоплення можна ще SetPlayerAmmo / SetSpawnInfo додати,
// але на основі цих функцій можете самі зліпити.
// ------------------------------------------------ ------------------------------








public OnGameModeInit ()
SetGameModeText (! "AntiCheat Test");
AddPlayerClass (0. 0.0. 0.0. 4.0. 0.0. - 1, - 1, - 1, - 1, - 1, - 1);
CreateVehicle (411. 7.0. 7.0. 6.0. 0.0. 0. 0. 60. 1);
CreateVehicle (425. 9.0. 8.0. 7.0. 0.0. 0. 0. 60. 1);
CreateVehicle (461. 10.0. 9.0. 8.0. 0.0. 0. 0. 60. 1);
timglobal = SetTimer (! "OnGlobalUpdate". TIME_GLOBAL_UPDATE. true);
return 1;
>

public OnGameModeExit ()
KillTimer (timglobal);
return 1;
>


public OnPlayerDisconnect (playerid)
for (new i; i pWeapon # 91; i # 93; = 0;
pAmmo # 91; i # 93; # 91; playerid # 93; = 0;
>
return 0;
>

// Паблік торкнуться тільки для того щоб видати зброю
public OnPlayerKeyStateChange (playerid. newkeys. oldkeys)
if (newkeys KEY_YES) // Y
GivePlayerWeapon (playerid. 24. 1);
GivePlayerWeapon (playerid. 28. 2);
GivePlayerWeapon (playerid. 31. 3);
GivePlayerWeapon (playerid. 34. 4);
>
if (newkeys KEY_NO) // N
GivePlayerWeapon (playerid. 23. 1);
GivePlayerWeapon (playerid. 29. 2);
GivePlayerWeapon (playerid. 30. 3);
GivePlayerWeapon (playerid. 33. 4);
>
return 1;
>

public OnPlayerStateChange (playerid. newstate. oldstate)
pState = Newstate;
if (newstate == PLAYER_STATE_WASTED || (newstate == PLAYER_STATE_ONFOOT
(Oldstate == PLAYER_STATE_DRIVER || oldstate == PLAYER_STATE_PASSENGER)))
pUseVehicleID # 91; playerid # 93; = 0;
>
#if defined FIX_DRIVER_WEAPONS
if (newstate == PLAYER_STATE_DRIVER)
SetTimerEx (! "DriverHidesWeapons". MAX_DHW_TIMER. False. "I". Playerid);
>
#endif
return 1;
>

public OnPlayerDeath (playerid. killerid. reason)
// Точно не скажу чи потрібен тут скидання зброї,
// але на ранніх версіях SA: MP спостерігався баг свідчення невірних даних в GPWD
#if defined FIX_SPAWN_RESET_WEAP
ResetPlayerWeapons (playerid);
#else
for (new i; i pWeapon # 91; i # 93; = 0;
pAmmo # 91; i # 93; # 91; playerid # 93; = 0;
>
#endif
return 1;
>

public OnPlayerEnterVehicle (playerid. vehicleid. ispassenger)
pUseVehicleID # 91; playerid # 93; = Vehicleid;
return 1;
>

public OnPlayerExitVehicle (playerid)
// Парашут при виході з повітряного транспорту) -_- (
if (IsAirTransport (GetVehicleModel (pUseVehicleID # 91; playerid # 93;)) == 1)
pPauseAC_one = MAX_TICK_PAUSE_AC - 1;
pWeapon # 91; SLOT_WEAPON_PARACHUTE # 93; = WEAPON_PARACHUTE;
pAmmo # 91; SLOT_WEAPON_PARACHUTE # 93; # 91; playerid # 93; = 1;
>
return 1;
>

public OnPlayerWeaponShot (playerid. weaponid. hittype. hitid. Float. fX. Float. fY. Float. fZ)
// Боремося з Infinity Ammo ^ - ^
new wslot = weapon_slot # 91; weaponid # 93 ;;
if (pAmmo # 91; wslot # 93; # 91; playerid # 93;> 0)
pPauseAC_two = MAX_TICK_PAUSE_AC - 1;
pAmmo # 91; wslot # 93; # 91; playerid # 93; -;
>
else return 0;
return 1;
>


forward OnGlobalUpdate ();
public OnGlobalUpdate ()
foreach (new i. Player)
// Перевіряємо гравця на те що він живий і бігає по карті
// Рекомендую сюди всунути ще свою перевірку гравців на AFK
if (pState == 7 || pState == 8) continue;

if (pPauseAC_two > 0) pPauseAC_two --;
if (pPauseAC_one > 0)
pPauseAC_one --;
continue;
>

new weaponid # 91; MAX_SLOT_WEAP # 93 ;,
weaponammo # 91; MAX_SLOT_WEAP # 93 ;;

for (new s; s // Починаємо записувати інфу зброї і б / п з слота
GetPlayerWeaponData (i. S. Weaponid # 91; s # 93 ;, weaponammo # 91; s # 93;);

// Перевіряємо на обхід в мінус або на Infinitiy ammo
if (pAmmo # 91; s # 93; # 91; i # 93; <0 || weaponammo [ s ] <0 )
printf ( "# 91; part # 93; Player # 91;% i # 93; slot # 91;% i # 93; pAmmo # 91;% i # 93; weaponammo # 91;% i # 93 ;, kick!" . is pAmmo # 91; s # 93; # 91; i # 93 ;, weaponammo # 91; s # 93;);
SendClientMessage (i. - 1. "Айяй, нескінченні патрони юзаешь або обійшов?! # 91; # 001 # 93;");
ResetPlayerWeapons (i);
// Kick (i);
break;
>

// Збіглося чи зброю в слоті з тим яке видавав сервер
if (weaponid # 91; s # 93;> 0 weaponid # 91; s # 93; ! = PWeapon # 91; s # 93;)
printf ( "# 91; part # 93; Player # 91;% i # 93; pWeapon # 91;% i # 93; slot # 91;% i # 93; weaponid # 91;% i # 93 ;, kick!" . i. pWeapon # 91; s # 93;, s. weaponid # 91; s # 93;);
SendClientMessage (i. - 1. "Айяй, я тобі такий ствол не давав! # 91; # 002 # 93;");
ResetPlayerWeapons (i);
// Kick (i);
break;
>

if (pPauseAC_two > 0) continue;

// Якщо кількість записаних патронів в слоті менше ніж знайдених (хакнутих)
if (pAmmo # 91; s # 93; # 91; i # 93; if (pPauseAC_one == 0 pPauseAC_two == 0)
printf ( "# 91; part # 93; Player # 91;% i # 93; slot # 91;% i # 93; pAmmo # 91;% i # 93; weaponammo # 91;% i # 93 ;, kick!" . is pAmmo # 91; s # 93; # 91; i # 93 ;, weaponammo # 91; s # 93;);
SendClientMessage (i. - 1. "Айяй, патрони крадеш! # 91; # 003 # 93;");
ResetPlayerWeapons (i);
// Kick (i);
break;
>
else break;
>

// Якщо кількість записаних патронів в слоті більше ніж знайдених,
// то відновимо кількість патронів в змінної слота зброї
else if (pAmmo # 91; s # 93; # 91; i # 93;> weaponammo # 91; s # 93;)
if (pPauseAC_one == 0 pPauseAC_two == 0) pAmmo # 91; s # 93; # 91; i # 93; = weaponammo # 91; s # 93 ;;
else break;
>
// Якщо кількість записаних патронів в слоті одно знайденим,
// щось не теребонькаем систему; D
>
>
return 1;
>

#if defined FIX_DRIVER_WEAPONS
forward DriverHidesWeapons (playerid);
public DriverHidesWeapons (playerid)
return SetPlayerArmedWeapon (playerid. 0);
#endif

// Чи є зазначений vehid повітряним транспортом, 1 - так | 0 - немає
stock IsAirTransport (vehid)
switch (vehid)
case 417. 425. 447. 460. 469. 476. 487. 488. 497. 511..513,
519. 520. 548. 553. 563. 577. 592. 593. return 1;
>
return 0;
>