Guest User

Anti [Weapon/Ammo] Hack v0.4

a guest
Sep 27th, 2016
463
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 10.86 KB | None | 0 0
  1. /*
  2.                     () Anti [Weapon/Ammo] Hack ()
  3.                     ____________________________
  4.  
  5. ````````````````````XX__```````````XXXXX_````````````````````X``
  6. ``````````````````XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX_````````XX``
  7. `XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX`
  8. `XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX_XX`````__X```````````XXX``
  9. `XXXXXXXXXXXXXX````XXX_(```XXXXXX```````````````````````````````
  10. `XXXXXXXXXX```````XXXX`````X`XXXX```````````````````````````````
  11. `XXXXX```````````XXXX````````XXXXX``````````````````````````````
  12. ````````````````XXXX``````````XXXXX`````````````````````````````
  13. ```````````````````````````````XXXXXX```````````````````````````
  14. ````````````````````````````````XXXXXXX`````````````````````````
  15. `````````````````````````````````XXXXX``````````````````````````
  16.  
  17.         Античит на оружие и патроны. [ver. 0.4]                  (By vovandolg)
  18.         Специально для портала Pro-Pawn                         (http://www.pro-pawn.ru)
  19.        
  20.        
  21.         Логи разработки:
  22.         [0.4]
  23.             - Патроны теперь записываются с каждого слота в отдельный массив
  24.             (так будет правильнее и удобнее для дальнейшей разработки мода на оружейные механики)
  25.             - Водительское место было зафиксено скрытием оружия из рук игрока
  26.             (слишком много уязвимости на водительском месте)
  27.            
  28.         [0.3]
  29.             - Проверка на подмену оружия в слоте (например: AK-47 можно было заменить на M4)
  30.             - Более детальная проверка на наличие парашюта при десантировании с воздушных транспортов
  31.  
  32.         [0.2]
  33.             - Фикс ложного вызова античита при смерти
  34.             - Более детальная проверка на Infinity ammo
  35. */
  36.  
  37. #include <a_samp>
  38. #include <foreach>
  39.  
  40. #define TIME_GLOBAL_UPDATE      (1000)  //кол-во миллисекунд для апдейта таймера античита
  41. #define MAX_SLOT_WEAP           (13)    //кол-во слотов оружия у игрока
  42. #define MAX_TICK_PAUSE_AC       (3)     //кол-во раз игнора античита на игрока, 3 - стабильно
  43. #define SLOT_WEAPON_PARACHUTE   (11)    //id слота в котором у игрока находится парашют
  44. #define FIX_SPAWN_RESET_WEAP            //закомментировать если фикс сброса оружия при смерти не нужен
  45.  
  46. #define FIX_DRIVER_WEAPONS              //закомментировать если фикс скрытия оружия у водителя не нужен
  47. #if defined FIX_DRIVER_WEAPONS
  48.     #define MAX_DHW_TIMER       (1500)  //кол-во миллисекунд для таймера(скрытие оружия у водителя при посадке)
  49. #endif
  50.  
  51.  
  52. main(){}
  53.  
  54.  
  55. new pPauseAC_one[MAX_PLAYERS char],
  56.     pPauseAC_two[MAX_PLAYERS char],
  57.     pState[MAX_PLAYERS char],
  58.     pWeapon[MAX_SLOT_WEAP][MAX_PLAYERS char],
  59.     pAmmo[MAX_SLOT_WEAP][MAX_PLAYERS],
  60.     pUseVehicleID[MAX_PLAYERS],
  61.     timglobal;
  62.  
  63. static const weapon_slot[47] =
  64. {
  65.     0, 0,
  66.     1, 1, 1, 1, 1, 1, 1, 1,
  67.     10, 10, 10, 10, 10, 10,
  68.     8, 8, 8,
  69.     0, 0, 0, //19-21
  70.     2, 2, 2,
  71.     3, 3, 3,
  72.     4, 4,
  73.     5, 5,
  74.     4,
  75.     6, 6,
  76.     7, 7, 7, 7,
  77.     8,
  78.     12,
  79.     9, 9, 9,
  80.     11, 11, 11
  81. };
  82.  
  83. //--------------------[ Перехватим-ка функции :3 ]------------------------------
  84. stock GivePlayerWeaponAC(playerid, weaponid, amount)
  85. {
  86.     if(IsPlayerConnected(playerid) == 0) return 0;
  87.     new w_slot = weapon_slot[weaponid];
  88.     pPauseAC_one{playerid} = MAX_TICK_PAUSE_AC;
  89.     pWeapon[w_slot]{playerid} = weaponid;
  90.     pAmmo[w_slot][playerid] += amount;
  91.     GivePlayerWeapon(playerid, weaponid, amount);
  92. #if defined FIX_DRIVER_WEAPONS
  93.     if(pState{playerid} == PLAYER_STATE_DRIVER)
  94.     {
  95.         SetTimerEx(!"DriverHidesWeapons", MAX_DHW_TIMER, false, "i", playerid);
  96.     }
  97. #endif
  98.     return 1;
  99. }
  100. #if defined _ALS_GivePlayerWeapon
  101.     #undef  GivePlayerWeapon
  102. #else
  103.     #define _ALS_GivePlayerWeapon
  104. #endif
  105. #define GivePlayerWeapon        GivePlayerWeaponAC
  106.  
  107. stock ResetPlayerWeaponsAC(playerid)
  108. {
  109.     if(IsPlayerConnected(playerid) == 0) return 0;
  110.     pPauseAC_one{playerid} = MAX_TICK_PAUSE_AC;
  111.     ResetPlayerWeapons(playerid);
  112.     for(new i; i < MAX_SLOT_WEAP; i++)
  113.     {
  114.         pWeapon[i]{playerid} = 0;
  115.         pAmmo[i][playerid] = 0;
  116.     }
  117.     return 1;
  118. }
  119. #if defined _ALS_ResetPlayerWeapons
  120.     #undef  ResetPlayerWeapons
  121. #else
  122.     #define _ALS_ResetPlayerWeapons
  123. #endif
  124. #define ResetPlayerWeapons      ResetPlayerWeaponsAC
  125.  
  126. //Для перехвата можно ещё SetPlayerAmmo/SetSpawnInfo добавить,
  127. //но на основе этих функций можете сами слепить ...
  128. //------------------------------------------------------------------------------
  129.  
  130.  
  131. public OnGameModeInit()
  132. {
  133.     SetGameModeText(!"AntiCheat Test");
  134.     AddPlayerClass(0, 0.0, 0.0, 4.0, 0.0, -1,-1,-1,-1,-1,-1);
  135.     CreateVehicle(411, 7.0, 7.0, 6.0, 0.0, 0, 0, 60, 1);
  136.     CreateVehicle(425, 9.0, 8.0, 7.0, 0.0, 0, 0, 60, 1);
  137.     CreateVehicle(461, 10.0, 9.0, 8.0, 0.0, 0, 0, 60, 1);
  138.     timglobal = SetTimer(!"OnGlobalUpdate", TIME_GLOBAL_UPDATE, true);
  139.     return 1;
  140. }
  141.  
  142. public OnGameModeExit()
  143. {
  144.     KillTimer(timglobal);
  145.     return 1;
  146. }
  147.  
  148.  
  149. public OnPlayerDisconnect(playerid)
  150. {
  151.     for(new i; i < MAX_SLOT_WEAP; i++)
  152.     {
  153.         pWeapon[i]{playerid} = 0;
  154.         pAmmo[i][playerid] = 0;
  155.     }
  156.     return 0;
  157. }
  158.  
  159. //Паблик затронут только для того чтобы выдать оружие
  160. public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
  161. {
  162.     if(newkeys & KEY_YES) // Y
  163.     {
  164.         GivePlayerWeapon(playerid, 24, 1);
  165.         GivePlayerWeapon(playerid, 28, 2);
  166.         GivePlayerWeapon(playerid, 31, 3);
  167.         GivePlayerWeapon(playerid, 34, 4);
  168.     }
  169.     if(newkeys & KEY_NO) // N
  170.     {
  171.         GivePlayerWeapon(playerid, 23, 1);
  172.         GivePlayerWeapon(playerid, 29, 2);
  173.         GivePlayerWeapon(playerid, 30, 3);
  174.         GivePlayerWeapon(playerid, 33, 4);
  175.     }
  176.     return 1;
  177. }
  178.  
  179. public OnPlayerStateChange(playerid, newstate, oldstate)
  180. {
  181.     pState{playerid} = newstate;
  182.     if(newstate == PLAYER_STATE_WASTED || (newstate == PLAYER_STATE_ONFOOT &&
  183.     (oldstate == PLAYER_STATE_DRIVER || oldstate == PLAYER_STATE_PASSENGER)))
  184.     {
  185.         pUseVehicleID[playerid] = 0;
  186.     }
  187. #if defined FIX_DRIVER_WEAPONS
  188.     if(newstate == PLAYER_STATE_DRIVER)
  189.     {
  190.         SetTimerEx(!"DriverHidesWeapons", MAX_DHW_TIMER, false, "i", playerid);
  191.     }
  192. #endif
  193.     return 1;
  194. }
  195.  
  196. public OnPlayerDeath(playerid, killerid, reason)
  197. {
  198.     //Точно не скажу нужен ли тут сброс оружия,
  199.     //но на ранних версиях SA:MP наблюдался баг показания неверных данных в GPWD
  200. #if defined FIX_SPAWN_RESET_WEAP
  201.     ResetPlayerWeapons(playerid);
  202. #else
  203.     for(new i; i < MAX_SLOT_WEAP; i++)
  204.     {
  205.         pWeapon[i]{playerid} = 0;
  206.         pAmmo[i][playerid] = 0;
  207.     }
  208. #endif
  209.     return 1;
  210. }
  211.  
  212. public OnPlayerEnterVehicle(playerid, vehicleid, ispassenger)
  213. {
  214.     pUseVehicleID[playerid] = vehicleid;
  215.     return 1;
  216. }
  217.  
  218. public OnPlayerExitVehicle(playerid)
  219. {
  220.     //Парашют при выходе с воздушного транспорта )-_-(
  221.     if(IsAirTransport(GetVehicleModel(pUseVehicleID[playerid])) == 1)
  222.     {
  223.         pPauseAC_one{playerid} = MAX_TICK_PAUSE_AC - 1;
  224.         pWeapon[SLOT_WEAPON_PARACHUTE]{playerid} = WEAPON_PARACHUTE;
  225.         pAmmo[SLOT_WEAPON_PARACHUTE][playerid] = 1;
  226.     }
  227.     return 1;
  228. }
  229.  
  230. public OnPlayerWeaponShot(playerid, weaponid, hittype, hitid, Float:fX, Float:fY, Float:fZ)
  231. {
  232.     //Боремся с Infinity Ammo ^-^
  233.     new wslot = weapon_slot[weaponid];
  234.     if(pAmmo[wslot][playerid] > 0)
  235.     {
  236.         pPauseAC_two{playerid} = MAX_TICK_PAUSE_AC - 1;
  237.         pAmmo[wslot][playerid]--;
  238.     }
  239.     else return 0;
  240.     return 1;
  241. }
  242.  
  243.  
  244. forward OnGlobalUpdate();
  245. public OnGlobalUpdate()
  246. {
  247.     foreach(new i: Player)
  248.     {
  249.         //Проверяем игрока на то что он живой и бегает по карте
  250.         //Рекомендую сюда всунуть ещё свою проверку игроков на AFK
  251.         if(pState{i} == 7 || pState{i} == 8) continue;
  252.  
  253.         if(pPauseAC_two{i} > 0) pPauseAC_two{i}--;
  254.         if(pPauseAC_one{i} > 0)
  255.         {
  256.             pPauseAC_one{i}--;
  257.             continue;
  258.         }
  259.  
  260.         new weaponid[MAX_SLOT_WEAP],
  261.             weaponammo[MAX_SLOT_WEAP];
  262.            
  263.         for(new s; s < MAX_SLOT_WEAP; s++)
  264.         {
  265.             //Начинаем записывать инфу оружия и б/п из слота
  266.             GetPlayerWeaponData(i, s, weaponid[s], weaponammo[s]);
  267.            
  268.             //Проверяем на обход в минус или на Infinitiy ammo
  269.             if(pAmmo[s][i] < 0 || weaponammo[s] < 0)
  270.             {
  271.                 printf("[part] Player[%i] slot[%i] pAmmo[%i] weaponammo[%i], kick!", i, s, pAmmo[s][i], weaponammo[s]);
  272.                 SendClientMessage(i, -1, !"Айяй, бесконечные патроны юзаешь или обошёл?![#001]");
  273.                 ResetPlayerWeapons(i);
  274.                 //Kick(i);
  275.                 break;
  276.             }
  277.  
  278.             //Совпало ли оружие в слоте с тем которое выдавал сервер
  279.             if(weaponid[s] > 0 && weaponid[s] != pWeapon[s]{i})
  280.             {
  281.                 printf("[part] Player[%i] pWeapon[%i] slot[%i] weaponid[%i], kick!", i, pWeapon[s]{i}, s, weaponid[s]);
  282.                 SendClientMessage(i, -1, !"Айяй, я тебе такой ствол не давал![#002]");
  283.                 ResetPlayerWeapons(i);
  284.                 //Kick(i);
  285.                 break;
  286.             }
  287.  
  288.             if(pPauseAC_two{i} > 0) continue;
  289.  
  290.             //Если кол-во записанных патронов в слоте меньше чем найденных(хакнутых)
  291.             if(pAmmo[s][i] < weaponammo[s])
  292.             {
  293.                 if(pPauseAC_one{i} == 0 && pPauseAC_two{i} == 0)
  294.                 {
  295.                     printf("[part] Player[%i] slot[%i] pAmmo[%i] weaponammo[%i], kick!", i, s, pAmmo[s][i], weaponammo[s]);
  296.                     SendClientMessage(i, -1, !"Айяй, патроны воруешь![#003]");
  297.                     ResetPlayerWeapons(i);
  298.                     //Kick(i);
  299.                     break;
  300.                 }
  301.                 else break;
  302.             }
  303.  
  304.             //Если кол-во записанных патронов в слоте больше чем найденных,
  305.             //то обновим кол-во патронов в переменной слота оружия
  306.             else if(pAmmo[s][i] > weaponammo[s])
  307.             {
  308.                 if(pPauseAC_one{i} == 0 && pPauseAC_two{i} == 0) pAmmo[s][i] = weaponammo[s];
  309.                 else break;
  310.             }
  311.             //Если кол-во записанных патронов в слоте равно найденным,
  312.             //то не теребонькаем систему ;D
  313.         }
  314.     }
  315.     return 1;
  316. }
  317.  
  318. #if defined FIX_DRIVER_WEAPONS
  319.     forward DriverHidesWeapons(playerid);
  320.     public DriverHidesWeapons(playerid)
  321.         return SetPlayerArmedWeapon(playerid, 0);
  322. #endif
  323.  
  324. //Является ли указанный vehid воздушным транспортом, 1 - да | 0 - нет
  325. stock IsAirTransport(vehid)
  326. {
  327.     switch(vehid)
  328.     {
  329.         case 417,425,447,460,469,476,487,488,497,511..513,
  330.              519,520,548,553,563,577,592,593: return 1;
  331.     }
  332.     return 0;
  333. }
Add Comment
Please, Sign In to add comment