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. Zdravím, Chtěl bych rozjet takový menší seriálek o tom jak vytvářet scripty, a módy do SA-MP v PHP. Proč ? Je to jednoduché. Díky PHP si do sampu přineseme možnost OOP. Ale k tomu se dostaneme v průběhu. Celý projekt bude dostupný na Githubu. V tomto prvním díle Vám ukážu jak to cele sprovoznit. A od dalšího dílu už začneme programovat Stáhneme: SA-MP Server => zde PHP Plugin => zde Tutoriálové repo => zde Rozbalíme server a sloučíme ho s obsahem archivu s pluginem. Složka serveru by měla vypadat tedy zhruba takto: Vytvoříme si ve složce gamemodes libovolný pwn soubor. Já jsem použil gamemod bare ve kterém jsem obsah nahradil za #include <a_samp> main(){} Zkompilujeme a tím jsme hotoví s jazykem pawn Server.cfg by měl vypadat přibližně následovně. echo Executing Server Config... lanmode 0 rcon_password changedfdfme maxplayers 50 port 7777 hostname SA-MP 0.3 Server gamemode0 bare filterscripts plugins samphp announce 0 chatlogging 0 weburl www.sa-mp.com onfoot_rate 40 incar_rate 40 weapon_rate 40 stream_distance 300.0 stream_rate 1000 maxnpc 0 logtimeformat [%H:%M:%S] language English Po nastartování serveru by jste měli v konzoli vidět pár printů ohledně toho jak programovat.
  2. Ahoj, koukám, že tu vznikla nová sekce, tak přidám moji serií tutoriálů na C#. Série obsahuje 45 dílů. Současně již nepokračuje, protože není nálada ani čas. Takže doufám, že to někomu pomůže aspoň do začátků a nedělal jsem to zbytečně. Takže ať se líbí Kompletní série je zde: (jednotlivé díly potom na pravé straně) https://www.youtube.com/watch?v=k2KqJEP05Z4&list=PL8428DD4872FA7FB3&index=1 Případné dotazy, cokoliv, kolem videí, C# můžete psát sem. Určitě se najdou tací, kteří dokáží zodpovědět dotazy ohledně tohodle téma
  3. Úvod do OOP #1 Obsah: Úvod Pojmy Závěr 1. Úvod Jenom bych chtěl předem říci, že téma popisuji s nadsázkou, proto pokud objevíte nějakou blbost/nedostatek, tak mi to okomentujte a opravím/přidám. Co vlastně OOP je? Jedná se o Objektově-orientované programování a je jedním z nejvyužívanějších programovacích paradigmat1. Těch paradigmat je spoustu, určitě jste zaslechli o procedurální2, logické3 nebo funkcionální4 a další a další. Než si uvedeme nějaké základní pojmy, bylo by fajn si říct jaké jsou vlastně výhody OOP. Hlavní výhodou OOP je snažší údržba, rychlejší vývoj aplikace (z hlediska týmového), méně chybovost a rychlá orientace. Nevýhody – koncept třídy (vysvětlíme si později pojem) jedné osoby nemusí být sympatické té druhé. Většinou se proto dává důraz na to, že třídy se snaží být co nejvíce nezávislé nezasahujíc do něčeho co nemá zasahovat/co nemá v popisu práce. Dále chybou je zneužívání OOP, vytváření různých tříd na vše možné, co člověka napadne a špatně využití zapouzdření. Prakticky třídy vyžadují ohromnou dokumentaci a přípravu. 1 jednají se o styl, koncept a principy programování 2 nebo také imperativní – hlavní charakteristikou je výpočet pomocí posloupností příkazů a určuje přesný postup, např. C, PHP atd. Dělí se ještě do dalších podskupin, ale ty řešit nebudeme. 3 vyhodnocování matematickou logikou, např. prolog 4 matematické funkce a jejich výpočetní vyhodnocování – lambda kalkul, lisp, Zpravidla se jednají o rekurentní výpočty. 1. Pojmy Třída (class) je abstrakce entity, popisuje datový typ. Udává nám jaké vlastnosti (členy) bude mít objekt (také jako instance třídy případně proměnné). Mezi vlastnostmi se zařazují členské proměnné (atributy, položky, attributes) a interface také jako členské funkce (metody, methods). Třídy se mohou i libovolně skládat resp. objekt třídy x je členskou proměnnou třídy y. Na následujícím příkladu si všechny tyto pojmy ukážeme a vysvětlíme. Příklady se pokusím vždy co nejvíce předvádět objektivně (jelikož deklarace tříd apod se liší v závislosti v jakém jazyku programujete), pro upřesnění se budu spíše držet syntaxe C++ (nejsou avšak korektní). Uvedený příklad budu postupem času rozšiřovat dle nových pojmů co si zavedeme. Na OOP samozřejmě také existují spoustu prog. konvencí, ačkoliv v téhle kapitole se jich držet nebudeme kvůli znázornění základních pojmů Př. Zvolme třídu Web. Jeho atributy bude návštěvnost, url a majitel webu, který je objektem třídy Osoba. Obsahuje jen jednu členskou metodu IncreaseTraffic a to na inkrementaci návštěvnosti. Třída Osoba obsahuje jméno, věk a víceméně pohlaví. class Osoba { /* Member variables */ string name; int age; bool gender; } class Web { /* Member methods */ IncreaseTraffic(); /* Member variables */ int traffic; string url; Osoba owner; } /* V závislosti na jazyk, ve kterém programujeme může definice členských metod být jinačí. Pro přehlednost vždy definici funkce budu dávat vně tříd */ IncreaseTraffic() { ++traffic; } /* Deklarace objektu pak vypadá:*/ Web pawnocz = new Web(); /* alokace objektu Webu s názvem pawnocz */ pawnocz.url = "pawno.cz"; /* k jednotlivým atributům/metodám se přistupuje pomocí tečkové notace případně šipkové (např. v PHP). Zde nastavujeme atribut */ pawnocz.owner.name = "chytrak" /* nastavování členských proměnných objektu owner (patriot Print) */ pawnocz.IncreaseTraffic(); /* voláme funkci IT(); k pawnocz Konstruktory a destruktory. Co to je? Konstruktor se deklaruje jako metoda a volá se vždy při vytvoření objektu1. Tzn když jsme deklarovali objekt pawnocz, zavolal se konstruktor. Ten ale nemáme deklarovaný ani definovaný, proto si zpravidla kompilátor vygeneruje sám2. Obecně o konstruktorech je toho hrozně moc informací, ale v základní verzi si uvedeme jen inicializační bez parametrů a s parametrama. Destruktor se naopak volá při zaniknutí objektu. Dobré zmínit je, že konstruktor nelze explicitně volat na existující objekt. 1 poctivému čtenáři může v tuhle chvíli dojít, že při vytvoření objektu pawnocz se také a dokonce jako první zavolal konstruktor Osoba 2 pro zajímavost, C++ dokáže vytvořit inicializační konstruktor na vynulování proměnné. v Javě naopak vytvoří prázdný konstruktor. Více informací o C++ konstruktoru – http://en.cppreference.com/w/cpp/language/initialization Pojďme rozšířit náš příklad. Destruktor a konstruktor se deklaruje v závislosti na jazyku (např v PHP __construct, __destruct). Pro zpřehlednění si smažeme třídu Osobu a změníme majiteli datový typ. class Web { /* Constructor & destructor */ Web(); /* konstruktor MUSÍ mít stejný název jako třída a NEMÁ návratovou hodnotu */ ~Web(); /* pro destruktor platí to co u konstruktoru, akorát před názvem je '~' */ IncreaseTraffic(); int traffic; string url; string owner; } Web() { traffic = 50; } /* inicializační konstruktor bez parametru */ IncreaseTraffic() { ++traffic; } Web pawnocz = new Web(); /* při alokaci webu je nyní traffic rovna 50 */ pawnocz.url = "pawno.cz"; pawnocz.owner = "chytrak" pawnocz.IncreaseTraffic(); První větším pojmem, které se setkáme při OOP je zapouzdření (anglicky encapsulation). Jak jsem již trochu nastínil nějaké settery a gettery. Jedná se vlastně o viditelnost neboli přístup k členům třídy. Dělíme do tří skupin – public, private, protected. Public znamená, že je přístupná komukoli v programu. Private je přístupná POUZE a JEN POUZE v dané třídě (neplést si to s objekty). K protected dojdeme později, jelikož ještě neznáme pojem dědění. Pojďme si zase rozšířit náš příklad. V našem příkladu použiji C++ encapsulation, jelikož mi přijde takové hezčí na uvedení. Pro poznámku, třída v C++ je implicitně privátní, zpřístupníme informace tím, že viditelnost označíme jinak. Víc na příkladech class Web { public: /* veřejná viditelnost – implicitně (tedy defaultně) je private a nepíše se tam. */ Web(); /* konstruktor a destruktor musí být vždy PUBLIC */ ~Web(); IncreaseTraffic(); /* v Javě se nedělí na viditelnost jako v C++, ale označuje klíčovým slovem public/private/protected před metodou případně u proměnných. Viz public IncreaseTraffict(); */ string owner; private: /* privátní */ int traffic; /* v Javě private int traffic */ string url; } Web() { traffic = 50; } /* inicializační konstruktor bez parametru */ IncreaseTraffic() { ++traffic; } Web pawnocz = new Web(); pawnocz.url = "pawno.cz"; /* CHYBA, proměnná url se nachází v private sekci */ pawnocz.IncreaseTraffic(); /* VALIDNÍ KROK, metoda se nachází v public sekci */ pawnocz.owner = "chytrak"; /* VALIDNÍ KROK, proměnná owner je v public sekci */ Jak zpřístupnit privátním informacím ostatním? Tím že pro členskou proměnnou si vytvoříme getter a setter. Setter a getter zní možná sofistikovaně, ale není to nic jiného než obyčejná metoda na čtení případně zapisování. Teď ale přichází kámen úrazu – a to zbytečně vytváření setterů a getterů. Vytvoříme-li setter a getter pro privátní proměnnou, rovnou ji můžeme nechat zviditelnit celou. Proto je tady potřeba pořádně promyslet zda-li vůbec potřebujeme settery a gettery. Samozřejmě pokud máme proměnnou, kterou nechceme aby nám někdo cizí měnil obsah, postačí nám pouze getter pro čtení informací. Občas nechceme vůbec aby nám někdo četl informace, v tu chvíli nepotřebujeme ani jednu z metod. int getTraffic() { return traffic; } string getUrl(string u) { return url; } void setOwner(string o) { owner = o; } Pojďme si ještě zmínit klíčové kouzelné slovo this. Jedná se o proměnnou (většinou reference) na danou instanci nad kterou pracujeme. Používá se pro upřesnění s jakým objektem pracujeme, např pro rozlišování proměnné instance od parametru. Občas se hodí i předávat danou instanci dál v metod. Zároveň si rozšíříme příklad o konstruktoru s parametrem. class Web { public: Web(int traffic, string url, string owner); /* rozšířili jsme konstruktor o tři parametry */ ~Web(); IncreaseTraffic(); int getTraffic(); string getUrl(); setOwner(string owner); private: string url; int traffic; string owner; /* jenom drobná změna, owner jsme přesunuli mezi private */ } Web(int traffic, string url, string owner) { /*Vtip je v tom, že náš parametr se jmenuje stejně jako naše členská proměnná, tak jak to vyřešit? Můžeme přistoupit k proměnné slůvkem this->traffic = traffic; Pro zamezení tohoto konfliktu osobně třeba používám prefix "m_" --> tedy přejmenovat to na m_Traffic = traffic; */ this->traffic = traffic; /* v c++ se jedná o pointer, v javě reference. v PHP $this->traffic; */ this->owner = owner; this->url = url; } IncreaseTraffic() { ++traffic; } int getTraffic() { return traffic; } string getUrl() { return url; } void setOwner(string owner) { this->owner = owner; } Web pawnocz = new Web(50,"pawno.cz","chytrak"); /* voila, závorka není nic jiného než konstruktor. Lze vytvořit i lokální objekty Web pawnocz(50,"pawno.cz");, const Web pawno(50,"pawno.cz");...*/ print pawnocz.getUrl() + " má " + pawnocz.getTraffic() + " návštěvnost."; /* pawno.cz má 50 návštěvnost */ pawnocz.IncreaseTraffic(); pawnocz.setOwner("Lukáš Valenta"); /* už se nám nelíbilo, že je chytrak majitelem webu. */ Metody i proměnné můžou být static. Co to pro nás znamená? Co se týče metod, tak jsou podobné běžným funkcím, nemají implicitní instanci ani implicitní členské proměnné, ani this nejsou k dispozici. Jediné plus je mají přístup k třídním proměnným a volat třídní metody. Statické třídní proměnné jsou sdíleny instancemi třídy, a jsou dodržována standartními pravidly zapouzdření. Statické metody ani proměnné nás ale teď nezajímá. Zbývá nám ještě projasnit si tři základní pojmy – protected, polymorfismus a dědičnost Dědičnost slouží k vytvoření nových datových typ na základě něčeho čeho už máme. Proč jsem si nechal encapsulation protected až teď? Protected je víceméně private plus navíc to, že se věci pod touto viditelností dědí do ostatních podtříd. Pro znázornění využijeme třídu Osoba, kterou jsem si hezky nadeklaroval na začátku a rozšíříme ji o metodu pozdrav. Na tento příklad později navážeme polymorfismus. Vysvětlíme si příklad, chceme třídu Cech a Nemec a ty budou dědit Osoba, která se bude chovat jako abstraktní třída1. Každý vždy bude mít navíc členskou proměnnou a každý umí jen svůj jazyk. 1 abstraktní třída je třída, která nemá svoji implementaci a chová se jen čistě jako rozhraní pro třídy, které ho budou dědit. Na abstraktní třídy nelze vytvořit instance. Abstraktní třídy jsou užitečné, pokud víme, že všechny zděděné třídy jsou schopny provést implementaci abstraktních metod class Osoba { public: Osoba(); ~Osoba(); void pozdrav() = 0; /* = 0; znamená, že označujeme pozdrav() za abstraktní metodu v c++. V Javě a PHP je označení klíčovým slůvkem "abstract" před "class" */ protected: string name; int age; bool gender; } /* v Javě class Cech extends Osoba, v PHP tuším taky */ /* v C++ lze využít klíčové slovo public/private nebo vůbec nic. V případě public znamená, že ponechává vidtelnost zděděných věcí. Private je, že zděděné věci nemají viditelnost mimo této třídy a zakazuje polymorfismus */ class Cech : public Osoba { public: Cech(); ~Cech(); string getFavouriteBeer(); private: string favouriteBeer; } class Nemec: public Osoba { public: Nemec(); ~Nemec(); bool hasMustache(); private: bool mustache; } Polymorfismus umožňuje pracovat a používat jednotné rozhraní pro více (podobných) typů objektů. Podstatou polymorfismu je, zajistit přehlednost, jednoduchost jednotně pracovat se třídy velmi podobné, avšak trochu se lišící. Dokonce jsme si připravili rozhraní (viz výše Osoba) a poděděné třídy. Naším cílem je zajistit volání z databáze Osob1 takovým způsobem, aby každá osoba své národnosti volal svůj pozdrav2. 1 přeskočíme-li řeči o dynamických a statických vazeb, tabulce virtuálních metod neboli VMT (c++), zjišťování instance (java) 2 abychom nemuseli složitě zjišťovat jakou instancí jaké třídy, ale stačí volat a nechat na běhu programu ať si zvolí metodu sám. // Kód v C++ Osoba ** arr = new Osoba*[20]; for ( int i = 0; i < 20; i ++){ if(rand % 2 == 0) arr[i] = new Cech; else arr[i] = new Nemec; } for( int i = 0; i < 20; i ++) arr[i]->pozdrav(); // Guten tag / Ahoj v závislosti na random for( int i = 0; i < 20; i ++) delete arr[i]; // nesmíme zapomenout na uvolňování :-) 2. Závěr Tak došli jsme úspěšně ke konci. V dnešní kapitolě jste si doufám odnesli nějaké základy o OOP a jeho základní pojmy (zapouzdření, polymorfismus, dědění,...). Pokud máte v něčem nejasno, neváhejte a zeptejte se. Polymorfismus jsem trochu odbil, takže se za to omlouvám, ale snad jsem Vám nastínil trochu tý černé magie okolo ní. Pokud byste si přáli o ní něco více vědět, tak editnu trochu příklad a rozšířím ji. Pokud jsem něco uvedl špatně, prosím napište mi to. Pokud jsem na něco zapomněl, také mi to napište. Každopádně se s Vámi loučím a snad jsem někoho zaujal vyzkoušet si OOP.
  4. Ewwe

    návod PHP II. Cykly

    Obsah: Cykly v rychlosti for foreach while 1. Cykly v rychlosti Já se budu zabývat jen třemi cykly které jsou zmíněny v obsahu. Podle mě je zbytečné zabývat se ostatními protože více-méně vycházejí z těchto základních ( především tedy z while ) 2. Cyklus for Cyklus for se hodí k procházení dat a opakování určité činnosti. Syntaxe cyklu je for( [index] ; [podmínka] ; [akce] ) V zásadě jsou dva druhy cyklu for a to inkrementační a dekrementační. Samozřejmě lze použít i násobení, dělení či jinou matematickou činnost $array = [ array(1,"Pes"),array(2,"Kočka"),array(3,"Křeček") ]; echo "<select>"; for( $i = 0; $i < sizeof( $array );$i++ ) { echo "<option value='".$array[$i][0]."'>".$array[$i][1]."</option>"; } echo "</select>"; Důležité je vědět , že for mění hodnotu indexu až jako poslední úkon. Tzn. $array = [ array(1,"Pes"),array(2,"Kočka"),array(3,"Křeček") ]; echo "<select>"; for( $i = 0; $i < sizeof( $array );$i++ ) { //0 echo "<option value='".$array[$i][0]."'>".$array[$i][1]."</option>"; // až tady se provede inkrementace } echo "</select>"; Osobně for používám málokdy. Většinou máte výstupy uložené asociačně a pro ty se hodí třeba právě foreach 3. Cyklus Foreach Foreach je zajímavější protože sním můžete krásně procházet associované pole Základní syntaxe foreach( naplnene_pole as polozka ) //nebo foreach( naplnene_pole as klic => polozka ) Rozdíl mezi těmito dvěma způsoby zápisu je jen v tom , že do promene klic se uloží asociace na indexu. Menší příklad $array = [ "Pes"=>1,"Kocka"=>2,"Krecek"=>3 ]; foreach( $array as $zvire ) { echo $zvire.","; } // Výstupem bude : 1,2,3 foreach( $array as $zvire => $hodnota ) { echo $zvire." ma hodnotu ".$hodnota.","; } // Výstupem bude : Pes ma hodnotu 1,Kocka ma hodnotu 2,Krecek ma hodnotu 3, 4. Cyklus while Cyklus while já osobně moc nepoužívám v podstatě jen k načtení výsledu z mysqli query ( dozvíme se příště ) Syntaxe cyklu while( podminka ) Doslovně syntaxe znamená "dokud platí podmínka" Příklad použití /* Predpokladejme ze máme připojenou databázi s tabulkou users a sloupcem username který obsahuje jméno uzivatele */ $result = $mysqli->query("SELECT * FROM users"); while( $row = $result->fetch_assoc() ) { echo $row["username"]; } Hodnota promenne $row je true pokud je do ni ulozeno pole s výstupem databáze. Tzn dokud je co číst tak cyklus vypisuje. Jakmile už není co číst tak není ani co psát Cyklus while má "derivát" do-while. Klasický while provede akci uzavřenou v bloku pokud podmínka platí. Tzn , že podmínka se kontroluje první a až poté je případně vykonána akce. U cyklu do-while se akce vykoná a až poté je kontrolována podmínka. Jen v rychlosti syntaxe do-while vypadá následovně $i = 0; do { $i++; echo $i; } while( $i<=25); // nejvyžší vypsaná hodnota bude 26 Osobně s do-while nemám moc zkušeností a ani si nepamatuji jestli jsem ho někdy použil.. Pokud nezapomenu tak bude následovat další díl. Pro tento je to momentálně všechno.
  5. Ewwe

    návod PHP III. Databáze

    Obsah: MariaDB MySQLi PDO Dibi 1. MariaDB MariaDB je fork klasického MySQL s vylepšeními ohledně výkonu. Pokud si můžete vybrat MariaDB by měla být jasná volba. Nejedno vývojové prostředí ( XAMMP nebo WAMP ) Vám dovolí si jednoduše vybrat mezi MySQL a MariaDB. 2. MySQLi MySQLi je náhrada za mysql co se týče PHP. Jelikož od verze 5.5 jsou funkce s prefixem mysql_ označené jako depreceated a od verze 7.0 jsou dokonce ostraněné. S MySQLi se dá pracovat buď procedurálně nebo objektovně. Připojení k DB ( procedurální ): $connection = mysqli_connect( "127.0.0.1","root","pwd", "konkretni_db" ); Připojení k DB ( objektové ): $mysqli = new mysqli( "127.0.0.1","root","pwd","konkretni-db"); Určitě si myslíte , že v tom momentálně není moc rozdíl. To přijde. V procedurálních funkcí je nutné doplňovat proměnnou $connection například $result = mysqli_query( $connection , "SELECT * FROM users" ); naproti tomu u objektového přístupu $result = $mysqli->query("SELECT * FROM users"); Prakticky to znamená , že do $mysqli je uložený objekt mysqli který obsahuje všechny potřebné informace vč. instance připojení Načítání výsledků z db je v obou případěch relativně stejné // procedurální while( $row = mysqli_fetch_assoc( $result ) ) { echo $row["user_name"]; } // objektové while( $row = $result->fetch_assoc() ) { echo $row["user_name"]; } Mě osobně přijde objektové využívání přehlednější než to procedurální. Ale v případě že budete při připojení používat mysqli tak je to jen na Vás. 3. PDO Já osobně PDO moc nefandím. Tak nějak mi nevyhovuje způsob zápisu a celý koncept. Ano chápu , že PDO je nové možná rychlejší , bezpečnější a propracovanější a nabízí několik nových možností jako například před-připravování queryn atd. Připojení k db pomocí PDO $pdo new PDO("mysql:host=127.0.0.1;dbname=konkretni_db;","root","pwd"); Vytvoření dotazu pomocí prepare: $statement = $pdo->prepare("SELECT * users WHERE user_name = ?"); $statement->execute(["Ewwe"]); $result = $statement->fetchAll(); Osobně se moc nechci pouštět do PDO jelikož mu tolik nerozumím. Raději nechám PDO na někoho povolanějšího. 4. Dibi Kde jsem ale naprosto jako doma je Dibi. Je to databázový layer vytvořený panem Davidem Grudlem , který stojí za jedním z nejpopulárnějších frameworků ( Nette ). Dibi bylo psáno za účelem ušetřit a ulehčit práci programátorům. Dibi přináší několik "featur" , které jsou podle mého názoru užasné a dnes bych si nedokázal představit pracovat s db bez Dibi. Dibi chci věnovat samostatný díl ( dnes , zítra ) protože ja tak natolik obsáhlé , že by se těžko slučovalo stímto návodem. To by bylo pro tento návod vše a v dalším se budu věnovat tady právě Dibi a Tracy
  6. Dneska jsem se dočetl o novém operátoru , který nejspíše přidají v PHP 7.2 nebo v PHP 8. Je to operátor hvězdička hlavní využití podle vývojářů je to , že umožní aby časté operace pro escapování byli jednodužší. Syntaxe nového operátoru <?* $str ?> <?* $str, 'html' ?> <?* $str, $context ?> A jedná se o zkrácení následujícího kódu $thing['name'] = "dsfwčgevěv"; // Aktuálně <?= htmlspecialchars(urlencode($thing['name'])) ?> // Nový operátor <?* $thing['name']?> Není uplně potvrzené , že opravdu tento operátor přidají ale momentálně to tak vypadá. Uvidíme co bude dál
  7. Obsah: continue break 1. Continue Continue je "funkce" pro přeskočení aktuálního indexu respektive pro přeskočení celého cyklu pro aktualní "průchod" cyklem. $var = [ "Pes" => 1, "Kocka" => 2, "Krecek" =>3 ]; foreach( $var as $zvire => $hodnota ) { if( $zvire == "Kocka" ) continue; echo $zvire." ma hodnotu ".$hodnota.","; } // Výstup bude : Pes ma hodnotu 1,Krecek ma hodnotu 3, Hodí se to pro vyloučení hodnot a pro urychlení průchodu cyklem. Protože když máme nějaký složitý cyklus ( hodne podmínek které by se museli kontrolovat atd ) ,který obsahuje třeba 500 indexů které chceme a 500 které nechceme tak si uděláme hned na začátku podmínku na nějaký společný znak a hodíme ho do continue tudíž se tyto indexy rovnou přeskočí a nemusíme je zbytečně testovat. 2. break Oproti tomu break celý cyklus zastaví. $var = [ "Pes" => 1, "Kocka" => 2, "Krecek" =>3 ]; foreach( $var as $zvire => $hodnota ) { if( $zvire == "Kocka" ) break; echo $zvire." ma hodnotu ".$hodnota.","; } // Výstup bude pouze : Pes ma hodnotu 1 Opět můžeme vymýšlet různé scénáře kdy je to potřeba. Tohle by bylo na téma cyklů zhruba tak vše.
  8. 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.
  9. Úvod Tak, dnes jsem si pro vás připravil již třetí pokračování návodů ze ,,série: Neznáme pawno". Dnes by jsme si ukázali jak se ukládají souřadnice, takové základní věci, jako peníze po prvním připojení na server, apod.. Jdeme na to Ukládání souřadnic [*] Ukládání souřadnic ve vozidle [*] Souřadnice se nám ukládají do: dokumenty/GTA San Andreas User Files/SAMP/savedpositions.txt. Po otevření tam naleznete všechny uložené pozice, teď tam ale žádné nemáte, pokud jste si teda žádnou neuložili Ve hře se pozice ukládají příkazem /save. Pokud chcete ukládat i vozidla, tak doporučuji přes program: samp_debug.exe, který naleznete ve složce se hrou GTA San Andreas. V mém případě: C/Program Files/Rockstar Games/GTA San Andreas/samp_debug.exe. Po spuštění se spawnete se skinem CJ u Vinewoodu. Jestliže si budete chtít uložit vozidlo, tak stačí dojít na místo, kde chcete dané vozidlo mít, poté napsat do chatu příkaz /vsel. Po napsání příkazu /vsel se vám ukáže výběr vozidel, pomocí mezerníku a levého shiftu přepínáté vozidla. Po vybrání daného vozidla potvrdíte výběr enterem a spawnete se ve vozidle. Poté už jen auto zaparkujete kam chcete a jako řidič vozidla napíšete do chatu /vsave, čímž se vám uloží souřadnice do dokumentu savedpositions. Můžete si ještě za /vsel napsat nějakou poznámku, aby jste poznali, že je to zrovna to vozidlo, co jste chtěli. Ukládání souřadnic bez vozidla [*] (například na warp) Podobný postup jako s vozidly, jen si stoupnete na místo, kde chcete uložit dané souřadnice, například na warp. Napíšete do chatu opět příkaz /vsave, čímž se vám pozice uloží taktéž do savedpostitions, ovšem v jiném ,,formátu" na začátku. Za příkaz /vsave si opět můžete napsat nějakou poznámku, aby jste poznali, odkud ty souřadnice jsou. Rozdíl souřadnic v savedpositions s vozidlem a bez vozidla: Bez vozidla se vám uloží do dokumentu něco takového: AddPlayerClass(0,1476.5414,-883.9592,57.2152,85.0383,0,0,0,0,0,0); // TestBezVozidla AddPlayerClass (v závorce souřadnice) //TestBezVozidla = Poznámka, kterou jsem si já napsal za příkaz /vsave. AddStaticVehicle(400,1477.8805,-880.7305,57.4691,85.1863,101,1); // TestSVozidlem AddStaticVehicle(v závorce souřadnice) //TestSVozidlem = Poznámka, kterou jsem si já napsal za příkaz /vsave. Zapsání souřadnic do pawna [*] Otevřeme pawno. Najedeme na public OnGameModeInit() { No a pod závorku už můžeme ukládat naše pozice, příklad mích použitých souřadnic v tomto tématu: public OnGameModeInit() { AddStaticVehicle(400,1477.8805,-880.7305,57.4691,85.1863,101,1); // TestSVozidlem AddPlayerClass(0,1476.5414,-883.9592,57.2152,85.0383,0,0,0,0,0,0); // TestBezVozidla Nakonec jsem se rozhodl, že dnešní ,,díl" bude pouze o ukládání a použití souřadnic. V dalším tématu se vrhneme na navrhovaná GivePlayerMoney, SetPlayerHealth, SetPlayerArmour, apod... Jelikož tohle není moc dlouhé, tak to vyšlo ve stejný den, jako druhý díl. Každou kritiku přijímám. Nechápu, jaktože Úvod je tak dementně odtabované, když když to chci upravit, tak je to tam krásně srovnané, fakt nechápu
  10. ÚVOD Po poměrně delší době od prvního tématu jsem se rozhodl, že zkusím druhý díl, se kterým si chci dát více práce. Dnes bych vám chtěl říct něco, o prvních jednoduchých příkazech, ukázat, jak se pojmenovává gamemode a napsat pár vysvětlivek, které i právě chyběly u prvního tématu. První příkazy [*] Ve složce se serverem ve složce pawno si otevřeme soubor pawno.exe, doporučuji spouštět jako správce. Po otevření nalezneme několik funkcí, které nás zatím zajímat nebudou, ale pokusím se je ve vysvětlivkách popsat. Nalezneme tuto funkci: public OnPlayerCommandText(playerid, cmdtext[]) //Toto je funkce, kde se píši veškeré příkazy (warpy, hráčské příkazy..). { if (strcmp("/mycommand", cmdtext, true, 10) == 0) //Zde se udává, co chcete, aby se muselo napsat do chatu). { // Do something here //Zde se udává přímo ta funkce, pod těmito řádky vám ukážu vzor. return 1; //Ukončení příkazu hodnotou 1, ta hodnota 0 se píše až po posledním napsaném příkazu. } return 0; } // } = tímto se taktéž ukončuje každá funkce. VZOR PŘÍKAZU [Pouze vzor] { if (strcmp("/lv", cmdtext, true, 10) == 0) //lv = text, který jsem v mém případě napsal, co se musí do chatu zadat. { SetPlayerPos(playerid, x, y, z); //SetPlayerPos = Funkce pro změny pozice hráče (souřadnice si ukážeme příště). SendClientMessage(playerid, color, "Byl jsi odwarpován do LV !"); //SendClientMessage = příkaz, kde si můžete vytvořit zprávu pro hráče po napsání příkazu. return 1; //Ukončení příkazu hodnotou 1, ta hodnota 0 se píše až po posledním napsaném příkazu. } return 0; } Pojmenování gamemodu [*] Najdeme funkci: public OnGameModeInit(). //Funke, kde se pojmenovává mod, zapisují souřadnice s vozidly, ... Máme tam: SetGameModeText("Blank Script"); //Místo toho Blank Script si gamemode pojmenujeme. To samé zde: main() { print("\n----------------------------------"); print(" Blank Gamemode by your name here"); //do závorky místo toho Blank gamemode... napíšeme název gamemodu. print("----------------------------------\n"); } Vysvětlivky na závěr [*] V confingu: gamemode0 //V confingu se za gamemode0 vždy napíše název gamemodu před spuštěním serveru. rcon_password //Heslo,díky kterému se můžete na serveru přihlásit jako rcon administrátor. maxplayers //Počet slotů, kolik chcete na serveru mít, to znamená, že kolik max. hráčů může být online najednou. hostname //Za hostname se píše jak chcete, aby se váš server v server listu jmenoval. filterscripts //Za filterscripts se píši názvy filterscriptů, které chcete na serveru mít, např: House systém, Job systém, ... weburl //Za weburl se píše název vašeho webu serveru, pokud tedy nějaký máte. language //Za language se píše jazyk vašeho serveru. Zobrazí se v server listu. V pawnu: include //Includy jsou vlastně takové věcičky, které musíte mít ve složce pawno/include, jinak by vám některé systémy nemusely fungovat. public OnFilterScriptInit() //Funkce, kde se pojmenovává váš filterscript. print("\n----------------------------------"); print(" Blank Gamemode by your name here"); //Zde se pojmenovává váš gamemode. print("----------------------------------\n"); public OnGameModeInit() //Funkce, kde se zapisují souřadnice aut, ikony na mapě, objekty, ... public OnPlayerCommandText(playerid, cmdtext[]) //Funkce, kde se vytváří příkazy, warpy, ... Toto už by mohlo být vše, funkcí je hodně, ale z toho, co jsme zatím dělali, tak je to dostačující. Tak snad někdy příště pokračování. S těma barvama, nevěděl jsem, jestli to nechat tak, počkám na ohlasy.
  11. Ú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í.
  12. 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...!!)
  13. 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.
  14. 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.
  15. Dialógy a všetko o nich Obtiažnosť: Obsah Štýly dialógov: DIALOG_STYLE_LIST DIALOG_STYLE_MSGBOX DIALOG_STYLE_INPUT DIALOG_STYLE_PASSWORD Ostatné: Použite Farba v dialógu Jedno tlačidlo v dialógu Preskakovanie na prvú položku Práca s inputtextom Ako na formát v dialógu ŠTÝLY DIALÓGOV DIALOG_STYLE_LIST DIALOG_STYLE_MSGBOX DIALOG_STYLE_INPUT DIALOG_STYLE_PASSWORD __________________________________________________________________ POUŽITÍ: Farba v dialógu Jedno tlačidlo v dialógu Preskakovanie na prvú položku Práca s inputtextom Ako na formát v dialógu __________________________________________________________________ To je asi tak všetko.. Návod označen jako platný Ten to návod byl označen jako platný.Návod může být kdykoli označen jako nevhodný či neplatný
  16. Zdravím, zase po dlouhé době jsem se rozhodl zde publikovat jeden ze svých návodů. Předem říkám, že se nejedná o nic, čemu by se měli věnovat začátečníci, takže pozdější dotazy typu "Co je to if? Co je to funkce? Co je to pawn?" budou pravděpodobně ignorovány. Řeč bude o variabilních parametrech funkce a práce s těmito parametry. Obtížnost: Obsah 1. Úvod - základní principy a pojmy 2. Konstantní vs. variabilní parametry; kombinované parametry 3. Datové typy / tagy variabilních parametrů 4. numargs, getarg, setarg 5. Pořadí parametrů Úvod Než se do toho pustíme, uveďme a vysvětleme si pojmy, se kterými budeme pracovat. Je-li řeč o parametru (nebo také argumentu), je tím myšlen parametr/argument funkce. Variabilním (proměnným) počtem parametrů myslíme takové parametry, jejichž počet při definici funkce není pevně daný. To znamená, že při volání funkce můžeme dosadit vždy různý počet parametrů. Konec řečí, jdeme si ukázat, jak na to. Konstantní vs. variabilní parametry Ve většině případů pracujete s funkcemi, které mají konstantní (neměnný) počet parametrů. Může jít například o následující, notoricky známou funkci: SendClientMessage(playerid,color,const message[]); _ Při jejím volání se očekává, že pokaždé dosadíme 3 parametry (ID hráče, barvu zprávy a text zprávy), takže volání může vypadat například následovně: SendClientMessage(0,-1,"You're noob."). Pak tu jsou ale funkce, které mají variabilní (proměnný) počet parametrů. Příkladem nám může být mnou definovaná funkce pro sčítání libovolného počtu celých čísel: MultiSum(...) { new num = numargs(),sum; for(new i;i<num;i++) sum += getarg(i); return sum; } _ Když budeme volat tuto funkci, můžeme dosadit kolik parametrů jen chceme. MultiSum(3,8), MultiSum(9,3,-1,5,3) i MultiSum(1,1,1,-5,1,4,2,3,5,8) bude fungovat a bude fungovat správně. Jistě vám už došlo, že variabilitu počtu nám zajišťují tři tečky. Oba výše uvedené postupy lze zkombinovat, tedy určit několik pevně daných parametrů a zbytek nechat jako variabilní. Ale pozor, v tomto případě musí být konstatní parametry na začátku a tři tečky vždy na konci! Funkce pro formátování textu nám budiž příkladem: format(output[], len, const format[], {Float,_}:...); _ První tři parametry uvádíme vždy, další se odvíjí od počtu použitých specifikátorů. (více o funkci format) Datové typy / tagy variabilních parametrů Uvedeme-li při definici funkce pouhé tři tečky, funkce bude očekávat jen celočíselné parametry a řetězce. Chceme-li dosazovat i argumenty jiných datových typů / tagů (Float, File, Text apod.), zápis bude vypadat následovně: Float:... //pouze pro desetinná čísla {Float,_}:... //pro celá čísla, řetězce, čísla s desetinnou čárkou a logické hodnoty {Float,bool}:... //pro desetinná čísla a logické hodnoty {Text,Text3D,Menu}:... //pro ID textdrawů, 3D labelů a menu _ A takto bychom mohli pokračovat dál. Princip spočívá v tom, že před tečky uvedeme příslušný tag, pokud je jich více, uzavřeme je do složených závorek { } a oddělujeme čárkou. Znak _ (podtržítko) nám zastupuje celá čísla, logické hodnoty a řetězce. numargs, getarg, setarg Varování: Tento způsob tvoření parametrů (zejména v případě polí a řetězců) je dosti pomalý. Jsou i rychlejší alternativy, pokud umíte pracovat s direktivou emit. Nyní se dostáváme k funkcím, které pracují s parametry, jejichž počet neznáme. Již jsme je použili nahoře u funkce MultiSum. numargs() Tato funkce vrací celkový počet argumentů funkce, tedy i pevně dané argumenty, ne jen ty variabilní, na to pozor. MultiSumWithException(exception,...) { new num = numargs(),sum; for(new i=1;i<num;i++) { if(getarg(i) == exception) continue; sum += getarg(i); } return sum; } MultiSumWithException(4,1,5,3,4); //numargs vrátí číslo 5 (4 variabilní a 1 konstantní parametr) _ getarg(arg,index=0) Funkce vracející hodnotu argumentu podle zvoleného ID (arg). Začíná se od nuly, takže první argument bude mít ID 0, druhý ID 1 atd. Parametr index nám poslouží v případě, že v naší funkci použijeme řetězec nebo pole. Pole/řetězec se totiž jeví jako jeden argument (arg) a abychom se dostali k jeho buňkám / k jednotlivým znakům řetězce, musíme využít indexu (index). I tyto indexy začínají nulou. PrintThirdNumberFromArrays(...) //při volání dosadím pole a řetězec { new num = numargs(); for(new i;i<num;i++) { printf("%i",getarg(i,2)); //výpis hodnoty třetí buňky pole / třetího znaku řetězce } } PrintThirdNumberFromArrays({7,4,5,3},"ahoj"); //numargs vrátí číslo 2 (2 parametry - 1 pole a 1 řetězec), funkce vytiskne 5 a 111 (111 je hodnota znaku 'o' v ASCII tabulce, pro výpis znaku použijte specifikátor %c namísto %i) _ setarg(arg,index=0,value) Setarg nastavuje parametru hodnotu. Funguje podobně jako getarg, za arg dosadíme pořadí argumentu, index využijeme v případě polí a řetězců (jinak doplňte nulu) a za value novou hodnotu daného argumentu. Příklady: setarg(0,.value=1); //nastaví 1. argumentu hodnotu 1 setarg(3,.value=Text3D:5); //nastaví 4. argumentu hodnotu ID 3D labelu 5 (pozor, argumenty musí tento tag podporvat, viz výš) _ Pořadí parametrů Tohle až tak s tématem nesouvisí, ale když už jsme se dostali tak daleko, uvedeme si i toto. V kódu výše jsme použili .value. Tato syntaxe nám slouží k tomu, abychom nemuseli dosazovat za index nulu, ta je totiž výchozí hodnotou tohoto parametru. Zkrátka jsem tím přeskočil defaultně určený argument. Toto přeskakování parametrů můžete vidět například zde. Když se nám zachce (ale podotýkám, že je to zbytečné), můžeme tím měnit i pořadí normálních argumentů: SendClientMessage(0,0xFF0000FF,"Ahoj!"); //parametry doplněné v typickém pořadí playerid, barva, zpráva SendClientMessage(.color=0xFF0000FF,.message="Ahoj!",.playerid=0); //tatáž funkce, akorát jsem změnil pořadí argumentů _ Hodí se ještě uvést, že u variabilních parametrů toto nelze dělat. A proč? No protože nemají u definice funkce svůj název/identifikátor (jsou tam jen ty tři tečky, popř. tagy, to nestačí). No a to máme vše. Doufám, že jste se něčemu přiučili, profesionálové mi to mohou zkontrolovat, grammarové hledat gramatické a pravopisné chyby, hnidopichové podotknout, že tenhle návod je i jinde (áno, překvapivě jsem ho taky psal já ) a ostatní mi vyjádřit svůj názor, budu rád. Ok, I'm out. Ověřený návod Tento návod prošel validací, a lze ho proto považovat za ověřený.
  17. Ahoj! Vítám vás u mého prvního tutoriálu! Doufám že vám pomohu;) #include <a_samp> public OnFilterScriptInit()//toto se vyvolá při načtení FS { SetTimer("tip",60*1000,true);//timer na 1 minutu return 1; } forward tip(); public tip() { new nahodny = random(4);//na 5 tipů switch(nahodny) { case 0: SendClientMessageToAll(0x00FF00FF,"[TIP] text1"); case 1: SendClientMessageToAll(0x00FF00FF,"[TIP] text2"); case 2: SendClientMessageToAll(0x00FF00FF,"[TIP] text3"); case 3: SendClientMessageToAll(0x00FF00FF,"[TIP] text4"); case 4: SendClientMessageToAll(0x00FF00FF,"[TIP] text5"); } } V tom SendClientMessageToAll si změnte akorát to text, pokud chcete více tipů,tak na řádku 12 do random() napíšete kolik chcete tipů pokud 10 tak napíšete 9, atd... a napíšete i case 5: ...... Doufám že vám návod pomohl děkuji Rudewolff;)
  18. 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
  19. 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
  20. 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
  21. 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]
  22. 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
  23. 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
  24. 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.
  25. Obtížnost: Osnova: 1. Úvod, co je to pole 2. Deklarace pole 3. Práce s indexy (přiřazování hodnot) 4. Pole a řetězec 5. Vícerozměrné pole 6. Závěr 1. Úvod Zdravím, tohle je druhý ze série návodů pro začínající pawnery. Návod navazuje na ten předchozí o proměnných (klik). Znalost proměnných je nutná k pochopení tohoto návodu, proto Vám doporučuji, abyste si nejprve přečetli ten první návod (odkaz je k dispozici). Co je to pole? Pole (angl. array) je, zjednodušeně řečeno, proměnná, do které můžeme ukládat více hodnot. Funguje to tak, že se nám v paměti vymezí prostor a tento prostor se nám rozdělí na tolik buněk, kolik určíme. Jako kdybychom vzali dort a rozkrojili ho na námi určený počet kousků. K těmto jednotlivým buňkám (kouskům dortu) pak přistupujeme pomocí tzv. indexů. 2. Deklarace pole Jako první začneme s deklarací pole. Ta funguje stejně jako u proměnné, akorát s malým rozdílem. . new hraci[3]; . Opět jsme použili slůvko new, opět jsme zvolili název a opět jsme to všechno zakončili středníkem. Co se tedy změnilo? Hned za název jsme přidali hranaté závorky [ ] a do nich jsme vepsali velikost pole. Je tam 3, což znamená, že pole s názvem hraci má celkem 3 buňky. Samozřejmě můžeme deklarovat více polí naráz a přidat k nim různé tagy (pro různé datové typy), stejně jako u proměnných. . new hraci[3], Float:souradnice[4], bool:admin[10]; . 3. Práce s indexy (přiřazování hodnot) Nyní máme vytvořené pole. Jak teď do jednotlivých buněk uložíme hodnoty? Budeme k nim přistupovat přes, již zmíněné, indexy. Každá buňka má svůj unikátní index. Indexy vždy začínají od nuly. Poslední index bude vždy o jedno menší, než je velikost pole. Takže naše pole hraci bude mít indexy 0 až 2, pole souradnice bude mít indexy 0 až 3 a pole admin bude mít indexy 0 až 9. Teď pojďme poli hraci přiřadit nějaké hodnoty. . hraci[0] = 1; hraci[1] = 0; hraci[2] = -3; . Takhle jsme všem třem buňkám určili hodnotu. Indexy zapisujeme tam, kde jsme při deklaraci zapisovali velikost. Pro procvičení to samé uděláme i s druhým polem. . souradnice[0] = 4.7; //ukládáme čísla s desetinnou čárkou souradnice[1] = 8.52; souradnice[2] = -1.02; souradnice[3] = -0.5; . Pro zajímavost (rozklikněte spoiler): 4. Pole a řetězec Už u proměnných jsme narazili na tento způsob deklarace – jednalo se o řetězce. Je načase si říci, že řetězec není nic jiného než pole znaků. Každá buňka obsahuje jeden znak z řetězce. Podívejme se na následující příklad: . new pozdrav[4+1]; //deklarace pole znaků (řetězce), nezapomeňme přičíst jedničku (znak) navíc pozdrav = "ahoj"; . Teď máme v poli/řetězci pozdrav slovo "ahoj". Když si ho rozpitváme, zjistíme, že každý index v sobě má jedno písmeno. . pozdrav[0] = 'a' pozdrav[1] = 'h' pozdrav[2] = 'o' pozdrav[3] = 'j' . Index 4 jsem záměrně nezmínil. Proč? Podrobněji se tomu budu věnovat v návodu o řetězcích, prozatím si vystačíme s informací, že jedná-li se o řetězec (u ostatních polí to neplatí), musí poslední buňka zůstat nezměněná. Necháme ji prostě tak, jak je. Pro zajímavost (rozklikněte spoiler): 5. Vícerozměrné pole (pro středně pokročilé – rozklikněte spoiler) 6. Závěr A jsme na konci. Nyní už víme, jak funguje pole, jak jej vytvořit a jak s ním pracovat. Taky jsme si řekli něco málo o principu vícerozměrných polí a o tom, jaký vztah má řetězec k poli. Tento návod, stejně jako ten předchozí, je určen pro nováčky, pokročilejší věci byly buďto úplně vynechány, nebo jsou uvedeny ve spoilerech. Přesto, zdá-li se Vám, že jsem něco opomněl, někde jsem se spletl nebo se jen chcete vyjádřit, pište do tohoto tématu. Ověřený návod Tento návod prošel validací, a lze ho proto považovat za ověřený.
×
×
  • Create New...