Jump to content

Search the Community

Showing results for tags 'plugin'.



More search options

  • Search By Tags

    Oddělujte čárkami
  • Search By Author

Content Type


Fórum

  • Fórum
    • Pravidla fóra
    • Co by se tu mělo změnit
    • Nahlášení chyb/Návrhy změn
    • Všechno možné
  • Pawn
    • Pomoc
    • Návody
    • Mapy a editor map
    • Scripty
    • Prezentace módů
    • Hledám pawnera/mappera
    • SA-MP
  • Programování a grafika
    • Vývoj webových stránek a aplikací
    • Vývoj desktopových a jiných aplikací
    • Grafika a webdesign
    • Dlouhodobé projekty
    • Hledám programátora/skriptera
  • Hry a herní tématika
    • MTA
    • Counter Strike 1.6 , Source, Global Offensive
    • Ostatní hry
    • Obrázky a videa z her
    • Herní hostingy
    • Prezentace herních klanů
    • Prezentace herních serverů
  • Ostatní
    • Hardware a software
    • Hledám/nabízím
    • Koš

Categories

  • Pawn – filterscripty a gamemody
  • Pawn – skripty od nováčků povinně sem
  • Aplikace a hry

Blogs

  • rEwolutionary
  • Polisův Blogík
  • DoubleX's Blog
  • [Info] Dark Island
  • Albus Brambůrek's Blog
  • Trampoty pána buggeda
  • vEndovo všechno možné
  • Cybrionkov Game Development v Unity
  • [Printova hlava]
  • Woodyho blog

Calendars

  • Kalendář Pawno.cz

Categories

  • Verze

Found 10 results

  1. plugin PawnPlus 0.4

    PawnPlus 0.4 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. hledám Plugin Mastera

    Zdravím , předem se omlouvám za Gramatiku mám takovou prozbu hledám schopné a Opravdu dobré Plugin Mastery který by byl schopný udělat vlastní Pluginy pro Projekt a popřipadě i Upravit nějaké Staré pluginy mám takový menší napad na Minecraft Server ale potřebuji k tomu někoho kdo v tom umý chodit a byl by schopný udělat vlastní Pluginy bez nich to nepujde z realizovat klidně i za nějakou Finanční odměnu prosím o kontakt (víz Níže) Kontakt: Email: jakubcik14@seznam.cz zde v SZ Skype: michal.jakubcik Předem všem co se ozvou děkuji prosím jen opravdové Mástery a zájemce o spolupráci s novým Projektem www.gamings.eu
  3. https://t.co/G4gWmPeC3y https://t.co/vp5FzG5baf

  4. hledám TOP SAMP Plugins

    Ahoj! Potřebuju poradit.. Chci přidat na hosting nějaké pluginy do instalátoru ale už se pawnění nevěnuji tak bych potreboval sepsat prosím, nějaký seznam který přidat. Samozřejme pluginy BEZPEČNÉ! Dííííky!
  5. Zdravím tak tu mám dalšího tutorialu pro program AMXX kde se teď zaměřujem do hry Counter Strike jinak taky se zde pracuje v jazyku PAWN. Ok.Takže dneska budem dělat jednoduché menu na výběr věcí co si navolíme. Tutorial na příkaz najdete zde: http://pawno.cz/topic/52164-tutorial-amxx-prvn%C3%AD-p%C5%99%C3%ADkaz-resetscore/ Jdem nato: Takže použijem tyhle includy: #include <amxmodx> //Zakladní Include AMXX #include <amxmisc> //Zakladní Include AMXX #include <cstrike> //Více v prvním tutorialu #include <fun> //Více v prvním tutorialu Dále si vytvoříme příkaz na otevření menu: public plugin_init() { register_plugin(PLUGIN, VERSION, AUTHOR) register_clcmd("say /shop", "shop_menu") } -Vytvořili jsme si příkaz /shop který nás spojuje z menu propojení jsme si nazvali shop_menu public shop_menu(id) { new m1 = menu_create("Vyber si ITEM:","shop_nastaveni") menu_additem(m1,"Zivot") menu_additem(m1,"Vesta") menu_additem(m1,"AK-47") menu_additem(m1,"M4A1") menu_display(id,m1) } -Takže první funkce menu_create vytvořili jsme si naše menu -Můžem vidět i proměnou m1 co se rovná našemu menu takže přidávám k itemum. Dále vidíte: menu_additem - Přídáme Item do našeho menu ml - Naše proměna co se rovná našemu menu což použijem u additem Zivot,Vesta,AK,M4 - To je název jak se to bude napsáno v našem menu menu_display - Zobrazí se nám menu A ukončíme Public public shop_nastaveni(id,menu,item) //id - Hráč Menu - Menu Item - Zvolíme { if(item == MENU_EXIT) { menu_destroy(menu) return PLUGIN_HANDLED } switch(item) { case 0: { set_user_health(id,200) } case 1: { set_user_armor(id,200) } case 2: { give_item(id,"weapon_ak47") cs_set_user_bpammo( id, CSW_AK47, 120 ) } case 3: { client_print(id,print_chat,"Vzal sis M4.") give_item(id,"weapon_m4a1") cs_set_user_bpammo( id, CSW_M4A1,120 ) } } return PLUGIN_CONTINUE } item == MENU_EXIT - Pokud stlačíme 0 tak se menu zavře Switch Item - Vlastně prakticky "propojení a nastavení" z naším menu case 0: { set_user_health(id,200) } Ted se nám to bude řadit podle case na čísla case 0 = Číslu 1 - Takže pokud stlačíme 1 dá nám to životy tak to máme seřazené i v předešlém Public v pořadi Život,Vesta,AK,M4 case 1 = Číslu 2 - Takže pokud stlačíme 2 dá nám to vestu opět jak jsme si nastavil A takhle se to stupňuje set_user_health(id,200) K této funkci využijem include: Fun -Který jednoduše zahrnuje pár těchto funkcí co jsou bez nějaké přepony a nastavují zakladní věci ID - ID Hráče 200 - Počet životu Takže stejně u nastavení vesty akorád použijem funkci set_user_armor K nastavení zbraňí využijem oba dva přidané includy takže includ fun a cstrike Takže zbraňě: give_item(id,"weapon_ak47") Zde opět používáme includ FUN give_item - I ze základní angličtinou poznáme že dáme item id - Hráč - Takže dáme item hráči "weapon_ak47" - a zbraň POZOR: Zde se dělá častá chyba lidé nedavají do uvozovek nebo nepíšou malým písmem. Další funkce nastavíme přidáme náboje. cs_set_user_bpammo( id, CSW_AK47, 120 ) Zde už používáme includ cstrike a to poznáme podle toho že máme před funkcí předponu cs_ cs_set_user_bpammo - určíme hrači zbraně kterou zvolíme. id - ID Hráče - takže dáme náboje hráči CSW_AK47 - zde zase pozor musí to bejt velkým písmem Proč CSW ? CS - Předpona INCLUDU W - Weapon 120 - Počet náboju nastavil jsem si 120 což je základ plné zbraně v singlu Samozřejmě mužeme dát i více. A to stejné i z M4 Ještě jedna věc: Samozřejmě můžete zkusit k tomu i něco napsat Použijem funkci client_print(id,print_chat,"Vzal sis M4.") Toto je něco jako dělání v pawnu do SA-MP SendClientMessage client_print - Zpráva ID - Pro hráče print_chat - Do Chatu veřejného Vzal sis M4. - Naše zpráva A toto je všechno Doufám že jsem vám pomohl zde je ještě Final Code: #include <amxmodx> #include <amxmisc> #include <cstrike> #include <fun> #define PLUGIN "New Plug-In" #define VERSION "1.0" #define AUTHOR "author" public plugin_init() { register_plugin(PLUGIN, VERSION, AUTHOR) register_clcmd("say /shop", "shop_menu") } public shop_menu(id) { new m1 = menu_create("Vyber si ITEM:","shop_nastaveni") menu_additem(m1,"Zivot") menu_additem(m1,"Vesta") menu_additem(m1,"AK-47") menu_additem(m1,"M4A1") menu_display(id,m1) } public shop_nastaveni(id,menu,item) { if(item == MENU_EXIT) { menu_destroy(menu) return PLUGIN_HANDLED } switch(item) { case 0: { set_user_health(id,200) } case 1: { set_user_armor(id,200) } case 2: { give_item(id,"weapon_ak47") cs_set_user_bpammo( id, CSW_AK47, 120 ) } case 3: { client_print(id,print_chat,"Vzal sis M4.") give_item(id,"weapon_m4a1") cs_set_user_bpammo( id, CSW_M4A1,120 ) } } return PLUGIN_CONTINUE } Opět další tutorial jsem se snažil podat na pochopení a né jako slovník cizích slov. Doufám že jsem Pomohl Zatím ČUS.
  6. Zdravim. Všimnul sem si ze vysel plugin, kterej by mel zamezit floodovani sevreru. takže slovy autora: "No more "Server full" messages when 10/500 people are playing." Autor: Gamer_Z Link: http://forum.sa-mp.com/showthread.php?t=551128 Myslim si že by o tomhle pluginu mela komunita vedet.
  7. script WeekDay

    Zdarec Tak mě napadlo že bych se pochlubil prvním pluginem pro SA-MP. Je psaný v C++ a zkompilovaný pro windows Tenhle plugin je čistě ukázkový a využití v podstatě nemá pro funkci tohoto pluginu existuje jednoduchá alternativa v pawn... Instalace : server.cfg >> plugins Win32Project1 PAWN : native GetCurrentWeekDay(); native GetCurrentWeekDayEx(string[],len); Usage: printf("Dnes je %i. v týdnu",GetCurrentWeekDay()); //0 - Neděle //1 - Pondělí //2 - Úterý //3 - Středa //4 - Čtvrtek //5 - Pátek //6 - Sobota new string[32]; GetCurrentWeekDayEx(string,sizeof(string)); printf("Dnes je %s",string)); DOWNLOAD
  8. pomoc Object on the ground

    Ahojte. Chcel som sa vás spýtať či z vás niekto neprišiel na spôsob, akým zistiť či sa objekt (CreateObject) dotýka zeme. Neviem, ak niekto pozná script, alebo skôr plugin tak nech mi tu napíše, veľmi mi to pomôže dokonca uľahčí prácu Ďakujem vopred.
  9. Zdravím, Ponúkam Vám: Konfigurácia servera a AMX Mod X Tvorba kvalitných a optimalizovaných pluginov Všetko ohľadom JailBreaku a Furiena (Tvorba módu,prepracovanie,optimalizácia...) ale aj iných módov Vytvorím aj VIP Pluginy, XP Módy, ... Optimalizovanie pluginov Kvalitná a rýchla práca za celkom dobrú cenu Spôsoby platby sú cez PayPal a SMS (Pri SMS je cena vyššia o 35%). Kontaktovať ma môžete pridaním do skype-u: risontek22
  10. Plugin vAuth

    Zdravím, mám problém s pluginem vAuth. Mam takto nastavený config: Server: allow-all-register: true allow-all-login: true allow-all-changepassword: true require-login: true allowed-characters: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_ encrypt-op-password: false op-secure-password: To vám neřeknu show-movementerror-message: true run-name-conversion: false check-Version: true language-file: english.yml Internal-Use: login-location: 0>>64>>0>>Original_World debug: false Ale když vypnu a zapnu server tak se mi [/size] show-movementerror-message: true zase změní na false A teď zásadnější problém. /register, /login fungují Ale když se někdo přihlásí se stejným nickem napíše mu to že už je zalogován a může si v klidu hrát. Budu rád za všechny rady čím by to mohlo být.
×