Zdravím Vás.Takže všimol som si, že veľa uživateľov hľadá na svoj server funkciu proti cheaterom - AntiAirBreak.Prezeral som si fórum a nikde som nenašiel niečo ohľadom pawn kódu pre Vaše módy.Našiel som len zopár rad ako BY sa to dalo spraviť a skúšal som to, ale aj tak to nejako nešlo Takže kus som poblúdil po nete a niekde som našiel teda tu funkciu.Kus som ju poupravil a tak Vám ju dávam sem.Dúfam, že sa Vám to zíjde a že nebudú prípadní cheateri na Vašom serveri machrovať s AirBreakom.Je to z eng SA-MP fóra...
Takže poďme na to...
Medzi definicíe
#define UPDATE_COUNT 5
#define POSSIBLE_AIRBREAK_COUNT_CAR 10 //definícia AirBreak - hráč v aute
#define POSSIBLE_AIRBREAK_COUNT_ONFOOT 7 //definícia AirBreak - hráč na nohách
Medzi new (premenné)
new airbreakcount[MAX_PLAYERS];
new pupdate[MAX_PLAYERS];
//premenná kam budeme zapísovať údaj
Do funkcie: public OnPlayerUpdate(playerid) //vložime toto
pupdates[playerid]++;
if(pupdates[playerid] > UPDATE_COUNT)
{
pupdates[playerid]=0;
new check;
if(GetPlayerState(playerid) == PLAYER_STATE_DRIVER && IsVehicleValid(GetPlayerVehicleID(playerid))) //zisti, či je hráč v aute a či je vodič
{
new Float:vx,Float:vy,Float:vz; //premenna pozície
GetVehicleVelocity(GetPlayerVehicleID(playerid),vx,vy,vz); //zistíme rýchlosť a ID auta
if(vx==0.0 && vy==0.0 && vz < -0.0032 && vz > -0.022)
{
check=1;
}
}
else
{
if(GetPlayerState(playerid)==PLAYER_STATE_ONFOOT) //podmienak, ak je hráč na nohách
{
new Float:vx,Float:vy,Float:vz,Float:px,Float:py,Float:pz; //premenna pozície
GetVehicleVelocity(GetPlayerVehicleID(playerid),vx,vy,vz);// -//-
GetPlayerVelocity(playerid,vx,vy,vz); //zistime hráčov "spad"
GetPlayerPos(playerid,px,py,pz); //zistí hráčovu pozíciu
pupdates[playerid]=0;
if(-0.022 < vz < -0.0040 && -0.121 < vx < 0.121 && -0.121 < vy < 0.121 && GetPlayerSurfingVehicleID(playerid)==INVALID_VEHICLE_ID && pz > 2.0) //zistime pohyb vozidla
{
if(!IsPlayerInRangeOfPoint(playerid,2.0,GetPVarFloat(playerid,"oposx"), //ak je v danom bode
GetPVarFloat(playerid,"oposy"),GetPVarFloat(playerid,"oposz")) || -0.5>(GetPVarFloat(playerid,"oposz")-pz)>-0.1 || 0.075>(GetPVarFloat(playerid,"oposz")-pz)>-0.075)
{
check=2;
}
SetPVarFloat(playerid,"oposx",px);
SetPVarFloat(playerid,"oposy",py);
SetPVarFloat(playerid,"oposz",pz);
}
}
}
if(check > 0)
{
new POSSIBLE_AIRBREAK_COUNT;
switch(check)
{
case 1: POSSIBLE_AIRBREAK_COUNT=POSSIBLE_AIRBREAK_COUNT_CAR;
case 2: POSSIBLE_AIRBREAK_COUNT=POSSIBLE_AIRBREAK_COUNT_ONFOOT;
}
airbreakcount[playerid]++;
if(airbreakcount[playerid] > POSSIBLE_AIRBREAK_COUNT && IsPlayerInWater(playerid)==0)
{
airbreakcount[playerid]=0;
//sem si dajte co sa stane, ak hracovi zisti AirBreak
Kick(playerid); //tu je trebars Kick
}
}
else
{
airbreakcount[playerid]=0;
}
}
return 1;
}
Do funkcie: public OnPlayerStateChange(playerid, newstate, oldstate) //vložime
airbreakcount[playerid]=0;
return 1;
}
Tak a ešte pár stockov niekam na koniec módu / scriptu:
stock IsVehicleValid(id) //ak ma správne vozidlo
{
new type=GetVehicleModel(id);
new blocked[]={ 548, 425, 417, 487, 488, 497, 563, 447, 469, 520 };
for(new i;i {
if(type == blocked[i])
{
return 0;
}
}
return 1;
}
stock IsPlayerInArea(playerid, Float:max_x, Float:min_x, Float:max_y, Float:min_y) //ak je hráč v danom okruhu
{
new Float:X, Float:Y, Float:Z;
GetPlayerPos(playerid, X, Y, Z);
if(X <= max_x && X >= min_x && Y <= max_y && Y >= min_y) return 1;
return 0;
}
stock IsPlayerInWater(playerid) //ak je hráč vo vode
{
new Float:x,Float:y,Float:pz;
GetPlayerPos(playerid,x,y,pz);
if (
(IsPlayerInArea(playerid, 2032.1371, 1841.2656, 1703.1653, 1467.1099) && pz <= 9.0484) //lv piratenschiff
|| (IsPlayerInArea(playerid, 2109.0725, 2065.8232, 1962.5355, 10.8547) && pz <= 10.0792) //lv visage
|| (IsPlayerInArea(playerid, -492.5810, -1424.7122, 2836.8284, 2001.8235) && pz <= 41.06) //lv staucamm
|| (IsPlayerInArea(playerid, -2675.1492, -2762.1792, -413.3973, -514.3894) && pz <= 4.24) //sf südwesten kleiner teich
|| (IsPlayerInArea(playerid, -453.9256, -825.7167, -1869.9600, -2072.8215) && pz <= 5.72) //sf gammel teich
|| (IsPlayerInArea(playerid, 1281.0251, 1202.2368, -2346.7451, -2414.4492) && pz <= 9.3145) //ls neben dem airport
|| (IsPlayerInArea(playerid, 2012.6154, 1928.9028, -1178.6207, -1221.4043) && pz <= 18.45) //ls mitte teich
|| (IsPlayerInArea(playerid, 2326.4858, 2295.7471, -1400.2797, -1431.1266) && pz <= 22.615) //ls weiter südöstlich
|| (IsPlayerInArea(playerid, 2550.0454, 2513.7588, 1583.3751, 1553.0753) && pz <= 9.4171) //lv pool östlich
|| (IsPlayerInArea(playerid, 1102.3634, 1087.3705, -663.1653, -682.5446) && pz <= 112.45) //ls pool nordwestlich
|| (IsPlayerInArea(playerid, 1287.7906, 1270.4369, -801.3882, -810.0527) && pz <= 87.123) //pool bei maddog's haus oben
|| (pz < 1.5)
)
{
return 1;
}
return 0;
}
Tak a toto je celá funkcia... testoval som to... Mne osobne to fuguje ako má