Jump to content

Search the Community

Showing results for tags 'návody'.

  • Search By Tags

    Oddělujte čárkami
  • Search By Author

Content Type


Fórum

  • Obecné
    • Všeobecné
    • Všechno možné
  • Programování
    • Poradna
    • Návody
    • Tvorba
    • Hledám programátora
  • Herní oblast
    • Poradna
    • Jak na to?
    • Herní kontext
    • Herní zážitky
    • Komunita
  • Grafika
    • Poradna
    • Návody
    • Tvorba
  • Ostatní
    • Hardware a software
    • Hledám/nabízím
    • Archiv
    • 3D Tisk

Find results in...

Find results that contain...


Date Created

  • Start

    End


Last Updated

  • Start

    End


Filter by number of...

Joined

  • Start

    End


Group


Web


Facebook


Jabber


Skype


Steam


Twitter


Github


Pastebin

Found 3 results

  1. Zdravím, asi jste si všimli, že přibyla nová sekce "Základy pawn". Po domluvě s Ewwem jsem se rozhodl, že většinu svých návodů z ewa (jiného fóra) přesunu i sem. Vyžádal jsem si na to svou sekci, za chvíli vysvětlím proč. Vlastně vysvětlím všechno. Proč to vzniklo? Jednoduše řečeno, je zde horda lidí, co žádají o pomoc se svým kódem nebo problémem, ale když jim někdo poskytne návod, jak toho dosáhnout, skončí to na tom, že dotyčný nezná základy. Odkázat jej na google či na samp wiki bez toho, aniž by to helper nějak přiblížil, má asi stejnou vypovídací hodnotu jako ten příspěvek od toho, co žádá pomoc. Řešením je odkázat jej na místní sekci "Návody", ale... ...ale to by v té sekci nesměl být takový bordel. Za ty roky se tam nahromadily stovky návodů, sice byl pokus o to je roztřídit (nice try, Petře, Hipe), ale že by to zrovna dvakrát pomohlo, to ne. Proto vznikla tato sekce, která bude sdružovat návody pro úplné začátečníky. Jakých návodů se to týká a co musí splňovat? Jsou to návody, které se věnují jednotlivým strukturám jazyka Pawn, jeho syntaxi apod. Já prozatím plánuji návody na proměnnou, pole, funkce, podmínky, cykly a řetězce. Co bude dál, to se uvidí. Přispět svým návodem může každý, ale návod v této sekci by měl splňovat tato pravidla, jinak by sekce postrádala smysl: 1. Návod musí být sepsán "jako pro blbce"; to znamená, že musí být vše pododrobna a srozumitelně vysvětleno, žádné odborné výrazy a úseky, popř. tyto úseky musí být od návodu nějak odděleny s upozorněním, že jde o něco navíc (já využívám spoilerů); 2. Tématem by neměla být žádná konkrétní funkce SA:MP (timery, 3dlabely apod.) ani žádný větší celek (jak udělat TDM, jak na anketu apod.), sekce je pouze pro věci týkající se Pawn; 3. Návod musí být v souladu s šablonou pro psaní návodů. Každý návod v této sekci musí projít schválením, když nebude splňovat bod 1 nebo 2, bude přesunut do sekce "Ostatní návody". V případě, že by nesplňoval bod 3, by jej uživatel musel nejprve upravit tak, aby byl v souladu s šablonou (není nutné to moderátorům znesnadňovat tím, že se to nebude dodržovat). Jak přesně to má pomoct? Zkušení pawneři mohou žadatelům o pomoc poslat odkaz na tuto sekci, pokud daný člověk nebude mít elementární znalosti Pawn. Závěrem Doufám, že se to osvědčí, udělat pořádek v celé sekci "Návody" si myslím je utopická myšlenka, takže tohle je (by mohla být?) ta zlatá střední cesta.
  2. 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ý
  3. YSI4 ODPOČET #1 ***** Je celkem škoda, že je tu celé subfórum, ale prázdné. Tak mě napadlo toho využít. Hledal jsem chvilku nějaký odpočet bez použití YSI. Jelikož vEnd neumí pochopit pojem ukázka, tak jsem našel něcí starší odpočet na ewolutions(ewolutions.cz/topic/1661): Jak si můžete všimnout je tam použité dcmd(my god). Teď si to zkusíme vytvořit ve YSI knihovně. Začneme s tím, že si rozmyslíme, co si nahrajeme: y_commands - pro lepší, efektivnější práci s příkazama, včetně parametrů. y_timers - pro lepší a efektivnější práci s timerama. y_va - pro práci s již formátovanými fcemi nebo efektivnější spracovávání vlastních form. fcí. Potřebné includy z knihovny máme nahrané a tak můžeme pokračovat. Nejdříve si deklarujeme dvě proměnné. Jedna bude pro podmínku, jestliže běží nějaký odpočet a druhá bude na čas do konce odpočtu: new iOdpocet, bool:bOdpocet; Pokud to někteří z vás nezvládají tento krok, tak se YSI ani neučte. Děkuji za pochopení. Všimněte si, že máme jednu proměnnout deklarovanou jako integer a druhou jako boolen. Nyní si vložíme (zjednodušeně) příkaz. Můžeme si zvolit jaký chceme, tak například obyčejný odpocet: YCMD:odpocet(playerid, params[], help) { Oprávnění si bude moct každý přidat zvlášť podle svých potřeb nebo podle svého uvážení. Upozornění: Nemusíme vůbec přidávat preprocesor #pragma unused (přesněji na to samotné help, které vrací true v případě, že hráč zadá to, co má nastavené (například otazník)), jak velká většina lidí praktikuje. Je to naprosto zbytečně. Ale zpět k návodu, kde budeme pokračovat tím, že si přidáme nejlépe tři podmínky a k nim budeme vracet zprávy. První, jestliže zadal parametry správně: if (!strlen(params)) return SendClientMessage(playerid, -1, "< Chyba > Použití příkazu: /odpocet [5-60]"); Následně, jestliže ten čas, co zadal je správně v rozmezí 5-60 sekund: if (strval(params) < 5 || strval(params) > 60) return SendClientMessage(playerid, -1, "< Chyba > Použití příkazu: /odpocet [5-60]"); A na konec, jestliže už neběží nějaký odpočet: if (bOdpocet) return SendClientMessage(playerid, -1, "< Chyba > Odpočet již běží !"); Když máme podmínky za sebou následuje samotný odpočet. Nejdříve si jednou spustíme timer, defer tOdpocet(); Můžeme ho místo místo jednostranného spouštění pomocí defer ho opakovat pomocí repeat, ale to bychom ho pak musely zastavit, což je už trochu složitější, a není to tak jednoduché, jak to zní. Pak už jen přiřadíme hodnoty, a to tak, že bOdpocet přiřadíme true, jelikož odpočet bude běžet, tak aby se nezačal hned další a iOdpocet abychom věděli, kolik zbývá do konce: bOdpocet = true; iOdpocet = strval(params); return (true); /* A zakončíme návratovou hodnotou */ } Teď ke spracování samotného timeru. Ale není čeho se obávat. I to je velice jednoduché. Tak přidámi fci timeru: timer tOdpocet[1000]() { Slovo timer je poznámka pro compiler, že je o fci pro timer. Číslo se závorkou [1000] je počet milisekund, kdy se spustí timer (tedy, kdy začne "působit" kód uvnitř bloku), a závorky () je pro parametry, které voláme(přidáváme) spolu se spouštěním času (defer, repeat...). Pak si přidáme podmínku, jestli naše proměnná ještě nedosáhla hodnoty 0: if (iOdpocet != 0) { Uvitř bloku dáme, že se odešle již formátovaná zpráva GM pro všechny hráče se odpočtem: va_GameTextForAll("~r~%i", 1000, 3, iOdpocet); Všimněte si, že tady ve fci dostazujeme za specifikátory až ke konci. A nakonec znovu spustíme jednou timer, protože, kdybychom ho spustili jenom v příkaze, objeví se jenom číslo a konec: defer tOdpocet(); Ale nesmíme zapomenout, pokud tu podmínku splňuje, aka pokud ta hodnota je už rovna 0: }else{ Tak určitě se napíše zpráva START: GameTextForAll("~r~START", 3000, 3); A dokončíme tím, že zase přiřadáme proměnné bOdpocet hodnotu false, jinak by nám náš příkaz odpocet už další odpočet nepovolil: bOdpocet = false; } } Toť vše. Celý kód pro shlédnutí zde: 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ý
×
×
  • Create New...