Jump to content

návod [YSI] Odpočet [**] #1


Scydo

Recommended Posts

YSI4 ODPOČET #1
*****

Je celkem škoda, že je tu celé subfórum, ale prázdné. Tak mě napadlo toho využít.

Hledal jsem chvilku nějaký odpočet bez použití YSI. Jelikož vEnd neumí pochopit pojem ukázka, tak jsem našel něcí starší odpočet na ewolutions(ewolutions.cz/topic/1661):


 


dcmd_odpocet(playerid, params[])
{
LEVEL(3);
new Odpocet;
if(isnull(params)) return SCM(playerid,-1,"Použitie {33CC33}: /odpocet <Čas>");
//new id = strval(params);
if(strlen(params) > 15) return SendClientMessage(playerid, COLOR_WHITE, "{FF0000}[ ! ]{FFFFFF} Chybné parametre.");

new Cas = strval(params);
if(Cas < 0 || 60 < Cas) return SendClientMessage(playerid,  COLOR_WHITE, "Použitie {33CC33}: /odpocet <Čas>");
if(Odpocet > 0) return SendClientMessage(playerid,  COLOR_WHITE, "{FF0000}[ ! ]{FFFFFF} Odpočet už prebieha.");

new string[78];
format(string, 78, "{FF0000}Administrátor %s spustil odpočet na %d sekúnd.", Jmeno(playerid), Cas);
SendClientMessageToAll(COLOR_ORANGE, string);

Odpocet = Cas;
SetTimer("Odpocet",1000, false);
return true;
}
forward OdpocetS(Odpocet);
public OdpocetS(Odpocet)
{

    new string[8];
    if(Odpocet > 0)
    {
        format(string,8,"~g~~h~%d",Odpocet);
        GameTextForAll(string, 1000, 4);
        Odpocet--;
        SetTimer("SOdpocet", 1000, false);
    }else{
        GameTextForAll("~b~~h~]~r~~h~ Go Go Go~b~~h~ ]", 3000, 4);
    }
}

 



Jak si můžete všimnout je tam použité dcmd(my god). Teď si to zkusíme vytvořit ve YSI knihovně. Začneme s tím, že si rozmyslíme, co si nahrajeme:

  • y_commands - pro lepší, efektivnější práci s příkazama, včetně parametrů.
  • y_timers - pro lepší a efektivnější práci s timerama.
  • y_va - pro práci s již formátovanými fcemi nebo efektivnější spracovávání vlastních form. fcí.

Potřebné includy z knihovny máme nahrané a tak můžeme pokračovat. Nejdříve si deklarujeme dvě proměnné. Jedna bude pro podmínku, jestliže běží nějaký odpočet a druhá bude na čas do konce odpočtu:




new
	iOdpocet,
	bool:bOdpocet;

Pokud to někteří z vás nezvládají tento krok, tak se YSI ani neučte. Děkuji za pochopení. Všimněte si, že máme jednu proměnnout deklarovanou jako integer a druhou jako boolen. Nyní si vložíme (zjednodušeně) příkaz. Můžeme si zvolit jaký chceme, tak například obyčejný odpocet:




YCMD:odpocet(playerid, params[], help) {

Oprávnění si bude moct každý přidat zvlášť podle svých potřeb nebo podle svého uvážení. Upozornění: Nemusíme vůbec přidávat preprocesor #pragma unused (přesněji na to samotné help, které vrací true v případě, že hráč zadá to, co má nastavené (například otazník)), jak velká většina lidí praktikuje. Je to naprosto zbytečně. Ale zpět k návodu, kde budeme pokračovat tím, že si přidáme nejlépe tři podmínky a k nim budeme vracet zprávy. První, jestliže zadal parametry správně:




	if (!strlen(params)) return SendClientMessage(playerid, -1, "< Chyba > Použití příkazu: /odpocet [5-60]");

Následně, jestliže ten čas, co zadal je správně v rozmezí 5-60 sekund:




	if (strval(params) < 5 || strval(params) > 60) return SendClientMessage(playerid, -1, "< Chyba > Použití příkazu: /odpocet [5-60]");

A na konec, jestliže už neběží nějaký odpočet:




	if (bOdpocet) return SendClientMessage(playerid, -1, "< Chyba > Odpočet již běží !");

Když máme podmínky za sebou následuje samotný odpočet. Nejdříve si jednou spustíme timer,




	defer tOdpocet();

Můžeme ho místo místo jednostranného spouštění pomocí defer ho opakovat pomocí repeat, ale to bychom ho pak musely zastavit, což je už trochu složitější, a není to tak jednoduché, jak to zní. Pak už jen přiřadíme hodnoty, a to tak, že bOdpocet přiřadíme true, jelikož odpočet bude běžet, tak aby se nezačal hned další a iOdpocet abychom věděli, kolik zbývá do konce:




	bOdpocet = true; iOdpocet = strval(params);
	return (true); /* A zakončíme návratovou hodnotou */
}

Teď ke spracování samotného timeru. Ale není čeho se obávat. I to je velice jednoduché. Tak přidámi fci timeru:




timer tOdpocet[1000]() {

Slovo timer je poznámka pro compiler, že je o fci pro timer. Číslo se závorkou [1000] je počet milisekund, kdy se spustí timer (tedy, kdy začne "působit" kód uvnitř bloku), a závorky () je pro parametry, které voláme(přidáváme) spolu se spouštěním času (defer, repeat...). Pak si přidáme podmínku, jestli naše proměnná ještě nedosáhla hodnoty 0:




	if (iOdpocet != 0) {

Uvitř bloku dáme, že se odešle již formátovaná zpráva GM pro všechny hráče se odpočtem:




		va_GameTextForAll("~r~%i", 1000, 3, iOdpocet);

Všimněte si, že tady ve fci dostazujeme za specifikátory až ke konci. A nakonec znovu spustíme jednou timer, protože, kdybychom ho spustili jenom v příkaze, objeví se jenom číslo a konec:




		defer tOdpocet();

Ale nesmíme zapomenout, pokud tu podmínku splňuje, aka pokud ta hodnota je už rovna 0:




	}else{

Tak určitě se napíše zpráva START:




		GameTextForAll("~r~START", 3000, 3);

A dokončíme tím, že zase přiřadáme proměnné bOdpocet hodnotu false, jinak by nám náš příkaz odpocet už další odpočet nepovolil:




		bOdpocet = false;
	}
}

Toť vše. Celý kód pro shlédnutí zde:

 




#include <a_samp>
#include <YSI_Visual\y_commands>
#include <YSI_Coding\y_va>
#include <YSI_Coding\y_timers>

new
	iOdpocet,
	bool:bOdpocet;
	
YCMD:odpocet(playerid, params[], help) {

	if (!strlen(params)) return SendClientMessage(playerid, -1, "< Chyba > Použití příkazu: /odpocet [5-60]");
	if (strval(params) < 5 || strval(params) > 60) return SendClientMessage(playerid, -1, "< Chyba > Použití příkazu: /odpocet [5-60]");
	if (bOdpocet) return SendClientMessage(playerid, -1, "< Chyba > Odpočet již běží !");
	defer tOdpocet();
	bOdpocet = true; iOdpocet = strval(params);
	return (true);
}

timer tOdpocet[1000]() {

	if (iOdpocet != 0) {

		va_GameTextForAll("~r~%i", 1000, 3, iOdpocet);
		iOdpocet--;
		defer tOdpocet();
	}else{
		GameTextForAll("~r~START", 3000, 3);
		bOdpocet = false;
	}
}

 




Děkuji za pozornost a všem, kdo tento návod ohodnotí kladně a nebo repem.
PS: mám v plánu pokračovat.

 

Návod označen jako platný

Ten to návod byl označen jako platný.Návod může být kdykoli označen jako nevhodný či neplatný

  • Líbí se mi to! (+1) 3
Link to comment
Share on other sites

Pěkné :) Já právě přemýšlel, že bych začal s timerama, ale nějak se mi furt do toho nechtělo. Asi teď začnu, jak to tu máš krásně popsané. GJ. +rep

 

EDIT: Už se těším na další návody. Jsem právě čekal, kdy uděláš další :d.

Edited by PetrPaulik
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...