Jump to content

Žebříček


Populární obsah

Showing content with the highest reputation since 17.10.2012 in all areas

  1. 11 points
    PawnPlus 0.8 Stažení | Dokumentace Představuji vám svůj nový plugin, který z Pawnu udělá moderní programovací jazyk, v němž bude radost programovat pro SA-MP. Přidáním nových konstruktů a "typů" rozšiřuje sílu jazyka, ale zachovává a dokonce i navyšuje jednoduchost programování. Shrnutí hlavních funkcí Řetězce Všichni to známe – řetězec je pole znaků s pevnou maximální délkou, kterou vždy musíme znát, pokud chceme s řetězci cokoliv provést. Odteď už ne! PawnPlus přináší dynamickou alokaci řetězců, které lze spojovat, rozdělovat, porovnávat či jinak upravovat. Možná si říkáte, k čemu je to dobré, když funkce SA-MP (např. SendClientMessage) vyžadují předání řetězce jako pole, ale počkejte – jde to! Tento plugin umožní přetvořit jakoukoliv funkci SA-MP (i jiných pluginů) na variantu, která místo polí bere nové řetězce a funguje naprosto stejně. Asynchronní programování Nebojte, žádná vlákna či race-condition, ale lehké asynchronní programování pomocí úloh, jehož vzorem je jazyk C#. Pomocí nového příkazu jazyka lze pozastavit průběh stávající funkce a odložit jeho vykonávání na jakoukoliv jinou dobu a mezitím spustit třeba něco jiného. Již žádné složité používání SetTimerEx, s tímto pluginem lze prostě ve funkci čekat, než nastane žádaná situace, a pak pokračovat. "Reflexe" Pawn sice není natolik pokročilý, aby umožňoval jakoukoliv reflexi, ale v tomto pluginu naleznete i pár funkcí, které umožní např. zavolat nativní funkci pomocí jejího jména jako řetězce, či navázání libovolné funkce na konkrétní událost serveru. Příklady Vytvoření, spojení a předání řetězců #include "PawnPlus.inc" //Původní SendClientMessageToAll(color, const message[]) upravíme tak, že všechny "const x[]" nahradíme "AmxString:x". native SendClientMessageToAllStr(color, AmxString:message) = SendClientMessageToAll; //Pomocná funkce vytvářející řetězec (jehož maximální velikost známe). stock String:GetPlayerNameStr(playerid) { new name[MAX_PLAYER_NAME]; GetPlayerName(playerid, name, sizeof(name)); return str_new(name); } public OnPlayerConnect(playerid) { //Řetězce jsou reprezentované proměnnými se značkou "String". Lze je spojovat pomocí operátoru +. Funkce str_val umí převést libovolnou hodnotu na řetězec. new String:name = GetPlayerNameStr(playerid); new String:msg = str_new("Hráč ")+name+str_new(" (")+str_val(playerid)+str_new(") se připojil na server."); //Provede se zavolání funkce SendClientMessageToAll, jen místo druhého parametru se vezme dynamický řetězec namísto pole znaků. SendClientMessageToAllStr(-1, msg); } Rozdělení a porovnání řetězce //Obdobným způsobem upravena funkce SendClientMessage. native SendClientMessageStr(playerid, color, AmxString:message) = SendClientMessage; public OnPlayerCommandText(playerid, cmdtext[]) { new String:cmd = str_new(cmdtext); new String:name = cmd; new String:args = STRING_NULL; //Cyklus nalezne v řetězci mezeru a rozdělí jej na jméno a argumenty. new len = str_len(cmd); for(new i = 0; i < len; i++) { if(str_getc(cmd, i) == ' ') { name = str_sub(cmd, 0, i); args = str_sub(cmd, i+1); break; } } //Porovnání jména příkazu. if(name == str_new("/test")) { SendClientMessageStr(playerid, -1, args); //Vypsání argumentů. return true; } return false; } str_find a str_split bude v pozdější verzi. Pozastavení vykonávání funkce stock Odpocet() { SendClientMessageToAll(-1, "3"); wait_ms(1000); //Neblokující čekání (žádný cyklus). SendClientMessageToAll(-1, "2"); wait_ms(1000); SendClientMessageToAll(-1, "1"); wait_ms(1000); SendClientMessageToAll(-1, "0"); } //Poznámka: Čekání zablokuje vykonávání kódu až do nejbližší (externě vyvolané) funkce public. Pokud chcete, aby vnější kód pokračoval rovnou, použije CallLocalFunction. Čekání na libovolnou událost //Předělání funkce MoveObject tak, aby vracela úlohu, na niž lze "čekat" (tedy dokončení hýbání s objektem). stock task:MoveObjectTask(objectid, Float:X, Float:Y, Float:Z, Float:Speed, Float:RotX = -1000.0, Float:RotY = -1000.0, Float:RotZ = -1000.0) { //Úloha představuje abstraktní proces, který lze dokončit a jehož výsledkem může být nějaká hodnota. //task_new vytvoří novou prázdnou (nedokončenou) úlohu. new task:t = task_new(); //Zaregistruje novou "obsluhu" pro callback OnObjectMoved. Veřejná funkce SingleFireObjectTask se zavolá pokaždé, //kdy by se měla zavolat funkce OnObjectMoved a navíc se jí předá několik argumentů navíc. //specifikátor "e" značí předání ID nově vytvořeného objektu (to funkce pawn_register_callback i vrací). pawn_register_callback(#OnObjectMoved, #SingleFireObjectTask, "edd", t, objectid); MoveObject(objectid, X, Y, Z, Speed, RotX, RotY, RotZ); return t; } stock ObjectTest() { new obj = CreateObject(19300, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0); print("Object created!"); //Proběhne čekání na úlohu; zbytek kódu se vykoná, až skončí. await MoveObjectTask(obj, 0.0, 0.0, 10.0, 5.0); print("Object moved!"); } //Nová obsluha události OnObjectMoved má navíc tři parametry (na začátku), jejichž hodnotu lze určit //v pawn_register_callback. Zbytek parametrů je z OnObjectMoved. forward SingleFireObjectTask(callback:id, task:task, obj, objectid); public SingleFireObjectTask(callback:id, task:task, obj, objectid) { if(obj == objectid) { //Pokud se pohnul objekt, na nějž je zaregistrovaná tato obsluha (uloženo v parametru obj), obsluha se odregistruje pawn_unregister_callback(id); //a úloha, která k ní náleží, je nastavena na hotovou (s nějakým výsledkem). task_set_result(task, objectid); } } Technické informace Jak to celé funguje? Technologie, na které celý tento plugin staví, se nazývá hookování. Hookování principiálně umožňuje přepsat kód nějaké funkce vlastním kódem, který se spustí místo něj. Díky patří Zeexovi za jeho knihovnu subhook. Tak například každá nativní funkce, která bere řetězce, používá funkci amx_GetAddr z API AMX. Tato funkce očekává adresu nějaké proměnné uvnitř stroje AMX a vrací ukazatel, který na ni ukazuje (to lze zapsat jako DAT+addr, kde DAT je ukazatel na počátek datové sekce stroje AMX, jenž lze získat z takto pojmenovaného registru). Tato funkce se musí zavolat vždy, když v Pawnu předáváme nějakou adresu (výstupní proměnné či pole) a na hookování je tedy ideální. Pokud AMX zjistí, že addr neukazuje dovnitř datové sekce, vrátí chybu, a pak přichází na scénu nový kód pluginu, který místo vrácení chyby interpretuje adresu jako (nějaký) identifikátor dynamicky alokovaného řetězce a ukazatel na jeho znaková data úspěšně vrátí. Tak se navenek každé funkci jeví předaný argument jako správný, ale když dojde na získání ukazatele, namísto dovnitř AMX ukazuje vrácené číslo na data pluginu. Zbývá maličkost, tedy zařídit, že addr bude pro dynamické řetězce ukazovat vždy do paměti, která je mimo AMX (sice to téměř jisté, ale nikoliv zaručené). Zde se uplatňuje vlastní tag AmxString, za nímž stojí funkce str_addr. Ta z ukazatele na řetězec spočítá relativní ofset vůči datové sekci stroje AMX, takže pro ukazatele mimo datovou sekci bude vytvořené číslo vždy chybné pro normální funkci amx_GetAddr. Funkce amx_Exec se zase volá vždy, když chce server spustit kód v AMX. AMX samotné podporuje předčasné ukončení vykonávání funkce pomocí vyvolání chyby a jedna taková chyba je i AMX_ERR_SLEEP (lze ji vykonat příkazem sleep v Pawnu), která značí, že se kód může obnovit. Jelikož hookuji každé volání amx_Exec, mohu to okamžitě zjistit a průběh vykonávání obnovit, aniž by o tom byl informován server. Zbývá vyřešit jediný problém – uložený obnovovací stav AMX je jen jeden a při jiném volání se zruší. Proto si plugin ukládá veškerou dynamickou paměť AMX (halda a zásobník) a registry k sobě, jakmile je výkon funkce pozastaven, aby nedošlo ke ztrátě. Při obnově je potom paměť AMX dočasně vrácena do původního stavu a spouštění původní funkce se obnoví. Funkce pawn_register_callback funguje pomocí hookování amx_Exec a amx_FindPublic, jež se zavolá vždy, když je třeba zjistit index veřejné funkce v AMX. Pokud je na název callbacku registrována nějaká obsluha, místo skutečného indexu se vrátí záporný index, který je následně identifikován v amx_Exec, která napřed vykoná příslušné obsluhy zjištěné z tohoto indexu. Řetězce a garbage collection Jak známo, každá dynamická alokace musí mít svoji dealokaci, jinak by začala unikat paměť, ale tady jsem si vesele používal str_new a žádnou dealokaci jsem neřešil, ačkoliv použitá paměť byla nová. Jak je to možné? Řetězce mají svůj vlastní garbage collector, který se stará o jejich mazání. Ve skutečnosti existují dva druhy řetězců – lokální (dočasné) a globální. Lokální řetězce jsou jejich nejčastější typ (String) a jejich existence je omezena po dobu výkonu nejvyššího callbacku. Je-li např. do skriptu vstoupeno callbackem OnPlayerConnected, všechny nové lokální řetězce existují po celý běh této veřejné funkce a jakmile ta skončí, smažou se. Pozor! – jakmile funkce skončí, použití jejích lokálních řetězců způsobí pád serveru. Řetězce se mažou jen po skončení nejvyšší veřejné funkce, takže pokud se ve skriptu skáče pomocí CallLocalFunction/CallRemoteFunction, vnitřní řetězce existují i po skončení vnitřních funkcí public. To ovšem neplatí pro SetTimer, jelikož vnitřní funkce se zavolá až po skončení vnější. Životnost lokálních řetězců není prodloužena ani pomocí asynchronních funkcí, neboť samotný callback je ukončen prvním čekáním. Proto existují globální řetězce, které nejsou automaticky mazány. Jejich použití je ale nebezpečné, neboť se musíte postarat o jejich smazání; musíte myslet na každé místo, kde by byl globální řetězec. Příklad: native print_s(AmxString:string) = print; new GlobalString:str; public OnFilterScriptInit() { str = str_new("Goodbye world!"); } public OnFilterScriptExit() { print_s(str); str_free(str); str = STRING_NULL; } Globální řetězce jsou označeny tagem GlobalString a převod na ně je automatický, pokud do takto značené proměnné přiřazujete. Lze toho docílit i voláním funkce str_to_global. Všechny funkce fungují stejně pro globální i lokální řetězce. Místo str_free můžete použít i funkci str_to_local, jež naopak vrátí řetězec do lokálního prostoru. To doporučuji použít v kombinaci s asynchronními funkcemi: public OnFilterScriptInit() { new String:str = str_new("Hello world!"); str_to_global(str); wait_ms(1000); str_to_local(str); print_s(str); } Mutabilita řetězců Řetězce jsou mutabilní, tedy měnitelné (až na jednu výjimku – STRING_NULL). To znamená, že některé funkce (například str_del) pouze upravují existující řetězec, takže pokud s ním pracují jiné funkce, dostanou jiná data. To lze vyřešit vytvořením nového řetězce (např. přes str_clone) nebo použitím funkcí, které samy o sobě tvoří nový řetězec (např. str_sub). STRING_NULL má speciální chování. Lze jej použít na místě normálního řetězce a všechna volání proběhnou úspěšně, ale jeho délka je vždy nulová. Funkce jako str_resize nebo str_set na něj tedy nemají žádný vliv. str_clone a jiné vytvářející funkce ale vždy udělá řetězec nový (a normální). Návratová hodnota asynchronní funkce Funkce obsahující čekání skončí vlastně předčasně a v takovém případě je nutno vrátit kontrolu serveru. Jelikož ale server očekává od funkce nějakou hodnotu hned, na případný příkaz return nemusí vůbec dojít. Od toho je tu funkce yield, jež navrátí hodnotu volajícímu kódu okamžitě: public OnFilterScriptInit() { new ret = CallLocalFunction(#Func, ""); printf("%d", ret); } forward Func(); public Func() { yield 12; wait_ms(1000); return 13; } Program vypíše 12 hned po spuštění. Návratovou hodnotu zbytku funkce (či z dalších volání yield) zatím nelze nijak odchytit, ale očekávám přidání něčeho na způsob coroutines v Lua (task_create z veřejné funkce a await, který lze zavolat vícekrát na takovou úlohu). Něco divného na mém kódu? await a yield jsou funkce, ale používám je jako příkazy. Pawn umožňuje vypustit závorky z takového volání, což vypadá rozhodně lépe. Také používám výraz typu #Func, což známe z maker, a je to totéž jako prosté "Func". Pokud řetězec je zároveň jméno funkce, líbí se mi toto použití pro odlišení.
  2. 11 points
    Ahoj všem! Chtěl bych vám ukázat video z posledního updatu na WTLS - plně ovladatelný jeřáb a job jeřábníka.
  3. 10 points
    kingsofsa.cz:8888 Server, kde se dá dělat všechno. Ať už je vaší oblíbenou činností závodění, zabíjení, natáčení, stavění, roleplay či jenom testování skinů, na tomto módu můžete cokoliv. Pomocí široké škály funkcí a příkazů můžete vytvářet vlastní objekty, vozidla, prozkoumávat celé San Andreas od tajných interiérů až po konec světa. Jen fantazie je vaší hranicí. Nepřetržitý vývoj od roku 2009. Bez žádných omezení či zákazů toho, co můžete dělat (CLEO apod. povoleno). Autor vyhrál soutěž o nejlepšího pawnera. ;-) Můžete si nastavit čas, počasí i gravitaci podle sebe. Dejte si tolik zbraní a peněz, kolik chcete. Celé San Andreas jen pro vás – systém vlastnictví virtuálních světů vám umožní nerušeně hrát s lidmi, kterým to umožníte, a měnit vlastnosti hry i světa pro všechny hráče v něm. Obsahuje všechny objekty, vozidla, skiny, zbraně i animace, vše okamžitě přístupné. Jaký způsob hraní vám vyhovuje, je jen na vás. Nastavte si vlastní jméno a vrhněte se na roleplay (rozšířená sada příkazů), nebo si vytvořte autodílnu a tuňte vozidla ostatním hráčům. Některé trailery na jiné servery pocházejí ve skutečnosti z KSA. Pomocí spousty příkazů můžete pohybovat s kamerou nebo nahrávat a vytvářet NPC. Chodci – ovladatelné postavy, které můžou chodit, jezdit či útočit na váš rozkaz. Vytvořte si auto s raketovým pohonem, majákem, přídavnými střílnami či vlastními texty. Vše je sice jen kosmetické, ale fantazii se meze nekladou! Postavte si vlastní dům či vozidlo a uložte si ho, abyste ho příště mohli lehce vytvořit. Připojte na sebe jakékoliv objekty a vytvořte oblečení pro supervojáka, démona nebo čaroděje. Systém vlastních map přidává do San Andreas chybějící křoví a stromky, a nebo sníh po celém světě. Vše lze okamžitě zapnout i vypnout. Ovládejte všechny brány a výtahy po San Andreas. Lehké a okamžité pouštění hudby z YouTube. Lze spustit i všem lidem ve světě nebo v týmu. Piškvorky a jiné minihry! Pozvěte si hráče, postavte trať a lze hned závodit. Server používá pluginy YSF (který vyvíjím), FCNPC a streamer. Využívá možnosti SA-MP na maximum. Půlnoční filosofické debaty se mnou... A mnoho dalšího! Přijďte se podívat, těšíme se na vás! Videa Ukázky
  4. 10 points
    Nazdar 😶. Spravil som remake českej hry Mravenci ktorú som miloval hrať ako malý 😊. Možno ju niektorí budete poznať. Je to kartová hra, na štýl hry Arcomage z hier Might and Magic. Cieľom je zničiť súperov hrad alebo vybudovať svoj hrad rýchlejšie ako súper.. Snažil som sa ju zreprodukovať najlepšie ako som mohol a pridal online play samozrejme 😊. Rozdiel medzi starou orig. hrou a mojou nájdete tu, a zahrať si ju môžete tu. Skúste a dajte vedieť či to ujde 😅
  5. 10 points
    Je dosť neprofesionálne a nevhodné zverejňovať súkromné konverzácie.
  6. 10 points
    Emit #1: Základy Obtížnost: 7/5 Prečo to robiť jednoducho, keď to ide zložito? Tento tutoriál vyžaduje Zeexov Compiler verziu 3.10.9+, pretože používa nový operátor emit (nie direktívu). Osnova/obsah: Disclaimer Globálne Premenné Základné operácie Stack Zlahčováky Operátor emit Záver 1. Disclaimer Emit a amxassembly je určite zaujímavá vec. Je to však podobné atómovej bombe. Je fajn ju mať, ale nikdy ju nechceme použiť. Vyššie jazyky ako PAWN existujú z dobrého dôvodu. Písať kód v assembly je zbytočne zdĺhavé a nebezpečné. Vzniknutý kód je absolútne nečitateľný. Chyby v assembly niesu ako chyby v PAWN, kde vás buď upozorní compiler, alebo vám nefunguje to, čo ste spravili. Pri chybe v emit sa môže stať čokoľvek. Crashe, SendClientMessage začne zobrazovať TextDrawy, 2 + 2 je zrazu 5, mačky naháňajú psy, počítače začnú horieť... Emit vám dokáže spôsobiť chyby v úplne iných častiach serveru a neukázať žiadny náznak, že je to chyba emitu... Ak na to nieste psychicky pripravený, tak radšej prestaňte čítať. Tento tutoríal čítajte na vlastné riziko! Autor nebude zodpovedný za žiadnu škodu, ktorú si spôsobíťe používaním emitu alebo iným používaním týchto informácií! Autor nebude zodpovedný za vaše mentálne zdravie, ak sa pokúsite chápať emity! 2. Globálne premenné Prvá vec, ktorú treba vedieť pri používaní emit sú registre. Registre fungujú podobne ako premenné a pawn ich ma niekoľko 9+. Zatiaľ nás však budú zaujímať len 2: pri a alt. Pri je primárny register. Takmer všetko, čo budeme robiť používa pri. Alt je alternatívny register, ktorý sa používa hlavne keď potrebujeme robiť s 2 číslami. Napríklad ak chceme 2 čísla sčítať. Ďalej musíme vedieť inštrukcie. Inštrukcie sú akési príkazy, ktoré hovoria, čo sa má spraviť. Niektoré inštrukcie za sebou majú .pri alebo .alt, čo určuje, s ktorým registrom chceme pracovať. Napríklad: LOAD.pri Adresa - Načíta hodnotu z adresy Adresa do registra pri LOAD.alt Adresa - Načíta hodnotu z adresy Adresa do registra alt Všeobecne toto zapisujeme ako LOAD.pri/alt Adresa - Načíta hodnotu z [Adresa] do pri/alt Ďalej keď pracujeme s hodnotou na určitej adrese, používame zápis [Adresa]. Takže ešte inak sa to dá zapísať LOAD.pri/alt Adresa - pri/alt = [Adresa] Tento zápis nám hovorí, že zoberieme hodnotu z adresy Adresa a vložíme ju do registru pri alebo alt, podla toho, ktorú inštrukciu použijeme (LOAD.pri alebo LOAD.alt). STOR.pri/alt Adresa - [Adresa] = pri/alt A ako vidíťe, táto inštrukcia STOR nám zase uloží obsah registra na adresu Adresa. Samozrejme sa pravdepodobne pýtate, odkial máte zobrať adresu? Užitočne miesto adresy môžete dať meno globálnej premennej, takže môžeme napríklad spraviť: new a = 1; new b = 2; main() { printf("a = %i, b = %i", a, b); // a = 1, b = 2 // b = a; emit LOAD.pri a; // Načítame a do pri emit STOR.pri b; // Uložíme pri do b printf("a = %i, b = %i", a, b); // a = 1, b = 1 } 3. Základné operácie Samozrejme obvykle nechceme len presúvať hodnoty, ale s nimi niečo počítať. Na to môžeme použiť napríklad niektoré z týchto inštrukcií. CONST.pri/alt Hodnota - pri/alt = Hodnota ADD - pri = pri + alt SUB - pri = pri - alt SUB.alt - pri = alt - pri NEG - pri = -pri SMUL - pri = pri * alt SDIV - pri = pri / alt, alt = pri % alt XCHG - Vymení pri a alt S týmito inštrukciami už môžeme spraviť niečo ako c = a + b; new a = 3; new b = 2; new c; main() { printf("a = %i, b = %i, c = %i", a, b, c); // a = 3, b = 2, c = 0 // c = a + b; emit LOAD.pri a; // Načítame a do pri emit LOAD.alt b; // Naćítame b do alt emit ADD // sčítame pri a alt a výsledok vložíme do pri emit STOR.pri c; // uložíme pri do c printf("a = %i, b = %i, c = %i", a, b, c); // a = 3, b = 2, c = 5 } A veľa dalších vecí: new a = 3; new b = 2; new c; main() { printf("a = %i, b = %i, c = %i", a, b, c); // a = 3, b = 2, c = 0 // c = -a - b; emit LOAD.pri a; emit NEG; emit LOAD.alt b; emit SUB emit STOR.pri c; printf("a = %i, b = %i, c = %i", a, b, c); // a = 3, b = 2, c = -5 // c = a * -b; emit LOAD.pri b; // Načítame b do pri, pretože NEG funguje len na pri emit NEG; // pridáme mínus, takže pri = -b emit XCHG; // presunieme pri do alt, takže alt = -b emit LOAD.pri a; // načítame a do pri emit SMUL; // vynásobíme pri * alt, čiže a * -b emit STOR.pri c; // uložíme výsledok do c printf("a = %i, b = %i, c = %i", a, b, c); // a = 3, b = 2, c = -6 // a = a + 5; emit LOAD.pri a; // Načítame a do pri emit CONST.alt 5; // Načítame 5 do alt emit ADD; // sčítame emit STOR.pri a; // uložíme výsledok do a } 4. Stack Ok, ale čo ak chceme spraviť a * b + c * d; Ak začnete písať tento kód, zistíte, že nemáte kam uložiť medzihodnotu a * b. Ano, môžete skúsiť podvádzať a uložiť ju do r, ale čo ak miesto r to budete chcieť dať priamo do funkcie? Odpoveď je zásobník. Úlohou zásobníka je pre vás podržať hodnoty, ktoré potrebujete. Predstavte si zásobník ako hŕbu papierov. Vždy keď potrebujete si môžete na vrch papier odložiť a neskôr ho z vrchu zobrať, avšak nesmiete sa v tej hŕbe hrabať. Môžete brať a dávať len na vrch. PUSH.pri/alt - Vloží pri/alt na vrch zásobníku. POP.pri/alt - Vloží hodnotu z vrchu zásobníku do pri/alt. Takže môžeme spraviť napríklad: new a = 3, b = 2, c = 4, d = 4; new r; main() { // r = a * b + c * d; emit LOAD.pri a; emit LOAD.alt b; emit SMUL; emit PUSH.pri; // uložíme výsledok na zásobník emit LOAD.pri c; emit LOAD.alt d; emit SMUL; emit POP.alt; // vybereme výsledok prvého náspbenia zo zásobníku emit ADD; emit STOR.pri r; printf("r = %i", r); // r = 22 } Na stack môžeme vložiť viacero hodnôt, napríklad: new a = 1, b = 2, c = 3, d = 4; new r; main() { // r = a + b + c + d; emit LOAD.pri d; emit PUSH.pri; // STACK = d emit LOAD.pri c; emit PUSH.pri; // STACK = c d emit LOAD.pri b; emit PUSH.pri; // STACK = b c d emit LOAD.pri a; emit PUSH.pri; // STACK = a b c d emit POP.pri; // a // STACK = b c d emit POP.alt; // b // STACK = c d emit ADD; emit POP.alt; // c // STACK = d emit ADD; emit POP.alt; // d emit ADD; emit STOR.pri r; printf("r = %i", r); // r = 10 } Možno sa teraz spýtaťe, čo sa stane ak dám POP viac krát ako PUSH? Mačky začnú nahánať psov, alebo možno váš počítač vybuchne. Kdo vie... 5. Zľahčováky Existuje taktiež veľa inštrukcií, ktoré existujú na zľahčenie písanie, napríklad niektoré inštrukcie majú verziu .C, ktorá použije zadanú hodnotu miesto registra. Napr "ADD.C 5" pripočíta k registru pri 5, čiže pri += 5. ADD.C Hodnota - pri = pri + Hodnota SMUL.C Hodnota - pri = pri * Hodnota PUSH.C Hodnota - Vloží Hodnota na zásobník INC.pri/alt - pri/alt = pri/alt + 1 DEC.pri/alt - pri/alt = pri/alt - 1 ZERO.pri/alt - pri/alt = 0 ZERO Adresa - [Adresa] = 0 ... 6. Operátor emit Možno viete, že bežne sa nepoužíva emit ale #emit. emit ani v bežnom compilery pribalenom v samp nieje. Tak prečo ho používam tu? emit má totiž niekoľko výhod. Je napríklad možné písať inštrukcie do {} takto. emit { const.pri 5 const.alt 5 add stor.pri r } Vďaka tomu nemusíte neustále písať emit. Ďalej bežný emit "vracia" hodnotu uloženú v pri, takže môžete napísať: new a = emit const.pri 4; printf("%i, %i", a, emit const.pri 7); // 4, 7 A taktiež umožnuje písať inštrukcie oddelené čiarkou do () takto: printf("%i", emit(const.pri 2, const.alt 4, add)); // 6 Toto vám umožní oveľa lahšie integrovať emit so svojim kódom. Taktiež to umožnuje používať emit v Makrách cez #define. Nakoniec emit narozdiel od #emit robí určité kontroly pri kompilácii. Ak napríklad dáte lokálnu premennú do LOAD.pri, tak vám napíše error. To je hlavný dôvod, prečo som zvolil operátor emit pre tento tutoriál miesto #emit. Ak však nepotrebujete žiadnu z týchto výhod, všetko v tomto tutoriály sa dá použiť taktiež s #emit. 7. Záver V ďalšom diely tohto tutoriálu sa vrhneme na funkcie a lokálne premenné, taktiež si povieme viac o stacku.
  7. 8 points
    Udelal sem remake tejto starej nefunkčnej ICQ hry. Dá sa hrať online aj offline proti botovi =). Zaklady grafiky a zvuky som zobral z originalnej .swf hry ktore som našiel na google, a pak trochu predelal. Hru som sa snažil urobiť čo najpodobnejšie. Ukážka / Rozdiel medzi orig. hrou a remake =D, Video. Čo poviete ? xD http://lama.robinko.eu/
  8. 8 points
    Nechal bych samotného uživatele, aby se sám rozhodl jestli bude reklamu blokovat či nebude. Takže můj návrh je ano, upozornit na to návštěvníka, že má zapnutý AdBlock (což stejně ví sám moc dobře), ale nenuceně mu tam vysvětlit proč by bylo fajn si jej u této stránky vypnout. A pak jednoduchým jediným tlačítkem ve kterém by bylo napsáno "Dobře, rozmím" to odklikl s tím, že třeba 1x týdně by se mi to zobrazilo znova nebo nejlépe vůbec. Rozhodně si ale nemyslím, že vnucovat to uživateli a vlastně mu dát nůž pod krk s tím, že buď si AdBlock vypne a nebo tě prostě na stránky nepustíme. To je špatný přístup. Jak tu všichni píšou, jenom to každého odradí. I já bych si řekl, fajn tak nazdar jdu pryč. Mimo jiné, opravdu tenhle způsob nesnáším! Zkrátka nevnucovat, pouze informovat! 🙂
  9. 8 points
    Menší update vzhledu mobilu 😃
  10. 7 points
    Obtížnost: ⭐ Obsah: 1. Úvod 2. Kdy proměnné využíváme? 3. Konkrétní příklady 4. Závěr 1. Úvod: Rozhodl jsem se zkusit napsat novou formu návodů. Bude se jednat o pokus-omyl, uvidím, jak se takový návod ujme. Mělo by se jednat o jakési doplnění návodů, které již na fóru jsou o jistou praxi. Protože teorie je super, ale pokud člověk vůbec nechápe, na co se co má používat, tak s Pawnem začít vůbec nemůže, protože ho odradí množství informací, které z návodu nedostal a sám si je nedomyslí. Před čtením tohoto návodu doporučuji přečtení čistě teoretických návodů k základům Pawn, abyste rozuměli, co se v kterých částech kódu má dít. Naleznete je zde: https://pawno.cz/index.php?/forum/149-pawn-pro-začátečníky/ Zejména pak bude potřeba teoretický návod k proměnným. https://pawno.cz/index.php?/topic/53319-1-proměnná/ 2. Kdy proměnné využíváme? Proměnnou můžeme využít v případě, kdy si chceme uložit jakoukoliv informaci pro další použití. stock JmenoHrace(playerid) { new UlozeneJmeno[24 + 1]; //Deklarovali jsme si proměnnou s velikostí pro string/řetězec 25. (24 je maximální délka nicku + nulový znak) GetPlayerName(playerid, UlozeneJmeno, sizeof(UlozeneJmeno)); //Pomocí funkce GetPlayerName zjistíme nick hráče s id "playerid". //To se nám uloží do proměnné UlozeneJmeno. //Operátor sizeof() vrací velikost datového typu nebo objektu v bytech. V tomto případě 24 + 1 = 25. //Jedno místo v proměnné je vyhrazeno pro nulový znak. return UlozeneJmeno; //Příkaz return znamená navrátit. //V tomto případě nám funkce navrátí proměnnou ve formě stringu/řetězce, která se nazývá UlozeneJmeno. } Tuto funkci nyní můžeme využít kdekoliv ve scriptu, aniž musíme znovu a znovu proměnnou deklarovat. 3. Konkrétní příklady: Příklady budou s minimálním počtem komentářů, k pochopení, co se děje v kódu si přečtěte teoretické návody, které jsem poslal výše. Již jednou zmíněná funkce pro zjištění hráčova jména: stock JmenoHrace(playerid) { new UlozeneJmeno[MAX_PLAYER_NAME + 1]; //MAX_PLAYER_NAME má v základním includu a_samp hodnotu 24, stejně je ale nutno počítat s nulovým znakem. GetPlayerName(playerid, UlozeneJmeno, sizeof(UlozeneJmeno)); return UlozeneJmeno; } //Do proměnné UlozeneJmeno se nám uloží nick hráče, který poté pomocí příkazu return navrátíme. Odeslání zprávy do chatu i s údaji (pozn.: Nutná funkce JmenoHrace): public OnPlayerCommandText(playerid, cmdtext[]) { if(!strcmp(cmdtext, "/pozdravit")) { new StringZpravy[40]; format(StringZpravy, sizeof(StringZpravy), "Hráč %s zdraví", JmenoHrace(playerid)); SendClientMessageToAll(-1, StringZpravy); return 1; } return 0; } //Abychom mohli odeslat zprávu, která bude obsahovat proměnnou, musíme si ji naformátovat. //K tomu potřebujeme vytvořit proměnnou pro samotnou zprávu. (StringZpravy) Změna textu, když hráč napíše zprávu (pozn.: Nutná funkce JmenoHrace): public OnPlayerText(playerid, text[]) { new StringZpravy[145]; format(StringZpravy, sizeof(StringZpravy), "Hráč {FF0000}%s {00FF00}píše: {FFFFFF}%s", JmenoHrace(playerid), text); SendClientMessageToAll(0x00FF00FF, StringZpravy); return 0; } //Opět potřebujeme zprávu naformátovat. Naformátovanou zprávu uložíme do proměnné StringZpravy a poté ji odešleme. //Jak vidíte, lze ve zprávách použít i barvy ve složených závorkách. Pro systém omezení použití (pozn.: Nutná funkce JmenoHrace): new bool:PouzilKit[MAX_PLAYERS]; public OnPlayerCommandText(playerid, cmdtext[]) { if(!strcmp(cmdtext, "/kit")) { if(PouzilKit[playerid]) { SendClientMessage(playerid, -1, "Kit už jsi použil."); return 1; } else { new StringZpravy[50]; format(StringZpravy, sizeof(StringZpravy), "Hráč %s použil kit", JmenoHrace(playerid)); SendClientMessageToAll(-1, StringZpravy); GivePlayerWeapon(playerid, 24, 100); GivePlayerWeapon(playerid, 26, 100); GivePlayerWeapon(playerid, 32, 250); GivePlayerWeapon(playerid, 35, 5); PouzilKit[playerid] = true; return 1; } } return 0; } public OnPlayerSpawn(playerid) { PouzilKit[playerid] = false; return 1; } //Logická globální proměnná PouzilKit bude obsahovat informaci true/false, která se nastaví po použití příkazu /kit. //Poté můžeme kontrolovat, zda hodnota je true či false a podle toho vykonat další kód. Pro omezení počtu zabití (pozn.: Nutná funkce JmenoHrace) (pozn.: POZOR NA FAKEKILL): new ZabilHracu[MAX_PLAYERS]; public OnPlayerDeath(playerid, killerid, reason) { ZabilHracu[killerid]++; if(ZabilHracu[killerid] < 5) { SendClientMessage(killerid, 0xD00000FF, "Nezabíjej ostatní!"); } else { new StringZpravy[60]; format(StringZpravy, sizeof(StringZpravy), "Hráč %s byl vyhozen za zabíjení hráčů.", JmenoHrace(killerid)); SendClientMessageToAll(0xD00000FF, StringZpravy); ZabilHracu[killerid] = 0; Kick(killerid); } return 1; } //Globální proměnná s celým číslem nám přičte jedna pokaždé, když hráč zabije jiného hráče. //Podle hodnoty údaje uloženého v proměnné budeme vykonávat další kód. 4. Závěr: Doufám, že takový formát návodů se uchytí. Připomínám, že návod nemá vystihnout, jak proměnné deklarovat, ale jejich praktické využití. Za konstruktivní kritiku budu rád.
  11. 7 points
  12. 6 points
    Actory Obtížnost: 2/5 Osnova Úvod K čemu jsou Actory užitečné? Veškeré funkce actorů se stručným popisem a parametry Vytvoření actoru (code) Závěr 1. Úvod Zdravím, koukal jsem, že tu chybí návod na práci s Actory. Není to nic obtížného, ale pro nováčky určitě užitečná věc. Actor je z angličtiny, znamená to Herec. Tato funkce byla přidána až do SAMP 0.3.7 2. K čemu jsou actory užitečné? Actor je postava, která se nijak nepohybuje, narozdíl o NPC. Vypadají jako normální postavy hráčů. Mají klasické skiny (ID skinů) a hlavně nezabírají slot pro hráče. Ale mají i svoji chybu, pokud je actor v interiéru a hráč ním projde tak propadne v zemi. K čemu je použiji? Jako první mě napadá nějaká nabídka úkolu hráči, kdy se hráči zobrazí dialog. Nebo nějaký Dm, kdy tohoto actora musí trefit.. 3. Veškeré funkce actorů se stručným popisem a parametry CreateActor - vytvoří actora DestroyActor - zničí actora IsActorStreamedIn - zjistí, zda-li je actor viditelný pro hráče SetActorVirtualWorld - nastaví virtual world acotra GetActorVirtualWorld - zjistí virtual world acotra ApplyActorAnimation - nastaví animaci ClearActorAnimations - ukončí animaci SetActorPos - nastaví pozici actora GetActorPos - zjistí pozici actora SetActorFacingAngle - nastaví rotaci actora - projeví se až po novém zobrazení actora GetActorFacingAngle - zjistí rotaci actora SetActorHealth - nastaví životy actora GetActorHealth - zjistí životy actora SetActorInvulnerable - ztranitelnost / nezranitelnost actora IsActorInvulnerable - zjistí zranitelnost actora IsValidActor - zjistí platnost ID acotra GetActorPoolSize - zjistí nejvyšší ID actora vytvořeného na serveru Při práci s actory využíváme hlavně následující paramery actorid - ID actora modelid - ID skinu actora (ID skinů) Float:X/Y/Z/Rotation - souřadnice X, Y, Z & Rotace 4. Vytvoření actoru (code) Nejprve musíme uložit souřadnice na serveru. Buďto pomoci /save nebo /rs. Cesta k souborům: C:\Users\Uživatel\Documents\GTA San Andreas User Files\SAMP Pokud jste užili /save: savedpositions.txt Pokud /rs: rawpositions.txt Nyní se rozhodnete, kdy chcete vytvořit actora. Dejme tomu že OnGameModeInit. new Ukazka1, Ukazka2; //abychom věděli ID actora pro další použití (...) public OnGameModeInit() { Ukazka1 = CreateActor(4, 1234.1541,4321.1054,41.0150,31.1753); //(skin, X,Y,Z, ROTACE) Ukazka2 = CreateActor(5, 41.0150,1234.1541,4321.1054,74.0468 ); //(skin, X,Y,Z, ROTACE) SetActorHealth(Ukazka1, 50); //ID actora, životy SetActorVirtualWorld(Ukazka2, 452); //ID actora, virtual world } Nyní nám actory stojí. Jeden ve VW 0 (global) s 50 životy a druhý ve VW 452 se 100 životy. Nyní si s actory můžete hrát do haleluja. Animace jsou úplně stejné jako u hráčů, až na to, že zeměníte playerid za actor ID a funkce se jmenuje do názvu funkce dáte actor. 5. Závěr Myslím, že na základní práci a actory toto bohatě stačí, pokud by někdo chtěl vědět něco víc, doporučuji použít oficiální téma na SA-MP fóru (KLIK) nebo si najít jednotlivé funkce na SAMP wiki, ovšem většina těch funkcí je celkem jasná..
  13. 6 points
    Ne... Máš VAC. Sám si se přiznal že si cheatoval je to tvoje věc... Skiny už neprodáš VAC je permanentní. A ano, musíš se kvůli jedné hře už přihlašovat a odhlašovat jako deb*l protože si cheatoval....
  14. 6 points
    Ahoj všem! Nedávno jsem přidal na WTLS vylepšnou verzi taneční a lowrider souteže a chtěl bych vám ukázat výsledek. Co na to říkáte? Líbila se vám taneční minihra v singleplayeru GTA:SA? Myslíte si, že tato minihra byla větší výzva než v GTA: The Ballad of Gay Tony? Předem díky za vaše komentáře! .)
  15. 5 points
  16. 5 points
    dej tomu něco jiného, co rep+ nedává, konec konců, že je nějaká odpověď fajn je na rep+, tohle není facebook aby se tu hrálo na lajky
  17. 5 points
    Emit #2: Funkcie a stack Obtížnost: 7/5 Aneb ako to ten compiler robí? Tento tutoriál vyžaduje Zeexov Compiler verziu 3.10.9+, pretože používa nový operátor emit (nie direktívu). Osnova/obsah: Stack a STK register Lokálne premenné Volanie funkcii a FRM register Parametre funkcii Alokácia lokálnych premenných Volanie native funkcií Praktická motivácia Záver 1. Stack a STK register Stack si vlastne môžete predstaviť ako veľký kus pamäte. Ako veľký sa určuje pri kompilácii amx pomocou #pragma dynamic Kde presne máte uložené veci na stacku zistíte pomocou STK registru. STK je jeden z tých 7+ daľších registrov, ktoré som minule spomenul, ale ďalej neriešil. STK ukazuje na poslednú hodnotou, ktorú ste na stack vložili. Je taktiež dôležité spomenúť, že stack je otočený opačne, takže predchádzajúca hodnota je na adrese STK + 4. STK je samozrejme v bajtoch a premenná v PAWN má bežne 4 bajty, takže STK je vždy násobok 4. Taktiež premenná v PAWN sa volá cell a jej veľkosť sa často zapisuje ako cell size. Pre samp vždy cell size = 4. Inštrukcie PUSH a POP sa teda dajú zapísať ako: PUSH.pri/alt - STK = STK - cell size, [STK] = pri/alt POP.pri/alt - STK = pri/alt = [STK], STK + cell size Ako zistíme hodnotu STK? Ako ju zmeníme? Môžeme použiť inštrukcie: LCTRL 4 - pri = STK SCTRL 4 - STK = pri 4 je v týchto inštrukciách register STK. Iné čísla vám dajú iné registre, ale k tým sa dostaneme neskôr. 2. Lokálne premenné Lokálne premenné su v skutočnosti nenápadne uložené na stacku. new a = 3; vo funkcii v skutočnosti nieje nič viac ako emit PUSH.C 3; s tým, že si to miesto, kde sa premenná nachádza compiler zapämatá pod menom a. Ale xhunterx, ako sa k lokálnym premenným dostaneme, keď môžeme pristupovať len k vrchnej hodnote na stacku? No ja som vám trošku klamal. Odstrániť zo stacku môžeme len vrchnú hodnotu, pretože zo stacku vymazávame posnutím registru STK. Nič nám ale nebráni pozrieť sa na akékoľvek miesto na stacku. Na nájdenie týchto premenných nám slúžia inštrukcie: LOAD.S.pri/alt Offset - Načíta lokálnu premennú z Offset do pri/alt STOR.S.pri/alt Offset - Uloží pri/alt do lokálnej premennej z Offset PUSH.S Offset - Uloží hodnotu lokálnej premennej z Offset na zásobník To nám umožní spraviť napríklad: main() { new a = 1; new b = 2; // t = a; a = b; b = a; // Vymeníme a, b emit LOAD.S.pri a; // Načítame a do pri emit LOAD.S.alt b; // Načítame b do alt emit STOR.S.pri b; // Uložíme pri do b emit STOR.S.alt a; // Uložíme alt do a printf("a = %i, b = %i", a, b); // a = 2, b = 1 } 3. Volanie funkcii a FRM register Teraz vieme ako pracovať s lokálnymi premennými, ale ako to vlastne funguje? Na to sa musíme pozrieť, ako sa voláju funkcie. Povedzme že máme: func(a, b, c) { return a + b + c; } main() { new a = 1, c = 3; func(a, 2, c); } Toto by vyzeralo v asi nejak takto: Test() { //emit PROC; // PROC je automaticky vygenerované na začiatku každej funkcie // Ručne to písať nemusíme, preto je to zakomentované emit CONST.pri a + b + c; emit RETN; // POZOR! Iné ako RET } main() { new a = 1, c = 3; emit PUSH.S c; // Pushneme c na stack emit PUSH.C 2; // Pushneme 2 na stack emit PUSH.S a; // Pushneme a na stack // Všimnite si, že pushujeme v opačnom poradí. Posledný parameter sa pushuje ako prvý. // To je aby k nim funkcia mohla pristupovať v správnom poradí, keďže ona ich uvidí opačne. // c, ktorú sme dali na kopu papierov bude v tej kope najhlbšie. emit PUSH.C 12; // Počet parametrov * cell size emit CALL Test; } V tomto kóde máme 3 nové inštrukcie. CALL, PROC a RETN. Tieto inštrukcie taktiež používajú 2 nové registre FRM a CIP. CIP jednoducho uchováva adresu inštrukcie, ktorá sa práve vykonáva. Tento register sa neustále mení, ako sa vykonávajú inštrukcie. FRM uchováva STK na začiatku funkcie. CALL Adresa - STK = STK - cell size, [STK] = CIP + 8, CIP = Adresa Ak sa na to pozrieťe, prvé 2 časti vyzerajú ako push. A presne to aj robia. Call pushne CIP + 8 na zásobník. CIP + 8 je adresa dalšej inštrukcie po call, keďže samotná inštrukcia je cell (4 bajty) a Adresa je taktiež cell (4 bajty). Nakonie CALL do CIP vloží adresu Adresa. Tým zaistí, že dalšia inštrukcia, ktorá sa bude vykonávať nebude ďalšia inštrukcia v poradí, ale prvá inštrukcia funkcie, ktorú voláme. A prvá inštrukcia funkcie je vždy PROC. PROC - STK = STK - cell size, [STK] = FRM, FRM = STK Znovu dve časti sú push, konkrétne pushneme starú hodnotu FRM na zásobník. Potom do FRM dáme aktuálnu hodnotu STK. Toto nám umožnuje používať inštrukcie ako LOAD.S.pri. Vďaka FRM vieme spočítať, kde sa premenné nachádzajú. A nakoniec nová inštrukcia RETN. RETN - FRM = [STK], CIP = [STK + 4], STK = STK + 12 + [STK + 8] Kde [STK] je stará hodnota FRM od PROC, [STK+4] je adresa dalšej inštrukcie po CALL, [STK+8] je velkosť parametrov funkcie (naše emit PUSH.C 12;) Táto inštrukcia teda spravý niekoľko vecí. Vráti do FRM pôvodnú hodnotu zo zásobníku, ktorú tam uložil PROC Nastavý dalšiu inštrukciu na hodnotu zo zásobníku, teda na hodnotu, ktorú tam uložil CALL, teda na ďalšiu inštrukciu po CALL Vymaže zo zásobníku všetky uložené hodnoty a parametre funkcie. Stack teda vo vnútry funkcie Test v našom príklade vyzerá takto: STACK = Stary_FRM, Navratova_Adresa, Velkost_Parametrov (=12), a, 2, c Pre úplnosť presné definície tývhto inštrukcií sú. LOAD.S.pri/alt Offset - pri/alt = [FRM + Offset] STOR.S.pri/alt Offset - [FRM + Offset] = pri/alt PUSH.S Offset - STK = STK - cell size, [STK] = [FRM + Offset] Mentálne cvičenie: Pre inštrukcie sú mená lokálnych premenných vlastne len Offset. Aký offset má premenná a v tejto funkcii? Bonus: aký offset má b? Test(b) { new a; return a + b; } 4. Parametre Funkcií Ako ste si mohli všimnúť podla posledného mentálneho cvičenia, parametre funkcie majú vlastne taktiež svoj offset voči FRM. A naozaj aj na ne môžeme pristupovať aj k parametrom funkcie. Napríklad funkcia z cvičenia sa dá napísať aj takto: Test(b) { new a; emit LOAD.S.pri a; emit LOAD.S.alt b; emit ADD; emit RETN; // Návratová hodnota je uložená v pri } 5. Alokácia lokálnych premenných Ako som už písal, lokálne premenné sa alokujú obyčajným pushom. Ak máte new a; vznikne emit PUSH.C 0; new b = 5; vznikne emit PUSH.C 5; Ako sa ale tieto premenné dealokujú? Mohli by sme použiť vždy POP, ale to by bolo pomalé a neefektívne. Miesto totoho existuje inštrukcia STACK. STACK Size - STK = STK + Size Takže ak chcem dealokovať 10 premenných (10 * cell size = 40 bajtov), napíšem emit STACK 40; Takže napríklad funkcia AllocTest() { new a, b, c, d; { new e, f; // Nieco } // Nieco2 } Bude po compilacii vyzerať nejak takto: AllocTest() { emit PUSH.C 0; emit PUSH.C 0; emit PUSH.C 0; emit PUSH.C 0; { emit PUSH.C 0; emit PUSH.C 0; // Nieco emit STACK 8; } // Nieco2 emit STACK 16; } Všimnite si, že v tomto prípade {} ani nepotrebujem, napísal som ich sem len pre prehľadnosť. Ešte stále tu ale máme veľa PUSH.C 0. Čo ak budeme chcieť vela lokálnych premenných. Môžeme to nejak zlepšiť? V podstate áno, ale je to zložité. Za prvé, FRM je register číslo 5, takže LCTRL 5 nám načíta FRM do pri. MOVE.pri/alt - pri = alt/alt = pri FILL Size - Vyplní rozsah od alt, veľkosti Size hodnotou pri. alt musí byť násobok cell size. Test() { emit STACK -20; // Alokujeme 5 * cell size miesta na stacku emit ADDR.alt -20; // Do alt dáme adresu začiatku premenných. emit ZERO.pri; // Nastaví pri na 0 emit FILL 20; // Vyplníme miesto od STK velkosti 20 nulami, čiže vynulujeme našich 5 premenných // Máme 5 lokálnych premenných emit STACK 20; // uvolníme premenné } 6. Volanie native funkcií Native funkcie môžeme volať pomocou inštrukcie: SYSREQ.C Func - Zavolá native funkciu Func Native funkcie sa však chovajú inak, ako normálne funkcie. Na rozdiel od normalných PAWN funkcií si po sebe neupracú, takže všetky premenné, ktoré ste pushli na zásobník musíte vymazať ručne. Príklad volania native funkcie: CallSCM(playerid, color, const str[]) { emit push.s str; // Pushneme posledný parameter emit push.s color; // Pushneme stredný parameter emit push.s playerid; // Pushneme prvý parameter emit push.c 12; // Pushneme velkosť parametrov emit sysreq.c SendClientMessage; // Zavoláme SendClientMessage emit stack 16; // Upraceme zásobník. 12 pre parametre + 4 pre velkosť. // 4x Push * cell size = 16 emit retn; // výsledok native je taktiež v pri, takže môžeme rovno return } Taktiež je dôležité, aby ste native ktorý takto voláte niekde použili mimo emit. Ak daný native nieje nikde použitý normálne, compiler ho nezpozná a crashne (compiler v3.10.9). 7. Praktická motivácia Často chceme vytvoriť funkciu, ktorá berie premnlivý počet argumentov a posunie ich dalšej funkcii, napríklad format. To však spraviť v PAWN je veľmi zložité. Tu je ukážka jedného možného spôsobu, ako na to: Použijeme priamo parametre, ktoré poslali našej funkcii a oklameme format tak, aby si myslel, že sú to parametre pre neho. Samozrejme prvé 2 parametre musíme zmeniť. stock SendClientMessagef(playerid, color, const msg[], ...) { new p, c, stk, str; emit { // Zálohujeme premenné load.s.pri color stor.s.pri c load.s.pri playerid stor.s.pri p // Nastavíme max velkosť pola pre format, argument 2 const.pri 145 stor.s.pri color // Vytvoríme pole na heape a vložíme ho ako argument 1 pre format heap 145 stor.s.alt playerid stor.s.alt str // Uložíme si kópiu na neskôr // Uložíme STK do zálohy lctrl 4 stor.s.pri stk // Nastavíme STK tak, aby format zobral parametre tejto funkcie // ako si pamatáme, stack vo funkcii vyzerá takto // STACK = ..., c, p, OFRM, RETADDR, PARAMSIZE, playerid, color, msg, ... // A FRM ukazuje na OFRM. Ďalej na volanie funkcie chceme na stacku mať // STACK = PARAMSIZE, playerid, color, msg, ... // To znamená, že musíme zobrať FRM a posunúť ho o 8 bajtov (2 celly) lctrl 5 // Získame FRM add.c 8 // Pridáme 8 sctrl 4 // Vložíme do STK // Teraz môžeme pekne zavolať format sysreq.c format // Keďže native po sebe neupratujú, ani nepoužívajú stack // jediné, čo sa volaním zmenilo je pri (return formatu) a samozrejme obsah str // Vrátime parametre zo zálohy load.s.pri c stor.s.pri color load.s.pri p stor.s.pri playerid // Vrátime STK zo zálohy load.s.pri stk sctrl 4 // Zavoláme normálne SendClientMessage push.s str push.s color push.s playerid push.c 12 sysreq.c SendClientMessage stack 16 // Uvolníme string z heapu prec heap -145 // Alebo aj // load.s.pri str // sctrl 2 // 2 = HEA } return 1; } 8. Záver Na záver by som ešte chcel zabohovať na dokumentáciu pawna. 3 verzie PAWN Implementer's Guide v PDF po ruke v pohotovosti, ani jeden nezodpovedá tomu, ako to reálne funguje. Napríklad podla guide je STK pointer na volné misto nad poslednou hodnotou v zásobníku. To ale jednoduchým testom vidíme, že nieje pravda... Podľa guide taktiež CALL robí [STK] = CIP + 5 (inštrukcia má asi mať velkosť 1 bajt). To ale taktiež nieje pravda. Inštrukcie ako ADDR.pri/alt ani v jednej z týchto príručiek niesu, no compiler ich veselo používa. A samozrejme ak dáte native funkcii adresu, ktorá je pod STK, tak crashne server. Nedokážem nájsť ani vidieť žiadny dôvod, prečo by tomu tak malo byť. Nikde inde sa nič také nedeje. No každopádne tu ano, takže super. Anilen hlášku to nenapíše... Ak niekde nájdem na predaj náhradné nervy, tak sa uvidíme pri časti 3. V tej sa pozrieme na skoky a pointery.
  18. 5 points
    Vážení uživatelé, za celý pawno tým (tj. včetně ověřených uživatelů) Vám chceme poděkovat za Vaši oddanost a zapojení do obsahu fóra a popřát Vám mnoho pracovních, studijních a osobních úspěchů, zdraví, štěstí a lásky v novém roce. Abysme k vám za rok přišli a Vás ve zdraví zas našli
  19. 5 points
    Zdravím, před nějakou dobou se změnilo logo na nové, což vyvolalo mnoho diskuzí. Jelikož se spoustu lidem (včetně mě) nové logo nelíbí, a máme rádi něco modernějšího, rozhodl jsem se vytvořit extension pro prohlížeč, která vrátí staré (lepší, ale ne dobré) logo zpět a smaže ty ošklivá. Zmiňované rozšíření naleznete v přiloženém zipu (jde tam vidět celý zdrojový kód) a je testovaná na firefoxu (na chrome by měla jít také). Debug instalaci pro firefox provedete ve třech krocích: Otevŕeme si stránku 'about:debugging' Klikneme na tlačítko 'Load temporary Add-on...' Vybereme soubor mpga.js z rozbaleného zipu Pro ostatní prohlížeče je postup jiný, ale obdobný. Samotný script vypadá takto const add = document.querySelectorAll('[href="http://ingnition.cz"]')[0] const logoAnchor = document.getElementsByClassName('logo')[0] const logo = document.createElement('img') logo.setAttribute('src', browser.extension.getURL('data/logo.png')) logo.setAttribute('alt', 'Pawno.cz') while (logoAnchor.firstChild) { logoAnchor.removeChild(logoAnchor.firstChild) } logoAnchor.appendChild(logo) add.remove() mpga.zip
  20. 5 points
    Ahoj všem! Mnoho z vás si jistě pamatuje mé působení na tomto diskuzním foru. A pokud ne, tak to teď zjistíte 🙂 Uběhlo již dlouhých 6 let, kdy svět spatřil nové logo Pawno.cz, které vzešlo z mé dílny. Když si to teď tak vezmu, už je to sakra dlouhá doba! 🙂 O tom, jak logo vlastně vzniklo a co všeho to obnášelo si můžete přečíst na mém blogu, kde mimo jiné naleznete i úplně první logo tohoto fora! Článek naleznete na této adrese: http://www.letajicimoucha.cz/red... A tak jsem si řekl, že když už se tu změnil i ten vzhled, že bych mohl udělat i nějaké to nové logo. Tak jsem sedl k Photoshopu a zkusil jsem něco stvořit. Dlouho jsem již něco z vlastní iniciativy netvořil. Na výsledek se můžete podívat níže 🙂 Budu rád, když logo okomentujete, jak se vám líbí 🙂 HLASUJTE O LOGU PŘÍMO ZDE: DĚKUJI! 🙂
  21. 5 points
    Bitové operátory Obsah Úvod Bitové operácie Operácia not Operácie and, or Operácie shl, shr Operácia xor 1. Úvod K napísaniu tohoto návodu ma inšpiroval tento príspevok z roku 2012, ktorý podľa môjho názoru má k dnešnej úrovni našich návodov celkom nízku kvalitu a tiež v ňom chýbajú určité informácie. Niektoré body z neho som podobne použil aj ja. V príspevku budú tiež cvičenia, ktoré kým spravíte, rozhodne budete bitovým operáciám rozumieť. Nejaký čas nad cvičeniami určite strávite. V praxi majú tieto operácie veľký význam, predsalen, ak jeden bit môže mať hodnotu 0, alebo 1, tak so znalosťami bitových operátorov je možné do jedného 32-bitového čísla (klasická premenná v Pawn) uložiť 32 true/false hodnôt. Do úvodu však ešte uvediem, že síce dokážu neuveriteľne šetriť pamäť (v prípadne jednej bool hodnoty až 32násobná úspornosť), tak každá operácia trvá určitý čas a z úmyslu ušetriť pamäť by výsledok mohol byť až strata rýchlosti. Ak potrebujete pracovať s binárnymi číslami, Windows kalkulačka je najvhodnejší nástroj (Štart->calc.exe->Možnosti->Programátorská). Otázky sa môžete pýtať v komentároch. Veľa šťastia a nových vedomostí. 2. Bitové operácie Najmenšia dátová jednotka na počítači je bit, ktorý patrí do množiny {0, 1}. Vždy nadobúda práve jednu hodnotu. Operácie prebiehajú v dvojkovej sústave. Desiatková sústava pozostáva z {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}. Jeden bajt má osem bitov. Keďže v Pawn sa používajú len 4-bajtové premenné, všetky bunky majú 32 bitov. Množina {0, 1} sa dá zobraziť do množiny {false, true}. Premenná, ktorá môže nadobúdať iba hodnoty true a false máva typ "bool", po matematikovi Georgeovi Booleovi. Pawn umožňuje vypisovať čísla v binárnom tvare na konzolu. Stačí do printf() dať namiesto "%d" (decimal - desiatková sústava) "%b" (binary - binárna sústava). Kód si spustite. #include <a_samp> main() { for (new i; i < 16; i++) { printf("%2d = 0b%04b", i, i); } } Cvičenie 1. V Pawn existujú kľúčové slová true a false. Keďže je to beztypový jazyk, je možné zamieňať typy premenných (vyskočí iba warning). Zistite k akým celočíselným hodnotám sa dajú priradiť výrazy true a false pomocou nasledujúceho kódu: #include <a_samp> main() { new a = ??; if (a) { ?? } } 3. Operácia not Všetky bity naraz je možné znegovať operáciou not, ktorá má len 1 argument a značí sa '~'. #include <a_samp> main() { new a = 0b11001100; printf("%032b", a); printf("%032b", ~a); } 4. Operácie and, or Operácie and a or majú dva parametre a ich výsledkom je jedna premenná s rovnakým počtom bitov. Operácie and a or sa v Pawn vykonávajú na všetkých bitoch premennej zaradom, akoby v cykle. Najprv sa vykoná operácia na prvých bitoch premnenných, potom na druhých bitoch premenných, atď. Pawn obsahuje operátor '&' pre operáciu and, ktorá je tiež nazývaná "bitový súčin". Súčin preto, lebo výsledok tejto operácie je "1" iba v prípade, že obidva parametre sú "1". Operáciu or (tiež nazývanú logický súčet) zapisujeme v Pawne operátorom '|'. To, ako Pawn chápe '&' a '|', nám môže sám ukázať. Vašou úlohou je tieto operácie pochopiť priamo od neho. Výstup programu kvôli prehľadnosti pripomína mechanické sčitovanie "pod sebou na papieri". #include <a_samp> main() { new a = 0b1010, b = 0b1100; printf("0b%b\n0b%b &\n------\n0b%b\n\n", a, b, a & b); printf("0b%b\n0b%b |\n------\n0b%b\n\n", a, b, a | b); } Cvičenie 2. Pri prenose dát sa z kontrolných dôvodov pridáva k preneseným dátam jeden bit navyše, jedná sa o tzv. paritný bit. Prenáša sa 8 dátových bitov a jeden paritný - ten úplne naľavo je paritný. (tj. "100000101"). Vašou úlohou je naprogramovať detekciu hodnoty paritného bitu. Doplňte do nasledujúceho kódu operáciu binárneho súčinu, aby kód správne fungoval. Rada: Chcete detekovať, či bol daný bit nastavený na "1". #include <a_samp> main() { new number = 0b100101101; if (parityBitSet(number)) { print("Paritny bit je nastaveny na 1."); } } parityBitSet(number) { if (??) { return true; } else { return false; } } Cvičenie 3. V zastaralej databáze údajov, ktorá musela šetriť maximálny možný priestor, sú údaje o obyvateľoch uložené v bitoch. Napr. nultý bit (úplne vpravo) obsahuje pohlavie (0-muž/1-žena), ten vedľa neho obsahuje informáciu, či osoba poberá dávky v hmotnej núdzi, nasledujúci hovorí o zamestnanosti danej osoby, atď. Databáza používa celkovo 16 bitov, ostatné sú nedefinované. V novej verzii databázy sa zmenil význam piateho bitu a preto chceme bez zmeny ostatných informácií vynulovať daný bit každej osobe. Doplňte procedúru update() tak, aby databáza spĺňala nové požiadavky. #include <a_samp> new people[] = { 0b1100111100110101, 0b0011001101010101, 0b1111111001110111 }; main() { update(); for (new i; i < sizeof(people); i++) { printf("%016b", people[i]); } } update() { for (new i; i < sizeof(people); i++) { ?? } } 5. Operácie shl a shr Nasledujúce dve operácie vykonávajú aritmetické bitové posuny. Aritmetické znamená, že pri posune sa zachová (záporné), alebo vznikne (záporné) znamienko. SHL a SHR sú skratky pre shift left a shift right. Operátormi pre tieto operácie sú "<<" a ">>". Argumentom bitového posunu je počet bitov, o ktoré chceme číslo posunúť. Pri operátore "<<" je novo-pridaný bit 0. #include <a_samp> main() { new a = 1; for (new i; i < 8; i++) { printf("%08b", a << i); } printf(""); a <<= 3; // je mozne pouzit aj tuto syntax printf("%08b", a); } Na binárnej úrovni sa rozlišujú záporné a kladné čísla najvyšším bitom, tj. celková kapacita 4 bajtov je rozdelená na 2 polovice - kladnú a zápornú. U záporných čísel je 31. bit (ten úplne naľavo) vždy 1, pričom u kladných 0. Aritmetický posun vpravo sa teda správa ináč než ten vľavo. Znamienko čísla sa zachováva pri operácii ">>". Operácia ">>" akoby preskočí bit, ktorý určuje zápornosť čísla a posúva všetky ostatné bity. Lepšiu predstavu o tomto procese získate spustením nasledujúceho kódu. Existuje ešte tretí, logický operátor pre posun vpravo, ktorý (záporné) znamienko nezachováva ani nevytvára. Tento operátor je ">>>". #include <a_samp> main() { new a = -10; printf("%032b = %d", a, a); printf("%032b = %d", a >> 1, a >> 1); printf("%032b = %d", a >> 2, a >> 2); printf("%032b = %d", a >>> 1, a >>> 1); printf("%032b = %d", a >>> 2, a >>> 2); } Cvičenie 4. Majme v desiatkovej sústave číslo "65421". Toto číslo z hlavy vydeľte číslom "100", resp. "10^2". Zvyšok zanedbajte. Výsledok si overte. Cvičenie 5. Majme v binárnej sústave číslo "1101010". Z hlavy vydeľte toto číslo číslom "4", resp. "2^2". Zvyšok zanedbajte. Výsledok si overte. Rovnakým spôsobom výsledok vynásobte číslom "4". Dostali ste pôvodné číslo? Cvičenie 6. Doplňte riešenie cvičenia 2 tak, aby nie len kontrolovalo paritný bit, ale aby kontrolovalo, či je paritný bit správny. Skontrolujte hodnotu všetkých bitov a rozhodnite, či ich počet (či sú párne) sedí s informáciou z paritného bitu. Takáto kontrola sa v praxi používa pri prenose dát. Cvičenie 7. Doplnením do kódu nižšie vygenerujte číslo s takýmto tvarom: "0b1010101010101010". Rada: použite okrem operácie na bitový posun aj bitový súčet (na nastavenie bitu) a bitový súčin (na overenie/zistenie hodnoty nejakého bitu). #include <a_samp> main() { new number = 0; for (new i; i < 15; i++) { if (!(??)) { ?? } ?? } printf("0b%016b", number); } 6. Operácia xor Ako aj v názve, tak aj vo funkcionalite sa podobá operácii or. #include <a_samp> main() { new a = 0b1010, b = 0b1100; printf("0b%b\n0b%b ^\n------\n0b%04b\n\n", a, b, a ^ b); } Cvičenie 8. Istý fanúšik jazyka assembler, Rendall Hide, má rád prácu s bitmi. Posledne o sebe tvrdí, že našiel vlastnosť, ktorá dokáže nastaviť zázračným spôsobom hodnotu akejkoľvek premennej na 0. Mnohí ho majú za blázna a nepočúvajú čo hovorí, ale je naozaj blázon, alebo len neodborná programátorská verejnosť nerozumie kráse jeho mágie? Tvrdí, že dokáže vynulovať premennú bez použitia iných konštánt ako "0" a bez operácií ako násobenie, odčítanie či and. Údajne je táto vlastnosť zapísaná tu: n xor n = 0 Preskúmajte túto údajnú vlastnosť a overte, či Rendall Hide bol naozaj blázon, alebo majster majstrov. Cvičenie 9. Nádejný programátor Peter "VlastneŠifrovanieJeNajlepšie" Skutočný si všimol neuveriteľnú a jedinečnú vlastnosť operácie xor. Nazdáva sa, že by možno odhalil niečo, čo by nazýval "symetrické šifrovanie", hoc názvom si ešte nie je istý. Prezrite a vylúštite na bitovej úrovni pozadie tejto operácie. #include <a_samp> const secret = 123456; main() { new number = 9087324; number = encode(number); printf("My new hashed password is: %d", number); number = decode(number); printf("The real password is: %d", number); } encode(number) { return number ^ secret; } decode(number) { return number ^ secret; } Cvičenie 10. Alen During, známy hejter, si s obľubou prezerá internet a hľadá veci na kritiku. Po zlej noci počas ranného rituálu s telefónom našiel príspevok Petra Skutočného a jeho procedúry encode() a decode(). Nemal však chuť sa niečím takým zaoberať a tak mu zo svojho smartphone-u poslal jediný snippet bez slov. Čo ním asi chcel povedať? #include <a_samp> main() { new crackedSecret = gimmeSecret(9087324, 9128732); printf("%d", crackedSecret); } gimmeSecret(pass, hashedPass) { return pass ^ hashedPass; }
  22. 4 points
  23. 4 points
    Mně se nelíbilo ani LV logo stejně tak jako tohle. Já nevím, ale 5 čar ve čtverci se zaoblenými rohy mi opravdu z hlediska prezentace nic nepředá. A už vůbec v tom nevidím jakékoliv spojení s Pawn, Pawno, programováním, hrami, GTA. Vidím v tom jen nařízlou pružinu na modrém pozadí. Je to defakto úplně to samý jako LV logo, jen jsi přidal jednu čáru navíc a celý jinak poskládal. Na originální loga s figurkou nikdo neštěkal, protože vytvářely symbolitu vůči fóru. Ty se představuješ jako grafický designér, ale takoví lidi už musí vědět, že logo je úplně to první, co působí na potencionální zájemce/klientelu/návštěvníky. A jestli dle tvého názoru je opravdu 5 čar to nejlepší co se jim dá prezentovat, tak nechápu co v branži ještě děláš. Loga s figurkou spojovala název fóra s jazykem Pawn (a moc práce jim to nedalo, vždyť jsme na pawno.cz) a díky jednoduchému prvku figurky se lehce vrývalo do paměti. Neříkám, že by tu prostě absolutně totálně a jedině mělo být logo s prvkem figurky, ale podotýkám, že figurka byla s tímto fórem nejlépe spojená a toto spojení krásně ladilo s názvem i s tématem. Co se týče potencionálního nového loga, nevím proč by to nemohla být figurka (stále neříkám, že přes figurku nejede vlak), i když se fórum odebírá jiným směrem. Pawno.cz bude vždy evokovat jazyk Pawn, toho se už nikdy nezbaví - maximálně byť by změnilo název a doménu. A figurka není vůbec spojená se SAMP ani GTA. A jako významný prvek loga mi stále přijde originální (vůči konkurenčním portálům o programování). Logotyp je kapitola sama o sobě. Řekněme, že to není ještě taková šílenost jako logo samotné. Může to i fungovat, ale podle mého (velice subjektivního, neprofesionálního a laického) názoru je to trochu rušivý element. Mně jako návštěvníkovi to do obsahu zbytku stránky prostě nesedí, ale není to úplně něco co by trhalo oči. Ale říkám, do tohoto zas tolik nevidím, můj názor se může brát jen jako oko zaměřené demografie. Změny a budoucnost Lukášovi Valentovi a později i vEndovi jsem odeslal kostru navrženého konceptu. Jelikož se mi LV přestal ozývat, usuzuji, že koncept kluci uchytili a vezmou v potaz mé myšlenky. Rád bych jim více přiblížil a předal nasbírané zkušenosti z mnoha projektů, které jsem měl na starosti a ve kterých jsme řešili obdobné problémy. Rád bych, aby si tu nikdo nedělal nějaký obrázek trojského koně. Já jsem se nepřišel hádat, ničit komunitu ani rozvracet týmy, já chci pomoci zvednout toto fórum zpátky na úroveň, kterou si zaslouží. A potřeboval jsem mírně ostré metody k tomu, abych zjistil, jak to tady vůbec je. Omlouvám se tímto zdejšímu moderátorskému týmu. Přesvědčili jste mě o tom, že se tu opravdu nekopete do zádelí a snažíte se jít pokroku naproti. Jmenovitě se omlouvám hlavně Luciferovi, kterému jsem mírně křivdil. Co se týče mého konceptu. Nevím do jaké míry by ho chtěli kluci naplnit, nedostal jsem žádnou odezvu. Rád bych se zapojil a pomohl jakýmkoliv způsobem, jakékoliv oblasti, kterou jsem popsal v konceptu. Mohu nabídnout i finanční pomoc, profesionální grafickou práci od mých kontaktů i celá psaná školení o marketingu (která jsou dostupná jen za poplatek). Koncept Koncept jsem originálně založil na trellu jako holou kostru myšlenek. Některé analýzy jsem netrefil, jiné ani do trella nenapsal. Proto trello úplně obejdu a sepíšu veškeré sepsané i nesepsané myšlenky rovnou sem do jednoho celku. Nové směry Je potřeba začít se věnovat novým titulům GTA. Možná bych ze začátku přeskočil GTAIV, jelikož hráčská základna se nikdy nedostane vysoko. GTAV má solidnější budoucnost, již existují multiplayerové modifikace a probíhá dokonce merge dvou hlavních. Pokud je potřeba na to sepsat nějakej malej content, rád něco sepíšu. Když už jsme v herní tématice programování - bylo by vhodné věnovat se i developmentu her. Je to dokonce odvětví, kterému se česká scéna moc nevěnuje. Česká Unity 3D fóra neexistují a pokud ano, tak o nich nikdo neví. Přitom stále roste zájem čechů se Unity 3D věnovat. To samé platí i o Unreal Enginu. Já jsem schopný sepsat nějaké návody pro Unity, jelikož je to můj koníček, mám na kontě nespočet miniher a 3 mobilní tituly. Nevím jak se to zde má s webovým vývojem, jak si na tom stojí PHP, ASP.NET, Java(script) atd. Vím že něco takového tu už v minulosti bylo a víceméně fungovalo. Jak se to má nyní moc netuším, ale možná by stálo za to tyto sekce probudit. Jako potencionální dvířka k novým diskuzím se mi zdá modding jiných herních titulů. To by ale chtělo, aby si vzal na starosti někdo, kdo má nějaký zájem o modding obecně. Sociální sítě Co jsem pochytil, je fakt, že sociální sítě jsou naprosto mrtvé. Je třeba vybrat správce sociálních sítí, který bude pravidelně šířit odkazy na zajímavá témata, šířit povědomí o fóru a starat se o odezvu. Bylo by dobré zaplatit si malou reklamu. Třeba budget 30Kč na den. Přivede to nové lidi a možná i profíky, které potřebujeme. Pokud LV nechce investovat, já mu s tím finančně klidně pomůžu. Herní servery Již od dob chytráka jsem měl plán na revoluční herní server. Nikdy jsem neměl dost podpory k tomu ho zrealizovat. Nejde ani o výborný Gamemód ani o perfektní rovnováhu Filterscriptů. Jde o myšlenku open source živého projektu. Celý Gamemód by mohl být vyvíjen celou komunitou např. na githubu. Jednou týdně by se dělal merge a nahrávalo by se to na herní server. Samozřejmě by byla potřeba nějaká moderátorská síla k ukočírování pull-requestů, ale to je to nejmenší. Nikdo tu nikdy nevzal v potaz, že CS 1.6, CSS, CSGO servery si konkurují kvalitou jejich módů. Jsme ku*va na fóru o pawnu, proč doprdele nemáme vlastní servery? Já si myslím, že pokud by se myšlenka open source serveru převedla i na tyto hry, mohli bychom nasbírat vážná čísla hráčů, kteří začnou dřív nebo později být aktivní i zde na fóru. Nejlepší způsob jak si zauzlovat hráče je přes hru. Samozřejmě bychom mohli provozovat servery i v jiných hrách, napadne mě např. Garry's mod, TF2, atd. i mimo Valve tituly. I zde bych byl ochotný zainvestovat výpočetní výkon, pokud LV nebude chtít financovat. Je také možnost vytvořit nějaké VIP systémy mimo open source řešení, které tyto servery zafinancují. Hosting Je to plán na dlouhou trať, ale plno lidí si zde shání klientelu pro své VPS/herní hostingy. Proč toho nevyužít a nenabízet hosting vlastní? Trochu to zvedne budget na ostatní oblasti. Marketing Je potřeba trochu zainvestovat do reklamy a dostat Pawno.cz do povědomí potencionálních návštěvníků. Pokud si já představím, že bych pawno neznal a vyskočil by někde na mě zajímavý banner s textem PAWNO.cz asi by to mou pozornost na chvíli upoutalo. Chtělo by to využít tento marketingový potenciál k nalákání nových lidí. Komunitní akce Těch pokusů zde již bylo příliš mnoho. Jednou se zde málem pronajala celá hospoda na LAN párty a nakonec se zjistilo že by přišli 4 lidi. Je třeba s tím kluci začít něco dělat. V naší době jsme nebyli plnoletí, nyní jsme. Vlaky, autobusy nás z místa A na místo B dostanou. Já vám nabízím HTC Vive virtuální realitu, ale musíte dorazit na místo setkání. Pokud si to nikdo nechce vzít na starost, tak já klidně vyberu místo, datum a čas kdy se sejdeme, dáme dvě pivka, zahrajem si VR a půjdem zase domu Obsah Co se týče kategorizace a rozvržení obsahu. Nevím jak je na tom tento systém, ale phpBB mělo možnost vnořovat sekce do sekcí a do dalších sekcí. Využijte toho pro "uklizení" hlavní stránky. Na hlavní stránce je kvantum informací a nelze se v tom dobře orientovat. Udělejte sekci Pawn v té GTASA, GTAIV, GTAV atd. Toto převeďte pro všechny sekce. Nejlepší výsledek by bylo, kdyby na hlavní stránce zůstalo tak 5 - 7 sekcí maximálně.
  24. 4 points
    Čas do kedy možno aktivovať hru: do 25 apríla, 09:00 rána Ak si hru aktivujete zostane vám! https://register.ubisoft.com/acu-notredame-giveaway/en-US
  25. 4 points
    Nechtěl jsem se už vyjadřovat, ale musím tě upozornit, že nejsem HighPrint. HighPrint je naprosto jiný člověk, pouze máme stejného avatara a podpis (z historických důvodů). To jen abys neměl špatné mínění o někom jiném. Nikdy jsem nenapsal, že jsem lepší grafik, že dělám lepší grafiku a argumenty typu "Tak to udělej líp" jsou dětinské. Neboj, pro fórum jsem udělal už pár věcí, stejně jako spousta lidí. Do outu nic zahrávat nemusím, s člověkem jako ty nemá cenu diskutovat. Nikam se takhle neposuneš, ale to už je tvůj boj. Oba jsme ukončili diskuzi a i přesto jsi se znovu ozval. Že by tvá slova vypovídala spíše o tobě? 🙂 Já zas nemám problém diskutovat veřejně 🙂 Ahoj
  26. 4 points
    Rozhodl jsem se pokračovat, asi před měsícem jsem na to narazil v jedné kouzelné složce. Tak jsem si zapl server a začal jsem hledat bugy, zatim jsem opravil stats (životy, vesta, pohlaví) snažim se zjednodušit všechny příkazy aby nebyli dlouhé atd.. Dále jsem odstranil to že si můžete koupit celu jelikož to je docela blbost a ponechal jsem z toho jen samotku jelikož to funguje jak prison na normal rp serverech. Opravil jsem kupovaní drog a zbraní pro officiální gangy, dále jsem malinko předělal register/login proto proběhl wipe jelikož staré účty už stim nechtějí fungovat. To je asi vše na co si ted' vzpomenu, neočekám od toho že tam bude někdo hrát, ale zkusit to přece můžu, nic tim neztratim. Toto je pouze takové info, všechno zapíšu v update příspěvku až to bude hotové.
  27. 4 points
    Zdravím, od listopadu do května jsem modeloval 12 ostrovu v blenderu. Používal jsem budovy ze hry ovšem terén silnice a mosty jsem modeloval sám. Zde je video jak to celé vypadá. Video je pojato relaxačně a dobrou podkladovou hudbou. Enjoy.
  28. 4 points
    1. Nauc se anglicky 2. Preloz si video Nemas zaco. dej rep+
  29. 4 points
  30. 4 points
    Já ti s tím poradím. Vykašli se na to a běž na sobě pracovat. Běž cvičit, sebevzdělávat se, následovat své sny. Tohle je jen obrovská ztráta času.
  31. 4 points
    Ahoj všetci! Poslednou novinkou na našom serveri je nový systém mobilu. Dúfam, že sa vám bude páčiť.
  32. 4 points
    OFFICE CENTER LV Ahoj všem Dovolte mi představit vám moji řadově druhou mapu. Chci tedy předem říct že se nepovažuji za mapera a i když se v sampu pohybuji již 10 let vždycky sem se věnoval jen pawnění. Chybí ještě vybavit kanceláře,ale tam už asi žádný zázrak nečeká. Doporučuji kouknout i na videa kde je vidět vybavení restaurace a detaily jako sklad a osvětlení areálu ve tmě. Mapa byla dělaná na zakázku a majitel je spokojený. FOTO VIDEO Děkuji všem za zhlédnutí a případný komentář. Příště se podíváme na moji první mapu která zatím nebyla dokončena. UKÁZKA
  33. 3 points
    SCRIPT ZCELA PŘEPSÁN JUST ADMIN SCRIPT 1.1 pro 0.3.7 UPDATE MÍSTO ADMIN LEVELU JMÉNO OPRÁVNĚNÍ ROZSÁHLÝ SEZNAM ADMINISTRÁTORSKÝCH PŘÍKAZŮ POUŽITÍ JEDNOTLIVÝCH PŘÍKAZŮ DLE OPRÁVNĚNÍ UDĚLOVÁNÍ TITULŮ A TAGŮ HRÁČŮM VE HŘE ZOBRAZENÍ STATISTIK HRÁČE ZOBRAZENÍ JMÉNA BAREV A JEJICH HEX INGAME SEZNAM VŠECH MODELŮ VOZIDEL ROZSÁHLEJŠÍ SEZNAM A ÚDAJE ONLINE HRÁČŮ MOŽNOST UPRAVIT ÚDAJE OFFLINE HRÁČE POROVNÁNÍ JustAdminSystem v0.3 VS JustAdminScript 1.0 Kompilovaný JustAdminSystem v0.3 Počet příkazů: 68 (+13 VIP) Počet řádků v .pwn: 1816 Velikost .amx: 357 kB Kompilovaný JustAdminScript v1.0 Počet příkazů: 77 Počet řádků v .pwn: 1481 Velikost .amx: 108 kB INFORMACE O JAS Script obsahuje 8 oprávnění, Nelze obejít zmražení, zatčení ani umlčení. Všechno se hráči po návratu serveru či po respawnu opět nastaví, Soubory hráčů se ukládají do scriptfiles/AS/nick.sav, Při nastavení čehokoliv co obsahuje barvy (nick, titul, tag), se místo hex píše jméno barvy (black, red, yellow), Každý administrátor může u časových trestů nastavit 60 vteřin krát jeho admin level, Zabanovaní hráči se na server mohou vrátit ale opět budou vyhozeni se zprávou kdo je banoval a za co, V minulé verzi byly 4 fce na udělení a odstranění titulu. Teď jsou 2. Po příchodu na server se napíše kolik hráčů s maxima je připojeno na serveru, a samozřejmě credits autora. Na všechny časové tresty online (freeze, mute a jail), je pouze jeden timer, který je nastavený po 1 vteřině, místo původních 3. Všechny příkazy obsahuje tuny ošetření a pojistek, aby například nešlo hráči, co neni online cokoliv dát. Administrátorský /port obsahuje několik variant (pěšky, s vozidly, s určitým vozidlem). Při udělení zbraně, či spawnu vozidla se napíše jméno namísto ID. Administrátor s jakýmkoliv levelem, nemůže cokoliv udělovat administrátorům s vyšším levelem(např. Pomocník nemůže nastavit život Moderátorům). Lze upravit údaje i offline hráčům. A mnohem více... UPRAVENÍ DAT OFFLINE HRÁČE Bez problémů lze upravit jakékoliv data od určení zda má titul, po barvu až po důvod banu. Ale má to několik podmínek: 1. Při udělení Ano/Ne údajů se MUSÍ napsat pouze číslo 0 pro Ne, a 1 pro Ano. 2. Při udělení barev (titulu, tagu), se MUSÍ napsat 6místný hex kód (FFFFFF, FF0000, 00FF00). 3. Při udělení trestů (Zmražení, uvěznění, umlčení), při udělení/úpravě času se MUSÍ přidat i Ano/Ne u daného trestu. 4. Při odebrání titulu/tagu je třeba upravit i ano/ne. 5. Při udělení stringu (jméno titulu, jméno tagu) se musí napsat alespoň 3 znaky(např. abc nebo univerzální je none). MAKRA A FUNKCE //ID startovního id, od kterého se budou odvýjet další ID dialogů ve výčtu hodnot: #define START_DIALOG_ID (1111) //Délka souboru při ukládání hráčů: #define MAX_FILE_PATH_LEN (30) //Seznam maker oprávnění: #define LEVEL_PLAYER (0) // Hráč #define LEVEL_TESTADMIN (1) // Zkušební #define LEVEL_HELPER (2) // Pomocník #define LEVEL_MOD (3) // Moderátor #define LEVEL_ADMIN (4) // Administrátor #define LEVEL_MAINADMIN (5) // Správce #define LEVEL_DEVELOPER (6) // Vývojář #define LEVEL_OWNER (7) // Majitel // Počet Administrátorských oprávnění od LEVEL_PLAYER po LEVEL_OWNER: #define MAX_ADMIN_LEVEL (8) // Počet vložených barev: #define MAX_COLORS (12) // Nejdelší jméno barvy (orange): #define MAX_COLOR_NAME_LEN (6) // Nejdelší jméno oprávnění, včetně barev ({37DBE1}Administrátor): #define MAX_ADMIN_RANK_LEN (21) // Největší možná délka titulu: #define MAX_TITLE_LEN (25) // Největší možná délka TAGu: #define MAX_TAG_LEN (15) // Počet povolených vozidel pro spawnutí v /car #define MAX_ENABLED_AVEHICLES (10) // Počet možných vteřin, které může LEVEL_TESTADMIN udělit u časových trestů: #define TIME_MAX_PUN_ALLOWED (60) // Minimální velikost pingu povolená proti /pingkick: #define MAX_ALLOWED_PING (300) // ID všechn trestů pro fci: #define PUNISH_ID_FREEZE (1) #define PUNISH_ID_MUTE (2) #define PUNISH_ID_JAIL (3) // Basic: GetVehicleModelName(playerid); GetPlayerAdminLevel(playerid); HasPlayerTitle(playerid); GetPlayerTitle(playerid); GetPlayerTitleColor(playerid); HasPlayerTag(playerid); GetPlayerTag(playerid); GetPlayerTagColor(playerid); SetPlayerTitleColor(playerid, color); SetPlayerTagColor(playerid, color); IsPlayerOnPort(playerid); IsPlayerBanned(playerid); GetPlayerBanReason(playerid); IsPlayerFreeze(playerid); IsPlayerJail(playerid); IsPlayerMute(playerid); GetPlayerFreezeTime(playerid); GetPlayerJailTime(playerid); GetPlayerMuteTime(playerid); SetPlayerFreezeTime(playerid, time); SetPlayerJailTime(playerid, time); SetPlayerMuteTime(playerid, time); SendErrorMessage(playerid, msg[]); GetAdminLevelName(playerid); GetAdminLevelColor(playerid); SetPlayerAdminLevel(playerid, level); IsPortEnabled(); HasPortEnabledVehicles(); GetPortInterior(); GetPortVW(); GetPortX(); GetPortY(); GetPortZ(); GetPortA(); GetPortSpecifModel(); // Zajímavější: ChangeTitleStatus(playerid, sTitle[], hColor, bool:bTakeGive); ChangeTagStatus(playerid, sTag[], hColor, bool:bTakeGive); SavePlayerData(playerid); LoadPlayerData(playerid); PunishPlayer(playerid, pun_id, bool: pun, time = 0); GetPlayerTagAndTitle (playerid, text[]); GetCountConnectedPlayers(); ShowHowUseCommand (playerid, sCommand[], sParams[]); SetServerPort(bool: status, Float: x, Float: y, Float: z, Float: a, bool: vehs = false, model = 0); SendErrorMessage() Odešle se červená zpráva. playerid - komu msg[] - text Příklad: SendErrorMessage(playerid, "[ ! ] Nemáš dostatek peněz !"); ChangeTitleStatus() a ChangeTagStatus() Nastaví titul (za nickem) a tag (před nickem) hráči ve hře. playerid - komu se nastaví sTitle[] / sTag[] - Co se mu nastaví, bool: bTakeGive - true pro nastavení, false pro odebrání Příklad: commmand<LEVEL_PLAYER>(givevip, cmdid, playerid, params[]) { ChangeTitleStatus(playerid, "Premium", 0xFFFF0000, true); ChangeTagStatus(playerid, "VIP", 0xFFA50000, true); return CMD_SUCCESS; } PunishPlayer() Udělí nebo odebere trest(mute, freeze, jail) hráči ve hře. playerid, - komu se nastaví, pun_id - ID trestu jako je PUNISH_ID_FREEZE (1), PUNISH_ID_MUTE (2) nebo PUNISH_ID_JAIL (3), pun - true pro nastavení, false pro odebrání, time - čas ve vteřinách Příklad: command<LEVEL_PLAYER>(muteme, cmdid, playerid, params[]) { PunishPlayer(playerid, PUNISH_ID_MUTE, true, 1000); SendClientMessage(playerid, -1, "Úspešně jsi se umlčel na 1000 vteřin !"); return CMD_SUCCESS; } GetCountConnectedPlayers() Zjistí počet online hráčů na serveru. Příklad: command<LEVEL_PLAYER>(howmany, cmdid, playerid, params[]) { new str[35 + 1]; format(str, sizeof str, "Na serveru je momentálně %i hráčů", GetCountConnectedPlayers()); SendClientMessage(playerid, -1, str); return CMD_SUCCESS; } Hráč /acmds - Seznam všechn příkazů /admins - Seznam online administrátorů /port - Warp na administrátorský port Zkušební /colors - Seznam jmén barev a jejich hex /models - Seznam modelů a jejich modelid /gmtext - Gamemode text na server /gmtext2 - Druhá varianta gamemode textu /para - Dát si padák /jetpack - Dát si jetpack /var - Varovat hráče (neomezené, nevyhodí hráče) /spam - Zaspamuje chat slovem SPAM /cc - Promaže celý chat /flip - Obrátí vozidlo /say - Napíše do chatu, co napsal administrátor /day - Nastaví den na serveru /night - Nastaví noc na serveru /tempfreeze - Dočasně zmrazí /tempjail - Dočasně uvězní /tempmute - Dočasně umlčení /unfreeze - Odmrazí hráče /unjail - Propustí hráče /remove - Vyhodí hráče z vozidla /unmute - Odmlčí hráče /admincar - Spawnutí administrátorského vozidla /dadmincar - Zničení administrátorského vozidla /goto - Port k hráči /get - Port hráče k sobě /setport - Nastavení administrátorského portu /remport - Vypnutí administrátorského portu Pomocník /jail - Uvěznit hráče /mute - Umlčet hráče /freeze - Zmrazit hráče /nickcolor - Nastavení barvy nicku hráče /repair - Opraví hráči vozidlo /getstats - Zobrazení statistik hráče /disarm - Odzbrojí hráče /time - Nastavení času na serveru /weather - Nastavení počasí na serveru /sun - Nastavit slunečno na serveru /rain - Nastavit déšť na serveru /pingkick - Vykopnout hráče jestliže má moc velký ping (MAX_ALLOWED_PING) /skin - Nastavení skinu hráči /admcol - Nastavení barvy zprávy /admmess - Napsání zprávy na serveru Moderátor /kick - Vyhodit hráče ze serveru /ban - Zabanovat hráče na serveru /gm - Darovat hráči peníze (max 10,000,000$) /gw - Darovat hráči zbraň a munici /hide - Skrýt/odkrýt nick na mapě /car - Spawnutí vozidel na serveru /dcars - Zničeni vozidel na serveru /settag - Nastavení TAGu u hráče /removetag - Odebrání TAGu u hráče /kill - Zabít hráče /world - Poslat hráče do jiného světa /back - Poslat hráče zpět z jiného světa /wl - Nastavit hráči wanted level /respawn - Respawnout hráče Administrátor /getall - Portnout všechny hráče k sobě /rmoney - Resetovat hráči všechny peníze /takemoney - Odebrat určitý obnos hráči /hp - Nastavit hráči život /ar - Nastavit hráči vestu /destroy - Zničit hráči vozidlo /vhp - Nastavit hráči život vozidla /mypos - Zjistit souřadnice a úhel pohledu hráče /pos - Pornout se na dané pozice /plist - Zobrazení statistik všechn hráčů Správce /god - Nastavení nesmrtelnosti (i po spawnu) /godoff - Zrušit nesmrtelnost /resetplayer - Resetovat všechny údaje hráče /setdata - Nastavit data offline hráči Developer Majitel /setmeowner - Nastavit si majitele /setalevel - Nastavit AdminLevel hráči VLOŽENÍ jascript1.amx NA SERVER 1. Vložit jascript1.amx do filterscripts 2. Napsat v server.cfg do filterscript řádku jascript1 3. Vytvořit ve scriptfiles složku AS 4. Připojit se na server a zadat /setmeowner (potřeba RCON) 5 Hotovo DOWNLOAD
  34. 3 points
    kingsofsa.cz:8888 Discord Uplynuly nám téměř dva roky a narozdíl od Kalcora jsem to já s vývojem ještě nezabalil. Zde je výběr těch nejvýznamnějších věcí, které byly na KSA za tu dobu přidány: V módu pro RP se zobrazují zprávy i nad hlavami hráčů, kteří je napíšou. Lze také nastavit dosah těchto zpráv. Ve světě 0 je vždy nastaveno náhodné počasí a čas odpovídající skutečnému (i s proměnlivou délkou dne podle části roku). Navíc se dá počasí a čas libovolného světa synchronizovat s tímto. Objekt vytvořený v jednom světě zůstane viditelný pouze v tom světě a v jiných se nezobrazí. Nyní vás již nikdo nemůže rušit při stavění tím, že by vám mazal objekty! Po dlouhých útrapách jsem byl konečně schopen přidat dva příkazy, které jste nejvíc chtěli: /cjanims a /vehlights. První nastaví animace běhu, chůze a držení zbraně pro všechny skiny podle vzoru skinu CJ (normálně má každý skin animace jako ze singleplayeru), zatímco druhý povolí manuální ovládání světěl (a motoru) vozidel i ve dne. Nebylo lehké tohoto docílit, ale podařilo se, byť jistým kompromisem (je potřeba se ze serveru odpojit a znovu se připojit, čemuž pomůže příkaz /reconnect). Ta nejdůležitější věc se týká miniher, ze kterých donedávna byly na serveru možné pouze piškvorky (které prošly menším grafickým vylepšením). Nově však je možné na KSA hrát zcela nový typ minihry a sice závody. Bylo přidáno 30 tratí pro závodění v různých oblastech San Andreas a různých interiérech, s širokým výběrem vozidel, nastavením počasí a času a podporou pro jednoho či více hráčů. To vše v přehledném dialogovém rozhraní pod příkazem /minigames, kde lze vytvořit a nastavit minihru, a následně stačí pouze pozvat lidi, které chcete, (nebo celý server) a minihru odstartovat. Neváhejte a přijďte si vyzkoušet nové příkazy a užít si závodění!
  35. 3 points
    JUST HOUSE SYSTEM v1.0 Na přání neustále neúnavně otravného uživatele @Woody OVLÁDÁNÍ PRO MAJITELE DOMU OVLÁDÁNÍ PRO UŽIVATELE CO NEVLASTNÍ DŮM VKLÁDÁNÍ A VYBÍRÁNÍ PENĚZ DOMU VKLÁDÁNÍ ZBRANÍ DO DOMU VYBÍRÁNÍ VŠECH ZBRANÍ Z DOMU VÝPIS UDÁLOSTÍ DO CHATU KOUPĚ NOVÝCH VOZIDEL DO GARÁŽE DOMU INFORMACE O JHSYSTEM Každý hráč může mít pouze 1 dům. Každý dům musí mít alespoň jeden slot pro vozidlo, a může mít pouze ten jeden. Vozidlo se dá zaparkovat do garáže, a jen pouze jedno. Vozidlo lze vložit do domu i předtím, než se vůbec koupí. Do domu lze vložit pouze zbraně určitého typu (chladné zbraně, pistol...) a jen pouze zbraň, která se vložila naposledy, to znamená, že jakmile hráč vloží nůž, může pak už jen vkládat nože. Do domu lze vejít i když ho hráč nevlastní. Dům může mít několik interiérů od nejhorší (nejmenší) po nejlepší (největší). Do domu nelze vejít, když je zamčený. Do vozidel, která patří určitého domu může nastoupit jen hráč, který má stejné jméno jako majitel domu. SEZNAM FUNKCÍ A MAKER #define MAX_HOUSES (300) Maximální počet domů. #define DIALOG_START_ID_LIST (4291) ID dialogu od kterého začne seznam id dialogů(4291, 4292, 4293...). #define HOUSE_INTERIOR_RATE1 (5) #define HOUSE_INTERIOR_RATE2 (4) #define HOUSE_INTERIOR_RATE3 (3) #define HOUSE_INTERIOR_RATE4 (2) #define HOUSE_INTERIOR_RANK5 (1) #define HOUSE_INTERIOR_RANK6 (0) Hodnocení interiéru v domech známka ve škole. GetHouseFreeID(); Vrací id volného nepoužitého domu. Jinak vrátí -1 když nenajde. AddNewHouse(Float: x, Float: y, Float: z, price, inter, owner[] = "City", bool: buy = false); Vytvoří nový dům. Parametry: Float: x, Float: y, Float: z - Pozice domu a pickupu, který se vytvoří. price - Cena za který se dům koupí inter - Jaký interiér dům obsahuje(lze použít HOUSE_INTERIOR_RANK) owner[] - Majitel domu. bool: buy - V případě true je dům koupený a false není. AddHouseVehicleSlot(houseid, Float: x, Float: y, Float: z, Float: a); Přidá k danému domu slot pro vozidlo. Parametry: Float: x, Float: y, Float: z, Float: a - Pozice a rotace vozidla, kde se u domu pak bude vytvářet (spawnovat) auto. CreateHouseVehicle (houseid, modelid); Spawne do slotu u daného domu (houseid) vozidlo. Další funkce: IsHouseOwner(houseid, nick[]); IsHouseExist(houseid); GetHouseOwner(houseid); GetHouseIDByPlayer(playerid); EnterIntoHouse(playerid); LeaveFromHouse(playerid); SaveHouseData(); LoadHouseData(); BuyThisHouse(playerid, houseid); SellThisHouse(playerid, houseid); LockHouse(houseid); UnlockHouse(houseid); GetHouseInterior(houseid); IsHouseOwned(houseid); GetHouseNumber(houseid); GetHousePrice(houseid); GetHouseX(houseid); GetHouseY(houseid); GetHouseZ(houseid); GetHouseVehSlotX(houseid); GetHouseVehSlotY(houseid); GetHouseVehSlotZ(houseid); GetHouseVehSlotA(houseid); NÁVOD K POUŽITÍ Celý JHS je celkem samostatný, takže stačí použít minimálně 3 funkce a je hotovo. Vše bude v pořádku v momentě kdy vám to nevyhodí žádné varování, že nebyla použita nějaká z fcí! Oba public jak OnFilterScriptInit() tak OnFilterScritExit() vložit například ke zbytku publicu nebo úplně na konec FS. Co je potřeba použít: AddNewHouse() - Přidá nový barák, není potřeba ani přidávat majitele či zda je koupen. AddHouseVehicleSlot() - Funkce kam se nakonec spawne u daného domu auto po jeho zakoupení. SaveHouseData() - Tato fce je nutno použít 2x a to po vpisu všech údajů o domě a vozidle, a při vypnutí fs, jelikož přepíše případné změněné údaje(majitel domu). public OnFilterScriptInit() { AddNewHouse (1446.8379, 1959.3004, 11.2146, 1500000, HOUSE_INTERIOR_RATE1, "test1", false); AddHouseVehicleSlot(0, 1442.9637, 1959.9764, 10.9029, 0.0); AddNewHouse (...); AddHouseVehicleSlot(1, ...); AddNewHouse (...); AddHouseVehicleSlot(2, ...); AddNewHouse (...); AddHouseVehicleSlot(3, ...); SaveHouseData(); // <---- return 1; } public OnFilterScriptExit() { SaveHouseData(); // <--- return 1; } Příkazy: Základní: /dum otevře u pickupu menu domu Další: /houseleft - opustí interiér domu RCON: /housedebug - zobrazí všechny příkazy Download:
  36. 3 points
    Tutorial peknej, ale mam navrh na zlepsovak na tu error msg 😄 #define SendErrorMessage(%0,%1) SendClientMessage(%0,0xFF000000,"[ ! ] {FFFFFF} "%1) Pak stačí použít: SendErrorMessage(playerid,"Něco je špatně"); A compilator se ti už postará o to, aby to začínalo tím [ ! ]
  37. 3 points
    Just Property v1.0 INC #include <jproperty> Porovnávání Áááá, naše oblíbené porovnávání (alespoň pro mě ). 4. Kompilované Just Gang Systém v0.1 má 239 kB 3. Kompilované Just AdminScript v1.0 má 108 kB2. Kompilované Just House Systém v1.0 s 3 domy má pouze 41 kB 1. Kompilované Just Property v1.0 s 1 nemovkou má pouze 20 kB !!! (no to je neuvěřitelné Horste) Funkce Property(p_main: mode, name[] = "", bool: byPos=false, bool:byPlayer=false, player =-1, propertyid =-1, Float:x=0.0, Float:y=0.0, Float:z=0.0, pickupm = 1239); Popis Základní funkce pro práci. Může vytvořit, kopírovat, mazat nebo vynulovat. Parametry mode - Co se bude s nemovitostí dít. name[] - Jméno nemovitost (lze přidat i barvy). MAX_PROPERTY_NAME je 100. bool: byPos - Zda se nemovitost vytvoří na daných souřadnicích (x, y, z); bool: byPlayer - Zda se nemovitost vytvoří dle pozice hráče. player - ID hráče pro byPlayer propertyid - ID nemovitosti pro copy, delete a null. Float: x - pozice x pro byPos Float: y - pozice y pro byPos Float: z - pozice z pro byPos pickupm - Model pickupu. Defautlní je informace. Mode create - Vytvoří nemovitost a pickup. delete - Smaže údaje u nemovitost a zničí pickup. copy - Okopíruje jméno, majitele + pokud je vlastněn, od propertyid a vytvoří novou nemovitost. null - Vynuluje základní údaje (banku, profit, a cenu). Návratové hodnoty propertyid - při create nebo copy nemovitosti. 1 - Při delete nebo null nemovitosti. -1 - Něco se pokazilo. Příklad použití public OnFilterScriptInit() { new policiels, policiesf, policielv; policiels = Property(create, "{00FF00}Policie LS", .byPos = true, .x = 110.3, .y = 54.12, .z = 40.1); policiesf = Property(create, "{00FF00}Policie SF", .byPos = true, .x = 110.3, .y = 52.12, .z = 40.3); policielv = Property(create, "{00FF00}Policie LV", .byPos = true, .x = 111.3, .y = 52.11, .z = 41.3); return 1; } ---- SetPropertyData(p_data: datatype, propertyid, var); Popis Nastaví u nemovitosti údaje. Parametry datatype - Typ údajů. propertyid - ID nemovitosti. var - Hodnota. Datatype valid - To samé jako IsValidProperty(). profit - Profit bank price owned Návratová hodnota 1 - Vždycky 1. Příklad použití if (!strcmp("/buy", cmdtext)) { if (GetPlayerNearProperty(playerid) == -1) return 1; new property = GetPlayerNearProperty(playerid); SetPropertyData(owned, property, 1); SetPropertyOwner(property, GetPlayerNick(playerid)); return 1; } --- Další funkce IsValidProperty(propertyid); GetPropertyOwner(propertyid); SetPropertyOwner(propertyid,nick[]); GetPropertyName(propertyid); GetPlayerNearProperty(playerid); GetPropertyData(p_data: datatype, propertyid); Ukládání a načítání SavePropertyData(propertyid) { DOF2_SetInt(..., GetPropertyData(valid, propertyid)); DOF2_SetInt(..., GetPropertyData(profit, propertyid)); DOF2_SetInt(..., GetPropertyData(bank, propertyid)); DOF2_SetInt(..., GetPropertyData(price, propertyid)); DOF2_SetBool(..., GetPropertyData(owned, propertyid)); } LoadPropertyData(propertyid) { SetPropertyData(valid, propertyid, DOF2_GetInt(...)); SetPropertyData(profit, propertyid, DOF2_GetInt(...)); SetPropertyData(bank, propertyid, DOF2_GetInt(...)); SetPropertyData(price, propertyid, DOF2_GetInt(...)); SetPropertyData(owned, propertyid, DOF2_GetBool(...)); } In-game vytváření za pomocí příkazu CMD:addproperty(playerid, params[]) { Property(create, params, .byPlayer = true, .player = playerid); return CMD_SUCCESS; } DOWNLOAD https://pawno.cz/index.php?/files/file/96-inc-just-property/ https://pastebin.com/FmW0U7yP
  38. 3 points
    Precetl jsem si vsechny komentare nez jsem zacal psat tento topic, tak asi nejak tak budu reagovat na vsechno. V prvni rade u toho rodice asi chapu logiku, ze se zameri na nejvetsi slabinu a tu se bude snazit zlepsit. Coz ovsem pak ma ten negativni efekt ze bude zanedbavana ta cast, kde jiz uspech je. A poto mdemotivace toho zaka atp... Zakladni probem, je v nastavenem skolstvi. Hlavne zakladka a stredni kde jeden neuspesny predmet znamena celkovy konec. Prosel jsem si vsemy stupni vzdelavani (tedy az na doktorske ), ale nejvis mi vyhovovala ta vejska. Hlaven z principu velkeho podilu volitelnych predmetu, kde mel prave clovek moznost si vybrat co ho zajima. A hodne je to i o lidech. Skolu co jsem studoval ja ma po matfyzu asi druhou nejtezsi matiku, ale ti ucitele k tomu maji respekt. Takze jakmile jsem prolezl s matikou pres prvni dva semestry, tak jsem se u zkousek casto potkaval s pristupem "kdyz jste zvladl matematickou analyzu, tak tu skolu uz udelate, tak vam tu zkousku dam". (opravdu matika na vejsce je hard core. Maturitu z matiky jsem delal bez pripravy na prvni dobrou, ale matiku na vejsce jsem delal na x-ty pokus) Respekt ucitele k zakovi jsem opravdu zazil jen na te vysoke skole, uz jenom tim samotnym oslovenim "kolego". A to je prave ten system, ktery by snesl uz jen minimalni upravy, ale podle meho nazoru je nejlepsi. Ovsem dalsi veci je ze to je system pro starsi lidi, kteri uz tam jsou dobrovolne a ne z duvodu zakladni podivnne skolni dochazky. A opravdu uceni jako takove a nejde jen o to ze tak funguje nas mozek, Ono to spis zacina vypadat ze celkovy princip uceni je proste na tom ze se delaji chyby a pak se zpetne zjistuje co je spatne a ja kto napravit. Na stejnem principu funguje uceni umelych neuronovych siti. Uceni funguje metodou zpetneho inzenyrstvi. Proste se neco stalo nebo se neco udela a az poto mse to analyzuje. A ne naopak se ze neco naplanuje a pak se to dela podle navodu To je ten hlavcni duvod proc kdyz ctete scripay nebo nejaky tutorial a dokud neuvidite example nebo si to sami nenakodite, tak to proste nejde Jinak s nazorem ze skola vychovava zamestnance a ne podnikatele souhlasim, ale myslim ze to je hlavne tim, ze se to skolstvi od revoluce temer nezmenilo. A pred revoluci byly vsichni zamestnanci Drive bylo lidem do hlav vtloukano ze podnikatel je zlodej a vykoristovatel a okrada jine. A tem lidem to v tech hlavach zustalo a mysli tak porad a uci to svoje deti. Komunisti jsou sice pryc, ale jejich myslenky tu jsou porad. A nezlepsi se to dokud se ta generace kompletne neobmeni. Dalsi problem je to jak lehce jde lidi manipulovat, dneska je to hodne lehke pomoci televize a internetu. Lidi hodne veri vecem, ktere slysi jako prvni a kdyz prijde druha opacna informace, automaticky ji zamitnou, i kdyz je pravdiva a i kdyz je dokazana. Jako treba zastanci placate zmene atp.. 😄
  39. 3 points
    Ahojte všetci, Včera prebehla v chate pawna zaujímavá diskusia ohľadom momentálneho stavu pawna a jeho budúcnosti. Dnes sme o tom mali s @lvalenta, @vEnd, @HighPrint, @Ewwe, @Lucifer Morningstar diskusiu a zhodli sme sa že spoločne vypracujeme plán, obsahujúci možné zmeny na tomto fóre, ktoré by zaručili tomuto fóru lepšiu budúcnosť. Všetci dobre vieme že aktivita na tomto fóre už nieje ako kedysi pred sto rokmi, keď SA:MP zažíval najlepšie časy, ale myslíme si že posledné mesiace je aktivita na najlepších číslach za poslednú dobu, za čo vďačíme mnohým faktorom. Je ale asi na čase posunúť to ďalej. Touto témou chceme zapojiť vás, teda komunitu do tohto plánu. Chceme aby ste povedali váš názor na to, čo by sa tu malo zmeniť/pridať/zmazať. Každý jeden nápad prehodnotíme a vyjadríme sa k nemu, až to bude aktuálne. Minimálne o štyroch konkrétnych podnetoch vieme a riešime ich už dlhšiu dobu, aj keď to tak možno z vašeho pohľadu nevyzerá. GTA V. Už dlho diskutovaná téma ku ktorej sme sa už viac krát vyjadrili pozitívne. Veľmi radi nasmerujeme toto fórum na niečo nové, niečo čo má väčšiu budúcnosť. Jediný problém je začiatok kedy musíme nových uživateľov zaujať contentom v danej sekcii. To že spravíme sekciu pre GTA V v ktorej bude jeden topic ničomu nepomôže. Pravidlá fóra. Momentálne sú pravidlá kombináciou novšej verzie a tej archaickej, navyše roztrieštené do viacerých tém. Pravidlá budú vyčistené a zjednotené do jednej témy. Logo. Taktiež vec ktorá sa rieši na tomto fóre od kedy bolo nové logo použité. Poviem to skrátene. K starému logu sa fórum nevráti a jediné nové logo ktoré máme je toto. Namiesto toho, aby bolo vtedy nahraté nové logo na fórum "na tvrdo", bola poskytnutá príležitosť vyjadriť sa a komunita si odhlasovala aby toto logo bolo použité. Ak príde niekto s lepšou alternatívou, ktorá bude pekná a dajme tomu krajšia ako táto, nieje problém. Reorganizácia a vyčistenie jednotlivých sekcií O dalších nápadoch momentálne diskutujeme interne a taktiež čakáme čo prinesiete vy
  40. 3 points
    K tomu nekonečnému příběhu kolem loga, ve zkratce. Logo má být pro prezetanci, to se všichni snad shodneme. Nicméně nemusí vystihovat na první pohled kategorii/téma/obor nebo cokoliv jiného. Logo si samo časem vytvoří svou tzv. "známost" stačí mít název, který si lidé budou pamatovat. Samozřejmě, někdy lidé přijdou a někdy se jim musí pomoci, což se dostávámé k bodu propagace. Než se dostaneme k dalšímu bodu, tak abych předešel reakcím kvůli textu výše. Na chvilku se zastavte a zamyslete se. Když by vám někdo řekl nebo před vás dal logo Samsung a vy jste to logo neznali, neznali by jste ani značku Samsung, řeklo by vám to něco? To samé s mnoha dalšími značkami, opět si tu publicitu a známost ta značka, logo vytvořilo časem samo. (https://blog.designcrowd.com/article/744/100-famous-corporate-logos-from-the-top-companies-of-2015) – zde se můžete podívat na loga a odpovězte si, kolik jich vystihuje to, co dělají. Alza.cz – dříve známí jako internetový obchod s počítači, nyní si tam koupíte i toaletní papír a mýdlo, aby jste si měli čím tu prdel umýt. Když se vrátíme zpět k propagaci. Nevím, nemám přehled, zda někde běží nějaká propagace nebo ne, ale chtělo by to. Rozhodně zdarma to nepůjde a tím, že se udělá soutěž, o které vědí pouze nynější uživatelé pawno.cz, tak noví uživatelé také nepřijdou. GTA V je dobrý nápad, je to nejnovější GTA a dlouho asi i bude. Plno lidí říkalo, že když je GTA Online, tak dělání módů a tvorba vlastního obsahu zůstane jen u GTA SA, ale jak je vidět, tak vznikají servery a módy i na GTA V. Nevím jak moc je to rozsáhlé, neorientuji se v tom, ale nebylo by fajn udělat server na GTA V? Lidi by se určitě našli, kteří by na tom chtěli pracovat. Tím by se i rozjela více sekce o GTA V. Také by bylo fajn, oživit/založit sociální sítě, facebook a instagram. Přeci jen, tyto sociální sítě jsou ve stavu, kde je většina populace. Tam bych také směřoval propagaci a vyhledávání dalších návštěvníků a uživatelů tohoto fóra.
  41. 3 points
    MOD OF TESTS 2 VĚCI CO VÁS (NE)ZAJÍMAJÍ: Status: 100 % Autor: Scydo (SkiBig18) Počet systémů: 0 Počet řádků: 156 Velikost AMX: 4 kB Rychlost kompilace: ~1 vteřina Počet vlastních fcí: 0 Počet příkazů: 1 Jde o originální GM(žádná další realná země, žádné další RL nebo RP). Jeho princip je jednoduchý. Je pro lenochy, co si nechtějí na rychlo udělat GM na testy. Takže stačí stáhnout a spustit. Verze 1.0 obsahovala příkazy spolu s i-zcmd 😄. Teď bylo zcela vymazáno. Po připojení se vám změní barva nicku na nějakou náhodnou. Spawnete se před pyramidou v LV. Jediné administrátorské práva jsou RCON(takže žádný LEVEL 5 + RCON). Obsahuje jediný příkaz a to /menu, který je určený pro hráče přihlášené přes RCON. Menu obsahuje: Doplnění života a vesty, spawnutí náhodného vozidla z určeného seznamu, sebevražda, darování si 5 000 000$, zapnutí a vypnutí teleportace přes Market point, despawnutí vozidla, darování náhodné zbraně z určeného seznamu, teleport do Los Santos teleport do San Fierro, teleport do Las Venturas a zavření(kdyžtak stejně stačí enter nebo esc). UKÁZKA: DOWNLOAD
  42. 3 points
    Já bych řekl že to tady nemá vůbec co dělat
  43. 3 points
    Na ten "RCON hack" bych byl zvědavý. Nedokážu si představit, že někdo přijde na server a pomocí "hacků" se dostane ke RCON heslu. Pokud samozřejmě nemluvíme o RZE, ale... je rok 2019, nebo se mýlím? Nicméně... Tohle není návod. K tomu, aby to byl návod, tomu chybí dvě věci: správná formální úprava a vysvětlení. Máme tu šablonu pro psaní návodů a budu k tobě upřímný, dokud návod nesplňuje náležitosti, které jsou tam uvedeny, neschválím ho. A teď k tomu vysvětlení – návod slouží k tomu, aby se člověk naučil něco nového. K tomu potřebuje vědět, jak ta nová věc funguje. Není špatně, když poskytneš fragmenty zdrojového kódu, ale pokud k němu chybí vysvětlení, rovnou to můžeš zveřejnit jako skript. Oceňuji, že ses rozhodl sepsat návod, a proto jsem ti výše napsal, jak dosáhnout toho, abych jej schválil a aby jej lidé ocenili i něčím jiným než sarkastickými reakcemi. Doufám, že si rady vezmeš k srdci. Když jo, tak super, když ne, tak ne, život jde dál.
  44. 3 points
    Měj respekt k těm, kteří se ti snaží pomoct. Nazvat někoho volem jen proto, že to neumíš zprovoznit či stáhnout, je dětinské.
  45. 3 points
    Chtěl bych vidět vaše začátky, kluk má jen 13 let... Dejte mu šanci než začnete spamovat jak hovada jaký je to "trash" nebo jak se mu začnete vysmívat za obsah... Ninjonik ano, ty stránky byly opravdu špatné.. Ale žádný učený z nebe nespadl.... Pokračuj a jednou uspěješ. Bohužel nemůžu zkritizovat co bylo za obsah na stránce protože zdejší lidi na pawnu tě donutili smazat všechny domény což je opravdu velice smutné jak se chováme k sobě v roce 2018 Dospějte lidi...
  46. 3 points
    Budou i další návrhy? Za mě pořád vyhrává dosavadní logo.
  47. 3 points
    YALP Stažení | Dokumentace Nestačí-li Pawn vašim potřebám či chcete místo něj (nebo společně s ním) používat váš oblíbený dynamický jazyk Lua, nezoufejte! Poučiv se z nezdarů předchozích pluginů podobného ražení, stvořil jsem YALP. Na rozdíl od minulých podobných projektů YALP sám o sobě nezná žádné nativní funkce ani callbacky serveru, ale umožňuje s nimi prostřednictvím několika mocných nástrojů interagovat. Díky tomu není potřeba přidávat explicitně všechny funkce nabízené SA-MP; stačí je pouze zavolat. Tím pádem je plugin automaticky kompatibilní se serverem i všemi pluginy a všemi jejich minulými i budoucími verzemi (pokud se nezmění AMX API) a není potřebova ho udržovat aktuální z důvodů nové verze serveru (protože ani nepoužívá žádné pevné adresy v paměti). Co všechno plugin nabízí? Vše, co umí Pawn ve spojení se serverem. Jako to dokáže Pawn, tak i Lua umí přes YALP zavolat libovolnou nativní funkci, kterou server poskytne, a pomocí veřejných funkcí může server volat kód v Lue. Kompatibilita je zaručena i s pluginy, které využívají více funkcí Pawnu, například tagy či zpožděné vyhodnocení kódu (PawnPlus). Veškeré nové funkce přirozeným způsobem rozšiřují to, co dokáže samotná Lua, a zapadají do jejího ekosystému. Co všechno plugin nenabízí? Součástní kódu pluginu není žádná definice nativní funkce či callbacku z SA-MP; vše dokáže již samotná Lua pomocí ostatních funkcí nabízených pluginem. Sice to může připadat jako nevýhoda, že si všechno musíte nadefinovat sami, ale díky tomu se může plugin zaměřit na ty podstatné věci a neřešit například, co má vracet funkce GetPlayerPos (která místo toho bude vracet to, co po ní sami budete chtít). Jak to může fungovat? Hlavní část nových funkcí v Lue, balíček interop, při registraci načte z paměti speciálně vytvořený filterscript, který sám o sobě žádný kód neobsahuje, ale všechna volání funkcí v AMX API jsou pomocí hookování přesměrována do pluginu, který otestuje, zdali náhodou neodpovídají onomu filterscriptu. V podstatě tedy (z pohledu objektového programování) přepíše AMX API vlastní implementací jeho funkcí (jako amx_Register, amx_FindPublic, amx_Exec apod.). Tyto funkce se chovají naprosto stejně jako standardní AMX API, akorát uvnitř pracují s prostředím Lua. Navenek tedy nativní funkce nemají žádné ponětí o tom, že jsou volány z jiného jazyka, a mohou to zjistit pouze tak, že by přistupovali ke struktuře AMX přímo (což slušné funkce nedělají). Při volání nativních funkcí je využíván standardní zásobník AMX, takže i funkce pracující v běžné míře s pamětí také fungují. Příklad local interop = require "interop" local native = interop.native local commands = {} function commands.lua(playerid, params) -- není potřeba importovat funkci, stačí pouze zavolat! native.SendClientMessage(playerid, -1, "Hello from Lua!") return true end function commands.setpos(playerid, params) -- lze použít i funkce z jakéhokoliv pluginu local fail, x, y, z = interop.vacall(native.sscanf, interop.asboolean, params, "fff")(0.0, 0.0, 0.0) -- návratová hodnota se dá lehce specifikovat if fail then return native.SendClientMessage(playerid, -1, "Wrong arguments!") end native.SetPlayerPos(playerid, x, y, z) return true end function interop.public.OnPlayerCommandText(playerid, cmdtext) -- je potřeba správně převést hodnoty (YALP nedokáže určit jejich typ) playerid = interop.asinteger(playerid) cmdtext = interop.asstring(cmdtext) -- můžete využít všech výhod, které Lua nabízí local ret cmdtext:gsub("^/([^ ]+) ?(.*)$", function(cmd, params) local handler = commands[string.lower(cmd)] if handler then ret = handler(playerid, params) end end) return ret end Krom balíčku interop nabízí YALP i další, například timer. Ve spojení s coroutines lze psát plně asynchronní kód: local timer = require "timer" local function sleep(ms) coroutine.yield(timer.ms, ms) end -- async je funkce poskytnutá pluginem, která vytvoří coroutine a každé volání yield zavolá poskytnutou funkci (zde timer.ms) a předá coroutine.resume async(function() print("a") sleep(100) print("b") sleep(100) print("c") sleep(100) print("d") end) Skript lze propojit i s pluginy, které používají zpožděné vykonání kódu. Zde příklad interakce s PawnPlus: local interop = require "interop" local wait_ms = interop.native.wait_ms interop.forward(async, function() print("a") wait_ms(100) print("b") wait_ms(100) print("c") wait_ms(100) print("d") end) interop.forward obsahuje volání amx_Exec, aby mohl PawnPlus toto volání zachytit a zpracovat chybový kód (AMX_ERR_SLEEP). Pokud nativní funkce tuto chybu vrátí a YALP může zavolat yield, učiní tak a vrátí funkci interop.sleep a návratový kód z nativní funkce. interop.sleep je zavolán implementací funkce async a uloží předané argumenty (návratový kód a navazující funkci) do chyby, kterou vyhodí. Chyba je zachycena uvnitř implementace funkce amx_Exec v pluginu a návratové funkci je přiřazeno číslo, které je uloženo do struktury AMX. PawnPlus tuto strukturu uloží a po specifikované době obnoví a zavolá amx_Exec s parametrem AMX_EXEC_CONT. To zjistí YALP a místo hledání funkce v tabulce veřejných funkcí vezme správnou funkci podle jejího uloženého čísla. Celý tento mechanismus se dá spojit, tedy lze používat výše uvedené sleep i nativní funkce. Jen je potřeba zajistit, aby navazovací funkce byla zavolána uvnitř interop.forward (aby její vrácení mohly zpracovat jiné pluginy): local function sleep(ms) coroutine.yield(function(cont, ...)return timer.ms(function(...)return interop.forward(cont, ...)end, ...)end, ms) end A aby nedošlo ke křivdě, zde je i příklad jednoho možného volání GetPlayerPos: local x, y, z = interop.vacall(interop.native.GetPlayerPos, interop.asnone, playerid)(0.0, 0.0, 0.0) interop.vacall je primárně určena k volání variadických funkcí (protože jejich argumenty jsou předávány referencí a je pro ně potřeba alokovat místo), ale díky jejímu fungování se dá použít i pro funkce, které mají jako parametry reference. interop.vacall napřed vrátí jinou funkci, jíž se teprve mají předat referencové argumenty (playerid se jako reference nepředává) a ta zavolá interop.native.GetPlayerPos(interop.asnone, playerid, a, b, c), kde a, b, c jsou adresy dočasných proměnných alokovaných na haldě AMX. Mezifunkce si pamatuje typy variadických argumentů a po skončení nativní funkce kromě uvolnění proměnných z haldy je také převede na jejich původní typy (ty jsou určené podle 0.0, 0.0, 0.0). Jistě jste si všimli hodnot interop.asnone, interop.asboolean či interop.asinteger. To jsou všechno naprosto normální funkce, ale YALP pozná, pokud je použijete jako první argument nativní funkce, že určují převod návratové hodnoty (protože funkci do nativní funkce předat nelze). Pokud chcete, můžete si klidně vytvořit vlastní takovou funkci, která může vracet i více než jednu hodnotu!
  48. 3 points
    Missing Brackets Detector Pri chybnom počte zátvoriek v Pawn súbore sa stáva, že kompiler crashne. Nájsť takýto problém (resp. či ide práve o tento problém) je časovo náročné a nudné. Všimol som si, že neexistuje podobný funkčný program (na zahraničných fórach sa dajú nájsť, no niektoré chybne detekujú zátvorky vnútri stringov, alebo komentárov a iné sú strašne pomalé kvôli zlému návrhu, prípadne nevhodnému jazyku. Preto som dal dokopy malý program, ktorý rieši daný problém a môžete si ho tu stiahnuť. V prípade, že by ste našli nejakú chybu, nezrovnalosť, alebo máte nejaký návrh, prosím napíšte mi. Použitie Jedná sa o command-line utilitu, čiže sa spúšťa z príkazového riadku. Po stiahnutí a uložení do nejakého priečinka, v ktorom je "testskript.pwn", je možné použiť program takto: C:\Users\..>cd brackets C:\Users\..\brackets>brackets.exe testskript.pwn No incorrect / unmatching brackets were found. C:\Users\..\brackets> Download Source - https://gist.github.com/ts12311122014/b8763c771a30bfc75d1961676d393245
  49. 3 points
    Abych předešel případným dotazům a nepříjemným problémům, řekni mi: obsahuje to i skripty, jež nejsou tvoje, a jsou všechny funkční? Rád bych dostal odpověď na obě otázky, díky.
  50. 3 points
    https://www.humblebundle.com/store/amnesia-collection


×
×
  • Create New...