Jump to content

vEnd

Hlavní moderátor
  • Příspěvků

    772
  • Registrován

  • Aktivní

  • Vítězných dnů

    60

Everything posted by vEnd

  1. Závodní systém (Lukasz & vEnd) Zdravím, je to už nějakou dobu, co s Lukaszem pracujeme na společném (filé)scriptu. Už název napovídá, že jde o závodní systém. Dynamický závodní systém, který umožňuje vytvářet závodní tratě s vlastní konfigurací a různými možnostmi navíc. Závody lze pojmenovat a uložit do souboru, pak je každý (dle oprávnění) může načíst a hráči se v nich mohou navzájem utkat. Jak k tomu došlo Ten nápad mne nenapadl jen tak. Někteří z vás třeba ještě znají závodní script od pawnera Yagu. V minulosti jsem se s ním často setkával a už tehdy jsem si říkal, že bych rád vytvořil něco na tento styl, akorát lepší. Tehdy jsem ještě do scriptování moc nedělal, ale od té doby se leccos změnilo, že jo. Abych na to nebyl sám (protože takhle mi často dochází motivace po pár hodinách) a protože jsme o společném projektu uvažovali už dříve, požádal jsem Lukasze, zda by se toho také nechtěl účastnit. A on že klidně. Abyste to správně pochopili, nejedná se o předělávku výše zmíněného scriptu! Veškerý kód je čistě náš. A to myslím doslova – žádné sscanf, YSI, cizí cmd nebo file systémy. Co bude systém obsahovat Princip jeho fungování jsem nakousl už výš, teď na co všechno se můžete těšit: – vytváření a načítání závodních tratí (pro jistotu ještě jednou pro obzvlášť pomalé); – různé stupně oprávnění pro správu závodu; – konfigurace každé tratě (systém odměn, nastavení nitra a kolize, povolená vozidla atd.); – doplňující možnosti (stavění objektů do trati, různé módy závodu atd.); – TOP 10 nejrychlejších časů pro každou trať; – dynamické přidávání checkpointů a možná pozdější úprava tratě; – závodění mezi hráči (no shit, vEnd...) s určením jejich pozice v závodu a různé odměny pro vítěze. To si myslím jako motivace stačí. Jak budeme postupovat ve vývoji, přidám nějaké další informace a možná i obrázky. Co už máme – aktivace/deaktivace režimu stavby; – konfigurace závodů; – uložení a načtení závodu; – připojení do závodu; – průběh závodu, určení pořadí závodníků pro standardní mód (pracujeme na dalších); Kdy to vyjde aneb naše pracovní nasazení Přesné ani orientační datum Vám teď neřeknu, protože se s Lukaszem zásadně držíme hesla dělej, jen když se ti chce. Na podzim by to ale být mohlo, když nám to naše prokrastinace dovolí. Momentální stav Barvičkami a procenty se to vyjadřuje nejlépe. 60 %. To je vše, díky za přečtení. - Lukasz & vEnd
  2. vEnd

    ostatní Poplatky za poplatky ?

    S tím, že to neprojde, bych i souhlasil (ačkoliv tady člověk nikdy neví), ale to, že by ses nedoplatil, je nesmysl. Jednak jsem si něco přečetl a podle toho Oplatky za flash disky už dávno jsou a jednak sám Ewwe píše, že max. 90 Kč. Když se bavíme o mobilu, tak to máš 90 Kč, to by tě nepřišlo tak draho. Každopádně je to hovadina, co by se v praxi praktikovat neměla, imho.
  3. Obtížnost: Osnova: 1. Úvod 2. Modifikátor(y) 3. const 4. public 5. static 6. stock 7. Závěr 1. Úvod Zdravím Vás u, tentokrát o něco náročnějšího, návodu z oblasti jazyka Pawn. Krátce jsem přerušil svou sérii návodů pro začátečníky a sepsal tento návod, který se týká modifikátorů funkcí a proměnných. Jde se na věc. 2. Modifikátor(y) Začněme s tím, oč vlastně jde. Modifikátor nám představuje nějaké klíčové slovo, které upravuje (modifikuje) vlastnosti funkce/proměnné. Mohou se uvádět samostatně, ale i v kombinaci s jinými modifikátory. V tomto návodu se zaměříme na 4 modifikátory, a to na const, public, static a stock. 3. const Jako první začneme s modifikátorem const. Jeho účel se dá domyslet, je to totiž zkratka pro constant (konstantní), ale aby to bylo jasné – jeho účelem je tvořit tzv. konstantní proměnné, popř. konstantní parametry funkcí. Ano, tento modifikátor se nedá použít u definice funkce. Jeden by si řekl, že pojem "konstantní proměnná" je blbost (vlastně je to oxymóron, ale literární teorii dáme zase jindy). Jak může být proměnná konstantní? No, světě div se, ale může. Takovéto proměnné (nebo poli/řetězci) lze určit hodnotu jen při deklaraci (aneb inicializace). Vypadá to následovně: . new const max = 10; //určili jsme konstantní proměnné "max" hodnotu 10 new const rankNames[3][20+1] = {"Hráč", "Moderátor", "Administrátor"}; //konstantní pole řetězců s názvy hodností . Po tomto už nebudeme moci nikde hodnotu proměnné/pole změnit, kompilátor by nám nahlásil chybu. new před modifikátorem lze vynechat, ale pouze u proměnných, pole/řetězce to vyžadují. Pak jsem také zmínil cosi jako konstantní parametr funkce. Aniž byste to věděli, už jste se s tím setkali, a to u řetězcových funkcí: . strlen(const string[]) //konstantní parametr "string[]" . Zpravidla to vídáme u řetězců, ale lze to aplikovat i na ostatní parametry. A co nám to způsobí? Způsobí to, že daný parametr bude jen pro čtení. To znamená, že ho nelze uvnitř funkce přepisovat. . MyPrint(const a, const { printf("a = %i\nb = %i", a, ; a++; //tento řádek by hodil chybu, "a" je jen pro čtení b = 0; //tento řádek by taky hodil chybu, i "b" je jen pro čtení } . 4. public Dosti zajímavým modifikátorem je public. Ačkoliv jej lze použít i na proměnnou, smysl to má jen u funkcí. S "veřejnými" funkcemi se nejčastěji setkáváme u SA:MP callbacků a časovačů. Na jakém principu ale tyto funkce pracují a co nám přinášejí? Funkce s modifikátorem public SA:MP server volá přímo, proto jsou v AMX souboru zapsány čitelně (narozdíl od běžných funkcí, které mají v AMX zapsány svou adresu). To s sebou přináší velkou výhodu – lze je volat ve všech scriptech i v módu. Když si tedy ve svém módu vytvořím veřejnou funkci, mohu ji zavolat ve scriptech, což mi normální funkce neumožňuje. K tomuto meziscriptovému volání slouží funkce CallRemoteFunction. Nutno ale dodat, že veřejné funkce mají také svá omezení. Ty jsou následující: – každá veřejná funkce musí mít svůj prototyp (klíčové slovo forward); – veřejné funkce nemohou mít parametry s výchozí hodnotou; – veřejné funkce nemohou vracet řetězce. Její využítí spočívá zejména v již zmíněném sdílení mezi scripty. Také ji musíme využít v případě časovačů (SetTimer, SetTimerEx) a SA:MP callbacků (OnPlayerConnect apod.). Definice veřejné funkce vypadá takto: . forward MyPrint(const a, const ; //prototyp veřejné funkce public MyPrint(const a, const //deklarace veřejné funkce { printf("a = %i\nb = %i", a, ; } . 5. static Třetím na řadě je modifikátor static. U tohoto klíčového slova je zajímavé to, že se jeho účel liší u lokální proměnné a u globální proměnné / funkce. U lokální proměnné nám static může nahradit globální proměnnou. Zachovává si totiž svou hodnotu i po ukončení bloku. Názorná ukázka: . MyFunc() { static a; a++; } for(new i; i<3; i++) //3x volám funkci "MyFunc" { MyFunc(); } . Kdybychom proměnnou "a" deklarovali pomocí new, hodnota by se pokaždé vynulovala, jakmile by funkce došla ke konci. Jenže statická proměnná "a" si svou hodnotu zachová i po dokončení funkce, takže její hodnota bude po třech zavoláních 3. Co se týče statické globální proměnné a statické funkce, jejich funkce je odlišná. Když takovou globální proměnnou / funkci deklarujeme, je platná pouze v daném souboru. Co to znamená? Řekněme, že máme knihovnu mylib.inc, kterou připojujeme ke scriptu myscript.pwn. . //mylib.inc new a = 5; MyFunc() print("Hello, world!"); //myscript.pwn #include <mylib> new a = 3; MyFunc() print("Ahoj, světě!"); . Tento kód nám zahlásí chybu, že symbol "a" a "MyFunc" již existuje. Proč? Protože nemůžeme mít stejné identifikátory v knihovně i ve scriptu. Pokud tedy nepoužijeme statickou globální proměnnou / funkci: . //mylib.inc static a = 5; static MyFunc() print("Hello, world!"); //myscript.pwn #include <mylib> new a = 3; MyFunc() print("Ahoj, světě!"); . Teď je vše v pořádku. Proč? Protože jsme v knihovně použili modifikátor static, čímž jsme jazyku sdělili, že tyto názvy jsou platné jen v té knihovně, ve scriptu už ne. Tohle je opravdu šikovná utilitka, která se při tvorbě knihoven hodí. 6. stock A teď se dostáváme k mému favoritovi – k modifikátoru stock. Nevím, proč se to tak ustálilo (asi nadměrným používáním), ale mnozí si ještě dodnes myslí, že stock je synonymum pro funkci. Není, lidi, NENÍ! Jako každý jiný, tak i modifikátor stock má své specifické využití. A toto využití lze aplikovat jak na funkce, tak na proměnné. V čem to tedy je? Když u proměnné/funkce použijeme stock, říkáme tím kompilátoru, aby nám nevyhazoval varování o tom, že funkci nikde nevoláme. Takže, když vytvořím stock proměnnou/funkci a nikde v kódu ji nepoužiji, nebude kompilátor hlásit varování "symbol is never used". To je vše, to je celé kouzlo tohoto modifikátoru. Pro úplnost ještě deklarace: . stock a = 3; //stock proměnná stock MyFunc() //stock funkce { print("Hello, world!"); } . 7. Závěr A tím se dostáváme ke konci. Doufám, že jsem Vás něčemu novému přiučil, o stock a static toho lidé většinou moc neví, tak teď mají možnost se to dozvědět dopodrobna. Jak už bylo zmíněno na začátku, modifikátory lze kombinovat, např. static v kombinaci s const lze najít v některých knihovnách (nejen) od Y_Lesse. Zdá-li se Vám, že jsem něco opomněl, někde jsem se spletl nebo se jen chcete vyjádřit, pište do tohoto tématu. Ověřený návod Tento návod prošel validací, a lze ho proto považovat za ověřený.
  4. Je to tak, jak říká Steam Wallet. Chybí mu tam funkce, nikoliv proměnná, což je poznat i z toho kódu, co dodal. K autorovi: Odkud máš ten kód, ze kterého je ta funkce? Tvé to asi nebude, jinak bys věděl, že tam nic jako AddNemovitost nemáš definováno.
  5. vEnd

    návod #2 Pole [**]

    http://pawno.cz/topic/34984-inicializace-aneb-nastaven%C3%AD-hodnot-v-pol%C3%AD/ Není nutno zmiňovat, je to už tady.
  6. Hodně užitečný návod, dobrá práce. Mám ještě dotaz: Proč %e a co vlastně je %e? Všiml jsem si, že jsi to použil všude, kam se měl dosadit string, je to tedy jakási náhrada za %s?
  7. vEnd

    pomoc NPC SHOOT

    Ahoj, ne, v "moderním" SA:MP je stejné h*vno jako v tom starém. Jediné, co přibylo, jsou tzv. actoři - postavy, co mohou plnit funkci prodejců zbraní, jídla apod. bez toho, aby ti to zabíralo slot (není to regulérní NPC, prostě jen skin).
  8. Globální pravidla 1. Není povoleno vlastnit více než jeden účet. - Máte-li na fóru jiné (neaktivní) účty, ohlaste to moderátorovi. 2. Nesmíte přispívat s obsahem s erotickou, sexuální nebo warez tematikou. - Platí pro textový i multimediální obsah. 3. Není dovolena jakákoli forma reklamy na jiná diskuzní fóra s podobnou tematikou. - Tím je myšlena cílená reklama za účelem zvýšení návštěvnosti. - Odkaz neznamená automaticky reklamu; záleží na situaci a posouzení moderátora. 4. Je zakázáno užívat nepřiměřených vulgarismů, urážek a rasistických výrazů. - Lehké nadávky ("vole" – "jsem blb" atd.), které neuráží jiného uživatele, nebudou trestány varováním. - Přiměřenost užitých vulgarismů a rasistických výrazů vyplývá ze situace a je na posouzení moderátora. Porušení výše uvedených pravidel může být trestáno slovním upozorněním, varováním, odepřením možnosti přispívat, banem na dobu určitou nebo banem na dobu neurčitou (tzv. "perma banem"). Globální pravidla byla naposledy upravena 31. 1. 2018.
  9. vEnd

    ostatní Podvodník CryGame

    Zdravím, rád bych Vás upozornil na jednoho místního uživatele, a to na uživatele CryGame. Tento uživatel si zde před několika dny podal žádost o pawnera. Ozval jsem se mu a přes SZ a Skype jsme se dohodli. Nechal jsem si poslat třetinu jako zálohu, do této chvíle to probíhalo v pořádku. Během dvou dnů jsem dělal to, co po mně chtěl, nascriptoval jsem mu event systém a oznámení přes textdrawy. Dnes jsem mu script poslal a čekal jsem, až mi pošle peníze (PayPal). Platba nedocházela a on říkal různé věci: nejdříve mu nešel PayPal, tak že to pošle bratranec. Nic nepřišlo, tak potom zase říkal, že ozve podpoře a zjistí, co má s účtem. Nakonec z něj vypadlo, že script nevypadá tak, jak si představoval, a že když mu to pomůžu upravit, tak že to nakonec doplatí. Lidi, teď fakt, jak vůl jsem odpovídal na každou jeho žádost o pomoc (na ty, které jsem neodpověděl, jsou tady na fóru). Ve všem jsem mu vyhověl, všechno jsme spolu testovali, na všechno říkal "ok", "yy", "dobre". Pro mě je to akorát jeden z těch, co za práci nehodlají zaplatit. Proto váš všechny před tímto týpkem varuji. Žádný kšeft s ním neuzavírejte, pokud do toho fakt chcete jít, chtějte peníze předem. Vzhledem k tomu, že taková hovada nemám rád, tak vás taky chci požádat, abyste jej ignorovali co se žádostí o pomoc týče. Vše, co jsem chtěl napsat, díky za přečtení. vEnd
  10. Obtížnost: Osnova: 1. Úvod, co je to switch 2. Kdy a jak použít switch 3. Další možnosti case 4. Ukázky použití 5. Závěr 1. Úvod Zdravím Vás u sedmého návodu pro začínající pawnery. Tímto navážeme na minulý návod (přečtěte si ho) a rozebereme si, k čemu slouží switch a kdy jej použít namísto normálních podmínek. Napřed ale co je to ten switch. Switch (česky přepínač) je struktura, která v konkrétním případě nahrazuje soustavu if – else if – else. Jeho účelem je vykonat ten blok, který odpovídá jeho hodnotě. Proto také přepínač, obecně se dá říct, že přepne na blok dané hodnoty. 2. Kdy a jak použít switch Už jsem řekl, že se používá v konkrétním případě. Tím případem je tato soustava podmínek: . new cislo = 2; if(cislo == 1) { //hodnota je 1 } else if(cislo == 2) { //hodnota je 2 } else if(cislo == 3) { //hodnota je 3 } else { //hodnota je jiná } . Pokud v podmínkách porovnáváme takto hodnoty, lze k tomu použít kratší a přehlednější switch. Syntaxe switche je následovná: . switch(cislo) { case 1: { //hodnota je 1 } case 2: { //hodnota je 2 } case 3: { //hodnota je 3 } default: { //hodnota je jiná } } . Do závorek switche jsme dosadili proměnnou, ze které zjišťuje hodnotu. case je klíčové slovo, které nám zde tvoří větev pro konkrétní hodnotu. Jak je vidět, nahrazuje nám else if a podmínku. Na jedno si musíme dát pozor – je potřeba za case a hodnotu uvést dvojtečku. default je bez hodnoty a plní funkci else – provede se vždy, když hodnota neodpovídá žádnému case. Narozdíl od case ale není nutné jej použít. 3. Další možnosti case Switch dokáže pracovat jak s celými čísly, tak se znaky a desetinnými čísly. . case 1: //zápis pro celé číslo case 'a': //zápis pro znak case 3.14: //zápis pro desetinné číslo . Jazyk nám též umožňuje zapsat v jednom case několik hodnot, když je to třeba, stačí je oddělit čárkou. . case 1, 3, 5: //několika celých čísel case 'a', 'b', 'c': //několik znaků case 3.14, 1.4, 8.2: //několik desetinných čísel (tečka je desetinná čárka) . Pro zajímavost (rozklikněte spoiler): . 4. Ukázky použití Před koncem si ještě ukážeme pár příkladů, jak switch používat. Dialogy . Kombinovaný zápis . 5. Závěr Switchem jsme definitivně ukončili téma podmínek. Kromě if, else if a else teď znáte už i switch a víte, kdy a jak ho použít. Poslední varování na závěr: v jiných jazycích (C/C++, C#, Java, Javascript, PHP atd.) se blok case a default ukončuje klíčovým slovem break a neuvádějí se složené závorky. Pro Pawn to prostě neplatí, takže tuto syntaxi si nechte pro ostatní jazyky. Tento návod, stejně jako ty předchozí, je určen pro nováčky, pokročilejší věci byly buďto úplně vynechány, nebo jsou uvedeny ve spoilerech. Přesto, zdá-li se Vám, že jsem něco opomněl, někde jsem se spletl nebo se jen chcete vyjádřit, pište do tohoto tématu. Ověřený návod Tento návod prošel validací, a lze ho proto považovat za ověřený.
  11. vEnd

    pomoc Help

    Uložíš si pro daného hráče a pro daný příkaz čas, kdy ten příkaz použil (funkce gettime) + 60 (1 minuta v sekundách). Pak dáš do daného příkazu podmínku, zda je aktuální čas větší než čas uložený. Pokud je, lhůta už uplynula, pokud není, stále neuběhla minuta.
  12. new names[][20] = {"Europa 2", "Evropa 2", "FunRadio"}; //takhle bys doplnil všechny for(new i; i<sizeof names; i++) { format(str, sizeof str, "%s %s %i\n",str,names[i],Posluchaci[i]); } Takhle nějak. Když už máš počet posluchačů pro každé rádio v poli, proč toho nevyužít a neusnadnit si práci.
  13. Tak jednou pro vždy: pawn neumí spojovat řetězce pomocí plus, tečky, ampersandu nebo jakéhokoliv jiného znaku. Tento arciho kód: Je správný. Řetězec musíš vždy dosadit na začátek dalšího formatu, aby v něm obsah zůstal. Takhle to budeš dělat tak dlouho, dokud tam nebudeš mít všechna rádia. Mé osobní doporučení: Názvy rádií si dej do pole a celé to udělej v cyklu. A pro ostatní, zkuste si ten kód po sobě přečíst nebo ho odzkoušet, než ho sem pošlete. Pak tady akorát vznikají další problémy.
  14. Gratuluji, obnovil jsi 7 let staré téma, abys opravil někoho, kdo tu byl naposledy před třemi lety. Pravidla Zakázáno je psát do témat, u kterých je poslední příspěvek starší 1 měsíce. Zdroj: http://pawno.cz/topic/40416-glob%C3%A1ln%C3%AD-pravidla/ Příště se toho prosím vyvaruj.
  15. Čau, v poslední době jsem si začal všímat jednoho problému - po nějaké době, co mám zaplý notebook (Windows 10), mi přestane fungovat přehrávání online i offline. Zkouším přehrát něco v ntb - nic. Zkouším přehrát něco na YT - nic. Chci si pustit anime z nějakého portálu - nic. Vždy se to zasekne na 0:00 a nechce přehrávat. Restart pomáhá, ale je to otrava. Stejně mám v plánu widle přeinstalovat, ale docela by mne zajímalo, čím by to mohlo být. Má s tím někdo z vás zkušenost?
  16. Díval jsem se na kód, je tam co zlepšovat, ale na to časem přijdeš sám. Pokud sis nechal poradit s DOF2, taky bych ti chtěl dát pár rad: 1. Místo dcmd používej zcmd, práce s ním je jednoduchá, jednodušší jak s dcmd. V tomto návodu máš přesně vysvětleno, jak tvořit příkazy pomocí (i)zcmd. 2. Vytváříš zbytečně velké řetězce. new soubor[256]; /Ucty/Hesla/%s.txt Když za %s dosadíš nejdelší možný nick, což je 24 znaků, bude celková délka 40 znaků, bohatě by tedy stačilo dát jako velikost 41. Samozřejmě si můžeš udělat rezervu (50, 55), ale 255 znaků na to určitě nebudeš potřebovat. Naučit se šetřit s pamětí není na škodu. 3. Chválím tě, že hashuješ hesla, ale dneska už ani nemusíš kvůli tomu přidávat další knihovnu (dudb.inc). SA:MP už má svou funkci na hashování, viz tento návod. To je to hlavní, na co jsem tě chtěl upozornit, zbytek jsou drobnosti.
  17. Zdravím, včera a dnes došlo k reorganizaci návodů. Došlo ke smazání některých sekcí a k přidání nových. Stále platí, že návody musí projít revizí, aby mohly být označeny jako ověřené, a stále platí, že musí být zpracovány dle předlohy. a) Návody V hlavní sekci jsou všechny návody, které se týkají SA:MP funkcí a callbacků. Také jsou zde návody, které vysvětlují, jak něco vytvořit. Příklady: dialogy, textdrawy, cmd systémy, file systémy atd. Základy pawn a Rozšířené znalosti pawn Tyto podsekce sdružují návody, které se týkají přímo jazyka Pawn. V Základech jsou návody pro nováčky, v Rozšířených znalostech návody pro pokročilejší. Příklady pro Základy: proměnná, podmínky, cykly, funkce atd. Příklady pro Rozšířené znalosti: bitová manipulace, pokročilá inicializace polí, ternární operátor, pokročilá práce s řetězcem atd. c) Práce s YSI Podsekce pro návody o knihovně YSI. Příklady: y_ini, y_commands, y_groups, y_va atd. d) Nové návody Podsekce, která slouží k přidávání nových návodů. Pokud chcete založit nový návod, udělejte to zde. Jakmile dojde k ověření moderátorem, bude návod přesunut do příslušné (pod)sekce. e) Neověřené návody V této podsekci je většina dosavadních návodů. Žádný z nich neprošel kontrolou, proto je nemůžeme považovat za ověřené. Nezodpovídáme za pravdivost ani úplnost informací z těchto návodů.
  18. Solidní návod, i já jsem se něčemu přiučil (nikdy jsem nedělal s pluginovou verzí). Ověřeno a přesunuto.
  19. vlastně to bude for(new playerid, max = GetPlayerPoolSize(); playerid max; playerid++). Tohle je asi nejlepší verze, co za těchto podmínek jde.
  20. Ten cyklus v časovači ti to bude zatěžovat rozhodně méně, jak když budeš používat OnPlayerUpdate. Používání tohoto callbacku ti nedoporučuji, pokud je zde jiná alternativa. Opravdu se volá i několikrát za sekundu. Když si cyklus pro všechny hráče správně optimalizuješ (GetPlayerPoolSize zjišťuje největší připojené ID a není problém zjišťovat i to nejmenší připojené), bude to v pohodě.
×
×
  • Create New...