Search the Community
Showing results for tags 'ewwe'.
-
Zdravím, rád bych vám dnes ukázal jak si jednoduše vytvořit vlastní panel do Tracy. Ti z Vás kdož používají Nette se s Tracy znáte, pro vás ostatní je to skvělá utilita o které si popovídáme jindy Základem je mít nainstalovanou Tracy , pokud pracujete v Nette tak tracy máte nainstalovanou automaticky. Já osobně své vlastní panely mám uchované přímo vedle Tracy tzn , že ve složce knihovny jsem si vytvořil složku tracy_modules do které dávám jednotlivé soubory k jednotlivým panelů. Začneme tím , že si tedy vytvoříme soubor pro náš panel s nádledujícím obsahem <?php use Tracy\IBarPanel; class <jmeno_naseho_panelu> implements IBarPanel { function getTab() { } function getPanel() { } } Nyní si rozebereme ty dvě funkce.. Funkce getTab vrací vlastně obsah který se bude zobrazovat na Tracy. A funkce getPanel vrací obsah pro popup který se otevře při najetí na getTab. Pro účely tutoriálu náš panel bude mít ikonku php a v popupu bude titulek PHP a pod ním vypsána verze PHP. Najdeme si ikonku nejlépe 24x24 pixelů a vytvoříme si tedy tab function getTab() { return "<span title='<tooltip_titulek>'><img src='<url_ikonky>'><volitelny_titulek_vedle_ikonky></span>"; } Případně nemusíme používat ikonku tudíž vynecháme celý tag . No a nyní tedy chceme na hover vidět verzi php kterou disponujeme function getPanel() { $title = "<h1>PHP</h1>"; $header = "<div class='tracy-inner'><table><tbody>"; $content = "<tr><td>Verze PHP</td><td>".phpversion()."</td></tr>"; $footer = "</tbody></table>"; return $title.$header.$content.$footer; } Requirneme soubor s naším panelem. A panel přidáme do tracy v mém případě se panel jmenuje PHPPanel Tracy\Debugger::getBar()->addPanel( new PHPPanel() ); A můj panel nyní vypadá takto A to je vše. Nyní je kompletně na Vás co bude Váš panel umět a co bude zobrazovat
-
Předem bych rád upozornil, že v repo může být i napřed před návody. Už jen z toho důvodu , že si hodlám kód připravovat a nepsat ho přímo při návodu. Pojďme si založit nový mód. Ve složce php si vytvoříme složku s libovolným názvem. V mém případě se složka jmenuje samp-php-gamemode. Do ní vytvoříme soubor gamemode.php Do souboru gamemode.php si připravíme dva eventy prvním bude nastartování módu a druhým připojení hráče. <?php include "core/bootstrap.php"; Event::on('GameModeInit', function() { }); Event::on('PlayerConnect', function($player){ }); A začneme tím , že přivítáme hráče na našem serveru... Použijeme k tomu známou funkci SendClientMessage byť krapet pozměněnou po stránce argumentů. SendClientMessage( 0xFF00FF00 , "Hráč ".$player->getName()." se připojil na náš PHP server :)"); Asi se možná ptáte ale kde je id kterému se má message poslat ? Event si ho sám určí Respektive si ho najde z instance $player. Dále si můžeme nastavit nějaké ty informace o serveru.. Například GameModeText a PED animace Event::on('GameModeInit', function() { Server::setGameModeText( "Ewolutions PHP Gamemode" ); Server::usePlayerPedAnims(); }); Jména funkcí jsou nebo mohou být krapet odlišná. Ale veškeré funkce najdete ve složce php/core. Tímto dílem bych ve Vás chtěl probudit trošku zvědavosti a navnadit Vás co všechno by mohlo být možné V příštím už se vrhneme na něco komplexnějšího... Třeba registraci
-
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.
-
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
-
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
-
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.
-
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.
-
S Highprintem jsme řešili resp já jsem řešil domácí ukol z algoritmizace a HighPrint mi stím hodně pomáhal. Můj původní script pracoval s Zellerovým derivačním algoritmem a spolu s HP jsme to předělali na čistý Zellerův algorytmus. Funkce getWeekDayNum Vám ze zadaného roku,měsíce a dne vrátí číslo dne v týdnu od 0 do 6 kde 0 je neděle a 6 je sobota: new WeekDays[][] = { "Neděle", "Pondělí", "Úterý", "Středa", "Čtvrtek", "Pátek", "Sobota" }; main() { printf("Dnes je %s",WeekDays[ getWeekDayNum(2016,12,20) ]); } stock getWeekDayNum(y,m,d) { return (d + (13*(m+1))/5 + -y/4000 + y%100 + (y%100)/4 + (y/100)/4 + 5 * (y/100))%7; }
-
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
-
MULTISAVE V JEDNOM SOUBORU ***** Na tenhle návod mě přivedl Ewwe s jeho problémem ohledně ukládání domů a vozidel... Kdo neví o co jde, tak Ewwe se snažil ukládat ve 2 souborech domy a vozidla. Akorát problém nastal v tom, že se načítaly domy ale nikoliv vozidla. Existuje takový trik jak se vyhnout tomuhle celému složitému ukládání... stačí pak načítat jediný soubor bez nutnosti formátovat cestu, a to za pomocí iterate a tagů v y_ini. Jelikož tag je v souborech nic více než jen poznámka, jde toho šikovně využití a nemusíme se bát, že se nám budou blbě načítat údaje, když jich tam budeme mít moc(jak mi někdo tvrdil, že se mu to děje). A naštěstí i poznámka lze zjistit, takže jak jsem říkal, jde to velice široce využít. Ukážeme si, jak vytvořit ukládání do takové formy: A furt je to v jednom souboru. Nemusíme načítat extra hodnoty, nemusíme nějak složitě zjišťovat cestu, stačí jenom povolit načítání tagů a to je vše. Začneme deklarováním proměnných. Budeme je potřebovat, abychom věděli, do čeho načtené údaje dát: #include <YSI_Data\y_iterate> #include <YSI_Storage\y_ini> enum eHouseInfo { HouseName[MAX_HOUSE_NAME + 1], HouseName[MAX_PLAYER_NAME + 1], bool: HouseLock, HouseVeh0, HouseVeh1, HouseVeh2, Float: HouseXPos, Float: HouseYPos, Float: HouseZPos } new HouseInfo[MAX_HOUSES][eHouseInfo]; A následně i iterátor, do kterého budeme přidávat id domů, které se budou načítat: new Iterator: House<MAX_HOUSES>; Teď, nejlepší na přidávání domů je si udělat fci. Vyhnu se detailům jako textlabel, některé podmínky... To si tam může pak přidat každý individuálně: stock AddHouse(const sHouseName[MAX_HOUSE_NAME+1], const sHouseOwner[], Float:fhX, Float:fhY, Float:fhZ, bool:bLock, ...) { Jelikož používáme iterate, nemusíme zjišťovat počet vytvořených domů... můžeme to jednoduše rovnou přes to zjistit, a to počtem přiřazených hodnot: if (Iter_Count(House) == MAX_HOUSES) A tady přichází ta novinka. Nemusíme přidávat nějaké housecount, nemusíme zjišťovat jestli je volno... můžeme na to využít fci, která nám zjistí nejbližší volné "id domu". new House_ID = Iter_Free(House); A nyni stačí jen přiřadit hodnoty(nesmíme samozřejmě zapomenout přiřadit do iterátoru i samotné id) HouseInfo[House_ID][HouseName] = sHouseName; HouseInfo[House_ID][HouseName] = sHouseOwner; HouseInfo[House_ID][HouseLock] = bLock; HouseInfo[House_ID][HouseXPos] = fhX; HouseInfo[House_ID][HouseYPos] = fhY; HouseInfo[House_ID][HouseZPos] = fhZ; new INI: Soubor = INI_Open("Houses.txt"); INI_SetTag(Soubor, sprintf("House%i", House_ID)); INI_WriteString(Soubor, "HouseName", HouseInfo[House_ID][HouseName]); INI_WriteString(Soubor, "HouseOwner", HouseInfo[House_ID][HouseName]); INI_WriteBool(Soubor, "HouseX", HouseInfo[House_ID][HouseLock]); INI_WriteFloat(Soubor, "HouseX", HouseInfo[House_ID][HouseXPos]); INI_WriteFloat(Soubor, "HouseY", HouseInfo[House_ID][HouseYPos]); INI_WriteFloat(Soubor, "HouseZ", HouseInfo[House_ID][HouseZPos]); INI_Close(Soubor); Iter_Add(House, House_ID); return (true); } Takže ano, prakticky normální ukládání. A teď k načítání... to bude to zajímavější. Protože pracujeme s tagem a v tagu je jen slovo House a číslo, tak právě z toho musíme vytáhnout čistě jenom to číslo. Což pro zběhlejší to není takový problém, ale i pro ty další vám ukážu jak na to. Nejdříve si extrahujeme do stringu sString jen to dané číslo: forward NahratData(tag[], name[], value[]); /* Všimněte si argumentu tag[] */ public NahratData(tag[], name[], value[]) { new sString[14]; strmid(sString, tag, 5, strlen(tag)); Nadále to číslo konvertujeme jako číslo: new House_ID = strval(sString); To je všechno... a už jenom načteme: INI_String("HouseName", HouseInfo[House_ID][HouseName]); INI_String("HouseOwner", HouseInfo[House_ID][HouseName]); INI_Bool("HouseX", HouseInfo[House_ID][HouseLock]); INI_Float("HouseX", HouseInfo[House_ID][HouseXPos]); INI_Float("HouseY", HouseInfo[House_ID][HouseYPos]); Iter_Add(House, House_ID); /* UPOZORNĚNÍ! Fce nesmí být na konci. jelikož jeho spec. návratová hodnota může ukončit celé načítání! */ INI_Float("HouseZ", HouseInfo[House_ID][HouseZPos]); return (false); } A nakonec ten samotný soubor načteme. Jak jsem již říkal: cestu nějak nemusíme formátovat, a nepotřebujeme extra hodnoty, stačí jenom načíst, a povolit načítání tagů: public OnGameModeInit() { INI_ParseFile("Houses.txt", "NahratData", .bPassTag = true); return (true); } Doporučuji pak vyčistit po ukončení scriptu(gamemodu) iterátor: Iter_Clear(House); A aby to nebylo málo, tak za pomocí iterátorů můžeme i zjistit, zda to dané id u kterého stojí hráč patří k domům: if (Iter_Contain(House, House_ID)) return (true); ODKAZY Doporučuji používat sprintf. Velice užitečná věcička: http://forum.sa-mp.com/showpost 612 Kdyby někdo nepochopil, jak se s tím pracuje... tak jsem tuhle vychytávku používal hodně často, například u přidávání adminů do /admins pastebin.com/qZV5evSz PODĚKOVÁNÍ xhunterx za radu s tímto trikem.
- 5 odpovědí
-
- 1
-
- ukládání
- housesystem
- (a 6 dalších)
-
Zdarec... Rozhodl jsem se na udělat takový menší script jako praktickou ukázku práce s y_timers. Jsou to jednoduché tipy + ochrana aby se nezobrazil 2x po sobě stejný tip. #include a_samp #include <YSI\y_timers> #define MINUTY (5) new tips[][] = { "[ i ]{FFFFFF} Tip číslo 1", "[ i ]{FFFFFF} Tip číslo 2", "[ i ]{FFFFFF} Tip číslo 3", "[ i ]{FFFFFF} Tip číslo 4", "[ i ]{FFFFFF} Tip číslo 5", "[ i ]{FFFFFF} Tip číslo 6" }; new r = -1; task tipsandtricks[1000*60*MINUTY]() { there: new rand = random(sizeof(tips)); if( rand != r ) { SendClientMessageToAll( 0x0080FFFF , tips[rand] ); print(tips[rand]); r = rand; }else goto there; } Otázky ?
-
V čem je ePawno jiné ? - je vyvýjené pawnerem pro potřeby pawnerů - hlavním kladem je že je vyvýjeno líným pawnerem Co ePawno obsahuje ? - Project system - mklinker - Color picker - lepší zvýrazňovač syntaxe - String counter ePawno ePawno je založené za kódu editoru PawnPlus ( líbil se mi VS12 vzhled ) který jsem využil. U zvýraznění syntaxe jsem přidal klíčová slova a identifikátory z YSI. K samotnému editoru dodávám Zeexův kompiler patch. Mklinker Možná jste narazili na problém když využíváte více editorů pro pawn a nechcete je mít nebo anemůžete mít v jedné složce. Od toho tu je mklinker kde vám stačí pouze jedna složka s includy. Stačí vybrat její lokaci v mém případě je to složka includy u oficiální editoru a dále vyberete složku kde chcete mít novou složky s includy. To je vše mklinker vytvoří symbolický odkaz díky kterému se složka tváří jako samostatná složka ale její obsah je přesměrováván z originální pawn složky. Na pevném disku tery zabírá pouhý 1KB. Screenshots Download https://mega.co.nz/#!NJo2VB5L!RXPxkZFaJjdAXpOZITva5KRWi3X2jB8zx99LnCccBM4 Update 0.1.0.1 ePawno_b1.rar
- 29 odpovědí
-
- 10
-
Zdravím Po dlouhé době jsem se nudil tak jsem si řekl že si napíšu 4Fun nějaký scriptík... Vylezl z toho TBan... Použití : 1.0 2.0 m/h/d/t/f/r - jsou multipliery m ... minuta h ... hodina d ... den t ... týden f ... měsíc r ... rok Příklad: Zabanování hráče ID:1 na 5 minut za vulgaritu /ban 1 5 m vulgarita Zabanování hráče ID:1 na 10 let za divné tričko /ban 1 10 r Mas_divne_tricko V souvislosti s fenoménem Y38Kpři banu který délkou přesáhne rok 2038 dochází k resetu UNIX time Po použití : Vrchní zpráva pro admina (RCON) Spodní pro zabanovaného Zabanovaný se pokusil připojit : Know Bugs: Důvod raději psát bez mezer Download: http://pawno.cz/files/file/105-tban/ Credit: Y_Less - sscanf QWER - QCMDv2 Jochemd - Timestamp To Date converter Double-O-Seven - DOF2 Ewwe -Smíchání všeho do jednoho scriptu
-
Technologie: CSS2 HTML5 PHP AJAX MySQL Index Galerie Blacklist Company list Server status ( AJAX autorefresh ) K webu jsem si ještě udělal aplikaci na přidávání firem a nicků do blacklistu a nahrávání obrázků ale to až jindy Jelikož mám tento web na subdoméně a nerad bych se tu dohadoval o principech reklamy nahodil jsem si .tk doménu.... Tak live bude až se .tk nastaví TU
-
Zdravím, Už je to pár dní kdy jsem začal dělat na VIP systému s webadministrací.. VIP systém obsahuje : Nastavení VIP,TimedVIP,OdebráníVIP,Seznam uživatelů s VIP WebAdministrace: Několik vzhledů,Nastavení VIP,Odebrání,Server Status, Náhled administrace : http://vipadmin.ewolutions.cz Script + Administrace : http://pawno.cz/files/file/132-e-vip-core-vipwebadmin/ Credits : Y_Less, Double-O-Seven, Qwer, Twitter, SA-MP Team
-
Zdařec.. Nahraný čas pomocí timerů je sice jednoduchý ale zbytečný... Jde to krásně bez nich... Deklarujeme proměnou : new TempTime[MAX_PLAYERS char]; public OnPlayerConnect( playerid ) { TempTime{ playerid } = gettime(); //Proměnné nastavíme aktuální hodnotu unix tajmu return 1; } public OnPlayerDisconnect( playerid ,reason) { new TimeToTemp = gettime() - TempTime{ playerid } ;// Proměná TimeToTemp bude nyní obsahovat počet sekund které byl hráč online // proměnou TimeToTemp [b]přičteme [/b]do hráčova souboru (DUdb,Dini,DOF2) return 1; } To je vše krásné ráno :-)
- 17 odpovědí
-
- ewwe
- bez timerů
-
(a 2 další)
Tagged with:
-
Zdravím napadl mě menší scriptík na základě mého custom callbacku OnPlayerTryBreakInACar Zamknete vozidla a kdokoliv cizí má možnost 3:97 že se mu podaří do auta se vloupat. V případě neúspěšného pokusu se spustí alarm a dotyčnému přidá jeden hledanostní bod. http://pawno.cz/files/file/142-breakingablecars/
- 9 odpovědí
-
Zdarec... Bartman mě v chatu přivedl na nápad na script.. Nějakou dobu jsem o tom přemýšlel a nakonec se po několika pokusech věc podařila... Script zjištuje zdali se hráč snaží dostat do zamčeného vozidla a událost odešle do vlastního callbacku... Credits GooMan za fci GetNearestVehicle http://pawno.cz/file...trybreakinacar/
-
Jak již z názvu jest patrno nejedná se o návod v přímém slova smyslu... Chci se s vámi podělit o řekněme tweak který jsem objevil při štourání v pawn dokumentaci.... Je dost možné že používáte předefinování id dialogů do "slov" příklad #define DIALOG_LOGIN (1) ShowPlayerDialog( playerid, DIALOG_LOGIN, DIALOG_STYLE........ Já narazil na jednodušší způsob který pro zkušenější scriptery nebude žádnou novinkou ale některým nováčků a podobně to podle mého pomoci může. enum { DIALOG_NONE, DIALOG_LOGIN, DIALOG_REGISTER } Pooužití je pak už shodné s předchozí alternativou. V čem je toto lepší než definice ? Enum přiděluje "definicím" čísla od 0 do 32574(MAx_DIALOG_ID) sám tudíž odpadájí problémy stím jestli jste si někde nedali stejné id dialogu enum { DIALOG_NONE,//ID 0 DIALOG_LOGIN,//ID 1 DIALOG_REGISTER// ID 2 } Pokud Vám to ulehčí práci s idčky dialogů jako mě pak budu jen rád
-
Zdrawstvujte či jak se to píše... Mnozí si říkáte co to zase bude za hovadinu ? Jo možná to hovadina je...... Máte nápad na nějaký script (pawn) ale neumíte ho zrealizovat a já nemám do čeho píchnout.... Napište mi (ne do SZ vypl jsem si je) buď sem nebo na email [email protected] a pokud se mi bude líbit a nebude to nějaká kokotina který tu je 50x pustím se do toho.... Nuže ... Čekám ....
-
V četu jsem zahlédl popis nadšeného jedince který si udělal timer na 500ms aby mu to opravovalo vozidlo... To je PÍČOVINA!!! V následujícím scriptu vám ukážu jak se to dělá bez timeru.... Stačí si přidat do módu/fs tento callback: public OnVehicleDamageStatusUpdate(vehicleid, playerid) { RepairVehicle(vehicleid); return 1; } Funguje to v podstatě tak že při poničení karoserie/světel/kol apod se vozidlo opraví...
-
Na základě včerejšího tématu kde autor měl problém s II a && , očividně neměl tušení co který znak dělá či jak funguje jsem se rozhodl napsat takový menší návod na toto téma. Snad mě tedy neukamenujete... || - "nebo" - Tímto znaménkem lze "spojit" dvě podmínky do jedné v případě , že chceme aby podmínka( dále jen podm.) nabyla platnosti buď první zadáním nebo druhým nebo x-tým zadáním. Myslím si že přehledněji to lze znázornit pomocí spínačů. Příklad : if(A == 1 || B == 1|| C == 1) Na obrázku s označením a) vidíte že ani jeden spínač (blok podmínky) není sepnut (podmínka není splněna) tudíž signál neprochází. Podm tedy není splněna. Na obrázcích a c) je znázorněno splnění bloků pokud je splněn blok A == 1 signál projde a podmínka je splněna. Tzn že při splnění libovolného bloku se splní podmínka. && - "a" - Tímto znaménkem lze opět spojit více bloků podmínek za předpokladu že podmínku lze splnit splněním všech bloků. Příklad : if(A == 1 && B == 1&& C == 1) Obrázek označený a) znázorňuje nesplnění žádného bloku podmínky. Znázorňuje splnění prvního bloku avšak podmínka není splněna. Totéž nastává při splnění prvního a druhé bloku c) Až při splnění všech bloku (v našem případě tří) obrázek d) je vidět že podmínka je splněna. Tzn že u podmínek ve kterých "slučujeme" pomocí && musí být splněny všechny bloky jinak podmínka nenabyde platnosti. Dále můžeme v podmínkách pracovat se znaky & a |, kde & je logický součin a | podíl ( nejsem si jist tím podílem ). Použití logického součinu je časté při práci s klávesami. if(newkeys & KEY_WALK) if(newkeys == KEY_WALK) U první verze (s log. součinem) při zjištění stisknuté klávesy je jedno zdali máte stisknuto víc kláves důležité pro něj je jestli je stisknuta zadaná. U druhé verze už to jedno není .. Když stisknete L.ALT a současně držíte třeba ENTER tak se podmínka nevykoná. Více do těchto logických operací zabíhat nebudu protože až tolik o tom zase nevím . Tím by to bylo ode mě vše a doufám že alespoň někomu jsem tímto pomohl. Regards.
-
Systém nemocí. Callbacky : OnPlayerNemocAttack(playerid) OnPlayerChcipNaNemoc(playerid) Funkce: SetNemoc() RemovePlayerLife(playerid,Float:Amount) PlayerLecit(playerid) Jak přidávat nemoce : Původní stav : #define MAX_NEMOC 3 new Nemoc[MAX_NEMOC][nemoc_info] = { {"Chřipka",2.5}, {"Syfilis",4.9}, {"HIV",6.5} }; S přidanou : #define MAX_NEMOC 4 new Nemoc[MAX_NEMOC][nemoc_info] = { {"Chřipka",2.5}, {"Syfilis",4.9}, {"HIV",6.5}, {"Dementoria",21.2} }; Kde první je jméno nemoci a druhá hodnota je ubytek zdraví který vyvolává. http://pawno.cz/files/file/44-nemoce/ PS. Pickup je pro možnost vyléčení umístěte si ho do nemocnice nebo kde budete chtít ůléčit