Jump to content

návod Scydovy YSI návody | #4 | YSI_Data\y_bit + y_playerarray[*]


Scydo

Recommended Posts

YSI_Data\y_bit
*****
 

Prolog:

Spoiler

Ano, já vím. Poslední můj návod na YSI byl 4 roky zpět. Nicméně, kvůli výmazu většiny fóra a taky díky jeho vzrůstající popularitě(včetně na požádání @ffredyk pro zveřejnění více obsahu) jsem si tak nějak řekl, že by bylo dobré něco přidat i kdyby kvůli nízké pravděpodobnosti využití. Protože proč ne? I když si někteří mohou myslet, že takové návody jsou v dnešní době na nic, tak jsem byl sám překvapen, že i jiná fóra ohledně SA MP tématiky stále tvoři nové a opravdu ano, nové FS/include/gm, příklad burgershot.
Ale protože na pawno.cz není prakticky nikdo, kdo by tvořil návody na YSI, tak s hrdostí se toho ujmu já.


Dá se říct, že celá YSI ohledně této tématiky má tři hlavní kategorie a to y_bit, y_playerarray, y_jaggedarray.

y_bit je include z knihovny pro komprimaci paměti boolean proměnných. Pak jeho odvozenina je y_playerarray, což je prakticky to samé, nicméně s jediným rozdílem a to, že má jiný tag při deklaraci, ale použití je identické(spíše pro rozeznání). A třetí je y_jaggedarray, pomocí něhož lze přeskupit velikosti ve 2D poli a jejich buněk(nicméně jeho použití spadá už do obtížnosti ****).

y_bit je výborně hodí, jestliže používáte spousty boolean polí. Problém u proměnných typu int a boolean je, že oba využivají stejný počet paměti, i když u boolean lze mít pouze dvě možné výsledné hodnoty a to 1(true) nebo 0(false).
Někteří si můžou říct, že při těch pár proměnných není třeba nic šetřit. Jenže, v momentě, kdy je makro #MAX_PLAYERS 500 a uživatel proměnnou s ním deklaruje hned několikrát, tak už to může být problém.

Při tvorbě příkladů jsem využil novou YSI5. Y_Less v návodě na instalaci uvadí, aby uživatelé použili sampctl. Nicméně, je i varianta pro uživatele bez toho a to zde: [klik]

Pro použivání y_bit je nejdříve zapotřebí si ho nahrát:

#include <YSI_Data\y_bit>

Pozor. Jestliže, chcete používat i y_playerarray, musí se načíst i y_bit, protože obsahuje většinu fcí pro něj.

#include <YSI_Data\y_bit>
#include <YSI_Data\y_playerarray>

A následná deklarace(ano, deklaruje se v ostrých závorkách):

new BitArray:varX<ind>;
	// varX = jméno pole
	// ind = velikost pole, dále jinak jako "slot"

new PlayerArray:AdminLevel<MAX_PLAYERS>;
	// AdminLevel = jméno pole
	// MAX_PLAYERS = velikost pole, dále jinak jako "slot"

y_bit(a y_playerarray) mají následujicí základní funkce, které si každou individuálně vysvětlíme:

Bit_Get(BitArray:array<>, slot);
Bit_Set(BitArray:array<>, slot, bool:set);
Bit_Let(BitArray:array<>, slot);
Bit_Vet(BitArray:array<>, slot);
Bit_SetAll(BitArray:array<>, bool:set);

Bit_Get();
Vrátí boolean hodnotu dle toho, jaký má daný slot.
Příklad:

new BitArray:varA<256>;

	if (Bit_Get(varA, 100) == true) {
		print("Tanto bunka je true !");
	}

Bit_Set();
Nastaví danému slotu danou boolean hodnotu.
Příklad:

new BitArray:varA<256>;

	if (Bit_Get(varA, 32) == true) {
		print("Chyba, správně by měla být false!");
		Bit_Set(varA, 32, false);
	}

	if (Bit_Get(varA, 128) == false) {
		print("Chyba, správně by měla být true!");
		Bit_Set(varA, 128, true);
	}

Bit_Let(); a Bit_Vet();

Jde vlastně o podobné funkce s tím rozdílem, že u Bit_Let() se nastaví hodnota na true, mezitím co u Bit_Vet() hodnotu na false. Obě fce jsou o trochu rychlejší než Bit_Set().
Příklad:

new BitArray:varA<256>;

	if (Bit_Get(varA, 32) == true) {
		print("Chyba, správně by měla být false!");
		Bit_Vet(varA, 32);
	}

	if (Bit_Get(varA, 128) == false) {
		print("Chyba, správně by měla být true!");
		Bit_Let(varA, 128);
	}

Bit_SetAll();
Jde o funkci, která nastaví u všech buňěk danou boolean hodnotu. Hodí se například u nastavení různých nutných null u hráče či serveru.
Příklad:

new BitArray:varA<256>;

	new i = 0;
	while (i < sizeof(varA)) {
		Bit_Vet(varA, i);
		i++;
	}
	// Tak tohle celé je zbytečné, protože stačí:

	Bit_SetAll(varA, false);


Využití
Tak to je celkém široké, protože jde víceméně o náhražku proměnné boolean, nicméně pár využití by tu bylo:

Prostý AFK script:

#include <YSI_Data\y_bit>
#include <YSI_Data\y_playerarray>

new PlayerArray:IsAfk<MAX_PLAYERS>;

#include <YSI_Visual\y_commands>

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

	// Jestliže ještě není afk:
	if (Bit_Get(IsAfk, playerid) == false) {
		Bit_Let(IsAfk, playerid);
		SendClientMessage(..., "Nyní jsi AFK, pro navrácení napiš /afk");
		TogglePlayerControllable(playerid, false);
	// Jestliže ale už afk je:
	}else{
		Bit_Vet(IsAfk, playerid);
		SendClientMessage(..., "Vrátil ses zpět do hry.");
		TogglePlayerControllable(playerid, true);
	}
	return 1;
}


Prostý Event script s typem Admin Portu:

#include <a_samp>
#include <YSI_Data\y_bit>
#include <YSI_Data\y_playerarray>

new BitArray:EventPort<MAX_PORT_TYPES>;
new PlayerArray:OnEvent<MAX_PLAYERS>;

#include <YSI_Visual\y_commands>

YCMD:event(playerid, params[], help)  {
	if (getPlayerAdminLevel(playerid) > LEVEL_PLAYER) {

		Bit_Let(EventPort, strval(params));
		// Nastaví se typ eventu
	}
	if (Bit_Get(OnEvent, playerid) == true) {
		return SendClientMessage(..., "Už jsi na eventu !");
	}
	if (Bit_Get(EventPort, 0) == true) {
		// Na event se lze portnout pouze s vozidlem
	}
	if (Bit_Get(EventPort, 1) == true) {
		// Na event se lze portnout pouze bez vozidla
	}
	if (Bit_Get(EventPort, 2) == true) {
		// Na event se lze portnout pouze s určitým modelem vozidla
	}
	if (Bit_Get(EventPort, 3) == true) {
		// Tento event je TDM/DM
	}
	if (Bit_Get(EventPort, 4) == true) {
		// Tento event je závod
	}
	Bit_Let(OnEvent, playerid);
		// A pošleme ho na event, jestliže vše projde v pořádku
	return 1;
}

YCMD:koneceventu(playerid, params[], help) {
	Bit_SetAll(EventPort, false);
	Bit_SetAll(OnEvent, false);
	// Sample code
	return 1;
}


Scydovy YSI návody - Hlavní topic: odkaz
 

Edited by Scydo
  • Děkuji (+1) 3
  • Líbí se mi to! (+1) 1
Link to comment
Share on other sites

před 2 hodinami, Scydo said:

Někteří si můžou říct, že při těch pár proměnných není třeba nic šetřit. Jenže, v momentě, kdy je makro #MAX_PLAYERS 500 a uživatel proměnnou s ním deklaruje hned několikrát, tak už to může být problém.

ak by mal kazdy uzivatel 1000 jedno bajtovych premennych, tak by o bolo stale iba 500kB

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

před 11 hodinami, Jiu said:

ak by mal kazdy uzivatel 1000 jedno bajtovych premennych, tak by o bolo stale iba 500kB

No... "iba".

A to se bavíme jen čistě o proměnných? Žádné podmínky, cykly nebo fce? :d

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