Jump to content

návod Scydovy YSI návody | #3 | YSI_Coding\y_timers [**]


Scydo

Recommended Posts

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 timery
Než 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í:

defer

Spustí timer pouze jednou(stejně, jako by jste u fce SetTimer(Ex) dali u repeating false).

defer TimerPozdrav(playerid);

 


repeat

Timer se bude neustále volat(jeho obsažený kód), dokud ho uživatel nezastaví nebo se nevypne server.

repeat TimerTipy();

 


stop

Zastaví 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;

 


Typy

Následné fce(inf. slovíčka) už vkládáme rovnou do zdrojového kód. Nikam do žádného callbacku či kamkoliv jinam.

timer

Zá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ě).


task

Opakují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.


ptask

Stejně 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
  • Líbí se mi to! (+1) 2
Link to comment
Share on other sites

  • Hlavní moderátor

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

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

  • Hlavní moderátor

Ne, to není to, na co jsem se ptal. Časovače mají už od přírody (:d) 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

Ne, to není to, na co jsem se ptal. Časovače mají už od přírody ( :d) 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 :d. 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

Ne, to není to, na co jsem se ptal. Časovače mají už od přírody ( :d) 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

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...