| 
| KeLLi | Дата: Четверг, 12.05.2011, 13:32 | Сообщение # 1 |  | .::Offline::. Новичок   Сообщений: 13[ 14 ] Награды: 2  
Статус 
отсутствует | Сейчас я вас научу делать простенький(  ) анти-чит на оружие. Итак начнём.
 Это пихаем в начало мода:
 
 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]Ответы на часто задаваемые вопросы
 |  |  |  |  |