Üdv!
Gondolkoztam mit írjak és ez jutott eszembe!
Ez a \"kód\"-al megteheted azt ,hogyha csítel a játékos mi történjen és ha nem csítel akkor mi történjen.
Ha csítel nem bannolja hanem eldöntheted micsináljon vele, csak a számodra megfelelõ helyre írd (mint pl. OnPlayerSpawn, ...) Ha ha csítel és azt akarod ,hogy történjen valami akkor ezzel a fügvényel kérdezheted le:
if(IsPlayerCheater(playerid))
De ha azt akarod ,hogy ha nem csítel és akkor történjen a játékossal valami akkor:
if(IsPlayerNotCheater(playerid))
Ez a kód kicsit scriptnek tûnik, de kódnak szánom:
#include <a_samp>
forward OnPlayerCheat(playerid);
new bool:Cheat[MAX_PLAYERS] = {false,...};
new Float:health, Float:armour;
public OnFilterScriptInit()
{
for(new i; i < MAX_PLAYERS; i++)
{
SetTimerEx(\"OnPlayerCheat\", 2500, true, \"i\", i);
}
return 1;
}
public OnPlayerSpawn(playerid)
{
Cheat[playerid] = false;
return 1;
}
public OnPlayerCheat(playerid)
{
if(IsPlayerConnected(playerid) && !IsPlayerNPC(playerid))
{
new weapons = GetPlayerWeapon(playerid);
GetPlayerHealth(playerid, health);
GetPlayerArmour(playerid, armour);
if(health >= 100.1 || armour >= 100.1 || weapons == 35 || weapons == 36 || weapons == 37 || weapons == 38)
{
Cheat[playerid] = true;
}
}
}
stock IsPlayerCheater(playerid)
{
if(Cheat[playerid] == true);
}
stock IsPlayerNotCheater(playerid)
{
if(Cheat[playerid] == false);
}
Ez a \"kód\" akkor mutatja ,hogy csíter a játékos ,ha az élete vagy a páncélja nagyobb mint 100.0 vagy akkor ha a 4 nagy tiltott fegyvert használja (Minigun, Rocket Launcher...).
Manapság csak ami scriptjeinkbe vannak úgy a god módok ,hogy 100.0 ra teszi adott idõnként az életet a cheat-ek nél általában nem adott idõnként tölt hanem pl.: 10000-re teszi.
Ez a sajátmagam által írt script, mivel elég kicsi is ha lenne már ilyen kód arrol nem tudtam.
A \"kód\"ot nem teszteltem!
Lesznek még fejlesztések ,és ha zero megengedi beteszem az anti fly scriptjét ,persze mindenhol írnám ,hogy az övé!
A Cheat szimbólumot vektorként deklaráld, mert így nem fog rendesen mûködni. Tehát például ha ID 2 minigunozna, akkor akárkinek az IDjével futtatnád le az IsPlayerCheater függvényt, az igazzal térne vissza, mivel így csak egy sima változó.
new bool: Cheat[ MAX_PLAYERS ] = { false, ... };
Hát én is látok pár szörnyûséget. :(
Tanácsként fogadd el hogy tesztelni sosem árt, akkor nem kerülnének ki a kezed közül ennyire tré kódok.
Ezért pár apróságot leírok.
Láttam egy ilyen részt kérdezném tudod-e hogy ez mit is csinál?
new bool:Cheat[MAX_PLAYERS] = {false,true};
Ne találgass, leírom.
Ezzel a sorral létrehoztál egy bool típusú változót melynek true és false értéke lehet, \"Cheat\" néven majd ezt megsokszoroztad a MAX_PLAYERS definícióval(500), majd adtál értéket a 0 cellának false és az 1-es cellának true-t.
Tehát ha ki printelnénk a tartalmát a következõ eredményt kapnánk.
Cheat[0] = false;
Cheat[1] = true;
Cheat[2] = false;
Cheat[3] = false;
Cheat[4] = false;
Cheat[5] = false;
Cheat[6] = false;
...
Cheat[498] = false;
Cheat[499] = false;
Ebbõl már látszik hogy ennek így semmi értelme.
Itt egy kis kód ennek a mûködésének tesztelésére:
new
pelda[20] = { 1, 0, 2, ... };
printf(\"pelda változó kiíratása cellánként\");
for(new i; i < sizeof pelda; i++)
{
printf(\"cell: %d | %d\", i, pelda);
}
Akkor más, ez most tényleg jó így?
for(new i; i < MAX_PLAYERS; i++)
{
SetTimerEx(\"OnPlayerCheat\", 2500, true, \"i\", i);
}
Ezzel nem kevesebb mint 500 darab timer-t indítasz el.
Nem lenne elég ha OnPlayerConnectnél indulna el egy darab timer és OnPlayerDisconnectnél meg leállításra kerülne?
Vagy legyen egy állandó timer és a meghívott funkcióban legyen egy ciklus amely lefut MAX_PLAYERS értékig vagy még jobb ha foreach van alkalmazva.
És nézd meg azt ahogy Stricica írta meg.