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]Ответы на часто задаваемые вопросы
|
|
| |