A FÜGGVÉNY
A tickcount egy olyan függvény, ami a rendszer elindulása óta eltelt idõvel tér vissza ezredmásodpercekkel.
tickcount(&granularity=0)
&granularity: a visszatérés alkalmával ez az érték adja meg az egy másodpercben lévõ \"tick\"-ek számát. Az UNIX rendszerek esetén ez \"100\", vagyis az érték csak minden 10. ezredmásodpercben frissül. Mivel a függvény így is-úgy is ezredmásodpercekkel tér vissza, ez az érték csak a pontosság ellenõrzésére használható.
A ROSSZ PÉLDA
Rengeteg RP scriptben láttam (sõt, sokáig én magam is ezt csináltam), hogy amikor egy cselekvést minden x másodpercre akartak korlátozni, a cselekvés végrehajtása után az elõzõleg deklarált bool változónak hamis értéket adtak, majd elindítottak egy x másodperces timert, melynek lefutása után az érték ismét igaz lett.
Vegyük példának az alábbi kódot:
new bool:JatekosMegteheti[playerid] = true; // ez az a változó, ami meghatározza, hogy a játékos (már) használhatja-e (újra) a cselekvést.
MagaACselekvés(playerid) { // ez a függvény maga a cselekvés, amit a játékos csak adott idõközönként tehet meg. Lehet parancs, pickup felvétele, akármi egyéb
if(JatekosMegteheti[playerid]) { // amennyiben a játékos használhatja a cselekvést...
// ide jön maga az eredmény
JatekosMegteheti[playerid] = false; // beállítjuk a változót hamisra, így mostmár nem teheti meg.
SetTimerEx(\"Engedelyez\", 10000, false, \"d\", playerid); // elindítunk egy timert, ami 10 másodperc múlva lefut.
return 1;
} else { // amennyiben a játékos nem használhatja...
SendClientMessage(playerid, -1, \"Ezt a cselekvést még nem ismételheted újra!\"); // kiírjuk, hogy nem használhatja a cselekvést még (várnia kell a timer lefutására)
return 0;
}
}
public Engedelyez(playerid) { //ha letelt a 10 másodperc
JatekosMegteheti[playerid] = true; //a játékosnak újra megengedjük, hogy használja a cselekvését
}
Az alábbi kód a MagaACselekvés függvényt korlátozta le: amennyiben valaki lefuttatja a függvényt, a tömbben, ami tárolja a cselekvés végrehajthatóságát (JatekosMegteheti), át lesz állítva az érték hamisra, majd a 10 másodperces timer visszaállítja igazra. A két cselekvés közt nem használható a függvény.
A JÓ PÉLDA
A tickcount() függvény segítségével ezt a kódot egyszerûbbé tehetjük. Ha a függvényt kétszer meghívjuk, és kivonjuk az utóbbit az elõbbibõl, máris kapunk egy intervallumot a két idõpont közt.
new UtolsoEngedelyezes[MAX_PLAYERS]; //ebben fogjuk tárolni az utolsó engedélyezés tickcountját
MagaACselekvés(playerid) { // ez a függvény maga a cselekvés, amit a játékos csak adott idõközönként tehet meg. Lehet parancs, pickup felvétele, akármi egyéb
if(tickcount() - UtolsoEngedelyezes[playerid] > 10000) { //Ez az ág akkor fut le, ha a jelenlegi tickcount és az utolsó ellenõrzés tickcountjának különbsége nagyobb mint 10000. Vagyis a két mérés között több, mint 10 másodperc telt el.
//Ide jön a cselekvés
UtolsoEngedelyezes[playerid] = tickcount(); // Frissítjük a változót a legfrissebb értékkel.
return 1;
} else { // ha nem telt el még 10 másodperc
SendClientMessage(playerid, -1, \"Ezt a cselekvést még nem ismételheted újra!\");
return 0;
}
}
TICKCOUNT(), MINT IDÕMÉRÕ
A fenti függvényt akár idõmérõként is használhatjuk. Ha egy cselekvés elején (pl. egy verseny rajtján) beleírjuk egy változóba, majd a végén az aktuális értékbõl kivonjuk az eredetit, megkaphatjuk, hogy a cselekvés mennyi idõbe tellett.
new VersenyKezdeteIdo[playerid];
VersenyKezdete(playerid) {
VersenyKezdeteIdo[playerid] = tickcount();
// elkezdõdött a verseny
}
VersenyVege(playerid) {
// végetért a verseny
new versenyido = tickcount() - VersenyKezdeteIdo[playerid];
new str[100];
format(str, 128, \"A versenyt %i ezredmásodperc alatt teljesítetted.\", versenyido);
SendClientMessage(playerid, -1, str);
}
Az ezredmásodperceket pedig már különbözõ scriptek segítségével percekbe vagy órákba konvertálhatjuk.
A HÁTRAMARADT IDÕ LEKÉRDEZÉSE
Mintegy befejezésként tekintsük meg a \"jó példa\" változói alapján, hogy hogy kérhetjük le, az adott cselekvés hány ezredmásodperc múlva lesz végrehajtható:
new mennyiido = 10000 - (tickcount() - UtolsoEngedelyezes[playerid])
Ahol a 10000 a cselekvések közti minimális szünet mennyisége.
Ez a leírás még koránt sem teljes, javítások és bõvítések várhatóak
EDIT: ADATBÁZISBAN ELTÁROLANDÓ ADATOK
Ha ugyenzt a tickcountos mókát az adatbázisodban is akarod használni, akkor egy új, hasonló idõmérõ függvényt kell bevezetni, ez pedig a gettime().
A gettime() egy unix timestamp függvény, azaz az 1970-01-01 00:00:00Z óta eltelt másodpercekkel tér vissza.
A mûködési elve hasonló a fentiekben bemutatottakhoz, azzal a nagy különbséggel, hogy mivel adatbázisban tároljuk, ezért a szerver futásidejével visszatérõ függvény nyilván nem jó erre a célra.
Igazság szerint a limittõl se kell igazán félni, ugyanis ha eléri a limitet mínuszba megy. Ezen felül, ha kivonsz két értéket egymásból (ami persze mínusz), akkor is pozitív értéket kapsz.
Pl:
tickcount() visszatér -100al, ezt eltárolod. Majd tickcount újabb értéke visszatér -120al, az -100 - (-120), vagyis +20 jön ki.
Példa:
new
egyertek = 3000000000,
ketertek = 3000000050
;
printf(\"%d|%d\", egyertek, ketertek);
printf(\"Kivonás: %d\", (ketertek - egyertek));
Az elsõ printelésre az alábbi értéket kapjuk:
egyertek: -1294967296
ketertek: -1294967246
Egymásból való kivonás értéke: +50