17.06.2010, 15:38
Недавно нашел неплохой античит на оружие, но у данного античита есть 2 проблемы:
1) Он часто кикает без причины, когда выполняется действие Seif_GivePlayerWeapon
2) Он не защищает от чита на оружие ближнего боя (где патронов явно меньше 20)
Если у кого есть мысли как исправить эти 2 недостатка, делитесь
Вот код:
1) Он часто кикает без причины, когда выполняется действие Seif_GivePlayerWeapon
2) Он не защищает от чита на оружие ближнего боя (где патронов явно меньше 20)
Если у кого есть мысли как исправить эти 2 недостатка, делитесь

Вот код:
pawn Code:
#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;
}


...тебе с таким подходом нужно в теме: "Покажи свою генитальность"...