Jump to content

Search the Community

Showing results for tags 'návod'.

  • 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. Ewwe

    návod PHP I. Základ

    Obsah : Open tagy Proměnné Operátory Open tagy : V zásadě používáme dva typy tagů prvním je klasický <?php ?> a <?= ?> Jaký je mezi nimi rozdíl ? První typ ja základní a používá se pro veškeré php programování. Ten druhý je takový tweak pokud například chcete do html vypsat obsah proměnné či funkce. //"plné tagy" <?php echo $_SERVER["REMOTE_ADDR"];?> //"tweak" tagy <?=$_SERVER["REMOTE_ADDR"]?> Existuje ještě tzv. krátke open tagy ( short open tags ) které musí být povolené webovým serverem. <? echo $_SERVER["REMOTE_ADDR"];?> Proměnné : PHP umí pracovat se skoro všemi standardními datovými type ale není přísně typový jako třeba C#. To znamená že do jedné proměnné lze uložit jakýkoliv datový typ. $var = 1337; $var = 13.37; $var = "1337"; $var = true; Nějaké základní typy jsou : integer,string,float,bool,array,object,null a resource Operátory : přidělovací porovnávací operátor kontroly chyb aritmetické tečkový operátor spaceship Přidělovací: Přidělovací operátor = ( rovnítko ). Přidělování hodnot proměným. $var = 1337; Porovnávací: Máme jich hned několik první skupině budeme říkat datové , druhé hodnotové a třetí šipkové. Nejsou to žádná oficiální pojmenování. Datové: Dvojité rovnítko ( == ). Porovná zda li jsou hodnoty na obou stranách podobné. 1 == 1 //true 1 == "1" //true 1 == true //true Hodnotové: Trojité rovnítko (===). Porovnává zda jsou hodnoty stejné 1 === 1 //true 1 === "1" //false 1 === true //false Šipkové: Klasické operátory > a = a Operátor kontroly chyb: Operátor kontroly chyb (@) slouží k potlačení chybové hlášky. $var = $array[$index]; // dostaneme hlášku , že $index neexistuje $var = @$array[$index];// ticho Aritmetické operátory: Klasické operátory které znáte z matematiky ( * , - , * , / , ++ , -- , += , -= , *= , /= ). První čtyři znáte a nebudu je rozebírat. Operátory inkrementace (++) a dekrementace (--) které hodnotě přidají nebo uberou jedničku. $var = 0; //0 $var ++; //1 $var --; //0 Poslední čtyři operátory slouží k přidání hodnoty. Tzn operátor += přidá k proměnné na levé straně hodnotu z pravé $var += 25; Ekvivalentem je delší zápis $var = $var + 25; Tečkový operátor: Slouží pro spojování řetězců. $number = 1337; $var = "Dnešní číslo je ".$number; $output = "| ".$var." |"; Operátor spaceship: Tento operátor byl přidán ve verzi PHP 7. Upřímně netuším jestli má obdobu v jiném jazyce. Hodí se například v sortění polí. Základní funkcí je , že při stejných hodnotách na obou stranách vrací nulu při levé nižší než pravé -1 a při pravé nižší 1 var_dump(1 <=> 1); // 0 var_dump(1 <=> 2); // -1 var_dump(2 <=> 1); // 1 var_dump(('a' <=> 'a')); // 0 var_dump(('a' <=> 'b')); // -1 var_dump(('b' <=> 'a')); // 1 Ohledně sortění pole pomocí funkce .. Před php7 jste museli zhruba takto $data = array( array('id' => 1, 'price' => 50), array('id' => 7, 'price' => 40), array('id' => 5, 'price' => 130), ); uasort($data, function ($a, $ { return ($a['key'] < $b['key']) ? -1 : (($a['key'] > $b['key']) ? 1 : 0); }); S příchodem php7 lze tento kód zkrátit následovně uasort($data, function ($a, $ { return $a['key'] <=> $b['key']; }); Pokud nezapomenu tak bude následovat další díl. Pro tento je to momentálně všechno.
  2. Úvod [ * ] Něco málo na úvod. Před cca rokem, tak nějak jsem tu dělal něco podobného, ovšem předtím mi ta prezentace moc nešla, ale teď už se na to jde podívat a neodrazuje to od čtení. Před tím cca rokem jsem tu napsal celkem tři příspěvky, ale osobně jsem s tím spokojen nebyl. Teď už mám trochu širší znalosti, takže bych toho tu mohl napsat více. Pro ty co umí spustit server, udělat základní příkazy, warp systém, umět definici barev a takové ty začátky, tak pro něj tohle je zcela zbytečné a nemusí to číst, přes to si myslím, že se tu několik nových lidí najde, popřípadě i bude. Budu se pokoušet vše popisovat srozumitelně. Co nás bude dnes čekat ? - V prvé řadě stáhnutí serveru, potom konfigurace, a nakonec samotné spuštění serveru. Nic složitého, ale i přes to se najde někdo, kdo to neví. Stáhnutí serveru [ * ] 0. Základní věcí je mít v PC WinRAR a nějaký textový dokument, popřípadě WordPad. 1. Stáhneme si složku s věcmi na server na stránce http://sa-mp.com/download.php , předpokládám, že klienta máte nainstalovaného. Pokud ne, tak taky a pak klasicky nainstalujete. Ten server stáhnetetak, že si stáhnete buď Windows server, nebo Linux server, podle toho co máte za operační systém, v mém případě Windows server. 2. Soubor ve WinRAR archivu si dáme na plochu, nebo jednoduše kam chceme,a extrahujeme. Extrahovanou složku si můžete pojmenovat, jak chcete. 3. Složku otevřeme a vidíme tam několik složek: filterscripts = složka, kam si později budeme dávat různé systémy, filterscripty jsou všechny ty věci, co vidíte na všech server. Věci, které si buď stáhnete z nějakého portálu apod. což nedoporučuji, a nebo ty, co si sami vytvoříte. gamemodes = složka, kde jsou všechny herní mody, tam vkládáte vytvořený gamemode, gamemode je jednoduše herní mod. Do složky vkládáme jak vlastnoručně vytvořené, tak i okopírované, což nedoporučuji include = o této funkci radši až v některém z dalších příspěvků npcmodes = složka, ve které máte všechny NPCčka, NPC je postava, kterou si můžete do modu dát, práce s nimi si taky někdy později ukážeme. pawno = složka, kde máte samotné pawno (pawno je program, ve kterém tvoříte jednotlivé funkce. plugins = složka s pluginy. scriptfles = složka se scriptama, jak se to využívá, si také později ukážeme. server.cfg = soubor, ve kterém se provádí konfigurace serveru, nastavení jména serveru, rcon hesla, jazyk, web, apod.... Konfigurace, spuštení serveru [ * ] 1. Otevřeme soubor server s koncovkou .cfg . Vidíme v něm několik věcí. 2. Samotná konfigurace, najdeme tam něco takového: echo Executing Server Config... = necháme tak. lanmode 0 = necháme tak. rcon_password changeme = rcon heslo, čili heslo, kterým se můžete přihlásit jako rcon administrátor. maxplayers 100 = počet slotů na serveru/kolik maximálně může na serveru být hráčů, nastavíme, jak chceme. port 7777 = port serveru ten port se udává za IP adresu: :7777 = příklad tohoto portu, klidně necháme. hostname = jméno serveru, za to hostname pojmenujeme, jak chceme. gamemode0 grandlarc = za to gamemode0 se píše název vašeho modu, přesně tak, jak je, zatím necháme tak. filterscripts ... = v souboru máte několik filterscriptů, to jsou vlastně ty systémy, apod.... announce 0 = necháme tak. chatlogging 0 = necháme tak. weburl www.sa-mp.com = web serveru, pokud máte, tak napište za to weburl. onfoot_rate 40 = necháme tak. incar_rate 40 = necháme tak. weapon_rate 40 = necháme tak. stream_distance 300.0 = necháme tak. stream_rate 1000 = necháme tak. maxnpc 0 = kolik může být na serveru maximálně NPC, zatím necháme tak. logtimeformat [%H:%M:%S] = necháme tak. language english = za to language napíšeme jazyk na serveru. 3. Nakonec uložíme a zavřeme. Spuštení serveru [ * ] 1. Spustíme soubor ve složce se serverem z názvem sa-mp server s koncovkou .exe 2. Teď už je server zapnutý a už nám stačí zadat pouze IP adresu + port (:7777). Nevíte vlastní IP ? Je tu sice více způsobů, ale vysvětlím to jedním: 1. Do startu napíšeme ,,cmd" (bez uvozovek). 2. Po zapnutí napíšeme ,,ipconfig" (bez uvozovek). 3. Nás bude zajímat adresa IPv4 4. Zadáme tu adresu IPv4 + :7777 (port, který jste si v confingu zadali), a už jen spustíme. Toto je všechno, doufám že je vše srozumitelně popsáno. Pokud bude zájem, tak v tomto budu pokračovat. Pokud bude nějaké příště, tak už by se to týkalo nějakých základů už přímo v pawnu + nějaké vysvětlivky funkcí a věcí.
  3. Ahojte, mám tu docela dobrý návod pro doplňky na auto, na netu jsem nenašel žádný "editor" kde by šlo vidět přidávání doplňků na auto. (Tím myslím mimo hru) A tak tu přináším nápad jak to dělávám já... Stáhnout http://forum.sa-mp.com/showthread.php?t=282801 (Stažení Map Editoru) Vložit do složky s hrou Spustit "editor" -> Load (Načte se mapa SA) ​Když spustíte editor máte pohled na Areu, vpravo nahoře máte tabulku pro souřadnice, jsou tam defaultně 0,0,0 stačí kliknout na "Point camera at...." Teď jste na souřadnicích 0,0,0 (Ovládání WASD pohyb, otočení kamerou držením pravý tlačítko myši) Vyjeďte nad povrch Klikněte někde blízko okolo toho sloupu Nahoře to "+ Insert Object" Zvolíte si určitý druh auta např. 411 (Infernus) Označíte Infernus kliknutím následně nahoře vpravo "Movement" a ve sloupci napravo "Nudge tool" Zadáte X,Y,Z na 0,0,0 a auto se posune na pozici "Nula" POZOR! Jakmile dopíšete poslední 0 klikněte třeba na povrch pole jinak budete posouváním do pole "X,Y,Z" psát WASDWASDADWASDAW a podobně (posouváním pod povrch) Teď máme auto pod povrchem, označíte ho a dáte "+ Insert Object" (Objekt se přidává na pozici kam kliknete...) A přidáme např. 1013 Světla následně kliknutím levým tlačítkem myši a držením posunujeme objektem (Držením kolečka nahoru a dolů posuvem myši..) Pokud máte objekt na místě stačí ho atachnout na vozidlo v pawnu, pozice "světel" máte nahoře v levé části editoru v "Show Code" a tam máte svoje XYZ Doufám že to někomu pomůže a zároveň to je i poučné pro ty co chtějí mapovat, pokud někdo by se chtěl naučit víc tak může zkoušet v editoru nebo mi napsat... (POZICE NEFUNGUJE NA VŠECHNY AUTA STEJNĚ, NA NĚKTERÝCH MŮŽE BÝT OBJ. MIMO VOZIDLO...!!)
  4. Zdravim, tento navod bude o tom, jak vytvorit uvitaci text + autora, v konecne fazi to bude vypadat takto: [KLIKNI NA URL] http://imgworld.cz/xCEFqJv7Z5.png To "NONAME" beru, jako ze tam neni nazev modu, nebo serveru, muzete prepsat. Takze nejprve si udelame new new Text:text_uvitani; new Text:text_autor; To nam bude slouzit k tomu, aby jsme vlastne vytvorily ten textdraw. Takze nejprve zacneme uvitacim textem. Musime asi pochopitelne prejit do ongamemodeinit, kdyz tvorime textdraw. Do ongamemodeinit napiseme: text_uvitani = TextDrawCreate(329,362,Vitejte); text_uvitani - to je to, co jsem tu psal, to nam bude slouzit k tomu, aby jste tvorily textdraw. TextDrawCreate pochopitelne ta funkce. A ty cisla, to je vlastne pozice, kde ten textdraw bude (Nekdy to muze byt i za obrazovkou, takze nekdy to hodne casto potrebuje zmenit pozici. A Vitejte, to je vlastne ten text, na ten si udelame v konecne fazi define. A dale: TextDrawAlignment(text_uvitani, 0); TextDrawBackgroundColor(text_uvitani, COLOR_CERVENA); TextDrawFont(text_uvitani, 1); TextDrawLetterSize(text_uvitani, 1.0, 2.0); TextDrawColor(text_uvitani, COLOR_ZELENA); TextDrawSetOutline(text_uvitani, 1); TextDrawSetProportional(text_uvitani, true); TextDrawSetShadow(text_uvitani, 1); Takze je to jak u te prvni funkci v tom ongamemodeinit 1. funkce 2. ke kteremu text neboli textdrawu to mame priradit. 2. Ruzne cisla, takze vlastne typ pisma je shadow, a tak. Kdyztak ta COLOR_CERVENA je definice barvy, aby jsme nemuseli psat "0xFF0000AA" To stejne COLOR_ZELENA A to se dela takto: #define COLOR_CERVENA 0xFF0000AA define COLOR_CERVENA, muze tam byt cokoli, a pak ten kod barvy. Takze jdeme dal. Ted se vrhneme na textdraw autora. text_autor = TextDrawCreate(487,389,Autor); text_autor = ke kteremu textu, nebo textdrawu to mame priradit. TextDrawCreate = funkce Cisla = Pozice, kde textdraw bude lezet. Autor = No, na to udelame pak definici. Takze budeme pokracovat, tak jak minule. Dale do ongamemodeinit TextDrawAlignment(text_autor, 0); TextDrawBackgroundColor(text_autor, COLOR_ZELENA); TextDrawFont(text_autor, 1); TextDrawLetterSize(text_autor, 0.5, 1.0); TextDrawColor(text_autor, COLOR_SEDA); TextDrawSetOutline(text_autor, 1); TextDrawSetProportional(text_autor, true); TextDrawSetShadow(text_autor, 1); Opet COLOR_ZELENA definice barvy. A to stejny COLOR_SEDA. Jdem dal. A to stejny, co jsem tu psal u text_uvitani. - funkce, autor barva, atd. Tak, a konecne se dostavame do konecne faze. Definice #define Vitejte "~w~Vitejte v ~y~NoName" Vitejte, to co jsme si psali v ongamemodeinit, Mam to i ve svem modu, a podle me je to obdivohujici. A napriklad to "~y~" To je vlastne barva, takze y je jako anglicky yellow, takze to je pochopitelne zluta. Takze napriklad "~p~" p jako purple, takze to je fialova. ~ udelame pomoci klavesy pravy alt + 1 Jdem tedy dal. A to stejne s autorem #define Autor "~r~Vytvoril: ~g~xDave" Autora si muzete kazdopadne prepsat, pokud planujete mod, nebo si to otestovat. A aby se vam textdrawy zobrazily, a pri spawnu by zmizly, tak jednoduse takto. : Do OnPlayerConnect: TextDrawShowForPlayer(playerid, text_uvitani); TextDrawShowForPlayer(playerid, text_autor); Do OnPlayerSpawn: TextDrawHideForPlayer(playerid, text_uvitani); TextDrawHideForPlayer(playerid, text_autor); Takze toto by bylo vse. Pokud jsem udelal neco spatne, nebo jsem dost nevysvetloval, tak klidne napiste, snazil jsem se co nejvic to jde, vzhledem k tomu, ze je to muj prvni tutorial na pawno.cz, tak me to nevadi, dekuji. A jeste neco, ne, ze nekdo da CTRL C+V Pak kdyz to budete delat, nebudete umet nic, a pak bude vse jednoduche vysvetlovat, uprimne jsem ty 2 roky tu byl na pawno.cz jako neregistrovany uzivatel, a dival se na navody, nejvic na "ostatni navody" To me pomohlo asi za ty 2 roky nejvic. Dekuji, a cau.
  5. 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.
  6. Takže ahoj, Ukážu vám jednoduchý základ admin systému vše jsem dělal já až na příkaz ten do 35% sem dělal já sám xD Pusťme se do toho :-) #include <a_samp>//zakladní include #include <dini>//ukladací include #include <izcmd>//přikazový include #define MAX_PLAYERS_EX 100 //zadejte si počet slotů které máte na serveru new al[MAX_PLAYERS_EX]; //podmínka kterou vzniká celý admin systém //========tak a pustíme se do práce========// //========1 věc ukladání========// stock SaveLevel(playerid)//ukladání admin levelu zapotřebí include dini { new cesta[64]; format(cesta, sizeof(cesta),"WS/%s.cfg", Meno(playerid));// 'WS' je složka kterou máte vytvořenou ve scriptfiles jestli nemáte vytvořte jí if(!fexist(cesta)) dini_Create(cesta); { dini_IntSet(cesta, "ALevel", al[playerid]);//uložíme } return 1; } public OnPlayerDisconnect(playerid,reason)//když se hráč odpojí ze hry (/q) { SaveLevel(playerid);//uloží mu to admin level return 1; } //========2.načitání========// stock LoadLevel(playerid)//načitání admin levelu zapotřebí include dini { new cesta[64]; format(cesta, sizeof(cesta),"WS/%s.cfg", Meno(playerid)); if(fexist(cesta)) { al[playerid] = dini_Int(cesta,"ALevel");//načteme } if(!fexist(cesta)) fremove(cesta); return 1; } public OnPlayerConnect(playerid)//když se hráč připojí { LoadLevel(playerid);//načte mu to uložený admin level return 1; } //========3.Admin přikaz========// CMD:vyhra(playerid,params[])//výhra přikaz {//zacatek if(al[playerid] < 3) return SendClientMessage(playerid, -1, "{ff0066}[ ES ] {ffffff}Musíš mít {00ccff}Dostatečný Level.");//když hráč má admin level stejný jak 3 a nebo i 3+ admin level např lvl 4 může použit příkaz if(!strlen(params)||!IsNumeric(params)) return SendClientMessage(playerid,-1,"{ff0000}[ ES ] Použití: {ffffff}/Vyhra [ ID ]"); //použití = když hráč zadal např.: /vyhra 0 500000 vyjede mu tato zpráva že je špatně příkaz new string[1000];//[1000] = délka písma jinak string je použít pro format a pro zprávu všem může být použit i na jiné věci než je sendclientmessagetoall new CMD_ID = strval(params);//definice id zvoleného hráče if(!IsPlayerConnected(CMD_ID)) return SendClientMessage(playerid,-1,"{ff0066}[ ES ] {ffffff}Tento Hráč neni pripojený.");//když hráč není připojený format(string,sizeof(string),"{ff0000}Eventér {ffffff}%s {ff0000}udělil výhru hráčovi {ffffff}%s [{ff0000} 7.000.000{ffffff}]",Meno(playerid),Meno(CMD_ID));//format který použijeme níze pro zprávu všem SendClientMessageToAll(0x0000FFFF,string);//zpráva do chatu pro všechny barva, format který jsme použili víš GivePlayerMoney(CMD_ID, 7000000);//zakladní samp funcke pro davání pěněz POZOR!! ve rze 8 a nižší verze nejde return CMD_SUCCESS;//samotný return }//konec //=======potřebné věci=====// stock IsNumeric(const string[]) { new length=strlen(string); if (length==0) return false; for (new i = 0; i < length; i++) { if ((string[i] > '9' || string[i] < '0' && string[i]!='-' && string[i]!='+')|| (string[i]=='-' && i!=0)|| (string[i]=='+' && i!=0)) return false; } if (length==1 && (string[0]=='-' || string[0]=='+')) return false; return true; } stock Meno(playerid) { new pName[MAX_PLAYER_NAME]; if(IsPlayerConnected(playerid)) { GetPlayerName(playerid, pName, sizeof(pName)); } return pName; } //=======KONEC=====// Includy máte v attachments xD Admin.rar
  7. YSI_Coding\y_timers ***** Timery v a_samp jsou skvělá a učitečná věc. Avšak, každý timer vyžaduje neustále psát forward, public a fci. Ale za pomocí YSI stačí napsat jen typ timeru a způsob, jak ho spustíte. Nejdříve si ukážeme použití y_timers. Tady jsem si vymyslel menší kód za použití čístě jen a_sampu: forward pPrvniTimer(); forward pDruhyTimer(playerid); new pTimer[MAX_PLAYERS]; public OnPlayerCommandText(playerid, cmdtext[]) { if (!strcmp("/timer1", cmdtext)) { SetTimer("pPrvniTimer", 1000*60*2, false); return 1; } if (!strcmp("/timer2", cmdtext)) { pTimer[playerid] = SetTimerEx("pDruhyTimer", 1000*60*3, true, "i", playerid); return 1; } return 0; } public pPrvniTimer() { SendClientMessageToAll(-1, "Tohle se všem odešle po 2 minutách poté, co jsem zadal příkaz"); } public pDruhyTimer(playerid) { SendClientMessage(playerid, -1, "Tohle se odešle speciálně jen tobě po 3 minutách dokola"); } public OnPlayerDisconnect(playerid, reason) { KillTimer(pTimer[playerid]); return 1; } Teď ten samý kód za použít YSI: #include <YSI_Visual\y_commands> YCMD:timer1(playerid, params[], help) { defer pPrvniTimer(); return true; } timer pPrvniTimer[1000*60*2]() { SendClientMessageToAll(-1, "Tohle se všem odešle po 2 minutách poté, co jsem zadal příkaz"); } ptask pDruhyTimer[1000*60*3](playerid) { SendClientMessage(playerid, -1, "Tohle se odešle speciálně jen tobě po 3 minutách dokola"); } public OnPlayerDisconnect(playerid, reason) { stop timer_Druhy[playerid]; } O dost kradší a přehlednější, že? Manipulace s timery Než budeme moct použít y_timer, musíme nejdříve si ujasnit, co v základech vůbec obsahuje a jaké fce co dělají: defer Spustí timer pouze jednou(stejně, jako by jste u fce SetTimer(Ex) dali u repeating false). defer TimerPozdrav(playerid); repeat Timer se bude neustále volat(jeho obsažený kód), dokud ho uživatel nezastaví nebo se nevypne server. repeat TimerTipy(); stop Zastaví opakující se timer. ALE POZOR. Při přidávání timerů jmenujete timery jmény, které normálně vkládáte do funcname[] ve fci SetTimer(Ex), avšak ve YSI vy musíte vypnout jeho ID. Tudíž využijete tag Timer:(který YSI obsahuje) pro jeho zjištění a následné vypnutí: new Timer: timer_tipy = repeat TimerTipy(); stop timer_tipy; Typy Následné fce(inf. slovíčka) už vkládáme rovnou do zdrojového kód. Nikam do žádného callbacku či kamkoliv jinam. timer Základní "jednotka". Používá se v případě, že pracujete s timery, který spouštíte za pomocí defer či repeat(a nebo klidně i obyčejně). task Opakující se timer, který se ihned spustí po spuštění serveru. U task nelze přidávat parametry. Vyjímka tvoří ptask, kde je parametr playerid. ptask Stejně jako pro task, s tím rozdílem, že se opakuje, spustí se u daného hráče, a počet spuštěných timerů se zvyšuje s počtem hráčů na serveru. Použití - tipy #include <YSI_Coding\y_timers> ptask TipSystem[1000*60*2](playerid) { new iZprava = random(5); switch(iZprava) { case 0: SendClientMessage(playerid, -1, "[ TIP ] Tip číslo 1 "); case 1: SendClientMessage(playerid, -1, "[ TIP ] Tip číslo 2 "); case 2: SendClientMessage(playerid, -1, "[ TIP ] Tip číslo 3 "); case 3: SendClientMessage(playerid, -1, "[ TIP ] Tip číslo 4 "); case 4: SendClientMessage(playerid, -1, "[ TIP ] Tip číslo 5 "); } } (Rád bych dodal, že jsem se snažil do návodu přidat jen ty nejpodstatnější informace. Složitější a zajímavější využití include si může i každý uživatel dohledat a naučit individuélně. Kdyby jste samozřejmě měli dotaz, ptejte se). Scydovy YSI návody, hlavní topic: odkaz
  8. YSI_Coding\y_hooks ***** Jeden ze snad nejlehčích includů na naučení z knihovny. Abych vás uvedl do obrazu, tak hned tu pro vás mám kód. V případě, že děláte nějaký include, který chcete publikovat ostatním uživatelům, ale potřebovali jste využít některé callbacky, které obsahuje a_samp. Tak uděláte jednu ze snad nejstarších a nejznámějších metod. Přidáte vlastní callback, a v návodě zmíní, ať ho uživatelé pak ve svém gm/fs/jiné volají, a dopadá to nějak následovně: forward House_OnPlayerConnect(playerid); forward House_OnPlayerDisconnect(playerid); forward House_OnFilterScriptInit(); forward House_OnFilterScriptExit(); public OnPlayerConnect(playerid) { House_OnPlayerConnect(playerid); DHS_OnPlayerConnect(playerid); DPS_OnPlayerConnect(playerid); Nem_OnPlayerConnect(playerid); return 1; } public OnPlayerDisconnect(playerid) { House_OnPlayerDisconnect(playerid); DHS_OnPlayerDisconnect(playerid); DPS_OnPlayerDisconnect(playerid); Nem_OnPlayerDisconnect(playerid); return 1; } public OnFilterScriptInit() { House_OnFilterScriptInit(); DHS_OnFilterScriptInit(); DPS_OnFilterScriptInit(); Nem_OnFilterScriptInit(); return 1; } public OnFilterScriptExit() { House_OnFilterScriptExit(); DHS_OnFilterScriptExit(); DPS_OnFilterScriptExit(); Nem_OnFilterScriptExit(); return 1; } Takový zmatek, že ano? Samozřejmě, pak je složitější, ale lepší možnost ještě využít tzv. _ALS_: public OnPlayerConnect(playerid) { #if defined Prefix_OnPlayerConnect return Prefix_OnPlayerConnect(playerid); #else return 1; #endif } #if defined _ALS_OnPlayerConnect #undef OnPlayerConnect #else #define _ALS_OnPlayerConnect #endif #define OnPlayerConnect Prefix_Function #if defined Prefix_Function forward Prefix_Function(playerid); #endif Ale to je pro některé uživatele skutečně těžké na naučení, a navíc tohle je _ALS_ jen na jediný callback. Pak je tu ale ještě jedna možnost, a to za pomocí y_hooks. Je to velice jednoduché, stačí napsat inf. slovíčko pro kompiler hook a jméno callbacku, které chcete hookovat, například: hook OnPlayerConnect(playerid) { return 1; } public OnPlayerConnect(playerid) { SendClientMessage(playerid, -1, "Ahoj, kompiler ti nenapíše error, že OPC je již definován!"); return 1; } Využití snad ani nemusím říkat, ale například při tvorbě include, který chcete publikovat a obsahuje callbacky ze a_sampu. Také je mužete využít do gamemode, aby jste si zkrátili obrovský obsah v jednom callbacku. Jednoduché a prosté. Avšak je tu pár věcí, co by jste o y_hooks měli vědět: musíte y_hooks nahrávat z celé knihovny jako nejdříve - některé hookované callbacky se ani nevyvolají. Stačí y_hooks nahrávat co pokud možno nejdříve a bude po problému. hookovaný callback se volá dříve než obyčejný lze hookovat pouze jednou jeden callback - v jednom zdrojovém kódu. lze hookovat vícekrát, ale nefunguje to - i když to bude znít, že si protiřečím, tak v případě, že chcete skutečně hookovat vícekrát jeden callback a vyhnout se chybám, jde to pokud ihned za jménem hookovaného callbacku přiřadíte číslo. Sice se vám úspěšně kompiluje kód, ale vyvolá se jen public a první hook. nelze si hookovat vlastní callbacky - alespoň co vím. Dle informací by to mělo být možné od nejnovější(a zároveň poslední) verze YSI. Scydovy YSI návody, hlavní topic: odkaz
  9. YSI 5 //upravené na 2021 chtěl bych zmínit, že návod jsem co pokud možno nejvíce zobecnil, abych nenudil čtenáře zbytečnými zdlouhavými informacemi Jde o knihovnu od Y_Lesse, která poskytuje uživateli možnost pracovat s desítky užitečnými, propracovanými či efektivnějšími includy, jenž rozšíří samotný a_samp. Avšak, nemůže s ní pracovat jen tak každý, kdo si jí stáhne. Doporučené znalosti a informace, které by jste měli znát, než začnete pracovat s knihovnou: velice pokročilá znalost teorie pawn, či všeobecně programování(podmínky, cykly, hlavně bloky a zpracování kódu), logické uvažování chuť neustále experimentovat a zkoušet všechny nabízené možnosti knihovny znalost angličtiny(pro překlad popisů u každého includu v případě, že by jste nevěděli, o čem je), obeznámenost, jak se pracuje s includy, které si stáhnete(jak se nahrávají, zjistit ihned jaké fce lze využívat...) V případě, že alespoň většinu doporučených požadavků splňujete, stejně je tu několik informací, kde je podle mě zbytečné využívat knihovnu, a kde naopak není: Menší FS, např. Tipy, Warpy - V tomto případě je to zbytečné, jelikož na některé menší a jednodušší scripty lze využít i minimálně jen jeden include z celé knihovny. Ale v případě, že budou fakt nějak zajímavě rozšířené, například různé typy či to nebude spojené dohromady, tak je to v pořádku. Větší FS, např. AdminScript, VipScript - V tomto případě je to v pořádku, jelikož jde už o složitější, větší a propracovanější projekty, kde lze určitě využít více, než 4 includy z knihovny. Include - Záleží, jaký include. V případě, že jde o nějaké složitější, s desítky fcemi jako například moje CoreJobs, kde využití YSI mi velice zjednoduší práci, tak je to v pořádku, ale v případě include, kde přidáte jednu či dvě fce, například přidávání warpů, tak je to naprosto zbytečné Knihovna - To jsem tu zatím ani neviděl, že by někdo měl takhle složitější vlastní knihovnu, ale i kdyby, tak je to zbytečné. Jelikož, k čemu tvořit vlastní knihovnu, když na ní pracujete s jinou rozšířenou knihovnou, která obsahuje pomalu prakticky všechno? Zde je seznam skoro všech includů, která knihovna obsahuje. První údaj je jejich složka, kde se nachází a pak jejich samotné jméno. Skoro všech, jelikož některé mi připadali zbytečné, komplikované, a nebo je velice malá pravděpodobnost, že je někdo využije při tvorbě gm. Také mám v plánu udělat návod na každý include individuálně(ne nejspíše na úplně všechny, a ano, už tu jsou ukázky práce s YSI, ale ty některé moc nedají): YSI_AC\ y_ac - Nedokončený anticheat, který obsahuje různé callbacky jenž kontrolují všechny akce hráče. YSI_Coding\ y_hooks - Hookování callbacků pro jejich možné opakování ve zdrojovém kódu. Hookované se také dříve volají. y_inline - Volání callbacku v jiném již volajícím callbacku. y_stringhash - Hashování stringů/textů. y_timers - Efektivnější timery, než obyčejné. Také řešením spousty problémů, které většinou jdou vyřešit jen Zeex's patchem. y_va - Velice efektivní a jednoduchá možnost si přidávat vlastní formátované funknce, či používat již obsažené v knihovně. y_remote - Vylepšená práce se CallLocalFunction a CallRemoteFunction. YSI_Core\ y_cell - Možnost manipulovat s bity v jedné buňce. y_debug - Obsahuje funkce s úrovní od 1 do 10, které odesílají veškeré potřebné údaje uživateli do konzole. y_master - Možnost pracovat se segmenty kódu v běžícím scriptě. y_testing - Obsahuje funkce, se kterými lze testovat svůj zdrojový kód. y_utils - Obsahuje hromadu užitečných funkcí pro uživatele i celou knihovnu. y_unique - Include hlavně pro y_hooks, umožní u každé funkce mít "id". YSI_Data\ y_bit - Možnost manipulovat s bit poli(většími než 32b) a umožní jejich redukci(komprimaci). y_playerarray - Stejné jako y_bit, akorát pro hráče. y_foreach - Propracovaný cyklus, kde si lze deklarovat i vlastní parametry, které bude cyklit(jako proměnné, ale rychleji a efektivněji). y_iterate - Stejně jako foreach. y_iterate3b - Starší verze foreachu. YSI_Extra\ y_files - Možnost pracovat se složkami(ze YSF). YSI_Game\ y_vehicledata - Obsahuje kategorie typů vozidel, jejich modely, jména a podobně(dle některých uživatelů nefunkční). YSI_Internal\ y_pp - Možnost přidat určitý segment kódu vícekrát do zdrojového kódu. YSI_Players\ y_groups - Možnost přidávat vlastní skupiny a pracovat s oprávněním s příkazy, hodí se ke y_commands, y_languages - Součást y_text, možnost přidávat více jazyků do módu. y_text - Práce s textem, obsahy apod. y_users - Takový menší a propracovanější register a login systém. YSI_Server\ y_colours - Možnost pracovat s barvami(preprocesory). y_colors - To samé jako y_colours. y_flooding - Možnost nastavit maximální možné připojení z určité ip. y_scriptinit - Možnost přidávat speciální callback, který poběží jak v GM tak FS. y_td - Lepší práce s textdrawy(všechno v jediné funkci). YSI_Storage\ y_ini - Ukládání a načítání údaju z dané cesty. y_bini - Ukládání a načítání polí z dané cesty. YSI_Visual\ y_areas - Přidávání a manipulace z danou oblastí a jejím typem(kruh, čtverec, obdélník aj.). y_classes - Zjedodušenější práce s class ve sa-mp, plus dodatek ke y_groups. y_commands - Velice rychlý command systém s různými dodatkovými funkcemi například alternativa. y_dialog - Možnost pracovat s dialogy bez neustálého kontrolování jejich dialogid. y_properties - Práce s nemovitostmi(dle některých uživatelů nefunkční). y_races - Práce se závody(dle některých uživatelů nefunkční). Moje doporučení z knihovny Samozřejmě, je každého věc, kdo co využije z knihovny, ale pokud máte zájem o můj doporučený seznam, co stačí například na tvorbu gm a není tak náročné na naučení, jak se na první pohled zdá, tak zde je, jinak to celé můžete přeskočit: y_commands, y_ini, y_hooks, y_colours, y_dialog, y_inline, y_bit, y_playerarray, y_scriptinit, y_iterate, y_timers, y_va, y_utils Odkazy na návod includu z knihovny na pawno.cz: [y_hooks] [y_inline] [y_stringhash] [y_timers] [y_va] [y_unique] [y_debug] [y_master] [y_testing] [y_utils] [y_bit] [y_playerarray] [y_foreach] [y_iterate] [y_remote] [y_files] [y_bini] [y_pp] [y_groups] [y_languages] [y_text] [y_users] [y_colours] [y_colors] [y_flooding] [y_scriptinit] [y_td] [y_ini] [y_vehicledata] [y_areas] [y_classes] [y_commands] [y_dialog] Jiné užitečné odkazy týkající se knihovny: [Přechod z dini/dcmd/jiné na YSI4] // +Mnoho ukázek využití knihovny [Velikost AMX po kompilaci] [Registrace přes y_ini] by @martanius // Sice trochu zastaralé, a hodilo se trochu upravit ale stále použitelné. [y_hooks - limit funkcí] by @Ewwe [Masivní použití knihovny]
  10. Obtížnost: Obsah: Předmluva HTTP Type Chybové kódy( status kódy ) Callback Tipy/Triky Co stím ? Předmluva: Proč obtížnost 6 hvězdiček ? To je jednoduché pro práci respektive pro pokročilou práci s touto funkcí budete potřebovat znát další jazyk a to je PHP. Pro ještě pokročilejší ještě alepson SQL. Je to pouze jediná funkce ale pomocí ní lze realizovat mnoho věcí na které by jste potřebovali plugin. Například MySQL registrace, běžně je třeba plugin + lokální databáze ( lokální databází myslím , že db by měla být dosažitelná z módu pod loopbackem. Samozřejmě není to pravidlo některé hostingy podporují remote přístup. HTTP(index, type, url[], data[], callback[]): Nejdříve si vysvětlíme co jsou jednotlivé argumenty funkce. index - v podstatě něco čím odlišíte dvě různé funkce. Nejčastěji playerid( ID hráče ). type - mám celkem tři typy HTTP_GET ,HTTP_POST a HTTP_HEAD. Každý si rozeberem později. url[] - tak to je jasné je to url adresa ke scriptu a nebo souboru. Nesmí obsahovat http://. data[] - data pokud jako typ máme HTTP_POST callback[] - public ve kterém zpracujeme výsledek funkce. Funkce nám vrací true nebo false. True v případě úspěchu, false v opačném případě. Type: HTTP_GET - Základní požadavek. HTTP( index , HTTP_GET , "google.cz/#q=navod" , "" , "" ); Hodí se v podstatě třeba jen k načtení changelogu umístěného na webu nebo něco v podobném smyslu. Nic co bychom nechtěli aby někdo zneužil. HTTP_POST - Tento typ doporučuji používat na všechno. Script který přijímá POST requesty je obtížnější ohrozit než ten který čeká na GET. Dáno už jen tím že GET parametry s hodnotami jsou přímo url adrese. HTTP( index , HTTP_POST, "google.cz/#" , "q=navod" , "" ); HTTP_HEAD - Toto je v podstatě asi nejméně využitelný typ. Jediné použití například k zabránění spuštění módu ověřením existene souboru. Struktura je stejná jako u HTTP_GET rozdíl je pouze v tom že HEAD nepřijímá obsah ale jen chybový kód. Chybové kódy: Tyto kódy si rozdělíme na globální a sampové. Sampové: HTTP_ERROR_BAD_HOST 1 HTTP_ERROR_NO_SOCKET 2 HTTP_ERROR_CANT_CONNECT 3 HTTP_ERROR_CANT_WRITE 4 HTTP_ERROR_CONTENT_TOO_BIG 5 HTTP_ERROR_MALFORMED_RESPONSE 6 Z jejich definice je v podstatě patrný význam. V případě HEAD lze ignorovat ten poslední Globální: Těch je mnoho. Kompletní seznam si projděte zde. Vy chcete aby chybový kód byl vždycky 200. Protože jak je vidět v seznamu 200 je kód pro úspěch. Callback: Jeho jméno zavisí na vaší definici v argumentu funkce. Vysvětlím na následujícím příkladu. Řekněme že chci z webu pawno.cz stáhnout soubor banlist.txt kde mám napsané jedno jméno které nechci na server pustit. public OnPlayerConnect( playerid ) { HTTP( playerid , HTTP_GET , "pawno.cz/banlist.txt", "" , "PawnoCZBanlistTxt" ); return 1; } forward PawnoCZBanlistTxt(index, response_code, data[]); public PawnoCZBanlistTxt(index, response_code, data[]) { new name[21]; GetPlayerName( index , name , 21 ); if( response_code == 200 ) { if( data == name ) Kick( index ); } return 1; } /* Ano vím že vzhledem k datovým typům je data == name blbost, ale pro pochopení to napíšu takto */ Do proměnné data se uloží obsah souboru. Takže to v případě neúspěchu nebo nějaké chyby může být i apache error. Tipy/triky: Jak jsem již říkal doporučuji data posílat přes POST. Ne že by nešli zneužít nebo podstrčit. Ale je to složitější než u GET. Dále doporučuji udělat si ve scriptu nějakou definici do které si uložíte string který budete posílat spolu s daty. Viz https://github.com/Ewwe/Public-Pawn-Gamemode/blob/alpha/gamemodes/gm.pwn#L25 a https://github.com/Ewwe/Public-Pawn-Gamemode/blob/alpha/gamemodes/_core/server/action.pwn#L22. Dále doporučuji v php porovnávat IP adresu. Pokud přidáte podmínku , že if( $_SERVER["REMOTE_ADDR"] == "IP vašeho serveru" ) Tím v podstatě zamezíte veškerému nežádoucímu přístupu. Zase samozřejmě všechno jde nějak obejít. Co stím ? Jak jsem již říkal na začátku pomocí této funkce lze jednoduše udělat MySQL registraci propojenou s webem. Například lze jednoduše propojit PHP Fusion se serverem. Nebo jakýkoliv jiný CMS. Online banlist není problém. Je to omezeno pouze vaší fantaziíí. Můj první script využívající tuto funkci byl changelog vypsaný do dialogu a stažený z php fusion stránky. Registrace do MySQL není nijak pomalá nebo něco podobného jen je třeba brát v potaz , že pokud Vám někdo bude dosovat web tak se to odrazí i na serveru. Podle mého ale klady převyšují nad zápory. Jen je třeba znát alespon nějaký základ jazyků PHP a SQL. Což přece není na škodu naučit se něco nového ne ? Děkuji pokud jste tento návod pečlivě pročetli a ne jen zběžně prolétli. Byl jsem úspěšný pokud jsem Vás něco naučil. Případně dotazy směřujte sem do tématu. Pokud jsem někde udělal nějakou chybu napište mi PM. Váš Ewwe
  11. Předem , chci upozornit , že se jedná o přepis návodu z jiného zdroje.Na konci návodu bude uveden odkaz na originální téma. Předem chci upozornit že Atom je vhodný zejména pro ty co pracují na nějakém větším projektu. Pro sváteční pawnery je to zbytečné. Obtížnost : Prvně je nutné nainstalovat službu choco. Otevřete příkazový řádek jako správce Vložte následující kód: @powershell -NoProfile -ExecutionPolicy unrestricted -Command "iex ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1'))" && SET PATH=%PATH%;%ALLUSERSPROFILE%\chocolatey\bin Za pár sekund ( stahují se knihovny z netu takže záleží na vašem připojení ) se choco nainstaluje. Dále je tedy nutné nainstalovat služby git a npm. K tomu použijeme choco. choco install git choco install npm Nyní stáhneme Atom. Úprava Atomu Nevíte jak instalovat package do Atomu ? Scrollněte až uplně dolů... Prvně doporučuji package jménem keyboard-localization. A to přesně ten jaký vidíte na obrázku. Dále nějaký zvýraznovač syntaxe. Za sebe doporučuji language-pawn od Larcenyho Nyní chceme také kompilovat. Balíček build Ten bude potřeba nastavit. Je důležité ve složce ze které bude kompilovat vytvořit soubor .atom-build.json s následujícím kódem { "cmd": "pawncc.exe", "args": [ "{FILE_ACTIVE}", "-i{PROJECT_PATH}", "-D{PROJECT_PATH}/[VYSLEDEK]", "-r{PROJECT_PATH}\\DOCS\\{FILE_ACTIVE_NAME_BASE}.xhtml", "-;+", "-(+", "-d0 -O1" ], "sh": false, "cwd": "[CESTA K PAWNCC.exe]", "env": { } } V mém případě obsah souboru vypadá takto { "cmd": "pawncc.exe", "args": [ "{FILE_ACTIVE}", "-i{PROJECT_PATH}", "-D{PROJECT_PATH}/gamemodes", "-r{PROJECT_PATH}\\DOCS\\{FILE_ACTIVE_NAME_BASE}.xhtml", "-;+", "-(+", "-d0 -O1" ], "sh": false, "cwd": "C://Program Files (x86)/pawno", "env": { } } Poté už stačí jen si otevřít Keymap ( v menu ) a připsat následující 'atom-text-editor': 'f5':'build:trigger' Dále doporučuji nainstalovat modul simple-drag-drop-text Tento modul vám v podstatě ušetří klávesové zkratky k přesouvání textu v lokálním souboru jak můžete vidět v gifu Dále je to na vás jesli budete chtít minimapu soubrou nebo icony souborů či nějakého color pickera. Já osobně minimapu používám máte tak pěkný přehled zhruba kde co je. Atom je skvělý zvlášt pokud pracujete a svou práci poté "uploadujete" na Github díky své integraci Githubu a gitu obecně ( no ještě aby ne když je to jejich produkt ) Atom je vám schopný ukazovat změny, nové soubory a podobně v souladu s aktualními changes. Instalace packagů do Atomu Stačí kliknout v atomu na File > Settings poté na Install a následně do inputu napsat jméno balíčku ( jsou v textu zvýrazněná ), kontrolujte podle screenů také vývojáře at máte přesně to stejné. Původní téma http://forum.sa-mp.com/showthread.php?t=550355
  12. OBSAH • Obtiažnosť • Predslov • Začíname • Konfigurácia • Tipy a Triky • Záver Obtiažnosť Predslov Vážení čitatelia. Veľa z nás každodenne kompilujeme naše kódy, v rôznych editoroch, ako klasický pawn editor, atom.io a kopa ďalších. Je ich nespočet, ale máloktorý poskytuje užívateľovi príjemné moderné prostredie. Bohužiaľ, ako aj v svete SA:MP SK/CZ komunity, kde všetci vykrádajú nápady iných módov a riadia sa starým istým heslom, „Keď to bolo dobré doteraz bude to aj do budúcna“. Ale bohu žiaľ nie je! Preto, by som vám chcel predstaviť, jeden z najlepších editorov, ktorý sa drží doby a nezaostáva pred jeho konkurenciou. Začíname V prvom rade, je potrebné stiahnuť sublime text editor. Tento editor je samozrejme zadarmo, ale môžte si taktiež priplatiť za premium. Premium stojí okolo 70$, čo je v celku prijateľná cena. Rozdiel medzi platenou a neplatenou verziou, nieje až tak veľký. Hlavne, je rozdielny čo sa tíka updatov. Zatiaľ, čo platené verzie majú častejšie updaty a stabilný editor, tak neplatené majú menej updatov a sú tkv. pokusní zajacovia. Ja osobne, som si editor zakúpil. Tím pádom, môžem mať niečo iné, než je v Free verziách. Download Sublime Text 3 Po stiahnutí prebehne bežná inštalácia, kde si nastavíte, kde chcete nainštalovať Sublime Text a samozrejme, výzva na akceptovanie licencie. Túto časť, by som chcel preskočiť a rovno prejsť, na ďalší bod, páč predpokladám, že nejaké skúsenosti s inštaláciou programov, už ovládate. Konfigurácia Po inštalácií si spustíme náš editor, kde môžme vidieť, základné neupravené prostredie, bez skinov a nastavení. Prvé čo teraz vykonáme, je samotné nastavenie nášho editora, ktoré nám spríjemni naše programovanie a samozrejme, vyrieši niektoré otázky v budúcnosti. Kliknite následovne: Preferences > Setlings Momentálne sa nám otvorilo nové rozdvojené okno, kde máme na ľavej strane default nastavenia a na pravej, naše nastavenie. Default nastavenia môžte zmeniť tak, že do okna nastavenia užívateľa, napíšete daný kód s zmenou. Teraz si nastavíme náš Sublime text. { "Line_padding_bottom": 1, "Line_padding_top": 1, "default_encoding": "Central European (Windows 1250)", "fallback_encoding": "Central European (Windows 1250)", "font_size": 13, "highlight_line": true, "ignored_packages": [ "Vintage" ], } Vysvetlenie 1) Prvé dva riadky, slúžia na zlepšenie čitateľnosti kódu, pridaním 2 pixelov, na každý riadok. "Line_padding_bottom": 1 "Line_padding_top": 1 2) Tu si nastavíme sadu znakov. Respektíve vďaka tomuto, bude bez problémov kompilovať, aj znaky našej krajiny ako "ô, ä ...". "default_encoding": "Central European (Windows 1250)" "fallback_encoding": "Central European (Windows 1250)" 3) Nastavenie veľkosti textu. "font_size": 13 4) V poslednom rade si nastavíme zobrazenie aktuálneho riadku farebne. "highlight_line": true Pawn Konfigurácia - Syntax Konečne sme sa dostali k tomu najpodstatnejšiemu, na čo asi každý čakal a to, konfigurácia, a kompilácia pawn súborov. Ako prvé, budeme potrebovať nejaký PAWN Syntax. Samozrejme že je to teraz na vás, či si ho spravíte sám, ako správny gurmán, alebo si ho môžte stiahnúť. Download Pawn Syntax Teraz, je potrebné stiahnutí, alebo spravení syntax, premiestniť do Sublime zložky v appdata. Napíšte do prieskumníka %appdata% a dajte enter. Teraz nájdite priečinok: Sublime Text 3 > Packages a následovne vytvor priečinok PAWN, a vlož doň stiahnuté súbory. Potom vypnite a zapnite, Sublime Text editor. Následne zadajte cestu: View > Syntax a tu, môžte vidieť náš pawn syntax. Pawn Konfigurácia - Compiler Konečne sme pri konci. Už nám chýba, iba posledná skladanka, pred samotnou kompiláciou, nášho kódu. Kliknite následovné: Tools > Build System > New Build System... Teraz si napíšeme cestu, k nášmu súboru, kde máme stiahnutí pawn compiler. { "cmd": ["pawncc.exe", "$file", "-o$file_path\\\\$file_base_name", "-;+", "-(+", "-d3", "-Z+"], "file_regex": "(.*?)[(]([0-9]*)[)]", "selector": "source.pwn", "working_dir": "HDD:\\PAWN" } Tento kód je od Zeex. V prípade, ak nepoužívate Zeex patch, stačí zmazať definíciu "-Z+". Prípadne pridávam link na stiahnutie. Tak tiež, si nezabudnite zmeniť cestu k pawn kompilátoru "HDD:\\PAWN". Download Zeex Patch Pawn Následne už stačí uložiť a môžme skúsiť kompiláciu kódu. Následne, ak ste robili všetko podľa návodu, malo by vám skompilovať, váš pawn súbor. Ako ste sami mohli vidieť, nie je to nič zložité a dokáže to úplne každý. Tipy a Triky Ako aj ostatné editory, tak aj Sublime Text, má svoje tkv. futurovky, ktorými je originálne. Zopár takých futuroviek vám tu predstavím, prípadne ešte časom pridám. 1) Sublime Text 3 po kompilácií ak vypíše chybu môžte sa k danej chybe dostať dvojklikom prípadne bude zobrazená daná chyba pod kódom. 2) V prípade ak potrebujete rad čísel a omrzelo vás manuálne písanie použite CTRL + Ľ. SHIFT + R 3) Rýchle zarovnanie textu? žiaden problém stači nainštalovať Alignemt plugin a následná kombinácia kláves CTRL + ALT + A Záver Ako ste mohli vidieť, ovládanie Sublime Textu a samotné presmerovanie, je úplne jednoduché, a dokáže to každý. Dúfam, že niekomu môj návod pomohol, prípadne inšpiroval, zmeniť depresívny kompilátor, za niečo moderné a svieže. Ak sa vám návod páčil, dajte palec hore, prípadne kritiku.
  13. 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ý.
  14. #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
  15. OBSAH Obtiažnosť Predslov Úvod Obsah Záver Funkční pouze do verze 39 Tento návod je aktuální pouze do verze 39. Na aktualizaci návodu se pracuje. Obtiažnosť Predslov Vážení čitatelia. Už dlhšie som si všímam, ako sa všetci neustále delíte, na viac táborov, a pritom, máte celý čas, ten vysnení, ukladací systém, podnosom. V konečnom dôsledku, aj chápem, prečo málo kto skočí, po MySQL databáze. Jednak, sa musíte učiť nový jazyk, SQL, a na stránke druhej, nikto nenapísal, žiadny komplexný návod. Samozrejme, že niekto môže podotknúť „Ale v roku 2011 napísal jeden mladí junák ...“ áno, máte pravdu, niečo podobné návodu, na MySQL ukladací systém, som tu videl, ale za ten čas, sa toho veľa zmenilo. Neskôr to zistí, aj náš miestni spochybňovač. Úvod Tak, ak si prežil môj predslov, môžeme pokračovať ďalej, v návode. Ako prvé, budete potrebovať prístup, k vašej databáze. Ja osobne, používam na tvorbu tabuliek, phpMyAdmin. Ak ste skúsenejší, môžete to robiť aj manuálne, cez konzolu. Ďalej budete potrebovať MySQL plugin, a includ. Všetko potrebné, samozrejme prikladám, na konci tohto návodu, spolu, s návodom, na jazyk SQL. Jazyk SQL, budete potrebovať, pri rozsiahlom využití, pluginu. Tiež chcem podotknúť, že tento návod, počíta že ovládate jednotlivé datatypy, a samotný jazyk SQL. Príprava Ak ovládate phpMyAdmin prosím prejdite na ďalší bod. V príprave, vás naučím, ako vytvoriť databázu, a samotnú tabuľku, ktorá bude slúžiť, na ukladanie, a čítanie vašich dát. Samotní systém, sa bude skladať z atribútov, ktoré, budú mať v sebe isté informácie. Ako napríklad Meno hráča. Tak tiež, jeden z atribútov, musí byť kľúč, teda atribút, ktorý, je nemenný. V tomto návode, to bude, naša vytvorená, premenná “ID“. Po prihlásení do systému môžte vidieť následovné menu. Kde kliknete v hornej lište na ikonku databázy. Po kliknutí, sa nám zobrazí žiadosť, na vytvorenie databázy. Do prázdnej kolonky, napíšeme “Database“. Tím pádom, sa bude naša databáza, volať Database. Potom, kliknite na “vytvoriť“. Teraz, sa nám vytvorila naša databáza. Ďalší krok, bude vytvoriť tabuľku, a následne do nej vložiť naše atribúty. Pre editáciu databázy, musíte kliknúť na ikonku, v ľavej lište, s názvom našej databázy, ktorú sme vytvorili “Database“. Následne, sa nám zobrazí menu, na vytvorenie spomínanej tabuľky. Do prázdnej kolonky, napíšeme názov našej tabuľky, s ktorou budeme neskôr pracovať. My si tam napíšeme “account“. Vedľa našej “account“ kolonky, máme ešte tzv. “počet polí“. Počet polí, značí, že koľko atribútov, budeme používať. My osobne, budeme ukladať, 12 atribútov. Tím pádom, si zmeňte default 4, na 12. Následne, kliknite na “vykonaj“. Naša tabuľka, je teraz vytvorená. Teraz stačí, do nej vložiť, naše atribúty. V tomto kroku, nesmieme zabudnúť, na funkciu A_I. Vďaka tejto funkcií sa za každým novým záznamom pripočíta hodnota od poslednej hodnoty. Gratulujem. Vaša databáza s tabuľkami, je vytvorená. Sami musíte uznať, že to nebolo nič ťažké. Dúfam, že sa rovnako tešíte aj na ďalší krok. Obsah Vítam vás, v ďalšom bode, kde vás naučím, ako vytvoriť jednoduchú registráciu, pomocou MySQL pluginu. Opäť, vás chcem informovať, že bude potrebné, vedieť aspoň základy jazyka SQL! Ak, tieto znalosti nemáte, prosím prejdite, na bod, Záver. Špecifikácia Ako aj iné pluginy, ako SSCANF 2, používa aj MySQL plugin, isté špecifikácie na používanie. Špecifikátor Meno e dostanete reťazec naraz. Nemusíte používať, mysql_real_escape_string(). s String q Rovnaké ako %s. Pridané v SA:MP 0.3.7 R2 d | i Integer f Float x Hex b Binar Ako prvé, je potrebné, si stiahnuť plugin, aj s includom. Ten môžte stiahnuť, rolovaním stránky, na bod záver, kde sú jednotlivé linky na download, alebo učebný materiál SQL. Po pridaní includu, si otvoríme editor, do ktorého si napíšeme, následovné kód. #include <a_samp> #include <a_mysql> #define MYSQL_DB "Your_Database" #define MYSQL_USER "Name" #define MYSQL_PASS "Pass" #define MYSQL_HOST "IP" #define D_REG 0 #define D_LOG 1 native WP_Hash(buffer[], len, const str[]); Definície Najprv sme si zapísali použité include s ktorými budeme pracovať a to “<a_samp>“ a “<a_mysql>“. Potom sme vytvorili definície ktoré nám poslúžia ako skratka. #define MYSQL_DB - Meno databázy. #define MYSQL_USER - Meno užívateľa phpMyAdmin. #define MYSQL_PASS - Heslo užívateľa do phpMyAdmin. #define MYSQL_HOST - IP Serveru. Ak máte MySQL databázu, u seba na VPS, na ktorom vám beží aj server, použite local host ip “[/size]127.0.0.1“.[/size] #define D_REG - Dialog ID Registrácie #define D_LOG - Dialog ID Prihlásenia O hash hesla sa bude starať ďalší plugin ktorý by mal byť najbezpečnejší a to Whirlpool. native WP_Hash(buffer[], len, const str[]); // MySQL new MySQL; // REGISTER VARIABLE new ID [MAX_PLAYERS], Skin [MAX_PLAYERS], Kill [MAX_PLAYERS], Death [MAX_PLAYERS], Admin [MAX_PLAYERS], Wanted [MAX_PLAYERS], Password [MAX_PLAYERS], Float: PosX [MAX_PLAYERS], Float: PosY [MAX_PLAYERS], Float: PosZ [MAX_PLAYERS], Float: PosR [MAX_PLAYERS]; // CONTROL VARIABLE new C_Login [MAX_PLAYERS]; Premenné Teraz sme si vytvorili premenné. s ktorými budeme ďalej pracovať. MySQL - slúži na rozpoznávanie databáze, a celkovo nám bude udržiavať, dátové pripojenie. C_Login - Táto premenná, slúži na kontrolu, aby nám ukladanie nerobilo problémy, v prípade prihlásenia, a rázneho odhlásenia. forward OnAccountLoad(playerid); forward OnAccountCheck(playerid); forward OnAccountRegister(playerid); Forward Teraz sme si vytvorili forwardy na naše public. public OnGameModeInit(){ mysql_log(LOG_ERROR); MySQL = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_DB, MYSQL_PASS); if(mysql_errno() != 0) printf("[MySQL] Connect is not succesfull!"); else printf("[MySQL] Connect is succesfull!"); return true; } OnGameModeInit mysql_log(LOG_ERROR); - Vďaka tejto funkcií, sa nam vytvorí, v prípade nejakej chyby, MySQL log, do ktorej sa daná chyba zapíše. MySQL = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_DB, MYSQL_PASS); - tu sa jedná o samotné pripojenie na MySQL server. v prípade, ak máte iný port, na MySQL databázu ako je bežné, je potrebné za MYSQL_PASS dopísať váš port. if(mysql_errno() != 0) - slúži na informáciu o úspešnom alebo neúspešnom pripojení. public OnPlayerConnect(playerid){ C_Login [playerid] = Kill [playerid] = Death [playerid] = Admin [playerid] = Wanted [playerid] = 0; new string[128]; mysql_format(MySQL, string, sizeof(string), "SELECT `Password`, `ID` FROM `account` WHERE `UserName` = '%e' LIMIT 1", PlayerName(playerid)); mysql_tquery(MySQL, string, "OnAccountCheck", "i", playerid); return true; } OnPlayerConnect V tomto public, nulujeme naše premenné, a následne deklarujeme naše dôležitejšie premenné. Tieto premenné sa budú používať v callback “OnAccountCheck“. public OnPlayerDisconnect(playerid, reason){ if(C_Login[playerid]){ new string[255]; GetPlayerPos(playerid, PosX[playerid],PosY[playerid],PosZ[playerid]); mysql_format(MySQL, string, sizeof(string), "UPDATE `account` SET `Wanted` = %d, `Skin` = %d, `Kill` = %d,\ `Death` = %d,`Admin` = %d, `PosX` = %f, `PosY` = %f, `PosZ` = %f, `PosR` = %f WHERE `ID` = %d", Wanted[playerid],Skin[playerid],Kill[playerid],Death[playerid], Admin[playerid],PosX[playerid],PosY[playerid],PosZ[playerid],PosR[playerid],ID[playerid]); mysql_tquery(MySQL, string, "", ""); } return true; } OnPlayerDisconnect V tomto public, ukladáme, naše premenné. Najprv si deklarujeme naše premenné, a potom aktualizujeme našu databázu, s novo získanímy údajamy. V podstate to môže pripomínať ukladanie v file.inc. public OnPlayerRequestSpawn(playerid){ if(C_Login[playerid]){ SpawnPlayer (playerid); SetPlayerSkin (playerid, Skin[playerid]); SetPlayerPos (playerid, PosX[playerid],PosY[playerid],PosZ[playerid]); SetPlayerFacingAngle(playerid, PosR[playerid]); } return false; } OnPlayerRequestSpawn Tu, nám kontroluje premenná C_Login[playerid], či je true, a ak áno, spawne nás na súradnice ktoré buď máme uložené, alebo po registrácií priradené. Tak tiež, nám nahrá uložení skin. public OnPlayerDeath(playerid, killerid, reason){ if(killerid != INVALID_PLAYER_ID){ Kill [killerid]++; Death [playerid]++; Wanted[killerid]++; } return true; } OnPlayerDeath V prípade, ak bol hráč zabití, pridá mu do premennej Death + 1, a hráčovi ktorý ho zabil, Kill + 1 a Wanted + 1. public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]){ switch(dialogid){ case D_REG:{ if(response){ if(strlen(inputtext) < 4) return ShowPlayerDialog(playerid, D_REG, DIALOG_STYLE_INPUT, "Registration", "Please type your password. The range of password is 4 - 19.", "confirm", "close"); new string[500]; WP_Hash(Password[playerid], 129, inputtext); mysql_format(MySQL, string, sizeof(string), "INSERT INTO `account` (`UserName`, `Password`) VALUES ('%e', '%e')", PlayerName(playerid), Password[playerid]); mysql_tquery(MySQL, string, "OnAccountRegister", "i", playerid); C_Login[playerid] = 1; } else Kick(playerid); } case D_LOG:{ if(response){ new string [225], hashpass[129]; WP_Hash(hashpass, sizeof(hashpass), inputtext); if(!strcmp(hashpass, Password[playerid])){ mysql_format(MySQL, string, sizeof(string), "SELECT * FROM `account` WHERE `UserName` = '%e' LIMIT 1", PlayerName(playerid)); mysql_tquery(MySQL, string, "OnAccountLoad", "i", playerid); C_Login[playerid] = 1; } else ShowPlayerDialog(playerid, D_LOG, DIALOG_STYLE_INPUT, "Login", "Please enter your password with which you registered on the server.", "confirm", "close"); } else Kick(playerid); } } return true; } OnDialogResponse Ako môžme vidieť máme tu dvoje dialógy ktoré sú switchované a to login a register. Register if(strlen(inputtext) < 4) - Ak je string menší ako 4, hráčovi znovu načitá dialóg. WP_Hash(Password[playerid], 129, inputtext); - Whirlpool plugin nám zahashuje heslo. Následne uložíme a voláme callback “OnAccountCheck“ Login WP_Hash(hashpass, sizeof(hashpass), inputtext); - Hashujeme inputtext. if(!strcmp(hashpass, Password[playerid])) - Porovnanie uloženého hesla a inputtextu. Na koniec voláme public z ktorého sa nám nahrajú údaje. public OnAccountCheck(playerid){ new rows, fields; cache_get_data(rows, fields, MySQL); if(rows){ cache_get_field_content(0, "Password", Password[playerid], MySQL, 129); ID[playerid] = cache_get_field_content_int(0, "ID"); ShowPlayerDialog(playerid, D_LOG, DIALOG_STYLE_INPUT, "Login", "Please enter your password with which you registered on the server.", "confirm", "close"); } else ShowPlayerDialog(playerid, D_REG, DIALOG_STYLE_INPUT, "Registration", "Please type your password. The range of password is 4 - 19.", "confirm", "close"); return true; } OnAccountCheck Vytvorili sme si dve premenné, do ktorých, sa uložia parametre, z predošlého public OnPlayerConnect(playerid). Ak premenná rows nebude nula, tak načíta hodnotu password, a priradí ju k premennej password[playerid], potom priradí aj hodnotu ID[playerid]. A podla tejto hodnoty premennej rows, sa rozhoduje ktorý dialog spustí. public OnAccountLoad(playerid){ Wanted [playerid] = cache_get_field_content_int (0, "Wanted"); Skin [playerid] = cache_get_field_content_int (0, "Skin" ); Kill [playerid] = cache_get_field_content_int (0, "Kill" ); Death [playerid] = cache_get_field_content_int (0, "Death" ); Admin [playerid] = cache_get_field_content_int (0, "Admin" ); PosX [playerid] = cache_get_field_content_float(0, "PosX" ); PosY [playerid] = cache_get_field_content_float(0, "PosY" ); PosZ [playerid] = cache_get_field_content_float(0, "PosZ" ); PosR [playerid] = cache_get_field_content_float(0, "PosR" ); return true; } OnAccountLoad - Tento public, slúži, na nahratie hráčových údajov. Dosť podobné, INI systémom. public OnAccountRegister(playerid){ ID [playerid] = cache_insert_id(); PosX [playerid] = 1682.7249; PosY [playerid] = 1451.3008; PosZ [playerid] = 10.7719; printf("[Registration] New account registered. Database ID: [%d]",ID[playerid]); return true; } OnAccountRegister Toto spätné volanie, sa vyvolá po úspešnej registrácií, kde priradí, hráčovi default premenné, plus statický ID identifikátor. stock PlayerName(playerid){ new name[MAX_PLAYER_NAME+1]; GetPlayerName(playerid, name, sizeof(name)); return name; } PlayerName Nakoniec starý známy stock. Záver Ako vidíte sami nie je to nič zložité. Jedná sa o veľmi skvelí ukladací systém ktorý vám odporúčam ako náhradu za všetky INI systémy. Celý tento návod je len zlomok toho čo daný plugin umožňuje. Dúfam, že vám môj návod pomohol. Download MySQL & Whirlpool Download Code & SQL Learn SQL Ověřený návod Tento návod prošel validací, a lze ho proto považovat za ověřený.
  16. Trošku té základní gramotnosti okolo pawn. Pawn x Pawno Velmi často dochází k záměně těchto slov a tím k celkové mystifikaci. Pawn je jazyk ve kterém scriptujete. Pawno je editor do kterého scriptujete. Ŕádky Je absolutně jedno kolik má který mód řádků. Kvalita módu se vůbec neodvíjí od počtu řádků. Počet řádků je čistě jen o optimalizaci a zkušenostech pawnera. Můžete mít mód který má 200k řádků a mód který má 50k řádků. Rozdíly mezi nimi ve funkčnosti být nemusí. Například kdyby dělal mód třeba Lukáš V. tak vzhledem že mám pocit nikdy v pawn nedělal tak jeho mód by měl třeba 500k. A kdybych ten stejný mód dělal třeba já tak můžu nahnat třeba 70% úsporu co se týče řádků. Funkce na funkci Krásným příkladem je třeba stock IsPlayerInSphere. Proč ? Je to uplně to stejné jako IsPlayerInRangeOfPoint jen s jiným pořadím argumentů. Fuguje to uplně stejně. Jen IsPlayerInRangeOfpoint je nativní tudíž rychlejší. Programuju ? Laicky řečeno ano. Pawn je ale scriptovací jazyk tudíž spíš scriptujete. Na první pohled není poznat rozdíl mezi jazykem programovacím a scriptovacím. Ale taková poučka třeba může být , že výplod programování nepotřebuje pro svůj běh server. Samozřejmě nelze to taky použít uplně kdykoliv. Budu postupně editovat stím co mě napadne dále.
  17. 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ý.
  18. 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ů.
  19. sscanf2 ***** Zdravím vás u dalšího návodu, konkrétně o velice populárním a dost často používaném pluginu a to sscanf. Jde o plugin, který mnoha uživatelům vypomáhá při tvorbě více parametrových příkazů či u více informačních údajů(například inputtext) v samp. Obsah Ukázka použití Specifikátory Integer String Pole Enum Velké specifikátory Integer String Pole Enum Použití Změnit hráčovi počet životů Zabanovat hráče s důvodem Nahrát více údajů v jednom souboru Download Závěr Ukázka použití Hodně uživatelů využívá tuhle funkci hlavně v podmínkách v příkazech, například: if (sscanf(params, "ui", ID, Penize)) return SendClientMessage(playerid, -1, "Použití: /prachy [ID/Jméno hráče] [Počet]"); Jak to funguje? Vezme údaje ze params, a z celého řetězce zjistí, kde tam jsou dané datové typy, a to u nebo-li string(číslo nebo nick hráče, či jeho součást) a i nebo-li integer, a dosadí do daných proměnných(ID a Peníze), a podmínka nám vrací true/false dle toho, zda při rozdělovaní (ne)vzniknou nějaké komplikace, například jeden z údajů chybí, nebo nenašel v řetězci daný datový typ(například místo čísla aka peněz napíšete nějaký string. Funkce to vyhodnotí jako text, nikoliv číslo a chyba). V případě, že jste to nepochopili, můžeme si to ukázat na jiném příkladě. Jelikož sscanf2 je funkce, lze jí jednoduše používat i bez podmínek: new String[15] = "abcd", Cislo = 0; sscanf("Potrebuji 1000", "si", String, Cislo); printf(" %s %i", String, Cislo); Právě jsme si deklarovali 2 proměnné a to String a k němu jsme si přiřadili hodnotu "abcd" a proměnnou Cislo s přiřazenou hodnotou 0. Nyní využijeme fci sscanf, aby vzal daný řetězec a to Potrebuji 1000 a rozdělil je do těchto 2 proměnných. Jak si můžete všimnout, obsahuje 2 datové typy a to string a integer. Takže jelikož první údaj je string tak logicky první specifikátor(o nich později) bude s, a druhé je číslo, takže specifikátor bude i. Nyní se nám za proměnné dosadí oba údaje a do konzole se nám vypíše Potrebuji 1000, a ne abcd 0. Specifikátory Nebudu tu vypisovat všechny specifikátory, které sscanf obsahuje, ale jen prozatím ty, které uživatelé používají asi nejčastěji: Specifikátor Jméno Příklad i, d Integer 4, 72, -1024 [/td] --> s String Ahoj, Admin, sb75c4 l Boolean true, false f Float 0.5, 33.1, -99.9 h, x Hex FF, 0xAD35 u Jméno/ID hráče a botů SkiBig18, 2 r Jméno/ID hráče SkiBig18, 2 Integer Specifikátor se značí písmenkem i nebo d. Nejjednoduší specifikátor. Jde rozdělit 2 nebo i více řad čísel do daných proměnných, například: new Cislo1 = 0, Cislo2 = 0; sscanf("100 200", "ii", Cislo1, Cislo2); printf("%i %i", Cislo1, Cislo2); /* Vypíše 100 200 */ Není problém ani s řadou čísel, jen si musíte hlídat počet íček: new Cislo[6]; sscanf("1 4 9 2 -1 5", "iiiiii", Cislo[0], Cislo[1], Cislo[2], Cislo[3], Cislo[4], Cislo[5]); printf("%i %i %i %i %i %i", Cislo[0], Cislo[1], Cislo[2], Cislo[3], Cislo[4], Cislo[5]); V případě, že vynecháte jedno z íček, sscanf poslední hodnotu specifikuje jako 0 a také jí dosadí. To stejné platí i u stringu: sscanf("1 4 9 2 -1 5", "iiiii", Cislo[0], Cislo[1], Cislo[2], Cislo[3], Cislo[4], Cislo[5]); printf("%i %i %i %i %i %i", Cislo[0], Cislo[1], Cislo[2], Cislo[3], Cislo[4], Cislo[5]); /* Vypíše 1 4 9 2 -1 0 */ Lze nahradit písmeno i také písmenem d, výsledek i efekt bude naprosto stejný: sscanf("1 4 9 2 -1 5", "dddddd", Cislo[0], Cislo[1], Cislo[2], Cislo[3], Cislo[4], Cislo[5]); printf("%i %i %i %i %i %i", Cislo[0], Cislo[1], Cislo[2], Cislo[3], Cislo[4], Cislo[5]); /* Vypíše 1 4 9 2 -1 5 */ String Specifikátor se značí písmenkem s. Další nejčastěji používaný specifikátor. Používá se hlavně v příkazech pro důvody. Ale sscanf2 nabízí více možností práce se stringem. Jak jsem již na začátku ukazoval, kód: sscanf("Potrebuji 1000", "si", String, Cislo); Vypíše Potrebuji 1000. Ale co, když chceme do první proměnné přidat ještě slovo? sscanf("Potrebuji ihned 1000", "s[10]i", String, Cislo); Tak selže dosazování, jelikož slovo ihned není číslo, a po slově Potrebuji doplní nulu a tím končí. Řešení je prosté. Stačí buď přidat další specifikátor: new String[2][10], Cislo; sscanf("Potrebuji ihned 1000", "s[16]s[6]i", String[0], String[1], Cislo); printf("%s %s %i", String[0], String[1], Cislo); /* Vypíše Potrebuji ihned 1000 */ A nebo vynechat číslo a nechat jen jeden specifikátor pro celý text: new String[16]; sscanf("Potrebuji ihned", "s[16]", String); print(String); /* Vypíše Potrebuji ihned */ Ale problém je teď, že specifikátor vezme celý text, nebo-li všechno po slovech Potrebuji ihned(pokud samozřejmě bude mít větší délku). V případě, že potřebujeme jen samostatně jediné slovo, stačí přidat po specifikátoru mezeru: new String[16]; sscanf("Potrebuji ihned", "s[16] ", String); print(String); /* Vypíše Potrebuji */ Pole Specifikátor se značí písmenkem a<>. Práce s polem u sscanf je podobné jako stringu, s tím rozdílem, že velikost pole nepoužíváme jako délku, ale k dosazení počtu prvků, a za každý prvek se dosadí daná hodnota v poli určité proměnné, například: new Pole[5]; sscanf("1 3 8 6 2", "a<i>[5]", Pole); printf("%i %i %i %i %i", Pole[0], Pole[1], Pole[2], Pole[3], Pole[4]); /* Vypíše 1 3 8 6 2 */ Jak si můžete všimnout, specifikátory pro jediné pole jsou 2 a to a(array v překladu pole), a i jako integer. Aby si sscanf nepletlo pole a velikost retězce, využíváme na začátek specifkátoru pro pole, jiné závorky, a to <>. Specifikátor i pak obsahuje datové typy pole nebo-li čísla. A nakonec [5] je maximální počet buněk v poli. Samozřejmě lze kombinovat i jiné datové typy v poli, například string: new String[3][3 + 1]; sscanf("Abc Ab A", "a<s[4]>[3]", String); printf("%s %s %s", String[0], String[1], String[2]); /* Vypíše Abc Ab A */ Jak to funguje tady? Deklarovali jsme si 3 řetězce s počtem 4 znaků (3 + nul. znak). Za každý řetězec dosadí specifická písmena. Je to úplně stejné jako bychom retězci0( String[0] ) přiřadili hodnotu "Abc", řetězci1( String[1] ) hodnotu "Ab" a řetězci2( String[2] ) hodnotu "A". Enum Specifikátor se značí písmenkem e<>. Tento dodatek se považuje za nejlepší dodatek v sscanf. A ani se nedivím, jelikož vám umožní měnit výčet hodnot dokonce v samotném enumu. A jako u pole i zde platí, že lze přepsat všechny datové typy. Ale je to pár rozdílů, jeden z nejrelevantnějších je, že musíte vypsat všechny specifikátory všech datových typů, co enum obsahuje(logicky, jinak by sscanf nevěděl, jakou proměnnou má přesně v enumu přepsat). Ukážeme si to na příkladu: enum enum_PlayerInfo { e_AdminLevel, e_VipLevel, e_VipBodu, } new e_Enum[enum_PlayerInfo]; sscanf("5 1 1000", "e<iii>", e_Enum); printf("%i %i %i", e_Enum[e_AdminLevel], e_Enum[e_VipLevel], e_Enum[e_VipBodu]); /* Vypíše 5 1 1000 */ Zde jsem si deklarovali proměnnou s výčtem hodnot, který obsahuje AdminLevel, VipLevel a počet bodů. Sscanf nám zjistí ze všech specifikátorů ve specifikaci struktury v enumu(nebo-li v <>), že jde o čísla a tak přepíše hodnoty. Ano, práce s polem je mu velice podobná a teď zkusíme zapojit více datových typů a všem nastavíme nějakou hodnotu: enum enum_Info { e_Integer, e_String[24], Float: e_Float, e_Char } new e_Enum[enum_Info]; sscanf("10 Ahoj 12.33 c", "e<is[24]fc>", e_Enum); printf("%i %.2f %s %c", e_Enum[e_Integer], e_Enum[e_Float], e_Enum[e_String], e_Enum[e_Char]); /* Vypíše 10 12.33 Ahoj c */ Velké specifikátory V případě, že vložíme prázdný řetězec(či neúplný), můžeme mu při rozdělení přidat i tzv. "defaultní hodnoty", které pak dosadí, nejjednodušší příklad: Integer new Cislo; sscanf("", "I(10)", Cislo); printf("%i", Cislo); /* Vypíše 10 */ Specifikátor se značí písmenkem I nebo D. Jak si můžeme všimnout, sscanf dostal prázdný řetězec na rozdělení. Tak jak je možné, že se nám do konzole odešle 10? Je to prosté: U specifikátorů datových typů, jsme zaměnili malé i za velké I, což je znamení pro sscanf, že v případě, že tam hodnotou nenajde v řetězci, ať tam doplní jinou, a ta hodnota se přidává do kulatých závorek (). Samozřejmě, lze nastavit defaultní hodnoty i více prom. například: new Cislo1, Cislo2; sscanf("", "I(10)I(20)", Cislo1, Cislo2); printf("%i %i", Cislo1, Cislo2); /* Vypíše 10 20 */ String Specifikátor se značí písmenkem S. Tady je to zajímavější, jelikož defaultní hodnotu u stringu nemusíme psát do uvozovek: new String[4 + 1]; sscanf("", "S(Ahoj)", String); print(String); /* Vypíše */ Samozřejmě nesmíme zapomenout na délku stringu, jelikož nám to hodí varování. Doplňujeme zásadně až za defaultní hodnotou: new String[4 + 1]; sscanf("", "S(Ahoj)[5]", String); print(String); /* Vypíše Ahoj */ Pole Specifikátor se značí písmenkem A<>. Ani tady není extra rozdíl. Může se hodit při doplňování hodnot, například: new Pole[3]; sscanf("1 2", "A<i>(3)[3]", Pole); printf("%i %i %i", Pole[0], Pole[1], Pole[2]); /* Vypíše 1 2 3 */ Všimněte si ale, že nesmíme přepsat specifikátor integeru, v poli na velké písmenko ale musíme celé pole. I tady je funkčnost jednoduchá. Pole, které jsme si deklarovali má 3 prvky. My mu ale doplníme jenom 2. Díky velkému písmenku A informujeme sscanf, že tam nebudou všechny údaje, a tak poslednímu ať defaultně přiřadí hodnotu 3. A co, když tam nebudou například 2? Postup je stále stejný: sscanf("1", "A<i>(1, 2)[3]", Pole); A jak postup, tak výsledek bude stejný. Sscanf dostane na rozdělení pouze jeden údaj ze 3, které mají být správně v poli, a tak vezme defaulní hodnoty a doplní je. Ale co, když nastavíme defaulní hodnotu pouze 1 na 2 chybějící prvky?: sscanf("1", "A<i>(2)[3]", Pole); Tady sscanf nemá moc na vybranou. I když jeho primárním cílem bude doplnit všechny hodnoty do pole, dostane jen jednu defaultní, a zapracuje velice zajímavě: vezme tu jedinou defaultní a doplní je do všech prvků v poli, takže ve výsledku se nám do konzole vypíše 1 2 2 Enum Specifikátor se značí písmenkem E<>. Tady je problém, že uživatel ne jen, že musí přidávat všechny specifikátory ve výčtu, ale také ještě v případě práce s defaultními hodnotami v enumu musí vypsat k každému údaji defaultní hodnotu, i když už nějakou má, například: sscanf("11", "E<iii>(11, 22, 33)", epromenna); printf("%i %i %i", epromenna[e_cislo], epromenna[e_cislo2], epromenna[e_cislo3]); /* Vypíše 11 22 33 */ Jak si můžete všimnout, v řetězci je 11, ale stejně jí musíme přidat do defaultních hodnot. Na závěr kapitoli něco trošku těžšího: sscanf("", "E<s[5]fs[6]ii>(Ahoj, 11.2, Scydo, 11, 22)", epromenna); print(epromenna[e_String]); printf("%.1f", epromenna[e_Float]); print(epromenna[e_String2]); printf("%i", epromenna[e_Integer]); printf("%i", epromenna[e_Integer2]); /* Vypíše: Ahoj 11.2 Scydo 11 22 */ Použití Změnit hráčovi počet životů Zabanovat hráče s důvodem Nahrát více údajů v jednom souboru Download To už je složitější, jelikož i když se vydala nová verze, spousty uživatelů hlásí, že buď je tam něco nefunkční a nebo samotná verze nefunguje. Proto jsem vám pro jistotu nahrál verzi sscanfu, kterou používám já a použil jsem ho i na kódy v tomto návodě, a je plně funkční: https://uloz.to/!vV4WzRFEG/sscanf2-zip Ihned na začátek zdrojového kódu samozřejmě nesmíte zapomenou sscanf vůbec nahrávat: #include <sscanf2> A do konfigurace serveru do řádku pro nahrávání pluginů na Windows vepíšete: plugins sscanf V případě Linuxu: plugins sscanf.so Závěr Naschvál jsem vynechal spousty ještě dodatků v sscanf2, například "quite" stringy, jelikož nevidím moc lidí, co by to tady využívalo. A na závěr bych chtěl dodat, že některá teoretická vysvětlení se mohou zdát neúplná, pozměněná a nebo trošku špatná. Důvodem je, že zcela správnÁ vysvětlení by prostý začátečník nebo i čtenář nepochopil. Samozřejmě, pokud mám některé hrubější chybu v kódě nebo v teorii, jak mi napište. Ověřený návod Tento návod prošel validací, a lze ho proto považovat za ověřený.
  20. I-ZCMD Obsah: Úvod I-ZCMD Vytváření příkazů Funkce includu Tipy a triky Příklady Závěr 1. Úvod: V tomto návodu se podíváme na práci s příkazovým systémem I-ZCMD. Konkrétně tedy probereme vytváření příkazů, používání funkcí includu a nějaké tipy. 2. I-ZCMD Příkazový systém I-ZCMD vytvořil Yashas, jako reakci na neaktuálnost ZCMD, z kterého také vychází. Jedná se o aktuálnější, optimalizovanější a rychlejší ZCMD. Stáhnout jej můžete na tomto githubu. Návod se bude držet aktuálního I-ZCMD, ale většina informací platí i k ZCMD od Zeexe. 3. Vytváření příkazů Příkazy můžeme vytvářet hned několika způsoby a to COMMAND:nazev_prikazu(playerid, params[]) { //další kód } CMD:nazev_prikazu(playerid, params[]) { //další kód } command(nazev_prikazu, playerid, params[]) { //další kód } cmd(nazev_prikazu, playerid, params[]) { //další kód } nazev_prikazu – váš název příkazu bez lomítka (kill, pm, admins). playerid – id hráče, který odeslal příkaz. params[] - text, který hráč napsal za samotný příkaz. Parametry jsou od názvu příkazu oddělené mezerou. pozn. V příkazech při vrácení 0 (CMD_FAILURE) a nepoužití OnPlayerCommandPerformed se vypíše hláška "UNKNOWN COMMAND". Doporučuji tedy vracet 1 (CMD_SUCCESS). V samotném scriptu nepoužíváme OnPlayerCommandText (I-ZCMD ho již zahrnuje), protože se stejně nezavolá. Místo této funkce zde máme dvě funkce, na které se nyní podíváme. 4. Funkce includu V I-ZCMD se narozdíl od ZCMD tyto funkce volají přímo. To je jednou z optimalizací, kterou tento systém prošel (ZCMD využívá funkci CallLocalFunction, která je více časově náročná). . ● OnPlayerCommandReceived(playerid, cmdtext[]) je plnou náhražkou za OnPlayerCommandText a má stejné parametry. Funkce se volá před samotným procesem zpracování a volání zadaného příkazu. Vrácením 0 můžeme ukončit zpracování příkazu, ale nebude vypsána hláška "UNKNOWN COMMAND". ● OnPlayerCommandPerformed(playerid, cmdtext[], success) je další ze zmiňovaných dvou funkcí. Narozdíl od předešle, se tato funkce volá až po zavolání našeho příkazu. Funkce má stejné parametry, ale jeden zde přibyl. Hodnota success odpovídá vrácené hodnotě funkce CallLocalFunction (pokud příkaz existuje, odpovídá vrácené hodnotě v daném příkazu). Díky tomuto parametru si tedy můžeme kontrolovat, zda příkaz existuje, proběhl v pořádku a podobně. Vrácení 0 v této funkci vypíše hlášku "UNKNOWN COMMAND". 5. Tipy a triky ● I-ZCMD není defaultně case-sensitive. Znamená to tedy, že příkaz "/prikaz" a "/PRIKAZ" vyvolá stejnou funkci, avšak tuto vlastnost můžeme změnit následující definicí (nelze u ZCMD). #define IZCMD_ENABLE_CASE_SENSITIVITY . ● Narozdíl od ZCMD, se nehookuje OnFilterScriptInit/OnGameModeInit, a proto nijak neřešíme definici FILTERSCRIPT. . ● Pokud chceme zjistit, zda hráč nezadal parametry, využijeme k tomu isnull (součástí includu). Viz spoiler. . ● Příkaz můžeme vyvolat odkudkoliv následujícím způsob (za playerid a params si dosadíme příslušné hodnoty) cmd_nazev_prikazu(playerid, params); Tímto způsobem můžeme jednoduše vytvořit mnoho příkazů, které provádějí stejné akce. 6. Příklady ● Jednoduchý příkaz na zabití hráče (bez parametrů). COMMAND:kill(playerid, params[]) { SetPlayerHealth(playerid, 0); return 1; } . ● Jednoduchý příkaz (s parametrem), ukázka použití isnull a chybová hláška. CMD:say(playerid, params[]) { if(isnull(params)) return SendClientMessage(playerid, -1, "Použití: /say [zpráva]"); new str[145]; GetPlayerName(playerid, str, MAX_PLAYER_NAME); format(str, sizeof str, "%s říká: %s", str, params); SendClientMessageToAll(str); return 1; } . ● Vlastní text místo "UNKNOWN COMMAND". public OnPlayerCommandPerformed(playerid, cmdtext[], success) { if(!success) return SendClientMessage(playerid, 0xFF0000FF, "Příkaz neexistuje"); return 1; } . ● Zakázání příkazů danému hráči. public OnPlayerCommandReceived(playerid, cmdtext[]) { if(isMuted[playerid]) { SendClientMessage(playerid, 0xFF0000FF, "Máte zakázáno používání příkazů"); return 0; } return 1; } . 7. Závěr To by bylo k tomuto návodu o jednom z nejrychlejších příkazových systémů vše. Pokud máte nějaké otázky, připomínky, nebo máte cokoliv jiného na srdíčku, můžete dát vědět do komentářů. 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 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ý.
  22. DOF2 UKLÁDÁNÍ A NAČÍTÁNÍ, UŽ NIKDY VÍC DINI ***** Nemůžu uvěřit, že i po tak dlouhé době si hodně začátečníků myslí, že se s dini furt nejjednodušeji pracuje, a nechtějí ani dof2, protože buď to podle nich nefunguje a nebo je to moc těžké... Ale to jsou jenom kecy. Ve skutečně rozdíl práce mezi dof2 a dini je asi tak 5%. Ukážu vám, jak na to. Instalace je jednoduchá. Stačí z odkazu http://pastebin.com/TQJGwYyZ zkopírovat obsah do textového souboru a uložit ho nejlépe jako dof2.inc(ta koncovka .inc je tam důležitá). #include <dof2> VYTVOŘIT SOUBOR DOF2_CreateFile(JménoSouboru[], Heslo[] = ""); Parametry: JménoSouboru[] - Jméno souboru, který má vytvořit ve scriptfiles. V případě, že jde o větší cestu, stačí přidávat lomítka. Heslo[] - Vepíše hash string(aka heslo) rovnou do souboru a nemusíme používat fci SetString. V případě, že to nechceme, můžeme ten argument jednoduše vynechat. Ukázka použití: EXISTENCE SOUBORU DOF2_FileExists(JménoSouboru[]); Ukázka použití: public OnGameModeInit() { if (DOF2_FileExists("soubor.txt")) { DOF2_CreateFile("soubor.txt"); } return true; } PŘEJMENOVAT SOUBOR DOF2_RenameFile(JménoSouboru[], NovéJmeno[]); Ukázka použití: DOF2_RenameFile("soubor.txt", "Soubornik.txt"); /* Nyní se soubor ve scriptfiles přejmenuje na Soubornik */ SMAZAT SOUBOR DOF2_RemoveFile(JménoSouboru[]); Ukázka použití: DOF2_RemoveFile("soubor.txt"); /* Zcela smaže soubor.txt ve scriptfiles */ ULOŽENÍ SOUBORU DOF2_SaveFile(); Ukázka použití: public OnGameModeInit() { if (!DOF2_FileExists("soubor.txt")) { DOF2_CreateFile("soubor.txt"); DOF2_SetInt("soubor.txt", "jenomcislo", 666); DOF2_SaveFile(); } return 1; } VEPSAT STRING/TEXT DO SOUBORU DOF2_SetString(JménoSouboru[], Klíč[], String[]); Parametry: Klíč[] - Jde o informaci, pod jakým klíčovým slovem, by se měla ta daná hodnota ukládat. Nejčastěji jde o jedno vystihující slovo. String[] - Údaje, které se vepíšou do souboru(v tomhle případě je hodnota řetězec). Ukázka použití: public OnPlayerConnect(playerid) { new Soubor[40 + 1], Jmeno[MAX_PLAYER_NAME + 1]; GetPlayerName(playerid, Jmeno, sizeof(Jmeno)); GetPlayerName(playerid, Soubor, sizeof(Soubor)); strcat(Soubor, ".txt"); if (!DOF2_FileExists(Soubor)) { DOF2_CreateFile(Soubor); DOF2_SetString(Soubor, "JmenoHrace", Jmeno); /* Nyní se ve souboru uloží údaj: JmenoHrace = SkiBig18 */ DOF2_SaveFile(); } return 1; } ZJISTIT STRING/TEXT ZE SOUBORU DOF2_GetString(JménoSouboru[], Klíč[]); Ukázka použití: new Text[MAX_PLAYER_NAME + 1]; strcat(Text, DOF2_GetString(Nick, "JmenoHrace")); print(Text); /* Vypiše: SkiBig18 */ return 1; } VEPSAT INTEGER/ČÍSLO DO SOUBORU DOF2_SetInt(JménoSouboru[], Klíč[], Číslo); Parametry: Číslo - Údaje, které se vepíšou do souboru(v tomhle případě je hodnota číslo). Ukázka použití: DOF2_SetInt(Nick, "Penize", GetPlayerMoney(playerid)); ZJISTIT INTEGER/ČÍSLO ZE SOUBORU DOF2_GetInt(JménoSouboru[], Klíč[]); Ukázka použití: GivePlayerMoney(playerid, DOF2_GetInt(Nick, "Penize")); VEPSAT BOOLEAN DO SOUBORU DOF2_SetBool(JménoSouboru[], Klíč[], bool:Boolean); Parametry: Boolen - Údaje, které se vepíšou do souboru(v tomhle případě je hodnota boolen). Ukázka použití: DOF2_SetBool(Nick, "IsVip", bIsVip[playerid]); ZJISTIT BOOLEAN ZE SOUBORU DOF2_GetBool(JménoSouboru[], Klíč[]); Ukázka použití: bIsVip[playerid] = DOF2_GetBool(Nick, "IsVip"); VEPSAT FLOAT DO SOUBORU DOF2_SetFloat(JménoSouboru[], Klíč[], Float:FloatHodnota); Parametry: FloatHodnota - Údaje, které se vepíšou do souboru(v tomhle případě jsou hodnoty desetinná čísla). Ukázka použití: new Float: Health; GetPlayerHealth(playerid, Health); DOF2_SetFloat(Nick, "Health", Health); ZJISTIT FLOAT ZE SOUBORU DOF2_GetFloat(JménoSouboru[], Klíč[]); Ukázka použití: SetPlayerHealth(playerid, DOF2_GetFloat(Nick, "Health")); UŽITEČNÉ FUNKCE DOF2 Nyní přichází fce, které dini neobsahuji, a které můžou být někomu užitečné. Jedna z nich je možnost si vytvořit jakousi zálohu i s časem: DOF2_MakeBackup(JménoSouboru[]); Ukázka použití: DOF2_MakeBackup("soubor.txt"); Za další obsahuje hashování textu, ale je to součásti fce, která spolupracuje s DOF2_CreateFile a to přesněji s parametrem Heslo[], které můžete spolu s vytvořením souboru také uložit: DOF2_CheckLogin(JménoSouboru[], Heslo[]); Ukázka použití: if (dialogid == dialog_Login) { if (!response) return 1; if (DOF2_CheckLogin(Nick, inputtext)) { /* Nahrát data */ }else { /* Zadal nesprávné heslo. */ } } Další tu je možnost přejmenovat samotný klíč v souboru, kam se ukládají údaje, kdyby se vám na něm něco nelíbilo: DOF2_RenameKey(JménoSouboru[], JménoKlíče[], NovéJméno[]); Ukázka použití: DOF2_SetInt(Nick, "Penize", GetPlayerMoney(playerid)); DOF2_RenameKey(Nick, "Penize", "Prachy"); DOF2_SaveFile(); UKÁZKA POUŽITÍ DOF2 /* Deklarujeme si 4 nejznámější datové typy: */ new Cislo = 101, Float: DesCislo = 103.3, String[10] = "Ahoj", bool: Boolean = true; public OnFilterScriptInit() { /* Zjistíme, jestli, že neexistuje, jestliže ne, vytvoří nový */ if (!DOF2_FileExists("soubor.txt")) DOF2_CreateFile("soubor.txt"); /* Vepíše integer do souboru: */ DOF2_SetInt("soubor.txt", "Cislo", Cislo); /* Vepíše float do souboru: */ DOF2_SetFloat("soubor.txt", "DesCislo", DesCislo); /* Vepíše string do souboru: */ DOF2_SetString("soubor.txt", "String", String); /* Vepíše boolean do souboru: */ DOF2_SetBool("soubor.txt", "Boolean", Boolean); /* Uloží (uzavře) soubor: */ DOF2_SaveFile(); /* A nyní si můžeme všechny údaje načíst: */ /* Přiřadí k proměnné Cislo zjištěnou hodnotu ze souboru: */ Cislo = DOF2_GetInt("soubor.txt", "Cislo"); /* Přiřadí k proměnné DesCislo zjištěnou hodnotu ze souboru: */ DesCislo = DOF2_GetFloat("soubor.txt", "DesCislo"); /* Přiřadí k proměnné String zjištěnou hodnotu ze souboru: */ strcat(String, DOF2_GetString("soubor.txt", "String")); /* Přiřadí k proměnné Boolean zjištěnou hodnotu ze souboru: */ Boolean = DOF2_GetBool("soubor.txt", "Boolean"); return 1; } A zde je screen, jak se nám uložily údaje do souboru: ROZDÍL PRÁCE MEZI DINI A DOF2 Jak jsem již psal, rozdíl v práci s ním je asi tak 5%. Jestliže mi nevěříte ani po tomto návodu, zde je odkaz na pastebin, kde jsem shrnul ukázky fcí asi 3 nejznáměnších používaných includů na ukládání a načítání: pastebin.com/8MW3kzbF A pokud to stále je málo, tak dokonce i samotný dof2 obsahuje preprocesor, který stačí jen přidat, a můžete pracovat úplně stejně jako s dini: #if defined DINI_CONVERT #define dini_Exists DOF2_FileExists #define dini_Remove DOF2_RemoveFile #define dini_Create DOF2_CreateFile #define dini_Set DOF2_SetString #define dini_Get DOF2_GetString #define dini_IntSet DOF2_SetInt #define dini_Int DOF2_GetInt #define dini_BoolSet DOF2_SetBool #define dini_Bool DOF2_GetBool #define dini_FloatSet DOF2_SetFloat #define dini_Float DOF2_GetFloat #define dini_Unset DOF2_Unset #define dini_Isset DOF2_IsSet #if !defined _dini_included #define _dini_included #endif #endif Ověřený návod Tento návod prešiel validáciou a preto je možné ho považovať za overený.
  23. Zdravím všechny nováčky, co vidějí poprvé Pawno, tento tutoriál už se bude týkat samotného pawna Začneme teda s tím že si vysvětlíme něco o pawnu a pawn: Pawn: -je programovací jazyk určený hlavně k tvorbě SA-MP modů a Filterscriptů. Pawno: -je editor scriptovacího jazyka Pawn pro hru SA-MP. Tento editor je považován za oficiální editor. -jestliže vytvoříte nějaký filterscript nebo mode tak mají koncovku .pawn, .amx . Dále bych řekl, co jsou to filterscripty: -Filterscript je vlastě script, který si vytvoříte, a poté si ho přidáte do složky filterscripts, je to například: Carmenu, WeaponMenu, Warpy, Tuning, zaměstnání, banka, firmy, gangy, domy, atd... Gamemode: -Gamemod je vlastě herní mod serveru, například: Realná Země, Craftyho Pařba, SFDFD, Dream Gaming, atd ... Teď už teda k nějakým základům: Takže dneska bych vám ukázal první příkaz a vlastně to aby jste se mohli ocitnout na té vaší mapě, takže tedy: otevřeme složku pawno, poté soubor pawno s koncovkou .exe, doporučuji spouštět jako správce, jelikož po spuštění máte v pravo takovou tabulku funkcí, a pokud nespustíte jako správce, tak ji tam mít nebudete. Takže tedy spustíme jako správce, v levo nahoře dáme file, poté New, open jen pokud, jestliže máte třeba něco rozdělanýho a uložily jste si to, tak spustíte pawno a místo file - new, dáte file - open. Nuže tedy jsme si spustily pawno. Vidíme několik řádků s různýma věcma. Nějak je rozebírat nebudu, vrhneme se rovnou na pojmenování modu a na ten první příkaz - warp. 1. Zajedem na řádek 91. Máme tam asi toto: if (strcmp ("/mycommand", cmdtext, true, 10) == 0) 2.Místo /mycommand si dáme příkaz v mém případě to bude warp, a to warp do Los Santos, takže dáme /LS, jinak vše necháme, tento řádek, byl vlastně to, co musíme zadat pro provedení akce. 3. přejedeme tam, kde máme zelený text // DO SOMETHING HERE, text označíme a smažeme a ničím poté nehýbem, a začneme psát napíšeme: SetPlayerPos(playerid, x, y, z) X, Y, Z tam mám pro to, nebo ještě jsme nezjistily pozici na kterou se chceme portnout, ale zatím dopíšeme příkaz, a pak doladíme to, co chybí. Takže máme: SetPlayerPos(playerid, x, y, z) - Tento příkaz obsahuje souřadnice, na které to warpne, jak dopíšeme, tak dejte enter a píšem SendClientMessage(playerid, color, Cont Message) Takže tedy tohle je tedy druhý řádek, jak máme color, tak vložíme např toto: 0xFF0011FF, toto je červená barva, o zjištění barev si povíme až příště, ale zatím necháme tu červenou a místo "color" dáme tedy ten červený text, dále v tom dolním máme "Cont Message" což je zpráva, která se vám zobrazí po napsání /LS , dáme tedy třeba "Byl jsi teleportovan!" důležité mít tam ty uvozovky a souřadnice zjistite tak, že půjdete do hry, je jedno na jaký server, ale v singleplayeru to nejde, příjdete na místo, na které se chcete warpnout a dáte /save (pokud chcete napsat k tomu nějaký text třeba warpLS tak to uděláte takhle: /save warpLS). Půjdete poté do dokumenty/Gta Andreas User Files/ Samp a otevřeme program v textovém dokumentu savedposition najdeme tam souřadnice a zatím by měl být ten váš text, První jednociferné číslo necháme a následujících 6 čísel zkopírujeme a vložíme místo X, Y, Z. Celé ty 3 řádky teda vypadají takto: if (strcmp ("/LS", cmdtext, true, 10) == 0) SetPlayerPos(playerid, 1788.8439,-1696.0013,13.4861); SendClientMessage(playerid, 0xFF0011FF, "Byl jsi teleportovan!"); Ale nikdy nezapomeňte příkazy ukončovat ; Nuže tedy dáme file - Save as, zvolíme třeba plochu, pojmenujeme jak chceme a OK, dáme ještě F5, tím se zkontroluje jestli není někde chyba, jinak by se taky mohlo stát že kdyby jste si ten server načetli tak mi to hned crashlo. Soubor tedy i po kontrole by měl být dvakrát: jednou s koncovkou .pwn a druhou s .amx, oboje zkopírujeme do složky se serverem a do složky gamemodes, a otevřeme server.cfg a místo gamemode0 grandlarc ten grandlarc smažeme a napíšeme jméno toto souboru co jste si vložily do složky, vše stejně, MALÁ I VELKÁ PÍSMENA !!! Nyní když půjdete do hry, tak by vám server měl naběhnout, sice bez výběrech skinu, bez možností spawnování, absolutně bez ničeho, jen s tím warpem co jste si vytvořily stačí tedy otevřít Chat "T" a napsat ten příkaz (u mě /LS). Měli by jste se teleportovat a i text by to mělo napsat. Toť vše k druhému dílu, příště bych rozebral nejspíše Barvy. Brzo výjde další tutoriál. PS: Ještě jsem úplně zapomněl na pojmenování modu takže: Přejdeme na řádek 27 a pojmenujeme v závorce To samé i na řádku 36.
  24. Zdravím všechny začátečníky, co něvědí vůbec, jak začít s vytvořením serveru, pokud jste to vy, tak jste na správném místě, chtěl bych vás nějaké základy naučit, tento příspěvek nebude přímo na pawno, bude na stáhnutí serveru. Takže tedy: Stáhneme si server na sa-mp.com, a to tak, že klikneme na "Download Page" Oranžově zvýrazněno. Vždy stahujte jen tu nejnovější verzi, sa-mp verzí je totiž několik, ale aktuálně je nejnovější 0.3.7, takže tedy po kliknutí na "Download Page" se nám ukáže možnost stáhnou "SA-MP 0.3.7 Client Mirror by SA-MP team, ale předpokládám, že klienta máte, tak tedy níže máte možnosti stáhnout buď: "SA-MP 0.3.7-R2 Windows server", nebo "SA-MP 0.3.7-R2 Linux Server x86". Zvolíme tedy Windows server, pokud tedy máte Systém windows, co se týče instalace klienta tak ta je, jak klasická instalačka, nic těžkého, proto nemá cenu se rozepisovat o instalaci, a přejdeme radši k serveru, po stáhnutí složky se serverem, extrahujeme WinRar archiv, předpokládám, že to všichni máte v tomto programu, popřípadě i jiném, ale prostě tedy extrahujem, extrahovanou složku si můžeme pojmenovat, jak chceme v našem tedy mém případě se složka bude jmenovat "Server" , ale vaše složka se může jmenovat jakkoliv. Po otevření uvidíme ve složce pár dalších složek a souborů, otevřeme soubor server s koncovkou .cfg, pokud nemáte možnost spustit v poznámkovém dokumentu, nebo Wordpadu, tak si to udělejte.Já osobně doporučuji Poznámkový blok. Nuže tedy po otevření souboru server.cfg vydíme nějaké věty, takže bych je všechny nějak rozebral, takže: echo Executing Server Config... - necháme, tak jak je. lanmode 0 - taky necháme. rcon_password changeme - Rcon heslo, které si můžete změnit na jakékoliv, a to tak, že smažete slovo "changeme" a nahradíme svím heslem, v mém případě to bude třeba "1234". maxplayers 50 - Počet slotů serveru, můžeme změnit na téměř jakýkoliv počet, v mém případě to bude třeba "50" port 7777 - port serveru, který se zadává za IP je ip čili třeba 198.168.0.1:7777, port necháme těch "7777" hostname - jméno serveru, za to hostname napíšeme jméno jaké chceme, ale nezapomeňte oddělit mezerníkem, nesmí to být takhle "hostnamejménoserveru". Já zvolím třeba jméno "Test" gamemode0 grandlarc - Gamemode serveru, například "Realná Země", zatím žádný mod nemame, takže necháme tak jak je. Ostatní necháme tak, až na language a na weburl. weburl www.sa-mp.com - Zde si můžete místo toho "www.sa-mp.com" napsat svůj web serveru, pokud máme, ale dejme tomu, že nemáme, tak necháme. language - Jazyk serveru, zobrazuje se vedle Mode, když spustíte klient. Config máme nastavenej, uložíme dokument a zavřeme. Nyní spuštění serveru: Otevřeme soubor "samp-server s koncovkou .exe . Server se bude chvíli načítat a měl by se načíst. Poté stačí jen spustit klienta, kliknout na fajfku v oranžovém čtverečku a zadáme vaší IP s portem :7777. Ptáte se, jak mám zjistit svojí IP ? Já neznám svou IP. Odpověď jednoduchá: jděte do startu (říkám, jak je to na Windows 7). Jdeme tedy do startu a napíšeme cmd, naskočí program cmd s koncovkou .exe, spustíme jej, naskočí nějáké věci, a tam, kde můžete psát napíšete ipconfig. Poté naskočí nějaké IP, ale nás zajímá Adresa IPv 4, tu si přepíšeme do té možnosti přidání serveru, a za tu ip :7777, server se nám nyní přidal, a můžeme se volně připojit, zaregistrujeme se, vyberete si skin, spawn lokaci, no a jsme na základním primitivním serveru, ale na menší pojížděnou to jde, ovšem tam skoro nic není, takže je to vcelku na nic. Příště si už ukážeme základy s pawnem. Doufám že se vám můj první Tutoriál líbil, video bylo sice jen pro začátečníky, pro ty co vydí poprvé možnost vytvoření serveru atp ... Ale myslím že to bylo srozumitelně vysvětlené. Již brzy bude další tutoriál.
  25. 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ý.
×
×
  • Create New...