Szerző Téma: (Leírás) tickcount() a fölösleges timerek helyett  (Megtekintve 2283 alkalommal)

Nem elérhető krisk

  • 2380
    • Profil megtekintése
(Leírás) tickcount() a fölösleges timerek helyett
« Dátum: 2012. december 09. - 09:49:10 »
+5 Show voters
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.
« Utoljára szerkesztve: 2013. augusztus 09. - 06:39:44 írta krisk »

(Leírás) tickcount() a fölösleges timerek helyett
« Válasz #1 Dátum: 2012. december 09. - 10:28:37 »
0 Show voters
Jó leírás.  ;)
Igazából szerintem a tickcountot, és a GetTickCount()-ot,  lehet használni ugyan úgy, csak más 1 kicsit a 2 funkció, mivel a tickcount függvény az a sa-mp szervernek kéri le, a GetTickCount pedig az oprendszer futási ideje talán.

Nem elérhető Pedró

  • 3341
  • 2014 © Az év Szkriptere
    • Profil megtekintése
(Leírás) tickcount() a fölösleges timerek helyett
« Válasz #2 Dátum: 2012. december 09. - 10:48:30 »
0 Show voters
A GetTickCount pontosan mi is lenne amúgy? :D Arról is készülhetne leírás.. Mondjuk én is használom, de magát a függvény elvét nem ismerem..


Szép, rendezett leírás.
Hasznosítani fogom mindenképp.. :D

Nem elérhető krisk

  • 2380
    • Profil megtekintése
(Leírás) tickcount() a fölösleges timerek helyett
« Válasz #3 Dátum: 2012. december 09. - 11:23:12 »
0 Show voters
Idézetet írta: lackos888 date=1355045317\" data-ipsquote-contentapp=\"forums\" data-ipsquote-contenttype=\"forums\" data-ipsquote-contentid=\"30768\" data-ipsquote-contentclass=\"forums_Topic
Jó leírás.  ;)
Igazából szerintem a tickcountot, és a GetTickCount()-ot,  lehet használni ugyan úgy, csak más 1 kicsit a 2 funkció, mivel a tickcount függvény az a sa-mp szervernek kéri le, a GetTickCount pedig az oprendszer futási ideje talán.
 
Nem, a kettõ lényegében ugyanaz, a számítógép futásának idejét mutatja ezredmásodpercben. Az egyik alap pawn függvény, a másik meg azt hiszem a SAMP native.
Egyébként egy 32 bites integert ez kb. 24 nap folyamatos számítógép-üzemeltetés után túltölt. Ha saját szervered van, ajánlatos minden nap újraindítani, ha hosztos, akkor meg érdeklõdjetek náluk (de elvileg õk is újra szokták indítani õket x naponta).
« Utoljára szerkesztve: 2012. december 09. - 11:24:45 írta krisk »

Nem elérhető scripter01

  • 1035
  • Ex Moderálisan Globális
    • Profil megtekintése
(Leírás) tickcount() a fölösleges timerek helyett
« Válasz #4 Dátum: 2012. december 09. - 11:55:12 »
0 Show voters
szép

Nem elérhető ZyZu.

  • Globális moderátor
  • 8939
  • my turbo diesel forum
  • Discord: ZyZu.
    • Profil megtekintése
(Leírás) tickcount() a fölösleges timerek helyett
« Válasz #5 Dátum: 2012. december 09. - 13:01:48 »
0 Show voters
Ez nagyon jól jött fõleg még nem ismertem ennek a függvények az eljárásait. :D Most elég jól jön a verseny szkriptemhez :D  ;)

(Leírás) tickcount() a fölösleges timerek helyett
« Válasz #6 Dátum: 2012. december 09. - 14:42:50 »
0 Show voters
Idézetet írta: krisk date=1355048592\" data-ipsquote-contentapp=\"forums\" data-ipsquote-contenttype=\"forums\" data-ipsquote-contentid=\"30768\" data-ipsquote-contentclass=\"forums_Topic


Jó leírás.  ;)
Igazából szerintem a tickcountot, és a GetTickCount()-ot,  lehet használni ugyan úgy, csak más 1 kicsit a 2 funkció, mivel a tickcount függvény az a sa-mp szervernek kéri le, a GetTickCount pedig az oprendszer futási ideje talán.
 
Nem, a kettõ lényegében ugyanaz, a számítógép futásának idejét mutatja ezredmásodpercben. Az egyik alap pawn függvény, a másik meg azt hiszem a SAMP native.
Egyébként egy 32 bites integert ez kb. 24 nap folyamatos számítógép-üzemeltetés után túltölt. Ha saját szervered van, ajánlatos minden nap újraindítani, ha hosztos, akkor meg érdeklõdjetek náluk (de elvileg õk is újra szokták indítani õket x naponta).
 
[/quote]
Jah értem, köszi a választ.  ;)

(Leírás) tickcount() a fölösleges timerek helyett
« Válasz #7 Dátum: 2012. december 09. - 18:00:19 »
0 Show voters
ez jó, de nem marad meg, ha kikapcsolod a szervert.
erre használhatsz gettime, illetve getdate függvényt, hosszabb timerek helyett.
amguy szép leírás.:)

Nem elérhető ALIEN

  • 1163
    • Profil megtekintése
(Leírás) tickcount() a fölösleges timerek helyett
« Válasz #8 Dátum: 2012. december 09. - 18:16:48 »
0 Show voters
Nagyon jó! köszönöm most pont a timerekel szenvedek

Nem elérhető Iceaac

  • 2187
    • Profil megtekintése
(Leírás) tickcount() a fölösleges timerek helyett
« Válasz #9 Dátum: 2012. december 09. - 19:15:16 »
0 Show voters
Idézetet írta: TengeriMalac date=1355072419\" data-ipsquote-contentapp=\"forums\" data-ipsquote-contenttype=\"forums\" data-ipsquote-contentid=\"30768\" data-ipsquote-contentclass=\"forums_Topic
ez jó, de nem marad meg, ha kikapcsolod a szervert.
Téma címe: \"tickcount() a fölösleges timerek helyett\"
A timerek sem maradnak meg, ha kikapcsolod a szervert!
Egyébként szép leírás, amilyen egyszerû olyan hasznos is, remélhetõleg sokan áttérnek erre a módszerre, mikor elõnyösebb.
Kis magyarázat, a limittel kapcsolatban:
Amint krisk említette, kb. 24 nap után túllépi a 32 bites signed integer maximum értékét a futási idõ miliszekundumban.
A fent említett limit 2,147,483,647 (2^31 - 1). Azért csak a 31. hatványon, mert a 32 bitbõl egy a változó elõjelének tárolására szolgál (+/-).
Ha jól számoltam, akkor ez elméletileg 24 nap 20 óra 31 perc 23 másodperc és 646 milliszekundum.

(Leírás) tickcount() a fölösleges timerek helyett
« Válasz #10 Dátum: 2012. december 10. - 20:59:18 »
0 Show voters
Idézetet írta: Iceaac date=1355076916\" data-ipsquote-contentapp=\"forums\" data-ipsquote-contenttype=\"forums\" data-ipsquote-contentid=\"30768\" data-ipsquote-contentclass=\"forums_Topic


ez jó, de nem marad meg, ha kikapcsolod a szervert.
Téma címe: \"tickcount() a fölösleges timerek helyett\"
A timerek sem maradnak meg, ha kikapcsolod a szervert!
 
[/quote]
ezalatt azt értettem, hogy a timer lefutási értékébõl megmaradt ms értéket nem tudod menteni, de a getdate, vagy tickcount értékét igen.

Nem elérhető Iceaac

  • 2187
    • Profil megtekintése
(Leírás) tickcount() a fölösleges timerek helyett
« Válasz #11 Dátum: 2012. december 10. - 22:15:22 »
0 Show voters
Idézetet írta: TengeriMalac date=1355169558\" data-ipsquote-contentapp=\"forums\" data-ipsquote-contenttype=\"forums\" data-ipsquote-contentid=\"30768\" data-ipsquote-contentclass=\"forums_Topic


 

ez jó, de nem marad meg, ha kikapcsolod a szervert.
Téma címe: \"tickcount() a fölösleges timerek helyett\"
A timerek sem maradnak meg, ha kikapcsolod a szervert!
 
[/quote]
ezalatt azt értettem, hogy a timer lefutási értékébõl megmaradt ms értéket nem tudod menteni, de a getdate, vagy tickcount értékét igen.
 
[/quote]
Az ez elõtti hozzászólásodból nem derül ki, hogy a timerekre gondolsz, azt mondtad, \"ez\", azt hittem a tickcountra gondolsz, mivel errõl szól a téma.  :D

Nem elérhető DrAkE

  • 2078
    • Profil megtekintése
(Leírás) tickcount() a fölösleges timerek helyett
« Válasz #12 Dátum: 2012. december 11. - 15:05:33 »
0 Show voters
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
« Utoljára szerkesztve: 2012. december 11. - 15:10:56 írta DrAkE »

Nem elérhető DrAkE

  • 2078
    • Profil megtekintése
(Leírás) tickcount() a fölösleges timerek helyett
« Válasz #13 Dátum: 2012. december 11. - 16:00:53 »
0 Show voters
Idézetet írta: Iceaac date=1355235478\" data-ipsquote-contentapp=\"forums\" data-ipsquote-contenttype=\"forums\" data-ipsquote-contentid=\"30768\" data-ipsquote-contentclass=\"forums_Topic


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.
 
Igen, mínuszba megy. Ugyan ha a negatívból kivonod a negatívat pozitív értéket kapsz, de akkor már kényelmetlen a dolog, ha az elsõ változó értéke mondjuk 2,011,418,927, hiába vonogatod ki belõle a negatív számod, nem azt az értéket kapod, amit kéne, ergo hibás lesz a szkripted.
Egyébként nem nagy dolog újraindítani a szervert 24 naponta, általában  jóval gyakrabban újra vannak indítva, tehát ez nem kritikus probléma.
 
[/quote]
Mindig plusz lesz, mivel ha az elsõ érték 2,147,483,647, a második, mondjuk 2,147,483,680 akkor is pluszba jössz ki, mivel az elsõ érték mindig kisebb lesz a másodiknál. (még ha átrakja minuszba is). Illetve akkor is plusz érték jön ki, ha az elsõ plusz érték, a második pedig negatív, ha az elsõ negatív, és a második is negatív. Olyan pedig nem nagyon lehet hogy az elsõ negatív, a második pedig pozitív, ugyanis az elsõ szám MINDIG kisebb lesz a másodiknál.

Nem elérhető DrAkE

  • 2078
    • Profil megtekintése
(Leírás) tickcount() a fölösleges timerek helyett
« Válasz #14 Dátum: 2012. december 11. - 19:09:51 »
0 Show voters
De ezt mondom, hogy tök mindegy mennyi az értéke, ugyanis ha elérte a limitet, akkor mínuszba tér vissza, mind ha változóba tárolod, mind ha a függvényt hívod meg (ugyanis a függvényt is mínuszba rakja) Illetve, elég sokat kell ahhoz várni, hogy 2,011,418,927 után mínuszba menjen. Illetve ha 2,147,483,647 után átlépi a határt (2,147,483,649, mert ha 2,147,483,648 az eredmény mínusz mínusz lesz \"--\"), akkor lemegy -2,147,483,647-ba.
« Utoljára szerkesztve: 2012. december 11. - 19:16:24 írta DrAkE »

 

SimplePortal 2.3.7 © 2008-2024, SimplePortal