[Доработка] Anti Weapon Hack
#1

Недавно нашел неплохой античит на оружие, но у данного античита есть 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;
}
Reply
#2

RAEN, "хватит отрывать велосипеды, и ставить на них зеркала заднего вида".
Reply
#3

Quote:
Originally Posted by RAEN
2) Он не защищает от чита на оружие ближнего боя (где патронов явно меньше 20)
вообще-то 65535
Reply
#4

Quote:
Originally Posted by BaRRyS3R
RAEN, "хватит отрывать велосипеды, и ставить на них зеркала заднего вида".
Ты темой не ошибся ...тебе с таким подходом нужно в теме: "Покажи свою генитальность"...

Quote:
Originally Posted by stepmex
Quote:
Originally Posted by RAEN
2) Он не защищает от чита на оружие ближнего боя (где патронов явно меньше 20)
вообще-то 65535
Ну судя по работе античита так не скажешь, скорее всего GetPlayerWeaponData не справляется со своей работой.
Reply
#5

Читер может себе выставлять например 65836 патронов. И эта функция (GetPlayerWeaponData) будет показывать, что у него всего 300 патронов. Это явный недочет со стороны sa-mp. В игре почему-то это кол-во можно ставить аж примерно до 256*256*256*256, но клиент для хранения этого значения использует числа не более чем 256*256.

Для пух с идами 1..15 и 46 эта функция всегда выдает -1 патрон.

Еще одна может кому-то полезная фича - выставлять отрицальтельное кол-во патронов. Оно не позволяет даже это оружие в руки взять.

Зная такого рада данные, вы можете сами подправить любой античит как вам нужно.
Reply
#6

Quote:
Originally Posted by MX_Master
Читер может себе выставлять например 65836 патронов. И эта функция (GetPlayerWeaponData) будет показывать, что у него всего 300 патронов. Это явный недочет со стороны sa-mp. В игре почему-то это кол-во можно ставить аж примерно до 256*256*256*256, но клиент для хранения этого значения использует числа не более чем 256*256.

Для пух с идами 1..15 и 46 эта функция всегда выдает -1 патрон.

Еще одна может кому-то полезная фича - выставлять отрицальтельное кол-во патронов. Оно не позволяет даже это оружие в руки взять.

Зная такого рада данные, вы можете сами подправить любой античит как вам нужно.
Ты говоришь про то чтобы добавить :

pawn Code:
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)
Reply
#7

Я рассказал о своих наблюдениях, которые просто могут помочь понять принцип действия GetPlayerWeaponData
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)