Jump to content

návod Scydovy YSI návody | #8 | YSI_Storage\y_ini + YSI_Server\y_colors [**]


Scydo

Jak si myslíte, že by se měli načítat údaje?  

6 members have voted

  1. 1. Jak si myslíte, že by se měli načítat údaje?

    • Nejdříve registrační údaje a až pak zbytek údajů.
      2
    • Načíst vše naráz (bez správného přihlášení se dál nedostane).
      1
    • Načíst až po spawnutí (kdyby hráč chtěl okamžitě odejít).
      1
    • Načíst jen určité a zbytek načíst při speciálním momentu (například při zobrazení /tops).
      0
    • Načíst až po určitém čase (zmrazit hráče na 5 vteřin a načíst údaje).
      0
    • Načíst důležité údaje a zbytek načíst později či při speciálním momentě(při velkém možnoství údajů).
      2


Recommended Posts

YSI_Storage\y_ini
*****

Prolog:

Spoiler

Tak jo. Musím říct, že jsem se i trochu těšil na tenhle návod, protože jsem viděl nejednoho člověka, co používal ten úplně stejný návod a jen kopírovat a vložil do kódu. Šlo to poznat hlavně díky tagům, které používal úplně špatně a nebo zbytečně.
Navíc y_ini je první include z knihovny, na který jsem narazil a tak nějak jsem díky němu se začal učit YSI.

Anketa:

Spoiler

Více můžete zjistit v sekci ohledně tagů.

Nejdříve si ukážeme jaké funkce mají naše vybrané includy (dini, DOF2, eINI a y_ini), abych ukázal, že není mezi nimi moc velký rozdíl(dokonce, některé nabízejí více možností):

/* DINI                 DOF2                      EINI                     Y_INI 	    */

/*   ---   */	 >>> DOF2_ParseFile();   >>> INI::ParseINI();		 >>> INI_ParseFile();
dini_Create();	 >>> DOF2_CreateFile();  >>> INI::CreateINI(); 		 >>> INI_Open();
dini_Exists();	 >>> DOF2_FileExists();  >>> INI::IsValidHandle();	 >>> fexist(); // !
dini_Set();      >>> DOF2_SetString();   >>> INI::WriteString();	 >>> INI_WriteString();
dini_IntSet();   >>> DOF2_SetInt();      >>> INI::WriteInteger();	 >>> INI_WriteInt();
dini_FloatSet(); >>> DOF2_SetFloat();    >>> INI::WriteFloat();		 >>> INI_WriteFloat();
dini_BoolSet();  >>> DOF2_SetBool();     >>> INI::WriteBool();		 >>> INI_WriteBool();
dini_Get();      >>> DOF2_GetString();   >>> INI::ReadString();	 	 >>> INI_String();
dini_Int();      >>> DOF2_GetInt();      >>> INI::ReadInteger();	 >>> INI_Int();
dini_Float();    >>> DOF2_GetFloat();    >>> INI::ReadFloat();	 	 >>> INI_Float();
dini_Bool();     >>> DOF2_GetBool();     >>> INI::WriteBool();		 >>> INI_Bool();
/*   ---   */	 >>> DOF2_SetHex();      >>> INI::WriteHex();		 >>> INI_WriteHex();
/*   ---   */	 >>> DOF2_SetBin();      >>> INI::WriteBinary();	 >>> INI_WriteBin();
/*   ---   */	 >>> DOF2_SaveFile();	 >>> INI::CloseINI(); 		 >>> INI_Close();
/*   ---   */	 >>> DOF2_RemoveFile();	 >>> fremove(); /* Asi?*/	 >>> fremove(); // !
/* DINI                 DOF2                      EINI                     Y_INI 	    */

Více o eINI - zde

Jediná potíž je, že y_ini má všechny fce pouze načítací ve fci ze ParseFile. Důvodem je hlavně rychlost, protože tímhle způsobem je načítání rychlejší když načítá rovnou celý soubor, či více údajů naráz.
(Lze i určité, ale obtížnost spadá do ***).

Tak jo začnem. První co asi některé mohlo zarazit je, že y_ini nemá funkce na smazání či zjištění existence souboru. Nicméně, jestliže chceme to zakomponovat, není problém si na to udělat makra:

#define INI_Exists fexist
#define INI_Remove fremove

Když teď na to máme fce tak ukázka jak se zjišťuje existence souboru, otevírají a zavírají:

if (INI_Exists("cesta/soubor.txt")) {
	new INI:soubor = INI_Open("cesta/soubor.txt");
	INI_Close(soubor); // !
}

Nesmíme zapomenout, že y_ini má vlastní tag na soubory. Ne File: jako mají soubory ale INI: tag.
To není tak těžké. Teď si zkusíme do toho souboru vepsat pár údajů, všech možných datových typů:

if (INI_Exists("cesta/soubor.txt")) {
	new INI:soubor = INI_Open("cesta/soubor.txt");
	INI_WriteInt(soubor, "myInt", 94515);
	INI_WriteFloat(soubor, "myFloat", 0.594);
	INI_WriteHex(soubor, "myHex", 0xFF000000);
	INI_WriteBool(soubor, "myBool", true);
	INI_WriteString(soubor, "myString", "Ahoj, tohle je pro string");
	INI_Close(soubor);
}

Pokud jde o načítání, tak jak jsem již psal, y_ini nemá fce na načítání určitých údajů(jako má, ale je to složitější) ale pouze ve volané funkci, kterou můžeme zavolat pomocí INI_ParseFile(). Je ještě jedna funkce na načítání a to INI_Load(). Funkce jsou prakticky stejné, akorát u Load není vícero argumentů ohledně načítání, takže doporučuji raději používat INI_ParseFile():
(A taky hlavně protože jsem zjistil, že Load nemá ani jméno funkce, do které vkládat načítání ale má nějakou vlastní, kterou jsem za boha nezjistil jaká to je :unsure:)

INI_ParseFile(fname[], remoteFormat[], bool:bFileFirst = false, bool:bExtra = false, extra = 0, bool:bLocal = true, bool:bPassTag = false, bool:bFilter = true, filter[] = "")

Tak jo. Má spousty argumentů ale pojďme si je vysvětlit:
fname[] = Jaký soubor se má načíst.
remoteFormat[] = Z jaké funkce se budou údaje načítat.
bFileFirst = Jestliže nejdříve začít načítání souboru a až pak od určitého tagu a nebo při false, proces bude opačný.
bExtra = Načíst nějaká speciální data.
extra = Jaká speciální data načítat (ve 99 % případů to je playerid)
bLocal = Načítat z lokální funkce či globální?
bPassTag = Přidát tag k přidání speciálního parametru? NE K JMÉNU FUNKCE.
bFilter = Přidat filter na všechny tagy a nebo jen na určitý?
filter[] = Přidaný text pro nalézání určitého tagu na načtení.

Jestliže jste zmatený, co jaká přesně delá, tak není třeba si dělat obavu. Za sebe můžu říct, že určitě použijete pouze 2 argumenty a to zrovna bExtra a extra pro playerid.
Lze použít inline? Ano!

A tady přichází ta ukázka, kde šlo poznat, že někdo kód okopíroval z tutoriálu, protože používal následujicí načítání:

INI_ParseFile(UserPath(playerid), "LoadUser_%s", .bExtra = true, .extra = playerid);

forward LoadUser_data(playerid, name[], value[]);
public LoadUser_data(playerid, name[], value[]) {

Což by sice fungovalo ale jen pouze, jestliže před vpisování údajů přidal i tag:

INI_SetTag(soubor, "data");

Bez tagu, se to nenačte!

Takže, přicházím s následujicím: Tagy jsou fajn a užitečné, ale pouze pro rozdělení sekcí údajů a není třeba je používat na načítání určitých údajů. Tím myslím rozdělení, kdy někteří nejdříve načítají registrační údaje jako je jméno, heslo, popřípadě IP a až poté načítají zbytek údajů. Za mě se to zdá zbytečné, a klidně naráz načíst vše, protože se na server stejně nedostane, dokud nezadá správné heslo. Načítat jenom určité bych uznal jen, pokud se načítá skutečně enormně velké množství údajů jako například 100 i víc. No, nevím, hlasujte v anketě, co si o tom myslíte.

Tak a jak je to s načítáním samotným. Nic těžkého, stačí si na to zavolat funkci(nesmíse také zapomenout návratovou hodnotu!). Následujicí načítání má pouze 2 argumenty a to jméno klíče co se načítají a do čeho se má načítat:

public OnPlayerConnect(playerid) {
	INI_ParseFile(SouborHrace(playerid), "NacistData", .bExtra = true, .extra = playerid);
	return 1;
}

forward NacistData(playerid, name[], value[]);
public NacistData(playerid, name[], value[]) {
	INI_Int("myInt", myInt[playerid]);
	INI_Float("myFloat", myFloat[playerid]);
	INI_Hex("myHex", myHex[playerid]);
	INI_Bool("myBool", myBool[playerid]);
	INI_String("myString", myString[playerid]);
	return 1;
}

Ale jestliže chceme načíst takové hodnoty, do kterých se musí hodnota nastavit/navrátit, můžeme si ve funkci deklarovat proměnnou a pomocí ní načítat vše:

#include <YSI_Data\y_playerarray>
new PlayerArray:IsVip<MAX_PLAYERS>;

forward NacistData(playerid, name[], value[]);
public NacistData(playerid, name[], value[]) {
	new bool:hodnota;
	INI_Bool("myBool", hodnota);
	Bit_Set(IsVip, playerid, hodnota);
	return 1;
}

Nejlepší ukázka, kde lze dobře využít y_ini je registrace a přihlášení.

YSI_Server/y_colours

Nebo také YSI_Server\y_colors není nic více než hromada(přesnějí skoro 4000) předdefinovaných barev. Ne jen pro šestnáctková(barva nicku hráče) tak i desitkové nebo i barvy pro gametext. Pro šestnáctkovou před jménem barvy se přidává X11, u desitkové se nemusí nic přidávat stačí jméno a stejně jako u obyčejných gametext se přidává znak ~. Příklady použití:

#include <YSI_Server\y_colours>

SendClientMessage(playerid, X11_RED, "Tohle celé bude červená zpráva");

SendClientMessage(playerid, X11_RED, "Tohle bude červené "SNOW"tohle bílé");

GameTextForPlayer(playerid, "~X~~H~~H~zluta", 3000, 1);

 

Hlavní topic - odkaz

Všechny barvy u y_colors/y_colours:

Y_colours.png

 

Edited by Scydo
falalala
  • Paráda! (+1) 1
  • Líbí se mi to! (+1) 1
Link to comment
Share on other sites

před 1 hodinou, Hip said:

Na druhou stranu, je to pořád to stejné.

Taky že ano. YSI neupravuje kód PAWN, jen nabízí novou možnost, jak s ním pracovat a ve velké většině se zkrátka opakuje(což je i dobře, nikdo by přece nechtěl aby na každý include byl jiný způsob používání, to by se pak nikdo nenaučil).

Edited by Scydo
Link to comment
Share on other sites

  • Globální moderátor

Mě se všeobecně na tom líbí, že to je jedna komplexní velká knihovna, kterou když se člověk naučí, tak mu to hodně zjednoduší vývoj. To že to je to pořád stejně je samozřejmě dobře, je to pro ostatní jednodušší na to "přejít"

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