Jump to content

Search the Community

Showing results for tags 'pawn'.

  • 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. Pawno soutěž Informace Zdravím právě začíná období soutěží v jazyku pawno na tomto forum. Teď si řeknem něco o tomto. Pravidla 1)Script musí být vytvořen vámi nesmí bejt okopírován či stažen. 2)Tvůrci si nesmí mezi sebou posílat scripty. 3)Script musí bejt vytvořen podle danné předlohy 4)Jakékoliv podvádění bude potrestáno. Průběh Soutěž bude probíhat následovně. Každý týden proběhne 1 kolo soutěže,celkem bude 5 kol + 1 finální. Z každého kola může bejt pouze 1 postupující který se zařadí mezi 5 bojujících o finální odměnu. V každém kole bude jiné zadání náhodně vybráno které tvůrci budou muset splnit. Poté co bude splněno mi pošlou do Soukromé zprávy "CODE" který vytvořili a já a porota vyhodnotí tento script. Hodnocení je jednoduché 0/10 osoba která bude mejt nejvíce bodu postupuje do finále. Je více než samozřejmé že prvních 5 kol bude lehkých a finální bude těžší. Osoba která vyhrála jedno z prvních 5 kol se nemůže učastit v dalším kole až ve finálním. První kolo začne 7.5.2016. Postupující prvního kola bude zveřejněn 13.5.2016. Zadání Prvních 5 kol (Vždy bude vybráno 1 téma které se bude muset splnit) (Větší popis najdete až v topicu na danné kolo) -[FS]Ukládání/Načtení server stats (Počet připojení celkem,Nejvíce uživatelů v 1 moment na serveru) -[FS]Carmenu přes TEXTDraw. -[FS]Admin systém -[FS]Ukládání/Načtení zbraňí a pozice hráče. -[FS]Zápis do souboru počet připojení z IP hráče a zobrazení ve hře. (Z této IP jsi byl připojen po [X]) Finální kolo (Vybere se 1 náhodné téma ztěchto o které budou uživatelé bojovat) -[FS]House systém (Tvorba domů,Nákup,Prodej,Vstup,Odchod,Změna názvu domu) -[FS]Player vehicle systém (Ukládání zakoupených vozidel hráče po odpojení a po připojení načtení vozidla na pozici + Obchod snimi) -[FS]Systém nemovtostí (Nákup nemovitosti,Prodej,Vydělávání nemovitosti i přesto že je majitel Offline) Hodnocení Hodnotit se bude -Kreativita -Originalita -Jednoduchost v pawn -Výběr includu pro rychlost scriptu -Funkčnost -Kvalita ve hře -Ovladatelnost Odměny Postupující v prvních pěti kolech 1)Reputace + 15 2)Postupování do finále 3)Zveřejnění jeho scriptu pro veřejnost na tomto forum Výherce finále 1)Reputace + 50 2)Flash disk 32 GB 3)Přenosná nabíječka pro smartphone[Powerbank] 4)Označení na forum "Pawn mistr".(Tutiž kde já mám nápis s modrým pozadím "Moderátor" vy tam budete mejt "Pawn mistr") Postupující N/A Credits [Text + Nápady + Financování odměn]Polis_Polismanovic [Návrh na odměnu č.4 pro výherce ve finále] Lukasz Podpořit můžete kliknutím na tlačítko vmém podpise "Donate".
  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. SCYDO COREJOBS 0.1 Zdravím. Chtěl bych vám prezentovat script, který mě napadl vytvořit na základně celkem takové "drsnější" kritiky jednoho z uživatelů, který tady publikoval podobný include. Asi všichni víme, o koho a o co se jedná, ale i tak snad nebude vadit, když sem přidám pár výňatků: Určitě si teď někteří budou myslet, že jsem udělal další podobný include a zmiňuji toho dotyčného tady s úmyslem ho nějak poškodit, zesměšnit a já nevím co ještě... I když je to těžko uvěřitelné, opravdu o to nemám zájem. Spíše mi dopomohl k nápadu pro další mojí práci a navíc, když jsem si pročítal ty jisté komentáře, tak mě napadly další věci, které se brzo dozvíte. O SCJ Nejspíše znáte takové ty klišé JobSystémy. Všechno máte v jedné funkci, takže přidáte jen do patřičného callbacku, po případě přidáte ještě další callbacky do patřičných callbacků a tím to končí. Pak už jen přidáváte funkci, po funkci, která je někdy delší než řeka. Ale u SCJ ne jen, že na každou funkci nemusíte scrollovat do stran, ale navíc máte přehled, kam ke komu co přidáváte, a také s ním můžete pokračovat. Celý include obsahuje jen ty nejzákladnější či nejspíše nejpotřebnější funkce pro tvorbo prací na server, ale pokračování si může uživatel zrealizovat sám podle sebe. Velká většina funkcí nevyžaduje id těch prací, ale jejich jména v kódě, která si také může uživatel přidávat sám. Celá taková myšlenka, místo id práce vepisovat jména a přidávat další funkce, vznikla zrovna na základně komentáře: UKÁZKA SCJTady bych vám rád předvedl takovou ukázku, jak můžete pracovat s SCJ. Řekneme si, že si chceme vytvořit práci například Gang Vagos: #include <SCoreJobs01.inc> public OnFilterScriptInit() { SJob_Insert("vagos", "{FFFF00}Gang Vagos", 2220.9712,1251.9951,10.8203); SJob_SetSkins("vagos", 108, 109, 110); SJob_SetVyplata("vagos", 40000); return true; } (Nejspíše už většina z vás tuší, co jaká funkce, udělá. Jestliže ne, nevadí, vysvětlíme si to později) Nevypadá to tak složitě a nepřehledně, že ne? Samozřejmě se nenechte oklamat! Jediné, co v tomhle případě přesně udělá je, že se vytvoří pickup s jménem té patřičné práce a nastaví jí 3 skiny(a jeden z nich dostane hráč po přidání do té práce), a výplatu jen té práci. Nebude se nikomu dávat. Začátečník (po případě je možné, že i pokročilejší), se zeptá "Tak pak k čemu nám to je?". Odpověď je prostá: Tady si můžeme jaksi "přednastavit" co budeme potřebovat, a pak s volnou rukou, si už budeme moct pokračovat, jak chceme, a přidávat co chceme. Ještě více to zjednoduším: Protože, to právě budou ty klišé JS, kde přidáte jednu funkci a konec. Nemůžete s tím hráčem pak v těch pracích nějak manipulovat. Nemůžete pak nastavovat, jakou dostane výplatu, kromě té ve funkci. Nemůžete mu zjistit, v jaké je práci(jediné co, tak jestli je vůbec v nějaké). Nemůžete pak kdekoliv znova přenastavit výplatu, a tak dále... Prostě, všechno se udělá za vás a máte omezenější možnosti. SEZNAM FUNKCÍ VE SCJ Zde je kompletní seznam funkcí, který obsahuje include. Tady zobecním, co k čemu slouží jaká funkce, a pak si ukážeme příklad využití každé z nich. SJob_Insert() >> Přidává základ pro tvorbu prací (+vytvoří pickup s jménem práce). SJob_SetSkins() >> Nastaví globálně dané práci skiny, které se pak nastaví hráči po připojení do dané práce. SJob_SetVyplata() >> Nastaví globálně dané práci, jaká bude jeho výplata. SJob_Vyplata() >> Vrací hodnotu, jakou má nastavenou výplatu daná práce. SJob_Skin() >> Vrací jeden ze 3 skinu, které má nastavená daná práce. SJob_PrintJobInfo() >> Vypíše všechny potřebné informace o dané práci do konzole. SHasPlayerJob() >> Vrací hodnotu true/false, podle toho, jestliže je v nějaké z prácí. SGetPlayerJob() >> Vrací hodnotu true/false, jestliže, je v dané práci. SGetPlayerJobName() >> Vrací jméno práce v kódě v které se nachází hráč. SGetJobObjName() >> Vrací jméno práce ve hře. SJob_InsertPlayer() >> Vloží hráče do dané práce. SJob_RemovePlayer() >> Vyhodí(smaže) hráče z dané práce. IsPlayerOnJobsPickup() >> Vrací true/false, podle toho, jestliže je na nějakém z pickupů prací. IsPlayerOnJobsPickup() >> Vrací true/false, podle toho, jestliže je na daném pickupu u dané práce. SJob_Insert() (sJobName[], sJobObjName[], Float: fJobPosX, Float: fJobPosY, Float: fJobPos) sJobName[] - Jméno práce ve zdrojovém kódu. sJobObjName[] - Jméno práce ve hře(lze přidat i hexkód barvy). fJobPosX - X pozice nové práce (pickupu). fJobPosY - Y pozice nové práce (pickupu). fJobPosZ - Z pozice nové práce (pickupu). Ukázka využití: SJob_Insert("policie", "{0000FF}Policie", 2200.7500,1233.7435,10.8203); SJob_SetSkins() (sJobName[], iJobSkin1, iJobSkin2 = -1, iJobSkin3 = -1) sJobName[] - Jméno práce ve zdrojovém kódu. iJobSkin1 - Nastavit první skin pro práci. iJobSkin2 - Nastavit druhý skin pro práci. iJobSkin3 - Nastavit třetí skin pro práci. Ukázka využití: SJob_SetSkins("policie", 280, 285, 286); SJob_SetVyplata() (sJobName[], iJobVyplata = 25000) sJobName[] - Jméno práce ve zdrojovém kódu. iJobVyplata - Nastavit výplatu pro danou práci. Ukázka využití: SJob_SetVyplata("policie", 40000); SJob_Vyplata() (sJobName[]) sJobName[] - Jméno práce ve zdrojovém kódu. Ukázka využití: if (SHasPlayerJob(playerid)) GivePlayerMoney(playerid, SJob_Vyplata(SGetPlayerJobName(playerid))); SJob_Skin() (sJobName[], iJobSkinListID) sJobName[] - Jméno práce ve zdrojovém kódu. iJobSkinListID - Jeden ze tří nastavených skinů (pole s 0, 1 a 2). Ukázka využití: new iSkinList1 = SJob_Skin("policista", 0), iSkinList2 = SJob_Skin("policista", 1), iSkinList3 = SJob_Skin("policista", 2); SetPlayerSkin(playerid, iSkinList1); /* Nebo */ SetPlayerSkin(playerid, iSkinList2); /* Nebo */ SetPlayerSkin(playerid, iSkinList3); /* Nebo, je také možnost, která je i lepší: */ new iSkinSet = SJob_Skin("policista", random(3)); SetPlayerSkin(playerid, iSkinSet); SJob_PrintJobInfo() (sJobName[]) sJobName[] - Jméno práce ve zdrojovém kódu. Ukázka využití: SJob_PrintJobInfo("policie"); SHasPlayerJob() (playerid) playerid - ID daného hráče. Ukázka využití: if (SHasPlayerJob(playerid)) return SendClientMessage(playerid, "Jste zaměstnán!"); SGetPlayerJob() (playerid, sJobName[]) playerid - ID daného hráče. sJobName[] - Jméno práce ve zdrojovém kódu. Ukázka využití: if (SGetPlayerJob(playerid, "policie")) return SendClientMessage(playerid, "Jste zaměstnán jako policie!"); SGetPlayerJobName() (playerid) playerid - ID daného hráče. SGetJobObjName() (iJob_ID) playerid - ID dané práce. Ukázka využití: format(sString, sizeof(sString), "Jméno práce %s", SGetJobObjName( SGetJobIDFromName("policie") ); SJob_InsertPlayer() (playerid, sJobName[]) playerid - ID daného hráče. sJobName[] - Jméno práce ve zdrojovém kódu. Ukázka využití: if (!SHasPlayerJob(playerid)) { SJob_InsertPlayer(playerid, "policie"); SendClientMessage(playerid, "Jste zaměstnán jako policie!"); SJob_RemovePlayer() (playerid) playerid - ID daného hráče. Ukázka využití: if (SHasPlayerJob(playerid)) { SJob_RemovePlayer(playerid); SendClientMessage(playerid, "Opustil jste zaměstnání policie"); IsPlayerOnJobPickup() (playerid, sJobName[]) playerid - ID daného hráče. sJobName[] - Jméno práce ve zdrojovém kódu. Ukázka využití: public OnPlayerKeyStateChange(...) { if (IsPlayerOnJobPickup(playerid, "policista")) { if (PRESSED(...)) { SendClientMessage(playerid, -1, "Jsi na pickupu policista!"); IsPlayerOnJobsPickup() (playerid) playerid - ID daného hráče. Ukázka využití: public OnPlayerPickUpPickup(...) if (IsPlayerOnJobsPickup(playerid)) { if (SHasPlayerJob(playerid)) return SendClientMessage(playerid, -1, "Již jste zaměstnán jinde !"); PÁR ZAJÍMAVOSTÍ O SCJ Celé SCJ neukládá, kromě počtu zaměstnání u každé vytvořené práce, a souboru s jménem hráče rovnou ve scriptfiles. Tudíž, není třeba nikde nic vytvářet za složku. Funkce SJob_PrintJobInfo se vám může hodit jako ukázka, jestliže jste se někde při vytváření nesekli. Žádná z funkcí nezobrazuje zprávy hráči do hry, pouze do konzole. Nelze vytvořit již existující práci (jestliže se budou jména prací ve zdrojovém kód schodovat. Údaje ohledně zamestnání u každého hráče se nahrají a uloží jen v případě, že se zaměstnán. S tímto includem lze samozřejmě pracovat i v gamemodu. Stačí přídat dJOB_GAMEMODE V include jsem se snažil co nejvíce šetřit (počet proměnných, pole, délky...), Lze si nastavit vlastní maximum prací pomocí dMAX_JOBS jinak default je 100, a nastavit si ID skinu po opuštění zaměstnání pomocí dDEFAULT_SKIN, jinak defaultně je 0. Pro nastavení výplaty u dané práce s funkcí SJob_SetVyplata() nemusíte zadávat druhý parametr. V případě, že nedosadíte, výplata se automaticky nastaví na 35000$. Na funkci, pro zjištění jestliže stojí na pickupu prací, nebo jedné z prací se použila funkce na zjistění, zda se hráč nachází v dané oblasti(pro práci s těmito funkcemi doporučuji využívat callback OnPlayerKeyStateChange). NĚKOLIK UKÁZEK S SCJ RYCHLÉ EASY ZAMĚSTNÁNÍ POLICIE OTEVŘENÍ MENU DANÉ PRÁCE OTEVŘENÍ MENU VŠECH PRACÍ NAJEDNOU NASTAVENÍ SPAWNU ZAMĚSTNANCŮ ZJISTĚNÍ PRÁCE VŠECH NA SERVERU SCREENY Stačil jsem si, kromě těch 2 ukázek výše, připravit ještě další 2 screeny, ale podle mě není toho moc co ukazovat na include, kde si toho můžete udělat tolik podle sebe. CO BUDE V UPDATE V případě, že bude nějaký větší zájem či časté kladnější ohodnocení, mám v úmyslu v tom pokračovat. 0.2 Změnit celý enum pJobInfo na obyčejné 2 proměnné. Přidat funkci SJob_InsertRankJob(), půjde o práce, na kterou se dostane povýšením v prácí, ke které já RankJob přiřazena. Přidat funkci SJob_InsertPlayerRank(), povyší hráče z určené předešlé práce do této. Přidat funkci SJob_AddJobCommand(), určí, které příkazy budou JEN pro hráče, kteří jsou zaměstnáni v určitých pracích v této funkci. Vylepšit funkci SJob_PrintJobInfo, bude vám moct nahlásit i patřičné chyby. Přidat funkci SJob_SetWeapons(), asi všichni víme k čemu. Přidat funkci SJob_SetRandomVyplaty(), lze nastavit u určitě true, a tak budou hráči dostávat výplatu od určité hodnoty, ale ještě s nějakým náhodným doplňkem. Optimalizace kód, opravit chyby, opravit bugy, překlepy, zpřehledit kód a tak dále... DOWNLOAD(pawno.cz/files/file/21-corejob/) V souboru, který stačí rozbalit, bude vše potřebné pro práci. Stačí jen všechno, co obsaje složka include hodit do složky pawno\include, přidat nahrání daného include SCoreJobs01.inc a už můžete tvořit! ZÁVĚR Na závěr bych chtěl poděkovat samozřejmě Y_Lessovi za jeho YSI4, a také vEndovi a Lukaszovi za pomoc při opravování chyb. Otestoval jsem, co jsem mohl a vše fungovalo. V případě, že i přesto vám něco nepůjde, dejte vědět. V případě, že budete mít zájem nějakým způsobem ohodnotit či budet mít nějaký nápad, co přidat nebo vylepšit, tak vás prosím, zdržte se zbytečných a pitomých příspěvků, jen, aby jste se předvedli. Děkuji za pochopení.
  4. #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[
  5. Zdravím vás Chtěl bych vám nabídnout službu tvorbu scriptů(Pluginů) Do hry Counter Strike 1.6 Pokud máte zájem můžete se ozvat: Kontakt: Soukromá Zpráva na Pawno.cz Email: [email protected] Požadavky: Přístup k FTP vašeho serveru. Pro test Scriptu po případě že nechcete dát FTP můžete si zaplatit můj server pro test scriptu 50 Kč / 2 Eura Čas na tvorbu 2-5 dní podle náročnosti Penežní Ohodnocení: Podle náročnosti scriptu a dohodě Co můžete čekat: Rychlé jednání Spolehlivost Platba po dokončení Děkuji za váš čas. Prosím snažte se co nejméně komentovat přispěvek
  6. Ahoj všichni potřeboval bych zablokovat část příkazu neumím si to úplně představit, je mi jasné že tam bude funkce strfind nebo něco takového ale nedokážu si to dát dohromady. Uvedu příklad chtěl bych zablokovat /action 1 fuck chtěl bych zablokovat jenom to fuck v tom přikazu aby mi to nezablokovalo ten příkaz celý aby třeba /action 1 dance šlo. A nevím jak to mám udělat když např ta 1 je proměná takže jak to zablokovat jenom to poslední přičemž to id se bude samozřejmě měnit
  7. Čau, zkouším si udělat vlastní script pro svůj účel... Jedná se o skript, který by měl při připojení zapsat a po odpojení smazat z databáze Jméno uživatele. No bohužel to při připojení nefunguje... Ale když pak zapíšu do db manuálně a odpojím se, tak to smaže... Tak opravdu nevím, čím to je... public OnPlayerConnect(playerid) { CreateOnline(playerid); return 1; } a public OnPlayerDisconnect(playerid, reason) { CreateOffline(playerid); return 1; } Tu jsou stocky stock CreateOnline(playerid) { new PlayerName[MAX_PLAYER_NAME]; GetPlayerName(playerid, PlayerName, MAX_PLAYER_NAME); new query[256]; format(query, sizeof(query), "INSERT INTO `online` (`Nick`) VALUES ('%s')", PlayerName); mysql_query(query); return true; } stock CreateOffline(playerid) { new PlayerName[MAX_PLAYER_NAME]; GetPlayerName(playerid, PlayerName, MAX_PLAYER_NAME); new query[256]; format(query, sizeof(query), "DELETE FROM `online` WHERE `Nick` = '%s'", PlayerName); mysql_query(query); return true; }
  8. ERRORY : Zdravím ! Mám tu drobné errory no už sedím pri nich okolo 3 hod. a na nič som neprišiel. errory. Riadky : Warningy ani nepotrebujem aby ste opravili,hlavne ERRORY,Ďakujem,PS : Som začiatočník.
  9. Zdravím,hľadal by som automatické uloženie pre hráčov a nič a furt nič som nenašiel.Ďakujem za odkaz/pwn odkaz.
  10. Čaute,potreboval by som pomoc v MTA,keď vymažem objekt a už uložím niaku mapu,tak idem na convertffs.com a nechce to dať kod z na zmazanie.Ďakujem za pomoc.PLS HELP !!! PS : Som začiatočník,tak sa nečudujte že to neviem .
  11. Původně jsem to v plánu neměl, ale rozhodl jsem se, že tu trochu objasním, jak funguje ternární operátor ? : Obtížnost: Jak to funguje Nejprve trochu nezbytné teorie, tento operátor se nazývá ternární, protože, jako jediný v pawn, pracuje se třemi operandy. první operand ? druhý operand : třetí operand _ Operandem nazýváme výraz, se kterým operátor pracuje. Tohle by myslím stačilo, teď se podívejme na to, jak funguje. logický výraz ? pravda : nepravda _ Operátor nejprve vyhodnotí logický výraz, pokud je tento výraz pravdivý (true), vrátí to, co je za otazníkem. Pokud je výraz nepravdivý (false), tak vrátí to, co je za dvojtečkou. Uvedu příklad: #define CERVENA 0xFF0000FF #define MODRA 0x0000FF00 new color; color = GetPlayerTeam(playerid) == 1 ? CERVENA : MODRA; Nejprve dojde k vyhodnocení logického výrazu, kterým je GetPlayerTeam(playerid) == 1. Pokud hráčův tým je skutečně tým s ID 1, tak se do proměnné color uloží hodnota za otazníkem, tedy CERVENA. Pokud ovšem má hráčův tým jiné ID, uloží se do proměnné hodnota za dvojtečkou, tedy MODRA. Využití v praxi Ne všechno se dá pochopit z teorie, proto je lepší to ukázat na několika příkladech z praxe. Hráčův tým Vezměme si ještě jednou příklad seshora a trochu jej upravme. Budeme chtít, aby se proměnné color nastavila CERVENA, pokud bude hráčův tým mít ID v rozmezí od 1 do 10. Pokud ne, nastaví se proměnné hodnota MODRA. Jak to lze řešit přes podmínky: if(GetPlayerTeam(playerid) >= 1 && GetPlayerTeam(playerid) <= 10) color = CERVENA; else color = MODRA; _ Jak my to vyřešíme šikovně přes ternární operátor: color = GetPlayerTeam(playerid) >= 1 && GetPlayerTeam(playerid) <= 10 ? CERVENA : MODRA; GetPlayerTeam(playerid) >= 1 && GetPlayerTeam(playerid) - logický výraz CERVENA - hodnota, která se uloží, když je logický výraz pravdivý/true MODRA - hodnota, která se uloží, když je logický výraz nepravdivý/false Pokud se v tom pomalu ztrácíte a přijde vám to nepřehledné, můžete si to ozávorkovat: color = (GetPlayerTeam(playerid) >= 1 && GetPlayerTeam(playerid) <= 10) ? (CERVENA) : (MODRA); _ Else if? Někteří z vás si možná řeknou "A co když potřebuji další podmínku, tedy else if?!" I tohle je samozřejmě pomocí ternárního operátoru možné, ale předem vás varuji, že se v tom možná začnete ztrácet. Zadání je následující: pokud má hráčův tým ID 1, nastaví se CERVENA, pokud má ID 2, nastaví se MODRA, pokud má jiné ID, nastaví se ZELENA. color = (GetPlayerTeam(playerid) == 1) ? (CERVENA) : ((GetPlayerTeam(playerid) == 2) ? (MODRA) : (ZELENA)); Za dvojtečku jsme přidali další ternární operátor. Pokud se ID rovná jedné, není problém, nastaví se CERVENA. Pokud se jedné nerovná, přeskočí za dvojtečku, zde narazí na další ternární operátor. Vyhodnotí další logický výraz. Pokud se ID rovná dvěma, nastaví se hodnota MODRA. Pokud to nebude ani jedna a ani dva, tak je to logicky jiné ID => nastaví se ZELENA. Šlo by to takhle větvit i dál, vždy by se za dvojtečku přidal další ternární operátor, ale při větším počtu bude lepší využít klasických podmínek, popř. switche. Příklad na závěr A dáme si ještě příklad na závěr. Skloňování v češtině programátorům leckdy dost komplikuje práci, výsledek výpisu hlášek se nám mnohdy nelíbí, například tady: new pocetHracu = 3,str[145]; format(str,sizeof str,"%i hráčů na serveru.",pocetHracu); SendClientMessageToAll(-1,str); _ Server nám vypíše tohle: 3 hráčů na serveru. _ Ale my chceme, aby vypisoval: 1 hráč na serveru. 2/3/4 hráči na serveru. 5/6/atd. hráčů na serveru. _ Zkrátka aby to vypsalo správný tvar slova hráč podle počtu. Lze to řešit přes podmínky nebo switch: switch(pocetHracu) { case 1: format(str,sizeof str,"%i hráč na serveru.",pocetHracu); case 2,3,4: format(str,sizeof str,"%i hráči na serveru.",pocetHracu); default: format(str,sizeof str,"%i hráčů na serveru.",pocetHracu); } _ Ale my si to zkrátíme na jeden řádek pomocí ternárního operátoru. format(str, sizeof str,"%i %s na serveru.",pocetHracu,(pocetHracu == 1) ? ("hráč") : ((pocetHracu < 5) ? ("hráči") : ("hráčů"))); Za specifikátor %s se dosadí jeden z tvarů slova hráč. Je to také krásná ukázka toho, že ternární operátor lze použít i v parametru funkce. Ještě jedno upozornění na závěr, když má tento operátor vracet řetězec, tak jej uzavřete do závorek vždy! Nevím, zda problém stále trvá, ale dříve byly problémy s tím, že když to nebylo v závorkách, pawno mohlo spadnout. Edit: Potvrzeno, problém stále trvá, pokud řetězec do závorek neuzavřete, kompilátor přestane pracovat. Tímto ukončuji návod, doufám, že si z něj někteří něco odnesou a že vám tento operátor třeba v něčem ulehčí nebo pomůže. Pokud jste narazili na nějakou chybu nebo se chcete na něco zeptat nebo se jen vyjádřit, pište. Ověřený návod Tento návod prošel validací, a lze ho proto považovat za ověřený.
  12. Zdravím, jak již název vypovída Dark Force Cheater je zpět. Pro většinu z Vás to znamená jediné nemusíte dlouho hledat cheaty/hacky/modifikace na internetě a vše máte na jedné stránce. Už tedy nebudete pozadu oproti cheaterům kteří jsou v těchto vodách dlouho a zase můžete své AntiCheaty vyvíjet naplno. Mnozí z Vás si zajisté všimli, že jsem nereagoval na dotazy ohledně Decompilace CLEO skriptů či principu fungování určitých cheatů. I to se nyní mění a opět na Vaše dotazy budu reagovat, můžete se nyní ptát přímo na fb takže reakce na Váš dotaz bude mnohonásobně rychlejší. Všiml jsem si, že většina serverů s vývojem AC zaspala a nic se nemění, naproti tomu cheateři k tomuto momentu mají 4 způsoby jak shodit hráče ze serveru a 1 jak shodit přímo server. Není dobré se spoléhat pouze na Kalcora a na jeho fixy, měli by jste si umět poradit i sami a já doufám, že Vám s tím budu schopen pomoci. Tohle je novinka spíše pro ty se kterými jsme spolupracoval popřípadě pro ty co by si chtěli zabezpečit server ale nevědí jak na to z principu jít. Brzy budu na stránách uveřejňovat nové hračky tak doufám, že se občas přijdete mrknout, cheateři na Vás totiž určitě čekat nebudou. Adresa: https://www.facebook.com/pages/Dark-Force-Cheater/343469425856579
  13. Čaute skvelí programátori! Stiahol som z netu súbory na gamemod Need For Speed World. Všetko fungovalo až pokiaľ som nezačal kompilovať. Boli by ste takí dobrí a opravili mi 6 errorov, ktoré vždy ukazuje pri kompilácií?? A potom mi opravený súbor poslali v .rar na mail: [email protected] ? Ak áno, tak ďakujem veľmi pekne (a tu je ten súbor: http://drevene-misky.eu/NFSW.rar -- potrebujem len, aby bol skompilovaný gamemod nfsw.pwn na nfsw.amx. To je všetko) Ak nie, tak tiež veľmi pekne ďakujem a nariekam: Ďakujem a prajem pekný deň!
  14. Zdravím, dostal jsem nápad jak by se dalo zpřehlednit vytváření návodů. Níže v tomto příspěvku by se měly zobrazovat témata s obory, které by potřebovaly nějaký návod. Tyto obory nejsou vymyšlené a je potřeba aby jste je vymysleli vy. Návody může psát kdokoliv, samozřejmě já se k nim přidám. Příklad: Něčemu nerozumíte zajdete si sem (na forum) a návod tu na to není. Můžete to vylepšit tím, že napíšete sem do topicu obor a téma pro který by jste potřebovaly návod. Já ho přidám to tabulky v prvním tomto příspěvku. Příklad 2: Jste zkušený v nějakém oboru a nudíte se občas nebo chcete někomu pomoci. Zajdete si na tento topic, najdete si obor který umíte a na uvedené téma napíšete návod. Dále napíšete sem, že je návod napsaný, abych mohl změnit status návodu za napsaný. Přidání má podmínku že uvedený návod, který by jste chtěli, neexistuje nebo je zastaralý, případně málo pochopitelný ) Veškeré připomínky nebo cokoliv jiného pište přímo sem. Nezapomeňte aspoň někdo pro začátek něco napsat aby to nebylo prázdné
  15. zdravim. mam stringovy pole ktery ma vyjadrovat 20 radku console. a k tomu mam stock kterej ma fungovat tak, ze prida na posledni radek to co je jako text[] a ostatni radky posunout o jeden nahoru nahore new CL[MAX_PLAYERS_EX][MAX_LINES][256]; stock AddConsoleLine(pid, text[]) { for(new line =0;line < MAX_LINES; line ++) { if(line < 19) { new i = line+1; format(CL[pid][line], sizeof(CL[pid][line]), "%s", CL[pid][i]); //radek 234 } else { format(CL[pid][line], sizeof(CL[pid][line]), "%s\n", text); } } } a pise mi to neustale tohle: C:\Users\vxplisek\Desktop\samp03z_svr_R1_win32\gamemodes\hackerwars.pwn(234) : error 001: expected token: "]", but found "-identifier-" C:\Users\vxplisek\Desktop\samp03z_svr_R1_win32\gamemodes\hackerwars.pwn(234) : warning 215: expression has no effect C:\Users\vxplisek\Desktop\samp03z_svr_R1_win32\gamemodes\hackerwars.pwn(234) : error 001: expected token: ";", but found "]" C:\Users\vxplisek\Desktop\samp03z_svr_R1_win32\gamemodes\hackerwars.pwn(234) : error 029: invalid expression, assumed zero C:\Users\vxplisek\Desktop\samp03z_svr_R1_win32\gamemodes\hackerwars.pwn(234) : fatal error 107: too many error messages on one line
  16. Čus, hľadám nejakého skušenejšieho pawnera pre GTA san andreas server, mapu už máme, odvďačill by som sa reklamou vašich skúseností na facebookovej stránke s 3500 likami, pomocou vašej tvorby - sa:mp Roleplay Server. Ak sa niekto nájde, prosím kontaktujte ma(nás) na skype krwgyn42 alebo erik.vrabe, alebo tu do komentára. ďakujem
  17. bug

    pomoc PickupType

    Zdravím, je mi trápne že musím zakladať takýto topic ale inak to nejde.... Mám pickup, Keď do neho vojdete ukáže vám dialog, Ale keď sa pohybujem v tom dialogu každú sekundu ten pickup proste zoberie znova a znova..... posuniem si v style_list o pár možností dole a o sekundu už ho zoberie zase znova tak sa nachádzam zase navrchu... new driverlicense; driverlicense = CreatePickup(1239,1,2027.1650,1342.5490,10.8203,-1) ďakujem za všetky budúce odpovede, dúfam že mi pomôžete
  18. NoJo_

    pomoc /spec

    Čavte pawnery a pawnerky, spravil som si príkaz /spec ID hráča ale keď ten príkaz zadám tak sa mi to ukazuje - http://www.img.tpx.cz/uploads/specbug.png Kód: CMD:spec(playerid,params[]) { new specmsg[60+MAX_PLAYER_NAME]; sscanf(params,"i",i); if(alvl[playerid] >= 1) { if(IsPlayerConnected(i)) { format(specmsg,sizeof(specmsg),"Spectuješ hráča %s. Spectovanie vypneš príkazom /specoff",meno(i)); SCM(playerid,-1,specmsg); TogglePlayerSpectating(playerid,true); PlayerSpectatePlayer(playerid,i,SPECTATE_MODE_NORMAL); } else return SCM(playerid,-1,"{FF0000}Zadané ID nie je pripojené"); } else return SCM(playerid,-1,"{FF0000}[ ! ]{FFFFFF} Nemáš dostatočné práva na tento príkaz {FF0000}[ ! ]"); return true; }
  19. Dobrý den, rád bych updaty svého gamemode automaticky distribuoval přes web. Moje idea je, že bych na apache server (mám) (pro ty co neví, web server) měl soubor gm_ver.ini a onGamemodeInit by si pawn tento soubor stáhl a zkontroloval, zda má nejnovější. A teď k hlavnímu problému: (koukni na EDIT) Můžu pawnem přepsat filterscript/gamemode samotný? Samozřejmě, funkčnost až po reloadu nebo restartu srv... Za odpověď moc děkuji. hoschi EDIT: ano, přepsat ho můžu. Ovšem problém je, jak ho stáhnout v amx formě v pawnu bez nějakého zničení převodem na řetězec
  20. Dobrý den, rád bych updaty svého gamemode automaticky distribuoval přes web. Moje idea je, že bych na apache server (mám) (pro ty co neví, web server) měl soubor gm_ver.ini a onGamemodeInit by si pawn tento soubor stáhl a zkontroloval, zda má nejnovější. A teď k hlavnímu problému: Můžu pawnem přepsat filterscript/gamemode samotný? Samozřejmě, funkčnost až po reloadu nebo restartu srv... Za odpověď moc děkuji. hoschi
  21. nejde me dialog ktery se ma spustit po napsani /carmenu #include <a_samp> #if defined FILTERSCRIPT public OnFilterScriptInit() { print("\n--------------------------------------"); print(" Admin carmenu by ID od Dominika Rozporky\nDejte mi odber zde: youtube.com/user/dominikrozporka"); print("--------------------------------------\n"); return 1; } public OnFilterScriptExit() {SendClientMessage(playerid, 0x00FF00FF, "Admin carmenu od Dominika Rozporky bylo vypnuto dejte odber zde: youtube.com/user/dominikrozporka"); return 1; } public OnRconCommand(cmd[]) { if (strcmp("/carmenu", cmdtext, true, 10) == 0) { // Define the dialog IDs either with an enum: enum { DIALOG_CARID } #define DIALOG_CARID 99999 ShowPlayerDialog(playerid,DIALOG_CARID,DIALOG_STYLE_INPUT,"ID Dopravniho Prostredku","Zadejte ID Dopravniho prostredku","OK","Zrusit") public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) { if(!IsNumeric(inputtext)); new id = strval(inputtext); new auto; new Float:aX, Float:aY, Float:aZ; GetPlayerPos(playerid,aX,aY,aZ); auto = CreateVehicle(id,aX,aY,aZ,82.2873, 0, 1, 60); PutPlayerInVehicle(playerid,auto, 0); return 1; } } new Float:aX, Float:aY, Float:aZ; GetPlayerPos(playerid,aX,aY,aZ); auto = CreateVehicle(411,aX,aY,aZ,82.2873, 0, 1, 60); PutPlayerInVehicle(playerid,auto, 0); return 1; } return 1; } #endif
  22. Zdravím, potřeboval bych nějaký aktuální pawn kompiler pro sa-mp na Ubuntu 13.10, ale žádný mi nefunguje. Nevíte někdo o něčem?
  23. C:\Users\acer\Desktop\RGRP\gamemodes\xxx.pwn(19411) : warning 217: loose indentation C:\Users\acer\Desktop\RGRP\gamemodes\xxx.pwn(22338) : warning 213: tag mismatch C:\Users\acer\Desktop\RGRP\gamemodes\xxx.pwn(22727) : warning 217: loose indentation C:\Users\acer\Desktop\RGRP\gamemodes\xxx.pwn(22732) : warning 217: loose indentation C:\Users\acer\Desktop\RGRP\gamemodes\xxx.pwn(27082) : warning 217: loose indentation C:\Users\acer\Desktop\RGRP\gamemodes\xxx.pwn(27510) : warning 217: loose indentation C:\Users\acer\Desktop\RGRP\gamemodes\xxx.pwn(27515) : warning 217: loose indentation C:\Users\acer\Desktop\RGRP\gamemodes\xxx.pwn(28179) : warning 217: loose indentation C:\Users\acer\Desktop\RGRP\gamemodes\xxx.pwn(28245) : warning 217: loose indentation C:\Users\acer\Desktop\RGRP\gamemodes\xxx.pwn(28269) : warning 217: loose indentation C:\Users\acer\Desktop\RGRP\gamemodes\xxx.pwn(28421) : warning 217: loose indentation C:\Users\acer\Desktop\RGRP\gamemodes\xxx.pwn(28426) : warning 217: loose indentation C:\Users\acer\Desktop\RGRP\gamemodes\xxx.pwn(46832) : warning 217: loose indentation C:\Users\acer\Desktop\RGRP\gamemodes\xxx.pwn(58226) : warning 203: symbol is never used: "ret_memcpy" Pawn compiler 3.2.3664 Copyright © 1997-2006, ITB CompuPhase 14 Warnings. Vedel by mi s tým niekto pomôcť prosím? pragma tabsize 0 som dával, ale nič mi nepomáha. Ďakujem za všetky odpovede.
  24. Zdravím vás. Chtěl bych vám představit svůj programek naprogramovaný v C#, dělám ho už 2 dny a berte na vědomí, že není zrovna ve stabilní verzi.. O Co jde? O program ve kterém si budete moci psát vlastní scripty do her, CS1.6, SA-MP.. například AMXX Studio, Pawno, SA[MP]CE.. už snad víte co tím myslím, nenapadl mě lepší text než tento.. omlouvám se.. Na čem to funguje? Byl postavený v jazyce C# (.NET) dále využívá knihovnu SciLexer (Scintilla for .NET). Jaké jsou požadavky? Minimálně .NET Framework 3.0~ Nebýt líné prase. Co to obsahuje? Zatím jenom kódování do CS1.6, na SA-MP se pracuje. Dále samozřejmě textový editor, function list with help, kompilace do .amxx souboru a další na obrázku Kde to stáhnu? DOWNLOAD (V0.2.2) Aplikace vás o novější verzi informuje při dalším spuštěním. Changelog V0.2.2 - Opraveno hodně bugu - Větší pomoc při kódování - Upraven vzhled (Split Container) - k Search boxu přidán i třidič podle typu (Funkce, Proměnná) - Zvětšen počet zbarvení funkcí - Ke kompilaci přidáno "Kompilovat a spustit" - Možnost nastavit output cestu kde se bude kompilovaný soubor uložovat. ----- Důvod proč jsem tuto aplikaci je udělal protože mě v AMXX Studio doslova už s*re že nejde přidávát složená závorka "{", stahnul jsem si upravenou verzi, ale už nejde a Delphi mi také nefunguje proto jsem se tak na*ral a otevřel VS a makal..:DD
  25. Tak jo vítám vás tu po delší době a zase vám tu chci ukázat něco málo z toho co dělám a většinou to bývá tajné Tak jo začneme... Dnes vám tu ukážu IJobs4, ano už 4 verze 1 verze byla testovní, 2 verze byla nějak posraná a tak dále Nejnovější a taktéž nejlepší verze je tato 4.0. Funkce: CreateJob(jid,jobname[],Float:X,Float:Y,Float:Z,skin1,skin2,skin3,w1,w2,w3,a1,a2,a3) PlayerJoinToJob(playerid,jobname[]) ChangePlayerJobSkin(playerid,jobname[]) IsPlayerInJob(playerid,jobname[]) IsPlayerAroundOfJob(playerid,jobname[]) GetPlayerStats(playerid) SetPlayerStats(playerid,money,points,level) GetIDFromJobName(jobname[]) SetPlayerJob(playerid,jobname[]) GetPlayerJob(playerid) LoadJob(jobname[]) SetPlayerStatsEx(playerid,name[],value) GetPlayerStatsEx(playerid,name[],value) Tak to jsou všechny funkce, které tam jsou a fungují Tak a teď vám tu napíšu nějaký ten návod jak si vytvořit vlastní jobku. Návod: Vytvoření práce: Vytvoření práce je velice jednoduché použijeme k tomu funkci CreateJob CreateJob(jid,jobname[],Float:X,Float:Y,Float:Z,skin1,skin2,skin3,w1,w2,w3,a1,a2,a3) Takto vypadá samotná funkce a takto vypadá vyplněná. Ale nebudu doplňovat souřadnice si doplňte sami. CreateJob(1,"Policista",X,Y,Z,280,281,282,3,22,33,1,90,180); Toto nám vytvoří pickup Policista na souřadnicích XYZ a první další 3 čísla jsou skiny další 3 jsou zbraně a potom munice to vše se uloží do souboru a z toho to potom čte. Připojení do práce a změna skinu pomocí zmáčknutí: Tak a teď tu máme jakoby ovládání, pickup máme vytvořen ale chybí nám ještě dodat možnost přijít k němu a po kliknutí tlačítka se připojit. To vyřešíme tímto do publicu OnPlayerKeyStateChange vložíme tento kód: if(IsPlayerAroundOfJob(playerid,"Policista")) // Pokud je v dosahuj policie { if(PRESSED(KEY_YES)) { if(!IsPlayerInJob(playerid,"Policista"))//Pokud není v práci policista tak mu to dá zbraně pomocí funkce PlayerJoinToJob { ResetPlayerWeapons(playerid);//Reset zbraní PlayerJoinToJob(playerid,"Policista");//Připojí ho do práce a dám mu to věci, které jsme nastavili v první kroku } else { SendClientMessage(playerid,C_R,"[IJobs] ERROR: "white"V této práci jsi již zaměstnán"); } } else if(PRESSED(KEY_NO))//Pokud zmáčkne "N" { if(IsPlayerInJob(playerid,"Policista"))//Pokud je v práci policista { ChangePlayerJobSkin(playerid,"Policista");//Změní skin random podle těch 3 co jsme zadávali při vytváření práec } else { SendClientMessage(playerid,C_R,"[IJobs] ERROR: "white"Pro změnění pracovního skinu se musíš prvně zaregistrovat! Zmáčkni "g"Y"); } } } Nastavování statistik v práci: Pod tímto si asi můžete představit mnoho věcí ale jde o nastavování bodů,levelů, a peněz, které vydělá. GetPlayerStats(playerid);//Tímto zjistíme aktuální hodnoty, které se zapíšou do proměnné JPD[playerid][jLevel/jMoney/jPoints] SetPlayerStats(playerid,JPD[playerid][jMoney]+200,5,JPD[playerid][jLevel]);//Zde můžete nastavit body + nebo přímo hodnotu. Tady nastavujeme peníze, které měl + // 200 a u pointů nastavime aby měl 5 bez ohledu na ostatní věci. A ted by přišla nemilá věc co když potřebuji uložit jiné statistiky ? No na toto jsem taktéž myslel a mám pro to vytvořené 2 krásné funkce SetPlayerStatsEx(playerid,"Taxa",500);//Tímto uložíte do aktuální práce novou položku taxa. A tímto ji zase načtete do proměnné taxa. new taxa = LoadPlayerStatsEx(playerid,"Taxa"); No vidíte tak i toto se dá krásně ukládat A co když budeme chtít zjistit ID práce z jméne ? No na toto je taktéž funkce ale tu asi moc nepoužijete i když je velice důležitá, používám jí skoro ve všechn funkcích, kde dáváte do parametrů název práce. A abych nemusel hledat složitě ID ze souboru tak to můžeme udělat podle funkce. new id = GetIDFromName("Taxikar"); // Tato funkce právě vrátí ID práce, ID je podle toho, jaké jste si navolili při vzniku práce. Pomocné funkce: #define PRESSED(%0) \ (((newkeys & (%0)) == (%0)) && ((oldkeys & (%0)) != (%0)))//DEFINICE PRESSED UPOZORNĚNÍ: Funkce při, kterých zadáváte jméno práce musí odpovídat jménu práce, které jste zadali při vytváření. V scriptfiles musíte mít složku Jobs do té se vám budou ukládat všechny práce. Soubory s prací se sami obnoví pokud je smažete. Tak jo to je zatím vše nemám moc času takže ostatní funkce přidám až ho mít budu Lets's go pawn! Autor: Isigar Licence: MIT Pastebin: http://pastebin.com/A1BQZYgW Verze: 4.0 Znění MIT Licence:
×
×
  • Create New...