Scydo 397 Odesláno: 30. Březen, 2016 Share Odesláno: 30. Březen, 2016 YSI4 AFK #2***** Zdravím vás u dalšího návodu. Dnešní díl se bude týkat AFK systému. Opět jsem si pro vás připravil takovou ukázku, kde uživatel, který je jistě autorem tohoto kód, se snažil o naprogramování stejného scriptu, na který bude návod v tomto topicu, s opět využitím dcmd(ach jo): #include <a_samp> #define dcmd(%1,%2,%3) if (!strcmp((%3)[1], #%1, true, (%2)) && ((((%3)[(%2) + 1] == '\0') && (dcmd_%1(playerid, ""))) || (((%3)[(%2) + 1] == ' ') && (dcmd_%1(playerid, (%3)[(%2) + 2]))))) return 1 new bool:Afk[MAX_PLAYERS]; public OnPlayerCommandText(playerid, cmdtext[]) { dcmd(afk,3,cmdtext); return 1; } dcmd_afk(playerid, params[]) { new string[500]; if(!Afk[playerid]){ if(params[0]){ format(string,sizeof(string),"{FF0000}[ AFK ] {1B1BE0}Hrac {37DB45}%s {1B1BE0}odesel na chvili od PC [Duvod: {37DB45}%s{1B1BE0}]",Jmeno(playerid),params); Afk[playerid] = true; SendClientMessageToAll(-1,string); TogglePlayerControllable(playerid, false); }else{ format(string,sizeof(string),"{FF0000}[ AFK ] {1B1BE0}Hrac {37DB45}%s {1B1BE0}odesel na chvili od PC",Jmeno(playerid)); Afk[playerid] = true; SendClientMessageToAll(-1,string); TogglePlayerControllable(playerid, false); } }else{ format(string,sizeof(string),"{FF0000}[ AFK ] {1B1BE0}Hrac {37DB45}%s {1B1BE0}je zpet ve hre",Jmeno(playerid)); Afk[playerid] = false; TogglePlayerControllable(playerid, true); } return 0; } stock Jmeno(playerid) { new n[156]; GetPlayerName(playerid, n,sizeof(n)); return n; } Znalosti některých uživatelů jsou vskutku mimořádné. Děkujeme uživateli HelloJeffry, který nám tento "kód" poskytl na (ewolutions.cz/topic/1170). Teď si to zkusíme vytvořit s využitím YSI knihovny. Začneme s tím, že si rozmyslíme, co si nahrajeme: y_commands - pro lepší, efektivnější práci s příkazy, včetně parametrů. y_playerarray - ušetří využití paměti, hlavně u boolen proměnných s polem. Rozdíl mezi y_bit a y_playerarray prakticky není. Jen y_playerarray je určená pro hráče. y_va - pro práci s již formátovanými fcemi nebo efektivnější zpracovávání vlastních form. fcí. Potřebné includy z knihovny máme nahrané a tak můžeme pokračovat. Začneme tím, že si deklarujeme jednu boolen proměnnou, ale pozor, s tagem PlayerArray!: new PlayerArray: bIsAfk<MAX_PLAYERS>; Pracování pak s tou proměnnou je sice jednoduché, ale pro vás to bude ze začátku celkem neefektivní, tak si na to můžeme udělat preprocesor: #define IsPlayerAfk(%0) Bit_Get(bIsAfk, %0) Nyní přidáme snad nejrozšířenější, nejčastější a nejvíce používanou funkci, a to funkci, která nám vrátí z fce GPN jméno hráče. Jelikož nepřidávám další velice známé slovíčkostock, tak jméno naší fce trošku zkrášlíme: GetPlayerNick(playerid) { new sNick[MAX_PLAYER_NAME + 1]; GetPlayerName(playerid, sNick, sizeof(sNick)); return (sNick); } Dále si přidáme (zjednodušeně) příkaz. Tak já nevím co vy, ale myslím, že příkaz afk je asi pro náš účel nejlepší volba: YCMD:afk(playerid, params[], help) { V případě, že by jste chtěli jiný příkaz, stačí jenom změnit slovíčko afk.. Tak, dále použijeme náš preprocesor a pomocí podmínky zjistíme, jestli není hráč již afk: if (IsPlayerAfk(playerid)) { Nyní budeme zpracovávat blok, který proběhne v případě, že hráč je afk, tudíž jestliže bude proměnná true. Začneme tím, že přiřadíme naší proměnné hodnotu false, jelikož je afk a jakmile zadá příkaz, tak už nebude: Bit_Vet(bIsAfk, playerid); TogglePlayerControllable(playerid, true); /* K tomhle snad nemusím nic povídat... */ *****Rozdíl mezi Bit_Vet a Bit_Let. I když je celkem jasný rozdíl, nejspíše se najdou jedinci, co ho nevidí, tak vysvětlím: Normálně při nastavování u takových-to proměnných musí uživatel používat fci Bit_Set. Bit_Set(bIsAfk, playerid, true); Bit_Set(bIsAfk, playerid, false); Kdo tento způsob bude používat, tak maximálně bude upozorněn, že existuje lepší varianta a to zrovna Bit_Let, který nastaví proměnnou na true a Bit_Vet nastaví proměnnou zase na false: Bit_Let(bIsAfk, playerid); /* true */ Bit_Vet(bIsAfk, playerid); /* false */ Krom toho, že jsou rychlejší v zápise jsou také mnohem rychlejší po stránce funkčnosti.*****A nakonec přidáme, že se všem odešle zpráva(již formátovaná), že se hráč úspěšně vrátil do hry: va_SendClientMessageToAll(0xFFA50000, "[ AFK ] Hráč %s se vrátil do hry", GetPlayerNick(playerid)); Ale nyní zpracovávat blok, který proběhne v případě, že hráč ještě není afk, tudíž jestliže bude proměnná false. Začneme tím samým akorát opačně, a to, že přiřadíme naší proměnné hodnotu true, jelikož není afk a jakmile zadá příkaz, tak už bude: Bit_Let(bIsAfk, playerid); TogglePlayerControllable(playerid, false); A pozor. Teď vám ukážu takový magický trik. Pokud chcete odesílat afk s důvodem v případě, že nějaký napsal, tak nemusíte na to přidávat zbytečně další blok. Ale stačí vám jediné, a to if-else. Prvně podmínka, jestli tedy nezadal žádné parametry: if (!strlen(params)) va_SendClientMessageToAll(0xFFA50000, "[ AFK ] Hráč %s je nyní AFK !", GetPlayerNick(playerid)); A teď jeho alternativu v případě, že napíše cokoliv, například ahoj, místo parametrů(/afk ahoj): else va_SendClientMessageToAll(0xFFA50000, "[ AFK ] Hráč %s je nyní AFK [ DŮVOD: %s ]!", GetPlayerNick(playerid), params); Neuvěřitelné, že? Z celých 2 bloků jsou pouhé 2 řádky!. A nakonec zakončíme blok a i celý příkaz a máme hotovo: } return (true); } Toť vše. Celý kód pro shlédnutí zde: #include <a_samp> #include <YSI_Visual\y_commands> // <YSI\y_commands> #include <YSI_Coding\y_va> // <YSI\y_va> #include <YSI_Data\y_playerarray>// <YSI\y_playerarray> new PlayerArray: bIsAfk<MAX_PLAYERS>; #define IsPlayerAfk(%0) Bit_Get(bIsAfk, %0) GetPlayerNick(playerid) { new sNick[MAX_PLAYER_NAME + 1]; GetPlayerName(playerid, sNick, sizeof(sNick)); return (sNick); } YCMD:afk(playerid, params[], help) { if (IsPlayerAfk(playerid)) { Bit_Vet(bIsAfk, playerid); TogglePlayerControllable(playerid, true); va_SendClientMessageToAll(0xFFA50000, "[ AFK ] Hráč %s se vrátil do hry", GetPlayerNick(playerid)); }else{ Bit_Let(bIsAfk, playerid); TogglePlayerControllable(playerid, false); if (!strlen(params)) va_SendClientMessageToAll(0xFFA50000, "[ AFK ] Hráč %s je nyní AFK !", GetPlayerNick(playerid)); else va_SendClientMessageToAll(0xFFA50000, "[ AFK ] Hráč %s je nyní AFK [ DŮVOD: %s ]!", GetPlayerNick(playerid), params); } return (true); } Pak to dopadne nějak takto: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ý 3 Link to comment Share on other sites More sharing options...
Hlavní moderátor vEnd 279 Odesláno: 30. Březen, 2016 Hlavní moderátor Share Odesláno: 30. Březen, 2016 (upraveno) Zcela by se dalo obejít bez YSI, ale poněvadž je to návod právě na YSI utility, tak budiž. Dobré (pár postřehů jsem ti psal osobně). Edited 30. Březen, 2016 by vEnd Link to comment Share on other sites More sharing options...
Globální moderátor bug 131 Odesláno: 30. Březen, 2016 Globální moderátor Share Odesláno: 30. Březen, 2016 Konečne si môžem spraviť afk systém na môj mc server Link to comment Share on other sites More sharing options...
BTomas 0 Odesláno: 30. Březen, 2016 Share Odesláno: 30. Březen, 2016 Vyborne, vse funguje.. Link to comment Share on other sites More sharing options...
Quiter 99 Odesláno: 31. Březen, 2016 Share Odesláno: 31. Březen, 2016 #define IsPlayerAfk(%0) Bit_Get(bIsAfk, playerid) - menšia chybička sa nájde všakže Link to comment Share on other sites More sharing options...
Mattsy 29 Odesláno: 31. Březen, 2016 Share Odesláno: 31. Březen, 2016 Je to fajn návod na knižnicu YSI ako ukážka funkcií a ich využitia ale ten jeho script zase nie je zlý, áno možno ten dôvod sa dá spraviť o pár riadkov kratšie ale to je asi tak všetko čo sa tam dá vyčítať....používa dcmd? no a čo? nechápem prečo ti to vadí, 90% uživateľov na tomto fóre ani nevie že nejaký bool existuje a nehovoriac o tom že 90% z tých 90% nedokáže urobiť dôvod na afk... Návod ako ukážka YSI fajn ale tá výčitka v prvom scripte....to nemuselo byť Link to comment Share on other sites More sharing options...
Administrátor Ewwe 434 Odesláno: 31. Březen, 2016 Administrátor Share Odesláno: 31. Březen, 2016 Co dělá Bit_Let a Bit_Vet ? Link to comment Share on other sites More sharing options...
The hidden face 77 Odesláno: 31. Březen, 2016 Share Odesláno: 31. Březen, 2016 Co dělá Bit_Let a Bit_Vet ? Využití vyplývá z popisků, nicméně by mu tam nějaký menší komentář k těmto fcím neměl chybět. Link to comment Share on other sites More sharing options...
Scydo 397 Odesláno: 31. Březen, 2016 Author Share Odesláno: 31. Březen, 2016 Zcela by se dalo obejít bez YSI, ale poněvadž je to návod právě na YSI utility, tak budiž. Dobré (pár postřehů jsem ti psal osobně). ~> Samozřejmě, že by se dalo zcela obejít i bez jakýchkoliv includů. Ale chtěl jsem přidat jenom návod, který by se týkal úpravy kódu, který jsem sem přidal jako ukázku, kdybych na něm pracoval s využitím YSI. Nemůžu říct, že tohle by byl výsledný afk systém přes YSI, jelikož jde k tomu využít ještě další hromada includů z knihovny. Vyborne, vse funguje.. ~> Jelikož vidím větší počet teček na konci, tak to zní jako ironie. Samozřejmě kód jsem i pro jistotu vyzkoušel, a ano skutečně funguje ten kód, který je v tomto návodě vysvětlený. #define IsPlayerAfk(%0) Bit_Get(bIsAfk, playerid) - menšia chybička sa nájde všakže ~> Jojo děkuju moc, opraveno. Je to fajn návod na knižnicu YSI ako ukážka funkcií a ich využitia ale ten jeho script zase nie je zlý, áno možno ten dôvod sa dá spraviť o pár riadkov kratšie ale to je asi tak všetko čo sa tam dá vyčítať....používa dcmd? no a čo? nechápem prečo ti to vadí, 90% uživateľov na tomto fóre ani nevie že nejaký bool existuje a nehovoriac o tom že 90% z tých 90% nedokáže urobiť dôvod na afk... Návod ako ukážka YSI fajn ale tá výčitka v prvom scripte....to nemuselo byť ~> Nikde jsem nenapsal, že ten kód je špatně, nebo, že by ho nikdo neměl využívat. Slouží pouze jako ukázka(píšu to i v samotném úvodu). ~> To stejné s využitím dcmd. Opět nikde jasně nepíšu, že mi to vadí, že je to nejhorší člověk na světě. Jen mi několik lidí již psalo, že jako ukázka by se hodil nějaký lepší kód se alespoň průměrnými includy (zcmd, dof2 aj.). Je pravda, že dcmd dini zrovna nemusím, ale raději povím, ať ho ten uživatel nepoužívá a zkusí něco lepšího, a také proč, než, abych ho kritizoval... Co dělá Bit_Let a Bit_Vet ? ~> Díky za připomínku, už je to v návodě přidané. Zapomněl jsem to přidat již dříve. Využití vyplývá z popisků, nicméně by mu tam nějaký menší komentář k těmto fcím neměl chybět. ~> Už přidané. Také je to oddělené, aby to uživatelé nemátlo, že je to spíše vysvětlení, než, že to patří ke výslednému kódu. BTW: upravil jsem i trochu topic. Snad už tam nejsou nějaká nesmyslná slova typu "scriptum". Link to comment Share on other sites More sharing options...
Hlavní moderátor vEnd 279 Odesláno: 31. Březen, 2016 Hlavní moderátor Share Odesláno: 31. Březen, 2016 Je to fajn návod na knižnicu YSI ako ukážka funkcií a ich využitia ale ten jeho script zase nie je zlý, áno možno ten dôvod sa dá spraviť o pár riadkov kratšie ale to je asi tak všetko čo sa tam dá vyčítať....používa dcmd? no a čo? nechápem prečo ti to vadí, 90% uživateľov na tomto fóre ani nevie že nejaký bool existuje a nehovoriac o tom že 90% z tých 90% nedokáže urobiť dôvod na afk... Návod ako ukážka YSI fajn ale tá výčitka v prvom scripte....to nemuselo byť Já si myslím, že ten povzdech nad dcmd je na místě. Je rok 2016, máme rychlejší a stejně jednoduché metody. A argumentovat neznalostí zdejších uživatelů, nevím no... je to teda smutná a, bohužel, pravdivá poznámka. Možná by to chtělo pořádnou aktualizaci sekce návodů. Link to comment Share on other sites More sharing options...
Mattsy 29 Odesláno: 31. Březen, 2016 Share Odesláno: 31. Březen, 2016 SkiBig....narazam na to ze si to napisal takym stylom ze to vyznelo ako by to mal uplne zle napisane....viem ze si chcel ukazat len alternativu cez YSI, chapem ze mame rychlejsie funkcie na prikazy ale stale je dcmd pouzivane v hojnej miere a to len preto ze ludom sa nechce menit nieco co funguje spolahlivo a osobne si myslim(je to len moj osobny nazor) ze pri takomto prikaze tam rozdiel v rychlosti asi ani nebude, co keby si urobil nejake testy rychlosti na prikazy a systemy? Link to comment Share on other sites More sharing options...
Pán Podnikateľ 52 Odesláno: 1. Duben, 2016 Share Odesláno: 1. Duben, 2016 Dobrí večer. Nedá mi nezareagovať na toto téma. V prvom rade by som chcel pochváliť autora kódu za pekný a priehľadný návod ktorí sa zameriava na YSI. Tak tiež musím súhlasiť s Scydo že DCMD aj keď je to tu veľa krát spomenuté by sa už nemal používať. Ako napísal Mattsy nebolo by zlé spraviť nové rýchlostné testy páč počítače a samotné serveri sú výkonnejšie než včera čiže v kvázi aj samotné DCMD zrýchľuje. Lenže vždy tu bude to samotné staré meranie kde už v tedy vyplývalo z rýchlostných testov že DCMD je veľmi pomalé. Tieto merania ktoré už boli budú síce iné než dnes ale poradie by malo zostať nezmenené.Čiže autorove pohoršenie na systéme akceptujem a myslím si že je adekvátne k jeho prvotným slovám nad ktorými sa niektorý pohoršujete. Ako spomínal kolega vEnd je rok 2016 čiže právo na svoj názor má každý a sú rýchlejšie systémy ktoré by som skôr aj ja odporúčal ako staršie z roku 2008... . Kód je pekne napísaní len by trebalo tak tiež podotknúť na konci témy že funkcie ako bool, char a knižnice ako y_bite, y_playerarray sú veľmi pomalé páč pawn pracuje s 4 Byte čo je 32 bitov. Nižšie to pawn nedokáže vďaka SA:MP Teams ktorý očividne v časovej tiesni alebo lenivosťou zabudli na znalosti o bitoch samotných a použili iba tkz. DoubleWorld. Ďakujem za prečítanie a za skvelí tutoriál. 2 Link to comment Share on other sites More sharing options...
Scydo 397 Odesláno: 1. Duben, 2016 Author Share Odesláno: 1. Duben, 2016 SkiBig....narazam na to ze si to napisal takym stylom ze to vyznelo ako by to mal uplne zle napisane....viem ze si chcel ukazat len alternativu cez YSI, chapem ze mame rychlejsie funkcie na prikazy ale stale je dcmd pouzivane v hojnej miere a to len preto ze ludom sa nechce menit nieco co funguje spolahlivo a osobne si myslim(je to len moj osobny nazor) ze pri takomto prikaze tam rozdiel v rychlosti asi ani nebude, co keby si urobil nejake testy rychlosti na prikazy a systemy? ~> Jak se již zmínili kolegové nademnou (vEnd, CMatus) včetně tebe samotného, ano jsou mnohem rychlejší includy. Ale nemysli jsi. Jsou i rychlejší než samotné YSI. Na kód, který jsem sem přidal jako ukázku, jsem pohlížel a komentoval jako Ysisák(uživatel, co používá výhradně jen YSI4 na obsahovější nebo složitější scripty), proto možná to zní tak kriticky. Ale nikde jsem nepsal, že ten kód není spolehlivý nebo, že by se neměl používat. ~> A bohužel, zase úplně tak spolehlivě nefunguje. Stačí jedno špatné písmenko, nebo někde něco vynechat, a už to nefunguje. Nemluvě o tom, že jsem i slýchal případy, kdy blblo params u dcmd. Kód je pekne napísaní len by trebalo tak tiež podotknúť na konci témy že funkcie ako bool, char a knižnice ako y_bite, y_playerarray sú veľmi pomalé páč pawn pracuje s 4 Byte čo je 32 bitov. Nižšie to pawn nedokáže vďaka SA:MP Teams ktorý očividne v časovej tiesni alebo lenivosťou zabudli na znalosti o bitoch samotných a použili iba tkz. DoubleWorld. ~> Do takových podrobností jsem už nechtěl jít, jelikož tohle subfórum se zaobírá prací s YSI, nikoliv teorií. Samozřejmě, některé důležité informace napíšu, ale, kdybych měl u všeho napsat jak je to rychlé, jaký na to mám osobní názor, jestli je to vhodné, nevhodné, jestli by se to mělo používat... tak akorát tím zbytečně prodloužím tutoriál a nikomu se moc nechce číst 4 a více stránek v 1 návodů. btw taky děkuju Link to comment Share on other sites More sharing options...
DNLS 31 Odesláno: 1. Duben, 2016 Share Odesláno: 1. Duben, 2016 V celém kodu tam máš include <a_samp>, ještě to # Link to comment Share on other sites More sharing options...
Scydo 397 Odesláno: 1. Duben, 2016 Author Share Odesláno: 1. Duben, 2016 V celém kodu tam máš include <a_samp>, ještě to # ~> To jsi neměl říkat... to bylo to super secret proti kopírákům .... #1d-a Link to comment Share on other sites More sharing options...
Pán Podnikateľ 52 Odesláno: 1. Duben, 2016 Share Odesláno: 1. Duben, 2016 ~> Jak se již zmínili kolegové nademnou (vEnd, CMatus) včetně tebe samotného, ano jsou mnohem rychlejší includy. Ale nemysli jsi. Jsou i rychlejší než samotné YSI. Na kód, který jsem sem přidal jako ukázku, jsem pohlížel a komentoval jako Ysisák(uživatel, co používá výhradně jen YSI4 na obsahovější nebo složitější scripty), proto možná to zní tak kriticky. Ale nikde jsem nepsal, že ten kód není spolehlivý nebo, že by se neměl používat. ~> A bohužel, zase úplně tak spolehlivě nefunguje. Stačí jedno špatné písmenko, nebo někde něco vynechat, a už to nefunguje. Nemluvě o tom, že jsem i slýchal případy, kdy blblo params u dcmd. ~> Do takových podrobností jsem už nechtěl jít, jelikož tohle subfórum se zaobírá prací s YSI, nikoliv teorií. Samozřejmě, některé důležité informace napíšu, ale, kdybych měl u všeho napsat jak je to rychlé, jaký na to mám osobní názor, jestli je to vhodné, nevhodné, jestli by se to mělo používat... tak akorát tím zbytečně prodloužím tutoriál a nikomu se moc nechce číst 4 a více stránek v 1 návodů. btw taky děkuju Dovoľ mi zareagovať na tvoju reakciu ohľadom môjho príspevku. Plne súhlasím že ak by si mal popisovať samotní návod o Bitoch bolo by to asi zdĺhavejšie ale na druhej stránke musíš uznať že y_playerarray je hranie sa s Bytmi. Len že musíš brať aj ohľad na nováčika a je dobré napísať a upozorniť ho na samotné výhody a nevýhody. Páč pre príklad dnes veľa ľudí si robí viac FS v YSI pre svoj server nevedomky o tom že spomaľuje systém. Tak tiež nemusíš robiť rýchlostné testy stačí to len decentne spomenúť. Prosím neber môj príspevok ako dôraz znechutenia práce alebo opovrhovanie. Len som ťa chcel upozorniť na daný fakt pre seba zlepšenie v budúcich príspevkoch. S pozdravom CMatus. 1 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