Scydo 397 Odesláno: 25. Září, 2016 Share Odesláno: 25. Září, 2016 YSI_Coding\y_timers***** Timery v a_samp jsou skvělá a učitečná věc. Avšak, každý timer vyžaduje neustále psát forward, public a fci. Ale za pomocí YSI stačí napsat jen typ timeru a způsob, jak ho spustíte.Nejdříve si ukážeme použití y_timers. Tady jsem si vymyslel menší kód za použití čístě jen a_sampu:forward pPrvniTimer(); forward pDruhyTimer(playerid); new pTimer[MAX_PLAYERS]; public OnPlayerCommandText(playerid, cmdtext[]) { if (!strcmp("/timer1", cmdtext)) { SetTimer("pPrvniTimer", 1000*60*2, false); return 1; } if (!strcmp("/timer2", cmdtext)) { pTimer[playerid] = SetTimerEx("pDruhyTimer", 1000*60*3, true, "i", playerid); return 1; } return 0; } public pPrvniTimer() { SendClientMessageToAll(-1, "Tohle se všem odešle po 2 minutách poté, co jsem zadal příkaz"); } public pDruhyTimer(playerid) { SendClientMessage(playerid, -1, "Tohle se odešle speciálně jen tobě po 3 minutách dokola"); } public OnPlayerDisconnect(playerid, reason) { KillTimer(pTimer[playerid]); return 1; } Teď ten samý kód za použít YSI:#include <YSI_Visual\y_commands> YCMD:timer1(playerid, params[], help) { defer pPrvniTimer(); return true; } timer pPrvniTimer[1000*60*2]() { SendClientMessageToAll(-1, "Tohle se všem odešle po 2 minutách poté, co jsem zadal příkaz"); } ptask pDruhyTimer[1000*60*3](playerid) { SendClientMessage(playerid, -1, "Tohle se odešle speciálně jen tobě po 3 minutách dokola"); } public OnPlayerDisconnect(playerid, reason) { stop timer_Druhy[playerid]; } O dost kradší a přehlednější, že?Manipulace s timeryNež budeme moct použít y_timer, musíme nejdříve si ujasnit, co v základech vůbec obsahuje a jaké fce co dělají:deferSpustí timer pouze jednou(stejně, jako by jste u fce SetTimer(Ex) dali u repeating false). defer TimerPozdrav(playerid); repeatTimer se bude neustále volat(jeho obsažený kód), dokud ho uživatel nezastaví nebo se nevypne server. repeat TimerTipy(); stopZastaví opakující se timer. ALE POZOR. Při přidávání timerů jmenujete timery jmény, které normálně vkládáte do funcname[] ve fci SetTimer(Ex), avšak ve YSI vy musíte vypnout jeho ID. Tudíž využijete tag Timer:(který YSI obsahuje) pro jeho zjištění a následné vypnutí: new Timer: timer_tipy = repeat TimerTipy(); stop timer_tipy; TypyNásledné fce(inf. slovíčka) už vkládáme rovnou do zdrojového kód. Nikam do žádného callbacku či kamkoliv jinam.timerZákladní "jednotka". Používá se v případě, že pracujete s timery, který spouštíte za pomocí defer či repeat(a nebo klidně i obyčejně). taskOpakující se timer, který se ihned spustí po spuštění serveru. U task nelze přidávat parametry. Vyjímka tvoří ptask, kde je parametr playerid. ptaskStejně jako pro task, s tím rozdílem, že se opakuje, spustí se u daného hráče, a počet spuštěných timerů se zvyšuje s počtem hráčů na serveru. Použití - tipy#include <YSI_Coding\y_timers> ptask TipSystem[1000*60*2](playerid) { new iZprava = random(5); switch(iZprava) { case 0: SendClientMessage(playerid, -1, "[ TIP ] Tip číslo 1 "); case 1: SendClientMessage(playerid, -1, "[ TIP ] Tip číslo 2 "); case 2: SendClientMessage(playerid, -1, "[ TIP ] Tip číslo 3 "); case 3: SendClientMessage(playerid, -1, "[ TIP ] Tip číslo 4 "); case 4: SendClientMessage(playerid, -1, "[ TIP ] Tip číslo 5 "); } } (Rád bych dodal, že jsem se snažil do návodu přidat jen ty nejpodstatnější informace. Složitější a zajímavější využití include si může i každý uživatel dohledat a naučit individuélně. Kdyby jste samozřejmě měli dotaz, ptejte se).Scydovy YSI návody, hlavní topic: odkaz 2 Link to comment Share on other sites More sharing options...
Hlavní moderátor vEnd 279 Odesláno: 25. Září, 2016 Hlavní moderátor Share Odesláno: 25. Září, 2016 Kompenzují tyto časovače zpoždění, které generují běžné časovače (např. když máš časovač přes SetTimer na 30 sekund, může být až o x % delší, tedy přes 30 sekund)? Link to comment Share on other sites More sharing options...
Scydo 397 Odesláno: 25. Září, 2016 Author Share Odesláno: 25. Září, 2016 Kompenzují tyto časovače zpoždění, které generují běžné časovače (např. když máš časovač přes SetTimer na 30 sekund, může být až o x % delší, tedy přes 30 sekund)? Pokud jsem správně pochopil otázce, tak snad tohle bude stačit jako odpověď: Tasks with the same delays are automatically balanced to not occur at the same time. For example if you have three with a one second period, they will be called a third of a second apart. The balancing algorithm is not perfect. If you have one timer at 400ms and one at 700ms, they will conflict once every 2.8s. This currently only offsets timers with the same periods, however cross-period-collisions are much rarer so not an issue most of the time. -->> http://forum.sa-mp.com/showthread.php?t=571044 Link to comment Share on other sites More sharing options...
Hlavní moderátor vEnd 279 Odesláno: 25. Září, 2016 Hlavní moderátor Share Odesláno: 25. Září, 2016 Ne, to není to, na co jsem se ptal. Časovače mají už od přírody () zpoždění. Když dáš třeba 1 000 milisekund (aka 1 sekunda) a zvolíš opakovat, vznikne tam vždy čas navíc (~ 1 100 milisekund). Proto dávám pro sekundové časovače jen 900 ms, popř. 950 ms. Otázka zní, jestli tohle YSI kompenzuje. Vím, že na tom byl include od Slice, ten to kompenzoval. Dělá to i y_timers? Link to comment Share on other sites More sharing options...
Scydo 397 Odesláno: 25. Září, 2016 Author Share Odesláno: 25. Září, 2016 Ne, to není to, na co jsem se ptal. Časovače mají už od přírody ( ) zpoždění. Když dáš třeba 1 000 milisekund (aka 1 sekunda) a zvolíš opakovat, vznikne tam vždy čas navíc (~ 1 100 milisekund). Proto dávám pro sekundové časovače jen 900 ms, popř. 950 ms. Otázka zní, jestli tohle YSI kompenzuje. Vím, že na tom byl include od Slice, ten to kompenzoval. Dělá to i y_timers? Jo ták . To ti nedokážu říct na 100 %, protože když jsem používal opakující timery, nějakou změnu v intervalu jsem nepostřehl(jinak řečeno nestalo se mi to, takže ano), ale co si pamatuju tak y_timers byly proslavené spousty úprav a i oprav obyčejných timerů(např. možnosti volat i string a array), takže je dosti pravděpodobně, že se tam implementovala i tahle úprava. Link to comment Share on other sites More sharing options...
ATomas 299 Odesláno: 25. Září, 2016 Share Odesláno: 25. Září, 2016 Tak vam to hosi rozseknu http://wiki.sa-mp.com/wiki/SetTimer Timer intervals are not accurate (roughly 25% off). Resenim je udelat mensi timer a kontrolovat podle funkce GetTickCount(). Link to comment Share on other sites More sharing options...
Jiu 299 Odesláno: 26. Září, 2016 Share Odesláno: 26. Září, 2016 Ne, to není to, na co jsem se ptal. Časovače mají už od přírody ( ) zpoždění. Když dáš třeba 1 000 milisekund (aka 1 sekunda) a zvolíš opakovat, vznikne tam vždy čas navíc (~ 1 100 milisekund). Proto dávám pro sekundové časovače jen 900 ms, popř. 950 ms. Otázka zní, jestli tohle YSI kompenzuje. Vím, že na tom byl include od Slice, ten to kompenzoval. Dělá to i y_timers? Asi myslis, jestli se casovac spousti kazdych 1000ms nebo 1000ms po ukonceni volani cb predosleho ticku. To si zmeris jednoducho. Udelej si casovac (5sec), do kteryho das vypis casu do konzole a pod nej jeste nejaky sleep na 3 sec. Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now