Jump to content

Search the Community

Showing results for tags 'navod'.

  • 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. Vítejte u dalšího návodu. A tentokrát je to jak vytvořit to, že když hráč napíše nějaký příkaz v našem případě /prekvapeni tak mu to napíše náhodnou věc. Je to velmi jednoduché! Nyní přejdeme k samotnému návodu! NÁVOD: Nahoru do módu pod #include <a_samp> Napíšeme: #include <zcmd> Najdeme si public OnPlayerCommandText a celý to vymažeme! A místo toho tam dáme toto: CMD:prekvapeni(playerid,params[]) { switch(random(3)) //ta 3 = kolik zpráv se náhodně bude střídat { case 0:{ random(3); SendClientMessage(playerid,0xFF0000,"ZPRÁVA 1"); } case 1:{ SendClientMessage(playerid,0xFF0000,"ZPRÁVA 2"); } case 2:{ SendClientMessage(playerid,0xFF0000,"ZPRÁVA 3"); } } return 1; } Celý máme následně hotové a jakmile hráč napíše /prekvapeni zobrazí se mu náhodně buď Zpráva 1, 2 nebo 3. Samozřejmě si ty zprávy můžete změnit a kdyby jste chtěli víc náhodných zpráv tak stačí pokračovat case 3,4 atd... Doufám že se vám můj návod líbil pokud ano dejte +rep a ohodnoťte do 10-ti bodů
  2. Zdravím, tématem tohoto návodu bude hashování hesel; řeč bude zejména o nové funkci, která do SA:MP přibyla od verze 0.3.7 R1 – SHA256_PassHash. Opravdu jsem nevěděl, jakou zvolit obtížnost, ale vzhledem k úrovni vědomostí většiny místních uživatelů jsem se rozhodl pro 3/5 (pro středně pokročilé). Obtížnost: Co je hashování a k čemu slouží Pojem hashování znamená převod dat (v našem případě to budou hesla hráčů) na otisk neboli hash. K tomuto převodu nám slouží tzv. hashovací funkce. Hash, který nám vznikne, má několik klíčových vlastností: – nezáleží na tom, jak velká data jsou, výsledný hash bude mít velikost vždy pevně danou; – i při sebemenší změně dat (např. změna hesla z "ahoj123" na "ahej123") se bude výsledný hash podstatně lišit; – z hashe se k původním datům prakticky nelze dostat (proto jsou hashovací funkce označovány jako jednosměrné). Z těchto bodů by Vám už mělo být jasné, k čemu je hashování dobré – k ochraně citlivých údajů a procesů, kterými hesla nepochybně jsou. SHA-256 SHA-256 je hashovací funkce pocházející z rodiny hashovacích funkcí SHA-2. Používají ji kupříkladu protokoly TSL a SSL, ale své uplatnění najde i v Linuxu. V pawn tato funkce vypadá následovně: _ SHA256_PassHash(password[],salt[],ret_hash[],ret_hash_len) _ password[] – heslo, ze kterého chceme získat hash; salt[] – kryptovací "sůl", o které si za chvíli povíme; ret_hash[] – výsledný hash; ret_hash_len – délka výsledného hashe, která bude vždy 64. Solíme a solíme V úvodu o hashování jsem zmínil, že kryptografické hashovací funkce jsou jednosměrné, tedy že původní data z výsledného hashe už sotva získáme zpět. K těmto funkcím lze ještě přidat takzvanou sůl, což jsou náhodná data, která se připojují navíc k původním datům. Toto uplatníme právě při hashování hesel. Zvolí-li si uživatelé náhodou stejné heslo, díky unikátnímu "osolení" nám tak vznikne více variant, čímž zabráníme možným slovníkovým a podobným útokům. Co byste měli mít na paměti při generování soli: – sůl musí být vždy náhodně vygenerována, pokud budeme solit stále stejnou solí, bude to postrádat efekt; – tvoříme dlouhou sůl; pokud by si útočník chtěl udělat tabulku možných solí, sůl o délce dvou znaků by nám moc nepomohla. A jdeme skriptovat Teď, když už víme vše potřebné, je načase si ukázat, jak to bude vypadat v kódu. Vytvořím jednoduchý registrační systém, kam budu ukládat jen heslo a sůl. Jako první si nadeklarujeme potřebné proměnné. new pPassw[MAX_PLAYERS][65]; //hash bude mít vždy délku 64 znaků + EOS new pSalt[MAX_PLAYERS][11]; //délku soli jsem zvolil 10 znaků + EOS _ Následně si nadefinujeme pomocné funkce. GenerateSalt() //vygeneruje nám náhodnou sůl o délce 10 znaků { new salt[11]; for(new i;i<10;i++) salt[i] = random(126-33) + 33; //od ASCII 33 ('!') až po 126 ('~') salt[10] = EOS; return salt; } GetPath(playerid) //vrátí nám cestu k uživatelově souboru { new path[6+MAX_PLAYER_NAME+4+1]; GetPlayerName(playerid,path,sizeof path); format(path,sizeof path,"users/%s.txt",path); return path; } _ Nyní si ukážeme, jak to bude vypadat při registraci. public OnDialogResponse(playerid,dialogid,response,listitem,inputtext[]) { if(dialogid == DIALOG_REGISTER) { new File:f,salt[11],str[100]; salt = GenerateSalt(); //vygenerujeme náhodnou sůl SHA256_PassHash(inputtext,salt,pPassw[playerid],sizeof pPassw[]); //k zadanému heslu (inputtext) se přidá sůl (salt) a výsledný hash se uloží do pPassw[playerid] f = fopen(GetPath(playerid),io_write); //otevření souboru v režimu zápisování format("%s\r\n%s\r\n",pPassw[playerid],salt); //zapisované údaje (heslo a sůl) fwrite(f,str); //zápis do souboru fclose(f); //uzavření souboru return 1; } } _ Registraci se zápisem hashe bychom měli. Nyní se podíváme na to, jak budeme postupovat při přihlášení. Navazujeme na kód výše dialogem pro přihlášení. else if(dialogid == DIALOG_LOGIN) { new File:f,hash[65]; f = fopen(GetPath(playerid),io_read); //otevření souboru v režimu čtení fread(f,pPassw[playerid]); //přečtení hesla ze souboru fseek(f,2,seek_current); //přeskočení bílých znaků fread(f,pSalt[playerid]); //přečtení soli ze souboru fclose(f); //uzavření souboru SHA256_PassHash(inputtext,pSalt[playerid],hash,sizeof hash); //k zadanému heslu (inputtext) se přidá sůl (pSalt[playerid]) a výsledný hash se uloží do proměnné hash if(!strcmp(hash,pPassw[playerid])) //pokud je přihlašovací hash shodný s hashem ze souboru, jsou hesla identická { //správné heslo = úspěšné přihlášení } else { //nesprávné heslo = neúspěšné přihlášení } return 1; } _ Tím, že jsme k přihlašovacímu heslu přidali stejnou sůl jako při registraci hráče a celé ho poté zahashovali, nám musí vzniknout identický hash s hashem v souboru. Je-li tomu tak, uživatel zadal správné heslo, došlo k úspěšnému přihlášení. Pokud se hashe shodovat nebudou, bylo zadáno špatné heslo. Právě z tohoto důvodu je nutné zapisovat sůl do souboru společně s otiskem hesla. Závěr A to by bylo vše. Probrali jsme základní principy hashování, možnost SHA-256 hashování v pawn, ukázali si, jak vytvořit registrační soubor. Mimoto také můžeme vidět, že se dá obejít bez různých includů pro práci se soubory. Předem varuji, že kódy slouží pouze a jen jako ukázka. Cílem nebylo vytvořit registrační systém, jen poukázat na možnosti hashování. Pozdější komentáře typu: "Zkopíroval jsem to a nejde mi to!" budou pravděpodobně ignorovány nebo tězce zkritizovány ostatními. Samozřejmě, pokud jste našli jakoukoli chybu v tom, co jsem napsal, neváhejte mi zde zanechat vzkaz! Totéž platí i v případě, chcete-li se na něco zeptat nebo mi jen vyjádřit svůj názor. 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ý
  3. YSI4 ADMINS #3 ***** Zdravím vás u dalšího návodu práce s YSI. Dnešní díl se bude týkat velice známého příkazu /admins. Nevyužijeme bohužel knihovnu na plno, ale hledal jsem způsob, jak vám ukázat využití iterate(foreach). Hledal jsem nějakou zajímavou ukázku. Jenže, takových scriptů je skutečně mnoho, od návodů, po helpy, kde někteří autoři mají dokonce svojí vlastní. Tak jsem vybral asi ten nejpříhodnější: Kód, celkem už slušnější, nám zaslal autor do helpu (pawno.cz/topic/41048), s tím, že prý s tím má problém, ale i tak ho můžeme využít jako ukázku. Nebudeme pracovat s jmény místo levelů. To si tam můžete již každý přidat individuálně. No, pustíme se do toho, nejdříve si jako vždy nahrajeme includy z knihovny, které budeme potřebovat pro práci: YSI_Visual\y_commands - pro lepší, efektivnější práci s příkazy, včetně parametrů. YSI_Data\y_iterate - Dříve známo jako foreach. Zjednodušený, rychlejší a efektivnější cyklus, se kterým se lépe pracuje. YSI_Visual\y_dialog - Include je propracovaný tak, aby se dialogID, se kterým bude s tímto includem pracovat, aby se nekřížil s nějakým jiným. YSI_Server\y_colours - Obsahuje propracované preprocesory s barvami, které pak může uživatel jednoduše využít prakticky kdekoliv. Potřebné includy z knihovny máme nahrané a tak můžeme pokračovat. Začneme tím, že si deklarujeme jednu integer proměnnou, která nám bude sloužit jako AdminLevel našich hráčů: new iAdmin[MAX_PLAYERS char]; Všimněte si slovíčka char. Co je to? Zkráceně a zjednodušeně, nám to vrátí číslo po dělení pole číslem 4(například [200] / 4 = [50]). Dále si přidáme samozřejmě příkaz, který nám bude zobrazovat naše administrátory: YCMD:admins(playerid, params[], help) { Tak, a ťed budeme potřebovat deklarovat lokálně tři proměnné. Dvě budou string, přesněji první proměnná string bude pro text v dialogu a druhý pro nick, a třetí proměnná bude integer, který nám bude udávat počet přitomných administrátorů na serveru: new sString[800 + 1], sNick[MAX_PLAYER_NAME + 1], iPocet; Když to máme za sebou, tak za další budeme přidat samotný cyklus, kterým nám projete všechny hráče na serveru. Princip foreach je prakticky stejný jako cyklus se GetPlayerPoolSize, ale samozřejmě lepší: foreach(new i: Player) { Slovíčko Player nám říká, že cyklus má project pouze přítomné hráče na serveru. Je samozřejmě více možností pro cyklus(Bot, Character, Actor, Vehicle). Po cyklusu následuje funkce, která nám všech hráčů zjistí jméno. Můžeme jí samozřejmě přidat, že je bude zjišťovat, až najde ty naše administrátory, ale zas taková hrůzná to nebude, když to necháme takhle mimo: GetPlayerName(i, sNick, sizeof(sNick)); Konečně můžeme hledat naše administrátory. Postačí nám 2 úplně základní a typické podmínky, a to sice, jestliže má nějaký AdminLevel a pokud je přihlášen na rcon. Začneme podmínkou v případě, že je přihlášen na RCON ale nemá AdminLevel, včetně formatování samozřejmě, a nesmíme zapomenou zvyšovat naší proměnnou iPocet: if(IsPlayerAdmin(i) && !iAdmin{i}) format(sString, sizeof(sString), "{%06x}%s\t{FFFFFF}\t+RCON", GetPlayerColor(i) >>> 8, sNick, iPocet++; Další podmínkou v případě, že není přihlášen na RCON ale má nějaký AdminLevel: if(!IsPlayerAdmin(i) && iAdmin{i}) format(sString, sizeof(sString), "{%06x}%s\t{FFFFFF}LEVEL %i\t", GetPlayerColor(i) >>> 8, sNick, iAdmin{i}), iPocet++; A třetí podmínkou v případě, že je přihlášen na RCON a zároveň má nějaký AdminLevel: if(IsPlayerAdmin(i) && iAdmin{i}) format(sString, sizeof(sString), "{%06x}%s\t{FFFFFF}LEVEL %i\t+RCON", GetPlayerColor(i) >>> 8, sNick, iAdmin{i}), iPocet++; Všimněte si, jak pracujeme s tou proměnnou. Jako s boolen. Tudíž, v případě, jestli vrací true/false, nikoliv číslo... k čemu? Jelikož, nepotřebujeme vědět jaký má přesně adminlevel (1, 2, 3...), nám stačí, pokud nějaký má(1) a pokud má žádný(0). A ano přesně tak. To jsou stejné hodnoty jako u boolenu: true(1) a false(0). Když máme tyhle podmínky za sebou, tak za další budeme potřebovat podmínku, jestliže je vůbec nějaký přítomný administrátor. Na to nám poslouží naše lokální proměnná. Začneme v případě, že nejsou, tak nám pomocí návratové hodnoty zobrazí zprávu: if (!iPocet) return (SendClientMessage(playerid, X11_RED, "[ ! ] Nikdo z přítomných hráčů není administrátor !")); V případě, že je nějaký přítomný, tak budeme potřebovat už blok, jelikož se stane více věci. Začneme tím, že si formátujeme string s našimi administrátory: format(sString, sizeof(sString), "%s\n\n{A9C4E4}Počet online administrátorů: {FFFFFF}%i", sString, iPocet); A nakonec zobrazíme samotný dialog. Díky y_dialog nemusíme vepisovat dialogID, najde nám samo, které nejnižší dialogID je volné: Dialog_Show(playerid, DIALOG_STYLE_TABLIST, "Administrátoři Online", sString, "Zavrit", ""); Pak už jen ukončíme blok a ukončíme i příkaz návratovou hodnotou a máme hotovo: } return (true); } Celý kód pro shlédnutí zde: 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ý
  4. Ewwe

    návod Steam profil

    Zdravím, Dnes byla přidána modifikace , která integruje steam do fóra. Stačí jít na váš profil zde na fóru a v úpravách najít položku steam ( nachází se u kontaktních údajů ). A zadat vaše steam id které získáte z url vašeho steam profilu http://steamcommunity.com/id/[steamid]/ Poté na vašem profilu kliknete u widgetu steamu na možnosti a update. S pozdravem ...
  5. YSI4 AFK #2 ***** Zdravím vás u dalšího návodu. Dnešní díl se bude týkat AFK systému. Opět jsem si pro vás připravil takovou ukázku, kde uživatel, který je jistě autorem tohoto kód, se snažil o naprogramování stejného scriptu, na který bude návod v tomto topicu, s opět využitím dcmd(ach jo): Znalosti některých uživatelů jsou vskutku mimořádné. Děkujeme uživateli HelloJeffry, který nám tento "kód" poskytl na (ewolutions.cz/topic/1170). Teď si to zkusíme vytvořit s využitím YSI knihovny. Začneme s tím, že si rozmyslíme, co si nahrajeme: y_commands - pro lepší, efektivnější práci s příkazy, včetně parametrů. y_playerarray - ušetří využití paměti, hlavně u boolen proměnných s polem. Rozdíl mezi y_bit a y_playerarray prakticky není. Jen y_playerarray je určená pro hráče. y_va - pro práci s již formátovanými fcemi nebo efektivnější zpracovávání vlastních form. fcí. Potřebné includy z knihovny máme nahrané a tak můžeme pokračovat. Začneme tím, že si deklarujeme jednu boolen proměnnou, ale pozor, s tagem PlayerArray!: new PlayerArray: bIsAfk<MAX_PLAYERS>; Pracování pak s tou proměnnou je sice jednoduché, ale pro vás to bude ze začátku celkem neefektivní, tak si na to můžeme udělat preprocesor: #define IsPlayerAfk(%0) Bit_Get(bIsAfk, %0) Nyní přidáme snad nejrozšířenější, nejčastější a nejvíce používanou funkci, a to funkci, která nám vrátí z fce GPN jméno hráče. Jelikož nepřidávám další velice známé slovíčko stock, tak jméno naší fce trošku zkrášlíme: GetPlayerNick(playerid) { new sNick[MAX_PLAYER_NAME + 1]; GetPlayerName(playerid, sNick, sizeof(sNick)); return (sNick); } Dále si přidáme (zjednodušeně) příkaz. Tak já nevím co vy, ale myslím, že příkaz afk je asi pro náš účel nejlepší volba: YCMD:afk(playerid, params[], help) { V případě, že by jste chtěli jiný příkaz, stačí jenom změnit slovíčko afk.. Tak, dále použijeme náš preprocesor a pomocí podmínky zjistíme, jestli není hráč již afk: if (IsPlayerAfk(playerid)) { Nyní budeme zpracovávat blok, který proběhne v případě, že hráč je afk, tudíž jestliže bude proměnná true. Začneme tím, že přiřadíme naší proměnné hodnotu false, jelikož je afk a jakmile zadá příkaz, tak už nebude: Bit_Vet(bIsAfk, playerid); TogglePlayerControllable(playerid, true); /* K tomhle snad nemusím nic povídat... */ ***** Rozdíl mezi Bit_Vet a Bit_Let. I když je celkem jasný rozdíl, nejspíše se najdou jedinci, co ho nevidí, tak vysvětlím: Normálně při nastavování u takových-to proměnných musí uživatel používat fci Bit_Set. Bit_Set(bIsAfk, playerid, true); Bit_Set(bIsAfk, playerid, false); Kdo tento způsob bude používat, tak maximálně bude upozorněn, že existuje lepší varianta a to zrovna Bit_Let, který nastaví proměnnou na true a Bit_Vet nastaví proměnnou zase na false: Bit_Let(bIsAfk, playerid); /* true */ Bit_Vet(bIsAfk, playerid); /* false */ Krom toho, že jsou rychlejší v zápise jsou také mnohem rychlejší po stránce funkčnosti. ***** A nakonec přidáme, že se všem odešle zpráva(již formátovaná), že se hráč úspěšně vrátil do hry: va_SendClientMessageToAll(0xFFA50000, "[ AFK ] Hráč %s se vrátil do hry", GetPlayerNick(playerid)); Ale nyní zpracovávat blok, který proběhne v případě, že hráč ještě není afk, tudíž jestliže bude proměnná false. Začneme tím samým akorát opačně, a to, že přiřadíme naší proměnné hodnotu true, jelikož není afk a jakmile zadá příkaz, tak už bude: Bit_Let(bIsAfk, playerid); TogglePlayerControllable(playerid, false); A pozor. Teď vám ukážu takový magický trik. Pokud chcete odesílat afk s důvodem v případě, že nějaký napsal, tak nemusíte na to přidávat zbytečně další blok. Ale stačí vám jediné, a to if-else. Prvně podmínka, jestli tedy nezadal žádné parametry: if (!strlen(params)) va_SendClientMessageToAll(0xFFA50000, "[ AFK ] Hráč %s je nyní AFK !", GetPlayerNick(playerid)); A teď jeho alternativu v případě, že napíše cokoliv, například ahoj, místo parametrů(/afk ahoj): else va_SendClientMessageToAll(0xFFA50000, "[ AFK ] Hráč %s je nyní AFK [ DŮVOD: %s ]!", GetPlayerNick(playerid), params); Neuvěřitelné, že? Z celých 2 bloků jsou pouhé 2 řádky!. A nakonec zakončíme blok a i celý příkaz a máme hotovo: } return (true); } Toť vše. Celý kód pro shlédnutí zde: Pak to dopadne nějak takto: Děkuji za pozornost a všem, kdo tento návod ohodnotí kladně a nebo repem. PS: mám v plánu pokračovat. 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ý
  6. Zdravím. Jelikož sem zde na pawnu nenašel (možná tu je, opravdu sem to nenašel) jak nastavit damage u zbraní, tak sem dám tutoriál. Takže. Otevřeme si klasicky a pawno a jediné co nám stačí před samotným nastavením je základní include. #include "a_samp" Dobře, máme? Super. Nyní si dáme někam pod to public. public OnPlayerTakeDamage(playerid, issuerid, Float: amount, weaponid) // Playerid - ID střeleného // Issuerid - ID toho, kdo vás střelil // Float: amount - Kolik vám hráč vzal HP // Weaponid - ID zbraně. Tak. A do toho publicu. { // Otevřeme public new Float:HP,Float:amount; // Ukládání HP hráče GetPlayerHealth(playerid, HP); // "Získáme" HP hráče GetPlayerArmour(playerid, amount); // "Získáme" ARMOUR hráče if(weaponid == 24) SetPlayerHealth(playerid, HP+amount-60); // Nyní se stane to, že pokud hráč tě trefí s Desert Eaglem, ubere to - 60 HP. return 1; // Umožní to zpětné volání být vyvolán z jiného scriptu } // Ukončíme public Samozřejmě sem i dám celý kod. Závěr .... Ano, je to můj první tutoriál, proto očekávám kritiku. Ale, na to nechci se na to nějak vymlouvat, takže hodnotit tak jak to vidíte.
  7. Návod na radio Ahoj, úplně nechápu jak někdo "složitě" dělá rádio systém. Já upřednostňuju spíš lehčí se stejnými funkcemi. Omluvte mě to, je to můj první návod, chci si to zkusit, díky . Umím toho více, ale 1 návod. Obtížnost: (Jak pro koho, pro úplné začátečníky takhle, pro trochu víc znalce nejlehčí) Začneme že si uděláme příkaz, že se bude dialog zobrazovat. Do publicu OnPlayerCommandText si dáme: Vysvětlení: playerid <-- Znamená to, že dialog se zobrazí tomu hráči, který příkaz napsal. 999 <-- ID DIALOGU, pokud by bylo více dialogů se stejným ID, bugovali by se ve hře. DIALOG_STYLE_LIST <-- Znamená jakým stylem bude dialog vypadat. \n <-- Další řádek v dialogu. Teď si uděláme to, CO dialog bude vlastně dělat, co se stane když hráč klikne z výběru. public OnDialogResponse Příklad URL: 1. Evropa 2 CZ 2. KissHády 3. Impuls A u těch CASŮ se začíná vždycky od 0 Takhle máme RÁDIO úplně lehce, akorát teda tam nejsou posluchači, to si myslím, že je zbytečné Tímto končím .. Ahoj. Beru i kritiku, jelikož teda je to můj první návod, a tak budu rád, když budu vědět co zlepšit :)
  8. takze caute, dnes si ukazeme tut jak nastavit, jak se pripojime, tak aby zacinala hrat hudba.. takze si najdeme.. public OnPlayerConnect(playerid) { return 1; } a napíšeme tam.. PlayAudioStreamForPlayer(playerid, "URL"); public OnPlayerConnect(playerid) { PlayAudioStreamForPlayer(playerid, "URL"); return 1; } Priklad: public OnPlayerConnect(playerid) { PlayAudioStreamForPlayer(playerid, "http://delete.4fan.cz/hudba/hydra.mp3"); return 1; } Pokud chceme... aby se hudba zastavila pri spawnuti, tak si najdeme .. public OnPlayerSpawn(playerid) { return 1; } a tam napíšeme StopAudioStreamForPlayer(playerid); public OnPlayerSpawn(playerid) { StopAudioStreamForPlayer(playerid); return 1; } takze toto by bylo vse caute
  9. YSI4 ODPOČET #1 ***** Je celkem škoda, že je tu celé subfórum, ale prázdné. Tak mě napadlo toho využít. Hledal jsem chvilku nějaký odpočet bez použití YSI. Jelikož vEnd neumí pochopit pojem ukázka, tak jsem našel něcí starší odpočet na ewolutions(ewolutions.cz/topic/1661): Jak si můžete všimnout je tam použité dcmd(my god). Teď si to zkusíme vytvořit ve YSI knihovně. Začneme s tím, že si rozmyslíme, co si nahrajeme: y_commands - pro lepší, efektivnější práci s příkazama, včetně parametrů. y_timers - pro lepší a efektivnější práci s timerama. y_va - pro práci s již formátovanými fcemi nebo efektivnější spracovávání vlastních form. fcí. Potřebné includy z knihovny máme nahrané a tak můžeme pokračovat. Nejdříve si deklarujeme dvě proměnné. Jedna bude pro podmínku, jestliže běží nějaký odpočet a druhá bude na čas do konce odpočtu: new iOdpocet, bool:bOdpocet; Pokud to někteří z vás nezvládají tento krok, tak se YSI ani neučte. Děkuji za pochopení. Všimněte si, že máme jednu proměnnout deklarovanou jako integer a druhou jako boolen. Nyní si vložíme (zjednodušeně) příkaz. Můžeme si zvolit jaký chceme, tak například obyčejný odpocet: YCMD:odpocet(playerid, params[], help) { Oprávnění si bude moct každý přidat zvlášť podle svých potřeb nebo podle svého uvážení. Upozornění: Nemusíme vůbec přidávat preprocesor #pragma unused (přesněji na to samotné help, které vrací true v případě, že hráč zadá to, co má nastavené (například otazník)), jak velká většina lidí praktikuje. Je to naprosto zbytečně. Ale zpět k návodu, kde budeme pokračovat tím, že si přidáme nejlépe tři podmínky a k nim budeme vracet zprávy. První, jestliže zadal parametry správně: if (!strlen(params)) return SendClientMessage(playerid, -1, "< Chyba > Použití příkazu: /odpocet [5-60]"); Následně, jestliže ten čas, co zadal je správně v rozmezí 5-60 sekund: if (strval(params) < 5 || strval(params) > 60) return SendClientMessage(playerid, -1, "< Chyba > Použití příkazu: /odpocet [5-60]"); A na konec, jestliže už neběží nějaký odpočet: if (bOdpocet) return SendClientMessage(playerid, -1, "< Chyba > Odpočet již běží !"); Když máme podmínky za sebou následuje samotný odpočet. Nejdříve si jednou spustíme timer, defer tOdpocet(); Můžeme ho místo místo jednostranného spouštění pomocí defer ho opakovat pomocí repeat, ale to bychom ho pak musely zastavit, což je už trochu složitější, a není to tak jednoduché, jak to zní. Pak už jen přiřadíme hodnoty, a to tak, že bOdpocet přiřadíme true, jelikož odpočet bude běžet, tak aby se nezačal hned další a iOdpocet abychom věděli, kolik zbývá do konce: bOdpocet = true; iOdpocet = strval(params); return (true); /* A zakončíme návratovou hodnotou */ } Teď ke spracování samotného timeru. Ale není čeho se obávat. I to je velice jednoduché. Tak přidámi fci timeru: timer tOdpocet[1000]() { Slovo timer je poznámka pro compiler, že je o fci pro timer. Číslo se závorkou [1000] je počet milisekund, kdy se spustí timer (tedy, kdy začne "působit" kód uvnitř bloku), a závorky () je pro parametry, které voláme(přidáváme) spolu se spouštěním času (defer, repeat...). Pak si přidáme podmínku, jestli naše proměnná ještě nedosáhla hodnoty 0: if (iOdpocet != 0) { Uvitř bloku dáme, že se odešle již formátovaná zpráva GM pro všechny hráče se odpočtem: va_GameTextForAll("~r~%i", 1000, 3, iOdpocet); Všimněte si, že tady ve fci dostazujeme za specifikátory až ke konci. A nakonec znovu spustíme jednou timer, protože, kdybychom ho spustili jenom v příkaze, objeví se jenom číslo a konec: defer tOdpocet(); Ale nesmíme zapomenout, pokud tu podmínku splňuje, aka pokud ta hodnota je už rovna 0: }else{ Tak určitě se napíše zpráva START: GameTextForAll("~r~START", 3000, 3); A dokončíme tím, že zase přiřadáme proměnné bOdpocet hodnotu false, jinak by nám náš příkaz odpocet už další odpočet nepovolil: bOdpocet = false; } } Toť vše. Celý kód pro shlédnutí zde: Děkuji za pozornost a všem, kdo tento návod ohodnotí kladně a nebo repem. PS: mám v plánu pokračovat. 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ý
  10. Om3n

    návod AntiDeamx

    Tak vas vsechny zdravim. Nikde sem tu nenasel navod jak pouzit AntiDeamx tak vam ho sem dam. Nejdrive ale vysvetleni co to vubec je: Urcite uz ste slyseli o deamxu. Je to Lua script ktery zmeni format AMX do PWN. Neni to tak dokonale ze se z toho na hned zase udelat amx ale daji se z toho vycist napriklad zabezpeceni modu, potrebne scripty, skryte prikazy na zjisteni RCONu atd... Tudiz je dobre si do modu vlozit AntiDeamx. Script(Vlozite kamkoliv do modu): AntiDeAMX() { new a[][] = { "Unarmed (Fist)", "Brass K" }; #pragma unused a } Potom uz staci pouze vlozit Radek " AntiDeAMX(); " do nejakeho z hlavnich publicu. Napriklad: public OnGamemodeInit() { AntiDeAMX(); return 1; } pokud nekdo ziska vas mod (s antideamxem) a pokusi se z ne udelat zase pwn tak mu vyjede pouze toto: #include #include #include nic jineho. Pokud s tim budete mit nejake problemy tak staci napsat. ZDROJ: http://forum.sa-mp.com/" onclick="window.open(this.href);return false; 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ý
  11. Zdravím, mám v módu pěknou vychytávku a rozhodl jsem se s vámi o ni podělit o co jde? Transformace vozidla během pohybu k čemu to je? k ničemu k rychlé změně vozidla jak na to? pokud nemáme, nadefinujeme si DCMD #define dcmd(%1,%2,%3) if((strcmp((%3)[1],#%1,true,(%2))==0)&&((((%3)[(%2)+1]==0)&&(dcmd_%1(playerid,"")))||(((%3)[(%2)+1]==32)&&(dcmd_%1(playerid,(%3)[(%2)+2]))))) return 1 a vytvoříme proměnné s názvy aut new VehiclesModels[212][] = { {"Landstalker"}, {"Bravura"}, {"Buffalo"}, {"Linerunner"}, {"Perrenial"}, {"Sentinel"}, {"Dumper"}, {"Firetruck"}, {"Trashmaster"}, {"Stretch"}, {"Manana"}, {"Infernus"}, {"Voodoo"}, {"Pony"}, {"Mule"}, {"Cheetah"}, {"Ambulance"}, {"Leviathan"}, {"Moonbeam"}, {"Esperanto"}, {"Taxi"}, {"Washington"}, {"Bobcat"}, {"Mr Whoopee"}, {"BF Injection"}, {"Hunter"}, {"Premier"}, {"Enforcer"}, {"Securicar"}, {"Banshee"}, {"Predator"}, {"Bus"}, {"Rhino"}, {"Barracks"}, {"Hotknife"}, {"Trailer 1"}, {"Previon"}, {"Coach"}, {"Cabbie"}, {"Stallion"}, {"Rumpo"}, {"RC Bandit"}, {"Romero"}, {"Packer"}, {"Monster"}, {"Admiral"}, {"Squalo"}, {"Seasparrow"}, {"Pizzaboy"}, {"Tram"}, {"Trailer 2"}, {"Turismo"}, {"Speeder"}, {"Reefer"}, {"Tropic"}, {"Flatbed"}, {"Yankee"}, {"Caddy"}, {"Solair"}, {"Berkley's RC Van"}, {"Skimmer"}, {"PCJ-600"}, {"Faggio"}, {"Freeway"}, {"RC Baron"}, {"RC Raider"}, {"Glendale"}, {"Oceanic"}, {"Sanchez"}, {"Sparrow"}, {"Patriot"}, {"Quad"}, {"Coastguard"}, {"Dinghy"}, {"Hermes"}, {"Sabre"}, {"Rustler"}, {"ZR-350"}, {"Walton"}, {"Regina"}, {"Comet"}, {"BMX"}, {"Burrito"}, {"Camper"}, {"Marquis"}, {"Baggage"}, {"Dozer"}, {"Maverick"}, {"News Chopper"}, {"Rancher"}, {"FBI Rancher"}, {"Virgo"}, {"Greenwood"}, {"Jetmax"}, {"Hotring"}, {"Sandking"}, {"Blista Compact"}, {"Police Maverick"}, {"Boxville"}, {"Benson"}, {"Mesa"}, {"RC Goblin"}, {"Hotring Racer A"}, {"Hotring Racer B"}, {"Bloodring Banger"}, {"Rancher"}, {"Super GT"}, {"Elegant"}, {"Journey"}, {"Bike"}, {"Mountain Bike"}, {"Beagle"}, {"Cropdust"}, {"Stunt"}, {"Tanker"}, {"Roadtrain"}, {"Nebula"}, {"Majestic"}, {"Buccaneer"}, {"Shamal"}, {"Hydra"}, {"FCR-900"}, {"NRG-500"}, {"HPV1000"}, {"Cement Truck"}, {"Tow Truck"}, {"Fortune"}, {"Cadrona"}, {"FBI Truck"}, {"Willard"}, {"Forklift"}, {"Tractor"}, {"Combine"}, {"Feltzer"}, {"Remington"}, {"Slamvan"}, {"Blade"}, {"Freight"}, {"Streak"}, {"Vortex"}, {"Vincent"}, {"Bullet"}, {"Clover"}, {"Sadler"}, {"Firetruck LA"}, {"Hustler"}, {"Intruder"}, {"Primo"}, {"Cargobob"}, {"Tampa"}, {"Sunrise"}, {"Merit"}, {"Utility"}, {"Nevada"}, {"Yosemite"}, {"Windsor"}, {"Monster A"}, {"Monster B"}, {"Uranus"}, {"Jester"}, {"Sultan"}, {"Stratum"}, {"Elegy"}, {"Raindance"}, {"RC Tiger"}, {"Flash"}, {"Tahoma"}, {"Savanna"}, {"Bandito"}, {"Freight Flat"}, {"Streak Carriage"}, {"Kart"}, {"Mower"}, {"Duneride"}, {"Sweeper"}, {"Broadway"}, {"Tornado"}, {"AT-400"}, {"DFT-30"}, {"Huntley"}, {"Stafford"}, {"BF-400"}, {"Newsvan"}, {"Tug"}, {"Trailer 3"}, {"Emperor"}, {"Wayfarer"}, {"Euros"}, {"Hotdog"}, {"Club"}, {"Freight Carriage"}, {"Trailer 3"}, {"Andromada"}, {"Dodo"}, {"RC Cam"}, {"Launch"}, {"Police Car (LSPD)"}, {"Police Car (SFPD)"}, {"Police Car (LVPD)"}, {"Police Ranger"}, {"Picador"}, {"S.W.A.T. Van"}, {"Alpha"}, {"Phoenix"}, {"Glendale"}, {"Sadler"}, {"Luggage Trailer A"}, {"Luggage Trailer B"}, {"Stair Trailer"}, {"Boxville"}, {"Farm Plow"}, {"Utility Trailer"} }; vytvoříme příkaz a začneme do něho přidávat následující kód dcmd_transform(playerid,params[]) { return 1 } zjistíme v čem hráč sedí, pozici vozidla, úhly a rychlost new veh = GetPlayerVehicleID(playerid); //zjistíme ID vozidla new Float:X,Float:Y,Float:Z; //určíme proměnné pro pozici new Float:VX,Float:VY,Float:VZ; //určíme proměnné pro rychlost new Float:RX,Float:RY,Float:RZ; //určíme proměnné pro rotaci GetVehiclePos(veh,X,Y,Z); //zjistíme pozici GetVehicleVelocity(veh,VX,VY,VZ); //zjisítme rychlost GetVehicleRotation(veh, RX, RY, RZ); //zjistíme rotaci zajistíme params v příkazu (v tomto případě funguje na jméno vozidla) new car = -1; //zadáme proměnnou ID vozidla for(new i=0;i<212;i++) //cyklus (celkem 212 vozidel) { if(strfind(params,VehiclesModels[i],true) != -1) //pokud v hodnotě params najde název vozidla { car= 400 + i; //vozidla začínají ID 400 break; //stopneme cyklus } } if(car == -1) //pokud ID zůstalo -1 { car = strval(params); //proměnná se nastavila na hodnotu params (id vozidla) if(car < 400 || car > 611) return SendClientMessage(playerid,0xaaaaaaFF, "Špatné ID. ID Aut: 400-611"); //pokud není hodnota v rozmezí } vytvoříme hráčovi auto for(new i=0;i<MAX_PLAYERS_EX;i++) //cyklus { new iseat[MAX_PLAYERS_EX]; //nastavíme proměnnou pro sedadlo if(IsPlayerInVehicle(i,veh)) //pokud je hráč v autě { iseat[i] = GetPlayerVehicleSeat(i); //zjistíme kdo kde sedí RemovePlayerFromVehicle(i); //vyhodíme hráče z auta DestroyVehicle(veh); //zničíme auto new kara = CreateVehicle(car,X,Y,Z,-RX,1,1,9999); //vytvoříme nové auto (námi zadané) PutPlayerInVehicle(i, kara, iseat[i]); //posadíme všechny hráče na jejich místa //následující 4 řádky jsem přidal jelikož neznámou záhadou řádek výše nefungoval a prazatím jsem ho nevyřešil, kdyby se to někomu povedlo, dejte vědět, díky if(iseat[i] == 0) PutPlayerInVehicle(i, kara, 0); if(iseat[i] == 1) PutPlayerInVehicle(i, kara, 1); if(iseat[i] == 2) PutPlayerInVehicle(i, kara, 2); if(iseat[i] == 3) PutPlayerInVehicle(i, kara, 3); SetVehicleVelocity(kara,VX,VY,VZ); //nastavíme rychlost auta } } Přidáme příkaz do OnPlayerCommand... A to je celé děkuji za pozornost, třeba se to někomu i hodí Pokud někomu nebude fungovat > špatně kopíroval > zkuste zapojit mozek a trošku "programovat" mě funguje nádherně a při transformaci auto sebou ani necukne
  12. Zdravíčko... Dnes bych chtěl přispět do seznamu tutoriálů ohledně PHP a přesněji bych se chtěl věnovat SAMPQuery aneb Jak si vypsat data ze serveru. Dnes si zpracujeme status serveru. Úvod -> Máme tu pár bodů co musíme splnit považuji je za hotové či již připravené a to:. - Webový server (funkční) - Editor - Základní dovednosti v PHP Pokud nemáte základní dovednosti je tu mnoho tutoriálů, které Vám to můžou vysvětlit z toho důvodu já jsem již tyto tutoriály nepsal. Požadované soubory -> Jelikož SAMPQuery není přímo v PHP includováno tak nám jeden hodný programátor udělal zjednodušenou formu zápisu díky obalení všech funkcí do přijatelnějšího tvaru. Tomu se říká API. Stáhneme si tedy tento balík. PHP-SA-MP-API-1.1.zip Pokud zde download nefunguje odkazuji na téma na fóru forum.sa-mp.com : http://forum.sa-mp.com/member.php?u=115444 Po extrahování tohoto balíku se nám zobrazí složka: Vidíme, že tu máme dva soubory s příponou .class a také přidané s příponou Example. Soubory s části názvu Example jsou v podstatě ukázky použití v praxi, proto si jeden takový otevřeme. A to SampQueryExample.php. Soubor vypadá asi nějak takto. Vidíme tam includování souboru SampQuery.class.php, můžeme vidět později initializaci třídy SampQuery s parametry IP a portu. Vlastní třída pro vytváření statusu -> Vytvoříme si vlastní třídy. Pokud někdo zase neví odkazuji na další návody tu na fóru nebo někde jinde popřípadě dopíši později. Proč vlastní třídu? Kvůli přehlednosti a funkčnosti a nejspíše i bezpečnosti. To už záleží, jak se nám povede Jak to vypadá ještě neupraveně: A co to dělá? Zapnutý server: Vypíše základní data. Vypnutý server: Takže základ by nám již fungoval. Popis funkcí: -> Vytvoření třídy a vytvoření pomocných proměnných aby byli dostupné po celé třídě. -> private $query z toho důvodu, protože nechceme aby se k naší instanci dostal i někdo jiný krom nás. (Jednoduše řečeno) -> Funkce __construct je jedna z magických metod PHP, volá se vždy při initializaci třídy. -> V této funkci nastavujeme naše proměnné ze začátku. -> require_once načte obsah soubory SampQuery.class.php PS: Já ho mám ve složce libs -> Funkce ini nám inicializuje třídu popřípadě vyhodí error pokud ji již máme "načtenou". -> Dále se zkouší připojit na server abychom zjistili či funguje. -> Funkce vrací hodnotu true / false -> Funkce render bude využita pro vykreslení našich dat v šabloně. Zjištuje také podmínkou funkce ini jestli je server funkční pokud ne vypisuje zprávu. var_dump je zde pouze pro testování výstupu. Použití ve vašem webu: -> require_once načteme náš soubor se třídou. -> vytvoříme instanci třídy s pomocí new a tu uložíme do proměnné $banner a přidáme do parametrů i IP a port -> Podotýkám u PORTU jsme nemuseli použít "" aneb je to celé číslo. Jednoduché, že? Závěrem: Doufám, že Vám tento tutoriál byl k něčemu v dalším dílu tohoto se podíváme na lepší vykreslování přidáme více obrázků a možnost přepínat mezi nimi. Zdroják: www.zip
  13. if(!strcmp(cmdtext, "/s", true)) { if(IsPlayerInAnyVehicle(playerid)) { new vehicleid = GetPlayerVehicleID(playerid); GetVehiclePos(vehicleid, posX[playerid], posY[playerid], posZ[playerid]); GetVehicleZAngle(vehicleid, posA[playerid]); } else { GetPlayerPos(playerid, posX[playerid], posY[playerid], posZ[playerid]); GetPlayerFacingAngle(playerid, posA[playerid]); } Interior[playerid] = GetPlayerInterior(playerid); VirtualWorld[playerid] = GetPlayerVirtualWorld(playerid); SendClientMessage(playerid, -1, "{FFFFFF}[{3399FF}Aw{FFFFFF}]{3399FF}:{FFFFFF} You have saved your position"); SendClientMessage(playerid, -1, "{FFFFFF}[{3399FF}Aw{FFFFFF}]{3399FF}:{FFFFFF} Type {3399FF}/r {FFFFFF}or press {3399FF}Y {FFFFFF}to load your position"); Saved[playerid] = 1; return 1; } if(!strcmp(cmdtext, "/r", true)) { if(Saved[playerid] == 1) { if(IsPlayerInAnyVehicle(playerid)) { new vehicleid = GetPlayerVehicleID(playerid); SetVehiclePos(vehicleid, posX[playerid], posY[playerid], posZ[playerid]); SetVehicleZAngle(vehicleid, posA[playerid]); LinkVehicleToInterior(vehicleid, Interior[playerid]); SetVehicleVirtualWorld(vehicleid, VirtualWorld[playerid]); } else { SetPlayerPos(playerid, posX[playerid], posY[playerid], posZ[playerid]); SetPlayerFacingAngle(playerid, posA[playerid]); SetPlayerInterior(playerid, Interior[playerid]); SetPlayerVirtualWorld(playerid, VirtualWorld[playerid]); } SendClientMessage(playerid, -1, "{FFFFFF}[{3399FF}Aw{FFFFFF}]{3399FF}:{FFFFFF} You have loaded your position"); } else { SendClientMessage(playerid, -1, "{FFFFFF}[{FF0000}Aw{FFFFFF}]{FF0000}: {FFFFFF} You cant do that since you have not saved any positions yet"); SendClientMessage(playerid, -1, "{FFFFFF}[{3399FF}Aw{FFFFFF}]{3399FF}:{FFFFFF} Type {3399FF}/s {FFFFFF}to save a position"); } return 1; } ahoj potreboval bych pomoct jak muzu udelat tak abych mohl tlacitko ''Y'' pouzivat jako to /r jakoze vratit na ulozenou pozici kdyz jsem to zkousel if(newkeys == KEY_YES) { vlozil jsem funkci /r } tak mi to nahazelo hodne chyb :/
  14. Viděl jsem tu případy kdy někteří vytváří pro každou zprávu textdraw... Ale na co? Stačí vám jeden textdraw na kolik zpráv chcete. Ukážu vám teď jak na to v klasickém pawnu bez použití YSI a podobně to si potom každý může udělat sám. 1. Vytvoříme si textdraw. ( já si udělal klasický text s použitím fontu 2 ) textdraw = TextDrawCreate(188.000000, 384.000000, "~n~"); TextDrawBackgroundColor(textdraw, 255); TextDrawFont(textdraw, 2); TextDrawLetterSize(textdraw, 0.270000, 1.000000); TextDrawColor(textdraw, -1); TextDrawSetOutline(textdraw, 1); TextDrawSetProportional(textdraw, 1); 2. Otevřeme si .pwn 3. Někam nahoru vložíme: new Text:Textdraw[MAX_PLAYERS]; 4. Do OnGameModeInit vložíme náš textdraw tímto stylem: for(new i = 0; i < MAX_PLAYERS; i++){ Textdraw[i] = TextDrawCreate(188.000000, 384.000000, "~n~"); TextDrawBackgroundColor(Textdraw[i], 255); TextDrawFont(Textdraw[i], 2); TextDrawLetterSize(Textdraw[i], 0.270000, 1.000000); TextDrawColor(Textdraw[i], -1); TextDrawSetOutline(Textdraw[i], 1); TextDrawSetProportional(Textdraw[i], 1); } 5. Vytvoříme si stock pro zprávu. stock InfoMessage(playerid, time, text[]){ // time nastavíte sekundy například 2 a samozřejmě "text" TextDrawHideForPlayer(playerid, Textdraw[playerid]); // schová v případě zprávu která už je vytvořená TextDrawSetString(Textdraw[playerid], text); // nastaví text zprávy TextDrawShowForPlayer(playerid, Textdraw[playerid]); // zobrazí zprávu SetTimerEx("InfoMessageHide", time*1000, false, "i", playerid); // skryje informační zprávu return true; } 6. Vytvoříme si public pro schování zprávy. forward InfoMessageHide(playerid); public InfoMessageHide(playerid){ return TextDrawHideForPlayer(playerid,Textdraw[playerid]); } A máme hotovo... Zprávy potom vytváříte takto: InfoMessage(playerid, 3, "zprava"); // protože se jedná o textdraw nepište do zprávy háčky, čárky a podobně... 3 je počet sekund To je vše...
  15. Vertikální a horizontální vycentrování Určitě jste někdy potřebovali umístit nějaký prvek přesně doprostřed stránky. Tady máte mini TUT jak na to: Ná stránce máme například tento DIV: <div id="content"> </div> Pokud ho tedy chceme umístit vertikálně i horizontálně doprostřed stránky , stačí použít tento krátký CSS kód: #content { position: absolute; /*Dovolí nám posunout prvek z původního místa*/ top: 50%; /*Posuneme prvek o 50% dolů od horní hrany*/ left: 50%; /*Posuneme prvek o 50% doprava od levé hrany*/ width: 100px; /*Šířka*/ height: 200px; /*Výška*/ /*Tady posuneme obrázek ještě o polovinu šířky doleva a o polovinu výšky nahoru*/ margin-top: -100px; margin-left: -50px; /*Teď je prvek přesně uprostřed stránky. Dále si můžete dopsat ještě další vlastnosti prvku*/ background-color:red; } Doufám že vám tento Mini TUT pomohl. Případné dotazy pište do tohoto topicu .
  16. #1 Úvod Nová série poučných slov o skriptování v PAWN Intro Po posledních zkušenostech zde na fóru, a nebo i jiných nováčků, kteří se mě ptali na pomoc, jsem byl velice zděšen, jak chápou pawno. (Po první větě můžu naokraj říct, že je psaní textu delšího rázu za trest, zvláště pomocí debilních nefungujících BBcodů. Ale to bylo z jiného soudku.) Zvýrazněné slova jsou velmi důležitá pro pochopení. Po delším pozorování komunity jsem uznal, že snad 95% lidí nemá ponětí o tom, co dělá. První příklad Jak jsem již řekl v předešlé větě, uvedu příklad. #define dcmd(%1,%2,%3) if ((strcmp((%3)[1], #%1, true, (%2)) == 0) && ((((%3)[(%2) + 1] == 0) && (dcmd_%1(playerid, "")))||(((%3)[(%2) + 1] == 32) && (dcmd_%1(playerid, (%3)[(%2) + 2]))))) return 1 Většina z vás by řekla, že je to potřebný kód, bez kterého nepůjdou příkazy, nebo to je pro vás strašně složitá definice nějakých sraček a nebo by to prostě házelo errory Tohle není vysvětlení toho, proč to tam je. Většina malých mozečků nepochopí reálné vysvětlení, ale nehodlám rozebírat psychickou vyspělost jedince. Ten kdo to svým způsobem nepochopí, nemá na to, aby se tomuto dále věnoval. Ano, myslím tím děti, co toto nedělají ze zájmu a přiučení něčemu novému, ale toho, aby si zajezdili autem ve hře. V podstatě se jedná o funkci, která "přesune příkaz" do nové funkce po vyvoláni callbacku OnPlayerCommandText. Umožňuje nám rychlý zápis příkazů bez počátečního lomítka / a do druhého parametru funkce dcmd_prikaz pošle obsah za příkazem a vrátí hodnotu 1, protože to callback informuje o tom, že příkaz byl zpracován. Důvod, proč vám to vykládám na tomto příkladu, je, aby jste pochopili mechaniku obecně a tím všechno. Třetí věc a také důvod, proč jsem založil toto téma je že nemá smysl zakládat hloupé tutorialy na to, jak něco udělat. Většina z nich, bez urážky, je jako "od robota pro robota"; vysvětlení nedostačující a jak jsem již zmínil - témata typu: "bez toho by vám to nešlo, tak si to ku*va zkopírujte". A to nepočítám optimalizaci, způsob a tak podobně. Rozhodl jsem se založit novou sérii návodů pro chápání samotné mechaniky a logiky, protože je to jen o fantazii, představivosti a logice. Podle toho všeho si můžete vytvořit naprosto vše špičkové kvality. Osobně jsem měl podobné začátky, ale čím dřív se zlozvyk eliminuje, tím lépe. Nekonečným kopírováním kódu jsem ztratil spoustu let praxe. Díky této zkušenosti může pawn sloužit i jako odrazový můstek pro daleko složitější jazyky. Doufám, že toto téma bude vnímáno jen přínosně a kladně. Prozatím sbohem, I'll be back. ]mxco[
  17. Dobry den, sere ma to že ako vložim objekty do MTA tak tu mate .. ) ak tam mam chybu opravim tu je navod ako vložit objekty nove do MTA ! 1. Otvoriem si MTa kde ho mate cele ! 2. Pojdeme po složkach otvarat Server -> Mods -> Deathmatch -> resources -> [editor] a rozbalime tam .. .rar ! nevložime do tych rar LEN ROZBLAIME zložky do [editor] 3. Spustime MTa a mame to Downlad v Rar ! http://uloz.to/xdp1w6Yt/mta-ra
  18. TextDraw namísto GameTextForAll Úvod: Tento návod je zaměřen na TextDrawy a jejich využití namísto GameTextForAll jelikož když máte logo serveru přes TextDraw a použijete GameTextForAll / ForPlayer tak text draw zmizí. Proto jsem se rozhodl udělat provás tento malý TuT. Co potřebujeme(?): TextDraw Editor by Zamaroht(http://samp-scripts.com/post/11314/[0.3x_RC1+]_Zamaroht_TextDraw_Editor_with_Model_Previews/adri1/filterscript/other) Vysvětlení: Budeme pracovat s dcmd které nám usnadní v tomto práci, také budeme pracovat se stringama. Zapotřebí je testovací server aby jste mohli vytvořit grafickou předlohu. Ve hře si vytvořímte grafickou předlohu kterou pak uložíte. Jděte do scriptfiles a otevřete textový dokument (s názvem vašeho projektu) a tam máte vše co potřebujete (zkopírujete kód který vypadá nějak takto: Textdraw0 = TextDrawCreate(410.000000, 200.000000, "Tvůj text"); TextDrawBackgroundColor(Textdraw0, 255);TextDrawFont(Textdraw0, 1); TextDrawLetterSize(Textdraw0, 0.500000, 1.000000);TextDrawColor(Textdraw0, -2139062017); TextDrawSetOutline(Textdraw0, 0);TextDrawSetProportional(Textdraw0, 1); TextDrawSetShadow(Textdraw0, 1);TextDrawUseBox(Textdraw0, 1); TextDrawBoxColor(Textdraw0, -2139062017); TextDrawTextSize(Textdraw0, 490.000000, 10.000000); Nahoře do GM / FS dáme #define Textdraw0 (nebo jaké číslo vám to tam hodí) aby nám to fungovalo dáme nahoře do mádu definici dcmd. #define dcmd(%1,%2,%3) if ((strcmp((%3)[1], #%1, true, (%2)) == 0) && ((((%3)[(%2) + 1] == 0) && (dcmd_%1(playerid, "")))||(((%3)[(%2) + 1] == 32) && (dcmd_%1(playerid, (%3)[(%2) + 2]))))) return 1 Příklad: A teď se dostáváme k samotném tvoření "dannu". do OnGameModeInit() dáme celý kód který vám to vyhodí do scripfiles. (ten kód který je nahoře ale VÁŠ kód). Pak dáte Úplně dolů dáme dcmd ve kterém bude náš příkaz a za ním (playerid,params[]) dcmd_dann(playerid,params[]) Aby nám neházelo upozornění dáme pod toto { #pragma unused playerid Teď jsme se dostali k samotnému nastavení textu. TextDrawSetString(Textdraw0,params); Pokud máte Textdraw5 nebo jiné číslo tak ho musíte udělat i zde! Teď dáme ještě že po zadání příkazu se tento TextDraw ukáže všem hráčům. TextDrawShowForAll(Textdraw0); return 1; } Teď jdeme do OnPlayerCommandText a dáme sem definici pro naše dcmd. zadáme někam do toho publicu: dcmd(dann,4,cmdtext); dcmd(dann = příkaz 4 = počet písmen na rozeznání příkazu cmdtext = text v příkazu Tipy: Na serveru když zadáte /dann [TEXT] tak pro změnu barev dejte ~r~ (červená) podle této tabulky se podívejte na barvy - ~n~ = New line ~r~ = Red ~g~ = Green ~b~ = Blue ~w~ = White ~y~ = Yellow ~p~ = Purple ~l~ = Black ~h~ = Turns text lighter ~u~ = Grey up arrow ~d~ = Grey down arrow ~~ = Grey right arrow ( http://weedarr.wikidot.com/game-text#toc8 ) Závěr: Toto by bylo z tohoto TuT vše, pokud máte nějaké návrhy na rychlejší úpravu nebo něco takového tak uričtě pište Pokud by vám to nefungovalo pište zprávu. ( )
  19. Menší tutoriál pro začátečníky. Nejdřív je třeba dát si do módu někam třeba úplně dolu stock který zjistí jméno hráče podle id: stock PlayerName(playerid) { new pname[24]; GetPlayerName(playerid,pname,24); return pname; } Stock se používá stylem PlayerName(playerid) můžete ho použít ne jen v těchto zprávách ale v celém módě určitě lepší jak u každého textu používat GetPlayerName. Teď k samotným zprávám jako první si uděláme zprávu při připojení. Stačí do OnPlayerConnect vložit: new string[128]; // string[128] číslice 128 znamenají délku textu kterou si lze nastavit tímto způsobem. format(string, sizeof(string), "Hráč %s se připojil na server.", PlayerName(playerid)); SendClientMessageToAll(0xffffffaa, string); // SendClientMessageToAll (zpráva pro všechny přítomné hráče na serveru), 0xffffffaa (barva kterou lze jednoduše změnit např.: 0xff0000aa = ČERVENÁ) Mělo by to vypadat takto: public OnPlayerConnect(playerid) { new string[128]; format(string, sizeof(string), "Hráč %s se připojil na server.", PlayerName(playerid)); SendClientMessageToAll(0xffffffaa, string); return 1; } Dále si uděláme odpojení na 3 způsoby a to pád hry, odpojení a vyhození ze serveru: Stačí do OnPlayerDisconnect vložit: new string[128]; // string[128] číslice 128 znamenají délku textu kterou si lze nastavit tímto způsobem. switch(reason) { case 0: format(string, sizeof(string), "Hráči %s spadla hra.", PlayerName(playerid)); case 1: format(string, sizeof(string), "Hráč %s se odpojil ze serveru.", PlayerName(playerid)); case 2: format(string, sizeof(string), "Hráč %s byl vyhozen ze serveru.", PlayerName(playerid)); } SendClientMessageToAll(0xffffffaa, string); // SendClientMessageToAll (zpráva pro všechny přítomné hráče na serveru), 0xffffffaa (barva kterou lze jednoduše změnit např.: 0xff0000aa = ČERVENÁ) Mělo by to vypadat takto: public OnPlayerDisconnect(playerid, reason) { new string[128]; switch(reason) { case 0: format(string, sizeof(string), "Hráči %s spadla hra.", PlayerName(playerid)); case 1: format(string, sizeof(string), "Hráč %s se odpojil ze serveru.", PlayerName(playerid)); case 2: format(string, sizeof(string), "Hráč %s byl vyhozen ze serveru.", PlayerName(playerid)); } SendClientMessageToAll(0xffffffaa, string); return 1; } A prakticky to je vše úpravy si už můžete dělat každý sám. (pro hatery - i tohle přijde vhod pokud to už znáte nebo to nevyužijete nehejtujte to)
  20. Mikoo

    pomoc Navod

    Čaute nemohol by tu spraviť niekdo apravit tutorial na vytvaranie domov ? ?
  21. Šablona pro psaní návodů Veškeré nové návody budou odpovídat této šabloně. Návody se následně budou schvalovat a budou podle zaměření přesunuty do příslušné sekce. Své návody můžete zakládat v podsekci "Nové návody". Vyhrazujeme si právo návody upravovat, aby byl sjednocen styl a podobně. Každý návod bude mít vystihující název, prefix tématu NÁVOD a obtížnost od 1 (nejlehčí) do 5 (nejtěžší) za názvem v hranatých závorkách. Příklady vyhovujících titulků: Proměnná [*] Práce s bity [*****] Časovače [**] Samotné téma s návodem musí obsahovat obtížnost od 1 do 5 (musí se shodovat s obtížností v názvu) a osnovu; každý bod osnovy bude mít vlastní nadpis. Příklad vyhovujícího návodu: Proměnná Obtížnost: 1/5 Osnova/obsah: 1. Úvod 2. Co je to proměnná 3. Příklady proměnných 4. Závěr 1. Úvod Tento návod by se měl týkat proměnných, ale místo toho slouží jako šablona pro další návody. 2. Co je to proměnná Proměnná je pojmenované místo v paměti, do kterého ukládáme různé hodnoty (celá čísla, desetinná čísla atd.), se kterými pak dále pracujeme. Super vysvětlení, že? 3. Příklady proměnných Zde jsou nějaké příklady proměnných: new cislo = 5; //proměnná s celým číslem new Float:desetinne = 3.14; //proměnná s desetinným číslem new bool:logicka = true; //proměnná s logickou hodnotou 4. Závěr Děkuji za přečtení mého návodu, snad vám pomohl ve vaší cestě k tomu stát se dobrým pawnerem. Případné otázky směřujte do příspěvků. Tento návod by neměl problém se schválením (co se struktury týče). Dodržujte strukturu návodu! Nedodržení šablony může vést k odstranění návodu!
  22. Zdravim Chcem ukazat návod nováčikom ako si môžu založiť TDM mod Tento návod som preložil zo sa-mp.com pre ľudí ktorý si chcú zakladať TDM mód a nemaju šajnu o tom ako to zakladat Je to veľmi lahké Zaklad Modu: #include <a_samp> Musí tam byt Team a farby #define Policia 1 #define Terrorista 2 #define PoliceCOLOR 0x00FF00AA #define TerrorCOLOR 0xFF00FFAA #define Farba_Cervena 0xFF0011FF Nemožte zabudnut na premenu na Body a Peniaze enum pInfo //pInfo Premena { pBody, pPeniaze, } Newy: new PlayerData[MAX_PLAYERS][pInfo]; new Team[MAX_PLAYERS]; new prachy[MAX_PLAYERS]; V publicu OnGameModeInit musite mat nazov Modu a obleky SetGameModeText("TDM"); // Nazov Modu AddPlayerClass(265,2431.3733,-1679.4271,13.7673,0,24,100,0,0,0,0); // Oblek Policajta AddPlayerClass(28,2167.8926,-1670.0753,15.0805,0,24,100,0,0,0,0); // Oblek Terroristu Do OnPlayerRequestClass(playerid, classid) dáte toto aby ste si mohli vyberat teamy switch(classid) { case 0: // Policajt { Team[playerid] = Policia; // Vybrat si Team za Policajta { SetPlayerColor(playerid,PoliceCOLOR); //Farba Policajta } } case 1: // Terrorista { Team[playerid] = Terrorista; // Vybrat si Team za Terroristu { SetPlayerColor(playerid, TerrorCOLOR); //Farba Terroristu } } } } Do public OnPlayerDeath(playerid, killerid, reason) dáte toto aby ste dostavaly Body a Penaze a tak if(Team[killerid] == Team[playerid]) { SendClientMessage(killerid,Farba_Cervena, "Zabil si spoluhrača odratame ti $1000 a 4 Body."); //Sprava o Zabití PlayerData[killerid][pPeniaze] -= 1000; SetPlayerMoney(killerid, PlayerData[killerid][pPeniaze]); SetPlayerScore(killerid, PlayerData[killerid][pBody] - 4); } else if(Team[killerid] != Team[playerid]) { PlayerData[playerid][pPeniaze] -=100; PlayerData[killerid][pPeniaze] +=100; SetPlayerMoney(playerid, PlayerData[playerid][pPeniaze]); SetPlayerMoney(killerid, PlayerData[killerid][pPeniaze]); SetPlayerScore(playerid, PlayerData[playerid][pBody]-1); SetPlayerScore(killerid, PlayerData[killerid][pBody]+1); } SendDeathMessage(killerid, playerid, reason); return 1; } Potom pridate do GM alebo do FS Stock lebo inak vam bude ukazovat errory: Stock stock SetPlayerMoney(playerid,moneyafter) //Stock { prachy[playerid]=moneyafter; GivePlayerMoney(playerid,moneyafter-GetPlayerMoney(playerid)); }
  23. Zdravím, normálně sem nic nedávám ani tu nepíšu žádné tutoriály ale našel jsem v počítači něco z dávnější doby a myslím si že se to někomu i hodí. Jak to použít normálně v módu? Do public OnPlayerKeyStateChange(playerid, newkeys, oldkeys) vložíme: if(newkeys & KEY_FIRE && ProhWeap(playerid) && !IsPlayerAdmin(playerid)) { ResetPlayerWeapons(playerid); return 1; } Následně to funguje tak že pokud vystřelíte s té určité zbraně tak vám to resetuje kompletně zbraně no můžete si tam dát místo ResetPlayerWeapons(playerid); třeba funkci pro ban např: BanEx(playerid,"Weapon Hack"); a nějakou zprávu. Také v případě že se jedná o rcon admina jako o vás tak to bude ignorovat použití zbraně kterou jste zakázali. Celé by to mělo vypadat takto: public OnPlayerKeyStateChange(playerid, newkeys, oldkeys) { if(newkeys & KEY_FIRE && ProhWeap(playerid) && !IsPlayerAdmin(playerid)) { ResetPlayerWeapons(playerid); return 1; } return 0; } Následně si vložíte do módu stock který zjistí jaké ty zbraně jsou zakázané: stock ProhWeap(playerid) { new wp = GetPlayerWeapon(playerid); if(wp = ID ZBRANE || wp = ID ZBRANE || wp = ID ZBRANE || wp = ID ZBRANE) { return true; } return false; } Místo ID ZBRANĚ si dáte id té zbraně kterou chcete zakázat, id zbraní najdete na google, wiki a podobně. Vždy když chce přidat zbraň napíšete || wp = ID ZBRANE tak aby na konci kde máte ) nebylo || každopádně pokud chcete ubrat uděláte to samé ale opačně. Myslím si že netřeba to moc vysvětlovat ale i pro nějaké "lidi": new wp = GetPlayerWeapon(playerid); toto zjišťuje o jakou zbraň se jedná. A nevím co více k tomu říct ----------------------------------------------------------------------------------------------- Ještě vám sem dám co jsem zkoušel udělat já po pravdě nevím jestli je to funkční/není protože jsem to nezkoušel. Je to celkem staré a udělané na způsob includu. Mělo by se ukládat do PW.txt ukládat Zbran1 =, Zbran2 = atd... kde si následně napíšete ID ZBRANĚ: Vytvoříte si například includ: WH.pwn vložíte ho do includu ve vašem pawnu a do něj dáte: new PWS[11]; forward PW_Load(); forward PW_OnPlayerKeyStateChange(playerid, newkeys, oldkeys); public PW_Load() { new soubor[50]; format(soubor, sizeof(soubor), "PW.txt"); PWS[0] = dini_Get(soubor, "Zbran1"); PWS[1] = dini_Get(soubor, "Zbran2"); PWS[2] = dini_Get(soubor, "Zbran3"); PWS[3] = dini_Get(soubor, "Zbran4"); PWS[4] = dini_Get(soubor, "Zbran5"); PWS[5] = dini_Get(soubor, "Zbran6"); PWS[6] = dini_Get(soubor, "Zbran7"); PWS[7] = dini_Get(soubor, "Zbran8"); PWS[8] = dini_Get(soubor, "Zbran9"); PWS[9] = dini_Get(soubor, "Zbran10"); PWS[10] = dini_Get(soubor, "Zbran11"); return true; } public PW_OnPlayerKeyStateChange(playerid, newkeys, oldkeys) { if(newkeys & KEY_FIRE && ProhWeap(playerid) && !IsPlayerAdmin(playerid)) { ResetPlayerWeapons(playerid); return 1; } return 0; } stock ProhWeap(playerid) { new wp = GetPlayerWeapon(playerid); PW_Load(); if(wp = PWS[0] || wp = PWS[1] || wp = PWS[2] || wp = PWS[3] || wp = PWS[4] || wp = PWS[5] || wp = PWS[6] || wp = PWS[7] || wp = PWS[8] || wp = PWS[9] || wp = PWS[10]) { return true; } return false; } Následně ve svém módu úplně nahoru dáte #include <WH.pwn> A do publicu OnPlayerKeyStateChange dáte: PW_OnPlayerKeyStateChange(playerid, newkeys, oldkeys); Také si nezapomeňte do scriptfiles vytvořit soubor: PW.txt Prakticky po případě si to můžete upravit/opravit a využít jak chcete... Mě to vůbec nezajímá a ani to nehodlám využívat. Díky. A nepište hodnocení dokud si to nezkusíte protože si nejsem jistý s tím ukládáním už od pohledu Ale opravovat vám to nebudu :d Asi by bylo lepší místo Zbran1 Zbran2 atd... ukládat -1 Informační návod - 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ý
  24. Zdravim. Nedávno jsem si všimnul jednoho FS jmenem Audio Reklama a byl tam komentar ze by nekdo uz mohl vymyslet system aby se nemusel nahrávat zvuk a ten potom pouštět. Takže sem trochu projel jiné zdroje a zde máte řešení: stock TTS(playerid, text[], lang[]) // Text-To-Speak(ID hráče, text který chceme přehrát, jazyk) { new str[128]; // vytvoření nového stringu format(str, sizeof str, "translate.google.com/translate_tts?tl=%s&q=%s", lang, text); // format stringu PlayAudioStreamForPlayer(playerid, str); // prehrani zvukove stopy return 1; } Příklad použití: TTS(playerid, "Vítejte na nejkrutopřísnějším serveru na světě.", "cs"); Podporované jazyky: všechny které má google nadabované ale doporučuji používat: cs - český jazyk sk - slovenský jazyk en - anglický jazyk (tento jazyk má asi nejlepší dabing) A předem upozorňuji že je to vše pouze ženský hlas. Doufám že se to někomu bude hodit 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ý
  25. Zdravím nedávno mi psal Tango stím že by rád sesmolil návod týkající se pawn a různých fíglů.. Já jsem se rozhodl tento návod pojmou spíše směrem k editoru než k samotnému jazyku. Tudíž Tangovi nechávám prostor. Fígly: Sprovoznění parametrů kompilace: - Stačí si ve složce obsahující pawncc.exe pawno.exe apod vytvořit soubor pawn.cfg Ignorace konkrétní chyby: - Do výše zmíněného souboru si vepište příkaz -w[error_number] Já konkrétně jsem si zakázal chybu týkající se nepoužití proměnné ( Symbol is never used ) Tudíž můj kód vypadá takto: -w203 Více složek s includy: - Pokud tvoříte více projektů a každý projekt má své includy tak je jednou z možností includy rozházet do složek např: include/[Projekt] include/[Projekt2] Ale i na toto existuje krásná funkce a to přímo na konkrétním příkladě: -i=C:\Pawno\projects\Virtual_City\include -i=[CESTA] Debug level 3 - Běžně to nejspíš nevyužijete ale pokud vás zajímá plný debug včetně velikosti hlavičky a podobných kravin tak stačí do souboru přidat -d3 Inicializace hodnot - Hodnoty v tomto souboru lze inicializovat tím že ji napíšete přímo za písmeno označující parametr. -d3 Ale pro přehlednost například lze hodnoty inicializovat také -d=3 -d:3 S dalšími fígly přijdu až přijdu na to co přesně dělají tak abych Vám to zde mohl přetlumočit Informační návod - 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ý
×
×
  • Create New...