Jump to content

Search the Community

Showing results for tags 'tutorial'.

  • 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

  1. Ahoj, videl som tému o návrhu EU o jednotné konektory. Z príspevkov v téme som nabral dojem, že ľudia sa tu rozdelujú do dvoch skupín: Ekologický postoj --- som zodpovedný/plánujem mať deti a nechcem im zhoršovať zbytočne život/nuclear is clean Ekonomický postoj --- nekúpim si predražené bambusové čistítka uší keď plastové sú funkčne identické a lacnejšie/elektro autá sú zlé, lebo A,B,C,D,.../nuclear is danger V tomto príspevku sa pokúsim vysvetliť dôvod existencie týchto dvoch postojov. Fakty Je rozumné, aby si každý pred zapojením sa do konverzácie overil svoje fakty. Ľudia patriaci do skupiny proti ekológii majú z mojich skúseností tendenciu šíriť hoaxy, a zakladať svoje postoje na nepravdivých informáciách. Z môjho pohľadu je to pochopiteľné. Najčastejšie hoaxy, s ktorými som sa stretol: Elektromobily sú menej ekologické než benziňáky --- hoax[1] Rozvojové krajiny (Čína, ...) spôsobujú a sú zodpovedné za viac emisí než rozvinuté krajiny --- hoax. Ľudia hlásajúci tento hoax si asi neuvedomujú, že žijeme v globálnej ekonomike. Preto je nutné emisie rozdeliť na produkčné a spotrebiteľské, pretože niektoré krajiny vytvárajú viac jeden typ ako druhý. Produkčné emisie v Číne sú dané výrobou tovaru, ktorý je spotrebovávaný v EU. Tento spôsob myslenia sa nazýva aj trade-adjusted emissions accounting. Zaujímavé je, že priemerný občan Českej republiky vytvorí viac CO2 emisií než priemerný Číňan --- aj v produkčných aj spotrebných emisiách.[2] To bolo teda o spôsobovaní emisií. Ja som ale presvedčený, že EU nesie vyššiu subjektívnu zodpovednosť za emisie, keďže má schopnosti tieto emisie obmedzovať. Rozoberanie problému dezinformovanosti si nechám na iný deň... Ekologický postoj Je založený na vnímaní sveta a zdrojov ako obmedzených kapacít. Postoj sa začal šíriť hlavne s publikáciou Limits to growth.[3] Práve táto kniha spopularizovala fakt, že zdroje sú obmedzené. V našej spoločnosti sa produkty vyrábajú a spotrebovávajú, ako by ich bolo nekonečno. Zaujimavým vhľadom je, že hodnotenie úspechu krajín na základe HDP je hodnotenie na základe produkcie. Vo svete, kde sa predbieha o množstvo produkcie (=> množstvo spotrebovaných surovín) je jasný konvergentný stav kde sa spotrebujú všetky suroviny. Krátkodobo-ekonomický postoj Prakticky vždy je menej-ekologický výrobok lacnejší než viac-ekologický výrobok. To preto, že výroba ekologického produktu zahŕňa aj činnosti, ktoré nesúvisia priamo s produktom, ale aj so starostlivosťou o životné prostredie počas výroby produktu. Je ekonomicky rozumné a správne kúpiť si neekologický produkt. Toto predurčuje ekológiu iba pre krajiny s vysokou životnou úrovňou a prenáša zodpovednosť za ekologické problémy do týchto krajín. Vysvetlenie klimatickej krízy --- Prisoner's dilemma Predpokladám, že viete čo je to Väzňovo dilema. Ak nie, prosím prečítajte si Klasické prisoner dilemma na wiki.[4] Nemá zmysel aby som to prepisoval. V stručnosti, jedná sa o situáciu, v ktorej sa oplatí každému zúčastnenému uprednostniť čin vo svoj prospech. Keď však všetci jednotlivci vykonajú tento čin, všetci skončia s horším výsledkom, než keby jednotlivo nevolili vo svoj prospech. Multi-player prisoners dilemma je situácia, ktorá modeluje problém ekológie a spotreby. V takomto modeli viac hráčov vykonáva rozhodnutia, pričom dominantná stratégia každého hráča je uprednostniť svoj prospech a tým aj zhoršenie situácie všetkým vrátane jeho samotného. Tento jav sa často nazýva aj Tragedy of the commons. Wiki uvádza aj ďalšie prípady, ktoré sú prejavom tohto javu. Riešenie Je jasné, že kapitalistický systém by bez regulácie spôsobil zánik ľudského života tak, ako ho poznáme. Ako riešenie ekonómovia navrhujú štátne regulácie trhu. Jedným z návrhov je CO2 daň, ktorú by mal platiť každý producent CO2. V roku 2018 bola za toto udelená Nobelova cena z ekonómie.[5] Aj preto vnímam zmysluplné zavádzanie EU regulácií napr. o kábloch za správne. Záver Dúfam, že pochopenie situácie s ekológiou umožní každej skupine --- aj ekológom, aj ich odporcom --- porozumieť druhej skupine a pracovať na riešení v prospech všetkých ľudí. Ďakujem za pozornosť.
  2. Obtížnost: Osnova: 1. Úvod, co je to proměnná 2. Deklarace (vytvoření) proměnné 3. Přiřazování hodnot 4. Datové typy (tagy) 5. Lokální a globální proměnná 6. Závěr 1. Úvod Zdravím Vás, tohle je první ze série návodů věnujících se základům jazyka Pawn. Cílem těchto návodů je seznámit Vás se strukturami tohoto jazyka, s jeho syntaxí a s jeho využitím v praxi. Tento návod se bude věnovat proměnné. Co je to proměnná? Pod pojmem proměnná si můžeme představit nějaké místo v paměti, které má svůj název a do kterého si pro naše potřeby ukládáme hodnoty. Všichni proměnné už známe, a to z matematiky – zde proměnné jako x a y používáme nepřetržitě. A funguje to i podobně – v matematice za ně můžeme dosazovat různé hodnoty, v programování do nich také ukládáme různé hodnoty. 2. Deklarace (vytvoření) proměnné Prvním naším krokem bude deklarace proměnné. Když mluvíme o deklaraci proměnné, máme na mysli, víceméně, její vytvoření. To provedeme následovně: . new id; . Pomocí slova new deklarujeme nové proměnné. Jinak to nejde, jazyk to od nás vyžaduje. id je název (identifikátor) naší nové proměnné. V názvu můžeme používat standardní písmena (A až Z, a až z), číslice (0 až 9) a podtržítko (_). Název bychom měli volit tak, aby odpovídal tomu, k čemu budeme proměnnou potřebovat (např. penize – pro ukládání peněz apod.) Středníkem (;) deklaraci ukončíme. Jazyku tak sdělíme fakt, že jsme s tímto příkazem (s deklarací proměnné) skončili. Takhle to funguje i u jiných příkazů, ne jenom u deklarací. Pokud potřebujeme deklarovat více proměnných najednou, je to možné provést tak, že jednotlivé názvy oddělíme čárkou, takhle: . new id, penize, score; . Takto jsme vytvořili 3 proměnné naráz. 3. Přiřazování hodnot Teď už víme, jak proměnnou vytvořit. Jak do ní ale uložím hodnotu? To udělám pomocí operátoru rovnítko / rovná se (=). . id = 5; . Na levé straně (tzv. lvalue) máme proměnnou, do které chceme ukládat, poté následuje rovnítko, které nám určí, že do proměnné ukládáme hodnotu, a nakonec přichází samotná hodnota (tzv. rvalue). Hodnotou může být číslo, ale také jiná proměnná nebo výraz. Stejně jako deklaraci, tak i tento příkaz zakončíme středníkem. Ono středníkem budeme ukončovat téměř všechno, ale to brzy samo vyjde najevo. Pokud bychom chtěli přiřadit hodnotu už při deklaraci, tak i to nám Pawn dovoluje: . new id = 7; new id = 1, penize = 5000, score = -100; //znak mínus (-) před hodnotou nám značí zápornou hodnotu . Pro zajímavost (rozklikněte spoiler): 4. Datové typy (tagy) Už umíme proměnnou vytvořit a přiřadit jí hodnotu. Teď si musíme říct něco o datových typech. Datový typ nám určuje, jaké hodnoty můžeme do proměnné uložit. Může se jednat o běžná celá čísla (ty jsme používali do teď), ale pak také můžeme ukládat čísla s desetinnou čárkou, různé texty, znaky apod. Čím se nám to bude lišit, když budeme chtít do proměnné uložit např. číslo s desetinnou čárkou? Bude se to lišit způsobem deklarace. Vyjmenujme si všechny běžné datové typy a způsob, kterým je budeme deklarovat. a) Celá čísla (7, 666, -5, -114 apod.) new cela_cisla; //deklarujeme tak, jak jsme se před chvílí naučili cela_cisla = 7; . b ) Reálná čísla – čísla s desetinnou čárkou (3.14159, 10.254, -177.8, -23.23 apod.) new Float:realna_cisla; //před název proměnné jsme přidali tzv. tag, a to tag "Float:" realna_cisla = 3.14159; //tečka (.) nám v programování představuje desetinnou čárku . c) Logické hodnoty (true a false) Logické hodnoty máme jen dvě, a to pravda (true) a nepravda (false). . new bool:logicke_hodnoty; //doplníme tag "bool:" logicke_hodnoty = true; . d) Znaky Znakem může být cokoliv, co najdete na klávesnici – písmeno, číslice, vykřičník, pomlčka atd. Deklarace se neliší od celých čísel, ale ukládání ano! . new znak; //stejné jako u celých čísel znak = 'a'; //ukládaný znak musíme vložit mezi apostrofy (') . e) Řetězec/string ("abcd1234?!", "jak se máš?", "jsem programátor" apod.) Řetězec není nic jiného než posloupnost několika znaků. Jsou to slova, věty, hesla, vše, co nás napadne. Liší se deklarací i ukládáním! . new retezec[10+1]; //v hranatých závorkách [] udáváme délku řetězce, to je ta 10, a navíc přičteme ještě jedničku kvůli potřebám jazyka Pawn retezec = "abcd1234?!"; //ukládaný řetězec znaků musíme vložit mezi uvozovky (") . Pro zajímavost (rozklikněte spoiler): Těch tagů je omnoho více, ale když teď známe jejich princip, nebude těžké se vypořádat ani s těmi ostatními. 5. Lokální a globální proměnná Proměnná se dělí na dva typy podle toho, kde ji deklarujete. Globální proměnná se nejčastěji deklaruje nahoře ve scriptu, těsně pod #include a #define. S touto proměnnou můžete pracovat všude ve scriptu. Oproti tomu lokální proměnná se deklaruje v určitém bloku (bloky nám určují složené závorky { }) a má platnost pouze v něm a v podřazených blocích. Názorná ukázka: . public OnPlayerConnect(playerid) { if(playerid == 0) { new id; id = 5; //bude fungovat, tohle je stejný blok, kde je deklarace if(IsPlayerInAnyVehicle(playerid)) { id = 0; //bude fungovat, tohle je podřazený blok } } id = 7; //nebude fungovat, zahlásí nám to chybu, protože tohle už je nadřazený blok } . 6. Závěr A takhle jsme došli ke konci návodu o proměnné. Dnes jsme se dozvěděli, co je to proměnná, k čemu slouží, jak do ní ukládat hodnoty a výrazy, jaké hodnoty do ní lze ukládat a jak ji rozdělujeme dle platnosti. Navíc jsme si také ukázali, jak psát do kódu komentáře, to jsou ty poznámky, které jsme uvedli za znaky // (dvě lomítka). Za ně si lze psát své vlastní poznatky, připomínky atd. Ještě jednou říkám, že tento návod slouží pro úplné začátečníky, pokročilejší věci byly buďto úplně vynechány, nebo jsou uvedeny ve spoilerech. Přesto, zdá-li se Vám, že jsem něco opomněl, někde jsem se spletl nebo se jen chcete vyjádřit, pište do tohoto tématu. Ověřený návod Tento návod prošel validací, a lze ho proto považovat za ověřený.
  3. Obtížnost: Osnova: 1. Úvod, co je to switch 2. Kdy a jak použít switch 3. Další možnosti case 4. Ukázky použití 5. Závěr 1. Úvod Zdravím Vás u sedmého návodu pro začínající pawnery. Tímto navážeme na minulý návod (přečtěte si ho) a rozebereme si, k čemu slouží switch a kdy jej použít namísto normálních podmínek. Napřed ale co je to ten switch. Switch (česky přepínač) je struktura, která v konkrétním případě nahrazuje soustavu if – else if – else. Jeho účelem je vykonat ten blok, který odpovídá jeho hodnotě. Proto také přepínač, obecně se dá říct, že přepne na blok dané hodnoty. 2. Kdy a jak použít switch Už jsem řekl, že se používá v konkrétním případě. Tím případem je tato soustava podmínek: . new cislo = 2; if(cislo == 1) { //hodnota je 1 } else if(cislo == 2) { //hodnota je 2 } else if(cislo == 3) { //hodnota je 3 } else { //hodnota je jiná } . Pokud v podmínkách porovnáváme takto hodnoty, lze k tomu použít kratší a přehlednější switch. Syntaxe switche je následovná: . switch(cislo) { case 1: { //hodnota je 1 } case 2: { //hodnota je 2 } case 3: { //hodnota je 3 } default: { //hodnota je jiná } } . Do závorek switche jsme dosadili proměnnou, ze které zjišťuje hodnotu. case je klíčové slovo, které nám zde tvoří větev pro konkrétní hodnotu. Jak je vidět, nahrazuje nám else if a podmínku. Na jedno si musíme dát pozor – je potřeba za case a hodnotu uvést dvojtečku. default je bez hodnoty a plní funkci else – provede se vždy, když hodnota neodpovídá žádnému case. Narozdíl od case ale není nutné jej použít. 3. Další možnosti case Switch dokáže pracovat jak s celými čísly, tak se znaky a desetinnými čísly. . case 1: //zápis pro celé číslo case 'a': //zápis pro znak case 3.14: //zápis pro desetinné číslo . Jazyk nám též umožňuje zapsat v jednom case několik hodnot, když je to třeba, stačí je oddělit čárkou. . case 1, 3, 5: //několika celých čísel case 'a', 'b', 'c': //několik znaků case 3.14, 1.4, 8.2: //několik desetinných čísel (tečka je desetinná čárka) . Pro zajímavost (rozklikněte spoiler): . 4. Ukázky použití Před koncem si ještě ukážeme pár příkladů, jak switch používat. Dialogy . Kombinovaný zápis . 5. Závěr Switchem jsme definitivně ukončili téma podmínek. Kromě if, else if a else teď znáte už i switch a víte, kdy a jak ho použít. Poslední varování na závěr: v jiných jazycích (C/C++, C#, Java, Javascript, PHP atd.) se blok case a default ukončuje klíčovým slovem break a neuvádějí se složené závorky. Pro Pawn to prostě neplatí, takže tuto syntaxi si nechte pro ostatní jazyky. Tento návod, stejně jako ty předchozí, je určen pro nováčky, pokročilejší věci byly buďto úplně vynechány, nebo jsou uvedeny ve spoilerech. Přesto, zdá-li se Vám, že jsem něco opomněl, někde jsem se spletl nebo se jen chcete vyjádřit, pište do tohoto tématu. Ověřený návod Tento návod prošel validací, a lze ho proto považovat za ověřený.
  4. Obtížnost: Osnova: 1. Úvod; 2. Charakteristika a vlastnosti jazyka; 3. Odlišnosti oproti jiným jazykům; 4. Užitečné odkazy; 5. Závěr. 1. Úvod Zdravím, po delší pauze jsem se rozhodl, že rozjedu nový seriál, tentokrát zaměřený na jazyk Python. Tento jazyk mě hodně baví a rád bych vás do něj trochu zasvětil. Třeba vás zaujme stejně jako mě. Předem bych chtěl varovat, že se nebude jednat o návody psané pro začátečníky s programováním, očekávám již nějakou programátorskou zkušenost. Nebudu dělat podrobné výklady té či oné části jazyka, budu uvádět jen důležité a věcné informace. Postupně projdu různá témata – základní konstrukce jazyka, práci s regulárními výrazy, objektově orientované programování, podpora funkcionálního programování v Pythonu a různé zajímavé možnosti jazyka. Většina návodů bude psána pro verzi 3 a vyšší. V případě, že se daná vlastnost/funkce jazyka vyskytuje od určité verze, budu se snažit tuto informaci uvést. K úvodním informacím by to bylo vše, v tomto návodu se podíváme na charakteristiku jazyka a poté si uvedeme rozdíly oproti jiným jazykům. 2. Charakteristika a vlastnosti jazyka Nerad bych nudil táhlou historií vývoje, takže zmíním jen dva zajímavé fakty – Python se vyvíjí již od konce 80. let minulého století a jeho autorem je nizozemský programátor Guido van Rossum. Tímto máme historii pokrytou. Nebolelo to, že? Každý programovací jazyk má svou charakteristiku. Je-li řeč o Pythonu, jako první zmíním, že se jedná o víceúčelový vysokoúrovňový skriptovací jazyk. Co je vysokoúrovňový jazyk vysvětlovat nebudu (hodně zjednodušeně – není to C ani assembler), stejně tak to bude s pojmem skriptovací (to si můžete vygooglit ). Co bych ale rád rozebral je všestrannost Pythonu. Python totiž nemá jedno konkrétní zaměření. Lze si v něm vytvořit okenní aplikaci (PyQT, tkinter), stejně tak i testovací skripty ke studentským projektům (vysokoškoláci pochopí). Uplatnění má i při vývoji webových stránek a her. Pokročilí programátoři jej využívají i pro strojové učení. Python můžete zkrátka využít (či zneužít) ke všem možným, nemožným, legálním i nelegálním programátorským nápadům. Nyní se zaměřme na jeho konkrétní vlastnosti, které bychom měli znát. Dobré je vědět, že je multiplatformní. Pro ty, kdo se s tím slovem nikdy nesetkali – Python skripty vám budou fungovat i jinde než na Windows (na Linuxu, Mac OS X i dalších). Abychom tyto ale skripty mohli vůbec spustit, budeme potřebovat interpret (ke stažení zde). V tuto chvíli bych měl asi říct, že je to tedy interpretovaný jazyk; to je taky z části pravda. Bez interpretu se neobejdeme, nicméně Python při spuštění skriptu generuje soubory, tzv. bytecode, jež jsou poté interpretovány. Proto bude lepší říct, že Python využívá to nejlepší z obou světů, tedy kompilace i interpretace. Z programovacího hlediska by nás mohlo zajímat, že Python nevyžaduje deklaraci proměnných a využívá tzv. dynamického typování, což znamená, že nejenže nemusíme deklarovat, ale také nebudeme pevně určovat datový typ. Zkrátka si do proměnných uložíme, co se nám zrovna bude hodit. S datovými typy také souvisí silná typová kontrola. Tím vám chci naznačit, abyste hned zapomněli na veškerou černou magii z Javascriptu ("1" + 2 - "3" + "4" == "94") a podobných jazyků. V Pythonu nelze sčítat či odčítat řetězce s čísly a podobně. Často vyzdvihovanou vlastností Pythonu je také to, že podporuje více paradigmat. Pokud jste se teď zhrozili při slově paradigma, nebojte se, nejde o nic strašného. Programovací paradigma si představte jako způsob řešení a zápisu dané úlohy. Existuje hodně paradigmat – procedurální (Pawn), objektově orientované (Java), logické (Prolog), funkcionální (Haskell)... Některé spolu souvisejí, některé jsou nadřazené jiným, další jsou přesným opakem jiných. Nebudu vám v tom dělat guláš, pro zájemce je tu třeba tento článek. A co tedy Python z toho všeho umožňuje? Úlohy v Pythonu lze řešit procedurálně, ale máme možnost využít i objektově orientované programování; do jisté míry umožňuje Python i funkcionální programování (o tom třeba později). 3. Odlišnosti oproti jiným jazykům Teď už víme o základních vlastnostech Pythonu. V této druhé části návodu se podíváme na rozdíly oproti jiným známým jazykům. Žádné středníky Na konci příkazů a výrazů se, na rozdíl od jazyků jako C, Java či PHP, nepíše středník: // kód v C int n = 5; printf("Proměnná 'n' má hodnotu %i", n); # kód v Pythonu n = 5 print("Proměnná 'n' má hodnotu", n) Odsazení namísto složených závorek Většina jazyků se syntaxí jazyka C (C/C++, C#, Java, PHP, Pawn atd.) využívá ke tvorbě bloků složené závorky. V Pythonu se bloky tvoří dvojtečkou za příkazem (if, else, for, while...) a odsazením (běžně 4 mezery): // kód v C if(promenna < 1) { printf("Hodnota proměnné je menší než 1."); return 1; } # kód v Pythonu if promenna < 1: print("Hodnota proměnné je menší než 1.") return 1 and, or, not Logické operátory se nejčastěji zapisují jako && (and), || (or) a ! (not). V Pythonu se tyto operátory zapisují and, or a not: // kód v C if(promenna1 && promenna2 || !promenna1 && !promenna2) # kód v Pythonu if promenna1 and promenna2 or not promenna1 and not promenna2: Pozměněné názvy příkazů Tohle nebude žádná raketová věda, jen se tu a tam změnilo písmenko či slovíčko. Příklad 1: Namísto else if se píše elif. Příklad 2: Namísto catch u zachytávání výjimek máme except. Příklad 3: Poznámky se píší za mřížku #, ne za dvě lomítka //. Příklad 4: Zkuste najít. Chybějící struktury a operátory Ačkoliv vás to asi překvapí, v Pythonu neexistují jisté struktury a operátory, které jsou v ostatních jazycích běžné. Jedná se o struktury switch, do-while a operátory ++ a --. Není to ale nic, co by nešlo nahradit jiným kódem: # kód v Pythonu # náhrada switche if promenna == 1: print("Je to jedna") elif promenna == 2: print("Je to dva") else: print("Je to Bůh ví co") promenna += 1 # náhrada ++ Ternární operátor ?: Mnozí z vás používají ternární operátor ?: pro tvorbu "inline podmínek". Ani tento operátor v Pythonu není, místo něj je tu konstrukce if-else: // kód v C promenna = 1 < 2 ? 1 : 0; // podmínka ? pravda : nepravda # kód v Pythonu promenna = 1 if 1 < 2 else 0 # pravda if podmínka else nepravda Funguje úplně stejně (podmínky lze řetězit), jen se změnilo pořadí operandů. 4. Užitečné odkazy Zde máte několik užitečných odkazů, mimo jiné odkaz na stažení interpretu Pythonu, bez kterého jeho skripty nespustíte: • stažení interpretu Pythonu; • oficiální dokumentace Pythonu; • oficiální dokumentace Pythonu (pro starší verzi 2.7); • kurz Pythonu na Codeacademy; • vývojové prostředí PyCharm (od JetBrains). 5. Závěr A tím pro dnešek končím. Tento text byl jen lehkým úvodem do Pythonu, měli jsme možnost oťukat si trochu jeho syntaxi a uvést jeho vlastnosti. V příštím návodu se budeme věnovat konstrukcím v Pythonu. Pokud jste narazili na nějakou chybu, nějaký překlep nebo se chcete na něco zeptat, případně mi napsat jen tak, jen do toho.
  5. Obtížnost: Osnova: 1. Úvod 2. Relační operátory 3. Logické operátory 4. Přiřazovací operátory 5. Bitové operátory 6. Priorita operátorů 7. Závěr 1. Úvod Vítám Vás u pátého návodu pro začínající pawnery. Téma se týká dalších druhů operátorů a navazuje na předchozí návod o operátorech. Abyste tento návod pochopili, přečtěte si nejprve ten předchozí. 2. Relační operátory Úkolem relačních operátorů je porovnávat operandy (vrací pravdu, nebo nepravdu). S nimi se zpravidla setkáme v podmínkách. Jedná se o operátory rovnosti, nerovnosti, větší/menší a větší/menší nebo rovno. . new cislo = 5, cislo2 = 10; cislo == cislo2 //dvě rovnítka porovnají, zda jsou čísla stejná (výsledek je false, 5 a 10 nejsou stejná) cislo != cislo2 //vykřičník a rovnítko zjistí, zda se čísla různí (výsledek je true, 5 a 10 jsou různá) cislo > cislo2 //znak pro "větší" zjistí, zda je číslo vlevo větší než to vpravo (výsledek je false, 5 není větší než 10) cislo < cislo2 //znak pro "menší" zjistí, zda je číslo vlevo menší než to vpravo (výsledek je true, 5 je menší než 10) cislo >= cislo2 //znak pro "větší nebo rovno" zjistí, zda je číslo vlevo větší nebo rovno tomu vpravo (výsledek je false, 5 není větší ani rovno 10) cislo <= cislo2 //znak pro "menší nebo rovno" zjistí, zda je číslo vlevo menší nebo rovno tomu vpravo (výsledek je true, 5 není rovno 10, ale je menší) . Všechno to jsou binární operátory. Doufám, že není třeba si je blíže vysvětlovat, princip je stejný jako v matematice, stačí nám znalosti základní školy. Zajímavost: 3. Logické operátory Pomocí logických operátorů tvoříme složitější podmínky. Stejně jako relační, tak i tyto operátory vrací buď pravdu, nebo nepravdu. Logickými operacemi jsou logický součin, logický součet a logická negace. a) Logický součin Logický součin je binární operace a značí se dvěma ampersandy (&&). Výsledek této operace je pravdivý, právě když jsou oba výrazy pravdivé. . new cislo = 5, cislo2 = 10, cislo3 = 15; cislo < cislo2 && cislo2 > cislo3 //výsledek je false . Prvním výrazem je "cislo ". Ten je pravdivý, 5 je menší než 10. Druhým výrazem je "cislo2 > cislo3". To pravda není, 10 není větší než 15. Jeden z výrazů je nepravdivý, proto je celá podmínka nepravdivá. b ) Logický součet Logický součet je binární operace a značí se dvěma svislicemi (||). Výsledek této operace je pravdivý, když alespoň jeden výraz je pravdivý. . cislo < cislo2 || cislo2 > cislo3 //výsledek je true . Vraťme se k předchozímu příkladu. Už víme, že první výraz je pravdivý a druhý nepravdivý. Poněvadž se teď jedná o logický součet, tak celá podmínka bude pravdivá – stačí jen jeden pravdivý výraz. Při složitějších podmínkách si nemusíme být jisti tím, jak ji jazyk vyhodnotí. Proto nám Pawn umožňuje i v tomto případě použít kulaté závorky k určení priority vyhodnocení. . (cislo < cislo2 && cislo2 > cislo3) || (cislo3 > cislo && cislo3 >= cislo2) . Teď jsme si jistí, že se napřed vykoná logický součin a až poté logický součet. c) Logická negace Logická negace je unární operace a značí se vykřičníkem (!). Účelem této operace je převrátit pravdu v nepravdu a naopak. . new bool:logicka = true; !logicka //hodnota bude false . Počáteční hodnota proměnné logicka je true. Po znegování bude hodnota převrácená – false. 4. Přiřazovací operátory Operátor přiřazení již známe – rovnítko. Probrali jsme jej v předchozích návodech, takže teď si ho jen rychle zopakujeme. Na levé straně je proměnná/pole, do které(ho) přiřazujeme, a na pravé straně hodnota nebo výraz, který přiřazujeme. . new cislo = 5; //přiřazení celého čísla new desetinne = 3.14; //přiřazení desetinného čísla new znak = 'o'; //přiřazení znaku new retezec[] = "ahoj"; //přiřazení řetězce new pole[] = {1, 3, 6}; //přiřazení hodnot poli . Pro zajímavost (rozklikněte spoiler): . 5. Bitové operátory Bitové operátory manipulují s bity. Tato problematika zdaleka přesahuje znalosti potřebné pro nováčky, proto ji zde uvádět nebudu. Nicméně, pokud se přeci jen chcete o manipulaci s bity něco dozvědět, přečtěte si tento návod, kde se tomu Mort podrobně věnuje. 6. Priorita operátorů Už jsme si zmínili, že prioritu operátorů můžeme ovlivnit kulatými závorkami jako v matematice, ale jaká je vlastně výchozí priorita operátorů? Na to se lze podívat do spoileru. Je to jen pro zajímavost, nic, bez čeho bychom se neobešli. . 7. Závěr A tímto končí druhý návod věnující se operátorům. Nyní už víte to potřebné o operátorech. Samozřejmě jich existuje mnoho, neuvedl jsem všechny (čárka, dvojtečka i všechny druhy závorek jsou také operátory), ale to už jsou drobnosti, které v praxi sami pochytíte. Tento návod, stejně jako ten předchozí, je určen pro nováčky, pokročilejší věci byly buďto úplně vynechány, nebo jsou uvedeny ve spoilerech. Přesto, zdá-li se Vám, že jsem něco opomněl, někde jsem se spletl nebo se jen chcete vyjádřit, pište do tohoto tématu. Ověřený návod Tento návod prošel validací, a lze ho proto považovat za ověřený.
  6. Hookovanie funkcií a callbackov Obsah Čo je to hookovanie Princíp hookovania a preprocesor _ALS_ - Advanced Library System Hookovanie funkcií Hookovanie callbackov Zhrnutie 1. Čo je to hookovanie Predstavte si gamemod v Pawn ako reťaz, kde každý krúžok predstavuje jednu funkciu (stock). Tieto krúžky sú pospájané, pretože jedna funkcia (stock) volá druhú a tá ďalšiu, atď. Dobrý, čitateľný kód je rozdelený do mnoho súborov, includov. Nanešťastie, každý callback môže byť definovaný iba raz, čo bráni efektívnemu rozdeleniu kódu. Tento problém rieši hookovanie, ktoré si možno predstaviť tak, že reťaz (gamemode) sa v niektorom krúžku rozdelí, pridá sa tam kód, ktorý chceme hooknuť a naspäť sa spojí, bez toho aby to akokoľvek ovplyvnilo zvyšok reťaze. To umožňuje použiť jeden callback aj viackrát v jednom súbore (prípadne v includoch). 2. Princíp hookovania a preprocesor Je treba povedať, že Pawn kompiler nefunguje (ani nemá prečo fungovať) tak ako Cčkový, alebo iný. Povedzme, že chceme upraviť (hooknuť) funkciu GivePlayerMoney() tak, že vždy keď je zavolaná, dá hráčovi dvojnásobok peňazí. Samozrejme bez toho, aby sme ovplyvnili nejaký už-existujúci kód. stock GivePlayerMoneyEx(playerid, money) { // definujeme vlastnu funkciu return GivePlayerMoney(playerid, money * 2); // v nej zavolame tu povodnu } #define GivePlayerMoney GivePlayerMoneyEx // predefinujeme tu povodnu Ďalšie použitie funkcie GivePlayerMoney() by už hráčovi dalo dvojnásobok peňazí. Štvrtý riadok spôsobí, že každé nasledujúce volanie GivePlayerMoney() preprocesor nahradí za GivePlayerMoneyEx(), teda za náš hook. Kompiler nehodí error/warning v prípade, že predefinujete už-existujúcu funkciu/callback. Na pochopenie princípu hookovania je treba vedieť ako funguje preprocesor Pawn. Stačí vedieť, že prebieha vo viacerých krokoch. V prvom kroku prebehne daný súbor, ktorý má spracovať. Skontroluje v ňom makrá a podmienky preprocesora a vyhodnotí ich. Súčasne si zapamätá ktoré funkcie (stocky, publicy) existujú, pridá si ich do medzipamäte a súbor prebehne znovu (opäť vyhodnotí makrá a podmienky preprocesora). Toto správanie podporí aj nasledujúci kód. Pre vaše dobro si každý z tých kódov skompilujte. #if defined A #error Funkcia je definovana #endif stock A() { } Kompiler hodí error kvôli tomu, že funkcia "A" je definovaná, hoc až za makrom. Zaujímavý je však tento kód: #if !defined A // vsimnite si zmenu, negaciu podmienky #error Funkcia nie je definovana #endif stock A() { } Hodí error rovnako, ako kód predtým. Ako je to možné? Predsa ide o znegovanú podmienku. Nečítajte ďalej, ak na to chcete prísť sami. Druhý kód prebieha tak, že preprocesor prejde ku "#if !defined". Tam samozrejme zastaví, pretože doteraz symbol "A" nikde nenašiel. Prečo teda prvý kód tiež narazil na error? V prvom kóde, preprocesor prebehne ku #if defined. "A" definované nie je a teda ide ďalej, ku koncu súboru, medzitým "A" nájde a uloží si ho do zoznamu známych symbolov. V ďalšej iterácii však preprocesor znova dôjde k #if defined, "A"čko už pozná a preto hodí error. Musím ešte povedať, že toto som zistil experimentami, popravde neviem ako funguje ten preprocesor. Ak máte nejaké objasnenie, môžete napísať. 3. _ALS_ - Advanced Library System Ak ste niekedy videli hookovací kód, všimli ste si, že oproti môjmu príkladu s GivePlayerMoney(), tam bolo niečo navyše. Správny kód by mal vyzerať takto: stock GivePlayerMoneyEx(playerid, money) { GivePlayerMoney(playerid, money * 2); } #if defined _ALS_GivePlayerMoney #undef GivePlayerMoney #else #define _ALS_GivePlayerMoney #endif #define GivePlayerMoney GivePlayerMoneyEx Toto slúži na detekciu, či už bola daná funkcia hooknutá. Ak áno, kód by nefungoval a tiež vyhodil warning 201: redefinition of constant/macro (symbol "GivePlayerMoney") Predefinovanie stocku/callbacku warning nehodí, predefinovanie makra/define áno. Kúzlo s "_ALS_" ošetruje práve to, aby bolo možné skombinovať viac hookov. Syntax "_ALS_" je akýsi neoficiálny štandard. Používajú to všetci a tým sa zaručí kompatibilita hookov od rôznych autorov. 4. Hookovanie funkcií Hookovanie funkcií už bolo ukázané, ale dám ešte jeden príklad. // ak je hrac vo vozidle, portne aj vozidlo stock SetPlayerPosEx(playerid, Float:x, Float:y, Float:z, bool:vehicleToo=false) { if (vehicleToo) { if (IsPlayerInAnyVehicle(playerid)) return PortWithVehicle(playerid, x, y, z); else return SetPlayerPos(playerid, x, y, z); } else return SetPlayerPos(playerid, x, y, z); } #if defined _ALS_SetPlayerPos #undef SetPlayerPos #else #define _ALS_SetPlayerPos #endif #define SetPlayerPos SetPlayerPosEx ... public OnPlayerCommandText(playerid, cmdtext[]) { if (!strcmp("/portme", cmdtext)) SetPlayerPos(playerid, 1, 2, 3, true); else if (!strcmp("/oldport", cmdtext)) SetPlayerPos(playerid, 234, 46, 324); } 5. Hookovanie callbackov Hookovanie callbackov prebieha trochu ináč než funkcií. Aj keď kód je skoro rovnaký, na pozadí ide v podstate o opačný proces než u funkcií. public OnPlayerGiveDamage(playerid, damagedid, Float:amount, weaponid, bodypart) { // pouzijeme povodny callback if (IsPlayerAdmin(damagedid)) { // pridame vlastnu funkcionalitu Kick(playerid); } // zavolame nasledujuci hook #if defined MyOnPlayerGiveDamage // moze sa stat, ze neexistuje viac hookov, preto podmienka return CallLocalFunction("MyOnPlayerGiveDamage", "iifii", playerid, damagedid, amount, weaponid, bodypart); #else return 0; // v callbackoch su dolezite spravne return hodnoty #endif } #if defined _ALS_OnPlayerGiveDamage #undef OnPlayerGiveDamage #else #define _ALS_OnPlayerGiveDamage #endif #define OnPlayerGiveDamage MyOnPlayerGiveDamage // premenovanie nasledujuceho callbacku #if defined MyOnPlayerGiveDamage // samozrejme forward forward MyOnPlayerGiveDamage(playerid, damagedid, Float:amount, weaponid, bodypart); #endif V skripte použijeme ten pôvodný callback a "predefinujeme" tie nasledujúce. Syntax "MyOnPlayerGiveDamage" už nie je "štandardizovaná", môžete použiť aj iný názov. 6. Zhrnutie Pri hookovaní v podstate nejde o ten kód, ako o to pochopiť čo robí preprocesor na pozadí. Ak ste si všetky kódy pozreli a porozmýšlali nad nimi, mali by ste tomu rozumieť. Či do toho "vidíte skrz na skrz" si môžete skúsiť odpovedaním na tieto dve bonusové otázky: 1.) V prípade, že je 10 skriptov čo hookujú nejakú funkciu a môj skript ju hookol prvý, koľká v poradí sa vykoná funkcia z môjho skriptu? 2.) V prípade, že je 10 skriptov čo hookujú nejaký callback a môj skript ho hookol prvý, koľký v poradí sa vykoná callback z môjho skriptu? Ak máte otázky/vylepšenia, pokojne sem s nimi.
  7. Obtížnost: Osnova: 1. Úvod 2. Modifikátor(y) 3. const 4. public 5. static 6. stock 7. Závěr 1. Úvod Zdravím Vás u, tentokrát o něco náročnějšího, návodu z oblasti jazyka Pawn. Krátce jsem přerušil svou sérii návodů pro začátečníky a sepsal tento návod, který se týká modifikátorů funkcí a proměnných. Jde se na věc. 2. Modifikátor(y) Začněme s tím, oč vlastně jde. Modifikátor nám představuje nějaké klíčové slovo, které upravuje (modifikuje) vlastnosti funkce/proměnné. Mohou se uvádět samostatně, ale i v kombinaci s jinými modifikátory. V tomto návodu se zaměříme na 4 modifikátory, a to na const, public, static a stock. 3. const Jako první začneme s modifikátorem const. Jeho účel se dá domyslet, je to totiž zkratka pro constant (konstantní), ale aby to bylo jasné – jeho účelem je tvořit tzv. konstantní proměnné, popř. konstantní parametry funkcí. Ano, tento modifikátor se nedá použít u definice funkce. Jeden by si řekl, že pojem "konstantní proměnná" je blbost (vlastně je to oxymóron, ale literární teorii dáme zase jindy). Jak může být proměnná konstantní? No, světě div se, ale může. Takovéto proměnné (nebo poli/řetězci) lze určit hodnotu jen při deklaraci (aneb inicializace). Vypadá to následovně: . new const max = 10; //určili jsme konstantní proměnné "max" hodnotu 10 new const rankNames[3][20+1] = {"Hráč", "Moderátor", "Administrátor"}; //konstantní pole řetězců s názvy hodností . Po tomto už nebudeme moci nikde hodnotu proměnné/pole změnit, kompilátor by nám nahlásil chybu. new před modifikátorem lze vynechat, ale pouze u proměnných, pole/řetězce to vyžadují. Pak jsem také zmínil cosi jako konstantní parametr funkce. Aniž byste to věděli, už jste se s tím setkali, a to u řetězcových funkcí: . strlen(const string[]) //konstantní parametr "string[]" . Zpravidla to vídáme u řetězců, ale lze to aplikovat i na ostatní parametry. A co nám to způsobí? Způsobí to, že daný parametr bude jen pro čtení. To znamená, že ho nelze uvnitř funkce přepisovat. . MyPrint(const a, const { printf("a = %i\nb = %i", a, ; a++; //tento řádek by hodil chybu, "a" je jen pro čtení b = 0; //tento řádek by taky hodil chybu, i "b" je jen pro čtení } . 4. public Dosti zajímavým modifikátorem je public. Ačkoliv jej lze použít i na proměnnou, smysl to má jen u funkcí. S "veřejnými" funkcemi se nejčastěji setkáváme u SA:MP callbacků a časovačů. Na jakém principu ale tyto funkce pracují a co nám přinášejí? Funkce s modifikátorem public SA:MP server volá přímo, proto jsou v AMX souboru zapsány čitelně (narozdíl od běžných funkcí, které mají v AMX zapsány svou adresu). To s sebou přináší velkou výhodu – lze je volat ve všech scriptech i v módu. Když si tedy ve svém módu vytvořím veřejnou funkci, mohu ji zavolat ve scriptech, což mi normální funkce neumožňuje. K tomuto meziscriptovému volání slouží funkce CallRemoteFunction. Nutno ale dodat, že veřejné funkce mají také svá omezení. Ty jsou následující: – každá veřejná funkce musí mít svůj prototyp (klíčové slovo forward); – veřejné funkce nemohou mít parametry s výchozí hodnotou; – veřejné funkce nemohou vracet řetězce. Její využítí spočívá zejména v již zmíněném sdílení mezi scripty. Také ji musíme využít v případě časovačů (SetTimer, SetTimerEx) a SA:MP callbacků (OnPlayerConnect apod.). Definice veřejné funkce vypadá takto: . forward MyPrint(const a, const ; //prototyp veřejné funkce public MyPrint(const a, const //deklarace veřejné funkce { printf("a = %i\nb = %i", a, ; } . 5. static Třetím na řadě je modifikátor static. U tohoto klíčového slova je zajímavé to, že se jeho účel liší u lokální proměnné a u globální proměnné / funkce. U lokální proměnné nám static může nahradit globální proměnnou. Zachovává si totiž svou hodnotu i po ukončení bloku. Názorná ukázka: . MyFunc() { static a; a++; } for(new i; i<3; i++) //3x volám funkci "MyFunc" { MyFunc(); } . Kdybychom proměnnou "a" deklarovali pomocí new, hodnota by se pokaždé vynulovala, jakmile by funkce došla ke konci. Jenže statická proměnná "a" si svou hodnotu zachová i po dokončení funkce, takže její hodnota bude po třech zavoláních 3. Co se týče statické globální proměnné a statické funkce, jejich funkce je odlišná. Když takovou globální proměnnou / funkci deklarujeme, je platná pouze v daném souboru. Co to znamená? Řekněme, že máme knihovnu mylib.inc, kterou připojujeme ke scriptu myscript.pwn. . //mylib.inc new a = 5; MyFunc() print("Hello, world!"); //myscript.pwn #include <mylib> new a = 3; MyFunc() print("Ahoj, světě!"); . Tento kód nám zahlásí chybu, že symbol "a" a "MyFunc" již existuje. Proč? Protože nemůžeme mít stejné identifikátory v knihovně i ve scriptu. Pokud tedy nepoužijeme statickou globální proměnnou / funkci: . //mylib.inc static a = 5; static MyFunc() print("Hello, world!"); //myscript.pwn #include <mylib> new a = 3; MyFunc() print("Ahoj, světě!"); . Teď je vše v pořádku. Proč? Protože jsme v knihovně použili modifikátor static, čímž jsme jazyku sdělili, že tyto názvy jsou platné jen v té knihovně, ve scriptu už ne. Tohle je opravdu šikovná utilitka, která se při tvorbě knihoven hodí. 6. stock A teď se dostáváme k mému favoritovi – k modifikátoru stock. Nevím, proč se to tak ustálilo (asi nadměrným používáním), ale mnozí si ještě dodnes myslí, že stock je synonymum pro funkci. Není, lidi, NENÍ! Jako každý jiný, tak i modifikátor stock má své specifické využití. A toto využití lze aplikovat jak na funkce, tak na proměnné. V čem to tedy je? Když u proměnné/funkce použijeme stock, říkáme tím kompilátoru, aby nám nevyhazoval varování o tom, že funkci nikde nevoláme. Takže, když vytvořím stock proměnnou/funkci a nikde v kódu ji nepoužiji, nebude kompilátor hlásit varování "symbol is never used". To je vše, to je celé kouzlo tohoto modifikátoru. Pro úplnost ještě deklarace: . stock a = 3; //stock proměnná stock MyFunc() //stock funkce { print("Hello, world!"); } . 7. Závěr A tím se dostáváme ke konci. Doufám, že jsem Vás něčemu novému přiučil, o stock a static toho lidé většinou moc neví, tak teď mají možnost se to dozvědět dopodrobna. Jak už bylo zmíněno na začátku, modifikátory lze kombinovat, např. static v kombinaci s const lze najít v některých knihovnách (nejen) od Y_Lesse. Zdá-li se Vám, že jsem něco opomněl, někde jsem se spletl nebo se jen chcete vyjádřit, pište do tohoto tématu. Ověřený návod Tento návod prošel validací, a lze ho proto považovat za ověřený.
  8. Ahoj, koukám, že tu vznikla nová sekce, tak přidám moji serií tutoriálů na C#. Série obsahuje 45 dílů. Současně již nepokračuje, protože není nálada ani čas. Takže doufám, že to někomu pomůže aspoň do začátků a nedělal jsem to zbytečně. Takže ať se líbí Kompletní série je zde: (jednotlivé díly potom na pravé straně) https://www.youtube.com/watch?v=k2KqJEP05Z4&list=PL8428DD4872FA7FB3&index=1 Případné dotazy, cokoliv, kolem videí, C# můžete psát sem. Určitě se najdou tací, kteří dokáží zodpovědět dotazy ohledně tohodle téma
  9. Obtížnost: Osnova: 1. Úvod, co jsou to cykly 2. Cyklus for 3. Cyklus while 4. Cyklus do-while 5. Příkazy přeskoku (break a continue) 6. Závěr 1. Úvod Po dlouhé době Vás vítám u dalšího návodu pro začátečníky. Předmětem tohoto návodu bude iterace a cykly. Pojem iterace není nic jiného než opakování. Abychom v některých situacích (např. při procházení pole) nemuseli ručně psát zbytečně mnoho kódu se stejným účelem (např. výpis 50 prvků pole), můžeme si pomoct iterací, která nám kód zkrátí, zpřehlední a také nám ušetří práci. Iterace se v programování realizuje pomocí cyklů. Cyklus je konstrukce, která nám umožňuje vykonávat libovolný počet opakování. V pawn máme celkem 3 cykly; všechny si postupně projdeme a řekneme si, k čemu jaký cyklus slouží. 2. Cyklus for Prvním cyklus, se kterým se setkáváme nejčastěji, je cyklus for (tzv. iterační cyklus). Tento cyklus se neodmyslitelně pojí s polem – pomocí něj můžeme nejpohodlněji procházet hromadně prvky polí. Syntaxe cyklus for je následovná: . for(inicializace; podmínka; modifikace) { //kód } . V inicializační části (jak už název napovídá) deklarujeme/definujeme proměnnou (může jich být i víc), která bude ovlivňovat počet opakování a kterou můžeme využít např. k indexaci pole. Podmínková část obsahuje výraz, který nám určí, kdy cyklus skončí. Dost často obsahuje proměnnou z první části. Jakmile bude výraz v této části roven 0 (false), cyklus skončí. Modifikační část nám poslouží ke změně hodnoty proměnné cyklu. Zde můžeme ovlivnit průběh cyklu (kolikrát se zopakuje). . for(new i=0; i<10; ++i) { pole[i] = 1; } . Zde je praktická ukázka použití iteračního cyklu. V první části jsme deklarovali proměnnou i a přiřadili jí hodnotu 0. Ve druhé části jsme zvolili podmínku, která říká, že cyklus poběží tak dlouho, dokud bude hodnota i menší než 10. Ve třetí části jsme se postarali o to, že se hodnota i při každém opakování zvětší o jedno. Cyklus pojede 10x (i bude mít postupně hodnoty 0 až 9), tedy vše, co je uvnitř něj, se vykoná 10x. Cílem tohoto kódu je uložit do desetiprvkového pole hodnotu 1 (všimněte si, jak jsme šikovně využili proměnnou i jako index pole). Berme na vědomí, že jednotlivé části jsou odděleny středníky, ne čárkami! Pro zajímavost (rozklikněte spoiler): . 3. Cyklus while Další na řadě je while, též nazývaný jako cyklus s podmínkou na začátku. Ten název mu nedali jen tak z hecu – čtěte dále. Jeho syntaxe vypadá takto: . while(podmínka) { //kód } . Cyklus while má jen jednu část, a tou je podmínková. Ta nám určuje počet opakování – cyklus poběží, dokud bude podmínka pravdivá. Je dobré uvést, že tento cyklus nemusí proběhnout ani jednou. . new i = 0; while(i < 10) { pole[i] = 1; ++i; } . Jak vidíme, účel kódu je stejný jako v případě s iteračním cyklem. Může se nám zdát, že cyklus while vypadá jako ochuzená verze cyklu for; na jednu stranu to tak je (while se používal před for), chybí mu inicializační a modifikační část, ale cyklus s podmínkou na začátku může sloužit k různým účelům (např. ke čtení ze souboru), ne vždy zde budeme potřebovat proměnnou i. 4. Cyklus do-while Třetím bratříčkem je cyklus do-while, známý i jako cyklus s podmínkou na konci. Ano, od cyklu while se liší tím, že má podmínku na konci. Co to pro nás znamená? O tom za chvíli. Zde je jeho syntaxe: . do { //kód }while(podmínka); . I tento cyklus má jen podmínkovou část, a to na konci. Teď si asi říkáte, jaký je rozdíl mezi tímto cyklem a cyklem while. Zatímco while nemusí proběhnout ani jednou, do-while proběhne vždy alespoň jednou. . new i = 0; do { pole[i] = 1; ++i; }while(i < 10); . Stejný kód jako dvakrát předtím. Cyklus opět poběží, dokud i nepřekročí hodnotu 9. Rozdíl je, že prvek pole pole bude mít na indexu 0 hodnotu 1, ať už zvolíte jakoukoli podmínku. 5. Příkazy přeskoku (break a continue) Příkazy pro základní cykly jsme si již probrali. Teď si zmínímme ještě tzv. příkazy přeskoku. Jedná se příkazy, které nám mohou ovlivnit životnost celého cyklu či jen konkrétního opakování. Jedná se o příkazy break a continue. a) break Nejprve tedy break. Tímto příkazem můžeme předčasně ukončit cyklus. (Předčasně – kdykoli v jeho průběhu) . for(new i=0; i<10; i++) { if(i == 5) break; pole[i] = 1; } . Pro ukázku jsem zvolil cyklus for, ale fungovalo by to i ve while a do-while. A co se tedy stane? Jakmile bude proměnná i rovna pěti, cyklus skončí a nebude pokračovat v dalších opakováních. Pouze prvky s indexem 0 až 4 budou mít hodnotu 1. b ) continue Druhým příkazem je continue. Jeho úkolem je přeskočit dané opakování a pokračovat v dalším. . for(new i=0; i<10; i++) { if(i == 5) continue; pole[i] = 1; } . Jakmile bude proměnná i rovna pěti, cyklus přeskočí na další opakování, aniž by vykonal cokoliv pod continue. Takže prvek s indexem 5 bude jediný, který nebude mít hodnotu 1. Pro zajímavost (rozklikněte spoiler): 6. Závěr A tímto končíme téma iterace. Už víme, že máme v pawn 3 základní cykly (for, while, do-while) a příkazy přeskoku (break, continue). Tento návod, stejně jako ty předchozí, je určen pro nováčky, pokročilejší věci byly buďto úplně vynechány, nebo jsou uvedeny ve spoilerech. Přesto, zdá-li se Vám, že jsem něco opomněl, někde jsem se spletl nebo se jen chcete vyjádřit, napište pod tento příspěvek.
  10. Zdravím, zase po dlouhé době jsem se rozhodl zde publikovat jeden ze svých návodů. Předem říkám, že se nejedná o nic, čemu by se měli věnovat začátečníci, takže pozdější dotazy typu "Co je to if? Co je to funkce? Co je to pawn?" budou pravděpodobně ignorovány. Řeč bude o variabilních parametrech funkce a práce s těmito parametry. Obtížnost: Obsah 1. Úvod - základní principy a pojmy 2. Konstantní vs. variabilní parametry; kombinované parametry 3. Datové typy / tagy variabilních parametrů 4. numargs, getarg, setarg 5. Pořadí parametrů Úvod Než se do toho pustíme, uveďme a vysvětleme si pojmy, se kterými budeme pracovat. Je-li řeč o parametru (nebo také argumentu), je tím myšlen parametr/argument funkce. Variabilním (proměnným) počtem parametrů myslíme takové parametry, jejichž počet při definici funkce není pevně daný. To znamená, že při volání funkce můžeme dosadit vždy různý počet parametrů. Konec řečí, jdeme si ukázat, jak na to. Konstantní vs. variabilní parametry Ve většině případů pracujete s funkcemi, které mají konstantní (neměnný) počet parametrů. Může jít například o následující, notoricky známou funkci: SendClientMessage(playerid,color,const message[]); _ Při jejím volání se očekává, že pokaždé dosadíme 3 parametry (ID hráče, barvu zprávy a text zprávy), takže volání může vypadat například následovně: SendClientMessage(0,-1,"You're noob."). Pak tu jsou ale funkce, které mají variabilní (proměnný) počet parametrů. Příkladem nám může být mnou definovaná funkce pro sčítání libovolného počtu celých čísel: MultiSum(...) { new num = numargs(),sum; for(new i;i<num;i++) sum += getarg(i); return sum; } _ Když budeme volat tuto funkci, můžeme dosadit kolik parametrů jen chceme. MultiSum(3,8), MultiSum(9,3,-1,5,3) i MultiSum(1,1,1,-5,1,4,2,3,5,8) bude fungovat a bude fungovat správně. Jistě vám už došlo, že variabilitu počtu nám zajišťují tři tečky. Oba výše uvedené postupy lze zkombinovat, tedy určit několik pevně daných parametrů a zbytek nechat jako variabilní. Ale pozor, v tomto případě musí být konstatní parametry na začátku a tři tečky vždy na konci! Funkce pro formátování textu nám budiž příkladem: format(output[], len, const format[], {Float,_}:...); _ První tři parametry uvádíme vždy, další se odvíjí od počtu použitých specifikátorů. (více o funkci format) Datové typy / tagy variabilních parametrů Uvedeme-li při definici funkce pouhé tři tečky, funkce bude očekávat jen celočíselné parametry a řetězce. Chceme-li dosazovat i argumenty jiných datových typů / tagů (Float, File, Text apod.), zápis bude vypadat následovně: Float:... //pouze pro desetinná čísla {Float,_}:... //pro celá čísla, řetězce, čísla s desetinnou čárkou a logické hodnoty {Float,bool}:... //pro desetinná čísla a logické hodnoty {Text,Text3D,Menu}:... //pro ID textdrawů, 3D labelů a menu _ A takto bychom mohli pokračovat dál. Princip spočívá v tom, že před tečky uvedeme příslušný tag, pokud je jich více, uzavřeme je do složených závorek { } a oddělujeme čárkou. Znak _ (podtržítko) nám zastupuje celá čísla, logické hodnoty a řetězce. numargs, getarg, setarg Varování: Tento způsob tvoření parametrů (zejména v případě polí a řetězců) je dosti pomalý. Jsou i rychlejší alternativy, pokud umíte pracovat s direktivou emit. Nyní se dostáváme k funkcím, které pracují s parametry, jejichž počet neznáme. Již jsme je použili nahoře u funkce MultiSum. numargs() Tato funkce vrací celkový počet argumentů funkce, tedy i pevně dané argumenty, ne jen ty variabilní, na to pozor. MultiSumWithException(exception,...) { new num = numargs(),sum; for(new i=1;i<num;i++) { if(getarg(i) == exception) continue; sum += getarg(i); } return sum; } MultiSumWithException(4,1,5,3,4); //numargs vrátí číslo 5 (4 variabilní a 1 konstantní parametr) _ getarg(arg,index=0) Funkce vracející hodnotu argumentu podle zvoleného ID (arg). Začíná se od nuly, takže první argument bude mít ID 0, druhý ID 1 atd. Parametr index nám poslouží v případě, že v naší funkci použijeme řetězec nebo pole. Pole/řetězec se totiž jeví jako jeden argument (arg) a abychom se dostali k jeho buňkám / k jednotlivým znakům řetězce, musíme využít indexu (index). I tyto indexy začínají nulou. PrintThirdNumberFromArrays(...) //při volání dosadím pole a řetězec { new num = numargs(); for(new i;i<num;i++) { printf("%i",getarg(i,2)); //výpis hodnoty třetí buňky pole / třetího znaku řetězce } } PrintThirdNumberFromArrays({7,4,5,3},"ahoj"); //numargs vrátí číslo 2 (2 parametry - 1 pole a 1 řetězec), funkce vytiskne 5 a 111 (111 je hodnota znaku 'o' v ASCII tabulce, pro výpis znaku použijte specifikátor %c namísto %i) _ setarg(arg,index=0,value) Setarg nastavuje parametru hodnotu. Funguje podobně jako getarg, za arg dosadíme pořadí argumentu, index využijeme v případě polí a řetězců (jinak doplňte nulu) a za value novou hodnotu daného argumentu. Příklady: setarg(0,.value=1); //nastaví 1. argumentu hodnotu 1 setarg(3,.value=Text3D:5); //nastaví 4. argumentu hodnotu ID 3D labelu 5 (pozor, argumenty musí tento tag podporvat, viz výš) _ Pořadí parametrů Tohle až tak s tématem nesouvisí, ale když už jsme se dostali tak daleko, uvedeme si i toto. V kódu výše jsme použili .value. Tato syntaxe nám slouží k tomu, abychom nemuseli dosazovat za index nulu, ta je totiž výchozí hodnotou tohoto parametru. Zkrátka jsem tím přeskočil defaultně určený argument. Toto přeskakování parametrů můžete vidět například zde. Když se nám zachce (ale podotýkám, že je to zbytečné), můžeme tím měnit i pořadí normálních argumentů: SendClientMessage(0,0xFF0000FF,"Ahoj!"); //parametry doplněné v typickém pořadí playerid, barva, zpráva SendClientMessage(.color=0xFF0000FF,.message="Ahoj!",.playerid=0); //tatáž funkce, akorát jsem změnil pořadí argumentů _ Hodí se ještě uvést, že u variabilních parametrů toto nelze dělat. A proč? No protože nemají u definice funkce svůj název/identifikátor (jsou tam jen ty tři tečky, popř. tagy, to nestačí). No a to máme vše. Doufám, že jste se něčemu přiučili, profesionálové mi to mohou zkontrolovat, grammarové hledat gramatické a pravopisné chyby, hnidopichové podotknout, že tenhle návod je i jinde (áno, překvapivě jsem ho taky psal já ) a ostatní mi vyjádřit svůj názor, budu rád. Ok, I'm out. Ověřený návod Tento návod prošel validací, a lze ho proto považovat za ověřený.
  11. Obtížnost: Osnova: 1. Úvod, co je to pole 2. Deklarace pole 3. Práce s indexy (přiřazování hodnot) 4. Pole a řetězec 5. Vícerozměrné pole 6. Závěr 1. Úvod Zdravím, tohle je druhý ze série návodů pro začínající pawnery. Návod navazuje na ten předchozí o proměnných (klik). Znalost proměnných je nutná k pochopení tohoto návodu, proto Vám doporučuji, abyste si nejprve přečetli ten první návod (odkaz je k dispozici). Co je to pole? Pole (angl. array) je, zjednodušeně řečeno, proměnná, do které můžeme ukládat více hodnot. Funguje to tak, že se nám v paměti vymezí prostor a tento prostor se nám rozdělí na tolik buněk, kolik určíme. Jako kdybychom vzali dort a rozkrojili ho na námi určený počet kousků. K těmto jednotlivým buňkám (kouskům dortu) pak přistupujeme pomocí tzv. indexů. 2. Deklarace pole Jako první začneme s deklarací pole. Ta funguje stejně jako u proměnné, akorát s malým rozdílem. . new hraci[3]; . Opět jsme použili slůvko new, opět jsme zvolili název a opět jsme to všechno zakončili středníkem. Co se tedy změnilo? Hned za název jsme přidali hranaté závorky [ ] a do nich jsme vepsali velikost pole. Je tam 3, což znamená, že pole s názvem hraci má celkem 3 buňky. Samozřejmě můžeme deklarovat více polí naráz a přidat k nim různé tagy (pro různé datové typy), stejně jako u proměnných. . new hraci[3], Float:souradnice[4], bool:admin[10]; . 3. Práce s indexy (přiřazování hodnot) Nyní máme vytvořené pole. Jak teď do jednotlivých buněk uložíme hodnoty? Budeme k nim přistupovat přes, již zmíněné, indexy. Každá buňka má svůj unikátní index. Indexy vždy začínají od nuly. Poslední index bude vždy o jedno menší, než je velikost pole. Takže naše pole hraci bude mít indexy 0 až 2, pole souradnice bude mít indexy 0 až 3 a pole admin bude mít indexy 0 až 9. Teď pojďme poli hraci přiřadit nějaké hodnoty. . hraci[0] = 1; hraci[1] = 0; hraci[2] = -3; . Takhle jsme všem třem buňkám určili hodnotu. Indexy zapisujeme tam, kde jsme při deklaraci zapisovali velikost. Pro procvičení to samé uděláme i s druhým polem. . souradnice[0] = 4.7; //ukládáme čísla s desetinnou čárkou souradnice[1] = 8.52; souradnice[2] = -1.02; souradnice[3] = -0.5; . Pro zajímavost (rozklikněte spoiler): 4. Pole a řetězec Už u proměnných jsme narazili na tento způsob deklarace – jednalo se o řetězce. Je načase si říci, že řetězec není nic jiného než pole znaků. Každá buňka obsahuje jeden znak z řetězce. Podívejme se na následující příklad: . new pozdrav[4+1]; //deklarace pole znaků (řetězce), nezapomeňme přičíst jedničku (znak) navíc pozdrav = "ahoj"; . Teď máme v poli/řetězci pozdrav slovo "ahoj". Když si ho rozpitváme, zjistíme, že každý index v sobě má jedno písmeno. . pozdrav[0] = 'a' pozdrav[1] = 'h' pozdrav[2] = 'o' pozdrav[3] = 'j' . Index 4 jsem záměrně nezmínil. Proč? Podrobněji se tomu budu věnovat v návodu o řetězcích, prozatím si vystačíme s informací, že jedná-li se o řetězec (u ostatních polí to neplatí), musí poslední buňka zůstat nezměněná. Necháme ji prostě tak, jak je. Pro zajímavost (rozklikněte spoiler): 5. Vícerozměrné pole (pro středně pokročilé – rozklikněte spoiler) 6. Závěr A jsme na konci. Nyní už víme, jak funguje pole, jak jej vytvořit a jak s ním pracovat. Taky jsme si řekli něco málo o principu vícerozměrných polí a o tom, jaký vztah má řetězec k poli. Tento návod, stejně jako ten předchozí, je určen pro nováčky, pokročilejší věci byly buďto úplně vynechány, nebo jsou uvedeny ve spoilerech. Přesto, zdá-li se Vám, že jsem něco opomněl, někde jsem se spletl nebo se jen chcete vyjádřit, pište do tohoto tématu. Ověřený návod Tento návod prošel validací, a lze ho proto považovat za ověřený.
  12. Zdravím, včera a dnes došlo k reorganizaci návodů. Došlo ke smazání některých sekcí a k přidání nových. Stále platí, že návody musí projít revizí, aby mohly být označeny jako ověřené, a stále platí, že musí být zpracovány dle předlohy. a) Návody V hlavní sekci jsou všechny návody, které se týkají SA:MP funkcí a callbacků. Také jsou zde návody, které vysvětlují, jak něco vytvořit. Příklady: dialogy, textdrawy, cmd systémy, file systémy atd. Základy pawn a Rozšířené znalosti pawn Tyto podsekce sdružují návody, které se týkají přímo jazyka Pawn. V Základech jsou návody pro nováčky, v Rozšířených znalostech návody pro pokročilejší. Příklady pro Základy: proměnná, podmínky, cykly, funkce atd. Příklady pro Rozšířené znalosti: bitová manipulace, pokročilá inicializace polí, ternární operátor, pokročilá práce s řetězcem atd. c) Práce s YSI Podsekce pro návody o knihovně YSI. Příklady: y_ini, y_commands, y_groups, y_va atd. d) Nové návody Podsekce, která slouží k přidávání nových návodů. Pokud chcete založit nový návod, udělejte to zde. Jakmile dojde k ověření moderátorem, bude návod přesunut do příslušné (pod)sekce. e) Neověřené návody V této podsekci je většina dosavadních návodů. Žádný z nich neprošel kontrolou, proto je nemůžeme považovat za ověřené. Nezodpovídáme za pravdivost ani úplnost informací z těchto návodů.
  13. Obtížnost: Osnova: 1. Úvod, co je to podmínka 2. Vytvoření podmínky 3. Další možnosti větvení 4. Vnořené podmínky 5. Závěr 1. Úvod Dostáváme se k šestému návodu o základech jazyka Pawn. V něm si vysvětlíme, co to jsou podmínky a jak probíhá větvení. Než budeme pokračovat, měli byste mít znalosti alespoň z předchozích dvou návodů (z tohoto a tohoto). Abychom se posunuli dál, musíme si nejdříve říct, co to podmínka a větvení je. Podmínku si můžeme představit jako výraz (tvořený relačními a logickými operátory – viz návod na operátory), který je buď pravdivý, nebo nepravdivý. Je-li pravdivý, vykoná se kód, který jsme podmínili. Můžeme také určit, co se stane, když je výraz nepravdivý. Tomuto rozdělování kódu dle výsledku podmínek se říká větvení. Bloky ani klíčová slova if, else a switch neukončujeme středníkem! 2. Vytvoření podmínky Teď si zkusme vytvořit takovou podmínku a větev. Syntaxe je následující: . if(logický výraz) { //kód } . Klíčové slovo if nám značí, že se bude jednat o podmínku (z angličtiny if – jestliže). Do kulatých závorek píšeme logický výraz, který se má vyhodnotit. Mezi složené závorky (které nám tvoří větev – blok) píšeme kód, který se má vykonat, když je podmínka pravdivá. Zkusme si to na příkladu: . new cislo = 10; if(cislo == 10) { print("Hodnota proměnné cislo je rovna deseti."); } . Podmínka je pravdivá, kód se vykoná. Co by se stalo, kdyby podmínka pravdivá nebyla? Nestalo by se nic. Kód uvnitř bloku if by se nevykonal. 3. Další možnosti větvení Na začátku jsem psal, že může nastat i situace, kdy chceme, aby se něco stalo v případě, že podmínka neplatí. I to nám jazyk umožňuje provést, a to hned několika způsoby. a) else If nám tvořilo "pravdivou větev", else nám pak bude tvořit "nepravdivou větev", tedy blok, který se vykoná, když bude podmínka nepravdivá. Nutno dodat, že k else se podmínka nedává a že ho nemůžeme použít samostatně (je vázán na if). . new cislo = 5; if(cislo == 10) { print("Hodnota proměnné cislo je rovna deseti."); } else { print("Hodnota proměnné cislo není rovna deseti."); } . Podmínka se vyhodnotí jako nepravdivá, takže blok if se přeskočí a místo toho se vykoná blok else. b ) else if Složitější větvení nám pak umožňuje else if. Zjednodušeně řečeno je to else s dodatečnou podmínkou. Else if bloků může být více, ale stejně jako else nemohou stát samostatně. . new cislo = 5; if(cislo == 10) { print("Hodnota proměnné cislo je rovna deseti."); } else if(cislo == 5) { print("Hodnota proměnné cislo je rovna pěti."); } else if(cislo == 0) //tato podmínka se už vyhodnocovat nebude { print("Hodnota proměnné cislo je rovna nule."); } . A v čem je vlastně kouzlo else if? Script vyhodnotí podmínku v if, zjistí, že je nepravdivá, tak přeskočí k následujícímu else if. Opět vyhodnotí podmínku, zjistí, že je pravdivá, tak vykoná tento blok. K dalšímu else if už ale nepokračuje, protože jedna z podmínek nad ním byla pravdivá. A tím se liší od soustavy if – if – if; u takové soustavy by totiž script vyhodnocoval všechny podmínky nehledě na to, že některá z nich byla pravdivá. c) if – else if – else Samozřejmě to jde také vše zkombinovat, záleží jen na tom, co potřebujeme. . new cislo = 5; if(cislo == 10) { print("Hodnota proměnné cislo je rovna deseti."); } else if(cislo == 5) { print("Hodnota proměnné cislo je rovna pěti."); } else { print("Hodnota proměnné cislo není ani 10, ani 5."); } . d) switch Pro určité případy zde máme ještě jednu strukturu, a tou je switch. O switchi si něco povíme až v příštím návodu. 4. Vnořené podmínky Do teď jsme si ukazovali jednoduché podmínky a jednoduché větvení. Ale abyste si nemysleli, že je možné jen tohle, máme možnost podmínky vnořovat, tedy vkládat podmínku do podmínky. Viz tento příklad: . new cislo = 5; if(cislo > 0) { if(cislo == 5) { print("Hodnota proměnné cislo je rovna pěti."); } else { print("Hodnota proměnné cislo není rovna pěti."); } } . Zde je vidět, že uvnitř bloků lze tvořit další bloky. Platí to u podmínek, platí to u cyklů, platí to u všech struktur, které tvoří bloky. 5. Závěr A to je z podmínek všechno. Dozvěděli jste se, jak podmínky a větvení fungují, jak můžete uplatnit svou znalost relačních a logických operátorů v praxi, jak tvořit větev pro pravdu i nepravdu, jak vytvářet složitější podmínky a jak podmínky vnořovat. V dalším návodu si probereme onen zmíněný switch. Tento návod, stejně jako ten předchozí, je určen pro nováčky, pokročilejší věci byly buďto úplně vynechány, nebo jsou uvedeny ve spoilerech. Přesto, zdá-li se Vám, že jsem něco opomněl, někde jsem se spletl nebo se jen chcete vyjádřit, pište do tohoto tématu. Ověřený návod Tento návod prošel validací, a lze ho proto považovat za ověřený.
  14. Obtížnost: Osnova: 1. Úvod, co je operátor a operand 2. Dělení operátorů 3. Aritmetické operátory 4. Závěr 1. Úvod Vítám Vás u čtvrtého návodu pro začínající pawnery. Tématem tohoto návodu budou základní informace o operátorech, jejich dělení a aritmetické operátory. O dalších druzích operátorů napíši, vzhledem k množství informací, návod zvlášť. Ačkoliv to teď nevíte, operátory jsme využívali už v předchozích návodech, ale také v matematice (třeba +). Úkolem operátorů je vykonávat nějakou operaci (třeba sčítání). Aby tuto operaci mohli vykonávat, musí pracovat s tzv. operandy. Operand je nějaká hodnota, která stojí před, nebo za operátorem (čísla, která sčítáme). . 1 + 3 //plus je operátor, 1 a 3 jsou operandy . Operandy mohou být konstantní (neměnné), to jsou třeba čísla nebo jmenné konstanty jako MAX_PLAYERS, ale také variabilní (proměnné), to jsou proměnné, pole, návratové hodnoty funkcí apod. Kombinací operátorů a operandů vzniká výraz. 2. Dělení operátorů a) Počet operandů Dělit operátory můžeme podle různých kritérií. Prvním je počet operandů. Operátory s jedním operandem nazýváme unární, se dvěma operandy binární a se třemi operandy ternární. . !promenna //vykřičník je unární operátor 1 + 3 //plus je binární operátor výraz ? true : false //otazník s dvojtečkou jsou jediným ternárním operátorem v Pawn . b ) Účel Dále můžeme operátory dělit podle jejich účelu. Pak mluvíme o operátorech artimetických, relačních, logických, přiřazovacích a binárních. Tohoto dělení se budeme držet a ty hlavní skupiny si blíže rozepíšeme. 3. Aritmetické operátory Se základními aritmetickými operacemi jsme se setkali právě v matematice. Jsou to sčítání, odčítání, násobení a dělení. . new cislo = 5, cislo2 = 10; cislo + cislo2 //plus sečte dva výrazy (výsledek je 15) cislo - cislo2 //mínus odečte dva výrazy (výsledek je -5) cislo * cislo2 //hvězdička vynásobí dva výrazy (výsledek je 50) cislo / cislo2 //jedno lomítko vydělí dva výrazy (výsledek je 0.5) . Pak je tu ještě jeden speciální operátor pro dělení, který ovšem vrací zbytek po dělení. Nazývá se modulo. . cislo % cislo2 //procento vydělí dva výrazy a vrátí nám zbytek (zbytek je 5) . Všechny výše uvedené operátory jsou binární. Nezapomeňme, že pro ně platí stejná matematická pravidla jako v reálném životě (nulou nelze dělit, násobení má přednost před sčítáním, sčítání a násobení jsou komutativní operace atd.). Pokud chceme, aby nějaká operace měla přednost před jinou (sčítání před násobením), můžeme, stejně jako v matematice, použít kulaté závorky. . 4 * (1 + 1) //díky závorkám dojde nejprve k sečtení jedniček a až poté k vynásobení čtyřkou . Dalšími aritmetickými operacemi jsou inkrementace a dekrementace. S těmi se setkáme později u cyklů. Oba operátory pro tyto operace jsou unární a uvádí se buď před, nebo za proměnnou. Ano, v tomto případě musí být operandem proměnná / buňka pole. . new cislo = 5; cislo++ //inkrementace, hodnota proměnné cislo se zvětší o 1, tedy na 6 cislo-- //dekrementace, hodnota proměnné cislo se zmenší o 1, tedy na 4 . Jak už je uvedeno v poznámce, inkrementace zvýší hodnotu o 1, dekrementace sníží hodnotu o 1. Pro zajímavost (rozklikněte spoiler): . Poslední aritmetický operátor, který si zmíníme, je unární mínus. Uvádí se před operandem a jeho úkolem je převést kladné číslo v záporné a naopak. Na nulu nebude mít vliv. . -cislo . 4. Závěr První část návodu o operátorech je za námi. Vysvětlili jsme si pojmy jako operátor, operace, operand a výraz. Také jsme si uvedli, jak se operátory rozlišují a co to jsou aritmetické operátory. V příštím návodu si objasníme zbývající kategorie – relační, logické, přiřazovací a bitové operátory. Tento návod, stejně jako ten předchozí, je určen pro nováčky, pokročilejší věci byly buďto úplně vynechány, nebo jsou uvedeny ve spoilerech. Přesto, zdá-li se Vám, že jsem něco opomněl, někde jsem se spletl nebo se jen chcete vyjádřit, pište do tohoto tématu. Ověřený návod Tento návod prošel validací, a lze ho proto považovat za ověřený.
  15. Obtížnost: Osnova: 1. Úvod, co je řetězec 2. Nulový znak 3. Ukládání hodnot do řetězce 4. Závěr 1. Úvod Zdravím Vás, dostali jsme se už ke třetímu návodu pro začínající pawnery. Ještě než se do toho pustíme, doporučuji, abyste si přečetli předchozí dva návody (návod na pole – návod na proměnnou), zejména návod na pole, bez něj budete mít problémy pochopit problematiku řetězců. O řetězci (angl. string) byla řeč již dříve. Zopakujeme si to hlavní – je to pole znaků, do kterého ukládáme texty, zprávy, hesla atd. Každá buňka obsahuje jeden znak. Do poslední buňky nic neukládáme. Proč vlastně do poslední buňky nic neukládáme? Kvůli nulovému znaku. 2. Nulový znak Je načase, abychom si konečně vysvětlili, proč u řetězců potřebujeme buňku navíc, proč tuhle poslední buňku nikdy nezaplňujeme. Je to kvůli tzv. nulovému znaku (také EOS – End of String). Tenhle konkrétní znak (mimochodem vypadá takhle – '\0') v Pawn totiž určuje konec řetězce. Jazyk po nás požaduje, abychom mu sdělili, když řetězec skončí. Proto je nezbytné k délce řetězce vždy přičíst jeden znak navíc, ten je vyhrazen pro tento nulový znak. . new pozdrav[4+1]; //deklarace řetězce, která je nám důvěrně známa z předchozího návodu na pole pozdrav = "ahoj"; //uložení pozdravu do řetězce . Slovo "ahoj" má 4 znaky, celkem tedy potřebujeme řetězec o délce pěti znaků (4 + nulový znak). Abychom měli představu, jak to v tom řetězci vypadá, rozpitváme si ho: . pozdrav[0] = 'a' pozdrav[1] = 'h' pozdrav[2] = 'o' pozdrav[3] = 'j' pozdrav[4] = '\0' //onen nulový znak v páté buňce s indexem 4 . Ať už potřebujeme řetězec k čemukoli, vždy musíme myslet na tento nulový znak. Pro příklad, pokud funkce SendClientMessage může odeslat zprávu o maximální délce 144 znaků, řetězec s touto zprávou musí mít délku 145. 3. Ukládání hodnot do řetězce Existuje více způsobů, jak můžeme do řetězce něco uložit. Vlastně jich je spousta, my si ukážeme ty základní. a) Přímé ukládání pomocí operátoru přiřazení Tím mám na mysli rovnítko (=). Takhle jsme to dělali doposud, uvedeme identifikátor řetězce (bez hranatých závorek), rovnítko a poté text ohraničený uvozovkami ("). . pozdrav = "ahoj"; . Tento způsob ukládání lze použít, když přesně víme, co tam chceme uložit. Také je nutno podotknout, že ukládaný text nesmí být delší, než je délka řetězce. Upřímně si myslím, že s tímto se v praxi moc nepotkáte (akorát při inicializaci). Často je potřeba text upravit, dosadit do něj hodnoty proměnné apod. K těmto účelům nám slouží formátování. b ) Formátování Když formátujeme text, označujeme tím proces, při kterém do něj vkládáme hodnoty jiných proměnných a řetězců. Slouží nám k tomu funkce format. . format(output[], len, const format[], {Float,_}:...) . Za "output[]" dosadíme řetězec, kam chceme výsledný text uložit. Parametr "len" po nás chce délku výsledného textu. "const format[]" je onen text, který chceme formátovat. To poslední – "{Float,_}:..." – jsou proměnné/řetězce, které chceme dosadit. Ukažme si to na příkladu: . new hrac[4+1] = "Pepa"; //takto vypadá inicializace řetězce new penize = 500, score = 1000; //proměnné, které budeme dosazovat new vysledek[100]; //výsledný řetězec, kde bude nás formátovaný text format(vysledek, sizeof vysledek, "Hráč %s má %d dolarů a %d skóre.", hrac, penize, score); . V řetězci vysledek teď budeme mít: Hráč Pepa má 500 dolarů a 1000 skóre. . Ve fomátované zprávě jsme použili jisté znaky – %s a %d. Těmto znakům se říká specifikátory. Aby ta funkce format věděla, kam má to hrac, penize a score dosadit, musíme mu to dát nějak vědět. To je účel specifikátorů. Uvádíme je vždy v tom pořadí, v jakém po sobě jdou proměnné/řetězce, které dosazujeme. Máme následující specifikátory: %d nebo %i – celá čísla %s – řetězec %f – čísla s desetinnou čárkou %c – znak Nejsou všechny, ale jako základ nám tohle postačí. 4. Závěr A to by k řetězcům bylo všechno. Konečně již víme, co je nulový znak a k čemu slouží. Už víme, jak do řetězců ukládat běžný, ale také formátovaný text. Jediné, na co jsem ještě zapomněl – pomocí sizeof jsme zjistili velikost řetězce vysledek (počet buněk toho řetězce). Tento návod, stejně jako ten předchozí, je určen pro nováčky, pokročilejší věci byly buďto úplně vynechány, nebo jsou uvedeny ve spoilerech. Přesto, zdá-li se Vám, že jsem něco opomněl, někde jsem se spletl nebo se jen chcete vyjádřit, pište do tohoto tématu. Ověřený návod Tento návod prošel validací, a lze ho proto považovat za ověřený.
  16. Toto téma je určeno lidem kteří začínají pawnit. Pokud máte někdo váš milovanej komentář Jakej smysl má tento topic nechte si ho. Napadlo mě to prostě jen tak. A myslím že lidem kteří začínají v pawnu a přečtou si to. To snad trošku pomůže a nemusíte to brát zrovna k pawnu. Ale třeba k jiné věci a nemusí to bejt ani programovaní a podobná věc. Cokoliv. Zdravím protože toto forum navštevují lidé kteří pawnu rozumí dost ale jsou tu i ti kteří pawnu začínaj a jsou tu lidé kteří si někdy nevědí rady kvůli jednomu problému a chtějí vzdát celé pawnění.Bylo tu několik lidi kteří chtěli bejt profesiolaní pawneři ale kvuli jedné blbosti to vzdali a nebo kvůli tomu že lidé tady je moc nepodpořili nebo když si člověk založil topic stím že bude dělat vlastní mod tak ho lidi tady hatovali a kvůli tomu to vzdal. Nevidím důvod proč to vzdávat po jednom pádu. Všichni si myslí že když začnou pawnit že hned udělaj nejlepší mod, a na serveru budou hned mejt 100 hraču denně. Neříkám že to není možné ale není to v každém případě. Ale většina lidi to tady vzdá a vykašle se na pawno. Nebo nato s splnit svůj sen a vytvořit vlastní herní mod. Je to zbytečné vzdávat většinou je to jen váš boj A musíte ho vyhrát vy a neposlouchat lidi kteří vám nevěří. Při této větě jsem stál při každém mém modu nebo filterscriptu. Udělal jsem víc modu a většina znich byla ohodnocena kriticky. Neříkám že jsem neměl chut přestat s pawnem ale já se přes to překousl. Protože chtěl jsem něco dokázat a né bejt člověk co se nechá porazil lidmi kteří mi nevěří. Ale znám lidi kteří mi píšou že chtějí pomoct s pawnem Protože začínají a chtějí pomoct. Rád pomůžu a zaučím to ano ale musíte pochopit že pokaždé pří vás někdo nebude stát. Lidé říkají že nechapou jak jsem se mohl tak vypracovat. Já to nevzdal a vím že i ted nejsem mezi elitou jsem v pawnu průměrnej uživatel. A nestydím se zato každou mojí chybou se totiž posouvám a toho si cením nejvíce. A v poslední dobře když jsem viděl scripty na začátku mé tvorby zasmál jsem se a šel dál. Ale mám stoho ten pocit že jsem to nevzal a snažil se o něco. Jak jsem vlastně začal ? Začlo to asi před 3 roky když jsem si zakoupil můj první server. A nahrál jsem klasickou RZE a byl jsem už hotovej stoho že jsem dokázal to mejt vlastní server. Pro mě už jen toto byl pokrok. Ale časem jsem si řekl že chci zkusit vytvořit něco jako tento mod. Jo moje očekavání bylo takové že zapnu pawno dám F5 a bude stejnej mod jak je RZE. Ale ono to tak nebylo. Byl to prázdnej mod bez ničeho aut,objectu prostě nic.. Tak jsem hledal různé návody tak jsem přišel na tuto stránku. Zde jsem našel tutorial jak vytvořit text ve hře. Ano bylo to jen ubohé SendClientMessage Ale už to byl pokrok.. Další návody jsem koukal a u některých jsem použil možnost kopírovaní. Ale už jsem měl na serveru text a první příkaz kterej mi dal zbraň. Řekl jsem si joo něco jsem zvládl. Potom jsem si stahnul anglický drift mod. Kterej jsem přeložil no i přesto že ten mod měl celkově tak 400 řádku. A já ho přeložil tak jsem to zveřejnil na tuto stránku do možnosti stažení. Wow a lidé si to fakt stahnuli. I když kometáře byly Wow tos toho teda přeložil. Je pravda že k přeložení bylo asi 8 zpráv ale i tak. Pokrok je pokrok. A nedalo mi to jen to že jsem to přeložil,dalo mi to možnost pochopit spoustu novejch funkcí. Jo jenže co to bylo mod kterej má 400 řádku..Pfff. Já chtěl ale něco dokázat něco co někoho ohromí. Tak jsem si našel tutorial na vytvoření registrace a přihlašení. Hledal jsem tady několik možnost před dub a dini.. Ale nejvíce se mi líbilo YSI. Které používám do dnes a už né jen pro ukladaní.. Měl jsem teda můj mod na kterém byla registrace.. Yes! Další pokrok neříkám že jsem něco nekopíroval...To opravdu ne.. Něco jsem fakt kopíroval protože jsem se styděl lidi otravovat s banalitama.. A což je chyba.. To jsem pochopil až na střední škole že když něco nevím mám se zeptat.. Znáte to né ? Když na zakladní škole se vás někdo zeptá jestli tomu rozumíte ? A vy kejvete a děláte že jo a přitom věc vůbec nechápete.. Něco podobného jsem měl v pawnu.. Ale na střední škole jsem pochopil že když něco nevím prostě se musím zeptat. Sice možná budu před celou třídou za největšího trapáka ale co bude to trvat max 30 minut a všichni nato zapomenou. Ale ted si položme otázku opravdu jsem trapák nebo jsem člověk co má jakou jedinej ty "koule" se zeptat? Proto jsem si oblíbil celkem nováčka v pawnu Cybrionowich Kterej se v chatu ptal na každou funkci které nerozuměl. A ano dokázal to naco já jsem koule dřív neměl. No nic jdem v našem příběhu dál.. Když jsem měl registraci a projížděl jsem si servery na CZ Scéně. A neviděl jsem žádnej prison mod. Tak jsem si řekl že udělám mod ve vězení. Bylo to několik problemu a několik komplikací a několik kopírovaní.. Ale nakonec jsem dokázal. Jo to byly věci kde při otevření 1 cely byly příkazy asi takové Cela č.1 - /cela1otevrit - /cela1zavrit Cela č.2 - /cela2otevrit - /cela2zavrit A věci které bych dneska vyřešil pomocí pár řádku jsem řešil neskutečně složitě.. Bylo to až příšerné jak složitě jsem to dělal. Ale zrovna v těhle věcech jsem obětoval usilí a snažil se.. Ale taky zrovna zde mi došlo.. Že to kopírovaní mě nic nedává... Ničemu nechápu když zapnu pawno.. Nic neumím. Ničemu nerozumím Nevím co mám dělat Ale nechtělo se mi dělat celej mod znova. Tak jsem se sice pawnu učil víc ale mod jsem zveřejnil.. Neměl skoro žádnej uspěch a nechal jsem ho 14 dní a když tam nikdo nehrál tak jsem se pustil do dalšího modu. San Fierro Life Tento mod jsem dělal dlouho a pomocí několika tutorialu a několika usílí. Seděl jsem do 2 do rána za počítačem i přesto že jsem stával v 7 do škole. A přitom jsem skoro nic neudělal..Proč ? Nechápal jsem to tak jsem se znovu místo do škole začal učit pawno. (Tím nechci říct že se nemáte učit,školu potřebujete,pawno chcete umět) Ale nevzdal jsem to a zas po několika trapení jsem dal ven další mod. Ale šlo poznat že skoro všechno je dělané podle tutorialu.. Takže to lidi kritizovali kometářema CTLR C CTLR V co ? A toto se mě tehdy dotklo nejvíc ale někde v sobě sem věděl že mají pravdu. Tak jsem začal dělat znovu jednoduché filterscripty které jsem zveřejnoval. A zde už jsem to dělal opravdu sám sice to začlo lehce. Warp Systém Teleport systém Car menu. Pak jsem si dal několika měsíční pauzu a dělal jsem si scripty jen pro sebe. Kde jsem je testoval a učil se nové věci.. A to mi pomohlo po několika opravdu několika měsicích jsem se pustil do modu ForLife na kterej jsem nejvíce pyšnej Zatím jsem nepoužil žádnej tutorial a zatím to zvládám sám. Tedy použil jsem jeden a to bylo o praci s NPC a RNPC. Protože stímto jsem nikdy nepracoval. A tak co další pokrok. Ale musím říct že jsem opravdu rád že jsem přestal tvořit zbytečné mody a učil se pawnu.. Ted dělám mod kterej možná se někomu nelíbí a přijde zbytečnej Ale já jsem na něj neuvěřitelně pyšnej. Ještě bych chtěl říct že mezi těma modama bylo několik modu kterej jsem dělal ale nedokončil A to hlavně kvůli tomu že mě lidi nevěřili a já se neustále spoléhal na ostatní. Ale to mi došlo už při dokončovaní San Fierro Life. Že pawno dělám pro sebe a né pro ostatní. Uff..Tak jsem nováčkum trošku hodil doufám motivaci že se nemají vzdávat. A stačí si věřit. By Polis_Polismanovic Děkuji všem co mě nějak podpořili nebo mi pomohli. Každej kdo mi poradil když jsem to potřeboval. Každej kdo mi věřil v mé tvorbě modu. Každej člověk kterej mi dále fandí v pawnu. Každej člověk kterej mě udržel při pawnu. Každej kterej mi řekl nevzdávej to. Děkuji všem 1392 Slov -------------------------------------------------------POSLECHNI SI------------------------------------------------ -------------------------------------------------------------------------------------------------------------------------
  17. Natočil som krátky návod ako naimportovať záložky do microsoft edge. Ak som pomohol like by ma potešil https://youtu.be/9nFqwfU9uHo
  18. #1 Úvod Nová série poučných slov o skriptování v PAWN Intro Po posledních zkušenostech zde na fóru, a nebo i jiných nováčků, kteří se mě ptali na pomoc, jsem byl velice zděšen, jak chápou pawno. (Po první větě můžu naokraj říct, že je psaní textu delšího rázu za trest, zvláště pomocí debilních nefungujících BBcodů. Ale to bylo z jiného soudku.) Zvýrazněné slova jsou velmi důležitá pro pochopení. Po delším pozorování komunity jsem uznal, že snad 95% lidí nemá ponětí o tom, co dělá. První příklad Jak jsem již řekl v předešlé větě, uvedu příklad. #define dcmd(%1,%2,%3) if ((strcmp((%3)[1], #%1, true, (%2)) == 0) && ((((%3)[(%2) + 1] == 0) && (dcmd_%1(playerid, "")))||(((%3)[(%2) + 1] == 32) && (dcmd_%1(playerid, (%3)[(%2) + 2]))))) return 1 Většina z vás by řekla, že je to potřebný kód, bez kterého nepůjdou příkazy, nebo to je pro vás strašně složitá definice nějakých sraček a nebo by to prostě házelo errory Tohle není vysvětlení toho, proč to tam je. Většina malých mozečků nepochopí reálné vysvětlení, ale nehodlám rozebírat psychickou vyspělost jedince. Ten kdo to svým způsobem nepochopí, nemá na to, aby se tomuto dále věnoval. Ano, myslím tím děti, co toto nedělají ze zájmu a přiučení něčemu novému, ale toho, aby si zajezdili autem ve hře. V podstatě se jedná o funkci, která "přesune příkaz" do nové funkce po vyvoláni callbacku OnPlayerCommandText. Umožňuje nám rychlý zápis příkazů bez počátečního lomítka / a do druhého parametru funkce dcmd_prikaz pošle obsah za příkazem a vrátí hodnotu 1, protože to callback informuje o tom, že příkaz byl zpracován. Důvod, proč vám to vykládám na tomto příkladu, je, aby jste pochopili mechaniku obecně a tím všechno. Třetí věc a také důvod, proč jsem založil toto téma je že nemá smysl zakládat hloupé tutorialy na to, jak něco udělat. Většina z nich, bez urážky, je jako "od robota pro robota"; vysvětlení nedostačující a jak jsem již zmínil - témata typu: "bez toho by vám to nešlo, tak si to ku*va zkopírujte". A to nepočítám optimalizaci, způsob a tak podobně. Rozhodl jsem se založit novou sérii návodů pro chápání samotné mechaniky a logiky, protože je to jen o fantazii, představivosti a logice. Podle toho všeho si můžete vytvořit naprosto vše špičkové kvality. Osobně jsem měl podobné začátky, ale čím dřív se zlozvyk eliminuje, tím lépe. Nekonečným kopírováním kódu jsem ztratil spoustu let praxe. Díky této zkušenosti může pawn sloužit i jako odrazový můstek pro daleko složitější jazyky. Doufám, že toto téma bude vnímáno jen přínosně a kladně. Prozatím sbohem, I'll be back. ]mxco[
  19. Menší tutoriál pro začátečníky. Nejdřív je třeba dát si do módu někam třeba úplně dolu stock který zjistí jméno hráče podle id: stock PlayerName(playerid) { new pname[24]; GetPlayerName(playerid,pname,24); return pname; } Stock se používá stylem PlayerName(playerid) můžete ho použít ne jen v těchto zprávách ale v celém módě určitě lepší jak u každého textu používat GetPlayerName. Teď k samotným zprávám jako první si uděláme zprávu při připojení. Stačí do OnPlayerConnect vložit: new string[128]; // string[128] číslice 128 znamenají délku textu kterou si lze nastavit tímto způsobem. format(string, sizeof(string), "Hráč %s se připojil na server.", PlayerName(playerid)); SendClientMessageToAll(0xffffffaa, string); // SendClientMessageToAll (zpráva pro všechny přítomné hráče na serveru), 0xffffffaa (barva kterou lze jednoduše změnit např.: 0xff0000aa = ČERVENÁ) Mělo by to vypadat takto: public OnPlayerConnect(playerid) { new string[128]; format(string, sizeof(string), "Hráč %s se připojil na server.", PlayerName(playerid)); SendClientMessageToAll(0xffffffaa, string); return 1; } Dále si uděláme odpojení na 3 způsoby a to pád hry, odpojení a vyhození ze serveru: Stačí do OnPlayerDisconnect vložit: new string[128]; // string[128] číslice 128 znamenají délku textu kterou si lze nastavit tímto způsobem. switch(reason) { case 0: format(string, sizeof(string), "Hráči %s spadla hra.", PlayerName(playerid)); case 1: format(string, sizeof(string), "Hráč %s se odpojil ze serveru.", PlayerName(playerid)); case 2: format(string, sizeof(string), "Hráč %s byl vyhozen ze serveru.", PlayerName(playerid)); } SendClientMessageToAll(0xffffffaa, string); // SendClientMessageToAll (zpráva pro všechny přítomné hráče na serveru), 0xffffffaa (barva kterou lze jednoduše změnit např.: 0xff0000aa = ČERVENÁ) Mělo by to vypadat takto: public OnPlayerDisconnect(playerid, reason) { new string[128]; switch(reason) { case 0: format(string, sizeof(string), "Hráči %s spadla hra.", PlayerName(playerid)); case 1: format(string, sizeof(string), "Hráč %s se odpojil ze serveru.", PlayerName(playerid)); case 2: format(string, sizeof(string), "Hráč %s byl vyhozen ze serveru.", PlayerName(playerid)); } SendClientMessageToAll(0xffffffaa, string); return 1; } A prakticky to je vše úpravy si už můžete dělat každý sám. (pro hatery - i tohle přijde vhod pokud to už znáte nebo to nevyužijete nehejtujte to)
  20. Zdravím, normálně sem nic nedávám ani tu nepíšu žádné tutoriály ale našel jsem v počítači něco z dávnější doby a myslím si že se to někomu i hodí. Jak to použít normálně v módu? Do public OnPlayerKeyStateChange(playerid, newkeys, oldkeys) vložíme: if(newkeys & KEY_FIRE && ProhWeap(playerid) && !IsPlayerAdmin(playerid)) { ResetPlayerWeapons(playerid); return 1; } Následně to funguje tak že pokud vystřelíte s té určité zbraně tak vám to resetuje kompletně zbraně no můžete si tam dát místo ResetPlayerWeapons(playerid); třeba funkci pro ban např: BanEx(playerid,"Weapon Hack"); a nějakou zprávu. Také v případě že se jedná o rcon admina jako o vás tak to bude ignorovat použití zbraně kterou jste zakázali. Celé by to mělo vypadat takto: public OnPlayerKeyStateChange(playerid, newkeys, oldkeys) { if(newkeys & KEY_FIRE && ProhWeap(playerid) && !IsPlayerAdmin(playerid)) { ResetPlayerWeapons(playerid); return 1; } return 0; } Následně si vložíte do módu stock který zjistí jaké ty zbraně jsou zakázané: stock ProhWeap(playerid) { new wp = GetPlayerWeapon(playerid); if(wp = ID ZBRANE || wp = ID ZBRANE || wp = ID ZBRANE || wp = ID ZBRANE) { return true; } return false; } Místo ID ZBRANĚ si dáte id té zbraně kterou chcete zakázat, id zbraní najdete na google, wiki a podobně. Vždy když chce přidat zbraň napíšete || wp = ID ZBRANE tak aby na konci kde máte ) nebylo || každopádně pokud chcete ubrat uděláte to samé ale opačně. Myslím si že netřeba to moc vysvětlovat ale i pro nějaké "lidi": new wp = GetPlayerWeapon(playerid); toto zjišťuje o jakou zbraň se jedná. A nevím co více k tomu říct ----------------------------------------------------------------------------------------------- Ještě vám sem dám co jsem zkoušel udělat já po pravdě nevím jestli je to funkční/není protože jsem to nezkoušel. Je to celkem staré a udělané na způsob includu. Mělo by se ukládat do PW.txt ukládat Zbran1 =, Zbran2 = atd... kde si následně napíšete ID ZBRANĚ: Vytvoříte si například includ: WH.pwn vložíte ho do includu ve vašem pawnu a do něj dáte: new PWS[11]; forward PW_Load(); forward PW_OnPlayerKeyStateChange(playerid, newkeys, oldkeys); public PW_Load() { new soubor[50]; format(soubor, sizeof(soubor), "PW.txt"); PWS[0] = dini_Get(soubor, "Zbran1"); PWS[1] = dini_Get(soubor, "Zbran2"); PWS[2] = dini_Get(soubor, "Zbran3"); PWS[3] = dini_Get(soubor, "Zbran4"); PWS[4] = dini_Get(soubor, "Zbran5"); PWS[5] = dini_Get(soubor, "Zbran6"); PWS[6] = dini_Get(soubor, "Zbran7"); PWS[7] = dini_Get(soubor, "Zbran8"); PWS[8] = dini_Get(soubor, "Zbran9"); PWS[9] = dini_Get(soubor, "Zbran10"); PWS[10] = dini_Get(soubor, "Zbran11"); return true; } public PW_OnPlayerKeyStateChange(playerid, newkeys, oldkeys) { if(newkeys & KEY_FIRE && ProhWeap(playerid) && !IsPlayerAdmin(playerid)) { ResetPlayerWeapons(playerid); return 1; } return 0; } stock ProhWeap(playerid) { new wp = GetPlayerWeapon(playerid); PW_Load(); if(wp = PWS[0] || wp = PWS[1] || wp = PWS[2] || wp = PWS[3] || wp = PWS[4] || wp = PWS[5] || wp = PWS[6] || wp = PWS[7] || wp = PWS[8] || wp = PWS[9] || wp = PWS[10]) { return true; } return false; } Následně ve svém módu úplně nahoru dáte #include <WH.pwn> A do publicu OnPlayerKeyStateChange dáte: PW_OnPlayerKeyStateChange(playerid, newkeys, oldkeys); Také si nezapomeňte do scriptfiles vytvořit soubor: PW.txt Prakticky po případě si to můžete upravit/opravit a využít jak chcete... Mě to vůbec nezajímá a ani to nehodlám využívat. Díky. A nepište hodnocení dokud si to nezkusíte protože si nejsem jistý s tím ukládáním už od pohledu Ale opravovat vám to nebudu :d Asi by bylo lepší místo Zbran1 Zbran2 atd... ukládat -1 Informační návod - 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ý
  21. Zdravim. Nedávno jsem si všimnul jednoho FS jmenem Audio Reklama a byl tam komentar ze by nekdo uz mohl vymyslet system aby se nemusel nahrávat zvuk a ten potom pouštět. Takže sem trochu projel jiné zdroje a zde máte řešení: stock TTS(playerid, text[], lang[]) // Text-To-Speak(ID hráče, text který chceme přehrát, jazyk) { new str[128]; // vytvoření nového stringu format(str, sizeof str, "translate.google.com/translate_tts?tl=%s&q=%s", lang, text); // format stringu PlayAudioStreamForPlayer(playerid, str); // prehrani zvukove stopy return 1; } Příklad použití: TTS(playerid, "Vítejte na nejkrutopřísnějším serveru na světě.", "cs"); Podporované jazyky: všechny které má google nadabované ale doporučuji používat: cs - český jazyk sk - slovenský jazyk en - anglický jazyk (tento jazyk má asi nejlepší dabing) A předem upozorňuji že je to vše pouze ženský hlas. Doufám že se to někomu bude hodit 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ý
  22. Dobrý den takže vytejte u mého prvního TUT Co první uděláme: Zapíšeme include, a DEFINE barvy - #incldue <a_samp> #define COLOR_BLUE 0x0060FFFF vytvoříme si: enum pInfo { Povolani, } new PlayerInfo[MAX_PLAYERS][pInfo]; do OnGameModeInit nebo do OnFilterScriptInit vložíme: SetTimer("Vyplaty",1000*60*40,true); // což nám stupstí opakovací TIMER který vykoná funkci každich 40minut - 1000*60 = 1MIN pak eště to vynásobý 40 což nám dá 40minut. vytvoříme jsi public pod názvem Vyplaty takže forward Vyplaty(); // Forward vytvoří public public Vyplaty() // Vytvorený public. { return 1; } tak dotoho vložíme: for(new playerid; playerid<MAX_PLAYERS; playerid++) // toto přesně nevím co znamená takže vám to nevysvětlím. { } samozřejmě vše nad return, tak a tet pokud máte náké povolání tak si dáte: if(PlayerInfo[playerid][Povolani]==0)//Zde v závorkách si to nahradte vlastní podmínkou { GivePlayerMoney(playerid,500);// Nastaví hráči peníze. SendClientMessage(playerid, COLOR_BLUE, "Obdržel si výplatu. 500$");// Zde můžete ale i nemůsíte vypisovat že obdržel výplatu a o hodnotte kterou si nastavite } else if(PlayerInfo[playerid][Povolani]==1) // Zde v závorkách si to nahradte vlastní podmínkou { GivePlayerMoney(playerid,1500); // Nastaví hráči peníze. SendClientMessage(playerid, COLOR_BLUE, "Obdržel si výplatu. 1500$");// Zde můžete ale i nemůsíte vypisovat že obdržel výplatu a o hodnotte kterou si nastavite } else if(PlayerInfo[playerid][Povolani]==2)//Zde v závorkách si to nahradte vlastní podmínkou { GivePlayerMoney(playerid,1500);//Nastaví hráči peníze SendClientMessage(playerid, COLOR_BLUE, "Obdržel si výplatu. 1500$"); // Zde můžete ale i nemůsíte vypisovat že obdržel výplatu a o hodnotte kterou si nastavite } tak a pokud to zamestnaní nemáte tak zadáte toto: GivePlayerMoney(playerid, 1500);//Nastaví hráči peníze SendClientMessage(playerid, COLOR_BLUE, "Obdržel jsi výplatu. 1500$");// Zde můžete ale i nemůsíte vypisovat že obdržel výplatu a o hodnotte kterou si nastavite Tak. Cele to bude vypadat z povoláním: #include <a_samp> #include <YSI\y_ini> #define COLOR_BLUE 0x0060FFFF enum pInfo { Povolani, } new PlayerInfo[MAX_PLAYERS][pInfo]; public OnGameModeInit() { SetTimer("Vyplaty",1000*60*40,true); return 1; } forward Vyplaty(); public Vyplaty() { for(new playerid; playerid<MAX_PLAYERS; playerid++) // cyklus for (protože od verze 0.3e SA-MP odendalo cyklus z fce playerid) { if(PlayerInfo[playerid][Povolani]==0)//Zde v závorkách si to nahradte vlastní podmínkou { GivePlayerMoney(playerid,500);// Nastaví hráči peníze. SendClientMessage(playerid, COLOR_BLUE, "Obdržel si výplatu. 500$");// Zde můžete ale i nemůsíte vypisovat že obdržel výplatu a o hodnotte kterou si nastavite } else if(PlayerInfo[playerid][Povolani]==1) // Zde v závorkách si to nahradte vlastní podmínkou { GivePlayerMoney(playerid,1500); // Nastaví hráči peníze. SendClientMessage(playerid, COLOR_BLUE, "Obdržel si výplatu. 1500$");// Zde můžete ale i nemůsíte vypisovat že obdržel výplatu a o hodnotte kterou si nastavite } else if(PlayerInfo[playerid][Povolani]==2)//Zde v závorkách si to nahradte vlastní podmínkou { GivePlayerMoney(playerid,1500);//Nastaví hráči peníze SendClientMessage(playerid, COLOR_BLUE, "Obdržel si výplatu. 1500$"); // Zde můžete ale i nemůsíte vypisovat že obdržel výplatu a o hodnotte kterou si nastavite } } return 1; // Ukončení publicu } A když tedy to povolání nemáme tak: #include <a_samp> #define COLOR_BLUE 0x0060FFFF public OnGameModeInit() { SetTimer("Vyplaty",1000*60*40,true); return 1; } forward Vyplaty(); public Vyplaty() { for(new playerid; playerid<MAX_PLAYERS; playerid++) // cyklus for (protože od verze 0.3e SA-MP odendalo cyklus z fce playerid) { GivePlayerMoney(playerid, 1500);//Nastaví hráči peníze SendClientMessage(playerid, COLOR_BLUE, "Obdržel jsi výplatu. 1500$");// Zde můžete ale i nemůsíte vypisovat že obdržel výplatu a o hodnotte kterou si nastavite } return 1; // Ukončení publicu } Doufám že se mi moj první TUT povedl. a doufám že jsem vám pomohol, prosím ohodnotte ho od 1/10 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ý
  23. Původně jsem to v plánu neměl, ale rozhodl jsem se, že tu trochu objasním, jak funguje ternární operátor ? : Obtížnost: Jak to funguje Nejprve trochu nezbytné teorie, tento operátor se nazývá ternární, protože, jako jediný v pawn, pracuje se třemi operandy. první operand ? druhý operand : třetí operand _ Operandem nazýváme výraz, se kterým operátor pracuje. Tohle by myslím stačilo, teď se podívejme na to, jak funguje. logický výraz ? pravda : nepravda _ Operátor nejprve vyhodnotí logický výraz, pokud je tento výraz pravdivý (true), vrátí to, co je za otazníkem. Pokud je výraz nepravdivý (false), tak vrátí to, co je za dvojtečkou. Uvedu příklad: #define CERVENA 0xFF0000FF #define MODRA 0x0000FF00 new color; color = GetPlayerTeam(playerid) == 1 ? CERVENA : MODRA; Nejprve dojde k vyhodnocení logického výrazu, kterým je GetPlayerTeam(playerid) == 1. Pokud hráčův tým je skutečně tým s ID 1, tak se do proměnné color uloží hodnota za otazníkem, tedy CERVENA. Pokud ovšem má hráčův tým jiné ID, uloží se do proměnné hodnota za dvojtečkou, tedy MODRA. Využití v praxi Ne všechno se dá pochopit z teorie, proto je lepší to ukázat na několika příkladech z praxe. Hráčův tým Vezměme si ještě jednou příklad seshora a trochu jej upravme. Budeme chtít, aby se proměnné color nastavila CERVENA, pokud bude hráčův tým mít ID v rozmezí od 1 do 10. Pokud ne, nastaví se proměnné hodnota MODRA. Jak to lze řešit přes podmínky: if(GetPlayerTeam(playerid) >= 1 && GetPlayerTeam(playerid) <= 10) color = CERVENA; else color = MODRA; _ Jak my to vyřešíme šikovně přes ternární operátor: color = GetPlayerTeam(playerid) >= 1 && GetPlayerTeam(playerid) <= 10 ? CERVENA : MODRA; GetPlayerTeam(playerid) >= 1 && GetPlayerTeam(playerid) - logický výraz CERVENA - hodnota, která se uloží, když je logický výraz pravdivý/true MODRA - hodnota, která se uloží, když je logický výraz nepravdivý/false Pokud se v tom pomalu ztrácíte a přijde vám to nepřehledné, můžete si to ozávorkovat: color = (GetPlayerTeam(playerid) >= 1 && GetPlayerTeam(playerid) <= 10) ? (CERVENA) : (MODRA); _ Else if? Někteří z vás si možná řeknou "A co když potřebuji další podmínku, tedy else if?!" I tohle je samozřejmě pomocí ternárního operátoru možné, ale předem vás varuji, že se v tom možná začnete ztrácet. Zadání je následující: pokud má hráčův tým ID 1, nastaví se CERVENA, pokud má ID 2, nastaví se MODRA, pokud má jiné ID, nastaví se ZELENA. color = (GetPlayerTeam(playerid) == 1) ? (CERVENA) : ((GetPlayerTeam(playerid) == 2) ? (MODRA) : (ZELENA)); Za dvojtečku jsme přidali další ternární operátor. Pokud se ID rovná jedné, není problém, nastaví se CERVENA. Pokud se jedné nerovná, přeskočí za dvojtečku, zde narazí na další ternární operátor. Vyhodnotí další logický výraz. Pokud se ID rovná dvěma, nastaví se hodnota MODRA. Pokud to nebude ani jedna a ani dva, tak je to logicky jiné ID => nastaví se ZELENA. Šlo by to takhle větvit i dál, vždy by se za dvojtečku přidal další ternární operátor, ale při větším počtu bude lepší využít klasických podmínek, popř. switche. Příklad na závěr A dáme si ještě příklad na závěr. Skloňování v češtině programátorům leckdy dost komplikuje práci, výsledek výpisu hlášek se nám mnohdy nelíbí, například tady: new pocetHracu = 3,str[145]; format(str,sizeof str,"%i hráčů na serveru.",pocetHracu); SendClientMessageToAll(-1,str); _ Server nám vypíše tohle: 3 hráčů na serveru. _ Ale my chceme, aby vypisoval: 1 hráč na serveru. 2/3/4 hráči na serveru. 5/6/atd. hráčů na serveru. _ Zkrátka aby to vypsalo správný tvar slova hráč podle počtu. Lze to řešit přes podmínky nebo switch: switch(pocetHracu) { case 1: format(str,sizeof str,"%i hráč na serveru.",pocetHracu); case 2,3,4: format(str,sizeof str,"%i hráči na serveru.",pocetHracu); default: format(str,sizeof str,"%i hráčů na serveru.",pocetHracu); } _ Ale my si to zkrátíme na jeden řádek pomocí ternárního operátoru. format(str, sizeof str,"%i %s na serveru.",pocetHracu,(pocetHracu == 1) ? ("hráč") : ((pocetHracu < 5) ? ("hráči") : ("hráčů"))); Za specifikátor %s se dosadí jeden z tvarů slova hráč. Je to také krásná ukázka toho, že ternární operátor lze použít i v parametru funkce. Ještě jedno upozornění na závěr, když má tento operátor vracet řetězec, tak jej uzavřete do závorek vždy! Nevím, zda problém stále trvá, ale dříve byly problémy s tím, že když to nebylo v závorkách, pawno mohlo spadnout. Edit: Potvrzeno, problém stále trvá, pokud řetězec do závorek neuzavřete, kompilátor přestane pracovat. Tímto ukončuji návod, doufám, že si z něj někteří něco odnesou a že vám tento operátor třeba v něčem ulehčí nebo pomůže. Pokud jste narazili na nějakou chybu nebo se chcete na něco zeptat nebo se jen vyjádřit, pište. Ověřený návod Tento návod prošel validací, a lze ho proto považovat za ověřený.
  24. Zdravím vás. Rozhodl jsem se udělat menší video tutorialek. Na headshot script Pomocí Sniperu Je to lehké stačí pochopit funkce. Překlelp jsem se v textu což uvidíte ve videu. -Vím že můj hlas je divnej Když se poslouchám.
  25. Zdravím vás rozhodl jsem se udělat tutorial jak dát vlastní písničku do Radia. Pomocí svého Webu. (Tím pádem jistota že písničky budou hrát i když budete mít winamp vypnutý.) Řekl bych že mužem jít nato. 1.Krok Najdete mi nějaký pěkný web.Stačí zadarmo nějaký slabší z prostorem. Např: sweb.cz 2.Krok Dejme tomu že budem natom SWEBU Vytvoříme Účet a Zaregistrujeme se 3.Krok Půjdeme do Správce Souboru FTP Kde nahrajeme naší písničku Pak rozklikneme naší písničku 1 Krok.=Správce Souborů 2 Krok = Nahraní souboru - Vyberem Písničku 3 Krok .Rozkliknem písničku Po rozkliknutí se dostanem jsem 4.Krok Jak zkopírujem odkaz: Půjdem pro programu Winamp http://www.stahuj.centrum.cz/multimedia/mp3_a_audio/prehravace/winamp/ Po otevření Půjdem v Levo nahoře -->> File Kde poté dáme PlayURL Kam dáme náš odkaz: Pak dáme View file info Kde se nám otevře tato tabulka Ve které zkopírujeme horní odkaz Už jdem do pawna ! Zapneme PAWNO Vytvoříme si třeba dialog na příkaz /rap Pomocí INCLUDU ZCMD CMD:rap (playerid, params[]) { ShowPlayerDialog(playerid,1, DIALOG_STYLE_LIST, "Výběr Songů CZ/SK Rap:","Majk Spirit- Legendárná \nMajk Spirit - Ženy treba Lubit\nTafrob a Jay - Bratři jak se patří\nTafrob - Rolovací\nEktor - Je mi to Fuk\nEktor - Jak Jinak\nDJ Wich _ Rasco (The Untouchables) - Grizzly (CZ_SK rmx)", "Okey", "Ukončit"); return 1; } ShowPlayerDialog = Otevření Dialogu playerid = Že se otevře hráči který napiše /Rap takže = Vaše ID 1 = ID Dialogu DIALOG_STYLE_LIST = Styl Dialogu Pokud neovládáte Dialog určitě Informace najdete zde na: pawno.cz Poté co jsme si vytvořili vyvolaní dialogu ted do něj musíme dát ty funkce: A aby ste to nekopčili dáme vám obrázek: PlayAudioStreamForPlayer = Spuštění Audio Streamu pro Hráče playerid = id hráče ( Takže vaše) " odkaz " = Nezapomeňte na uvozovky ); = Ukončení Funkce A máme hotovo mužeme jít do hry kde napišem /Rap a máme radio
×
×
  • Create New...