Jump to content
  • 0

pomoc Jak přesně funguje funkce OnPlayerUpdate?


Marks

Dotaz

Ahoj. Na mém serveru mám udělán výpis novinek který jsem doteď vypisoval ve své metodě a projížděl jsem všechny hráče pomocí cyklu for.
Ale napadlo mě, že by to šlo udělat bez tohoto foru, a tak jsem si založil proměnou bool kterou přenastavím na true když chci aby se provedl kus kódu. 
Takto nastavuji proměnnou 1x za minutu. Když jsem měl tu vlastní metodu kde jsem projížděl hráče forem a vypisoval jsem jim informace, tak to fungovalo bez problému. 
Ale teď jsem to přespal do funkce OnPlayerUpdate. Na wikipedii píši něco ve stylu, že se tato funkce provádí několikrát za sekundu nebo i do sekundy, a že záleží na tom, co hráč dělá například pokud běhá -> provádí se hodně, pokud ne, tak se provádí méně. https://wiki.sa-mp.com/wiki/OnPlayerUpdate

Problém u mě nastává právě v tom když se hráč nehýbe, sice nechápu jak je tohle možné, ale já nastavím hodnotu na true, a nic se neprovede, ani zkušební výpis se nevypíše. Ale to se změní tím, když začnu běhat, náhle to začne fungovat.
Upřímně teď si začínám říkat, kde je problém, 
vždyť to má alespoň 1x proběhnout.
 

if(SPAM == true){
	SendClientMessage(playerid,0x0000FFFF,"{FA710C}A");
               if(infotext == 0){
			if(Language[playerid] == 1){
				format(textinfo[playerid],sizeof(textinfo),"~y~Info: ~w~For buying car write to chat ~r~/car");
			}if(Language[playerid] == 2){
				format(textinfo[playerid],sizeof(textinfo),"~y~Info: ~w~Pro zakoupeni auta napis do chatu ~r~/car");
			}
		}
		PlayerTextDrawSetString(playerid,novinkytext[playerid],textinfo[playerid]);
		SPAM = false;
	}

Předem děkuji všem za odpovědi. Díky Marks

 

Link to comment
Share on other sites

11 odpovědí na tuto otázku

Recommended Posts

  • 0

A proč takto zbytečně použij timer :)

Ano, ale nevím jak ten timer zavolat, abych tam nemusel používat zase ten for ciklus, toho foru bych se chtě vyvarovat.

Link to comment
Share on other sites

  • 0

Tak co třeba onPlayerConnect zapnout timer? Popř už při spuštění módu pro všechny hráče. 

 

SetTimerEx : http://wiki.sa-mp.com/wiki/SetTimerEx


OnPlayerConnect vyvoláš timer aneb vytvoříš novou funkci s tímto kódem. Jelikož co jsem pochopil používáš více jazyčnost takže je lepší v OnPlayerConnect popř OnPlayerSpawn záleží na tobě. 

Link to comment
Share on other sites

  • 0

Tak co třeba onPlayerConnect zapnout timer? Popř už při spuštění módu pro všechny hráče. 

 

SetTimerEx : http://wiki.sa-mp.com/wiki/SetTimerEx

OnPlayerConnect vyvoláš timer aneb vytvoříš novou funkci s tímto kódem. Jelikož co jsem pochopil používáš více jazyčnost takže je lepší v OnPlayerConnect popř OnPlayerSpawn záleží na tobě. 

Právě já spouštím timer v OnGamemodeInit aby na serveru běžel čas a podobné věci, ale jelikož to spouštím v OnGamemodeInit, tak tam namůžu začlenit právě playerid, tak proto se ptám, jestli z to jde udělat nějak jinak, jinak já ten timer pouštím takto: SetTimer("Cas",1500,true);

Link to comment
Share on other sites

  • 0
  • Hlavní moderátor

Ano, ale nevím jak ten timer zavolat, abych tam nemusel používat zase ten for ciklus, toho foru bych se chtě vyvarovat.

Ten cyklus v časovači ti to bude zatěžovat rozhodně méně, jak když budeš používat OnPlayerUpdate. Používání tohoto callbacku ti nedoporučuji, pokud je zde jiná alternativa. Opravdu se volá i několikrát za sekundu. Když si cyklus pro všechny hráče správně optimalizuješ (GetPlayerPoolSize zjišťuje největší připojené ID a není problém zjišťovat i to nejmenší připojené), bude to v pohodě.

Link to comment
Share on other sites

  • 0

Ten cyklus v časovači ti to bude zatěžovat rozhodně méně, jak když budeš používat OnPlayerUpdate. Používání tohoto callbacku ti nedoporučuji, pokud je zde jiná alternativa. Opravdu se volá i několikrát za sekundu. Když si cyklus pro všechny hráče správně optimalizuješ (GetPlayerPoolSize zjišťuje největší připojené ID a není problém zjišťovat i to nejmenší připojené), bude to v pohodě.

Takže mám ten kód upravit do předešlé podoby a jen ve foru: for(new playerid = 0; playerid < MAX_PLAYERS; playerid ++){} upravit MAX_PLAYERS na GetPlayerPoolSize() ? Určitě to bude probíhat méně IDček než předtím. Díky za příspěvek, o funkci GetPlayerPoolSize() jsem nevěděl :)

Svoji funkci uprav na jeden parameter mojeFunkce(playerid) a potom ji volej s pomocí setTimerEx("mojeFunkce",1000*60,true,"i",playerid)

Hmmm nějak by to šlo, ale nenapadá mě, kam bych tento timer umístil, já to právě chci všechno mít synchronizovaný jedním časovačem.

Link to comment
Share on other sites

  • 0

Tak čistě teoreticky by jsi mohl mít jeden časovač v onGameModeInit a porovnávat tam lidi co jsou připojení a jim to posílat.

To by asi i fungovalo, ale nevím vůbec, jak to myslíš, jestli pustit každýmu hráči svůj vlastní časovač a tím volat tyhle metody pro hráče. A nad těmito časovači pro hráče by běžel hlavní časovač, který by to všechno řídil? 

Link to comment
Share on other sites

  • 0
  • Hlavní moderátor

Takže mám ten kód upravit do předešlé podoby a jen ve foru: for(new playerid = 0; playerid GetPlayerPoolSize() ? Určitě to bude probíhat méně IDček než předtím. Díky za příspěvek, o funkci GetPlayerPoolSize() jsem nevěděl :)

vlastně to bude for(new playerid, max = GetPlayerPoolSize(); playerid max; playerid++). Tohle je asi nejlepší verze, co za těchto podmínek jde.

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