Jump to content

Žebříček


Populární obsah

Showing content with the highest reputation since 16.7.2018 in all areas

  1. 10 points
  2. 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; }
  3. 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 nestratim. Toto je pouze takové info, všechno zapíšu v update příspěvku až to bude hotové.
  4. 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
  5. 2 points
    Sice jsem sem dlouhou dobu nepsal, ale na pluginu se stále pracuje; momentálně je na verzi 0.8. Pro plný seznam změn doporučuji projít verze na GitHubu, případně aktuální wiki. Zde je pár novinek za poslední měsíce: Rozšířen systém tagů o runtime podporu (hledání podle názvu, dědičnost, dynamické volání či definování vlastních operací apod.). Všechny kontejnery (seznamy, mapy, variant) obsahují ke každé hodnotě i její tag a mohou náležitě volat jeho vlastní operace (např. destruktor). Pomocí těchto operací můžete např. vytvořit komplexní objekt a zařídit, že všechny jeho podobjekty (mapy, seznamy, ale třeba i soubory) budou vždy smazány. Maximálně zvýšená bezpečnost kódu. Neplatné ukazatele jsou kontrolovány a zachyceny ve všech situacích. Bylo opraveno množství chyb způsobujících pády či záseky. "Strážci" (guards). Strážce můžete vytvořit ke každému objektu a on zařídí jeho automatické smazání (na konci bloku či na konci vstupu do skriptu). Pokud je kód přerušen asynchronní operací, strážce objekt nesmaže a počká na skutečné ukončení kódu. Dynamické hookování funkcí. Kromě callbacků lze i na jakoukoliv nativní funkci navázat vlastní kód, který se vyvolá i pokud je funkce zavolána z jiných skriptů (nebo dokonce i z pluginů). Zatím lze pouze přidat prehook/posthook (filtr), ale očekávám plné hookování v 0.9. Systém úloh (tasks) rozšířen o nové možnosti a operace. Zejména funkce task_any a task_all se dají využít pro spojení jiných úloh (první hotova / všechny hotovy). Úlohy nyní mají i svůj garbage collector, který všechny hotové úlohy co nejdříve smaže (tomu lze předejít resetováním úlohy či nastavením, že nemá být smazána). Každá úloha také namísto výsledku může obsahovat chybový stav, který lze použít pro signalizaci výjimečných situací. Uživatelský kód může čekat na skončení úlohy a stav zachytit a zpracovat. V 0.9 bude tento systém dále vylepšen. Přidáno množství low-level funkcí pro manipulaci s AMX. Nejpokročilejší je asi "forking", tedy možnost lokálně zduplikovat AMX a vykonat v něm "chráněný kód". Takový kód nemůže nijak zasahovat do původní paměti skriptu a lze z něj zachytit i návratové hodnoty či chyby. Navíc, jelikož se jedná o zcela separátní AMX, v něm lze spustit nové vlákno, které nebude nijak zasahovat do původního skriptu a poběží nezávisle. Tím pádem lze nyní jednoduše vytvořit nové (dočasné) vlákno, aniž by byl blokovaný skript. Všechny dynamické kontejnery mohou obsahovat 2D a 3D pole a indexovat je. Podpora je i pro pole nepevných rozměrů. Seznamy a mapy mají pokročilé iterátorové objekty, které umožňují upravovat, mazat či přidávat prvky do kolekcí. Iterátory jsou naprosto bezpečné, neboť si uchovávají odkaz na původní kolekci a sledují její změny i odstranění. Nestane se, aby kvůli smazání kolekce došlo k chybnému čtení paměti. Iterátory podporují i generické použití. Ve verzi 0.9 nejspíše přibudou i další iterovatelné kolekce (spojové seznamy, fronty atd.). Iterátory nejsou rozlišeny typem původní kolekce, všechny operace fungují na libovolný iterátor (pokud jsou kompatibilní s původní kolekcí).
  6. 2 points
    Ahoj, v příloze zasílám soubor/obrázek, kde označuji dva typy zapisování odpovědí/hlasů/zhlédnutí posledních 5 témat s příspěvky. Otázka zní, co vám přijde lepší? Já si stále nemohu zvyknout, že první jsou nějaké hlasy a pak odpovědi. Nedá se to prohodit? Vždycky když koukám na něajké téma, tak vidím nula a říkám si odpovědí. Ale to jsou vždycky hlasy, co mě vůbec nezajímají.
  7. 2 points
    Nejsem fanouškem pickupů, kde ti něco vyjede když vstoupíš. Jednak přesně musíš ošetřovat případy kdy zrušíš dialog a vyjede ti furt dokola (ukázkou je přímo v čase 1:34-1:37) a jednak hypotetická situace, kde jeden před něčím/někým utíká, narazí omylem na pickup a vyjede mu dialog (zastaví ho to) a ten druhej ho přistihne. Každopádně to nevypadá zle, jenom mám otázku, jakým způsobem je řešený spawn všech vozidel? Spíš mě zajímá pozicování
  8. 2 points
    Chlapci eh, dovolím si tady zmínit docela důležité návody pro začátečníky/pokročilí začátečníci. No a celkově bych doporučil celou sekci, ono to nikomu neuškodí. Obzvlášť vám. https://pawno.cz/index.php?/forum/149-pawn-pro-začátečníky/ Je docela smutné tady pozorovat co a podle koho je a není podmínka. Snad vám ty témata osvěží vaše začátky, nic ve zlém. To je pouze má dobrovolná pomoc
  9. 1 point
    To samé platí i pro W/A/S/D. Tak že OnPlayerUpdate použil správně.
  10. 1 point
    je to KEY_SPRINT nie KEY_UP http://wiki.sa-mp.com/wiki/Keys
  11. 1 point
    Zdravím, mohol by si nám ukázať public OnPlayerText v móde a vo filterscriptoch, ktoré používaš?
  12. 1 point
    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í.
  13. 1 point
    Nebolo by lepšie vypísať to automaticky pri registrácii nového účtu? Ten príkaz:
  14. 1 point
    Myslím, že toto by ti malo stačiť https://stackoverflow.com/questions/43822554/get-uploaded-file-name $name = $_FILES['file']['name'];
  15. 1 point
    Vlastně.. Polis by měl poděkovat a zaplatit Lukášovi za tuhle skvělou reklamu.. gj.
  16. 1 point
    Asi se na ten web často nedíváš co? Mně by teda bylo zle
  17. 1 point
    Java, uplatníš se velmi dobře když ho budeš umět. Případně C++, to když budeš umět, tak se uplatníš možná méně, ale za lepší peníze.
  18. 1 point
    Ak chceš zastaviť kód na mieste komentára bez toho, aby si dostal "unknown command", môžeš použiť return 1. Btw možno by si ten kód mohol podstatne zredukovať využitím for cyklu.
  19. 1 point
  20. 1 point
    Přijde mi jako dobrý nápad udělat ty garáže na tento způsob což je vlastně inspirováno od GTA 5 hádám? Ale jinak to chce zapracovat. Měl jsem něco podobného v plánu ale nebudu to podrobně popisovat dokud to nerealizuji Což bude až realizuji house a vehicle systém. Líbí se mi to ale chce to propracovat ještě. (neber to ani jako pochvalu ani jako kritiku)
  21. 1 point
    Jen ze zajímavosti nám napiš co sis vybral.
  22. 1 point
    Tons Per Day https://www.alza.cz/nakupni-seznamy.htm?sharelist=7665686A696B647E7 Víc levneji to nešlo, už takle jsem musel ořezat dost ten pc.. Není to zrovna dobrý počítač ale co bys chtěl za 10 tisíc.. Ps kdyby někdo držkoval že jsem vybral kaby lake 1151 místo coffee lake tak si dejte facku protože G5600 je kompatibilní se všema socketama typu 1151... Nejsem si jistý výběrem MB vůbec, když tak někdo může opravit. + jsem vybral lepší zdroj kdyby náhodou chtěl vylepšit gpu.. tak aby měl do budoucnosti.. Jak říkam místo gt 1030 bych raději koupil bazarovou gtx 760 jako je tady https://pc.bazos.cz/inzerat/90974127/MSI-GTX-760.php má stejnou cenu jako gt 1030 ale o dost výkonejší.. Nikdo ti ale nemůžu zaručit jestli bude fungovat a nebo jestli to ten Tonda pošle vůbec když tak bych i vzal raději o 50w lepší zdroj. https://www.alza.cz/evga-550-b3-d4945772.htm
  23. 1 point
    Poviem ti to takto, práve preto som si to trošku študoval čo to TDP znamená aby som nenapísal dajakú chujovinu Thermal Design Power (TDP) (doslova „navrhnutý tepelný výkon“) je hodnota, ktorá predstavuje najvyšší možný tepelný výkon, ktorý musí chladenie počítača (CPU, GPU alebo iné súčiastky) vedieť odviesť. Pri elektrických čipoch bez mechanicky sa pohybujúcich častí sa stratové teplo prakticky rovná spotrebovanej energii.
  24. 1 point
    Každá nabídka bude mít vlastní téma. Toto téma musí být v soulasu s Pravidly nabídek a poptávek. Témata, která nebudou pravidla splňovat, budou smazána. Prefix tématu se bude odvíjet od jazyka, kterého se nabídka týká. Pokud tedy hledáte pawnera, jako prefix zvolíte Pawn. Pokud chcete udělat něco v C#, prefixem bude C#. Hledáte-li Nette programátora, prefixem bude PHP, protože Nette je PHP framework. A tak dále. Stručné shrnutí pravidel: 1. Podezřelé a podvodné nabídky nejsou povoleny. 2. Nabídky musí být v soulasu se zákony České a Slovenské republiky. 3. Nabídka musí uvádět při nejmenším popis produktu, typ a výši odměny, kontakt. Prosím přepiš to aby to odpovídalo této šabloně jak je v pravidlech.
  25. 1 point
    Ahoj všem! Na WTLS byly přidány nové updaty - job vojenského pilota, vykrádání bankomatů a čtyři nové eventy!
  26. 1 point
    Obtížnost: Osnova: 1. Úvod, co je to proměnná 2. Deklarace (vytvoření) proměnné 3. Přiřazování hodnot 4. Datové typy (tagy) 5. Lokální a globální proměnná 6. Závěr 1. Úvod Zdravím Vás, tohle je první ze série návodů věnujících se základům jazyka Pawn. Cílem těchto návodů je seznámit Vás se strukturami tohoto jazyka, s jeho syntaxí a s jeho využitím v praxi. Tento návod se bude věnovat proměnné. Co je to proměnná? Pod pojmem proměnná si můžeme představit nějaké místo v paměti, které má svůj název a do kterého si pro naše potřeby ukládáme hodnoty. Všichni proměnné už známe, a to z matematiky – zde proměnné jako x a y používáme nepřetržitě. A funguje to i podobně – v matematice za ně můžeme dosazovat různé hodnoty, v programování do nich také ukládáme různé hodnoty. 2. Deklarace (vytvoření) proměnné Prvním naším krokem bude deklarace proměnné. Když mluvíme o deklaraci proměnné, máme na mysli, víceméně, její vytvoření. To provedeme následovně: . new id; . Pomocí slova new deklarujeme nové proměnné. Jinak to nejde, jazyk to od nás vyžaduje. id je název (identifikátor) naší nové proměnné. V názvu můžeme používat standardní písmena (A až Z, a až z), číslice (0 až 9) a podtržítko (_). Název bychom měli volit tak, aby odpovídal tomu, k čemu budeme proměnnou potřebovat (např. penize – pro ukládání peněz apod.) Středníkem (;) deklaraci ukončíme. Jazyku tak sdělíme fakt, že jsme s tímto příkazem (s deklarací proměnné) skončili. Takhle to funguje i u jiných příkazů, ne jenom u deklarací. Pokud potřebujeme deklarovat více proměnných najednou, je to možné provést tak, že jednotlivé názvy oddělíme čárkou, takhle: . new id, penize, score; . Takto jsme vytvořili 3 proměnné naráz. 3. Přiřazování hodnot Teď už víme, jak proměnnou vytvořit. Jak do ní ale uložím hodnotu? To udělám pomocí operátoru rovnítko / rovná se (=). . id = 5; . Na levé straně (tzv. lvalue) máme proměnnou, do které chceme ukládat, poté následuje rovnítko, které nám určí, že do proměnné ukládáme hodnotu, a nakonec přichází samotná hodnota (tzv. rvalue). Hodnotou může být číslo, ale také jiná proměnná nebo výraz. Stejně jako deklaraci, tak i tento příkaz zakončíme středníkem. Ono středníkem budeme ukončovat téměř všechno, ale to brzy samo vyjde najevo. Pokud bychom chtěli přiřadit hodnotu už při deklaraci, tak i to nám Pawn dovoluje: . new id = 7; new id = 1, penize = 5000, score = -100; //znak mínus (-) před hodnotou nám značí zápornou hodnotu . Pro zajímavost (rozklikněte spoiler): 4. Datové typy (tagy) Už umíme proměnnou vytvořit a přiřadit jí hodnotu. Teď si musíme říct něco o datových typech. Datový typ nám určuje, jaké hodnoty můžeme do proměnné uložit. Může se jednat o běžná celá čísla (ty jsme používali do teď), ale pak také můžeme ukládat čísla s desetinnou čárkou, různé texty, znaky apod. Čím se nám to bude lišit, když budeme chtít do proměnné uložit např. číslo s desetinnou čárkou? Bude se to lišit způsobem deklarace. Vyjmenujme si všechny běžné datové typy a způsob, kterým je budeme deklarovat. a) Celá čísla (7, 666, -5, -114 apod.) new cela_cisla; //deklarujeme tak, jak jsme se před chvílí naučili cela_cisla = 7; . b ) Reálná čísla – čísla s desetinnou čárkou (3.14159, 10.254, -177.8, -23.23 apod.) new Float:realna_cisla; //před název proměnné jsme přidali tzv. tag, a to tag "Float:" realna_cisla = 3.14159; //tečka (.) nám v programování představuje desetinnou čárku . c) Logické hodnoty (true a false) Logické hodnoty máme jen dvě, a to pravda (true) a nepravda (false). . new bool:logicke_hodnoty; //doplníme tag "bool:" logicke_hodnoty = true; . d) Znaky Znakem může být cokoliv, co najdete na klávesnici – písmeno, číslice, vykřičník, pomlčka atd. Deklarace se neliší od celých čísel, ale ukládání ano! . new znak; //stejné jako u celých čísel znak = 'a'; //ukládaný znak musíme vložit mezi apostrofy (') . e) Řetězec/string ("abcd1234?!", "jak se máš?", "jsem programátor" apod.) Řetězec není nic jiného než posloupnost několika znaků. Jsou to slova, věty, hesla, vše, co nás napadne. Liší se deklarací i ukládáním! . new retezec[10+1]; //v hranatých závorkách [] udáváme délku řetězce, to je ta 10, a navíc přičteme ještě jedničku kvůli potřebám jazyka Pawn retezec = "abcd1234?!"; //ukládaný řetězec znaků musíme vložit mezi uvozovky (") . Pro zajímavost (rozklikněte spoiler): Těch tagů je omnoho více, ale když teď známe jejich princip, nebude těžké se vypořádat ani s těmi ostatními. 5. Lokální a globální proměnná Proměnná se dělí na dva typy podle toho, kde ji deklarujete. Globální proměnná se nejčastěji deklaruje nahoře ve scriptu, těsně pod #include a #define. S touto proměnnou můžete pracovat všude ve scriptu. Oproti tomu lokální proměnná se deklaruje v určitém bloku (bloky nám určují složené závorky { }) a má platnost pouze v něm a v podřazených blocích. Názorná ukázka: . public OnPlayerConnect(playerid) { if(playerid == 0) { new id; id = 5; //bude fungovat, tohle je stejný blok, kde je deklarace if(IsPlayerInAnyVehicle(playerid)) { id = 0; //bude fungovat, tohle je podřazený blok } } id = 7; //nebude fungovat, zahlásí nám to chybu, protože tohle už je nadřazený blok } . 6. Závěr A takhle jsme došli ke konci návodu o proměnné. Dnes jsme se dozvěděli, co je to proměnná, k čemu slouží, jak do ní ukládat hodnoty a výrazy, jaké hodnoty do ní lze ukládat a jak ji rozdělujeme dle platnosti. Navíc jsme si také ukázali, jak psát do kódu komentáře, to jsou ty poznámky, které jsme uvedli za znaky // (dvě lomítka). Za ně si lze psát své vlastní poznatky, připomínky atd. Ještě jednou říkám, že tento návod slouží pro úplné začátečníky, pokročilejší věci byly buďto úplně vynechány, nebo jsou uvedeny ve spoilerech. Přesto, zdá-li se Vám, že jsem něco opomněl, někde jsem se spletl nebo se jen chcete vyjádřit, pište do tohoto tématu. Ověřený návod Tento návod prošel validací, a lze ho proto považovat za ověřený.
  27. 1 point
    public OnPlayerKeyStateChange(playerid, newkeys, oldkeys) { // Jestli je zmáčknuta klávesa Y if(newkeys & KEY_YES) { // Zobrazíme hráči dialog ShowPlayerDialog(playerid,158,DIALOG_STYLE_LIST,"Mobil","- Volat\n- Poslat SMS","Potvrdit","Vypnout"); // V podstatě sem můžeš zkopírovat obsah příkazu /mobil a mělo by to fungovat } return 1; } Pokud nemáš definováno KEY_YES, použij: #define KEY_YES 65536 Místo čísla 158 si zadej svoje číslo dialogu který pak budeš používat v OnDialogResponse // Akce při potvrzení dialogu public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]) { // Rozdělení podle ID dialogu switch(dialogid) { // Pokud to byl dialog zatýkání (158) case 158: { // sem dej, co se stane, když hráč dialog potvrdí } } }
  28. 1 point
    " Když vykradu banku musím si to započítat do daňového přiznání ?" Polisův kamarád 2018
  29. 1 point
    Pokud jsi na to ještě nepřišel, tak cely WTLS má napodobovat co nejvíce single. Tím se také liší od ostatních serverů.
  30. 1 point
    On se alespoň snaží něco dělat a ukazovat svou práci na pawnu + není to tak jednoduché jak to vypadá ale to ty asi nepochopíš nikdy..
  31. 1 point
    zavidim ti tvoju chut do roboty. je to super
  32. 0 points
    https://store.steampowered.com/app/222880/Insurgency/ do 48h máte možnost kliknout na odkaz a aktivovat si tak plnou verzi hry na furt
  33. 0 points
    A proč to děláš přes PHP?
  34. 0 points
    Zdravím, chtěl bych se s vámi podělit o video, na které jsem dnes narazil. Zaujalo mě svým pojetím a informační hodnotou. Autorem není nikdo jiný, než autor velice úspěšné kickstarterové kampaně, mnoho nedokončených herních módů, bývalý moderátor pawno.cz, nadějný grafik (v tomto odvětví o něm ještě mnoho uslyšíme) a znalec jazyku C+. Není jím nikdo jiný, než Polis Polismanovitss. Nyní si pro nás připravil návod na základy HTML5, CSS a jeho vlastního dialektu angličtiny. Rozhodně doporučuji zhlédnout až do úplného konce, mě osobně tento formát videa velice potěšil. Velmi oceňuji časté čekání na upload souboru na jeho server, díky této pauze jsem mohl všechny informace řádně zpracovat. Kdyby ukázal html soubor na localu, asi bych se ztrácel. Autora si samozřejmě můžete (za nemalý peníz) najmout na určité služby na jeho webých sránkách, kde nechybí ani donate button. - Polis
  35. 0 points
    Vytvoříš si vlastní funkci... Stačí ti na to Fopen. Naformátuješ si cestu a zkusíš tam vytvořit soubor (režim io_write). Pak jen zkontroluješ, zda se ti soubor otevřel. Pokud ano, tak soubor uzavřeš a poté ho smažeš (jelikož ho už nepotřebuješ) a vrátíš úspěch - 1 -> podařilo se soubor vytvořit, takže složka/y logicky musela/y existovat. Pokud se ovšem soubor otevřít (vytvořit) nepovedlo, tak neexistovaly složka/y, kde ten soubor měl být, takže vrátíš neúspěch - 0.
  36. 0 points
    Stačí ti fopen(). Lebo ako hovorí wiki o fopen, Return Values: Returns the file handle. This handle is used for reading and writing. 0 if failed to open file. Pomocou fopen() sa pokúsiš vytvoriť súbor v jednom z tých priečinkov. Skontroluješ návatovú hodnotu funkcie - ak bude 0, nebolo možné daný súbor vytvoriť.
  37. 0 points
  38. 0 points
    Nehledně na to, že je drzost dělat weby za peníze a video pro nováčky, když na svém webu uděláš chybu viz screen. (Schválně, zda najdeš, co je špatně.)
  39. 0 points
    Je to borec, ved pozri aky web nam to spravil http://california-rp.cz/web/
  40. 0 points
    Zdravím Mam GM od HONZY PAradise World a mam tam tunírny např u wangu je ta normální tunírna zabarikádovaná a když sem v kodu GM odblokoval tu garáž a vjel sme tam tak tam bylo COLOR a Hood klikl sem na Hood a byli tam zbraně a nevíte jak bych to mohl dát pryč ? Děkuju předem
  41. 0 points
  42. 0 points
    Bude to na stáhnutí? :DD
  43. 0 points
    Měl jsem spíše na mysli po technické stránce, jak je to řešené. Jak je řešené kam se má spawnout jaké auto?
  44. 0 points
    Zdravím, Kopírovat cizí servery Ti přijde normální jen proto, že tam máš ban a na tom Tvém nikdo nechce hrát? Zamysli se. K topicu, vytvoř si proměnnou, kde si budeš za každou misi přičítat 1 a nastav si odměny podle toho, jak vysoké číslo je. Můžeš to třeba násobit stylem: 5000*nazevpromenne nebo přes switch. switch(nazevpromenne[playerid]) { default: odmena = 2500; case 1: odmena = 5000; case 2 ... 5: odmena = 10000; case 6 ... 100: odmena = 50000; other: odmena = 5000000000000; } A vážně se zkus zamyslet, zda chceš úspěch pomocí nápadů někoho jiného. Zatím.
  45. 0 points
    Heej? Lebo zatiaľ tam máš Cit HostName: Life Of SanAndreas Cit | Official | Address: 82.208.17.10:27123 Players: 0 / 100 Ping: 16 Mode: LoSaC [V1.0] *VIP* Language: - Istého času ma mód veľmi bavil, uvidíme či aj teraz každopádne až budem mať čas, určite prídem omrknúť
  46. 0 points
    Ne po prvé! PS: Dal se už nebudu s tebou hádat abych zase nedostal k vůli takovému inteligentový var za spam.
  47. 0 points
    Vieš vôbec čo je Podmienka ? A prečo dávaš do vnútra switchu if ? stačí otvoriť case switch(listitem){ case 0: { //LISTITEM == 0 } case 1: { //LISTITEM == 1 } //...... }
  48. 0 points
    CreateHouse(2513.804443, -1650.339477, 14.355697, 6, 10000000);//ID 430 CreateHouse(X, Y, Z, Interior, Cena);//ID 430 EDIT: Půjdeš na server dáš /save potom běž do pc Dokumenty/GTA San Andreas User Files/SAMP/savedpositions.txt a když ro otevřeš tak tam je to /save Např. AddPlayerClass(0,389.4168,173.8060,1008.3828,94.0243,0,0,0,0,0,0); // 389.4168,173.8060,1008.3828,94.0243 - X, Y, Z, Angle
  49. 0 points
    wtf odkedy musim dakam davat #define GAMEMODE?
  50. 0 points
    Ahoj, chci se zeptat, jak mam udelit adminLVL na Street Life 7.0 přes rcon, nebo se to musí dělat jinak ? rekapitulace: Jak nastavit AdminLVL přes RCON, na street life 7.0 ? Děkuji za všechny odpovědi
×