• Страница 1 из 1
  • 1
Анти-чит на оружие
KeLLiДата: Четверг, 12.05.2011, 13:32 | Сообщение # 1
.::Offline::.
Новичок
Сообщений: 13
[ 14 ]
Награды: 2

Статус отсутствует
Сейчас я вас научу делать простенький( biggrin ) анти-чит на оружие.
Итак начнём.
Это пихаем в начало мода:

Code

#define GivePlayerWeaponEx    GivePlayerWeaponNoCheat
new WeaponUpdateInProgress[MAX_PLAYERS];

enum ACWeap
{
      ACGunIDData,
      ACAmmoData
}

new ACheatWeaponData[MAX_PLAYERS][13][ACWeap];

Это в конец мода:
Code

stock GivePlayerWeaponNoCheat(playerid,weaponid,ammo)//заменить оригинальную функию
{
   WeaponUpdateInProgress[playerid]=2;
   new slot=0;
   switch(weaponid)// причина
   {
      case 0..1:   slot=0;// класс 65535
       case 2..9:   slot=1;// класс 65535
       case 10..15:  slot=10;// класс 65535
       case 16..18:  slot=8;// гранаты
       case 22..24:  slot=2;//пистолеты
       case 25..27:  slot=3;//дробовики
       case 28..29:  slot=4;//микроавтоматы
       case 30..31:  slot=5;//автоматы штурмовые
       case 32:   slot=4;//микроавтоматы
       case 33..34:  slot=6;//винтовки
       case 35..38:  slot=7;// тяжелое оружие
       case 39:   slot=8;//гранаты
       case 40:   slot=12;//детонатор 65535?
       case 41..43:  slot=9;//спец оружие
       case 44..46:  slot=11;// класс 65535
   }
   ACheatWeaponData[playerid][slot][ACGunIDData]=weaponid;
   ACheatWeaponData[playerid][slot][ACAmmoData]+=ammo;
   GivePlayerWeapon(playerid,weaponid,ammo);
   return 1;
}

stock GetWeaponSlot(weaponid)
{
   switch(weaponid)// причина
   {
      case 0..1:   return 0;
       case 2..9:   return 1;
       case 10..15:  return 10;
       case 16..18:  return 8;// гранаты
       case 22..24:  return 2;//пистолеты
       case 25..27:  return 3;//дробовики
       case 28..29:  return 4;//микроавтоматы
       case 30..31:  return 5;//автоматы штурмовые
       case 32:   return 4;//микроавтоматы
       case 33..34:  return 6;//винтовки
       case 35..38:  return 7;// тяжелое оружие
       case 39:   return 8;//гранаты
       case 40:   return 12;
       case 41..43:  return 9;
       case 44..46:  return 11;
   }
   return 0;
}
OnPlayerWeaponCheat(playerid,ammo,gunid,slot)
{
   KickPlayer[playerid]++;
   if(KickPlayer[playerid]<=2)
   {
   GivePlayerWeapon(playerid,gunid,1);
   ResetPlayerWeapons(playerid);
   WeaponUpdateInProgress[playerid]=1;
   return 1;
   }
   new string[256];
   new cheatername[MAX_PLAYER_NAME];
   GetPlayerName(playerid, cheatername,MAX_PLAYER_NAME);
   format(string, sizeof(string), " Античит: [%d]%s конфисковано читерское оружие [%i][%i][%d]. ",playerid,cheatername,slot,gunid,ammo);
   ABroadCast(COLOR_YELLOW,string,1);
   ResetPlayerWeapons(playerid);
   return 1;
}

ClearWeaponAntiCheatData(playerid)
{
   WeaponUpdateInProgress[playerid]=2;
   ACheatWeaponData[playerid][0][ACGunIDData]=0;
   ACheatWeaponData[playerid][1][ACGunIDData]=0;
   ACheatWeaponData[playerid][2][ACGunIDData]=0;ACheatWeaponData[playerid][2][ACAmmoData]=0;
   ACheatWeaponData[playerid][3][ACGunIDData]=0;ACheatWeaponData[playerid][3][ACAmmoData]=0;
   ACheatWeaponData[playerid][4][ACGunIDData]=0;
   ACheatWeaponData[playerid][5][ACGunIDData]=0;
   ACheatWeaponData[playerid][6][ACGunIDData]=0;
   ACheatWeaponData[playerid][7][ACGunIDData]=0;
   ACheatWeaponData[playerid][8][ACGunIDData]=0;
   ACheatWeaponData[playerid][9][ACGunIDData]=0;
   ACheatWeaponData[playerid][10][ACGunIDData]=0;
   ACheatWeaponData[playerid][11][ACGunIDData]=0;
   ACheatWeaponData[playerid][12][ACGunIDData]=0;

}

stock ResetPlayerWeaponsEx(playerid)
{
   ResetPlayerWeapons(playerid);
   ClearWeaponAntiCheatData(playerid);
}

forward WeaponCheck(playerid);
public WeaponCheck(playerid)//куда-нить в таймер
{
   new pstate=GetPlayerState(playerid);
   new pint=GetPlayerInterior(playerid);
   new slot0gun,slot0ammo,slot1gun,slot1ammo;
   new slot2gun,slot2ammo,slot3gun,slot3ammo;
   new slot4gun,slot4ammo,slot5gun,slot5ammo;
   new slot6gun,slot6ammo,slot7gun,slot7ammo;
   new slot8gun,slot8ammo,slot9gun,slot9ammo;
   new slot10gun,slot10ammo,slot11gun,slot11ammo;
   new slot12gun,slot12ammo;
    slot0gun=0;slot1gun=0;slot2gun=0;slot3gun=0;slot4gun=0;slot5gun=0;slot6gun=0;
    slot7gun=0;slot8gun=0;slot9gun=0;slot10gun=0;slot11gun=0;slot12gun=0;
   if(WeaponUpdateInProgress[playerid]==0 && pstate==PLAYER_STATE_ONFOOT && gPlayerLogged[playerid] == 1)
   {
    GetPlayerWeaponData(playerid,0,slot0gun,slot0ammo);
    GetPlayerWeaponData(playerid,1,slot1gun,slot1ammo);
    GetPlayerWeaponData(playerid,2,slot2gun,slot2ammo);
    GetPlayerWeaponData(playerid,3,slot3gun,slot3ammo);
    GetPlayerWeaponData(playerid,4,slot4gun,slot4ammo);
    GetPlayerWeaponData(playerid,5,slot5gun,slot5ammo);
    GetPlayerWeaponData(playerid,6,slot6gun,slot6ammo);
    GetPlayerWeaponData(playerid,7,slot7gun,slot7ammo);
    GetPlayerWeaponData(playerid,8,slot8gun,slot8ammo);
    GetPlayerWeaponData(playerid,9,slot9gun,slot9ammo);
    GetPlayerWeaponData(playerid,10,slot10gun,slot10ammo);
    GetPlayerWeaponData(playerid,11,slot11gun,slot11ammo);
    GetPlayerWeaponData(playerid,12,slot12gun,slot12ammo);
    if(slot0gun>0 && slot0ammo>0)//патроны всегда 65535 слот0
    {
     if(ACheatWeaponData[playerid][0][ACGunIDData]!=slot0gun) {OnPlayerWeaponCheat(playerid,slot0ammo,slot0gun,0);return 1;}
    }
    if(slot1gun>0 && slot1ammo>0)//патроны всегда 65535 слот1 , разрешена только бита и нож (т.к пикапы)
    {
     if(pint!=0)//пикапы только в интерьере
     {
         if(slot1gun==5 && ACheatWeaponData[playerid][1][ACGunIDData]!=5) ACheatWeaponData[playerid][1][ACGunIDData]=5;
      if(slot1gun==4 && ACheatWeaponData[playerid][1][ACGunIDData]!=4) ACheatWeaponData[playerid][1][ACGunIDData]=4;
     }
     if(ACheatWeaponData[playerid][1][ACGunIDData]!=slot1gun) {OnPlayerWeaponCheat(playerid,slot1ammo,slot1gun,1);return 1;}
    }
    if(slot2gun>0 && slot2ammo>0 && slot2ammo!=65535)//пистолеты слот2
    {
     if(pint!=0)//пикапы только в интерьере
     {
         if(slot2gun==22 && ACheatWeaponData[playerid][2][ACGunIDData]!=22 && (slot2ammo-ACheatWeaponData[playerid][2][ACAmmoData])<20) {ACheatWeaponData[playerid][2][ACGunIDData]=22;ACheatWeaponData[playerid][2][ACAmmoData]+=10;}
     }
     if(ACheatWeaponData[playerid][2][ACGunIDData]!=slot2gun){OnPlayerWeaponCheat(playerid,slot2ammo,slot2gun,2);return 1;}
    }
    if(slot3gun>0 && slot3ammo>0 && slot3ammo!=65535)//дробовики слот3 + патч для дробаша в копкарах
    {
     if(slot3gun==25 && (slot3ammo-ACheatWeaponData[playerid][3][ACAmmoData])<15) {ACheatWeaponData[playerid][3][ACAmmoData]=slot3ammo;ACheatWeaponData[playerid][3][ACGunIDData]=25;}
     else if(ACheatWeaponData[playerid][3][ACGunIDData]!=slot3gun) {OnPlayerWeaponCheat(playerid,slot3ammo,slot3gun,3);return 1;}
    }
    if(slot4gun>0 && slot4ammo>0)//автоматы штурмовые  слот4 && slot4ammo!=65535
    {
     if(ACheatWeaponData[playerid][4][ACGunIDData]!=slot4gun) {OnPlayerWeaponCheat(playerid,slot4ammo,slot4gun,4);return 1;}
    }
    if(slot5gun>0 && slot5ammo>0)//автоматы штурмовые слот5 && slot5ammo!=65535
    {
     if(ACheatWeaponData[playerid][5][ACGunIDData]!=slot5gun) {OnPlayerWeaponCheat(playerid,slot5ammo,slot5gun,5);return 1;}
    }
    if(slot6gun>0 && slot6ammo>0)//винтовки слот6 && slot6ammo!=65535
    {
     if(ACheatWeaponData[playerid][6][ACGunIDData]!=slot6gun) {OnPlayerWeaponCheat(playerid,slot6ammo,slot6gun,6);return 1;}
    }
    if(slot7gun>0 && slot7ammo>0)// тяжелое оружие слот7 && slot7ammo!=65535
    {
     if(ACheatWeaponData[playerid][7][ACGunIDData]!=slot7gun) {OnPlayerWeaponCheat(playerid,slot7ammo,slot7gun,7);return 1;}
    }
    if(slot8gun>0 && slot8ammo>0)// гранаты слот8 && slot8ammo!=65535
    {
     if( ACheatWeaponData[playerid][8][ACGunIDData]!=slot8gun) {OnPlayerWeaponCheat(playerid,slot8ammo,slot8gun,8);return 1;}
    }
    if(slot9gun>0 && slot9ammo>0)// спец оружие  слот9  && slot9ammo!=65535
    {
     if(ACheatWeaponData[playerid][9][ACGunIDData]!=slot9gun) {OnPlayerWeaponCheat(playerid,slot9ammo,slot9gun,9);return 1;}
    }
    if(slot10gun>0 && slot10ammo>0)//патроны всегда 65535 слот10
    {
     if(ACheatWeaponData[playerid][10][ACGunIDData]!=slot10gun) {OnPlayerWeaponCheat(playerid,slot10ammo,slot10gun,10);return 1;}
    }
    if(slot11gun>0 && slot11ammo>0)//патроны всегда 65535 слот10
    {
     if(slot11gun==46 && ACheatWeaponData[playerid][11][ACGunIDData]!=slot11gun) ACheatWeaponData[playerid][11][ACGunIDData]=46;
     else if(ACheatWeaponData[playerid][11][ACGunIDData]!=slot11gun ) OnPlayerWeaponCheat(playerid,65535,slot11gun,11);
    }
    if(slot12gun>0 && slot12ammo>0)//патроны всегда 65535 слот10 + патч т.к парашют бывает и в виде пикапов
    {
     //if(ACheatWeaponData[playerid][12][ACGunIDData]!=slot12gun )
     if(PlayerInfo[playerid][pAdmin] < 1337) OnPlayerWeaponCheat(playerid,65535,slot12gun,12);
    }
   }
   if(WeaponUpdateInProgress[playerid]>0) WeaponUpdateInProgress[playerid]=WeaponUpdateInProgress[playerid]-1;
   return 0;
}

Затем ставим таймер на анти-чит:
Code

forward AntiCheat();
public AntiCheat()
{
   for(new i = 0; i < MAX_PLAYERS; i++)
   {
    if(IsPlayerConnected(i))
    {
     new pstate=GetPlayerState(i);
     if(pstate!=PLAYER_STATE_SPECTATING && pstate!=PLAYER_STATE_WASTED)
     {
      WeaponCheck(i);
     }
    }
   }
   return 1;
}

Идем дальше в public OnGameModeInit
Code

   SetTimer("AntiCheat", 1000, 1);

Затем делаем конфискацию оружия у игрока при выходе:
В public OnPlayerDisconnect(playerid,reason)
Code

       ClearWeaponAntiCheatData(playerid);

Чтобы анти чит не лагал при входе вставляем в public OnPlayerSpawn(playerid)
Code

      ClearWeaponAntiCheatData(playerid);

После находим в моде это:
if(newstate == PLAYER_STATE_WASTED)
и вставляем туда это:
Code

ClearWeaponAntiCheatData(playerid);

Потом в команды /weapoffall, /weapoffgro, /weapoff
Вставляем это:
Code

ClearWeaponAntiCheatData(i);}

Ищем команду /take weapons(weapon)
Втсавляем туда:
Code

ClearWeaponAntiCheatData(giveplayerid);

В паблик или у кого сток JailPlayer(tmpid,tmptime)
Вставляем это
Code

ClearWeaponAntiCheatData(tmpid);

Затем чтобы анти чит проверял игроков без всяких проблем ищем в моде все GivePlayerWeapon и заменяем на GivePlayerWeaponEx



Мой скайп Kelli_NooB


Сообщение отредактировал KeLLi - Четверг, 12.05.2011, 13:33
 
valychДата: Пятница, 13.05.2011, 15:53 | Сообщение # 2
.::Offline::.
Гангстер
Сообщений: 171
[ 205 ]
Награды: 15

Статус отсутствует
в общем не плохо, но public WeaponCheck(playerid) можно было и немного укоротить)
смысл создавать переменные new slot(номерслота)gun от 1 до 12 ?? если можно сделать цикл:
Code
new gun[11], ammo[11];
for(new slot; slot < 11; slot ++)
{
GetPlayerWeaponData(playerid, slot, gun[slot], ammo[slot]);
}

Таким образом твой античит на 10 строк примерно сократиться)


Мои друзья на ST: [Tre9, UDAV, ZioHik,Seva008]
-=Чтоб добавится ко мне в друзья дайте мне + с сообщение "Хочу в друзья"=-

-=Те кто будут у меня в друзьях, тем будет делаться скидка на платные работы=-

Мои разработки:
[FS]Transmission 70%
[INC]Anti-Fly 50%
[INC]Anti-Cheat 95%

[FAQ]Ответы на часто задаваемые вопросы
 
KeLLiДата: Пятница, 13.05.2011, 19:46 | Сообщение # 3
.::Offline::.
Новичок
Сообщений: 13
[ 14 ]
Награды: 2

Статус отсутствует
Quote (valych)
смысл создавать переменные new slot(номерслота)gun от 1 до 12 ??

Впринципи можно и так.



Мой скайп Kelli_NooB
 
  • Страница 1 из 1
  • 1
Поиск:


Copyright www.SAMP-TEAM.com (c) 2009-2024
Правила использования материалов сайта

При копировании материалов из нашего сайта
ссылка на www.SAMP-TEAM.com обязательна!
Нарушители правил будут строго наказаны!

Хостинг от uCoz   
Для корректного просмотра мы рекомендуем Вам использовать браузер Google Chrome.
Яндекс.Метрика
Яндекс.Метрика