Jump to content

Search the Community

Showing results for tags 'pawn'.

  • 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. Zdravím, hledám nějakého pawnera, který by pro mě udělal mód. Nabízím 0-2500 kč na paypal nebo na účet. Pokud si ještě někdo pamatujete mod Miami City, tak přesně něco podobného bych chtěl. Samozrejmě mi stačí, když mi někdo nějaký môd prodá. Neberu žádné RZE apod. Hledám mod, ve kterém je house system, vehicle system ( tim myslím ulozeni auta apod. ) a dále jobs system ( nejlepe přesně podle modu miami city ) . Pokud máte někdo mod podobný mým představám a nebo by byl ochotný investovat čas a splnit mé podmínky a napawnit mi ten mod tak mi prosím napistě. Dík
  2. Dobrý den, hledám pawnera který by zvládnul zprovoznit registraci na mém roleplay serveru který jsem si koupil, problém na serveru je ten že tam byla registrace přes webové stránky - ucp, takže když se připojím na server tak mě to napiše že se musím registrovat na strankách v ucp a kickne mě to, když jsem ucp odstranil všechno deifnice i ten text a kick, tak se dialog s registraci nezobrazil ona tam je nějaká registrace ale byla vypnuta takže tam je jen login, přidám zde fotku a kod, davám to do téhle sekce protože chci aby mě to někdo udělal a já ho za to finanče odměním, okolo 100 kč+- uvidíme za jakou určitou dobu to zvládnete. Díky předem. screen s ucp: screen bez ucp:
  3. Zdravim. Hladam pawnera na FreeR RP server z nazvom the Crime Nights. Jednalo by sa o napawnovanie mapy v LS. Co sa tika objektov a mapovania vsetko je spravene uz sa naozaj caka len na to pawno. Ponuka za zrealizovanie celkovehio projektu vychadza od 60-100Eur . (Zalezi aky je pawner skuseny a na kolko sa bude drzat manualu). Svoje referencie ci otazky smerujte na skype : Omen32o Dakujem.
  4. Kazma

    script Hostname Changer

    Zdar! Dneska sem se nudil tak sem se rozhodl udělat Hostname Changer nebo Změna názvu serveru. Záleží na vás jak si to přeložíte Žádné chyby tam nejsou. Jediný "include" který potřebujete je "a_samp" který by jste měli mít už ve složce "includes" automaticky. PASTEBIN https://pastebin.com/9LMDbtKf Myslím si že nejste až tak tupý aby jste nevěděli jak to změnit. V případě problému mně kontaktujte do SZ tzv. Soukromá zpráva S pozdravem. Kazma // Edit! 27.5.2017 / 18:48 Opravena chyba | new var = random(5) https://pastebin.com/F1G8F602
  5. Obtížnost: Osnova: 1. Úvod, co je to funkce; 2. Definice funkce a její části; 3. Parametry; 4. Návratová hodnota; 5. Závěr. 1. Úvod, co je to funkce Zdravím, tímto návodem konečně dokončím šňůru návodů pro začátečníky. Posledním tématem, které jsme ještě nestihli probrat, jsou funkce. O čem je řeč? Funkce jsou takové části kódu, které lze volat v různých částech skriptu. Někdy se lze také setkat s pojmem podprogram (ačkoliv to není to samé – podprogramem mohou být i metody, ale to se nás ani Pawn netýká). Účel je jasný – abychom nemuseli psát tentýž kód na více místech, napíšeme jej jen jednou a voláme jej tam, kde potřebujeme. Přináší nám to hned několik benefitů – kratší a přehlednější kód, při úpravě kódu jej stačí upravit na jednom místě, totéž platí pro opravy chyb. Počas skriptování SA:MP skriptů se setkáváme s funkcemi nepřetržitě, jmenovitě například funkce GetPlayerName, SendClientMessage, strval, ale i OnPlayerConnect či OnFilterScriptInit. 2. Definice funkce a její části Když už máme představu, co to funkce je, měli bychom si ukázat, jak ji vytvořit. Každá funkce má svůj název (identifikátor), dále pak parametry, o kterých si řekneme za chvíli, tělo, do kterého vkládáme kód, a jako poslední návratovou hodnotu (i když tu nemusí mít nezbytně, o tom za chvíli). Ukažme si to na kódu: Secist(cislo1, cislo2) { new suma; suma = cislo1 + cislo2; return suma; } Teď si určíme jednotlivé části funkce: – identifikátor: Secist – parametry: cislo1 a cislo2 – tělo funkce: všechno mezi složenými závorkami {} – návratová hodnota: return suma; Jak je vidět, jako první se uvádí identifikátor, poté následují parametry ohraničené kulatými závorkami, následně se píše tělo kódu do složených závorek a do těla se uvádí návratová hodnota příkazem return. Výše uvedená funkce slouží k součtu dvou celých čísel. 3. Parametry Díky parametrům můžeme funkci předávat vstupní hodnoty a/nebo ovlivňovat to, jak se bude chovat. U naší sčítací funkce parametry slouží k předání sčítanců. Ale například funkce strcmp má parametr ignorecase, který nám určuje, zda má funkce ignorovat rozdíl mezi velkými a malými písmeny. Tento parametr ovlivňuje chování funkce. Parametry funkcí v Pawn mohou být různého datového typu (tedy celá čísla, desetinná čísla, logické hodnoty, řetězce atd.) a může jich být libovolný počet. Jsou funkce, které nemají žádné parametry (kulaté závorky ale musíme uvést vždy – ()), jsou takové, které jich mají i 10. Zde je pár funkcí na ukázku, každá s jiným počtem parametrů (všechny lze dohledat na SA:MP wiki): GetTickCount(); //funkce bez parametrů SendClientMessage(playerid, color, const message[]); //funkce se 3 parametry AddPlayerClass(modelid, Float:spawn_x, Float:spawn_y, Float:spawn_z, Float:z_angle, weapon1, weapon1_ammo, weapon2, weapon2_ammo, weapon3, weapon3_ammo); //funkce s 11 parametry Lze si všimnout, že u některých se objevují věci jako Float:, [] apod. Právě tyto, prozatím tomu říkejme "věci", nám určují, jaký datový typ bude daný parametr mít. Seznam nejčastěji používaných datových typů: playerid // když neuvedeme nic, bere to jako celé číslo Float:x // Float: nám značí desetinné číslo bool:ignorecase // bool: nám značí logickou hodnotu (true/false) message[] // hranaté závorky znamenají řetězec (nebo pole, viz předchozí návody) Zbývá nám uvést si, jak takové parametry dosazovat při volání funkce. Jednoduše za ně dosadíme skutečné hodnoty (přesněji argumenty) v tom pořadí, v jakém jsme je definovali: GetTickCount(); //nic se nemění SendClientMessage(0, 1, "Ahoj, světe!"); //dosazení argumentů (skutečných hodnot) Nad rámec návodu (pro zvídavé): 4. Návratová hodnota Na začátku jsme řekli, že funkce má také návratovou hodnotu. Přesněji řečeno, může mít, ale nemusí. Přesně tak, funkce žádnou návratovou hodnotu mít nemusí. V některých jazycích se pak funkce bez návratové hodnoty nazývá procedurou. V kódu naší sčítací funkce je vidět, že hodnotu vrátíme příkazem return. Ve funkci můžeme tento příkaz použít vícekrát (často to souvisí s podmínkami a větvením), ale pravidlem je, že musí vždy vrátit hodnotu stejného datového typu. Kompilátor nám neumožní vrátit jednou celé číslo a jednou řetězec, to prostě nejde. Když už jsme zmínili datové typy, je třeba si dávat pozor na jednu věc. Pokud vracíme hodnotu jinou než celé číslo či řetězec, musíme před identifikátor uvést příslušný tag (teď už nepíši "věc", ale tag). Upravme si tedy naši funkci pro sčítání dvou desetinných čísel: Float:Secist(Float:cislo1, Float:cislo2) // před názvem nám přibyl tag Float { new Float:suma; suma = cislo1 + cislo2; return suma; } Zde je vidět, že před názvem nám přibylo Float:. Je to nutné pro správný chod funkce. Kdybychom vraceli např. logické hodnoty, byl by tam tag bool:. A jak je to tedy s funkcemi (procedurami, jestli chcete), které nic nevracejí? Jsou dvě možnosti, buď uvedeme prázdný return – return; – nebo neuvedeme nic. Je to jen na vás, běžná je druhá varianta (neuvádět nic). Ukázka: Vypis(const message[]) { print(message); return; } Vypis2(const message[]) { print(message); } 5. Závěr A tím jsme se dostali jak k závěru tutoriálu, tak k závěru celé série. Děkuji všem, kteří si návod přečetli, a obdivuji všechny, kteří prošli celou sérií. Doufám, že jste se dozvěděli něco nového, pokud ne, alespoň jste si to zopakovali. Prozatím neplánuji začínat další sérii návodů, ale je možné, že se sem tam něco objeví. Ještě jednou děkuji a platí to, co vždycky – pokud jste našli nějakou chybu či nesrovnalost nebo se jen chcete na něco zeptat, zanechte mi vzkaz pod tímto příspěvkem.
  6. Tanga

    script Jednoduchý randomName()

    V škole sme mali nejaký name generator a bol riešený celkom zaujímavo, teda tu dávam takú jednoduchú verziu v Pawn. To "zaujímavé" je práca so samohláskami a spoluhláskami jednotlivo pomocou arrayov. Skript môžete tiež použiť len-tak vo svojom móde. Tvar stock getRandomName(minimalLength, maximalLength); Chybné vstupy nie sú ošetrené a server pri nich môže, ale aj nemusí padnúť. Skript funguje pre hodnoty minimalLength >= 3 maximalLength <= MAX_PLAYER_NAME Použitie print(getRandomName(4, 9)); // dlzka >= 4 a <= 9 print(getRandomName(3, 8)); -> Lurelo Raqu Skript // Returns a random name of minimalLength and maximalLength // incorrect values are not handled, so server might or might not crash. // for example getRandomName(-4, 9) wouldnt crash the server stock getRandomName(minimalLength = 3, maximalLength = MAX_PLAYER_NAME) { new vowels[] = "aeiou"; // optionally add "y" new consonants[] = "bcdfghjklmnpqrstvwxz"; new name[MAX_PLAYER_NAME]; new length = minimalLength + random(maximalLength - minimalLength); for (new i = 0; i < length; i += 2) name[i] = consonants[random(sizeof(consonants) - 1)]; for (new i = 1; i < length; i += 2) name[i] = vowels[random(sizeof(vowels) - 1)]; name[0] = name[0] - 32; // first letter is mayuscule return name; }
  7. Cíl scriptu Cílem je implementovat funkce dle prototypů a popisu v zadání. Jedná se o funkce pro práci s daty. Princip je podobny funkciam PVar. Pojde o premenne, ktore budu mat svoj nazov a svoje id. Bude mozne s nimi pracovat podla id aj podla nazvu. Kazda premenna bude pole velkosti MAX_VAR_INDEX, podobne ako PVar je premenna velkosti MAX_PLAYERS. S kazdym indexom sa bude pracovat zvlast. Co ovlivní hodnocení Hodnocení bude záležet na níže uvedených faktorech (od nejdůležitějšího). 1. Přeložitelnost a chybovost (chyby, pády a varování kompilátoru, chyby při běhu [klikněte pro příklad]); 2. Správná implementace (dodržení zadání) a funkčnost; 3. Ošetření neočekávaných vstupů a hodnot; 4. Optimalizácia kódu 5. Přehlednost kódu. Povolené "warning 203: symbol is never used" a "error 013: no entry point (no public functions)" Tieto chyby su povolene, pretoze ide skorej o include nez o script. Váš kód by nemal obsahovať nič, čo nieje súčasť vášho riešenia. Funkcie a globálne premenné, ktoré niesú súčasťou zadania by mali byť statické. Optimalizujte na vyuzitie CPU, az potom na RAM a na realne pouzivanie (funkcie Var_Create a Var_Destroy mozu byt pomalsie, kedze sa budu pouzivat malo, ale ostatne by mali byt co najrychlejsie). Co je zakázáno Níže uvedené funkce a způsoby programování jsou zakázány a za jejich použití bude značná ztráta bodů. 1. Jakékoliv knihovny (includy), které nejsou součástí a_samp.inc; 2. Jakékoliv pluginy. 3. Definovanie funkcie main alebo OnFilterScriptInit 4. Pouzivat funkcie PVar, SVar, setproperty a getproperty Datum a způsob odevzdání Hotové scripty zasílejte vEnd-ovi pomocí soukromé zprávy. Název scriptu bude ve tvaru vas_nick_na_foru.inc. Scripty mi můžete zasílat do 28. 2. 2017. Zadání 1. Vlozte do suboru: #define INVALID_VAR_ID -1 2. Vytvorte define ak neexistuju: #define MAX_VAR_INDEX 100 // Index moze byt od 0 do MAX_VAR_INDEX-1 #define MAX_VAR_NUM 1000 // Maximalny pocet premennych Var Ak uz je MAX_VAR_INDEX alebo MAX_VAR_NUM definovany, pouzije sa ten. 3. Vytvorte tag: Error: Tento tag obsahuje vystup funkcii. Premenna s tymto tagom sa musi rovnat true ak sa nevyskytla chyba a false ak sa chyba vyskytla. Taktiez podmienka if(error) musi byt splnena vtedy a len vtedy, ak funkcia neprebehla uspesne (vyskytla sa chyba alebo ak hodnota nieje definovana. Napriklad: Error:-376437). Funkcie musia vracat rozne hodnoty pre rozne druhy chyb. Odporucame pouzit enum na jednotlive hodnoty napriklad: enum Error { Var_Err_Invalid = 0, Var_Err_OK = 1, // uspesne hodnoty su kladne Var_Err_AllReturned = 2, Var_Err_SomeReturned = 3, Var_Err_NotFound = -1, // chyby su zaporne Var_Err_BadIndex = -2, // ... } 4. Implementujte následující funkce a) Var_Create forward Var:Var_Create(const name[]); Účel a implemenační detaily: Vytvorit premennu s nazvom name. Premenna musi na vsetkych indexoch obsahovat hodnotu 0. Ci toto docielite v Create alebo Destroy je na vas. Návratová hodnota: id vytvorenej premennej – uspesne vytvorenie; id premennej s danym nazvom – premenna so zadanym nazvom uz existuje; INVALID_VAR_ID – nastala chyba; Var_Destroy forward Error:Var_Destroy(Var:id); Účel: Odstrani premennu id. Návratová hodnota: Chyba alebo uspech. Příklad použití: new Var:var = Var_Create("Zabitia"); Var_Destroy(var); . c) Var_DestroyNamed forward Error:Var_DestroyNamed(const name[]); Účel a implementační detaily: Odstrani premennu s nazvom name. Návratová hodnota: Chyba alebo uspech. Příklad použití: Var_Create("Zabitia"); Var_DestroyNamed("Zabitia"); . d) Var_Set forward Error:Var_Set(Var:id, index, value); Účel: Nadstavit hodnotu premennej id na indexe index na hodnotu value. Návratová hodnota: Chyba alebo uspech. Příklad použití: new Var:var = Var_Create("Zabitia"); Var_Set(var, 0, 22); Var_Destroy(var); . e) Var_SetNamed forward Error:Var_SetNamed(const name[], index, value); Účel: Nadstavit hodnotu premennej s nazvom name na indexe index na hodnotu value. Návratová hodnota: Chyba alebo uspech. Příklad použití: new Var:var = Var_Create("Zabitia"); Var_SetNamed("Zabitia", 0, 22); Var_Destroy(var); . f) Var_Get forward Error:Var_Get(Var:id, index, &value); Účel a implementační detaily: Vlozi hodnotu premennej id na indexe index do parametru value. Návratová hodnota: Chyba alebo uspech. Příklad použití: new Var:var = Var_Create("Zabitia"); Var_Set(var, 0, 22); new value; Var_Get(var, 0, value); printf("Zabitia: %i", value); // vypise sa 22 Var_Destroy(var); . g) Var_GetNamed forward Error:Var_GetNamed(const name[], index, &value); Účel: Vlozi hodnotu premennej s nazvom name na indexe index do parametru value. Návratová hodnota: Chyba alebo uspech. Příklad použití: new Var:var = Var_Create("Zabitia"); Var_Set(var, 0, 22); new value; Var_GetNamed("Zabitia", 0, value); printf("Zabitia: %i", value); // vypise sa 22 Var_Destroy(var); . h) Var_GetID forward Var:Var_GetID(const name[]); Účel: Ziska id premennej s nazovm name. Návratová hodnota: ID premennej. INVALID_VAR_ID v případě, že premenna s nazvom name neexistuje! Příklad použití: Var_Create("Zabitia"); new Var:var = Var_GetID("Zabitia"); Var_Destroy(var); . i) Var_GetOrdered forward Error:Var_Ordered(Var:id, array[], size = sizeof(array)); Účel a implementační detaily: Ziska prvych size indexov zoradenych zostupne (od najvacsieho po najmensi). Návratová hodnota: Chyba alebo typ uspechu. Musi vratit rozne hodnoty ak sa do pola zmestili vsetky indexy a ak nie. Příklad použití: new Var:var = Var_Create("Zabitia"); Var_Set(var, 0, 22); Var_Set(var, 1, 33); Var_Set(var, 2, 27); new arr[3]; Var_Ordered(var, arr, 3); // Ziska top 3 zabijakov // arr[0] = 1 // arr[1] = 2 // arr[2] = 0 . j) Var_GetError forward bool:Var_GetError(Error:error, str[], maxsize = sizeof(str)); Účel a implementační detaily: Ziska cloveku citatelny popis chyby error a vlozi ho do str. Ak je popis chyby dlhsi ako maxsize, tak ho oreze. Vrati "Uspech" alebo niec podobne ak nejde o chybu ale uspech. Návratová hodnota: true pre uspech, false ak ide o neplatnu chybu. Příklad použití: new Var:var = Var_Create("Zabitia"); new Error:err = Var_SetNamed("Zabitia", 0, 22); new str[128]; Var_GetError(err, str); print(str); // vypise chybu
  8. 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.
  9. Cíl scriptu Cílem je implementovat funkce dle prototypů a popisu v zadání. Jedná se o funkce pro práci s řetězcem a o funkce pro nenáročné výpočty a úkony. Co ovlivní hodnocení Hodnocení bude záležet na níže uvedených faktorech (od nejdůležitějšího). 1. Přeložitelnost a chybovost (chyby, pády a varování kompilátoru, chyby při běhu [klikněte pro příklad]); 2. Správná implementace (dodržení zadání) a funkčnost; 3. Ošetření neočekávaných vstupů a hodnot; 4. Přehlednost kódu. Co hodnocení neovlivní V prvním kole nebude rozhodovat optimalizace kódu. Co je zakázáno Níže uvedené funkce a způsoby programování jsou zakázány a za jejich použití bude značná ztráta bodů. 1. Všechny funkce z knihovny string.inc (strlen, strcmp, strval apod.); 2. Klíčové slovo stock u definic funkcí; 3. Jakékoliv jiné knihovny (includy), které nejsou součástí a_samp.inc; 4. Jakékoliv pluginy. Datum a způsob odevzdání Hotové scripty zasílejte mně pomocí soukromé zprávy. Název scriptu bude ve tvaru vas_nick_na_foru.pwn. Scripty mi můžete zasílat do 22. 1. 2017. Zadání 1. Implementujte následující funkce pro práci s řetězci a) StringCompare forward StringCompare(const str1[], const str2[], bool:ignorecase=false, length=-1); Účel a implemenační detaily: Porovnat řetězce str1 a str2. Parametr ignorecase s hodnotou true nebude rozlišovat velká a malá písmena. Parametrem length lze určit, kolik znaků od začátku se bude porovnávat. Má-li zápornou hodnotu (výchozí je -1), budou se porovnávat celé řetězce. Návratová hodnota: 0 – řetězce jsou totožné; 1 – řetězec str1 je delší; -1 – řetězec str2 je delší; 69 – řetězce jsou stejně dlouhé, ale nejsou totožné. Příklad použití: new res; res = StringCompare("Ahoj", "Ahoj"); //res bude mít hodnotu 0 res = StringCompare("Ahoj", "ahoj svete!", true, 4); //res bude mít hodnotu 0 res = StringCompare("Ahoj", "ahoj"); //res bude mít hodnotu 69 res = StringCompare("Ahoj svete!", "Ahoj"); //res bude mít hodnotu 1 res = StringCompare("Ahoj", "Ahoj svete!"); //res bude mít hodnotu -1 . StringToValue forward StringToValue(const str[]); Účel: Převést řetězec str na celé číslo (kladná i záporná čísla). Návratová hodnota: Převedené číslo. 0 v případě, že byl řetězec prázdný nebo obsahoval i jiné znaky než číslice a mínus na začátku – ošetřte! Příklad použití: new res; res = StringToValue("0123"); //res bude mít hodnotu 123 res = StringToValue("-1445"); //res bude mít hodnotu -1445 res = StringToValue("4a8 58"); //res bude mít hodnotu 0 . c) StringConcat forward StringConcat(dest[], const src[], length = sizeof src, maxlen = sizeof dest); Účel a implementační detaily: Spojit řetězce dest a src a nový řetězec uložit do řetězce dest. Parametrem length lze určit, kolik znaků z řetězce src se má spojit s řetězcem dest. Velikost řetězce dest je uložena v parametru maxlen. Návratová hodnota: 1 – funkce se provedla úspěšně; 0 – nastala chyba (záporný parametr length apod. – ošetřte!). Příklad použití: new res[20+1] = "Ahoj, "; StringConcat(res, "svete!"); //res bude mít hodnotu "Ahoj, svete!" res = "Ahoj, "; StringConcat(res, "svete!", 2); //res bude mít hodnotu "Ahoj, sv" . d) StringTransliterate forward StringTransliterate(dest[]); Účel: Nahradit všechna diakritická znaménka (česká i slovenská) v řetězci dest vhodnými písmeny. Návratová hodnota: Žádná. Příklad použití: new res[] = "Příliš žluťoučký kůň úpěl ďábelské ódy."; StringTransliterate(res); //res bude mít hodnotu "Prilis zlutoucky kun upel dabelske ody." . e) StringAnalyze forward StringAnalyze(const dest[], const sequence[], &numcount, &letcount, &specount, &seqcount); Účel: Zjistit, kolikrát se v řetězci dest vyskytuje posloupnost znaků sequence, a tento počet uložit do parametru seqcount (rozlišují se velká a malá písmena). Zjistit, kolik obsahuje řetězec dest číslic, a tento počet uložit do parametru numcount. Zjistit, kolik obsahuje řetězec dest písmen, a tento počet uložit do parametru letcount (nerozlišují se velká a malá písmena). Zjistit, kolik obsahuje řetězec dest nealfanumerických znaků (znaky, které nejsou písmena ani číslice včetně mezer), a tento počet uložit do parametru specount. Návratová hodnota: Žádná. Příklad použití: new res[] = "ahahaha, 85,! mehehe, muhaha, AHAHAHA"; new num, let, spec, seq; StringAnalyze(res, "ha", num, let, spec, seq); //num bude mít hodnotu 2, let hodnotu 26, spec hodnotu 9 a seq hodnotu 5 . f) DecodeMorse (BONUS – nepovinné) forward DecodeMorse(const morsecode[]); Účel a implementační detaily: Do parametru morsecode se udává řetězec v morseovce, který je potřeba rozkódovat a vypsat do terminálu (funkce printf). Jednotlivá písmena se oddělují mezerou, slova lomítkem. Počítejte s tím, že zadaná morseovka bude vždy korektní, to znamená, že není třeba nic ošetřovat. Návratová hodnota: Délka dekódovaného řetězce. Příklad použití: DecodeMorse(".... . .-.. .-.. ---/.-- --- .-. .-.. -.."); //do terminálu se vypíše "Hello world" a návratová hodnota bude 11 . 2. Implementujte následující funkce pro nenáročné výpočty a úkony a) HexToDec forward HexToDec(strhex[]); Účel: Převést číslo šestnáctkové soustavy ve formě řetězce strhex na číslo desítkové soustavy. Návratová hodnota: Převedené číslo. -1 v případě, že je řetězec strhex prázdný nebo obsahuje jiné znaky než 0-9, A-F či a-f – ošetřte! Příklad použití: new str[] = "FF", hex; hex = HexToDec(str); //hex bude mít hodnotu 255 . BinToDec forward BinToDec(strbin[]); Účel: Převést číslo dvojkové soustavy ve formě řetězce strbin na číslo desítkové soustavy. Návratová hodnota: Převedené číslo. -1 v případě, že je řetězec strbin prázdný nebo obsahuje jiné znaky než 0 a 1 – ošetřte! Příklad použití: new str[] = "11111111", bin; bin = BinToDec(str); //bin bude mít hodnotu 255 . c) RandomEx forward RandomEx(min, max, excepts[], size = sizeof excepts); Účel a implementační detaily: Vygenerovat náhodné kladné číslo v rozsahu od min do max. Vygenerované číslo se nesmí shodovat s žádným číslem z pole excepts (velikost pole je uložena v parametru size). Návratová hodnota: Vygenerované náhodné kladné číslo. -1 v případě neúspěchu (min je větší než max, číslo není kladné apod. – ošetřte!). Příklad použití: new arr[] = {1, 2, 3}, randNum; randNum = RandomEx(1, 4, arr); //randNum bude mít hodnotu 4, protože čísla 1, 2, 3 jsou v poli arr randNum = RandomEx(1, 10, arr); //randNum bude mít hodnotu z rozsahu od 4 do 10 (1, 2, 3 opět nevyhovují) . d) FileRead forward FileRead(fpath[], arr[6]); Účel a implementační detaily: Přečíst 3 údaje ze souboru s cestou fpath, převést je na číslo pomocí funkce StringToValue a uložit je do pole arr na indexy 0, 1 a 2. Uložit 3 náhodně vygenerovaná čísla (funkce RandomEx) s rozsahem od 1 do 10 na indexy 3, 4 a 5. Tato čísla se nesmí shodovat s čísly na indexech 0, 1 a 2! Návratová hodnota: 1 – funkce se provedla úspěšně; 0 – nastala chyba (soubor se neotevřel správně, cesta k souboru neexistuje apod. – ošetřte!). Příklad použití: new arr[6]; FileRead("neco.txt", arr); . e) GetMinMax forward GetMinMax(arr[], &min, &max, size = sizeof arr); Účel: Zjistit minimální a maximální hodnotu z pole arr a indexy pole s minimální a maximální hodnotou uložit do parametrů min a max. Velikost pole arr je uložena v parametru size. Návratová hodnota: Žádná. Příklad použití: new arr[6] = {4, 5, 2, 6, 8, 7}, minVal, maxVal; GetMinMax(arr, minVal, maxVal); //minVal bude mít hodnotu 2 a maxVal hodnotu 4 . Soubor k funkci FileRead je k dispozici v přílohách (jak pro Windows, tak pro Linux – rozdílné odřádkování). file_windows.txt file_linux.txt
  10. Soutěž o nejlepšího pawn scriptera #2 Ano ano, po dvou nezdařených pokusech se našel další člověk, co chce tuhle šílenost obnovit. Ale než soutěž odsoudíte jako další nesplnitelný projekt a mě pošlete do háje, zkuste si alespoň přečíst, co vám chci říct. Předchozí pokusy nebyly dotaženy do konce či ztroskotaly na jiných věcech. Tato soutěž se liší v tom, že před začátkem bude řádně připravena. Právě kvůli předchozím zkušenostech nenecháme tentokrát nic náhodě. Jediné, co by se mohlo pokazit, je, že by mě přejel autobus, pak byste měli, jak se říká, po ptákách. O čem soutěž bude Stálice fóra si třeba pamatují zadání minulých soutěží. Byly to různé věci – kalkulačky, XML, house systémy. Ve všech případech šlo, víceméně, o prověření vašich znalostí pawn, ale často to zasahovalo i do SA:MP. Teď tomu tak nebude. Bez SA:MP funkcí se hravě obejdete, vystačíte si jen s konzolí, soubory a vašimi znalostmi jazyka. (Práci tvořte ve verzi pawn, kterou SA:MP používá!) Budou se prověřovat různé oblasti – znalost základních, ale i pokročilých konstrukcí pawn, logické uvažování, algoritmické myšlení, schopnost optimalizovat kód, schopnost psát čitelný kód apod. Organizace soutěže Soutěž bude rozdělena na dvě kola, a to na lehké a náročné. 1. kolo (lehké) Náročnost tohoto kola se bude některým zdát triviální, ale chceme dát šanci i méně zkušeným pawnerům. Prověřovat se budou elementární znalosti pawn (proměnné, podmínky, cykly, funkce apod.) a dovednost vymyslet a implementovat nenáročné algoritmy. V tomto kole nebude hodnocena optimalizace. První kolo bude probíhat 3 týdny ode dne zveřejnění zadání (ve zvláštním tématu). 2. kolo (náročné) Druhé kolo už prověří vaše schopnosti více, osobně doufám, že to pro vás bude alespoň trochu výzva. V tomto kole se hodnotí i optimalizace kódu. Toto kolo potrvá 3 týdny ode dne zveřejnění zadání (ve zvláštním tématu). V případě remízy... ...se pravděpodobně uchýlíme k dalšímu kolu, ale budeme se snažit to zhodnotit tak, aby k tomu nedošlo. Jak se připojit do soutěže K účasti není nutná registrace. Stačí mi během tří týdnů od spuštění daného kola zaslat soubor v tomto tvaru: vas_nick_na_foru.pwn. Zasílat mi jej můžete soukromou zprávou. Pozor, pokud se nezúčastníte prvního kola, nemůžete se zúčastnit ani druhého (nemělo by to cenu)! Pravidla Určitě se najdou experti, co si budou chtít ulehčit práci, takže stanovíme pár pravidel, která pokud nedodržíte, budete ze soutěže vyloučeni. 1. Je zakázáno kopírovat. Pokud zjistíme, že jste řešení nebo jeho část někde "obšlehli", budete ze soutěže vyloučeni, a to i v případných následujících soutěžích. 2. Je zakázáno žádat o pomoc s řešením zadání. Cílem je prokázat, že jste dostatečně schopní, abyste měli titul nejlepšího scriptera, ne ukázat nám, jak hezky umíte požádat. 3. Každé kolo může mít svá doplňující pravidla (např. zákaz použití té či oné funkce), za jejich porušení může být srážka bodů či vyloučení (bude blíže upřesněno v daném kole). Hodnocení No a teď jak to bude s hodnocením. Rozhodli jsme se, že nebudeme zavádět běžnou bodovou stupnici, jak to bylo v předchozí soutěži (v té před několika lety). Hodnocení scriptu bude uvedeno slovně formou poznámek k jednotlivým faktorům hodnocení (čtěte dál). Níže uvedené faktory budou ovlivňovat hodnocení (seřazeno hierarchicky, tedy od nejdůležitějšího po nejméně důležité). 1. Přeložitelnost a chybovost Tím jsou myšleny chyby, pády a varování kompilátoru a chyby při běhu. Pokud script ani nezkompilujeme, dojde k velké srážce bodů. Za varování a chyby při běhu budou také nemalé bodové srážky, jsou to věci, na které jste upozorněni a které lze opravit. 2. Správná implementace (dodržení zadání) a funkčnost Pokud přesně dodržíte pokyny v zadání, nemusíte se bát úbytku bodů za špatnou implementaci. Věci, co uděláte navíc, nebudou za bonusové body, pokud neuvedeme jinak. Funkčností se myslí to, že script bude dělat to, co má (např. funkce pro sečtení bude vracet součet a ne třetí odmocninu z násobku). 3. Ošetření neočekávaných vstupů a hodnot Nastanou případy, kdy budou porotci (ze zásady zákeřní ) zadávat při testování takové hodnoty, které by mohly ovlivnit funkčnost dané části kódu. Takové případy musíte ošetřit. Samozřejmě nelze myslet na všechno, takže něco vám uvedeme do zadání, ale na něco budete muset myslet sami. Zapojte analytické a logické myšlení a sledujte/přemýšlejte, co by se mohlo stát kdyby. Například budu mít funkci pro přepis jednoho znaku v řetězci na daném indexu. Index bude parametrem funkce. Co když zadám index větší, než je délka řetězce? Funkce se vám rozsype jako domeček z karet. Tohle je ukázka případu, který musíte ošetřit. 4. Optimalizace kódu (pouze ve druhém kole) Tohle asi bude bod, který o soutěži rozhodne. Ve druhém kole se bude porota zaměřovat i na optimalizaci vašeho kódu. Zde mě jeden z porotců upozornil, abych uvedl toto – na prvním místě je CPU, až pak RAM. Takže až budete své kódy optimalizovat, myslete nejdříve na zátěž procesoru a až poté na paměť (to není pokyn k tomu dělat 256bajtové řetězce na 20bajtový nick). 5. Přehlednost kódu Chápu, že každý má svůj styl zápisu kódu, to ale neznamená, že z toho musíte udělat nečitelnou haldu znaků a čísel. Tabujte, dělejte si poznámky, snažte se o to, aby kód měl strukturu. Za přehlednost se nebude strhávat moc bodů, ale jestli to chcete vyhrát, tak každý bod se hodí. Závěr A to by bylo prozatím vše. Jakmile bude připraveno první zadání, dám vám den dopředu vědět. Zatím mi můžete sdělit své názory, popř. mi položit otázky, a to níže v příspěvku.
  11. 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ý.
  12. Zdravím a vítám vás u prvního dílu pořadu "Dannyho epická výprava", který nese podtitul "Tajemství Javy". V tomto díle se vydává Danny na epickou výpravu a poznává javu. Upozornění: Podobnost s členem fóra je naprosto náhodná a vůbec se nejedná o Dannyho z fóra. Postava a situace jsou smyšlené. https://www.youtube.com/watch?v=h4z5Ma63sI4
  13. #emit ***** Rád bych vás chtěl informovat, že tento topic bude čistě jen o základních informacích. Vyhnu se stránkám textů jak funguje compiler, další formy preprocesorů... jelikož to není tak extrémně podstatné. Zdravím vás u návodu na nejtěžší látce v pawn. CO JE TO EMIT? Existují 2(možná víc) výborných anglických návodů na emit, ale v obou jsou asi 2 strany čisté teorie a informací, ohledně jak funguje compiler, jak vzniklo PAWN, jak funguje amxing, co je to opkód... takže najít tam prostě smysluplnou větu a odpověď na tuhle otázku tam není jednoduché, ale rád vám na ní odpovím já: emit nejsou nic více než jen pointery(jestliže nevíte, co je to pointer, budete se muset naučit teorii C++ především v oblasti pointerů, jelikož bez toho emit nepochopíte). Každá proměnná, kterou deklarujete má relevantní informace a to jméno, údaj a především adresu: new Promenna = 3; Vy vidíte pouze 2 informace a to jméno proměnné(Promenna) a údaj(3). Ale adresu ne. A s ní můžeme pracovat pomocí emitu. EMIT A PAWN Mezitím, co v C++ můžete pracovat s kolika pointery se vám zlíbí, v pawn na to máte pouze 2 pointery a to PRI(primární aka první) a ALT(alterantivní aka druhé). Obou můžete přiřadit hodnoty jak z lokálních tak i globálních proměnných(ano, skutečně emit potřebuje vědět, jestliže vkládáte údaje z globální či lokální), a jenom těmto 2 se mohou dít dané "operace"(sečtení, negace, odečtení aj). Určitě se někteří tedy ptáte k čemu je mi emit, když můžu jednoduše přiřaďovat a měnit hodnoty pomocí rovnítka? Ano, můžete ale pointery zjistí adresu proměnné. Najde její adresu, kde je přesně a přepíše údaj. Rovnítko "hledá", jak se jmenuje proměnná a přepíše údaj. Proto je taky emit rychlejší než operace. Nechápeme? Vysvětlím: V případě, že hledáte text(nebo-li jméno proměnné) tak je to pomalejší, jelikož se musí zjistit přesné jméno do poslední znaku, aby jsme neměli například proměnnou ahoj a Ahoj a nebral to jako 1 a tu samou. Ale, pod adresou si můžeme představit jako "id" té proměnné, a číslo se hledá podstatně jednodušeji, protože jediný způsob jak najít číslo je řádově počítat(0, 1, 2, 3, 4, 5...), a protože emit zná adresu proměnné(což neni nic více než číslo), proto je také rychlejší. UKÁZKA EMITU Emit se značí preprocesorovým znamínkem # a slovem emit: #emit Pro představuj tu je jednoduchá operace a to sečtení 2 proměnných a výsledek vložený do 3 proměnné: new Cislo1 = 11, Cislo2 = 22, Vysledek; #emit LOAD.S.PRI Cislo1 #emit LOAD.S.ALT Cislo2 #emit ADD #emit STOR.S.PRI Vysledek printf("%i", Vysledek); // 33 Teď si to postupně rozebereme: #emit LOAD.S.PRI Cislo1 Do primárního(prvního) pointeru načte a připíše hodnotu proměnné Cislo1 #emit LOAD.S.ALT Cislo2 Do alternativního(druhého) pointeru načte a připíše hodnotu proměnné Cislo2 #emit ADD Vezme hodnoty z primárního a alternativního a sečte je. #emit STOR.S.PRI Vysledek Výsledný údaj ze primární(jelikož add sečte a vepíše do primárního) a připíše jí do proměnné Vysledek. Pro uživatele, co ovládají C++, tak je to stejné(spíše podobné) jako: int Cislo1 = 11; int Cislo2 = 22; int Vysledek; int * p1 = &Cislo1; /* 0000 */ int * p2 = &Cislo2; /* 0004 */ Vysledek = *p1 + *p2; Tady bych to rád zakončil, jelikož jsem vám chtěl ukázat jen základy k emitu. Samozřejmě, emit jak píše Misiur v návodě http://forum.sa-mp.com/showthread.php?p=3430898 v případě tvorby filterscriptu či gamemodu ho vůbec nepotřebujete. Spíše se hodí pro tvorbu includů a knihoven kvůli rychlost. TEST RYCHLOSTI #emit vs konstantní #emit vs obyč. operace #emit: 13 Konstantní emit: 13 Operace: 26
  14. 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ý.
  15. 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ů.
  16. Zdravím, hledám programátora PAWN pro nový herní mód typu FREEROAM. Chápu, že programování nového herního módu, zvlášť na zakázku, je velmi časově a nervově náročná práce. Hledám proto zkušeného programátora, který je ochoten i pro budoucí spolupráci. Finanční ohodnocení za dokončení herního módu odhaduji na 10 000CZK. Tím práce ovšem nekončí a pokud programátor z nějakého důvodu nebude chtít spolupracovat dále, tak takového programátora nepotřebuji. Pokud si rozumíme, programátora PAWN hledám proto, protože o programování PAWN nevím nic a raději finančně ocením člověka, který tomu opravdu rozumí, takového člověka si samozřejmě budu "hýčkat" pro budoucí existenci herního módu - rozšíření, opravy bugů, změny, atp.. Vše bude jištěno smlouvou, aby v budoucnu nedošlo k nepříjemným situacím a samozřejmě pro ochranu díla. Myslím si tedy, že tato nabídka by měla být pouze pro osoby starší 18-ti let. Požaduji osobní kontakt, klidně na veřejném místě - nejsem úchyl, ale ve hře je poměrně dost peněz. Je mi jasné, že většina se bude ptát co za herní mód to vlastně bude. Nazval bych to klasikou - FREEROAM typu singleplayer v multiplayeru. Ovšem, rád bych slovu "klasika" dal trochu kvalitnější ránu než Realna Zeme (bez urážky). Dost se mi líbil mod Miami Vice, ovšem poměrně dost věcí bych změnil a přidal. Mám rád přehlednost a kvalitu, nepotrpím si na nějaké nedodělky, chaos a špatnou optimalizaci. Pevně věřím, že moje nároky jsou vysoké a proto si myslím, že odměna je úměrná požadovanému výsledku. Jsem ochotný maximálně se podílet na vytváření, ať už ukládání souřadnic nebo 24/7 pohotovost pro upřesnění některých nejasností. Pokud uvidím, že člověk na to opravdu má a přesvědčí mě, že to dokáže a skutečně to dokáže - nedělá mi problém cenu za dokončení herního módu zvýšit. Ovšem, budoucí spolupráce je nutná. V jakém rozsahu bude, to už záleží na domluvě. Pro více informací mě neváhej kontaktovat zde nebo na [email protected] (email vytvořen speciálně pro tuto nabídku z důvodu disktrétnosti)
  17. 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ý.
  18. 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ý.
  19. 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ý.
  20. 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ý.
  21. 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ý.
  22. Zdravím, asi jste si všimli, že přibyla nová sekce "Základy pawn". Po domluvě s Ewwem jsem se rozhodl, že většinu svých návodů z ewa (jiného fóra) přesunu i sem. Vyžádal jsem si na to svou sekci, za chvíli vysvětlím proč. Vlastně vysvětlím všechno. Proč to vzniklo? Jednoduše řečeno, je zde horda lidí, co žádají o pomoc se svým kódem nebo problémem, ale když jim někdo poskytne návod, jak toho dosáhnout, skončí to na tom, že dotyčný nezná základy. Odkázat jej na google či na samp wiki bez toho, aniž by to helper nějak přiblížil, má asi stejnou vypovídací hodnotu jako ten příspěvek od toho, co žádá pomoc. Řešením je odkázat jej na místní sekci "Návody", ale... ...ale to by v té sekci nesměl být takový bordel. Za ty roky se tam nahromadily stovky návodů, sice byl pokus o to je roztřídit (nice try, Petře, Hipe), ale že by to zrovna dvakrát pomohlo, to ne. Proto vznikla tato sekce, která bude sdružovat návody pro úplné začátečníky. Jakých návodů se to týká a co musí splňovat? Jsou to návody, které se věnují jednotlivým strukturám jazyka Pawn, jeho syntaxi apod. Já prozatím plánuji návody na proměnnou, pole, funkce, podmínky, cykly a řetězce. Co bude dál, to se uvidí. Přispět svým návodem může každý, ale návod v této sekci by měl splňovat tato pravidla, jinak by sekce postrádala smysl: 1. Návod musí být sepsán "jako pro blbce"; to znamená, že musí být vše pododrobna a srozumitelně vysvětleno, žádné odborné výrazy a úseky, popř. tyto úseky musí být od návodu nějak odděleny s upozorněním, že jde o něco navíc (já využívám spoilerů); 2. Tématem by neměla být žádná konkrétní funkce SA:MP (timery, 3dlabely apod.) ani žádný větší celek (jak udělat TDM, jak na anketu apod.), sekce je pouze pro věci týkající se Pawn; 3. Návod musí být v souladu s šablonou pro psaní návodů. Každý návod v této sekci musí projít schválením, když nebude splňovat bod 1 nebo 2, bude přesunut do sekce "Ostatní návody". V případě, že by nesplňoval bod 3, by jej uživatel musel nejprve upravit tak, aby byl v souladu s šablonou (není nutné to moderátorům znesnadňovat tím, že se to nebude dodržovat). Jak přesně to má pomoct? Zkušení pawneři mohou žadatelům o pomoc poslat odkaz na tuto sekci, pokud daný člověk nebude mít elementární znalosti Pawn. Závěrem Doufám, že se to osvědčí, udělat pořádek v celé sekci "Návody" si myslím je utopická myšlenka, takže tohle je (by mohla být?) ta zlatá střední cesta.
  23. 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ý.
  24. Pawno soutěž Než se pustíte do zadání přečtete si toto: Informace Zadání #1 Admin systém Vytvořte admin systém o počtu příkazu 20-30. Pokud bude tvořen přes dialog či textdraw musí tam bejt 20-30 funkcí také. Čím více příkazů tím lépe pro vás. Příkazy musí bejt tvořené tak aby se dali použít v normální hře a na každém serveru. (RP,Freeroam,DM,DayZ atd..) Žádný příkaz se nesmí opakovat a podobovat ve funkci. Jak už víme protože jde všichni četli info o soutěži. Hodnotí se kvalita scriptu tutiž se snažte práci dělat kvalitně a dobře. Aby to nebylo odfláknuté jak .... Vaše scripty mi zasílejte do SZ. Pokud nemáte schválen učet pošlete mi pasterbin(Klik) na email: [email protected] Předloha: SZ: Jméno na forum: Script code: Email(Pouze když nemáte schválen účet): Jméno na forum: IP Adresa: Script code: Nekopírujte a tvořte sami za sebe. Good Luck & Have Fun.
  25. Pawno soutěž Informace Zdravím právě začíná období soutěží v jazyku pawno na tomto forum. Teď si řeknem něco o tomto. Pravidla 1)Script musí být vytvořen vámi nesmí bejt okopírován či stažen. 2)Tvůrci si nesmí mezi sebou posílat scripty. 3)Script musí bejt vytvořen podle danné předlohy 4)Jakékoliv podvádění bude potrestáno. Průběh Soutěž bude probíhat následovně. Každý týden proběhne 1 kolo soutěže,celkem bude 5 kol + 1 finální. Z každého kola může bejt pouze 1 postupující který se zařadí mezi 5 bojujících o finální odměnu. V každém kole bude jiné zadání náhodně vybráno které tvůrci budou muset splnit. Poté co bude splněno mi pošlou do Soukromé zprávy "CODE" který vytvořili a já a porota vyhodnotí tento script. Hodnocení je jednoduché 0/10 osoba která bude mejt nejvíce bodu postupuje do finále. Je více než samozřejmé že prvních 5 kol bude lehkých a finální bude těžší. Osoba která vyhrála jedno z prvních 5 kol se nemůže učastit v dalším kole až ve finálním. První kolo začne 7.5.2016. Postupující prvního kola bude zveřejněn 13.5.2016. Zadání Prvních 5 kol (Vždy bude vybráno 1 téma které se bude muset splnit) (Větší popis najdete až v topicu na danné kolo) -[FS]Ukládání/Načtení server stats (Počet připojení celkem,Nejvíce uživatelů v 1 moment na serveru) -[FS]Carmenu přes TEXTDraw. -[FS]Admin systém -[FS]Ukládání/Načtení zbraňí a pozice hráče. -[FS]Zápis do souboru počet připojení z IP hráče a zobrazení ve hře. (Z této IP jsi byl připojen po [X]) Finální kolo (Vybere se 1 náhodné téma ztěchto o které budou uživatelé bojovat) -[FS]House systém (Tvorba domů,Nákup,Prodej,Vstup,Odchod,Změna názvu domu) -[FS]Player vehicle systém (Ukládání zakoupených vozidel hráče po odpojení a po připojení načtení vozidla na pozici + Obchod snimi) -[FS]Systém nemovtostí (Nákup nemovitosti,Prodej,Vydělávání nemovitosti i přesto že je majitel Offline) Hodnocení Hodnotit se bude -Kreativita -Originalita -Jednoduchost v pawn -Výběr includu pro rychlost scriptu -Funkčnost -Kvalita ve hře -Ovladatelnost Odměny Postupující v prvních pěti kolech 1)Reputace + 15 2)Postupování do finále 3)Zveřejnění jeho scriptu pro veřejnost na tomto forum Výherce finále 1)Reputace + 50 2)Flash disk 32 GB 3)Přenosná nabíječka pro smartphone[Powerbank] 4)Označení na forum "Pawn mistr".(Tutiž kde já mám nápis s modrým pozadím "Moderátor" vy tam budete mejt "Pawn mistr") Postupující N/A Credits [Text + Nápady + Financování odměn]Polis_Polismanovic [Návrh na odměnu č.4 pro výherce ve finále] Lukasz Podpořit můžete kliknutím na tlačítko vmém podpise "Donate".
×
×
  • Create New...