Search the Community
Showing results for tags 'afk'.
-
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): 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íčko stock, 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: 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ý
-
Ahoj Mám dotaz na AFK Na mém GM nemám afk systém a tak asi po jedné min. mě to vyhodí ze serveru. Když jsem zkoušel afk systém tak i tak mě to po jedné min. spadlo a tak jsem ho smazal. Prosím poradíte jak na ten afk? Jak to udělat aby to ve hře nespadlo a hodilo mě to do toho AFK? Děkuji za rady