Jump to content
Prosíme všetkých užívateľov, ktorý sa chcú opätovne pripojiť na discord aby znovu spárovali svoje účty kliknutím na "Discord" v navigácií a pripojili sa na server Read more... ×

Search the Community

Showing results for tags 'návod'.



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

Find results in...

Find results that contain...


Date Created

  • Start

    End


Last Updated

  • Start

    End


Filter by number of...

Joined

  • Start

    End


Group


Web


Facebook


Jabber


Skype


Steam


Twitter


Github


Pastebin

Found 411 results

  1. _niCo_

    návod Jednoduché příkazy

    Příkazy Tutoriál pro začátečníky Zdravím, Dnes si názorně ukážeme, tutoriál pro začátečníky z PAWN jazykem jak udělat příkaz [ Jednoduše ] Příkaz můžeme udělat jednoduše a nebo přes include ZCMD My si dnes ukážeme oboje. Pojďme na to juuuuuuu Jednoduchý příkaz bez Includu Příkaz bez incudu, je složitý na zapamatování, a vypadá nějak takto. public OnPlayerCommandText(playerid, cmdtext[]) { if (strcmp("/prikaz", cmdtext, true, 10) == 0) { Zde napíšete funkce co se má stát po napsání příkazu /prikaz return 1; } return 0; } Ovšem je potřeba u tohoto příkazu znát púublic který se jmenuje " OnPlayerCommandText Zde si ukážeme příkaz v praxi jak by to mělo vypadat. public OnPlayerCommandText(playerid, cmdtext[]) { if (strcmp("/balicek", cmdtext, true, 10) == 0) { GivePlayerWeapon(playerid,31,500); GivePlayerMOnney(playerid,50000); SendClientMessage(playerid,-1,"Získal si balíček "); return 1; } return 0; } Příkaz pomocí Includu ZCMD K tomuhle příkazu, bude třeba znát jen vzor příkazu, a include ZCMD. Názorně takhle : #include <zcmd> CMD:balicek(playerid) { GivePlayerMoney(playerid,50000); GivePlayerWeapon(playerid,31,5000); SendClientMessage(playerid,-1,"Dostal si balíček "); return 1; } A takhle to nějak vypadá. Ovšem funkce si můžete dát jaké koliv ale aspoň vám to ěnjak pomůže. Kdyby ste s tím měli problémy, napiště mi sem do komentářu, a já vám poradím. Děkuji moc
  2. 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. 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ý.
  4. xhunterx

    návod Hunterov úvod do bezpečnosti

    Hunterov úvod do bezpečnosti Základné tipy, ako zabezpečiť svoj počítač a svoje online účty. Tento návod predpokladá, že používate Windows. Toto nieje návod na štýl krok po kroku, skôr ide o súhrn vecí, ktoré by ste mali spraviť a aplikácií, ktoré vám s tým môžu pomôcť. Návody, ako jednotlivé kroky spraviť nájdete tipicky v odkazoch, ktoré som priložil, alebo pomocou Googlu. Ak máte nejaké pripomienky, napíšte mi ich prosím a ja tento návod prípadne upravím. 1 Základy Základné triky, ako zabrániť niekomu, aby sa dostal na vaše webové účty. 1.1 Bezpečné heslá Základom bezpečnosti je zvoliť si bezpečné heslá. Určite vám ludia povedali, že bezpečné heslo musí mať aspom 8 znakov, že musí obsahovať malé a velké písmená, čísla, znaky, hieroglify, motivačný slogan. Neverte im, sú to americký sabotéry. Takéto heslá sa ťažko pamätajú a niesu nijak zvlášť bezpečné. Ak chcete bezpečné heslo, nájdite si najbližší slovník a náhodne z neho vyberte 4 slová, odstráňte diakritiku a ak chcete ich vysklonujťe alebo ich nechajte tak a máte svoje heslo. Napríklad: "StolickaKlameVyslednemuRazu". Takéto heslo si oveľa jednoduchšie zapamätáte ako napríklad "qeP2Ub%L" a hádajte čo? Je aj bezpečnejšie. Ak váš slovník má 10 000 slov, tak sila tohoto hesla je 53 bitov, zatiaľ čo náhodné 8 znakové heslo má 50-52 bitov. A na rozdiel od náhodného hesla ho nemusíte mať napísané na lístočeku vedľa počítača, kde ho môže hocikto nájsť. 1.2 Správca hesiel (KeePass) No ale aj takýchto pekných hesiel si veľa nezapamätáte a používať rovnaké heslá na viacerých webstránkach je veľmi nebezpečné, preto je vhodné používať správcu hesiel (Password Manager). Já osobne odporúčam KeePass. KeePass vám vytvorí náhodné heslá a zašifrované vám ich uchová vo vašom počítači. Vaše heslá zostavajú u vás v PC, takže sa nemusíte báť, že niekto hackne KeePass, alebo, že KeePass prestane fungovať a vy o vaše heslá prídete, ako tomu je u podobných služieb od iných poskytovateľov. Ja osobne ukladám svoju databázu hesiel na Google Drive (Teraz tomu vraj hovoria google backup and sync? Čo tý ľudia v tom marketingovom oddelení hulia, keď si myslia, že takýto názov je lepší ako Drive fakt netuším. Kto vám v bežnej konverzácie bude hovoriť "Dám ti to na google backup and sync."?!). Vďaka tomu ju jednak nestratím, ak mi napríklad odíde disk na PC a jednak ju môžem používať na telefóne pomocou Keepass2Android. Ak máte svoju databázu v Google Drive neukladajte do nej heslo od Google, pretože sa k nemu bez tohoto hesla aj tak nedostanete. Takto by ste mohli prísť o všetky svoje heslá! Nemusíte sa báť, že by Google mal prístup k vašim heslám, databáza hesiel je šikovne šifrovaná pomocou vašeho hlavného hesla a používa taktiež PIM1. Každopádne taktiež používam rozšírenie ChromelPass, ktoré heslá píše z KeePass priamo do webových stránok, lebo lenivosť. Pozor: Heslo z KeePassu sa nedá resetovať, pretože ho nikto okrem vás nevie a databáza sa bez neho nedá nijak dešifrovať. 1.3 Antivirový program Dobrý antivírový program je základ pre bezpečnosť a je to jediná oblasť v tomto návode, kde by som odporučil zaplatiť nejaké peniaze, ak chcete byť naozaj v bezpečí. Ja osobne používam ESET Smart Security (zrejme zas premenovali na Internet Security, meh), ktorý je platený, ale som veľmi spokojný. Jednoduchá inštalácia a funguje bez nejakého extra nastavovania, čo je obzvlášť plus, ak nieste bezpečnostný expert a všetkým tým zložitým nastaveniam nerozumiete. Jediná vec, ktorú by ste mali vypnúť pri inštalácii je "detekcia potenciálne nechcených aplikácií", čo v preklade znamená, že vám ESET bude vrieskať na každú blbosť ako crack, cheat a podobne. A na detekciu takýchto vecí ja aj tak lepší MawareBytes, o ktorom hovorím v sekcii 1.5. Je dostupných taktiež viacero programov, ktoré sú zadarmo, ale s týmy, ktoré som skúšal som vždy mal nejaké problémy a neviem vám doporučiť žiadny najlepší. Jediné čo k tomu poviem je, držte sa ďalej od McAfee. Myslým, že oni tú predponu anti v slove antivírus pridali len preto, aby zmiatli súpera... Taktiež nepoužívajte 2 antivírové programy naraz, viď. sekcia 1.5. 1.4 2FA (Dvojfázové overenie) Niektoré webstránky umožňujú používať takzvané dvojstupňové overenie (Two Factor Authentication, 2FA). 2FA znamená, že sa pri prihlásení okrem hesla musíte ešte overiť pomocou napríklad svojho telefónu. Vysoko odporúčam si 2FA aktivovať minimálne pre váš Google účet (pamätajte, že na ňom máte databázu všetkých svojich hesiel, aj keď šifrovanú, ale heslo vám niekto môže dopozerať, keď ho píšete) a na váš mail (ak používate Gmail, tak máte 2 v jednom), pomocou ktorého vám niekto môže restovať všetky vaše heslá a dostať sa všade. POZOR: Vytvorte a odložte si záložné kódy!!! Ak sa niečo stane s vaším telefónom (stratíte, utopíte, pokazí sa) a nebudete mať záložné kódy, tak sa nedostanete do svojich účtov a všetko stratíte. Kódy od Google si vytlačte, najlepšie v dvoch kópiách a uložte na bezpečné miesto, prípadne jednu kópiu môžete nosiť v penaženke. Ostatné kódy si môžete uložiť napríklad aj do KeePass do poznámok k heslám. Neukladaje tam kódy od Google, keďže vaša databáza je na Google drive!! Pretože na Google drive a tým pádom ani do KeePass sa bez nich potom nedostanete. 1.5 MalwareBytes MalwareBytes je veľmi užitočný nástroj na skenovanie počítača. Na rozdiel od bežných antivírov je veľmi dobrý v hľadaní menej nebezpečných, ako napríklad rôzne reklamné vírusy, ktoré vám neustále zobtazujú nejaké stránky pre dospelých a podobne. Odporúčam si ho nainštalovať a spustiť sken raz za čas. Neodporúčam vám si zaplatiť za prémiovú verziu. Prémiová verzia vám iba umožňuje používať MalwareBytes ako bežný antivír. Avšak MalwareBytes nieje až tak dobrý v zastavovaní vírusov a používať dva antiviráky nieje dobrý nápad. Jednak zbytočne spomalíte svoj počítač. Ale hlavne dva antivíry sú ako dve frajerky, je fajn mať jednu trvalo a jednou... skenovať... raz za čas, ale skúsiť ich obe nasťahovať k sebe domov by dopadlo zle. Neustále by sa hádali a mohlo by to byť nakoniec horšie, než mať len jednu. 1.6 HTTPS a VPN Každý, kto sa dokáže pripojiť medzi vás a internet dokáže odpočúvať a aj meniť, čo odosielate a prijímate a to vrátane hesiel. To zahŕňa nielen vašeho providera internetu, ale napríklad aj každého s prístupom k vašemu routeru. Ak router nieje správne zabezpečený, môže to dokonca zahŕňať každého, kto je k routeru len pripojený. Preto je potreba používať HTTPS všade, kde to je možné. HTTPS šifruje vaše spojenie a vďaka tomu zabraňuje odpočúvaniu aj meneniu. Avšak nie všetky weby poskytujú https. Ak chcete bezpečne navštevovať aj tie, môžete použiť VPN. VPN šifruje vaše spojenie a vďaka tomu zabraňuje špehovaniu od všetkých vyššie vymenovaných lumpov. Ale pozor: Váš poskytovateľ VPN vidí všetko, čo by normálne videl váš internetový provider. Preto je dôležité si vybrať VPN, ktorá aspoň tvrdí, že neukladá žiadne údaje, aj keď toto tvrdenie sa nedá overiť. Preto neprestaňte používať HTTPS aj keď máte VPN. VPN má taktiež tú výhodu, že skryje vašu IP adresu. 1.7 Vypnite RDP Vypnite RDP! RDP je niečo ako Team Virewer len horšie a vstavané priamo vo Windowse. Často to je zapnuté defaultne. Vypnite to! A keď hovoríme o TeamVirewery, ten vypnite tiež, keď ho nepoužívate. Alebo ak neviete ako, tak ho rovno odinštalujte. Keď ho budete potrebovať znovu tak o pol roka, tak ho proste nainštalujete znovu. Aspoň budete mať najnovšiu verziu. PS: Ak RDP naozaj potrebujete, zvazte jeho zablokovanie na firewalle PC a tunelovanie cez SSH. Touto metodou odstranite vacsinu problemov, ktore nastavaju pri beznom pouziti RDP. Usitite sa, ze mate SSH spravne nastavene. 2 Silnejšie zabezpečenie (porazte súrodencov, aj FBI) Ako zabezpečiť svoj PC, ak sa útočník dokáže k nemu dostať fyzicky. 2.1 VeraCrypt Používať heslo na Windowse je asi tak efektívne, ako nalepiť lístoček s textom "Nepoužívať bez povolenia" na monitor. Nástroje ako OphCrack dokážu prelomiť aj 16-miestne heslá za niekoľko minút. A dané heslo nakoniec ani nepotrebujete. Stačí vybrať disk a pripojiť ho k inému PC alebo nabootovať iný operačný systém z CD/USB a možete prechádzať všetky súbory bez hesla. Jediný spôsob, ako tomuto zabrániť je šifrovať svoj disk a to umožnuje open-source program zvaný VeraCrypt. VeraCrypt je nasledovník TrueCryptu, keďže vývojári TrueCryptu sa dobrovoľne rozhodli projekt ukončiť a odporučiť všetkým, aby používali bitlocker (Určite americké tajné služby v tom nemali prsty, určite ich nepresvedčili, že odovzdať všetku moc Microsoftu je dobré pre ich zdravie). VeraCrypt dokáže šifrovať celý disk, alebo len niektoré súbory, alebo aj oboje rôznymi heslami. Taktiež používa PIM1 a dokáže aj vytvárať takzvané skryté sekcie. To umožňuje v podstate skryť súbory do iných šifrovaných súborov. Takže povedzme, že máte rôzne nelegálne hacky v PC a niekto vás dotiahne pred súd. Sudca vám prikáže rozšifrovať zašifrované súbory, inak vás pošle do vezenia, až dokým nevyzradíte heslo. A tak mu vaše heslo poviete, lenže všetko čo nájde sú len rôzne por... exotické videá. Naštvaný prokurátor sa vás opýta, aké je heslo k vašim skrytým súborom v týchto súboroch, ale vy mu poviete, že tam žiadne niesu. A to, či tam sú sa nijako nedá zistiť, takže vás musia pustiť. Potom si len zadáte svoje druhé heslo do VeraCryptu a veselo si hackujete ďalej. Je ale kritické, aby ste PC vypli, než sa k nemu niekto dostane, keďže heslo sa zadáva len pri zapnutí PC a zapnutý PC môže používať každý. 2.2 BitLocker Nepoužívajte bitlocker. Ak vás zaujíma prečo, čítajte ďalej, ak nie, preskočte na ďalšiu sekciu. Bitlocker je šifrovacia aplikácia podobná VeraCryptu, ktorá je vyrobená Microsoft a pribalená priamo v niektorých Windowsoch. BitLocker síce funguje podobne ako VeraCrypt, ale s tým rozdielom, že keď niečo zašifruje, tak kľúče odošle priamo Microsoftu. Takže v predchádzajúcom príklade o súde sudca dostane všetky klúče hneď od Microsoftu a nemusí sa vás pýtať na nič. Hneď idete bručet. A nielen to, ale stačí aby niekto napríklad získal vaše heslo od Microsoft účtu, alebo mailu, alebo nejak inak presvedčil Microsoft, že ste to vy a môže vám resetovať heslo. 2.3 Windows Heslo V sekcii 2.1 som napísal, že windows heslo samé o sebe je úplne neefektívne a to je aj pravda. Avšak Windows heslo môže byť užitočné v kombinácii s napríklad VeraCryptom. VeraCrypt pýta heslo len keď zapnete počítač. Lenže od zapnutého počítača musíte často na chvíľu odísť. Preto je vhodné si na tú chvíľu zhačknúť widnows+L alebo ctrl+alt+del alebo a vybrať "zamknúť". Obísť windows heslo bez vypnutia PC je zložité, aj keď nie nemožné. Pre Windows heslo vám stačí niečo jednoduché, napríklad len pár čísiel, alebo jedno dve slová/mená. Úlohou tohoto hesla je len odradiť náhodné mašírovanie od súrodencov, spolubývajúcich a kolegov na tú chvíľu, kým ste preč od PC. Môžete si taktiež nastaviť, aby sa vám PC zamkol po niekoľkých minútach bez používania. 2.4 Heslo na telefóne Pre androiďákov tu, ak chcete mať svoj telefón v bezpečí, je nutné si zapnúť šifrovanie telefónu v nastaveniach a taktiež šifrovanie karty SD, ak nejakú máte a chcete ju v bezpečí. Používanie odtlačku prstu nestačí, keďže odtlačky sa zatiaľ nedajú použiť na šifrovanie. Ak používate biometriku, nieje zlý nápad si taktiež stiahnuť aplikáciu typu FindMyPhone alebo niečo podobné, ktorá vám umožní zamknúť telefón na heslo na diaľku. Taktiež si pamätajte, že pre súd je ťažké a vo veľa krajinách nelegálne vás donútiť vyzradiť heslo, ale jednoduché vás donútiť priložiť prst k snímaču, alebo zobrať vaše odtlačky. 2.5 Súkromný chat (s telefónnym číslom) Pre bezpečný chat momentálne platí jednoduché pravidlo, čím bezpečnejšie, tým menej vychtávok ako napríklad nálepky a menej ľudí, ktorý to používajú. Najpoužívanejšia chatová aplikácia, ktorá je aspoň ako tak bezpečná je Messanger, keď používate tajné konverzácie. Messanger používa Signal protokol. Tento protokol je považovaný za veľmi bezpečný, avšak to, že používate tajné konverzácie je nápadné a FB ukladá metadáta. To znamená, že FB nevie, o čom si píšete, ale vie, kedy, s kým, ako dlho, koľko správ a približne ako dlhých. To nieje ideálne. Taktiež to funguje len cez telefón, nie PC. Taktiež vám appka pre telefón z telefónu kradne telefónne čísla a odosiela vašu polohu GPS. Druhá často používaná aplikácia je WhatsApp. Táto aplikácia používa Signal protokol na všetky konverzácie, aj na hlasové hovory. Avšak WhatsApp je momentálne vlastnený Facebookom, takže FB taktiež zbiera vaše metadáta (kdo, kde, kedy, s kým, koľko, ako dlho). Taktiež pre FB kradne vaše telefónne číslo, ako aj čísla všetkých vašich kontaktov v telefóne. Či kradne vašu GPS polohu momentálne neviem. Najbezpečnejšia, ale najmenej populárna apka je Signal. Áno, apka menom Signal používa Signal protokol na všetko. Ide o appku priamo od vývojárov Signal protokplu a verejne ju chválil aj Edward Snowden. Signal zaručuje, že neukladá žiadne metadáta ani telefónne čísla vašich kontaktov (aj keď ich odosielať pre fungovanie musí). Signal je Open-Source aplikácia a jej kód, vrátane kódu serveru si teda môžete overiť. Signal momentálne pracuje na spôsobe, ako overiť, že servery naozaj používajú zverejnený kód (a nie kód, ktorý ukladá informácie) pomocou Intel Trusted Platform. 2.6 Súkromný chat (bez telefónneho čísla) Bohužial, aplikácií ktoré nevyžadujú telefónne čisla nieje veľa a sú pomerne neznáme a nepoužívané. Ja osobne som zatiaľ skúšal Wire a Tox. Obe su open-source, ale ani jedna z nich ma nijak moc nenadchla. Wire je aplikácia, ktorá je zadarmo pre ľudí a platená pre firmy. Naposledy keď som ju skúšal bola plná bugov (aj keď na nej od tej doby zrejme zapracovali). Prešla však nezávislým auditom, čo znamená, že by mala byť relatívne bezpečná. Tox je nekomerčný projekt a používa P2P technológiu miesto serverov, takže nikto nemôže získavať metadáta. Avšak to taktiež znamená, že nemôžete poslať správu niekomu, kto nieje online, keďže nieje žiadny server, ktorý by mu ju zatiaľ podržal. Taktiež Tox neprešiel žiadnym auditom a jeho tvorcovia sa chovajú dosť nevhodne, čo sa bezpečnej aplikácie týka. Preto bezpečnosť toxu je značne pochybná. 3. Poznámky 1. PIM (Personal Iteration Multiplier) spôsobuje, že prevedenie hesla na kľúč trvá nejakú dobu, v prípadne KeePass 1-2 sekundy. Preto sa zdá, že otváranie KeePassu je pomalé. Ale vďaka tomu niekto, kto tipuje heslá taktiež musí čakať na každý pokus 1 sekundu (na každom jadre CPU, ktoré má). Takže napríklad prelomiť osemmiestne heslo, ktoré je len z číslic (napr. 8428 1158) by normálne trvalo na bežnom PC 5-10 minút bez PIM a cca 4 roky s PIM. PIM je super!
  5. Hunterov úvod do bezpečnej komunikácie Pokračovanie môjho návodu Hunterov úvod do bezpečnosti. Tentokrát sa zameriavam na bezpečnú komunikáciu cez internet. V tomto zozname som vybral len aplikácie, ktoré stoja za zváženie a majú rôzne výhody a nevýhody. Aplikácie, ktoré sú podobné alebo horšie ako uvedené som nespomínal, keďže nieje dôvod ich používať. 1. E-Mail 1.1 Proton mail Protonmail je email zameraný na bezpečnosť. Používa sa pomocou prehliadača alebo mobilnej aplikácie. Výhody: + Skoro každý má e-mail + E2E Šifrovanie, takže ani protonmail nemôže vidieť vaše správy + Hostované vo švajčiarsku, kde právo na súkromie je zakotvené v ústave Nevýhody: - Bezpečnosť v prehliadači je pochybná v porovnaní s aplikácoiu - Ak ten, s kým komunikujete nepoužíva proton mail, tak je šifrovanie zložitejšie a menej bezpečné. 1.2 Enigmail Enigmail je rozšírenie pre Mozilla Thunderbird. Umožnuje šifrovanie mailov pomocou GPG. Výhody: + Skoro každý má e-mail + Funguje s každým providerom e-mailu. + GPG je staré a dobre otestované Nevýhody: - GPG je veľmi zložité na správne použitie, ľahko spravíte kritickú chybu, ktorá znehodnotí vašu bezpečnosť 2. IM s telefónnym číslom 2.1 Signal Signal je aplikácia podobná whatsapp. Používa silné E2E šifrovanie pomocou Signal protokolu, takže provider nevidí obsah vašich správ. Signal neukladá metadáta, jedine čo sa ukladá je: dátum registrácie, dátum posledného prihlásenia. Výhody: + Podobné whatsapp, jednoduché na použitie. + E2E Šifrovanie, takže ani Signal nemôže vidieť vaše správy + Neukladá metadáta Nevýhody: - Hostované v USA, kde ochrana súkromia je porovnateľná s diktatúrami. - Vyžaduje telefónne číslo, ktoré každý, komu napíšete uvidí. 3. IM bez telefónneho čísla 3.1 XMPP XMPP je otvorený federovaný protokol. To že je otvorený znamená, že existuje viacero rôznych aplikácií, ktoré môžu komunikovať jedna s druhou. To že je federovaný znamená, že si môžete vybrať providera alebo hostovať uzol samy rovnako ako u emailu. Osobne používam Gajim ako PC klient, Conversations ako android klienta a dismail.de ako providera. Výhody: + Federovaný, umožnuje si vybrať providera s dobrým súkromím alebo hostovať vlastný server + Umožnuje E2E šifrovanie pomocou rozšírenie, používa variantu Signal protokolu zvanú OMEMO Nevýhody: - Veľmi zložitý na použitie - Klienti majú často nízku kvalitu - OMEMO je len rozšírenie, navyše ho veľa klientov nepodporuje - Neviem nájsť švajčiarsky server 3.2 Wire Wire je aplikácia, ktorá je zadarmo pre súkromné účely a platená pre komerčné použitie. Výhody: + Jasný plán speňaženia, profesionálny prístup + E2E šifrovanie, takže Wire nemôže čítať vaše správy + Jednoduchý na použitie Nevýhody: - Naposledy keď som testoval zabugovaný - Komerčná firma pravdepodobne nebude riskovať svoj biznis proti súdnym príkazom, možná spolupráca s vládou 4. Decentralizované IM 4.1 Tox Tox je decentralizovaná aplikácia, takže žiadna jedna firma nemôže sledovať vašu aktivitu a je velmi zložité Tox zavrieť, podobne ako Torrenty. Tox je otvorený a má viacero klientov podobne ako XMPP. Výhody: + Decentralizovaný + Viac klientov, používam qTox a zdá sa, že má dobrú kvalitu + Samozrejme E2E šifrovanie (v decentralizovanom systéme je nutné). Nevýhody: - Nemôžete posielať správy offline používateľom, keďže neexistuje server, ktorý by ich uchovával - Užívateľa musíte pridať pomocou pseudo-náhodného textu a nie zapamätateľného užívateľského mena. 5. YOLO kategória 5.1 Deamonsaw Deamonsaw je aplikácia, ktorá využíva sociálnu kryptografiu a každý môže hostovať vlastný server. Server neukladá žiadne informácie. Výhody: + Extrémna bezpečnosť a súkromie + Celkom pekná aplikácia Nevýhody: - Najnovšia verzia nieje open-source - Socialna kryptografia je otravná - Neukladá správy, takže keď ste offline sa vám stratia - Žiadny rozumný človek by niečo takéto nikdy nepoužíval 6. Sociálne siete 6.1 Mastodon Mastodon je federovaná sociálna sieť podobná twitteru. Výhody: + Veľmi pekná stránka, možno krajšia ako twitter + Federovaná, takže sa môžete sami rozhodnúť, komu zveríte svoje dáta + Môžeťe svoje dáta stiahnuť a nahrať na iný uzol, ak zmeníte názor Nevýhody: - Ako sociálna sieť nemá E2E šifrovanie, takže musíte veriť uzlom a neposielať citlivé údaje - Chvíľu trvá si zvyknúť na štýl stránky, ktorý je veľmi odlišný od twitteru. 6.2 Diaspora* Diaspora* je federovaná sociálna sieť, ktorá chce konkurovať Facebooku. Myšlienka je síce pekná, ale zatiaľ to nieje konkurencieschopné. Výhody: + Celkom jednoduchý systém podobný Google+ + Federovaná, takže sa môžete sami rozhodnúť, komu zveríte svoje dáta + Môžeťe svoje dáta stiahnuť a nahrať na iný uzol, ak zmeníte názor Nevýhody: - Ako sociálna sieť nemá E2E šifrovanie, takže musíte veriť uzlom a neposielať citlivé údaje - Nemá skupiny, ktoré sú dôležitou súčasťou FB - Celkovo pomerne nedokončená sociálna sieť, čo sa funkcií týka 7. Doplnkové 7.1 Privatebin Privatebin je služba podobná pastebinu, avšak umožňuje E2E symetrické šifrovanie (zamknutie na heslo). Môžete hostovať vlastný server, alebo použiť verejný. Okrem bežného zdieľania je taktiež vďaka funkcii vymazania po prvom prečítaní vhodný na zdieľanie informácií vo verejnom prostredí. Napríklad ak by som chcel v chate na pawno.cz niekomu dať svoj email (a neexistovali by súkromné správy), stačilo by ho vložiť do pastu a nastaviť na jedno prečítanie. Potom ho poslať do pawno chatu. Ten komu som ho chcel poslať by si ho prečítal a ak by niekdo neskôr prišiel a chcel ho získať, už by bol smazaný. Výhody: + E2E šifrovanie, heslo + kľúč v linku + Jednoduché hostovanie vlastného serveru aj na free hostingoch. + Umožňuje vymazať paste po prvom prečítaní a zároveň nastaviť dobu vypršania. + Šifruje E2E aj keď nezadáte heslo, heslo je automaticky vložené do linku. Nevýhody: Nevidím žiadne 7.2 Ghostbin Ghostbin je služba podobná pastebinu a privatebinu. Umožňuje E2E symetrické šifrovanie (zamknutie na heslo). Má krajšie formátovanie kódu ako privatebin, avšak horšiu bezpečnosť. Výhody: + E2E šifrovanie + Pekná prodpora pre rôzne programovacie jazyky. Nevýhody: - Bez hesla nešifruje, takze silné heslo je extra dôležité (na rozdiel od privatebinu) 8. Čo tu chýba V tomto návode chýba služba na zdieľanie súborov. Počul som dobré veci o OnionShare a zaujímavo vyzerá aj Magic Wormhole. Nič menej keďže som tieto aplikácie osobne neskúšal, netrúfam si ich tu odporúčať alebo hodnotiť. Taktiež tu chýba cloudové riešenie. Ja osobne momentálne preferujem Nextcloud, ale taktiež ho nemám dostatočne dlho na to, aby som hodnotil. Zaujal ma aj Seafile. Podobné je owncloud. Možno aj Least Authority S4 a spideroak.
  6. Kod test scriptu: Vysledky na linuxe (Fakaheda): [16/04/2018 08:17:12] Iterations = 10000 [16/04/2018 08:17:12] Test1 = 6 [16/04/2018 08:18:43] Test3 = 91067 [16/04/2018 08:18:49] Test2 = 6142 Vysledky Linux (~no i/o): [16/04/2018 09:24:32] Iterations = 10000 [16/04/2018 09:24:32] Test1 = 2 [16/04/2018 09:25:08] Test3 = 36002 [16/04/2018 09:25:10] Test2 = 2344 Vysledky na Windowse (HDD): [08:19:12] Iterations = 10000 [08:19:12] Test1 = 35 [08:27:49] Test3 = 516449 [08:28:23] Test2 = 34184 Vysledky Windows (SSD): [08:32:43] Test1 = 44 [08:40:00] Test3 = 437791 [08:40:35] Test2 = 34545 Vysledky Windows (RAM disk): [08:47:06] Iterations = 10000 [08:47:06] Test1 = 35 [08:54:27] Test3 = 440681 [08:55:00] Test2 = 32862 Vysledky windows (~no i/o): [09:19:56] Test1 = 15 [09:21:46] Test3 = 110336 [09:21:49] Test2 = 3381 Vysledky Windows (Len overhead testu): [09:12:35] Test1 = 3 [09:12:35] Test3 = 3 [09:12:38] Test2 = 2926
  7. 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á..
  8. OBSAH Obtiažnosť Predslov Úvod Obsah Záver Funkční pouze do verze 39 Tento návod je aktuální pouze do verze 39. Na aktualizaci návodu se pracuje. Obtiažnosť Predslov Vážení čitatelia. Už dlhšie som si všímam, ako sa všetci neustále delíte, na viac táborov, a pritom, máte celý čas, ten vysnení, ukladací systém, podnosom. V konečnom dôsledku, aj chápem, prečo málo kto skočí, po MySQL databáze. Jednak, sa musíte učiť nový jazyk, SQL, a na stránke druhej, nikto nenapísal, žiadny komplexný návod. Samozrejme, že niekto môže podotknúť „Ale v roku 2011 napísal jeden mladí junák ...“ áno, máte pravdu, niečo podobné návodu, na MySQL ukladací systém, som tu videl, ale za ten čas, sa toho veľa zmenilo. Neskôr to zistí, aj náš miestni spochybňovač. Úvod Tak, ak si prežil môj predslov, môžeme pokračovať ďalej, v návode. Ako prvé, budete potrebovať prístup, k vašej databáze. Ja osobne, používam na tvorbu tabuliek, phpMyAdmin. Ak ste skúsenejší, môžete to robiť aj manuálne, cez konzolu. Ďalej budete potrebovať MySQL plugin, a includ. Všetko potrebné, samozrejme prikladám, na konci tohto návodu, spolu, s návodom, na jazyk SQL. Jazyk SQL, budete potrebovať, pri rozsiahlom využití, pluginu. Tiež chcem podotknúť, že tento návod, počíta že ovládate jednotlivé datatypy, a samotný jazyk SQL. Príprava Ak ovládate phpMyAdmin prosím prejdite na ďalší bod. V príprave, vás naučím, ako vytvoriť databázu, a samotnú tabuľku, ktorá bude slúžiť, na ukladanie, a čítanie vašich dát. Samotní systém, sa bude skladať z atribútov, ktoré, budú mať v sebe isté informácie. Ako napríklad Meno hráča. Tak tiež, jeden z atribútov, musí byť kľúč, teda atribút, ktorý, je nemenný. V tomto návode, to bude, naša vytvorená, premenná “ID“. Po prihlásení do systému môžte vidieť následovné menu. Kde kliknete v hornej lište na ikonku databázy. Po kliknutí, sa nám zobrazí žiadosť, na vytvorenie databázy. Do prázdnej kolonky, napíšeme “Database“. Tím pádom, sa bude naša databáza, volať Database. Potom, kliknite na “vytvoriť“. Teraz, sa nám vytvorila naša databáza. Ďalší krok, bude vytvoriť tabuľku, a následne do nej vložiť naše atribúty. Pre editáciu databázy, musíte kliknúť na ikonku, v ľavej lište, s názvom našej databázy, ktorú sme vytvorili “Database“. Následne, sa nám zobrazí menu, na vytvorenie spomínanej tabuľky. Do prázdnej kolonky, napíšeme názov našej tabuľky, s ktorou budeme neskôr pracovať. My si tam napíšeme “account“. Vedľa našej “account“ kolonky, máme ešte tzv. “počet polí“. Počet polí, značí, že koľko atribútov, budeme používať. My osobne, budeme ukladať, 12 atribútov. Tím pádom, si zmeňte default 4, na 12. Následne, kliknite na “vykonaj“. Naša tabuľka, je teraz vytvorená. Teraz stačí, do nej vložiť, naše atribúty. V tomto kroku, nesmieme zabudnúť, na funkciu A_I. Vďaka tejto funkcií sa za každým novým záznamom pripočíta hodnota od poslednej hodnoty. Gratulujem. Vaša databáza s tabuľkami, je vytvorená. Sami musíte uznať, že to nebolo nič ťažké. Dúfam, že sa rovnako tešíte aj na ďalší krok. Obsah Vítam vás, v ďalšom bode, kde vás naučím, ako vytvoriť jednoduchú registráciu, pomocou MySQL pluginu. Opäť, vás chcem informovať, že bude potrebné, vedieť aspoň základy jazyka SQL! Ak, tieto znalosti nemáte, prosím prejdite, na bod, Záver. Špecifikácia Ako aj iné pluginy, ako SSCANF 2, používa aj MySQL plugin, isté špecifikácie na používanie. Špecifikátor Meno e dostanete reťazec naraz. Nemusíte používať, mysql_real_escape_string(). s String q Rovnaké ako %s. Pridané v SA:MP 0.3.7 R2 d | i Integer f Float x Hex b Binar Ako prvé, je potrebné, si stiahnuť plugin, aj s includom. Ten môžte stiahnuť, rolovaním stránky, na bod záver, kde sú jednotlivé linky na download, alebo učebný materiál SQL. Po pridaní includu, si otvoríme editor, do ktorého si napíšeme, následovné kód. #include <a_samp> #include <a_mysql> #define MYSQL_DB "Your_Database" #define MYSQL_USER "Name" #define MYSQL_PASS "Pass" #define MYSQL_HOST "IP" #define D_REG 0 #define D_LOG 1 native WP_Hash(buffer[], len, const str[]); Definície Najprv sme si zapísali použité include s ktorými budeme pracovať a to “<a_samp>“ a “<a_mysql>“. Potom sme vytvorili definície ktoré nám poslúžia ako skratka. #define MYSQL_DB - Meno databázy. #define MYSQL_USER - Meno užívateľa phpMyAdmin. #define MYSQL_PASS - Heslo užívateľa do phpMyAdmin. #define MYSQL_HOST - IP Serveru. Ak máte MySQL databázu, u seba na VPS, na ktorom vám beží aj server, použite local host ip “[/size]127.0.0.1“.[/size] #define D_REG - Dialog ID Registrácie #define D_LOG - Dialog ID Prihlásenia O hash hesla sa bude starať ďalší plugin ktorý by mal byť najbezpečnejší a to Whirlpool. native WP_Hash(buffer[], len, const str[]); // MySQL new MySQL; // REGISTER VARIABLE new ID [MAX_PLAYERS], Skin [MAX_PLAYERS], Kill [MAX_PLAYERS], Death [MAX_PLAYERS], Admin [MAX_PLAYERS], Wanted [MAX_PLAYERS], Password [MAX_PLAYERS], Float: PosX [MAX_PLAYERS], Float: PosY [MAX_PLAYERS], Float: PosZ [MAX_PLAYERS], Float: PosR [MAX_PLAYERS]; // CONTROL VARIABLE new C_Login [MAX_PLAYERS]; Premenné Teraz sme si vytvorili premenné. s ktorými budeme ďalej pracovať. MySQL - slúži na rozpoznávanie databáze, a celkovo nám bude udržiavať, dátové pripojenie. C_Login - Táto premenná, slúži na kontrolu, aby nám ukladanie nerobilo problémy, v prípade prihlásenia, a rázneho odhlásenia. forward OnAccountLoad(playerid); forward OnAccountCheck(playerid); forward OnAccountRegister(playerid); Forward Teraz sme si vytvorili forwardy na naše public. public OnGameModeInit(){ mysql_log(LOG_ERROR); MySQL = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_DB, MYSQL_PASS); if(mysql_errno() != 0) printf("[MySQL] Connect is not succesfull!"); else printf("[MySQL] Connect is succesfull!"); return true; } OnGameModeInit mysql_log(LOG_ERROR); - Vďaka tejto funkcií, sa nam vytvorí, v prípade nejakej chyby, MySQL log, do ktorej sa daná chyba zapíše. MySQL = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_DB, MYSQL_PASS); - tu sa jedná o samotné pripojenie na MySQL server. v prípade, ak máte iný port, na MySQL databázu ako je bežné, je potrebné za MYSQL_PASS dopísať váš port. if(mysql_errno() != 0) - slúži na informáciu o úspešnom alebo neúspešnom pripojení. public OnPlayerConnect(playerid){ C_Login [playerid] = Kill [playerid] = Death [playerid] = Admin [playerid] = Wanted [playerid] = 0; new string[128]; mysql_format(MySQL, string, sizeof(string), "SELECT `Password`, `ID` FROM `account` WHERE `UserName` = '%e' LIMIT 1", PlayerName(playerid)); mysql_tquery(MySQL, string, "OnAccountCheck", "i", playerid); return true; } OnPlayerConnect V tomto public, nulujeme naše premenné, a následne deklarujeme naše dôležitejšie premenné. Tieto premenné sa budú používať v callback “OnAccountCheck“. public OnPlayerDisconnect(playerid, reason){ if(C_Login[playerid]){ new string[255]; GetPlayerPos(playerid, PosX[playerid],PosY[playerid],PosZ[playerid]); mysql_format(MySQL, string, sizeof(string), "UPDATE `account` SET `Wanted` = %d, `Skin` = %d, `Kill` = %d,\ `Death` = %d,`Admin` = %d, `PosX` = %f, `PosY` = %f, `PosZ` = %f, `PosR` = %f WHERE `ID` = %d", Wanted[playerid],Skin[playerid],Kill[playerid],Death[playerid], Admin[playerid],PosX[playerid],PosY[playerid],PosZ[playerid],PosR[playerid],ID[playerid]); mysql_tquery(MySQL, string, "", ""); } return true; } OnPlayerDisconnect V tomto public, ukladáme, naše premenné. Najprv si deklarujeme naše premenné, a potom aktualizujeme našu databázu, s novo získanímy údajamy. V podstate to môže pripomínať ukladanie v file.inc. public OnPlayerRequestSpawn(playerid){ if(C_Login[playerid]){ SpawnPlayer (playerid); SetPlayerSkin (playerid, Skin[playerid]); SetPlayerPos (playerid, PosX[playerid],PosY[playerid],PosZ[playerid]); SetPlayerFacingAngle(playerid, PosR[playerid]); } return false; } OnPlayerRequestSpawn Tu, nám kontroluje premenná C_Login[playerid], či je true, a ak áno, spawne nás na súradnice ktoré buď máme uložené, alebo po registrácií priradené. Tak tiež, nám nahrá uložení skin. public OnPlayerDeath(playerid, killerid, reason){ if(killerid != INVALID_PLAYER_ID){ Kill [killerid]++; Death [playerid]++; Wanted[killerid]++; } return true; } OnPlayerDeath V prípade, ak bol hráč zabití, pridá mu do premennej Death + 1, a hráčovi ktorý ho zabil, Kill + 1 a Wanted + 1. public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[]){ switch(dialogid){ case D_REG:{ if(response){ if(strlen(inputtext) < 4) return ShowPlayerDialog(playerid, D_REG, DIALOG_STYLE_INPUT, "Registration", "Please type your password. The range of password is 4 - 19.", "confirm", "close"); new string[500]; WP_Hash(Password[playerid], 129, inputtext); mysql_format(MySQL, string, sizeof(string), "INSERT INTO `account` (`UserName`, `Password`) VALUES ('%e', '%e')", PlayerName(playerid), Password[playerid]); mysql_tquery(MySQL, string, "OnAccountRegister", "i", playerid); C_Login[playerid] = 1; } else Kick(playerid); } case D_LOG:{ if(response){ new string [225], hashpass[129]; WP_Hash(hashpass, sizeof(hashpass), inputtext); if(!strcmp(hashpass, Password[playerid])){ mysql_format(MySQL, string, sizeof(string), "SELECT * FROM `account` WHERE `UserName` = '%e' LIMIT 1", PlayerName(playerid)); mysql_tquery(MySQL, string, "OnAccountLoad", "i", playerid); C_Login[playerid] = 1; } else ShowPlayerDialog(playerid, D_LOG, DIALOG_STYLE_INPUT, "Login", "Please enter your password with which you registered on the server.", "confirm", "close"); } else Kick(playerid); } } return true; } OnDialogResponse Ako môžme vidieť máme tu dvoje dialógy ktoré sú switchované a to login a register. Register if(strlen(inputtext) < 4) - Ak je string menší ako 4, hráčovi znovu načitá dialóg. WP_Hash(Password[playerid], 129, inputtext); - Whirlpool plugin nám zahashuje heslo. Následne uložíme a voláme callback “OnAccountCheck“ Login WP_Hash(hashpass, sizeof(hashpass), inputtext); - Hashujeme inputtext. if(!strcmp(hashpass, Password[playerid])) - Porovnanie uloženého hesla a inputtextu. Na koniec voláme public z ktorého sa nám nahrajú údaje. public OnAccountCheck(playerid){ new rows, fields; cache_get_data(rows, fields, MySQL); if(rows){ cache_get_field_content(0, "Password", Password[playerid], MySQL, 129); ID[playerid] = cache_get_field_content_int(0, "ID"); ShowPlayerDialog(playerid, D_LOG, DIALOG_STYLE_INPUT, "Login", "Please enter your password with which you registered on the server.", "confirm", "close"); } else ShowPlayerDialog(playerid, D_REG, DIALOG_STYLE_INPUT, "Registration", "Please type your password. The range of password is 4 - 19.", "confirm", "close"); return true; } OnAccountCheck Vytvorili sme si dve premenné, do ktorých, sa uložia parametre, z predošlého public OnPlayerConnect(playerid). Ak premenná rows nebude nula, tak načíta hodnotu password, a priradí ju k premennej password[playerid], potom priradí aj hodnotu ID[playerid]. A podla tejto hodnoty premennej rows, sa rozhoduje ktorý dialog spustí. public OnAccountLoad(playerid){ Wanted [playerid] = cache_get_field_content_int (0, "Wanted"); Skin [playerid] = cache_get_field_content_int (0, "Skin" ); Kill [playerid] = cache_get_field_content_int (0, "Kill" ); Death [playerid] = cache_get_field_content_int (0, "Death" ); Admin [playerid] = cache_get_field_content_int (0, "Admin" ); PosX [playerid] = cache_get_field_content_float(0, "PosX" ); PosY [playerid] = cache_get_field_content_float(0, "PosY" ); PosZ [playerid] = cache_get_field_content_float(0, "PosZ" ); PosR [playerid] = cache_get_field_content_float(0, "PosR" ); return true; } OnAccountLoad - Tento public, slúži, na nahratie hráčových údajov. Dosť podobné, INI systémom. public OnAccountRegister(playerid){ ID [playerid] = cache_insert_id(); PosX [playerid] = 1682.7249; PosY [playerid] = 1451.3008; PosZ [playerid] = 10.7719; printf("[Registration] New account registered. Database ID: [%d]",ID[playerid]); return true; } OnAccountRegister Toto spätné volanie, sa vyvolá po úspešnej registrácií, kde priradí, hráčovi default premenné, plus statický ID identifikátor. stock PlayerName(playerid){ new name[MAX_PLAYER_NAME+1]; GetPlayerName(playerid, name, sizeof(name)); return name; } PlayerName Nakoniec starý známy stock. Záver Ako vidíte sami nie je to nič zložité. Jedná sa o veľmi skvelí ukladací systém ktorý vám odporúčam ako náhradu za všetky INI systémy. Celý tento návod je len zlomok toho čo daný plugin umožňuje. Dúfam, že vám môj návod pomohol. Download MySQL & Whirlpool Download Code & SQL Learn SQL Ověřený návod Tento návod prošel validací, a lze ho proto považovat za ověřený.
  9. Multi jazyk pre GM Obtížnost: 2/5 Osnova/obsah: 1. Úvod 2. Čo je multi jazyk (multilanguage) a načo sa dá použiť? 3. Vytváranie vlastných funkcií a ich použitie 4. Záver 1. Úvod Tento návod som sa rozhodol vytvoriť, pretože v dnešnej dobe už GM s jedným jazykom nemá veľkú popularitu, a mladší hráči ktorý neovládajú veľmi angličtinu nehrávajú na serveroch písaných po anglicky. Upozorňujem, že tento návod nie je copy + paste. Pre tvorbu svojích funkcií je nutné kódu rozumieť. 2. Čo je multi jazyk a načo sa dá použiť? Multi jazyk je implementácia dvoch a viacerých jazykov do GM. V tomto návode sa Vám posnažím čo najjednoduchšie vysvetliť, ako si vytvoriť svoje funkcie na multijazyčnosť a ako ich použiť. Multijazyčnosť je vhodná pre servery, ktoré plánujú expandovať na zahraničný "trh" a tým rozšíriť svoju klientelu (hráčov). 3. Vytvárania vlastných funkcií a ich použitie Celý systém funguje na princípe #define. Pre pochopenie kódu je nutné poznať: #include, #define, cyklus for, SendClientMessage/ToAll, format(...) V prvom rade, budeme potrebovať definície naších textov (textových reťazcov/stringov). Pre lepší prehľad som ich vložil do zložky INCLUDE s názvom lang_SK.inc a lang_CZ.inc. !!! POZOR !!! Je nutné nastaviť formátovanie textu na ANSI. lang_CZ.inc lang_SK.inc new.pwn
  10. Obtížnost: 1/5 Zdarec, akorát jsem řešil problém s chybou symbol "@yH_OnUnoccupiedVehicleUpdate@0" is truncated to 31 characters kterou hází y_hook v případě že délka jména callbacku přesáhne určitý počet znaků. V praxi se s tím setkáte jen u hookování callbacků jako je například OnUnoccupiedVehicleUpdate a OnPlayerEnterRaceCheckpoint. Existuje jednoduché řešení které YLess implementoval do YSI. Jmenují se HOOK_REPLACEMENTS. V podstatě jde o to že nějakou část jména callbacku zaměníte za náhradu která je kratší. V YSI jsou připravené replacementy například pro Checkpointy kde místo hook OnPlayerEnterRaceCheckpoint hooknete hook OnPlayerEnterRaceCP V případě mé chyby jsem si nad callback OnUnoccupiedVehicleUpdate přidal řádek DEFINE_HOOK_REPLACEMENT( Unoccupied , Uncp ); a pak změnil hook na hook OnUncpVehicleUpdate a tím je problém vyřešen. Doufám , že to někomu pomůže, samozřejmě určitě to nekdo znal ale já se k tomu dostal dnes.
  11. V tomto návode resp. v tejto sérií sa naučíme pawno :). Nebudeme sa učiť hneď tie najťažšie príkazy, funkcie atď... začneme pekne od najľahšieho. Pustime sa do toho :). Predpokladám že publicy už poznáte, ak viete po EN aspoň trochu, určite budete vedieť čo ktorý public znamená. ==[Ľahký príkaz]== Na začiatok si ukážeme fakt tú najprimitívnejšiu vec. A to je "SetPlayerHealth". Keby sme to mali preložiť, tak => "NastavHráčoviZdravie". Ukážme si to: ==[Legenda]== SetPlayerHealth => Nastaví hráčovy život. playerid => Zistí VAŠE ID. 100 => Počet životov, ktoré sa majú doplniť. Životy tak isto môžete odoberať nastavením nižšej hodnoty. 0 = Smrť. [Formát]: SetPlayerHealth(playerid,zivot); ----------------------------------- ==[Ďalší príkaz]== Zatiaľ to je ľahké že? :-) Teraz si predstavíme príkaz "SendClientMessage". V preklade => "PošliKlientovySprávu". Ukážka: ==[Legenda]== SendClientMessage => Pošle hráčovi správu playerid => Už vieme -1 => Farba správy (uvádzajte v "0xXXX" príklad si ukážeme a konci návodu) "text" => Správa, ktorá sa zobrazí hráčovi. [Formát]: SendClientMessage(playerid,COLOR,"TEXT"); ----------------------------------- ==[Definície]== Nechce sa vám stále písať "SetPlayerHealth", "SendClientMessage" atď?? Uľahčime si to definíciou! Definíciu píšeme vždy pod #include (vysvetlíme si v budúcom návode). Ukážka: ==[Legenda]== [Formát]: #define NÁZOV FUNKCIA ----------------------------------- ==[Zistenie farieb]== Otvoríme si napr. skicár a kalkulačku. V skicári si zvolíme Úprava farieb Zvoľme si nejakú farbu, ktorá sa nám bude páčiť. Teraz je dôležité si všimnúť 3 veci, a tie sú: "červená", "zelená", "modrá"} ktoré sa nachádzaju vpravo dole. Kalkulačku si prepnime na programátorskú, a po jednom tam po porade píšte tie farby. Po napísaní farby si všimnime okienko "HEX", zobrazí sa tam kód, ktorý si napíšeme do Pawna za 0x. Takže napr: 0x1234 atď.. Toto urobme na ostatných farbách. Nakoniec nám z toho vznikne v pawne kód na tú farbu. A to by bolo na dnes všetko :). Aby ste si to precvičili, dám vám domácu úlohu. Úlohu urobte, a script ktorý ste urobili napíšte sem dole do odpovedi :). Som zvedaví ako sa vám darí :). ==[D.Ú]== Vytvor script, ktorý doplný hráčovy HP na 50, a napíše správu o doplnení. Farbu správy daj oranžovú.
  12. Zdravím,další toturial ale asi někdo už to určitě udělal ale skuste si to také přečíst Děkuju za přečtení .... 1. Uložení pozice Nejdříve potřebujeme vědět kam chceme hráče warpnout, takže spustíme si server nebo se na nějaký připojíme a stoupneme si tam kde chceme aby se hráč warpnul a napíšeme do chatu /save a tím se nám uloží pozice. 2. Souřadnice Ve hře jsou 3 osy, osa X, Y a Z Osa X a Y je směr doleva, doprava, dopředu a dozadu Osa Z je nahoru dolu A pak je ještě úhel, tj také osa Z, ale rotace Takže spustíme si pawno a vytvoříme nový příkaz jaký chceme, dejme tomu /warp a teď potřebujeme souřadnice. Takže pokud máte sa-mp verzi 0.3e a vyšší tak se vám veškeré uložené pozice ukládají do textového souboru ve složce Windows Xp C:/Documents and Settings//Dokumenty/GTA SA User Files/SAMP Windows 7 - Vista C:/Users//Dokumenty/GTA SA User Files/SAMP A to v souboru s názvem savedpositions.txt, ten otevřeme a jukneme co v něm je. Uvedu příklad s mímy souřadnicemi. AddPlayerClass(0,1117.9332,-2036.9949,78.7500,266.7980,0,0,0,0,0,0); AddPlayerClass - Toho si nevšímejte to je funkce, ta nás teď nezajímá 0 - ID skinu 1117.9332 - Osa X -2036.9949 - Osa Y 78.7500 - Osa Z78 266.7980 - Úhel pohledu 3. Warp Takže nyní si do příkazu vytvoříme funkci SetPlayerPos a zadáme souřádky X, Y a Z (NE ÚHEL!), takže po úpravě by náš příkaz měl vypadat asi takto : SetPlayerPos(playerid,1117.9332,-2036.9949,78.7500); SetPlayerPos - Funkce, změna pozice hráče playerid - Jakého hráče warpneme, playerid znamená toho který zadal příkaz (vyvolal funkci) 1117.9332 - Osa X 2036.9949 - Osa Y 78.7500 - Osa Z Nyní jsme změnili pozici hráče, teď mu změníme úhel, rotaci (nebo-li úhel pohledu). Pod nebo nad SetPlayerPos si přidáme funkci SetPlayerFacingAngle, takže by ve finále měl náš příkaz vypadat asi takto : SetPlayerFacingAngle(playerid,266.7980); SetPlayerFacingAngle -Funkce, změna úhlu pohledu hráče playerid - Hráč, kterému budeme měnit úhel, v tomto případě to bude ten zadávající příkaz 266.7980 - Úhel pohledu (viz. nahoře 2. Souřadnice) Tak a je to Změnili jsme pozici a úhel pohledu hráči, čímž jsme ho jak někteří říkají warpnuli. Děkuju za hodnocení a komentáře - Pokud sem ti pomohl +rep,ale i tak jen nemusíte dávat ... Návod označen jako platný Ten to návod byl označen jako platný.Návod může být kdykoli označen jako nevhodný či neplatný
  13. Custom Skins [***] Obtiažnosť: 3/5 Osnova: 1.)Úvod 2.)Vysvetlenie funkcie AddCharModel 3.)Pridanie custom skinu 4.)Vysvetlenie pre nefungujúce AddPlayerClass 5.)Screenshoty 6.)Záver 1.)Úvod Zdravím Vás,v novej verzii sa-mp 0.3.8 vznikla možnosť pridať si vlastný custom skin. Nie je to nič obtiažné ale zo začiatku som s tým dosť bojoval kým som prišiel na to,čo ktorá funkcia spraví a ako to že to nefunguje pri AddPlayerClass. Limit pre custom skiny je od 20000 do 30000 čiže 10000 id. Chcem ešte upozorniť že napr. na skin ID 0 (CJ) môžte mať viac custom skinov...(Napr. Homera,DeadPoola apod), Preto je to tak lebo aj Homer aj DeadPool bude mať vlastné unikátne ID (napr. 25555 a 25559) a k tomu ak si dáte že SetPlayerSkin s id 0 bude Vám fungovať aj CJ Podobný návod som tu ešte nenašiel tak ho pridám...Ak sa niečo nepáči,kľudne ma opravte. 2.)Vysvetlenie funkcie AddCharModel Funkcia AddCharModel slúži na pridanie Custom Skinu do hry. Prvý parameter v tejto funkcii je ID základného skinu v hre napr. ID 0 (CJ) Druý parameter slúži na poskytnutie ID vášmu skinu napr. (25666) Tretí parameter je názov súboru vášho skinu s koncovkou dff Štvrtý parameter je názov súboru vášho skinu s koncovkou txd Takže ak chcete zapísať Váš skin s názvom NEWCJ na ID nového skinu 25000 na normálneho CJ ktorý má ID 0 tak zapíšete ho takto: AddCharModel(0, 25000, "NEWCJ.dff", "NEWCJ.txd"); 3.)Pridanie custom skinu V prvom rade si musíte nejaký custom skin stiahnuť.Napríklad tu http://www.gtainside.com/en/sanandreas/skins-123/. Po stiahnutí súbor .dff a súbor .txd si uložíte do: Otvoríte si priečinok s sa-mp serverom,otvoríte si priečinok s názvom models a uložíte ich sám. Ďalej tie nové skiny musíte zapísať. Otvoríte si v priečinku models txt súbor s názvom artconfig. A tam vložíte AddCharModel podľa ukážky v predchádzajúcom bode. 4.)Nefungujúce ADDPLAYERCLASS pri vyberaní postavy Na samp fóre som sa dočítal že pre AddPlayerClass nefungujú CUSTOM SKINY ale CustomSkiny fungujú len na SetPlayerSkin. Čiže ak si chcete vybrať hneď pri spustení hry Custom Skin trebalo vymyslieť nejaký iný spôsob. Ja som to poriešil tak že som si upravil filterscript SKINCHANGER.Zmenil som tam iba rozmedzie čísiel SKINU a ID SKINU k príslušnému obrázku. 5.)Screenshoty https://imgur.com/a/aqsnJ 6.)Záver Nie je to nič zložité.Pri nejakých otázkach kľudne sa pýtajte a ak budem vedieť pomôžem.Toť vsio
  14. Veľa ľudí používa pre registráciu alebo ukladanie vecí dudb. Script je však zložitý a záťažový na server. A ak chete viec ukladaní musíte si to prepísať v include čo je veľká nevýhoda. DracoBlue nám však vytvoril script dini, ktorý je jednduchší a menej záťažový. Preto si v tomto návode dini viac priblížime a pozrieme sa na jeho funkcie. Najprv si vymenujeme zákaldné funckie a potom ich použitie v scripte. ============================================================ Dini stiahnete tu: http://bugsy.707.cz/Dini.inc Základné funkcie: dini_Exists(file[]); // Používa sa pri kontrole či súbor existuje dini_Create(file[]); // Používa sa na vytvorenie súboru dini_Remove(file[]); // Používa sa na vymazanie súboru Funkcie pre uloženie: dini_Set(file[], oznacenie[], hodnota[]); // Slúži nám na ukladanie stringu dini_IntSet(file[], oznacenie[],hodnota); // Slúži na ukladanie integeru dini_FloatSet(file[], oznacenie[],Float:hodnota); // Slúži na ukladanie Floatu teda desatinných čísel dini_BoolSet(file[], oznacenie[],hodnota); //Slúži na ukladanie booleanu( true, false ) Funkcie pre načítavanie: dini_Get(file[], oznacenie[]); // Slúži na načítanie stringu dinit_Int(file[], oznacenie[]); // Slúži na načítanie integeru dini_Float(file[], oznacenie[]); // Slúži na načítanie floatu dini_Bool(file[], oznacenie[]); // Slúži na načítanie boolu ============================================================ Ukladanie Teraz si ukážeme názorné ukladanie Stringu, integeru, floatu a boolu v jednom. Ako prvé si určíme cestu k súboru: new cesta[50]; format(cesta, sizeof(cesta), "/Users/%.sav", Meno(playerid));// Budeme to ukladať do priečinku Users v Scriptfiles, prípomonu si možte zmeniť Teraz zistíme či hráčov účet už existuje: if(!dini_Exists(cesta))// ak hráčov súbor neexistuje( preto tam je ! ) { dini_Create(cesta);// tak ho vytvoríme } else// ale ak existuje { // Tu pridáme ukladanie } Samotné ukladanie: new Float:X, Float:Y, Float:Z;// nadefinujeme si premeny do ktorých budeme ukladať hráčovu pozíciu ktorú neskor uložíme GetPlayerPos(playerid, X, Y, Z);// zistíme si hráčovu pozíciu a následne ju zapíšeme do premien dini_Set(cesta, "Meno", Meno(playerid)); // Do súbora sa vytvorí položka "Meno=" a za "=" sa nám uloží hráčove meno ( na takomto princípe sa ukaldá heslo v registrácii ) dini_IntSet(cesta, "Povolanie", povolanie[playerid]); // Ako druhá položka z vrchu sa nám vytvorí "Povolanie", kde sa nám uloží hráčove povolanie podľa ID povolania dini_FloatSet(cesta, "X", X);// Zapíšeme hráčovu súradnicu X dini_FloatSet(cesta, "Y", Z);// Zapíšeme hráčovu súradnicu Y dini_FloatSet(cesta, "Y", Z);// Zapíšeme hráčovu súradnicu Z dini_BoolSet(cesta, "Vodicak", vodicak[playerid]);// Uložíme si hráčov vodičák ( bool je na preukazy lepšie ) Takže sme sa dostali k tomuto: new cesta[50]; format(cesta, sizeof(cesta), "/Users/%s.sav", Meno(playerid)); if(!dini_Exists(cesta)) { dini_Create(cesta); } else { new Float:X, Float:Y, Float:Z; GetPlayerPos(playerid, X, Y, Z); dini_Set(cesta, "Meno", Meno(playerid)); dini_IntSet(cesta, "Povolanie", povolanie[playerid]); dini_FloatSet(cesta, "X", X); dini_FloatSet(cesta, "Y", Z); dini_FloatSet(cesta, "Y", Z); dini_BoolSet(cesta, "Vodicak", vodicak[playerid]); } ============================================================ Načítavanie Tu si ukážeme ako načítať hráčove štatistiky ktorých ukladanie sme si ukázali vyššie. Znova si určíme cestu k súboru: new cesta[50], Float:X, Float:Y, Float:Z;// definícia stringu a floatov do ktorých uložíme pozíciu format(cesta, sizeof(cesta), "/Uses/%s.sav", Meno(playerid));// cesta k hráčovemu súboru ( musí byť pri každom načítavaní/ukladaní ) Samotné načítavanie: Meno(playerid) = dini_Get(cesta, "Meno");// načítame hráčove meno zo súboru X = dini_Float(cesta, "X");// do premeny zapíšeme súradnicu X ktorú sme si uložili do súboru Y = dini_Float(cesta, "Y");// do premeny zapíšeme súradnicu Y ktorú sme si uložili do súboru Z = dini_Float(cesta, "Z");// do premeny zapíšeme súradnicu Z ktorú sme si uložili do súboru SetPlayerPos(playerid, X, Y, Z);// nastavíme hráčovu pozíciu ( toto by išlo aj inak, ale napísal som vám jednoduchší sposob ) vodicak[playerid] = dini_Bool(cesta, "Vodicak");// Zo súboru načítame hráčovi vodičák Celkovo to bude vyzerať takto: new cesta[50]; format(cesta, sizeof(cesta), "/Users/%s.sav", Meno(playerid)); Meno(playerid) = dini_Get(cesta, "Meno"); X = dini_Float(cesta, "X"); Y = dini_Float(cesta, "Y"); Z = dini_Float(cesta, "Z"); SetPlayerPos(playerid, X, Y, Z); vodicak[playerid] = dini_Bool(cesta, "Vodicak"); Tak to by bolo asi všetko, písal som to z hlavy a dúfam že vám to pomože a že odteraz už budete dini chápať V prípade nejakých nejasností píšte do topicu, nie do SZ ! Návod označen jako platný Ten to návod byl označen jako platný.Návod může být kdykoli označen jako nevhodný či neplatný
  15. Aby som si ulahčil prácu pri štylizovaní labelov (na ktorom si potrpím), som si už dávnejšie spravil ľahší script pomcou ktorého som si prácu proste ulahčil. Trocha som ho prerobil aby to nevyzeralo nejako zle a hodim to aj sem, pretože to môže niekomu pomocť. Je to s live preview ukážkou - aspoň približnou. Je viac ako pravdepodobné, že v scripte sú chyby a veľké, napríklad znaky { a } pri prefarobvaní nefungujú párovo, teda ak použijete napr {{{, pekne script zblbnete a zrejme nebude fungovať, ako by mal. Keď má niekto nejaké návrhy, tak nech ich sem napíše napríklad. Anyway, neviem či je to v dobrej sekcii. http://bigweb.6f.sk/tools/3dlabel/
  16. ATomas

    script Timestamp to date

    Zdravím, přináším Vám nový způsob převádění timestamp (časového razítka = počet sekund od 1.1.970) na lidčtější způsob. Sice je tento způsob paměťově (RAM) náročnější. Zato CPU nejrychlejší. Ovšem RAM paměti je pro sa-mp server všude dost. Zato CPU ne. Existuje mnoho způsobů např. vložit timestamp do databáze a nechat si vrátit string výsledek. Ovšem můj způsob vykazuje rychlejší výsledky. Další a asi nejhloupější zpusobje samotné počítání data. Protože tu není povoleno vlozit tak dlouhý kód, dávám sem odkaz: https://pastebin.com/6BN6kc1L Použíti: new time = gettime();//random(cellmax); printf("dnes je %s",GetDate(time)); Pokud chcete k tomu přidat i čas tak to lze lehce pomocí: new time = gettime();//random(cellmax); time = time%(24*60*60); printf("hodin=%d minut=%d vterin=%d",time/(60*60)/*pozor na časové pásmo !!!*/,(time/60)%60,time%60); Enjoy
  17. Obtížnost: Osnova: 1. Úvod, co je to switch 2. Kdy a jak použít switch 3. Další možnosti case 4. Ukázky použití 5. Závěr 1. Úvod Zdravím Vás u sedmého návodu pro začínající pawnery. Tímto navážeme na minulý návod (přečtěte si ho) a rozebereme si, k čemu slouží switch a kdy jej použít namísto normálních podmínek. Napřed ale co je to ten switch. Switch (česky přepínač) je struktura, která v konkrétním případě nahrazuje soustavu if – else if – else. Jeho účelem je vykonat ten blok, který odpovídá jeho hodnotě. Proto také přepínač, obecně se dá říct, že přepne na blok dané hodnoty. 2. Kdy a jak použít switch Už jsem řekl, že se používá v konkrétním případě. Tím případem je tato soustava podmínek: . new cislo = 2; if(cislo == 1) { //hodnota je 1 } else if(cislo == 2) { //hodnota je 2 } else if(cislo == 3) { //hodnota je 3 } else { //hodnota je jiná } . Pokud v podmínkách porovnáváme takto hodnoty, lze k tomu použít kratší a přehlednější switch. Syntaxe switche je následovná: . switch(cislo) { case 1: { //hodnota je 1 } case 2: { //hodnota je 2 } case 3: { //hodnota je 3 } default: { //hodnota je jiná } } . Do závorek switche jsme dosadili proměnnou, ze které zjišťuje hodnotu. case je klíčové slovo, které nám zde tvoří větev pro konkrétní hodnotu. Jak je vidět, nahrazuje nám else if a podmínku. Na jedno si musíme dát pozor – je potřeba za case a hodnotu uvést dvojtečku. default je bez hodnoty a plní funkci else – provede se vždy, když hodnota neodpovídá žádnému case. Narozdíl od case ale není nutné jej použít. 3. Další možnosti case Switch dokáže pracovat jak s celými čísly, tak se znaky a desetinnými čísly. . case 1: //zápis pro celé číslo case 'a': //zápis pro znak case 3.14: //zápis pro desetinné číslo . Jazyk nám též umožňuje zapsat v jednom case několik hodnot, když je to třeba, stačí je oddělit čárkou. . case 1, 3, 5: //několika celých čísel case 'a', 'b', 'c': //několik znaků case 3.14, 1.4, 8.2: //několik desetinných čísel (tečka je desetinná čárka) . Pro zajímavost (rozklikněte spoiler): . 4. Ukázky použití Před koncem si ještě ukážeme pár příkladů, jak switch používat. Dialogy . Kombinovaný zápis . 5. Závěr Switchem jsme definitivně ukončili téma podmínek. Kromě if, else if a else teď znáte už i switch a víte, kdy a jak ho použít. Poslední varování na závěr: v jiných jazycích (C/C++, C#, Java, Javascript, PHP atd.) se blok case a default ukončuje klíčovým slovem break a neuvádějí se složené závorky. Pro Pawn to prostě neplatí, takže tuto syntaxi si nechte pro ostatní jazyky. Tento návod, stejně jako ty předchozí, je určen pro nováčky, pokročilejší věci byly buďto úplně vynechány, nebo jsou uvedeny ve spoilerech. Přesto, zdá-li se Vám, že jsem něco opomněl, někde jsem se spletl nebo se jen chcete vyjádřit, pište do tohoto tématu. Ověřený návod Tento návod prošel validací, a lze ho proto považovat za ověřený.
  18. Nazdars. Určite poznáte tú paranoju, keď ste na laptope, pozeráte napr. Shreka, či iné a máte strach, že niekto vás sleduje cez Vašu webkameru. Môžete sa síce vyhovárať na to, že máte pri kamere indikátor zapnutia (čiže by ste vedeli, že Vás sledujú), ja ho tam napr. nemám, ale keď už majú Vašu citlivú fotku, už je neskoro. Okrem teda prelepenia kamery existuje teda aj elegantnejšie riešenie a to Vám predvediem. Blokovanie driverov Spustite Device manager (Správca zariadení) cez Štart, prípadne cez Run zadajte "devmgmt.msc" Nájdite tam svoju kameru (Zariadenia na spracovanie obrázkov -> Webcam) Kliknite "Zakázať" Resetnite PC Otestovať či to funguje je jednoduché. Stačí otvoriť Skype > Nástroje > Možnosti > Nastavenie videa a uvidíte, že nič neuvidíte. Opätovne spustiť kameru sa dá kliknutím na Povoliť namiesto Zakázať. Je to bezpečné? Áno. Písal som to na viaceré stránky a hovoril som o tom viacerým ľuďom, nikto o niečom takom nepočul a teda keďže nikto to takto neblokuje, vírusy to nemajú prečo riešiť. Pre absolútnu paranoju je tiež možné odstrániť ovládače úplne. Tie sa bez admin-práv nedajú opätovne nainštalovať, vírusy tiež nemajú prístup k Windowsovej databáze driverov (tá ajtak nikdy nefunguje), tj. nevedia aký driver nainštalovať.
  19. Obtížnost: Osnova: 1. Úvod; 2. Charakteristika a vlastnosti jazyka; 3. Odlišnosti oproti jiným jazykům; 4. Užitečné odkazy; 5. Závěr. 1. Úvod Zdravím, po delší pauze jsem se rozhodl, že rozjedu nový seriál, tentokrát zaměřený na jazyk Python. Tento jazyk mě hodně baví a rád bych vás do něj trochu zasvětil. Třeba vás zaujme stejně jako mě. Předem bych chtěl varovat, že se nebude jednat o návody psané pro začátečníky s programováním, očekávám již nějakou programátorskou zkušenost. Nebudu dělat podrobné výklady té či oné části jazyka, budu uvádět jen důležité a věcné informace. Postupně projdu různá témata – základní konstrukce jazyka, práci s regulárními výrazy, objektově orientované programování, podpora funkcionálního programování v Pythonu a různé zajímavé možnosti jazyka. Většina návodů bude psána pro verzi 3 a vyšší. V případě, že se daná vlastnost/funkce jazyka vyskytuje od určité verze, budu se snažit tuto informaci uvést. K úvodním informacím by to bylo vše, v tomto návodu se podíváme na charakteristiku jazyka a poté si uvedeme rozdíly oproti jiným jazykům. 2. Charakteristika a vlastnosti jazyka Nerad bych nudil táhlou historií vývoje, takže zmíním jen dva zajímavé fakty – Python se vyvíjí již od konce 80. let minulého století a jeho autorem je nizozemský programátor Guido van Rossum. Tímto máme historii pokrytou. Nebolelo to, že? Každý programovací jazyk má svou charakteristiku. Je-li řeč o Pythonu, jako první zmíním, že se jedná o víceúčelový vysokoúrovňový skriptovací jazyk. Co je vysokoúrovňový jazyk vysvětlovat nebudu (hodně zjednodušeně – není to C ani assembler), stejně tak to bude s pojmem skriptovací (to si můžete vygooglit ). Co bych ale rád rozebral je všestrannost Pythonu. Python totiž nemá jedno konkrétní zaměření. Lze si v něm vytvořit okenní aplikaci (PyQT, tkinter), stejně tak i testovací skripty ke studentským projektům (vysokoškoláci pochopí). Uplatnění má i při vývoji webových stránek a her. Pokročilí programátoři jej využívají i pro strojové učení. Python můžete zkrátka využít (či zneužít) ke všem možným, nemožným, legálním i nelegálním programátorským nápadům. Nyní se zaměřme na jeho konkrétní vlastnosti, které bychom měli znát. Dobré je vědět, že je multiplatformní. Pro ty, kdo se s tím slovem nikdy nesetkali – Python skripty vám budou fungovat i jinde než na Windows (na Linuxu, Mac OS X i dalších). Abychom tyto ale skripty mohli vůbec spustit, budeme potřebovat interpret (ke stažení zde). V tuto chvíli bych měl asi říct, že je to tedy interpretovaný jazyk; to je taky z části pravda. Bez interpretu se neobejdeme, nicméně Python při spuštění skriptu generuje soubory, tzv. bytecode, jež jsou poté interpretovány. Proto bude lepší říct, že Python využívá to nejlepší z obou světů, tedy kompilace i interpretace. Z programovacího hlediska by nás mohlo zajímat, že Python nevyžaduje deklaraci proměnných a využívá tzv. dynamického typování, což znamená, že nejenže nemusíme deklarovat, ale také nebudeme pevně určovat datový typ. Zkrátka si do proměnných uložíme, co se nám zrovna bude hodit. S datovými typy také souvisí silná typová kontrola. Tím vám chci naznačit, abyste hned zapomněli na veškerou černou magii z Javascriptu ("1" + 2 - "3" + "4" == "94") a podobných jazyků. V Pythonu nelze sčítat či odčítat řetězce s čísly a podobně. Často vyzdvihovanou vlastností Pythonu je také to, že podporuje více paradigmat. Pokud jste se teď zhrozili při slově paradigma, nebojte se, nejde o nic strašného. Programovací paradigma si představte jako způsob řešení a zápisu dané úlohy. Existuje hodně paradigmat – procedurální (Pawn), objektově orientované (Java), logické (Prolog), funkcionální (Haskell)... Některé spolu souvisejí, některé jsou nadřazené jiným, další jsou přesným opakem jiných. Nebudu vám v tom dělat guláš, pro zájemce je tu třeba tento článek. A co tedy Python z toho všeho umožňuje? Úlohy v Pythonu lze řešit procedurálně, ale máme možnost využít i objektově orientované programování; do jisté míry umožňuje Python i funkcionální programování (o tom třeba později). 3. Odlišnosti oproti jiným jazykům Teď už víme o základních vlastnostech Pythonu. V této druhé části návodu se podíváme na rozdíly oproti jiným známým jazykům. Žádné středníky Na konci příkazů a výrazů se, na rozdíl od jazyků jako C, Java či PHP, nepíše středník: // kód v C int n = 5; printf("Proměnná 'n' má hodnotu %i", n); # kód v Pythonu n = 5 print("Proměnná 'n' má hodnotu", n) Odsazení namísto složených závorek Většina jazyků se syntaxí jazyka C (C/C++, C#, Java, PHP, Pawn atd.) využívá ke tvorbě bloků složené závorky. V Pythonu se bloky tvoří dvojtečkou za příkazem (if, else, for, while...) a odsazením (běžně 4 mezery): // kód v C if(promenna < 1) { printf("Hodnota proměnné je menší než 1."); return 1; } # kód v Pythonu if promenna < 1: print("Hodnota proměnné je menší než 1.") return 1 and, or, not Logické operátory se nejčastěji zapisují jako && (and), || (or) a ! (not). V Pythonu se tyto operátory zapisují and, or a not: // kód v C if(promenna1 && promenna2 || !promenna1 && !promenna2) # kód v Pythonu if promenna1 and promenna2 or not promenna1 and not promenna2: Pozměněné názvy příkazů Tohle nebude žádná raketová věda, jen se tu a tam změnilo písmenko či slovíčko. Příklad 1: Namísto else if se píše elif. Příklad 2: Namísto catch u zachytávání výjimek máme except. Příklad 3: Poznámky se píší za mřížku #, ne za dvě lomítka //. Příklad 4: Zkuste najít. Chybějící struktury a operátory Ačkoliv vás to asi překvapí, v Pythonu neexistují jisté struktury a operátory, které jsou v ostatních jazycích běžné. Jedná se o struktury switch, do-while a operátory ++ a --. Není to ale nic, co by nešlo nahradit jiným kódem: # kód v Pythonu # náhrada switche if promenna == 1: print("Je to jedna") elif promenna == 2: print("Je to dva") else: print("Je to Bůh ví co") promenna += 1 # náhrada ++ Ternární operátor ?: Mnozí z vás používají ternární operátor ?: pro tvorbu "inline podmínek". Ani tento operátor v Pythonu není, místo něj je tu konstrukce if-else: // kód v C promenna = 1 < 2 ? 1 : 0; // podmínka ? pravda : nepravda # kód v Pythonu promenna = 1 if 1 < 2 else 0 # pravda if podmínka else nepravda Funguje úplně stejně (podmínky lze řetězit), jen se změnilo pořadí operandů. 4. Užitečné odkazy Zde máte několik užitečných odkazů, mimo jiné odkaz na stažení interpretu Pythonu, bez kterého jeho skripty nespustíte: • stažení interpretu Pythonu; • oficiální dokumentace Pythonu; • oficiální dokumentace Pythonu (pro starší verzi 2.7); • kurz Pythonu na Codeacademy; • vývojové prostředí PyCharm (od JetBrains). 5. Závěr A tím pro dnešek končím. Tento text byl jen lehkým úvodem do Pythonu, měli jsme možnost oťukat si trochu jeho syntaxi a uvést jeho vlastnosti. V příštím návodu se budeme věnovat konstrukcím v Pythonu. Pokud jste narazili na nějakou chybu, nějaký překlep nebo se chcete na něco zeptat, případně mi napsat jen tak, jen do toho.
  20. Předmluva Předem bych chtěl podotknout, že návod je vážně určen absolutním nováčkům, a už mírně pokročilí si budou říkat, že to umí každý. Proč dělám tento návod? Když jsem s pawnem začínal úplně, nenašel jsem žádný návod, jež by byl pro největší „lamy“ Pak jsem ale narazil na nejmenovaného člověka, a ten mě naučil začátky. Momentálně bych řekl, že jsem mírně pokročilý. A nyní k samotnému návodu Obtížnost: Úvod - základy Komentář v codu - Chcete-li si udělat nějakou poznámku v kodu, použijte „//“ (bez uvozovek), pokud to je na více řádků, tak „/*“ a na konci „*/“ (opět bez uvozovek) Include - Abyste vůbec mohli jakýkoliv FS / GM vytvořit, musíte mít na začátku codu „#include <a_samp>“ - Dále Vám doporučuji „#include <izcmd>“, jež slouží k snažšímu psaní příkazů. Stáhnete jej tady: https://www.mediafire.com/file/76kh8qfmckpwzcx/izcmd.inc nebo http://forum.sa-mp.com/showthread.php?t=576114 - A existují různé další includy, jež Vám ulehčí práci. Upozornění: - Za každou funkcí se musí psát „;“, za podmínkou ne První příkazy - Na začátek modu si dáme „#include <a_samp“, na další řádek „#include <izcmd>“. - Tento příkaz bude sloužit k doplnění HP a vesty. Níže si jej i rozebereme. Code: #include <a_samp> #include <izcmd> CMD:heal(playerid, params[]) { SetPlayerHealth(playerid, 100); SetPlayerArmour(playerid, 100); SendClientMessage(playerid, 0xFF0000AA, "Doplnil sis HP a vestu"); return 1; } Vysvětlení CMD:heal(playerid, params[]) - Vytvoří nám příkaz /heal - „playerid“ nám zjišťuje ID hráče, jež příkaz zadal - „params[]“ Parametry, jež hráč zadal za samotným příkazem. { } - Do těchto závorek se dávají kody. Kod se těmito závorkami "otevírá" a "uzavírá" Příklad: { //Náš kod return 1; } SetPlayerHealth(playerid, 100); - „SetPlayerHealth“ je funkce na nastavování HP - „playerid“ nám zjišťuje ID hráče, jež příkaz zadal - „100“ je počet HP, kolik daná funkce nastaví SetPlayerArmour(playerid, 100); - „SetPlayerArmour“ je funkce na nastavování vesty - „playerid“ nám zjišťuje ID hráče, jež příkaz zadal - „100“ je počet vesty, kolik daná funkce nastaví SendClientMessage(playerid, 0xFF0000AA, "Doplnil sis HP a vestu"); - „SendClientMessage“ je funkce na odeslání zprávy konkrétnímu hráči (v našem případě hráči, jež zadal příkaz /heal) - „playerid“ nám zjišťuje ID hráče, jež příkaz zadal - „0xFF0000AA“ je hexadecimální kod barvy, touto barvou bude daná zpráva odeslána - "Doplnil sis HP a vestu" je zpráva, jež to danému hráči odešle return 1; - Vrátí hodnotu, resp. ukončí danou funkci Jak odeslat zprávu všem? stock Nick(playerid) { new name[25]; GetPlayerName(playerid, name, 25); return name; } CMD:zprava(playerid, params[]) { new string[128]; format(string, sizeof(string), "Hráč %s zadal příkaz /zprava", Nick(playerid)); SendClientMessageToAll(0xFF0000AA, string); return 1; } Vysvětlení: „stock Nick(playerid) { new name[25]; GetPlayerName(playerid, name, 25); return name; }“ - „stock Nick(playerid)“ je funkce na zjištění nicku hráče, aby jsme mohli odeslat formátovanou zprávu (v tomto případě s jeho nickem) - „new name[25];“ Tady se nám uloží nick hráče - „GetPlayerName“ Zjistí nám nick hráče - „(playerid, name, 25);“ playerid nám opět zjistí ID hráče, name je název newu a 24 je maximální délka nicku + místo pro nulový znak = 25 (Nulový znak se musí přidávat do každého newu, jelikož by se nám jinak zpráva nevypsala celá.) - „return name;“ nám vráti hodnotu, resp. ukončí danou funkci CMD:zprava(playerid, params[]) { new string[128]; format(string, sizeof(string), "Hráč %s zadal příkaz /zprava", Nick(playerid)); SendClientMessageToAll(0xFF0000AA ,string); return 1; } CMD:zprava(playerid, params[]) - vysvětlili jsme si výše - new string[128]; nám uloží zprávu, 128 je maximální délka zprávy - format(string, sizeof(string), "Hráč %s zadal příkaz /zprava", Nick(playerid)); - format znamená formátování, resp. použití údajů zapsaných za (v našem případě) zprávou, ale může to být použito i v dialogu, nebo printf, ale to si vysvětlíme později - string je naše zpráva - sizeof(string) znamená, že velikost naší zprávy bude stejná jako velikost stringu - "Hráč %s zadal příkaz /zprava" zpráva vypsaná do chatu - Nick(playerid) je náš stock, jež nám zjistí údaj, v tomto případě nick, a vypíše ho - return 1; vrátí hodnotu Závěrem Doufám, že se menší návod líbil, jak bylo vzpomenuto výše, je určen absolutním nováčkům, tak to vezměte na vědomí při hodnocení. Nejspíše bude tento návod na více dílů, tady jsme si vysvětlili základy. Doufám, že návod bude označen jako platný, nováčkům by mohl pomoci.
  21. Obsah Úvod #define enum Ďalšie použitie 1. Úvod Napadlo mi, že rýchlejšie než vysvetliť niekomu čo je to enum, by bolo dať mu odkaz na nejaký návod. Žiadny som však nenašiel. Boli útržky toho čo je to enum tu a tam, ale nič čo by sa dalo ľahko nájsť. Enum slúži na náhradu direktív preprocesora (#define NIECO). Je prehľadnejší a umožňuje lepšiu kontrolu errorov pri kompilácii. Enum je skratka od enumeration, tj. výčet, vyčíslenie. V tomto návode teda ukážem riešenie konkrétnej úlohy dvomi spôsobmi. Pomocou #define a enum. Majme systém, ktorý kontroluje kde sa nachádzajú isté autá a či sú obsadené. Použijeme teda jednu globálnu premennú. 2. #define #define POSX 0 #define POSY POSX + 1 #define POSZ POSX + 2 #define OCCUPIED POSX + 3 #define VELKOST_POLA (OCCUPIED - POSX + 1) // 3-0+1=4 #define POCET_AUT 20 new Vozidla[POCET_AUT][VELKOST_POLA]; ... stock PouzitiePola() { printf("Velkost posledneho pola = %d", VELKOST_POLA); for (new i; i < sizeof (Vozidla); i++) if (Vozidla[i][OCCUPIED] == true) { printf("%f", Vozidla[i][POSX]); // len nejaky priklad } } 3. Enum Rovnakú funkcionalitu s použitím enumu by sme dosiahli nasledovným kódom. Nie je nutné písať názvy jednotlivých prvkov v enume veľkým písmom. Záleží na vašich preferenciách, mne celkom dáva zmysel, že keďže to nahrádza konštanty, tiež by to malo byť veľkým písmom. #define POCET_AUT 20 enum CarEnum { Float:POSX, // enum umoznuje jednoduchu a prehladnu kontrolu typov Float:POSY, Float:POSZ, bool:OCCUPIED }; new Vozidla[POCET_AUT][CarEnum]; ... stock PouzitiePola() { printf("Velkost posledneho pola = %d", _:CarEnum); for (new i; i < sizeof (Vozidla); i++) if (Vozidla[i][OCCUPIED]) { printf("%f", Vozidla[i][POSX]); // len nejaky priklad } } Možno ste si všimli v PouzitiePola() s enumom: printf("Velkost posledneho pola = %d", _:CarEnum); Tá časť _:CarEnum musí mať predponu _: inak by kompiler hodil warning. Fungovalo by to ajtak. Je to len bug kompilera. V praxi som vypísanie veľkosti enumu ešte nevidel, nebojte sa že by to hnusilo kód. Pre pokročilých: 4. Ďalšie použitie Enum nemusí číslovať od nuly, dá sa spraviť aj toto: #include <a_samp> enum TestEnum { PREMENNA = 5, PREMENNA2, PREMENNA3, // pauza PREMENNA4 = 25, PREMENNA5 }; main() { printf("%d, %d", _:PREMENNA3, _:PREMENNA5); } Server log: SA-MP Dedicated Server ---------------------- v0.3.7-R2, (C)2005-2015 SA-MP Team ... [01:05:25] 7, 26 Som presvedčený, že s enumami sa dajú robiť rôzne pekelné kúsky z ktorých ja žiadne nepoznám, určite ak nejaké máte, pridajte.
  22. Ahoj v první řadě se omlouvám jestli jsem to dal do špatný sekce ale nevím kam jinam to dát Teď k věci... taky vás štve už nejméně 3 roky když si chcete zahrát sampko... v clientu na INTERNET a ukáže vám to jen servery které jsou hosted ? Našel sem jednu věc která tento problém řeší, sám jsem to zkoušel a funguje perfektně tak se s vámi chci podělit https://github.com/spmn/sa-mp_masterlist_fix/releases a stáhněte version.dll Po stažení jen soubor vložte do složky, kde máte nainstalovaný samp Možná o tom pár z vás vědělo ale myslím si že ne všichni. Každopádně to funguje perfektně
  23. https://www.youtube.com/watch?v=wWCJQ2_Pyww
  24. Obtížnost: Osnova: 1. Úvod 2. Relační operátory 3. Logické operátory 4. Přiřazovací operátory 5. Bitové operátory 6. Priorita operátorů 7. Závěr 1. Úvod Vítám Vás u pátého návodu pro začínající pawnery. Téma se týká dalších druhů operátorů a navazuje na předchozí návod o operátorech. Abyste tento návod pochopili, přečtěte si nejprve ten předchozí. 2. Relační operátory Úkolem relačních operátorů je porovnávat operandy (vrací pravdu, nebo nepravdu). S nimi se zpravidla setkáme v podmínkách. Jedná se o operátory rovnosti, nerovnosti, větší/menší a větší/menší nebo rovno. . new cislo = 5, cislo2 = 10; cislo == cislo2 //dvě rovnítka porovnají, zda jsou čísla stejná (výsledek je false, 5 a 10 nejsou stejná) cislo != cislo2 //vykřičník a rovnítko zjistí, zda se čísla různí (výsledek je true, 5 a 10 jsou různá) cislo > cislo2 //znak pro "větší" zjistí, zda je číslo vlevo větší než to vpravo (výsledek je false, 5 není větší než 10) cislo < cislo2 //znak pro "menší" zjistí, zda je číslo vlevo menší než to vpravo (výsledek je true, 5 je menší než 10) cislo >= cislo2 //znak pro "větší nebo rovno" zjistí, zda je číslo vlevo větší nebo rovno tomu vpravo (výsledek je false, 5 není větší ani rovno 10) cislo <= cislo2 //znak pro "menší nebo rovno" zjistí, zda je číslo vlevo menší nebo rovno tomu vpravo (výsledek je true, 5 není rovno 10, ale je menší) . Všechno to jsou binární operátory. Doufám, že není třeba si je blíže vysvětlovat, princip je stejný jako v matematice, stačí nám znalosti základní školy. Zajímavost: 3. Logické operátory Pomocí logických operátorů tvoříme složitější podmínky. Stejně jako relační, tak i tyto operátory vrací buď pravdu, nebo nepravdu. Logickými operacemi jsou logický součin, logický součet a logická negace. a) Logický součin Logický součin je binární operace a značí se dvěma ampersandy (&&). Výsledek této operace je pravdivý, právě když jsou oba výrazy pravdivé. . new cislo = 5, cislo2 = 10, cislo3 = 15; cislo < cislo2 && cislo2 > cislo3 //výsledek je false . Prvním výrazem je "cislo ". Ten je pravdivý, 5 je menší než 10. Druhým výrazem je "cislo2 > cislo3". To pravda není, 10 není větší než 15. Jeden z výrazů je nepravdivý, proto je celá podmínka nepravdivá. b ) Logický součet Logický součet je binární operace a značí se dvěma svislicemi (||). Výsledek této operace je pravdivý, když alespoň jeden výraz je pravdivý. . cislo < cislo2 || cislo2 > cislo3 //výsledek je true . Vraťme se k předchozímu příkladu. Už víme, že první výraz je pravdivý a druhý nepravdivý. Poněvadž se teď jedná o logický součet, tak celá podmínka bude pravdivá – stačí jen jeden pravdivý výraz. Při složitějších podmínkách si nemusíme být jisti tím, jak ji jazyk vyhodnotí. Proto nám Pawn umožňuje i v tomto případě použít kulaté závorky k určení priority vyhodnocení. . (cislo < cislo2 && cislo2 > cislo3) || (cislo3 > cislo && cislo3 >= cislo2) . Teď jsme si jistí, že se napřed vykoná logický součin a až poté logický součet. c) Logická negace Logická negace je unární operace a značí se vykřičníkem (!). Účelem této operace je převrátit pravdu v nepravdu a naopak. . new bool:logicka = true; !logicka //hodnota bude false . Počáteční hodnota proměnné logicka je true. Po znegování bude hodnota převrácená – false. 4. Přiřazovací operátory Operátor přiřazení již známe – rovnítko. Probrali jsme jej v předchozích návodech, takže teď si ho jen rychle zopakujeme. Na levé straně je proměnná/pole, do které(ho) přiřazujeme, a na pravé straně hodnota nebo výraz, který přiřazujeme. . new cislo = 5; //přiřazení celého čísla new desetinne = 3.14; //přiřazení desetinného čísla new znak = 'o'; //přiřazení znaku new retezec[] = "ahoj"; //přiřazení řetězce new pole[] = {1, 3, 6}; //přiřazení hodnot poli . Pro zajímavost (rozklikněte spoiler): . 5. Bitové operátory Bitové operátory manipulují s bity. Tato problematika zdaleka přesahuje znalosti potřebné pro nováčky, proto ji zde uvádět nebudu. Nicméně, pokud se přeci jen chcete o manipulaci s bity něco dozvědět, přečtěte si tento návod, kde se tomu Mort podrobně věnuje. 6. Priorita operátorů Už jsme si zmínili, že prioritu operátorů můžeme ovlivnit kulatými závorkami jako v matematice, ale jaká je vlastně výchozí priorita operátorů? Na to se lze podívat do spoileru. Je to jen pro zajímavost, nic, bez čeho bychom se neobešli. . 7. Závěr A tímto končí druhý návod věnující se operátorům. Nyní už víte to potřebné o operátorech. Samozřejmě jich existuje mnoho, neuvedl jsem všechny (čárka, dvojtečka i všechny druhy závorek jsou také operátory), ale to už jsou drobnosti, které v praxi sami pochytíte. Tento návod, stejně jako ten předchozí, je určen pro nováčky, pokročilejší věci byly buďto úplně vynechány, nebo jsou uvedeny ve spoilerech. Přesto, zdá-li se Vám, že jsem něco opomněl, někde jsem se spletl nebo se jen chcete vyjádřit, pište do tohoto tématu. Ověřený návod Tento návod prošel validací, a lze ho proto považovat za ověřený.
  25. Hookovanie funkcií a callbackov Obsah Čo je to hookovanie Princíp hookovania a preprocesor _ALS_ - Advanced Library System Hookovanie funkcií Hookovanie callbackov Zhrnutie 1. Čo je to hookovanie Predstavte si gamemod v Pawn ako reťaz, kde každý krúžok predstavuje jednu funkciu (stock). Tieto krúžky sú pospájané, pretože jedna funkcia (stock) volá druhú a tá ďalšiu, atď. Dobrý, čitateľný kód je rozdelený do mnoho súborov, includov. Nanešťastie, každý callback môže byť definovaný iba raz, čo bráni efektívnemu rozdeleniu kódu. Tento problém rieši hookovanie, ktoré si možno predstaviť tak, že reťaz (gamemode) sa v niektorom krúžku rozdelí, pridá sa tam kód, ktorý chceme hooknuť a naspäť sa spojí, bez toho aby to akokoľvek ovplyvnilo zvyšok reťaze. To umožňuje použiť jeden callback aj viackrát v jednom súbore (prípadne v includoch). 2. Princíp hookovania a preprocesor Je treba povedať, že Pawn kompiler nefunguje (ani nemá prečo fungovať) tak ako Cčkový, alebo iný. Povedzme, že chceme upraviť (hooknuť) funkciu GivePlayerMoney() tak, že vždy keď je zavolaná, dá hráčovi dvojnásobok peňazí. Samozrejme bez toho, aby sme ovplyvnili nejaký už-existujúci kód. stock GivePlayerMoneyEx(playerid, money) { // definujeme vlastnu funkciu return GivePlayerMoney(playerid, money * 2); // v nej zavolame tu povodnu } #define GivePlayerMoney GivePlayerMoneyEx // predefinujeme tu povodnu Ďalšie použitie funkcie GivePlayerMoney() by už hráčovi dalo dvojnásobok peňazí. Štvrtý riadok spôsobí, že každé nasledujúce volanie GivePlayerMoney() preprocesor nahradí za GivePlayerMoneyEx(), teda za náš hook. Kompiler nehodí error/warning v prípade, že predefinujete už-existujúcu funkciu/callback. Na pochopenie princípu hookovania je treba vedieť ako funguje preprocesor Pawn. Stačí vedieť, že prebieha vo viacerých krokoch. V prvom kroku prebehne daný súbor, ktorý má spracovať. Skontroluje v ňom makrá a podmienky preprocesora a vyhodnotí ich. Súčasne si zapamätá ktoré funkcie (stocky, publicy) existujú, pridá si ich do medzipamäte a súbor prebehne znovu (opäť vyhodnotí makrá a podmienky preprocesora). Toto správanie podporí aj nasledujúci kód. Pre vaše dobro si každý z tých kódov skompilujte. #if defined A #error Funkcia je definovana #endif stock A() { } Kompiler hodí error kvôli tomu, že funkcia "A" je definovaná, hoc až za makrom. Zaujímavý je však tento kód: #if !defined A // vsimnite si zmenu, negaciu podmienky #error Funkcia nie je definovana #endif stock A() { } Hodí error rovnako, ako kód predtým. Ako je to možné? Predsa ide o znegovanú podmienku. Nečítajte ďalej, ak na to chcete prísť sami. Druhý kód prebieha tak, že preprocesor prejde ku "#if !defined". Tam samozrejme zastaví, pretože doteraz symbol "A" nikde nenašiel. Prečo teda prvý kód tiež narazil na error? V prvom kóde, preprocesor prebehne ku #if defined. "A" definované nie je a teda ide ďalej, ku koncu súboru, medzitým "A" nájde a uloží si ho do zoznamu známych symbolov. V ďalšej iterácii však preprocesor znova dôjde k #if defined, "A"čko už pozná a preto hodí error. Musím ešte povedať, že toto som zistil experimentami, popravde neviem ako funguje ten preprocesor. Ak máte nejaké objasnenie, môžete napísať. 3. _ALS_ - Advanced Library System Ak ste niekedy videli hookovací kód, všimli ste si, že oproti môjmu príkladu s GivePlayerMoney(), tam bolo niečo navyše. Správny kód by mal vyzerať takto: stock GivePlayerMoneyEx(playerid, money) { GivePlayerMoney(playerid, money * 2); } #if defined _ALS_GivePlayerMoney #undef GivePlayerMoney #else #define _ALS_GivePlayerMoney #endif #define GivePlayerMoney GivePlayerMoneyEx Toto slúži na detekciu, či už bola daná funkcia hooknutá. Ak áno, kód by nefungoval a tiež vyhodil warning 201: redefinition of constant/macro (symbol "GivePlayerMoney") Predefinovanie stocku/callbacku warning nehodí, predefinovanie makra/define áno. Kúzlo s "_ALS_" ošetruje práve to, aby bolo možné skombinovať viac hookov. Syntax "_ALS_" je akýsi neoficiálny štandard. Používajú to všetci a tým sa zaručí kompatibilita hookov od rôznych autorov. 4. Hookovanie funkcií Hookovanie funkcií už bolo ukázané, ale dám ešte jeden príklad. // ak je hrac vo vozidle, portne aj vozidlo stock SetPlayerPosEx(playerid, Float:x, Float:y, Float:z, bool:vehicleToo=false) { if (vehicleToo) { if (IsPlayerInAnyVehicle(playerid)) return PortWithVehicle(playerid, x, y, z); else return SetPlayerPos(playerid, x, y, z); } else return SetPlayerPos(playerid, x, y, z); } #if defined _ALS_SetPlayerPos #undef SetPlayerPos #else #define _ALS_SetPlayerPos #endif #define SetPlayerPos SetPlayerPosEx ... public OnPlayerCommandText(playerid, cmdtext[]) { if (!strcmp("/portme", cmdtext)) SetPlayerPos(playerid, 1, 2, 3, true); else if (!strcmp("/oldport", cmdtext)) SetPlayerPos(playerid, 234, 46, 324); } 5. Hookovanie callbackov Hookovanie callbackov prebieha trochu ináč než funkcií. Aj keď kód je skoro rovnaký, na pozadí ide v podstate o opačný proces než u funkcií. public OnPlayerGiveDamage(playerid, damagedid, Float:amount, weaponid, bodypart) { // pouzijeme povodny callback if (IsPlayerAdmin(damagedid)) { // pridame vlastnu funkcionalitu Kick(playerid); } // zavolame nasledujuci hook #if defined MyOnPlayerGiveDamage // moze sa stat, ze neexistuje viac hookov, preto podmienka return CallLocalFunction("MyOnPlayerGiveDamage", "iifii", playerid, damagedid, amount, weaponid, bodypart); #else return 0; // v callbackoch su dolezite spravne return hodnoty #endif } #if defined _ALS_OnPlayerGiveDamage #undef OnPlayerGiveDamage #else #define _ALS_OnPlayerGiveDamage #endif #define OnPlayerGiveDamage MyOnPlayerGiveDamage // premenovanie nasledujuceho callbacku #if defined MyOnPlayerGiveDamage // samozrejme forward forward MyOnPlayerGiveDamage(playerid, damagedid, Float:amount, weaponid, bodypart); #endif V skripte použijeme ten pôvodný callback a "predefinujeme" tie nasledujúce. Syntax "MyOnPlayerGiveDamage" už nie je "štandardizovaná", môžete použiť aj iný názov. 6. Zhrnutie Pri hookovaní v podstate nejde o ten kód, ako o to pochopiť čo robí preprocesor na pozadí. Ak ste si všetky kódy pozreli a porozmýšlali nad nimi, mali by ste tomu rozumieť. Či do toho "vidíte skrz na skrz" si môžete skúsiť odpovedaním na tieto dve bonusové otázky: 1.) V prípade, že je 10 skriptov čo hookujú nejakú funkciu a môj skript ju hookol prvý, koľká v poradí sa vykoná funkcia z môjho skriptu? 2.) V prípade, že je 10 skriptov čo hookujú nejaký callback a môj skript ho hookol prvý, koľký v poradí sa vykoná callback z môjho skriptu? Ak máte otázky/vylepšenia, pokojne sem s nimi.
×