Jump to content

Search the Community

Showing results for tags 'pawn'.



More search options

  • Search By Tags

    Oddělujte čárkami
  • Search By Author

Content Type


Fórum

  • Fórum
    • Pravidla fóra
    • Co by se tu mělo změnit
    • Nahlášení chyb/Návrhy změn
    • Všechno možné
  • Pawn
    • Pomoc
    • Návody
    • Mapy a editor map
    • Scripty
    • Prezentace módů
    • Hledám pawnera/mappera
  • Programování a grafika
    • Vývoj webových stránek a aplikací
    • Vývoj desktopových a jiných aplikací
    • Grafika a webdesign
    • Dlouhodobé projekty
    • Hledám programátora/skriptera
  • Hry a herní tématika
    • MTA
    • Counter Strike 1.6 , Source, Global Offensive
    • Ostatní hry
    • Obrázky a videa z her
    • Herní hostingy
    • Prezentace herních klanů
    • Prezentace herních serverů
  • Ostatní
    • Hardware a software
    • Hledám/nabízím
    • Koš

Categories

  • Pawn – filterscripty a gamemody
  • Pawn – skripty od nováčků povinně sem
  • Aplikace a hry

Blogs

  • rEwolutionary
  • Polisův Blogík
  • DoubleX's Blog
  • [Info] Dark Island
  • Albus Brambůrek's Blog
  • Trampoty pána buggeda
  • vEndovo všechno možné
  • Cybrionkov Game Development v Unity
  • [Printova hlava]

Calendars

  • Kalendář Pawno.cz

Categories

  • Verze

Found 75 results

  1. pawn Hľadám pawnera

    Takže pekný večer prajem ! Hľadám pawnera ktorý by mi pomohol uskutočniť môj veľký sen a to to že budem mať vlastný server. Takže od Vás žiadam aby ste mi pomohli napawnovať mód do SAMP :). Chcel aby tam bolo: Reg/log systém , Gang systém , namiesto $ = score ( blizšie info na skype "erik.dunca" ) Odmena: Admin na servery + hodnosť pawner serveru
  2. Zdárek nazdárek... Popri C++,C# a otravnej škole, hladám niekoho, kto by mal záujem spraviť slušný mod. Ja preferujem real módy, ale ak nechcete, do ničoho nikoho netlačím. Ide o to, že by sme sa držali niakeho rozpisu, na ktorom by sme sa dohodli a spravili by sme niaky módik. Píšte PM
  3. Čaute,hladám niekoho kto by mi mohol pomôcť porozumieť pawnu a hlavne kódom,niečomu rozumiemale je to velmi málo a neviem sa pohnúť ďalej od kedy som skúšal textdrawy a mysql register s phpmyadmin.Hladám hlavne niekoho kto by mi možno aj zdielal obrazovku a vysvetloval veci,nie niekoho kto mi niečo napawnuje za peniaze.Chcel by som sa to naučiť a hlavne to pochopiť.Samozrejme zaplatím cez paypal(na cene sa dohodneme) ale nech to je niekto komu sa dá veriť a rozumie tomu.
  4. Hledám pawnera Co je potřeba udělat Co potřebuji : Vytvoření příkazů pro HRÁČE A ADMINISTRÁTORY. vytvoření frakcí ( vše ohledně frakcí ) . Vytvoření nemovitostí a house systému . Vytvoření NPC postav. Vytvoření hraní v kasínech. Vytvoření jobů, škol a hotelů . Co dostaneš ? : - Finanční ohodnocení Cenu rozhodnu já podle propracovanosti cca 3500,- - Udělení hodnosti v Staff teamu jako PAWNER, možnost dát Hl. Administrátor - Další doporučení při zakázkách - Spolupráci na serveru Kontaktní údaje na mě : ICQ - 673 875 069 | Nebo mě kontaktuj do SZCo od tebe očekávám Ochotu Znalost RP Mít chladnou hlavu Jestli tě nabídka zaujala, tak se mi ozvi, budu se těšit na spolupráci ​Téma je uzavřené
  5. pomoc Atom - UTF-8

    Čaute.. Stiahol som si Atom, pre Pawn.. Ale je tu problem, v Atome ukazuje všetko jak má, ale na servery už nie.. (Aj po zatvorení, a otvorení Pawn súboru.) Ďakujem za pomoc
  6. https://www.youtube.com/watch?v=Z2x4vY0FrCc
  7. Obsah Úvod #define enum Ďalšie použitie 1. Úvod Napadlo mi, že rýchlejšie než vysvetliť niekomu čo je to enum, by bolo dať mu odkaz na nejaký návod. Žiadny som však nenašiel. Boli útržky toho čo je to enum tu a tam, ale nič čo by sa dalo ľahko nájsť. Enum slúži na náhradu direktív preprocesora (#define NIECO). Je prehľadnejší a umožňuje lepšiu kontrolu errorov pri kompilácii. Enum je skratka od enumeration, tj. výčet, vyčíslenie. V tomto návode teda ukážem riešenie konkrétnej úlohy dvomi spôsobmi. Pomocou #define a enum. Majme systém, ktorý kontroluje kde sa nachádzajú isté autá a či sú obsadené. Použijeme teda jednu globálnu premennú. 2. #define #define POSX 0 #define POSY POSX + 1 #define POSZ POSX + 2 #define OCCUPIED POSX + 3 #define VELKOST_POLA (OCCUPIED - POSX + 1) // 3-0+1=4 #define POCET_AUT 20 new Vozidla[POCET_AUT][VELKOST_POLA]; ... stock PouzitiePola() { printf("Velkost posledneho pola = %d", VELKOST_POLA); for (new i; i < sizeof (Vozidla); i++) if (Vozidla[i][OCCUPIED] == true) { printf("%f", Vozidla[i][POSX]); // len nejaky priklad } } 3. Enum Rovnakú funkcionalitu s použitím enumu by sme dosiahli nasledovným kódom. Nie je nutné písať názvy jednotlivých prvkov v enume veľkým písmom. Záleží na vašich preferenciách, mne celkom dáva zmysel, že keďže to nahrádza konštanty, tiež by to malo byť veľkým písmom. #define POCET_AUT 20 enum CarEnum { Float:POSX, // enum umoznuje jednoduchu a prehladnu kontrolu typov Float:POSY, Float:POSZ, bool:OCCUPIED }; new Vozidla[POCET_AUT][CarEnum]; ... stock PouzitiePola() { printf("Velkost posledneho pola = %d", _:CarEnum); for (new i; i < sizeof (Vozidla); i++) if (Vozidla[i][OCCUPIED]) { printf("%f", Vozidla[i][POSX]); // len nejaky priklad } } Možno ste si všimli v PouzitiePola() s enumom: printf("Velkost posledneho pola = %d", _:CarEnum); Tá časť _:CarEnum musí mať predponu _: inak by kompiler hodil warning. Fungovalo by to ajtak. Je to len bug kompilera. V praxi som vypísanie veľkosti enumu ešte nevidel, nebojte sa že by to hnusilo kód. Pre pokročilých: 4. Ďalšie použitie Enum nemusí číslovať od nuly, dá sa spraviť aj toto: #include <a_samp> enum TestEnum { PREMENNA = 5, PREMENNA2, PREMENNA3, // pauza PREMENNA4 = 25, PREMENNA5 }; main() { printf("%d, %d", _:PREMENNA3, _:PREMENNA5); } Server log: SA-MP Dedicated Server ---------------------- v0.3.7-R2, (C)2005-2015 SA-MP Team ... [01:05:25] 7, 26 Som presvedčený, že s enumami sa dajú robiť rôzne pekelné kúsky z ktorých ja žiadne nepoznám, určite ak nejaké máte, pridajte.
  8. 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.
  9. Zdravím Chtěl bych se zeptat jestli by tu nebyl nějaký šikovný pawner který by sice dělal zadarmo ale měl by výhody na serveru na kterém by pracoval a má zkušenost s takovými serverami a byl by ochoten dělat free i když chápu že to není lehké. Děkuji @bombamek0056 INFORMACE Skype: jados122 ®bombamek®
  10. Zdravím pawneri mal by som takú prozbu za peňažnú odmenu.. Hľadám pawnera ktorý by mi napawnil mod podľa vlastného predpokladu.... Ponuknem peknu finančnú odmenu len nech to vyzerá..... Ak by mal niekto zaujem mi to spraviť stačí ma kontaktovať na email: dariusbris167@gamil.com alebo skype : prco167 Viem zaplatiť pekne od 0-100€ popripade aj viacej ak sa mi to bude páčiť... dopredu vám pekne Ďakujem
  11. 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
  12. 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:
  13. 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.
  14. 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
  15. 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.
  16. 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; }
  17. 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
  18. Zdravím, vytvořil jsem pár základních a velice pochopytelných tutoriálů pro upravu, kompilaci atp. pluginů pro CS:GO. Není třeba znalosti c++ (jak je zvykem při tvorbě pluginů). Přeji hezký den PS: Berte to jako pomoc a né reklamu... https://www.youtube.com/watch?v=k9PSZD2gffE&list=PL_ewi0ZDqtamXp_bqH-vIHXp-fwCET5_B
  19. 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.
  20. 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
  21. 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.
  22. 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ý.
  23. 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
  24. #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
×