
#define MAX_WEAPONS 47
#define MAX_AMMO_HACK 20 //Минимальное кол-во патронов которое дает собиет (было 69)
enum acInfo
{
acWeapon[13],
acWAmmo[MAX_WEAPONS],
}
new Seifensive[MAX_PLAYERS][acInfo];
public OnGameModeInit()
{
SetTimer("WeaponDetection",3000,1);
return 1;
}
public OnPlayerConnect(playerid)
{
for(new i = 0; i <= 12; i++) Seifensive[playerid][acWeapon][i] = 0;
for(new w = 0; w < MAX_WEAPONS; w++) Seifensive[playerid][acWAmmo][w] = 0;
return 1;
}
}
public OnPlayerDisconnect(playerid, reason)
{
for(new i = 0; i <= 12; i++) Seifensive[playerid][acWeapon][i] = 0;
for(new w = 0; w < MAX_WEAPONS; w++) Seifensive[playerid][acWAmmo][w] = 0;
return 1;
}
forward WeaponDetection();
public WeaponDetection()
{
new w[MAX_PLAYERS],a[MAX_PLAYERSS];
for(new i = 0; i < MAX_PLAYERS; i++)
{
if (gPlayerLogged[i])
{
w[i] = 0;
a[i] = 0;
for(new s = 0; s < 13; s++)
{
GetPlayerWeaponData(i, s, w[i], a[i]);
if (Seifensive[i][acWeapon] != w[i])
{
if (a[i] > Seifensive[i][acWAmmo][w[i]])
{
if ((a[i] - Seifensive[i][acWAmmo][w[i]]) >= MAX_AMMO_HACK)
{
HackingDetected(i, "Чит на оружие");
continue;
}
}
}
}
}
}
}
forward HackingDetected(playerid, reason[]);
public HackingDetected(playerid, reason[])
{
new string[128];
new name[MAX_PLAYER_NAME];
GetPlayerName(playerid, name, sizeof(name));
format(string, sizeof(string), "%s кикнут с сервера: %s", name, reason);
SendClientMessageToAll(0xAA3333AA, string);
ResetPlayerWeapons(playerid);
Kick(playerid);
}
Seif_GivePlayerWeapon(playerid, weaponid, ammos)
{
Seifensive[playerid][acWeapon][GetWeapSlotID(weaponid)] = weaponid;
Seifensive[playerid][acWAmmo][weaponid] = ammos;
GivePlayerWeapon(playerid, weaponid, ammos);
}
stock GetWeapSlotID(weaponid)
{
switch (weaponid)
{
case 0,1: return 0;
case 2..9: return 1;
case 10..15: return 10;
case 16..18,39: return 8;
case 22..24: return 2;
case 25..27: return 3;
case 28,29,32: return 4;
case 33,34: return 6;
case 35..38: return 7;
case 41..43: return 9;
case 44..46: return 11;
default: return 12;
}
return 0;
}
|
Originally Posted by RAEN
2) Он не защищает от чита на оружие ближнего боя (где патронов явно меньше 20)
|
|
Originally Posted by BaRRyS3R
RAEN, "хватит отрывать велосипеды, и ставить на них зеркала заднего вида".
|
...тебе с таким подходом нужно в теме: "Покажи свою генитальность"...|
Originally Posted by stepmex
Quote:
![]() |
|
Originally Posted by MX_Master
Читер может себе выставлять например 65836 патронов. И эта функция (GetPlayerWeaponData) будет показывать, что у него всего 300 патронов. Это явный недочет со стороны sa-mp. В игре почему-то это кол-во можно ставить аж примерно до 256*256*256*256, но клиент для хранения этого значения использует числа не более чем 256*256.
Для пух с идами 1..15 и 46 эта функция всегда выдает -1 патрон. Еще одна может кому-то полезная фича - выставлять отрицальтельное кол-во патронов. Оно не позволяет даже это оружие в руки взять. Зная такого рада данные, вы можете сами подправить любой античит как вам нужно. |
:if ((a[i] - Seifensive[i][acWAmmo][w[i]]) >= MAX_AMMO_HACK || (a[i] - Seifensive[i][acWAmmo][w[i]]) == -1 || (a[i] - Seifensive[i][acWAmmo][w[i]]) == 65535)