Jump to content

Search the Community

Showing results for tags 'include'.

  • 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

Found 18 results

  1. Ahojte. Na základe nedávneho príspevku som sa rozhodol spraviť include na čítanie a zápis dát. Tento include vyžaduje mať nainštalovaný plugin PawnPlus <- LINK Prečo? V scripte sú použité utriedené mapy pre optimalizáciu hľadania údajov. Prejdeme teda na použitie. Toto vložíme na začiatok vášho GM - načíta tento include do vášho GM #include <fSystem> Takto otvoríme súbor: Obsah súboru sa uloží do pamäte a je možné ho modifikovať až do doby, než súbor zatvoríte. V prípade že súbor neexistuje, vytvorí sa. new subor = DataOpen("test.txt"); // trva asi 700 tickov ak je v subore 100 000 dat // new subor obsahuje identifikator nasho suboru ktory sa pouziva vo funkciach Uložíme dáta do súboru: Maximálna dĺžka kľúča je 24. Dáta sa neuložia hneď, ukladajú sa až pri zatvorení súboru. Dáta sú ihneď dostupne, nie je potrebne zatvárať súbor, avšak bez zatvorenia súboru sa dáta neuložia! // pre demonstraciu sa ulozi 100 000 dat do suboru - pri testoch cca do 250 tickov (GetTickCount) new kluc[25]; for (new i = 0; i < 100000; ++i) { format(kluc, sizeof(kluc), "riadok%d", i); DataSetS(subor, kluc, "ahoj"); // ulozi string/array // DataSet -> ulozi integer (new) // DataSetF -> ulozi float } // kluc -> kluc pod ktorym sa ulozia nase data "ahoj" Načítame dáta zo súboru: Maximálna dĺžka kľúča je 24. // pre demonstraciu precitame 100 000 udajov, trvanie asi 150 tickov new kluc[25]; for (new i = 0; i < 100000; ++i) { format(kluc, sizeof(txt), "riadok%d", i); DataGetS(subor, kluc)); // nacita string/array // DataGet(subor, kluc) -> nacita integer // DataGetF(subor, kluc) -> nacita float if (i % 1000 == 0) { printf("%d -> %s", i, DataGetS(tst, txt)); } } Zatvoríme súbor: Pri zatvorení súboru sa ukladajú dáta do súboru. DataClose(subor); Ak chceme zatvoriť všetky súbory: DataCloseAll(); Na záver by som chcel požiadať o spätnú väzbu, či už kladnú alebo nie, vždy však poprosím aj nejaký popis. Poznámka: Odporúčam použiť novšiu verziu prekladača (napr. 3.10.0.0) fSystem.inc
  2. Arcturus Ini (AIni.inc) Patrím k scripterom ktorí sa snažia všetko programovať a nie kopírovať. Dini, Dof, Dof2 poznám a mal som tú česť opravovať scripty ktoré ich využívali. Z toho mi príde Dof2 asi najnovší a najprepracovanejší. Je to pekná práca a autorovi skladám rešpekt. Škoda že script je 5 rokov starý a autor script ďalej nerozvíjal. Škoda že autor vynechal velmi podstatnú časť toho čím Ini sú. Nakolko som nechcel používať cudziu prácu, napísal som si Files.inc čo bola vlastne prvá verzia so základnými funkciami na prácu s textovými súbormi file.inc. A že ich tam bolo požehnane. Druhá verzia IniFiles.inc už pracovala s konceptom klúč=data a pozostávala z troch príkazov. Ukladanie, zápis a mazanie. Ale bez sekcií ktoré k Ini neoddelitelne patria to proste stále nebolo ono a verzia 2.5 (vylepšená dvojka) teda po prvýkrát obsahovala aj rozdelenie do sekcii. Dámy a páni, dovolte mi predstaviť Vám Arcturus Ini. Tretiu verziu ktorá vznikla. Mocný nástroj na editáciu súborov obsahujúcich údaje pridelené ku klúčom a kategorizovaným do sekcí. A ako to funguje? IniFile("Súbor.ini","Sekcia","Kluc_x","Údaj",2); vytvorí textový Súbor.ini s následovným obsahom: [Sekcia] Kluc_x=Údaj: pri čítaní vracia hodnotu vo formáte string. Zvyknem ju teda používať následovne: format(string,sizeof(string),"%s",IniFile("Súbor.ini","Sekcia","Kluc_x","",1)); prípadne strval(IniFile("Súbor.ini","Sekcia","Kluc_x","",1)); čo teda ostáva? Mazanie. IniFile("Súbor.ini","Sekcia","Kluc_x","",3); - vymaže klúč Kluc_x IniFile("Súbor.ini","Sekcia","","",3); - vymaže Sekciu (aj so všetkými klúčmi ktoré obsahuje) Treba uznať že priebežne stále ladím rôzne neduhy ktoré to má ale aj tak je to Include ktoré nielen že je použitelné ale mojích posledných možno 100 scriptov sa bez neho nezaobišlo. A áno, Je to jediný príkaz v celom Include a jeho tvar teda je IniFile(file[128],section[128],key[128],data[128],mode) // mode: 1-číta 2-zapisuje 3-maže Takže kto má záujem sa na to pozrieť prípadne vyskúšať. Nech sa páči. Tí z Vás čo ste šikovnejší Pawneri si ju iste budete vedieť aj prispôsobiť. Neponúkam však hotový produkt. Berte to ako koncept, ako inšpiráciu stvoriť z toho niečo viac než už to je. Prajem vela zábavy a pekný deň. AIni.inc
  3. Hookovanie funkcií a callbackov Obsah Čo je to hookovanie Princíp hookovania a preprocesor _ALS_ - Advanced Library System Hookovanie funkcií Hookovanie callbackov Zhrnutie 1. Čo je to hookovanie Predstavte si gamemod v Pawn ako reťaz, kde každý krúžok predstavuje jednu funkciu (stock). Tieto krúžky sú pospájané, pretože jedna funkcia (stock) volá druhú a tá ďalšiu, atď. Dobrý, čitateľný kód je rozdelený do mnoho súborov, includov. Nanešťastie, každý callback môže byť definovaný iba raz, čo bráni efektívnemu rozdeleniu kódu. Tento problém rieši hookovanie, ktoré si možno predstaviť tak, že reťaz (gamemode) sa v niektorom krúžku rozdelí, pridá sa tam kód, ktorý chceme hooknuť a naspäť sa spojí, bez toho aby to akokoľvek ovplyvnilo zvyšok reťaze. To umožňuje použiť jeden callback aj viackrát v jednom súbore (prípadne v includoch). 2. Princíp hookovania a preprocesor Je treba povedať, že Pawn kompiler nefunguje (ani nemá prečo fungovať) tak ako Cčkový, alebo iný. Povedzme, že chceme upraviť (hooknuť) funkciu GivePlayerMoney() tak, že vždy keď je zavolaná, dá hráčovi dvojnásobok peňazí. Samozrejme bez toho, aby sme ovplyvnili nejaký už-existujúci kód. stock GivePlayerMoneyEx(playerid, money) { // definujeme vlastnu funkciu return GivePlayerMoney(playerid, money * 2); // v nej zavolame tu povodnu } #define GivePlayerMoney GivePlayerMoneyEx // predefinujeme tu povodnu Ďalšie použitie funkcie GivePlayerMoney() by už hráčovi dalo dvojnásobok peňazí. Štvrtý riadok spôsobí, že každé nasledujúce volanie GivePlayerMoney() preprocesor nahradí za GivePlayerMoneyEx(), teda za náš hook. Kompiler nehodí error/warning v prípade, že predefinujete už-existujúcu funkciu/callback. Na pochopenie princípu hookovania je treba vedieť ako funguje preprocesor Pawn. Stačí vedieť, že prebieha vo viacerých krokoch. V prvom kroku prebehne daný súbor, ktorý má spracovať. Skontroluje v ňom makrá a podmienky preprocesora a vyhodnotí ich. Súčasne si zapamätá ktoré funkcie (stocky, publicy) existujú, pridá si ich do medzipamäte a súbor prebehne znovu (opäť vyhodnotí makrá a podmienky preprocesora). Toto správanie podporí aj nasledujúci kód. Pre vaše dobro si každý z tých kódov skompilujte. #if defined A #error Funkcia je definovana #endif stock A() { } Kompiler hodí error kvôli tomu, že funkcia "A" je definovaná, hoc až za makrom. Zaujímavý je však tento kód: #if !defined A // vsimnite si zmenu, negaciu podmienky #error Funkcia nie je definovana #endif stock A() { } Hodí error rovnako, ako kód predtým. Ako je to možné? Predsa ide o znegovanú podmienku. Nečítajte ďalej, ak na to chcete prísť sami. Druhý kód prebieha tak, že preprocesor prejde ku "#if !defined". Tam samozrejme zastaví, pretože doteraz symbol "A" nikde nenašiel. Prečo teda prvý kód tiež narazil na error? V prvom kóde, preprocesor prebehne ku #if defined. "A" definované nie je a teda ide ďalej, ku koncu súboru, medzitým "A" nájde a uloží si ho do zoznamu známych symbolov. V ďalšej iterácii však preprocesor znova dôjde k #if defined, "A"čko už pozná a preto hodí error. Musím ešte povedať, že toto som zistil experimentami, popravde neviem ako funguje ten preprocesor. Ak máte nejaké objasnenie, môžete napísať. 3. _ALS_ - Advanced Library System Ak ste niekedy videli hookovací kód, všimli ste si, že oproti môjmu príkladu s GivePlayerMoney(), tam bolo niečo navyše. Správny kód by mal vyzerať takto: stock GivePlayerMoneyEx(playerid, money) { GivePlayerMoney(playerid, money * 2); } #if defined _ALS_GivePlayerMoney #undef GivePlayerMoney #else #define _ALS_GivePlayerMoney #endif #define GivePlayerMoney GivePlayerMoneyEx Toto slúži na detekciu, či už bola daná funkcia hooknutá. Ak áno, kód by nefungoval a tiež vyhodil warning 201: redefinition of constant/macro (symbol "GivePlayerMoney") Predefinovanie stocku/callbacku warning nehodí, predefinovanie makra/define áno. Kúzlo s "_ALS_" ošetruje práve to, aby bolo možné skombinovať viac hookov. Syntax "_ALS_" je akýsi neoficiálny štandard. Používajú to všetci a tým sa zaručí kompatibilita hookov od rôznych autorov. 4. Hookovanie funkcií Hookovanie funkcií už bolo ukázané, ale dám ešte jeden príklad. // ak je hrac vo vozidle, portne aj vozidlo stock SetPlayerPosEx(playerid, Float:x, Float:y, Float:z, bool:vehicleToo=false) { if (vehicleToo) { if (IsPlayerInAnyVehicle(playerid)) return PortWithVehicle(playerid, x, y, z); else return SetPlayerPos(playerid, x, y, z); } else return SetPlayerPos(playerid, x, y, z); } #if defined _ALS_SetPlayerPos #undef SetPlayerPos #else #define _ALS_SetPlayerPos #endif #define SetPlayerPos SetPlayerPosEx ... public OnPlayerCommandText(playerid, cmdtext[]) { if (!strcmp("/portme", cmdtext)) SetPlayerPos(playerid, 1, 2, 3, true); else if (!strcmp("/oldport", cmdtext)) SetPlayerPos(playerid, 234, 46, 324); } 5. Hookovanie callbackov Hookovanie callbackov prebieha trochu ináč než funkcií. Aj keď kód je skoro rovnaký, na pozadí ide v podstate o opačný proces než u funkcií. public OnPlayerGiveDamage(playerid, damagedid, Float:amount, weaponid, bodypart) { // pouzijeme povodny callback if (IsPlayerAdmin(damagedid)) { // pridame vlastnu funkcionalitu Kick(playerid); } // zavolame nasledujuci hook #if defined MyOnPlayerGiveDamage // moze sa stat, ze neexistuje viac hookov, preto podmienka return CallLocalFunction("MyOnPlayerGiveDamage", "iifii", playerid, damagedid, amount, weaponid, bodypart); #else return 0; // v callbackoch su dolezite spravne return hodnoty #endif } #if defined _ALS_OnPlayerGiveDamage #undef OnPlayerGiveDamage #else #define _ALS_OnPlayerGiveDamage #endif #define OnPlayerGiveDamage MyOnPlayerGiveDamage // premenovanie nasledujuceho callbacku #if defined MyOnPlayerGiveDamage // samozrejme forward forward MyOnPlayerGiveDamage(playerid, damagedid, Float:amount, weaponid, bodypart); #endif V skripte použijeme ten pôvodný callback a "predefinujeme" tie nasledujúce. Syntax "MyOnPlayerGiveDamage" už nie je "štandardizovaná", môžete použiť aj iný názov. 6. Zhrnutie Pri hookovaní v podstate nejde o ten kód, ako o to pochopiť čo robí preprocesor na pozadí. Ak ste si všetky kódy pozreli a porozmýšlali nad nimi, mali by ste tomu rozumieť. Či do toho "vidíte skrz na skrz" si môžete skúsiť odpovedaním na tieto dve bonusové otázky: 1.) V prípade, že je 10 skriptov čo hookujú nejakú funkciu a môj skript ju hookol prvý, koľká v poradí sa vykoná funkcia z môjho skriptu? 2.) V prípade, že je 10 skriptov čo hookujú nejaký callback a môj skript ho hookol prvý, koľký v poradí sa vykoná callback z môjho skriptu? Ak máte otázky/vylepšenia, pokojne sem s nimi.
  4. Scydo

    script Dynamic GroupSystem

    DYMAMIC GROUPS SYSTEM není potřeba žádný jiný include! VÝHODA Zdravím vás u include z nacistické dílny. Největší výhoda je, že include nemá řádné zásadní možné zpracování(například ukládání údajů). Uživatel tak má naprostý přehled, nemusí se vrtat v několika funkcích o desítkách parametrů, takže může kreativně vytvářet spousty systémů, jak AdminSystém či VipSystém. SEZNAM FUNKCÍ IsGroupExist GetGroupID GetFreeGroup GetGroupCount GetGroupIdef GetGroupName GetGroupObjName GroupInConsoleCheck CreateGroup SetPlayerGroup SetMainGroup bool:GetPlayerGroup RemovePlayerGroup GetPlayerGroupEx VYSVĚTLENÍ FUNKCÍ CreateGroup Parametry (sGroup[], sObjName[], Idef) Základní funkce. Vytváří skupinu. Nejdůležitější pro uživatele je parametr sGroup. Pracuje se s ním stejně jako s id, akorát slovně. Parametr sObjName značí jméno pak ve hře. Idef je spíše jen číslo, ale může se brát i jako level či pořadí. Použití: public OnFilterScriptInit() { CreateGroup("vip", "{FFFF00}VIP", 1); CreateGroup("premium", "{00FF00}Premium", 1); CreateGroup("helper", "{0000FF}Pomocník", 2); CreateGroup("admins", "{FF0000}Administrátor", 3); return 1; } GetGroupID Parametry (sGroup[]) Systémová funkce - Zjistí ID skupiny a vrátí jí. Pokud jí nenajde, vrátí -1. Použití: public OnFilterScriptInit() { /* Globál = id 0 */ CreateGroup("vip", "{FFFF00}VIP", 1); /* VIP = id 1 */ CreateGroup("premium", "{00FF00}Premium", 1); /* Premium = id 2 */ new premium_id = GetGroupID("premium"); /* Vrátí 2 */ GetFreeGroup Parametry (Žádne parametry) Systémová funkce - Zjistí ID volného slotu pro skupinu a vrátí jí. Použití: new freeid = GetFreeGroup(); /* Vrátí 1 */ CreateGroup("vip", "{FFFF00}VIP", 1); CreateGroup("premium", "{00FF00}Premium", 2); new freeid2 = GetFreeGroup(); /* Vrátí 3 */ GetGroupCount Parametry (Žádne parametry) Systémová funkce - Zjistí počet uživatelem vytvořených skupin a vrátí tento počet. Použití: CreateGroup("vip", "{FFFF00}VIP", 1); CreateGroup("premium", "{00FF00}Premium", 1); CreateGroup("helper", "{0000FF}Pomocník", 2); CreateGroup("admins", "{FF0000}Administrátor", 3); new count = GetGroupCount(); /* Vrátí 4 */ GroupInConsoleCheck Parametry (Žádne parametry) Použití: IsGroupExist Parametry (sGroup[]) Zjistí, zda daná skupina existuje. Jesltiže ano, vrátí true, jinak vrátí false. Použití: if (IsGroupExist("admins")) print("Admine existuji !"); GetGroupName Parametry (iGroup_ID) Vrátí zjištěné jméno skupiny z id. Použití: public OnFilterScriptInit() { CreateGroup("skupina1", "Skupina1", 0); CreateGroup("skupina2", "Skupina2", 0); new grpid = GetGroupName(2); /* Vrátí "skupina2" */ SetMainGroup Parametry (sGroup[], sObjName[]) Podobně jako CreateGroup, akorát nastaví globální/hlavní skupinu, kterou bude mít defaultně každý hráč. Použití: public OnFilterScriptInit() { SetMainGroup("players", "Hráč"); GetGroupIdef Parametry (sGroup[]) Vrátí idef číslo dané skupiny. Použití: CreateGroup("admins", "Admins", 3); new sString[34 + 1]; format(sString, sizeof(sString), "Administrátoři mají nyní level %i", GetGroupIdef("admins")); SendClientMessage(playerid, -1, sString); /* Administrátoři mají nyní level 3 */ GetGroupObjName Parametry (sGroup[]) Vrátí jméno ve hře dané skupiny. Použití: CreateGroup("admins", "Admins", 3); new sString[20 + 1]; format(sString, sizeof(sString), "%s má level %i", GetGroupObjName("admins"), GetGroupIdef("admins")); SendClientMessage(playerid, -1, sString); /* Admins mají nyní level 3 */ SetPlayerGroup Parametry (playerid, sGroup[]) Nastaví hráči danou skupinu. Použití: public OnFilterScriptInit() { CreateGroup("vip", "{FFFF00}VIP", 1); return 1; } public OnPlayerSpawn(playerid) { if (Zazrak[playerid]) SetPlayerGroup(playerid, "vip"); return 1; } GetPlayerGroup Parametry (playerid, sGroup[]) Zjistí zda hráč je v dané skupině. Jestliže je, vrátí true, jinak vrátí false Použití public OnFilterScriptInit() { CreateGroup("admins", "{FF0000}Admins", 1); return 1; CMD:hp(playerid, params[]) { if (!GetPlayerGroup(playerid, "admins")) return SendClientMessage(playerid, -1, "Nemáš dostatečné oprávnění !"); GetPlayerGroupEx Parametry (playerid) Vrátí id skupiny, ve které se hráč nachází. RemovePlayerGroup Parametry (playerid) Odstraní skupinu danému hráči. Použití RemovePlayerGroup(playerid, "admins"); UKÁZKY NĚKOLIK UKÁZEK POUŽITÍ JEDNODUCHÉ NASTAVENÍ SKUPIN VE HŘE JEDNODUCHÁ KONTROLA SKUPINY/IDEFU HRÁČE TITUL V CHATĚ PRO VŠECHNY HRÁČE TITUL VŠECH SKUPIN V CHATĚ JEDNODUCHÝ VIP SYSTÉM DOWNLOAD Stačí include vložit do složky pawno/include Pawno Pastebin Enjoy.
  5. rEf

    script Duel Systém 0.1

    Už mě nebaví cokoliv rozvíjet sám tak některé scripty použitelnější zveřejním. Duel System 0.1 (je to includ) Oč se jedná? Je to takový menší systém splácán jak se říká na koleně během dne. Můžete si vybrat částku kterou získá výherce, mapu a hlavní zbraň. Nedělal jsem do toho možnost nastavovat skóre takže to je nastavené na 1x15. Rád bych upozornil že: a) IMsg je jednoduchý textdraw box můžete nahradit jakoukoliv jinou zprávou. Player[playerid][in_duel] je ošetření samozřejmě si budete muset pro svůj mod udělat své aby nemohl v duelu využívat třeba určité příkazy co nechcete atd... c) Vše ohledně funkce dání zbraně, peněz po případě resetování a zjištění je taktéž vlastní stačí umazat _ před a mělo by to být stejné. Víc nevím co k tomu říct... Pastebin: http://pastebin.com/FFu1vNMV (určitě počítejte s tím že si budete muset dohledat pro zájemce využití funkce zcmd, stock na vzdálenost, jméno hráče ... nebo upravit a ošetřit nějaké věci) Komu se to hodí okey, komu ne... Nijak mě to ani nezajímá. (prosím prosím nesmát se moje angličtina a gramatika která je level -1) S pozdravem Ref.
  6. Scydo

    script [INC][SbA] Porty

    SHORT BUT ADVANCED PORTY Jde o takovou sérii includů, které mají nějaký jednoduchý základ nebo jsou velice často publikované, ale budou jednoduše zpracované(nemenší možný počet řádků, dobrá optimalizace, výborná přehlednost aj.) s nějakým zajímavým doplňkem, bez použití jiného includu než a_samp. Stardartní porty jsou velice často zpracované ve formě scriptu, tak, že se nachází v callbacku OnPlayerCommandText a s příkazy /setport /port a /delport. Já se to rozhodl zpracovat ve formě includu, takže s tím může uživatel jednoduše pracovat a aby to nebylo málo, lze povolit(založit/spustit) více portů najednou. Zde je seznam fcí, které obsahuje tento includ: SetGlobalLocation() - Hlavní fce. Uloží pozice daného port(id) a zpřístupní ho všem. RemoveGlobalLocation() - Zruší možnost warpnut se na daný port(id). SetPlayerPortID() - Warpne hráče/hráče včetně vozidla na daný port(id). IsPortEnabled() - Zjistí, zda je daný port(id) zpřístupněn. ArePortsEnabled() - Zjistí, zda jsou všechny port(id) zpřístupněny. GetFreePortID() - Zjistí nejbližší port(id), které je zpřístupněné. SetGlobalLocation Parametry: (iPortID, bool:bVehicles, Float:fXpos, Float:fYpos, Float:fZpos) iPortID - ID daného portu. bVehicles - Povolit(true) či zakázat(false) hráčům se portou i s vozidlem. fXpos - X-ová pozice portu. fYpos - Y-nová pozice portu. fZpos - Z-tová pozice portu. Return: Tato funkce nevrací nic zvláštního. RemoveGlobalLocation Parametry: (iPortID) iPortID - ID daného portu. Return: Tato funkce nevrací nic zvláštního. SetPlayerPortID Parametry: (playerid, iPortID) playerid - ID hráče, kterého má warpnout. iPortID - ID daného portu. Return: Dle fcí(SetPlayerPos či SetVehiclePos). IsPortEnabled Parametry: (iPortID) iPortID - ID daného portu.. Return: Proměnná s hodnotou true či false. ArePortsEnabled Parametry: Neobsahuje žádné parametry. Return: true - v případě, že je jen jediný z portů(id) zpřístupněn. false - v případě, že žádný z portů(id) není zpřístupněn. GetFreePortID Parametry: Neobsahuje žádné parametry. Return: PortID - v případě, že nalezne neblížší zpřístupněné port(id). -1 - vrátí, jestli-že nenajde. Jelikož jsou zpracovaný jen jako ve formě hodnot a ne jako již "před připraveného scriptu", lze s nimi vytvořit několik způsobů port systémů. Například si můžete zvolit jen jediný port(id) a s nim pracovat jako u normálních častých scriptů: A nebo tedy si udělat systém, kde bude možno se portout na více portů: DOWNLOAD Pawno.cz Pastebin
  7. 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í.
  8. ĐaVe

    script [inc] DaVe Job System

    Přátelé, plánoval jsem se vrátit k pawnu, ale prdím na to chtěl jsem udělat mód RP, začal jsem tímhle scriptem, jelikož jsem se na mód vykašlal a dělat jej nebudu, tak vám odevzdávám svůj include... takže... Job system include = include pro tvorbu zamestnani v sampu Pro vyuziti je treba pridat do publicu: public OnGameModeInit() { DJS_OnGameModeInit(); } public OnPlayerPickupPickup(playerid,pickupid) { DJS_OnPlayerPickupPickup(playerid,pickupid); } public OnPlayerSelectedMenuRow(playerid, row) { DJS_OnPlayerSelectedMenuRow(playerid, row); } public OnPlayerConnect(playerid) { DJS_OnPlayerConnect(playerid) } Funkce pro pridani penez hraci: GivePlayerJobCashForGet(playerid,cash) Funkce,která odebere hráči job: DeletePlayerJob(playerid); Nezapomeňte, až v módu budete dělat ukládání zahrnout i uložení: JobNahranoMinut[playerid][MAX_JOBS] //je třeba uložit a načíst všechny MAX_JOBS po odpojení hráče a po připojení JobID[playerid] Vyplata[playerid][MAX_JOBS] //je třeba uložit a načíst všechny MAX_JOBS po odpojení hráče a po připojení Nezapomente definovat MAX_JOBS na svůj využitý počet: #define MAX_JOBS 50 //přímo v includu Pro kontrolu hráčového jobu využijte: if(PlayerJob(playerid,==,14) ) A samozřejmě nezapomeňte nahoru do módu: #include <DJS> Vzhledem k tomu, ze planovany projekt nebyl zhotoven, tak vam tento include davam, s pozdravem DaVe //EDIT: include otestován, opravené chyby scriptu, znovu nahráno a upravené linky pastebin a download DOWNLOAD PASTEBIN
  9. Dobrý den. Našel jsem zde toto téma: http://pawno.cz/topic/51795-obr%C3%A1zek/?hl=%2Bsamp+%2Bobr%C3%A1zky Funkčnost jsem jaksi rozjel, ale když jsem chtěl vložit include do pawna, zobrazilo se mi těchto 26 errorů: Nevíte prosím někdo, jak to vyřešit? Tu cestu tam mám špatně (to vím) ale vůbec nevím jak se tento problém řeší. Díky za odpově'd, Marek.
  10. Čau, hledám tento include Opravení chybného pickupid Jestli ho někdo ještě má?
  11. CoMmanD Time Limit System v1.3 FQ Edition Zdravím , už ani sa nepamätám kedy som niekedy naposledy zverejňoval niečo z mojich scriptov,ale tak čo už na všetko raz musí prísť čas. Chcem sa s vami podeliť o môj include ktorý vznikol na základe obmedzovania príkazov v mojom FUN_System-e ktorý "niečo podobné" obsahoval už v roku 2012. Neviem či už niekedy niekto robil podobný include nakoľko ja žiadne pwn fóra od roku 2011-2012 ani nesledujem. Čo dokáže tento include ? - Časovo obmedziť hociaký príkaz - Odpočítáva čas v minutách a sekundách do konca limitu - Vypisuje zvyšný čas v minutách a v sekundách - Upozorní vás keď skončil časový limit Koľko riadkov zabere tento include pri použití na jeden príkaz ? - Len 2 ! Ukážka použitia : dcmd_vasprikaz(playerid,params[]) { #pragma unused params if(GetPVarInt(playerid,"PlayerCMDLimit[0]") == 1) return UCMDLFP(playerid,2,0,"/vasprikaz",0,0); //Pošle správu so zvyšným časom //Sem pridať funckiu príkazu. Napríklad oprava vozidla a podobne. UCMDLFP(playerid,1,0,"/vasprikaz",1,30); //nastaví limit pre príkaz //UseCommandLimitForPlayer(playerid,FunctionID,CMDLimitID,CMDName[],Minutes,Seconds) - neskrátený názov stocku return 1; } public OnPlayerDisconnect(playerid) { //NullCommandLimitForPlayer(playerid); - Vynuluje všetky časové limity na príkazy a povolí ich pre daného hráča. - neskrátený názov stocku NullCMDLFP(playerid); return 1; } - Texty a farby správ môžete upraviť v CMDTLS.inc #define MessageString "[ ! ] {FFFFFF}Príkaz {00FF00}%s {FFFFFF}môžeš znova použiť za : {00FF00}%d {FFFFFF}min {00FF00}%d {FFFFFF}s !" #define Message2String "[ ! ] {FFFFFF}Príkaz {00FF00}%s {FFFFFF}môžeš znova použiť !" Screen : Podrobný návod na použitie nájdete po rozbalení stiahnutého .rar súboru ! Download : http://pawno.cz/files/file/360-command-time-limit-system/
  12. Statistics v1.0.1 Úvod: Napsal jsem jednoduchou knihovnu pro zavedení statistik do hry. Je to psané pro širokou škálu lidí, takže jsem v tvorbě koukal na univerzálnost. Pro využití je zapotřebí pouze jednoho SQLite souboru ve složce scriptfiles, který si include sám vytvoří, jakmile bude použit. Hráči je přiřazováno unikátní ID, které slouží pro zavedení statistik. Toto ID je generováno na herní přezdívku. Nebudu protahovat a tady uvedu jednoduché příklady implementace: Implementace: nahoru do .pwn #include <stats> do OnGameModeInit() případně OnFilterScriptInit() uvedeme následující: statsInit("stats.sqlite"); statsBeginTransaction(); // Začne transakci - vykoná všechny query najednou. V tomto případě registraci všech názvů statistik. SetStatName(1, "Připojení"); SetStatName(2, "Nastoupení do vozu"); SetStatName(3, "nejvyšší rychlost"); statsCommit(); // Ukončení transakce a potvrzení. Jedná se o inicializaci, takže by se měla dodržet konvence o "very first", tedy jako první pokud možno. Poté je potřeba ošetřit zavření databáze. To učiníme v OnGameModeExit() případně OnFilterScriptExit() .. statsExit(); Pak už se dá jen jednoduše pracovat. Include využívá hojně PlayerVariables a to s prefixem stats_. Do těchto proměnných si ukládá Cache. Cache slouží k tomu, aby se redukovali co nejvíce režijní náklady na databázi. Soubor funkcí: Funkce, které include obsahuje: native queryLog(bool:state); // slouží k printu dotazů na databázi do server_log.log native statsInit(name[]); // inicializace statistik native statsExit(); // odhlášení od statistik native GetStatName(statid); // returns string[] native SetStatName(statid, name[]); // returns true/false native IsPlayerUniqueStatsIDAssigned(playerid); // returns true/false native AssignPlayerUniqueStatsID(playerid); // returns (int)uniqueID native GetPlayerUniqueStatsID(playerid); // returns (int)uniqueID native SetPlayerIntegerStat(playerid, statid, value); //returns true/false native GetPlayerIntegerStat(playerid, statid); //returns (int)value native SetPlayerFloatStat(playerid, statid, Float:value); //returns true/false native Float:GetPlayerFloatStat(playerid, statid); //returns (float)value Využití: Ukázka z práce tímto includem může být následující: public OnPlayerConnect(playerid){ AssignPlayerUniqueStatsID(playerid); // Zajistíme unikátní ID pro statistiky hráči. new connections = GetPlayerIntegerStat(playerid, 1); // Zjistíme hodnotu statistiky. SetPlayerIntegerStat(playerid, 1, connections+1); // Nastavíme novou hodnotu } public OnPlayerEnterVehicle(playerid, vehicleid, ispassenger) { new enters = GetPlayerIntegerStat(playerid, 2); // Zjistíme hodnotu statistiky. SetPlayerIntegerStat(playerid, 2, enters+1); // Nastavíme novou hodnotu return 1; } public OnPlayerUpdate(playerid) { if(IsPlayerInAnyVehicle(playerid)) { new vehicleid = GetPlayerVehicleID(playerid); new Float:currentspeed = GetVehicleSpeed(vehicleid); new Float:maxspeed = GetPlayerFloatStat(playerid, 3); if(currentspeed>maxspeed) SetPlayerFloatStat(playerid, 3, currentspeed); } } https://github.com/Xchos/samp V případě chyb mne prosím kontaktujte pomocí emailu uvedeném v souboru stats.inc a já se je pokusím odstranit. Případné dotazy můžete také pokládat přímo do emailu. Poprosím všechny, co se tuto knihovnu rozhodnou využít aby mě zanechali jako autora tohoto scriptu. Děkuji!
  13. Zdravim. Před nějakou dobou sem pro vlastní potřebu vytvořil tenhle systém na checkpointy a řekl sem si že se o něj podělim. Je to trochu prasácky napsaný, ale funguje to tak jak má. Když budete chtít tak si to optimalizujte dle svých potřeb. Pastebin: http://pastebin.com/1FJvSFJ5 uložit do includes jako MCPS.inc Implementace: potřebujete object streamer plugin, presneji tento http://forum.sa-mp.com/showthread.php?t=102865 pod #include <streamer> si dejte #include <MCPS> do OnPlayerConnect: MCP_PlayerInit(playerid); do OnPlayerDisconnect: MCP_PlayerExit(playerid); Funkce: CreateMCP(playerid, scpid, Float:x, Float:y, Float:z, worldid = -1, interiorid = -1) playerid - ID hráče pro kterýho bude CP viditelnej scpid - specificky ID který si vymyslíte (jako u dialogu), pouze nepoužívejte 0, to je definováno jako INVALID_MCP Float:x - pozice X Float:y - pozice Y Float:z - pozice Z worldid - VirtualWorld ve kterym bude CP viditelněj (defaultně nastaveno -1 pro všechny VW) interiorid - ID interieru ve kterym bude CP viditelnej (defaultně nastaveno -1 pro všechny interiery) DestroyMCP(playerid, scpid) playerid - id hráče kterému chcete odstanit CP scpid - ID které jste nastavili při vytváření Callbacks: MCP_OnPlayerEnterCP(playerid, cpid) -spustí se pokud se hráč zastaví v CP (kontroluje se zda má hrác Velocity 0.0 na všechny osy) MCP_OnPlayerExitCP(playerid, cpid) - spustí se pokud hráč vyleze z CP Další informace: - vytvořený CP vypadá jako klasický malý CP ale je žlutej - informace o CP se uklájí pod ID hráče, takže můžete vytvořit dvoum hráčům CP se stejným ID, ale každý ho může mít jinde -nestane se vám jako třeba u pickupu, že vlezete na pickup, otevře se vám dialog, vy ho zavřete a on se hnedka znova otevře. pro znovuotevření je zapotřebí CP opustit a vlést do něj znova - přednastavené maximum CP je 50 pro každého hráče - můžete mít klidně všech 50 CP vedle sebe a všechny je uvidíte Třeba se to někomu bude hoditi
  14. v pawnu som zacatecnik a potrebujem prevest Easy QWER House System z pwn do amx ale nejde mi tio protoze to hlasi C:\Users\ACER\Downloads\HouseSystem.pwn(21) : fatal error 100: cannot read from file: "DOF2.pwn"
  15. play

    script Povolání

    Povolání v 1.2 Vytvořte si jednoduše povolání do svého módu. Vložte filterscript do svého módu, zajděte si na server na místa kde chcete mít povolání a pomocí pár příkazů si ho vytvořte. Můžete maximálně vytvořit 256 povolání Co můžete vytvořit? -Pozici Pickup -Typ Pickup -Zbraně/munici -Skin -Spawn pozici Příkazy: - /create - /savep - /next - /pickup povolání potom jednoduše vložíte do svého módu pomocí includ a příkazu který vložíte do OnGameModeInit Stažení a návod naleznete zde => http://pawno.cz/files/file/197-povol%C3%A1n%C3%AD/ Aktualizace 16.12.2013 Postupně sem budu vkládat návody na povolání Vytvoření jednoduchého příkazu zapněte pawno a klikněte na "new" vytvořte si povolání podle návodu (buď na adrese nebo přímo v souboru Readme.txt) Pozici,barvu a zbraně si nastavte podle sebe. Ukládaní je do scriptfiles/povolani.txt Takto by měl vypadat nějak váš mód: Nyní si najděte OnPlayerCommandText a upravte na Toto je jednoduchý příkaz když hráč napíše /pomoc tak všem policistům to napíše text.
  16. 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:
  17. Mate objekty ktore su mimo SA a niesu vydno? Tento Include pomoze... Hlavnym trikom includu je to, ze objekty vydnu iba vtedy, iba ak ich hrac vydel a nebol vo vozidle.. To prave tento script robi.. Po spawnuti alebo pawnerom vybranej akcii sa zacnu nacitavat objekty(teda bude chodit po poziciach aby sa tie mapy nacitali), a potom ked bude hrac vo vozidle tak sa zviditelnia.. Include ma 2 funkcie: CreateFixedObject(id,float:x,float:y,float:z,float:rx,float:ry,float:rz,float:dd = 0.0); //Vracia klasicku hodnotu Create Object, takze vsetko funguje tak ako ma FixObjects(playerid); //Zacnu sa opravovat objekty Download: objectfixer.zip Do buducnosti: -Moznost nacitat viac krat objekty -Zrusit tento inc kvoli tomu ze to kalcor fixne
×
×
  • Create New...