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
    • SA-MP
  • 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]
  • Woodyho blog

Calendars

  • Kalendář Pawno.cz

Categories

  • Verze

Found 82 results

  1. pomoc Pomoc s pickupy

    Zdravím, nedávno jsme s kamarády začali dělat na jedné mapě a k tomu jsme začali dělat gamemode, je mimo San Andreas někde na moři a na tom moři nejdou vytvořit pickupy... SAMP Wiki (CreatePickup): Known Bug(s): Pickups that have a X or Y lower than -4096.0 or bigger than 4096.0 won't show up and won't trigger OnPlayerPickUpPickup either. (v mém překladu: Pozice pickupů, které mají pozici X nebo Y nižší než -4096.0 nebo vyšší než -4096.0 se nebudou ukazovat a nebude možné používat public OnPlayerPickUpPickup) Proto by jsem se chtěl zeptat jestli zde měl někdo stejný problém a jak ho vyřešil, či nějakou radu. Napadlo mě ještě použít CreateObject(ID Pickupu, xyz atd atd..); a nastavit timer, který bude kontrolovat jestli je u toho objektu pickupu. Jenže to by bylo celkem divný když tím objektem pickupu nebude možné procházet tak jak jsme již všichni zvyklí. //Edit: jednoduše řečeno, chtěl bych se zeptat jestli neznáte nějakou dobrou náhradu za pickupy Předem děkuji za všelijaké rady.
  2. Zdravím, Jelikož delší dobu san andreas multiplayer nehraji, tak sem se rozhodnul že prodám všechnu svou práci od roku 2013 až do 2017. Důvod proč to chci prodat je takový, jelikož nemám dostatek času se věnovat pawnění. Filterscripty,mapy,módy,pluginy součástí celé složky práce. Příjde mi škoda mazat celou složku práce, která trvala něco málo přes 4 roky. Součástí složky jsou také moje začátky pawna, takže je možné že se někomu budou hodit. Nachází se tam spousty herních módů od ZombieParadise, LAGW až po CW/TG mód clanu HoE. Dle mého názoru složka obsahuje slušnou sbírku za těch 4 roků. Cena celé složky práce je 300,- CZK. Obsah scriptů: 503 Obsah pluginů: 12 Obsah módů: 6 Obsah map: 57 - zahrnuje mapy také v různých scriptech. Pokud by měl někdo zájem, tak stačí když mi pošlete SZ zde na fóru, přeji příjemný zbytek dne.
  3. Dobrý den, Hledám pawnera pro tvorbu gamemode do hry GTA:SAMP. Jedná se o RP mód - o něco reálnější - hunger, apod. Přesné informace sdělím zájemci pomocí skype/ e-mailem. Výdělek: 1 000+ Kontakty Skype: group122 Děkuji za pozornost.
  4. pawn Pawno

    Kdyby někdo potřeboval pomoc s pawnem, neboj se mně kontaktovat na skype : magnetd@seznam.cz
  5. pomoc Problém s /admins

    Zdravím, Mám problém s príkazom /admins dcmd_admins(playerid, params[]) { #pragma unused params if(info[playerid][ALevel] == 0) return ShowPlayerDialog(playerid,d_admins1,DIALOG_STYLE_MSGBOX,"Online A-Team","Momentálne nie je prítomný žiaden člen A-Teamu","Potvrdiť",""); new string[255]; for(new i=0;i<=MAX_PLAYERS_EX;i++) { if(IsPlayerConnected(i)) { if(info[playerid][ALevel] == 1) { format(string, 60, "%s | Organizátor Akcii",meno(i)); ShowPlayerDialog(playerid,d_admins,DIALOG_STYLE_MSGBOX,"Online A-Team",string,"Potvrdiť",""); } else if(info[playerid][ALevel] == 2) { format(string, 60, "%s | Moderátor", meno(i)); ShowPlayerDialog(playerid,d_admins,DIALOG_STYLE_MSGBOX,"Online A-Team",string,"Potvrdiť",""); } else if(info[playerid][ALevel] == 3) { format(string, 60, "%s | Administrátor",meno(i)); ShowPlayerDialog(playerid,d_admins,DIALOG_STYLE_MSGBOX,"Online A-Team",string,"Potvrdiť",""); } } } return true; } Ked sa pripojím na server a dám si ALevel 3, a pripojí sa na server dalsí hráč s alevel 0, v /admins ukazuje jeho s "levelom 2" ako moderátor a mňa vôbec ... Za každú radu budem rád.
  6. Zdravím, Už nejakú dobu premýšľam o tvorbe herného portálu. Keďže ma neuveriteľne baví hra GTA:SA, tak som som chcel spraviť nejaký ten módik ak by sa podarilo. Som tak mierne pokročilý pawner ... Hľadám niekoho, kto by robil filterscripty, ktoré budem potrebovať a potom ich nainštaloval do módu. Mód si budem robiť sám, ide mi o tie doplnky (FS) alebo keď si nebudem dať rady, tak sa nejako dohodneme ... Čo sa tíka módu, chcel by som niečo na spôsob roleplay. Za jeden FS ponúkam 5 - 20 € Samozrejme podľa zložitosti a stráveného času pri pawnení. Som ochotný zaplatiť kľudne aj viac ako tích 20 €, nejak sa určite dohodneme ... Za nainštalovanie do módu priplatím 2 € Ak máte záujem píšte sem, alebo na email -> gsteezee@gmail.com Pozor, títo ľudia sú podvodníci a chceli ma "Scamnút" 1. -> evoolvee@gmail.com | Skype: live:evoolvee | Pôsobí dosť dôverne, takže si dajte pozor ...
  7. Ahoj všichni, chtěl bych mít svůj vlastní server s modem real life , něco ultra realnýho a proto hledám pawnera. Takže jestli se někdo najde tak at mi napíše a určitě se dohodnem . Finanční odměna je samozřejmostí. Předem děkuji.
  8. 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
  9. 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
  10. Č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.
  11. 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é
  12. 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
  13. https://www.youtube.com/watch?v=Z2x4vY0FrCc
  14. 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.
  15. 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.
  16. 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®
  17. 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
  18. 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
  19. 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:
  20. 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.
  21. 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
  22. 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.
  23. 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; }
  24. 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
×