Scydo 397 Odesláno: 25. Prosinec, 2020 Share Odesláno: 25. Prosinec, 2020 (upraveno) 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 25. Prosinec, 2020 by Scydo 3 1 Link to comment Share on other sites More sharing options...
Deleted User 295 Odesláno: 26. Prosinec, 2020 Share Odesláno: 26. Prosinec, 2020 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 1 Link to comment Share on other sites More sharing options...
Scydo 397 Odesláno: 26. Prosinec, 2020 Author Share Odesláno: 26. Prosinec, 2020 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? Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now