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 a oznámení
    • Návrhy změn a hlášení chyb
    • Všechno možné
  • Pawn
    • Pomoc
    • Návody
    • Mapy a editor map
    • Scripty
    • Prezentace módů
    • Hledám pawnera/mappera
  • Programování a grafika
    • Vývoj webových stránek a aplikací
    • Vývoj desktopových a jiných aplikací
    • Grafika a webdesign
    • 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
  • Ostatní
    • Prezentace herních klanů, serverů a jiných projektů
    • 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
  • Boy

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 423 results

  1. OprávněníAdmin/Vip 2019 Systémy #3 ***** Pojďme si udělat návod na všechny "systémy" individuálně. Vítejte u dalšího dílu PAWN kouzla zbaven. Obsah 1. Doporučené návody, includy a pluginy, 2. Makra a proměnné, 3. Makra a zprávy, že je něco špatně, 4. Jednoduché použití, 5. Užitečné funkce, 6. AdminChat i VipChat, 7. Ranky, tituly, tagy, 8. Seznam online administrátorů či VIPs. Doporučené návody, includy a pluginy Běžně lze udělat celý Admin/Vip systém bez jakýkoliv cizích includů, akorát je to těžší a v některých případech dokonce pomalejší. Tady je jakési moje doporučené includy/pluginy a i návody pro usnadnění práce: 1. Sscanf2 Rozhodně doporučuji. Univerzální plugin/fce pro práci s více parametry u příkazů. 2. Double-O-Files2 (dof2) Jednoduché a prosté pro práci se soubory. Je to konkurent dini, ačkoliv se s ním pracuje prakticky stejně. 3. i-zcmd Vylepšená verze zcmd. Ale obyčejná či vylepšená, obě verze jsou konkurenti snadného použití a v rychlosti na rozdíl od dcmd. 4. y_commands+y_ini Pro náročné. Lze využít i knihovnu YSI. Nejen, že obsahuje oba užitečné includy(1. na příkazy, 2. na soubory), ale i hromadu dalších. Rozhodně užitečné a výborné na tvorbu právě různých oprávnění. Akorát, uživatel jí musí dobře znát, stejně jako samotné pawn. Pro naše účely využijeme, sscanf2, dof2 a i-zcmd. Makra a proměnné Celý systém je prakticky z 50 % tvořen jedinou proměnnou a to: new AdminLevel[MAX_PLAYERS]; To je všechno. Není to žádná magie. Pouze jediná proměnná je celý základ. Ta pomůcka co kontroluje všechna oprávnění. S touhle proměnnou už lze snadno pracovat. Stejně se pracuje i s oprávnění na vip hráče. Jediný rozdíl je v tom, jestliže chceme, aby bylo jediné VIP (aka jediné 2 možnosti a to má, nebo nemá), tak deklarujeme proměnnou jen s jiným datovým typem: new bool:IsPremium[MAX_PLAYERS]; Teď makra. Několik doporučení ode mě (ale není to nutné). První zmenšit počet max hráčů. Číslo 500 není zrovna málo. A je malá šance, že někdo se dostane k více než ke 100 lidí, tak si jednoduše redefinujeme (to znamená opět definovat). Možná jste to často mohli vidět jen jako další makro aka MAX_PLAYERS_EX, ale to nechceme, stačí redefinovat: #undef MAX_PLAYERS /* Lze i vepsat menší číslo například 50 */ #define MAX_PLAYERS 100 Druhé doporučení a to udělat si makra jako fce. Stejně jako máme fce IsPlayerAdmin, můžeme k tomu přizpůsobit i naší proměnnou: #define GetPlayerAdminLevel(%0) AdminLevel[%0] A ještě jedna maličkost a to si definovat rovnou určitá jména pro určitá oprávnění. Sice to jsou pouze čísla, ale může se to hodit pro usnadnění: #define player (0) #define helper (1) #define mod (2) #define admin (3) #define owner (4) Použití je stejné snadné jako práce s proměnnou samotnou: if (GetPlayerAdminLevel(playerid) == helper) return SCM(playerid, -1, "Hráč je Pomocník "); A u VIP: #define IsPlayerVip(%0) IsPremium[%0] /* Sample code */ if (!IsPlayerVip(playerid)) return SendClientMessage(playerid, -1, "Nejsi VIP ole!"); No a pak tu máme samozřejmě i makra pro barvy, což je i celkem zřejmé a dost známé: #define COLOR_YELLOW 0xFFFF0000 Makra a zprávy, že je něco špatně Tohle je spíše pro lenochy a programátory, co ví, že se určité zprávy budou vícekrát opakovat (špatně napsané parametry, nemá dostatečné oprávnění...), tak i na to lze použít také makra. Nejdříve si definujeme vlastní fci, už s předem známou barvou a to červenou, jinak argumenty jako je playerid a text zůstanou stejné: #define SendErrorMessage(%0,%1) SendClientMessage(%0,0xFF000000,%1) A pod ní už můžeme definovat i vlastní obsahy těchto zpráv, například: #define MSG_PERM "[ ! ] {FFFFFF}Nemáš dostatečné oprávnění" #define MSG_VIP "[ ! ] {FFFFFF}Nevlastníš vip účet!" Použití je celkem prosté. vložíme do naší fce i makro naší zprávy: CMD:say(playerid, params[]) { if (GetPlayerAdminLevel(playerid) < helper) return SendErrorMessage(playerid, MSG_PERMS); Má to hned 2 výhody. Za 1. nemusíme neustále psát (kopírovat) obsah zprávy, a za 2. můžeme obsah snadno kdykoliv změnit. Jednoduché použití Ukážeme si použití všech složek(sscanf, příkazy), kromě jediné (ukládání) v jednom příkazu, kde je více parametrů a to k nastavení pozice: Začneme přidáním maker pro naši error zprávu: #define MSG_PARAMS "[ ! ] {FFFFFF}Špatně vepsané parametry !" #define MSG_INVALID_ID "[ ! ] {FFFFFF}Tento hráč není připojený !" Tady několik začátečníku dělá jednu zbytečnou chybu. Nejdříve deklaruje proměnné a až poté kontroluje, jestliže hráč má oprávnění. Takže naopak, nejdříve zjistíme, zda má hráč oprávnění a až pak deklarujeme proměnné, naopak by to bylo zbytečné, když se stejně nepoužijí: CMD:setpos(playerid, params[]) { if (GetPlayerAdminLevel(playerid) < mod) return SendErrorMessage(playerid, MSG_PERMS); A nyní až deklarujeme proměnné. Musíme si hlídat datový typ, jelikož nastavujeme pozice a ty nejsou int. Pro tento účel postačí, když bude u hráče hledat pouze ID (nikoliv nick): new id, Float: xpos, Float: ypos, Float: zpos; if (sscanf(params, "ifff", id, xpos, ypos, zpos)) return SendErrorMessage(playerid, MSG_PARAMS); A samozřejmě ještě kontrolujeme, zda napsat správné ID hráče: if (!IsPlayerConnected(id)) return SendErrorMessage(playerid, MSG_INVALID_ID); A to je všechno. Pak už jen nastavujeme pozici (poznámka: nezapomeňte na případ zda je ve vozidle!): SetPlayerPos(id, xpos, ypos, zpos); return CMD_SUCCESS; } Užitečné funkce (Jelikož na 100 % ty fce použijete, tak jsem se rozhodl vynechat stock) Jedna z nejpoužívanějších a nejznámějších fci je zjištění jména hráče: GetPlayerNick(playerid) { new Playernick[MAX_PLAYER_NAME + 1]; GetPlayerName(playerid, Playernick, MAX_PLAYER_NAME); return Playernick; } Další fce co já osobě používám snad v každém systému, co tvořím nebo jsem vytvořil tak ne fce na ukládání a načítání údajů. A aby to nebylo málo, tak lze všechny údaje načítat rovnou, včetně hesla i statistik i během teprve přihlašování na server, protože bez správného hesla na serveru nebude pokračovat a se správným budou už jeho údaje načtené, takže není třeba ukládat více souborů: SavePlayerData(playerid) { new Float: phealth, Filepath[30]; format(Filepath, 30, "Data/%s.sav", GetPlayerNick(playerid)); GetPlayerHealth(playerid, phealth); if (!DOF2_FileExists(Filepath)) DOF2_CreateFile(Filepath); DOF2_SetInt(Filepath, "AdminLevel", GetPlayerAdminLevel(playerid)); DOF2_SetFloat(Filepath, "Health", phealth); DOF2_SetBool(Filepath, "IsVip", IsPlayerVip(playerid)); DOF2_SaveFile(); return 1; } LoadPlayerData(playerid) { new Filepath[30]; format(Filepath, 30, "Data/%s.sav", GetPlayerNick(playerid)); GetPlayerHealth(playerid, phealth); if (!DOF2_FileExists(Filepath)) return 1; AdminLevel[playerid] = DOF2_GetInt(Filepath, "AdminLevel"); SetPlayerHealth(playerid, DOF2_GetFloat(Filepath, "Health", phealth)); IsPremium[playerid] = DOF2_GetBool(Filepath, "IsVip"); return 1; } Použití je prosté, například při odchodu ze serveru: public OnPlayerDisconnect(playerid, reason) { // Sample code SavePlayerData(playerid); return 1; } AdminChat i VipChat public OnPlayerText(playerid, text[]) { /* Nejdříve zjistíme, jestliže jeho první znak vepsaný do chatu je vykříčník */ if (text[0] == '!') { /* Poté jestliže je vůbec VIP, pokud ne, odešle se obyčejný text */ if (IsPlayerVip(playerid)) { /* Tady si deklarujeme řetězec a naformátujeme zprávu, která se odešle */ new String[144 + 1]; format(String, sizeof String, "[ VIPS ] %s: %s", GetPlayerNick(playerid), text[1]) /* Zacyklíme všechny přítomné hráče*/ for (new i; i < MAX_PLAYERS; i++) { if (IsPlayerConnected(i)) { /* Zjistíme, jestliže i oni jsou VIP */ if (IsPlayerVip(i)) { /* A odešleme jim zprávu */ SendClientMessage(i, 0x00FF0000, String); } } } } } return 1; } AdminChat pracuje na úplně stejném principu s DROBNÝM rozdílem. Jediné co se zjišťuje, zda má adminlevel namísto VIP. Ranky, tituly, tagy Tak to neni nic jednoduššího než jen změnit v OnPlayerText() způsob, co za text se odešle. Najdeme si nějaký způsob jak zjistit, zda hráč má nějaký titul vůbec. Můžeme například zjistit, zda počet znaků je více než 3: if (strlen(TitulHrace[playerid] > 3)) { new String[144 + 1]; format(String, sizeof String, "%s %s: %s", TitulHrace[playerid], GetPlayerNick, text); SendClientMessageToAll(0x00FF0000, String); return 0; } Seznam online administrátorů či VIPs Tak to už jsem několikrát psal návod jak na to v sekci Pomoc: Odkazy Anketa2019 Systémy #1 - [Topic] [Pastebin] Carmenu2019 Systémy #2 - [Topic] [Pastebin] Oprávnění (Admin/Vip)2019 Systémy #3 - [Pastebin]
  2. Ahojte, ffredyk ma svojim príspevkom nadchol. (bozužiaľ ma nenadchla informácia, že majiteľ to nechce posunúť ďalej, aj keď na to evidentne celé tie roky sere) Dnes by som vám chcel ukázať node.js. Povedať vám čo to je a prečo by vás mal zaujímať. Pravdepodobne to bude celá séria návodov, kde budem preberať backend (ak výraz nepoznáte, nižšie bude vysvetlený) aj frontend (ak výraz nepoznáte, nižšie bude vysvetlený) a na konci série budeme mať SA-MP administráciu. Som rád, že ste taký môj predboj na ktorom budem testovať. V tomto návode preberieme hlavne teóriu a na konci si napíšeme najjednoduchšiu node.js appku. Z čoho sa skladá Webová stránka? Webová stránka sa skladá z 2 častí. Frontend a Backend. Frontend je to, čo užívateľ vidí čiže css štýly, html dokument, obrázky, fonty, videá... Najčastejšie ho tvorí HTML, CSS a JavaScript. HTML by mal slúžiť prevažne na texty, CSS slúži na dizajn (bude tento link mať farbu modrú alebo červenú?) a JavaScript na interakciu. Backend je to jadro webu, ku ktorému užívateľ nemá prístup (teda, až na lacesove adminky, tam má prístup každý). Patrí tam databáza a scripty na servery (registrácia, autentifikácia, API...). Najčastejšie sa robí v PHP ale môže sa aj v .NET, Pythone, Jave a už pár rokov aj v JavaScripte na backende - Node.js. Aké má výhody oproti PHP? Výhod je dosť. NPM. Používanie jedného jazyka na frontende aj backende. Omnoho jednoduchšia práca s real-time aplikáciami, stúpajúca popularita a s ním aj počet pracovných miest... Pre viac detailov si môžete prečítať Want to be a Web Developer? Learn Node.js not PHP alebo Why the Hell Would You Use Node.js. Ak by vás zaujímalo, ktoré veľké spoločnosti používajú Node.js tak môžete zostať prekvapený Netflix, Linkedin, Trello, Uber, Paypal, Medium, eBay, NASA. Zdroj 1 a Zdroj 2 a stackshare Inštalácia Node.js Aby sme mohli vyvíjať budeme si musieť nainštalovať Node.js. Je to jednoduchý inštalátor takže to určite zvládnete. Ďalšia potrebná vec je naučiť sa trochu používať konzolu. Konzola alebo aj príkazový riadok je dôležitá súčasť lebo nám umožňuje spúšťanie node.js scriptov. Našťastie nebudeme potrebovať zložité vedomosti, vystačíme si so základnými príkazmi `cd` a `ls`. Ak používate Windows tak odporúčam nainštalovať si Cmder a používať ten. Lebo konzola vo Windowse je strašná. Ak máte MacOS alebo Linux tak netreba nič viac. Keď už máme nainštalovaný node, tak sa nám pribudli 2 nové príkazy pre konzolu. Jeden je `node` a druhý `npm`. V predchádzajúcom bode som schválne nevysvetlil čo je to npm. NPM je balíčkovací systém. Môžete vďaka nemu sťahovať závislosti pre vášu appku. Napríklad potrebujete posielať emaily tak nemusíte chodiť na google a hladať nejakú knižicu, sťahovať ju, dávať si ju do projektu... Jednoducho iba napíšete `npm install nodemailer` a rovno používate tú knižnicu. Základy s terminálom/príkazovým riadkom Ako som už písal, budeme používať základné, jednoduché, príkazy. `cd` znamená change directory (v preklade zmena priečinka). Vďaka tomuto príkazu sa môžete dostať do priečinka a pracovať v ňom napríklad `cd dokumenty/praca/` vás dostane do priečinka dokumenty a v ňom do priečinka praca. `ls` pre zmenu vypíše obsah priečinka, v ktorom sme nastavený cez `cd`. Na prácu s terminálom si treba chvíľku zvykať ale zistíte, že to je veľmi dobrý pomocník. Tu je link na pár základných príkazov. Vďaka Southclawovy aj pawn má svoje "npm" nazvané http://sampctl.com/ Takže prácu s terminálom si môžete vyskúšať aj v pawn. Hello world v node.js Už takto je to docela obsiahly návod (hlavne na zdroje, ktoré odporúčam pozrieť) tak si ukážeme ako si spustiť webovú stránku cez node.js Vytvoríme si priečinok napríklad "navod" a do neho súbor app.js (môžete sa nazvat ako chcete) a do neho vložíme tento jednoduchý kód. var http = require("http"); var port = 8000; http.createServer(function (request, response) { // toto sú dôležité hlavičky ktoré sa posiela server na clienta response.writeHead(200, {'Content-Type': 'text/plain'}); response.end('Hello World\n'); }).listen(port); // Vypíšeme do konzole že server ide a na akom porte je console.log('Server running at http://127.0.0.1:' + port); Sǔbor uložíme. Cez konzolu sa dostaneme do nášho priečinka "navod" (čiže napríklad `cd navod/`) a iba spustíme server cez príkaz `node app.js`. Ak sme všetko správne urobili, konzola nám oznámila že server je spustený na porte 8000. V prílohe je obrázok ako by to malo vyzerať. Tento návod beriem ako "nutné zlo" ktoré treba. V ďalšiom dieli sa zameriame viac na programovanie a potom by som mohol urobiť tú sériu, v ktorej by sme robili samp administráciu.
  3. Nope

    návod Práce 2019 - Systémy #4

    Práce 2019 Systémy #4 ***** Pojďme si udělat návod na všechny "systémy" individuálně. Vítejte u dalšího dílu PAWN kouzla zbaven. Práce jsou snad ty nejjednodušší ze všech těch systémů Obsah 1. Vkládání informací o pracích, 2. Funkce pro práci s prací, 3. Zakomponování. Vkládání informací o pracích Jsou nejjednodušší už jen z důvodu, že jakmile si to člověk všechno předpřipraví, tak už jediné co, jen přidává nové práce. Prvním, co bych doporučoval začít je přidáním pozic prací. Bude lepší si je oddělit od zbytku dalších informací o práci: new Float: Prace_Mista[][3] = { {741.0, 644.1, 203}, {572.2, 344.3, 638}, {379.4, 68.5, 181}, {760.6, 221.7, 629}, {532.8, 713.9, 262}, {483.10, 433.11, 642}, {598.12, 139.13, 377}, {182.14, 678.15, 708}, {32.16, 991.17, 649}, {659.18, 567.19, 989} }; Nebudeme si definovat nějaké MAX_JOBS, jelikož můžeme zjistit maximum přidaných prací díky sizeof. Ale o tom později. Dál bych pokračoval deklarováním si zbytku informací a to klidně rovnou do 1 proměnné a upravit dle sebe, aby to bylo přehledné. Místo únavného hledání ID zbraní stačí zapsat jejich makro: enum ENUM_PRACE { Prace_Jmeno[11], Prace_Vyplata, Prace_Zbran1, Prace_Zbran2, Prace_Zbran3, Prace_Skin1, Prace_Skin2, Prace_Skin3 } new Prace_Info[][ENUM_PRACE] = { //Jmeno Vypla Zbran1 Zbran2 Zbran3 Skin1 2 3 {"Grove", 10000, WEAPON_TEC9, WEAPON_KNIFE, WEAPON_COLT45, 105, 106, 107}, {"Ballas", 10000, WEAPON_UZI, WEAPON_BAT, WEAPON_COLT45, 102, 103, 104}, {"Vagos", 10000, WEAPON_UZI, WEAPON_KATANA, WEAPON_COLT45, 108, 109, 110}, {"Aztecas", 10000, WEAPON_TEC9, WEAPON_SHOVEL, WEAPON_COLT45, 114, 115, 116}, ... }; Funkce pro práci s prací Než půjde plně pracovat dál, je třeba určité informace nejdříve zjistit. Například, jestliže je hráč u dané práce. Jedna z možností je přidáním pickupu, a jakmile by byl na něm, zobrazit dialog. Což sice přináší problém s neustálým otevíráním dialogu, které jde vyřešit pomocí proměnné, ale to je moc práce. Já bych raději doporučil, aby menu ohledně prací si hráč zobrazil sám. To znamená, že nejdříve musí provést sám nějakou akci (příkaz, stisknutí kláves) a až pak se zobrazí menu práce. Já rozhodně doporučuji přes příkaz. Ano, psát 10x /prace není zrovna záživné ale velmi jednoduše se ošetřuje. Stačí jen fci na případ, že je okolo nějaké práce. K tomu nám poslouží cyklus, který projede všechny naše pozice prací a zjistí, zda není hráč kolem nějaké z nich: bool: IsPlayerAroundJob(playerid) { for (new i, j = sizeof(Prace_Mista); i < j; i++) { if (IsPlayerInRangeOfPoint(playerid, 1.0, Prace_Mista[0], Prace_Mista[1], Prace_Mista[2])) return true; } return false; } A ještě jednu funkce a ta nám vrátí ID té dané práce. Ano, šlo by to oboje zakomponovat do jedné fce (fce by vrátila číslo větší než 0 takže by bylo vždy true), ale ať máme víc fcí . Obsah se nějak nezmění, stačí jen, aby vracela ID té práce kolem které je: GetJobIDFromPlayer(playerid) { for (new i, j = sizeof(Prace_Mista); i < j; i++) { if (IsPlayerInRangeOfPoint(playerid, 1.0, Prace_Mista[0], Prace_Mista[1], Prace_Mista[2])) return i; } return 0; } A nakonec deklaraci proměnné (a i několik maker z ní), která nám řekne, že hráč je zaměstnaný. Vypustíme datový typ bool a rovnou použijeme int z důvodu, že nám kromě informace že je zaměstnaný, nám taky poví kde podle ID: new Hrac_Maka[MAX_PLAYERS]; #define IsPlayerInAnyJob(%0) (Hrac_Maka[%0]>0) #define GetPlayerJob(%0) Hrac_Maka[%0] A nakonec samotné přidání hráče do práce. Doho docílíme snadno tím, že mu nastavíme všechno známé: SetPlayerJob(playerid, jobid) { Hrac_Maka[playerid] = jobid; GivePlayerWeapon(playerid, Prace_Info[jobid][Prace_Zbran1], 9999); GivePlayerWeapon(playerid, Prace_Info[jobid][Prace_Zbran2], 9999); GivePlayerWeapon(playerid, Prace_Info[jobid][Prace_Zbran3], 9999); SetPlayerSkin(playerid, Prace_Info[jobid][Prace_Skin1]); } Stále je v tom zmatek? Tak si jde z toho udělat i makra: #define GetJobSalary(%0) Prace_Info[%0][Prace_Vyplata] #define GetJobFirstWeapon(%0) Prace_Info[%0][Prace_Zbran1] #define GetJobSecondWeapon(%0) Prace_Info[%0][Prace_Zbran2] #define GetJobThirdWeapon(%0) Prace_Info[%0][Prace_Zbran3] #define GetJobFirstSkin(%0) Prace_Info[%0][Prace_Skin1] #define GetJobSecondSkin(%0) Prace_Info[%0][Prace_Skin2] #define GetJobThirdSkin(%0) Prace_Info[%0][Prace_Skin3] Zakomponování No a pak už jen všechno aplikovat, například na příkaze: public OnPlayerCommandText(...) { if (!strcmp("/prace", cmdtext, true)) { if (IsPlayerAroundJob(playerid) == true) { /* Nejdříve jestli je vůbec zaměstnaný */ if (IsPlayerInAnyJob(playerid)) { /* Teď v případě, že se id práce na které stojí se shoduje s id ve které je zaměstnaný: */ if (GetPlayerJob(playerid) == GetJobIDFromPlayer(playerid)) ShowPlayerDialog(...); /* Jinak v případě, že je to jiná práce, než ta ve které je: */ else ShowPlayerDialog(...); /* A nebo ještě v případě, že není zaměstnaný vůbec: */ } else ShowPlayerDialog(...); } return true; } } V případě výplaty to je snadné. Stačí si spustit opakující se timer například každé 3 minuty. Poté projít cyklem všechny přítomné hráče, zjistit zda jsou v nějaké práci. a z jejich id prací jim dát danou výplatu: forward Prace_Vyplata(); public Prace_Vyplata() { for (new i; i < MAX_PLAYERS; i++) { if (!IsPlayerConnected(i)) continue; if (IsPlayerInAnyJob(i) == true) GivePlayerMoney(i, Prace_Info[GetPlayerJob(i)][Prace_Vyplata]); } return 1; } Seznam všech fcí (a maker) jen pro ukázku : IsPlayerInAnyJob(playerid); GetPlayerJob(playerid); SetPlayerJob(playerid, jobid); GetJobSalary(jobid); GetJobFirstWeapon(jobid); GetJobSecondWeapon(jobid); GetJobThirdWeapon(jobid); GetJobFirstSkin(jobid); GetJobSecondSkin(jobid); GetJobThirdSkin(jobid); InPlayerAroundJob(playerid); GetJobIDFromPlayer(playerid); Odkazy Anketa2019 Systémy #1 - [Topic] [Pastebin] Carmenu2019 Systémy #2 - [Topic] [Pastebin] Oprávnění (Admin/Vip)2019 Systémy #3 - [Topic] [Pastebin] Práce2019 Systémy #4 - [Pastebin] Edited Úterý o 15:43 by Scydo
  4. Carmenu 2019 Systémy #2 ***** Pojďme si udělat návod na všechny "systémy" individuálně. Tohle nebude návod na ty prasácké zastaralé systémy, kde se podmínkuje každé vozidlo individuálně, viz: Nebude to ani tak řádný návod jako spíše několik nápadů, které vám napomůžou rychleji a efektivněji si vytvořit carmenu. Začneme. 1. Dvojrozměrné pole Když se spojí s výčtem hodnot(enum) je velmi užitečný. Kdo by nevěděl o co jde (doporučený návod): Je to prosté. Nejdříve si definujeme makro pro počet vozidel, které máme (vysvětlení později): #define MAX_VEHICLES_IN_MENU 7 Dále si deklarujeme dvojrozměrné pole, kde do 1. buňky vložíme přesný počet vozidel (bude se hodit později kvůli cyklu), které pole obsahuje a do 2. buňky výčet hodnot. Vytkl jsem si několik rychlých vozidel, včetně jmén (pro tento účel nejvyšší počet znaků je 9 [8 + 1], pro větší počet znaků je ho třeba zvýšit): enum ENUM_CARMENU { Vozidlo_ModelID, Vozidlo_Jmeno[9] } new Vehicles[MAX_VEHICLES_IN_MENU][ENUM_CARMENU] = { {402, "Buffalo"}, // [0] {411, "Infernus"}, // [1] {415, "Cheetah"}, // [2] {451, "Turismo"}, // [3] {541, "Bullet"}, // [4] {559, "Jester"}, // [5] {603, "Phoenix"} // [6] }; A teď přichází ta úžasná část: Když je chci všechny zobrazit... Není třeba zjišťovat id, není třeba vypisovat pro každé vozidlo znovu jméno, ale stačí jediný cyklus, který projede všechna vozidla v poli a přidat k tomu i formátování následného seznamu vozidel tím, že si zobrazíme každé jméno vozidla individuálně: for (new i = 0; i < MAX_VEHICLES_IN_MENU; i++) format(String, sizeof String, "%s\n%s", String, Vehicles[i][Vozidlo_Jmeno]); Všimněte si, že zde používám právě naše makro MAX_VEHICLES_IN_MENU. A to je všechno! Viz příklad příkazu na zobrazení dialogu s vozidly: CMD:carmenu(playerid) { new String[100]; for (new i = 0; i < MAX_VEHICLES_IN_MENU; i++) format(String, sizeof String, "%s\n%s", String, Vehicles[i][Vozidlo_Jmeno]); ShowPlayerDialog(playerid, DIALOG_CARMENU, DIALOG_STYLE_LIST, "Vyber si vozidlo", String, "Vybrat", "Zavrit"); return CMD_SUCCESS; } A kdybych chtěl přidat více vozidel? To je prosté: 1. Stačí zvýšit počet MAX_VEHICLES_IN_MENU. 2. Přidat jeho modelid a jméno do proměnné jako další. Ještě bych doporučil jednu věc a to ničit vozidlo poté, co se hráč odpojí ze serveru. Přeci jen aby uvolnil místo pro další id vozidla. Jestli vytvořené vozidlo skutečně existuje zjistíme hned několika způsoby. Například jestliže jeho modelid bude větší než 0 (jelikož fce vrátí 0 v případě že vozidlo neexistuje): if (GetVehicleModel(Vozidlo_Hrac[playerid]) > 0) { DestroyVehicle(Vozidlo_Hrac[playerid]); Vozidlo_Hrac[playerid] = 0; } 2. Všechna vozidla a listitem Tahle varianta funguje správně a dobře, jestliže máte vypsaná jména VŠECH vozidel(modeild není třeba, pouze jména) do nějaké proměnné ve správném jmenném pořadí [více viz (Vechiles:All)] například: new Vozidla_Jmena[][] = { "Landstalker", "Bravura", "Buffalo", "Linerunner", "Perrenial", "Sentinel", //... a tak dále až všech }; A pokračujeme zobrazením VŠECH (ano všech do posledního) také za pomocí cyklu. To znamená všech 211 vozidel. A nakonec zobrazit i dialog hráčovi podobně jako u dvojrozměrného pole. Poté v OnDialogResponse() najít správné dialogid. A teď ten chyták: new modelid = listitem + 400; Jak toto funguje? Jednoduše: Jelikož listitem začíná od čísla 0 a zvyšuje svůj počet podle toho na jaký hráč kliknul, a jelikož modelid začíná od 400 a končí 611, tak k id listitemu na který hráč klikne se přičte 400. Příklad: Kliknu na 3. položku (listitem), což znamená, že listitem je rovno 2. Teď k ní přičtu 400 a mám z toho modelid vozidla Buffalo. Má to své klady i zápory... (Klad) není to nějak komplikované, jen přidat číslo 400, (Klad) tím pádem nemusím vypisovat u všeho id modelu. (Zápor) právě že musím vypsat všechna jména vozidel (jedno vynechané ještě neznamená konec světa, stejně spawne dle počtu ale nebude souhlasit jméno). (Zápor) dialog pro zobrazení všech vozidel sežere příšerně moc znaků. 3. Odkazy Budou zde odkazy na hotové (úspěšně kompilované, ale nikoliv vyzkoušené ve hře) systémy z návodu pro výukové účely. Jestliže to někdo vezme a hodí na server jako hotový script je to jeho věc. Anketa2019 - Systémy #1 - [ Klikni ] Carmenu2019 - Systémy #2 - [ Klikni ]
  5. Nope

    návod Anketa 2019 - Systémy #1

    Anketa 2019 Systémy #1 ***** Pojďme si udělat návod na všechny "systémy" individuálně. Začneme nahráním základní knihovny a_samp: #include <a_samp> Pouze si kvůli params nahrajeme i-zcmd (doporučuji návod): include <i-zcmd> A deklarujeme si několik proměnných: new /* Text samotné ankety, aby pak při vyhodnocení napsal všem hráčům o jakou anketu jde: */ Anketa_Text[100], /* Později na podmínky, aby někteří hráči nemohli hlasovat vícekrát */ bool: Anketa_Hlasoval[MAX_PLAYERS], /* Aby neprobíhalo více anket najednou (jinak to samozřejmě lze) */ bool: Anketa_Probiha, /* A nakonec pole s 2 hodnotami a to 0 pro ANO a 1 pro NE */ Anketa_AnoNe[2]; Dále si přidáme volání příkazu anketa (například) a už tam házíme podmínky. U všech vrátíme zprávy (barva s argumentu -1 bude bílá): 1. Jestliže už anketa probíhá: if (Anketa_Probiha == true) return SendClientMessage(playerid, -1, "Už probíhá nějaká anketa ole !"); 2. Jestliže do příkazu nenapsal nic (jestliže je params prázdné): if (isnull(params)) return SendClientMessage(playerid, -1, "Musíš napsat nějaký text ole !"); 3. Jestliže je napsaný text ankety příliš dlouhý (je více než 100 znaků): if (strlen(params) > 100) return SendClientMessage(playerid, -1, "Text je moc dlouhý ole !"); Pokračujeme deklarováním dalších lokálních proměnných a to string pro text, který se všem odešle, a pro jméno hráče, který tu anketu započal, a rovnou si do proměnné to jméno dosadíme za pomocí fce GetPlayerName(): new String[144 + 1], NickName[MAX_PLAYER_NAME + 1]; GetPlayerName(playerid, NickName, sizeof NickName); Dále formátujeme string pro zprávu, která se všem odešle. Jelikož jediné co psal do params je text ankety, tak ho využijeme celý. A hned potom vložíme text ankety do proměnné: format(String, sizeof String, "[ ANKETA %s ] %s", NickName, params); format(Anketa_Text, 100, params); Odešleme všem zprávu a následně si spustíme i timer na 2 minuty, který poslouží jako konec ankety: SendClientMessageToAll(0xFFA50000, String); SetTimer("KonecAnkety", 1000*60*2, false); A ukončíme blok pomocí návratové hodnoty (stejné to bude i u obou následujících příkazů): return CMD_SUCCESS; } Teď si přidáme příkazy ano a ne. Obsahy obou se nebudou extra lišit. Začneme přidám 2 podmínek: 1. Jestliže neprobíhá žádná anketa: if (Anketa_Probiha == false) return SendClientMessage(playerid, -1, "Neprobíhá žádná anketa ole !"); 2. Jestliže už hlasoval: if (Anketa_Hlasoval[playerid] == true) return SendClientMessage(playerid, -1, "Už jsi hlasoval ole !"); Nakonec už jen přiřadíme k proměnné Anketa_Hlasoval pro daného hráče true, a k počtu Ano(což je buňka u Anketa_AnoNe číslo 0) zvýšíme počet: Anketa_Hlasoval[playerid] = true; Anketa_AnoNe[0]++; SendClientMessage(playerid, -1, "Hlasoval jsi ANO ole !"); Stejné to bude i u příkazu ne. S jediný rozdílem, že u pole Anketa_AnoNe bude číslo buňky 1 namísto 0. A nakonec si zavoláme fci z timeru: forward KonecAnkety(); public KonecAnkety() { Obsahem bude deklarace znovu lokální proměnné String pro formátování zprávy, která bude obsahovat, o čem byla anketa a výsledný počet ano a ne: new String[144 + 1]; SendClientMessageToAll(0xFFA50000, "[ ANKETA ] Anketa skončila:"); format(String, sizeof String, "[ %s ] ANO: %i | NE: %i", Anketa_Text, Anketa_AnoNe[0], Anketa_AnoNe[1]); SendClientMessageToAll(0xFFA500, String); A nakonec musíme vše vynulovat a připravit na novou anketu. Začneme tím, že vyčistíme text u ankety jednoduše tím, že k 1. pozici přiřadíme nul. znak: Anketa_Text[0] = '\0'; Dále přiřadíme false k proměnné Anketa_Probíhá a u pole Anketa_AnoNe obou buňkám 0. Anketa_Probiha = false; Anketa_AnoNe[0] = 0; Anketa_AnoNe[1] = 0; A na úplný konec musíme i všem připojeným hráčům přiřadit false k proměnné, že hlasovali. Toho docílíme za pomocí cyklu. for (new i = 0; i < MAX_PLAYERS; i++) Anketa_Hlasoval[i] = false; }
  6. Zdravím, Dnes si ukážeme, jak si vytvořit jednoduchý PM System, pomocí includu ZCMD 1.Krok Do Kódu si zapíšeme 3 includy které budou potřeba k dalšímu kroku. #include <a_samp> //Je potřeba pro všechny funkce které jsou nadefinovány SAMP Teamem #include <zcmd> // Používáme na příkazy CMD: #include <sscanf> // Parametry aby sme mohli napsat ID hráče a dannému ID poslalo zprávu. 2.Krok [ NENÍ NUTNÉ ] Aby sme si nemuseli přidělávat práci, můžeme si nadefinovat zkratku pro SendClientMessage #define SCM SendClientMessage //Je to takový pomocníček, když sme líní psát SendClientMessage tak místo toho napíšeme pouze SCM 3.Krok Pokud vše máme hotové, pustíme se do hlavy kódu. CMD:pm(playerid, params[])//Sem dáme params proto že budeme používat includ SSCANF { new str[256], str2[256], id, Name1[MAX_PLAYER_NAME],Name2[MAX_PLAYER_NAME];// Tady si nadefinujeme Name1 a Name2 if(sscanf(params, "PM", id, str2))// Podmínka pro to, když hráč napíše pouze /pm tak mu to pošle zprávu jak má příkaz dále použít. { SCM(playerid,-1,"Použití: /pm ID Text");// Pomocná zpráva jak se příkaz má správně používat. return 1; } if(!IsPlayerConnected(id)) return SCM(playerid,-1,"Hráč není na serveru.");// Podmínka pro to, když zadáme ID hráče co není na serveru. if(playerid == id) return SCM(playerid,-1,"Proč píšeš PM sám sobě ?");// Podmínka pro to, když hráč napíše vlastní ID. { GetPlayerName(playerid, Name1, sizeof (Name1));// Funkce na zjištění Nicku GetPlayerName(playerid, Name2, sizeof (Name2));// Funkce na zjištění Nicku format(str, sizeof(str), "PM pro %s %d : %s", Name2, id, str2);// Formátování PM Zprávy SCM(playerid,-1,str);// Tady si můžete nastavit HEx codovou barku jakou se má zobrazit zpráva Pro někoho format(str, sizeof(str), "PM od %s %d : %s", Name2, id, str2);// Formátování PM Zprávy SCM(playerid,-1,str);// Tady si můžete nastavit Hex codovou barvu jakou se má zobrazit zpráva od někoho } return 1; } Pokud s tím budete mít nějaké potíže, tak neváhejte a napište mi do soukromých zpráv váš problém, který společně můžeme vyřešit.
  7. Zdravím vás všechny. Takže co mě k tomudle vedlo. Když sem chtěl dělat vlastní GameMode nevěděl sem jak kde čím začít.Byl sem zmatenej jak mam začít jestli mám začít základem GM nebo Vnitřkem nebo tímhle a nebo támhletím prostě zkrátka byl sem zmatenej. Dnes vám ukážu nebo napovím vám jak si udělat GameMode a postupně čím začínat atd... Přišel sem na to sám a od té doby se mi GameMody dělají snadněni a líp. 1. Krok Do textového dokumentu nebo někam na nástěnku, tabulku na cokoliv si rozvrhnout gamemode co v gamemodu bude jaká registrace tam bude. Představte si že děláte na nějakém stroji a děláte si výkresy toho stroje co bude obsahovat tak to samé je i u GameModu napíšete si někam co GameMode bude obsahovat. 2.Krok Hodně záleží na tématu GameModu. Jsou různé témata - FreePlay - SinglePlayer - RolePlay - Cops And Rubbers - Stunts - CallOfDuty A další Témata. Toto jsou častější témata co jsou takový známý. Ale mám jednoho kamaráda co si vymyslel vlastní téma. Defakt smíchal hru Call Of Duty Need ForSpeed a Kobru 11 do sebe a je s toho také dobrý gamemode. Nebo pokud znáte film Titanic tak udělat server kde utíkáte z titanicu a vyloženě vše bude na principu útěk z Titanicu. Nebo něco akčního. Důležité je aby GameMode měl nějaké Téma kterého se budeme držet. 3.Krok Dále si musíte rozmyslet jaké includy k tomu budete používat. Hodně GameModu používá standartní a známý includy co má každý GameMode - ZCMD - sscanf - Proggres - streamer - Dini / DOF2 4. Krok Také záleží na názvu GameModu když máme téma GameModu Útěk z Titanicu tak musíme vymyslet také podobný název GameModu Třeba RolePlay server mají téma Reálného života a název gamemodu je práve RolePlay a to samé je i s vlastním tématem třeba název Titanic Run 1.9 Nechci říkat že na názvu GameModu moc nezáleží ale je tot ak na normální úrovni. 5. Krok Když už tohle všechno máme rozvrhnuté, je důležitá úprava. Proč úprava ? proto že hodně lidí to tam nafrkaj jak rajčata do hlíny a pak hledaj co kde mají a nevyznají se v tom. 6.Krok Poté už začínáme pawnit GameMode tak a teď přemýšlíme co tam ? Tak když pawníme GameMode s tematem Útěk s Titanicu taka si nebudu dělat GameMode o prodávání drog a honičky s policajtama. Ale tak existuej MapEditr kde si namapujeme interier Titanicu nemusí být přesný ale pokud je někdo pyntlich tak může. Dále musíme napawnit do GameModu příkazy co by mohli sednout k útěku z Titanicu. Třeba /Mapalodi pomocí textdrawu by šla udělat krásá mapa lodi nebo plánek a podobné příkazy souvislející k tématu. To by bylo všechno pro tento návod nebo pomoc jak dělat GameMode samozřejmě vymyslete si vlastní téma Útěk s Titanicu je pouze názorný příklad.
  8. Emit #2: Funkcie a stack Obtížnost: 7/5 Aneb ako to ten compiler robí? Tento tutoriál vyžaduje Zeexov Compiler verziu 3.10.9+, pretože používa nový operátor emit (nie direktívu). Osnova/obsah: Stack a STK register Lokálne premenné Volanie funkcii a FRM register Parametre funkcii Alokácia lokálnych premenných Volanie native funkcií Praktická motivácia Záver 1. Stack a STK register Stack si vlastne môžete predstaviť ako veľký kus pamäte. Ako veľký sa určuje pri kompilácii amx pomocou #pragma dynamic Kde presne máte uložené veci na stacku zistíte pomocou STK registru. STK je jeden z tých 7+ daľších registrov, ktoré som minule spomenul, ale ďalej neriešil. STK ukazuje na poslednú hodnotou, ktorú ste na stack vložili. Je taktiež dôležité spomenúť, že stack je otočený opačne, takže predchádzajúca hodnota je na adrese STK + 4. STK je samozrejme v bajtoch a premenná v PAWN má bežne 4 bajty, takže STK je vždy násobok 4. Taktiež premenná v PAWN sa volá cell a jej veľkosť sa často zapisuje ako cell size. Pre samp vždy cell size = 4. Inštrukcie PUSH a POP sa teda dajú zapísať ako: PUSH.pri/alt - STK = STK - cell size, [STK] = pri/alt POP.pri/alt - STK = pri/alt = [STK], STK + cell size Ako zistíme hodnotu STK? Ako ju zmeníme? Môžeme použiť inštrukcie: LCTRL 4 - pri = STK SCTRL 4 - STK = pri 4 je v týchto inštrukciách register STK. Iné čísla vám dajú iné registre, ale k tým sa dostaneme neskôr. 2. Lokálne premenné Lokálne premenné su v skutočnosti nenápadne uložené na stacku. new a = 3; vo funkcii v skutočnosti nieje nič viac ako emit PUSH.C 3; s tým, že si to miesto, kde sa premenná nachádza compiler zapämatá pod menom a. Ale xhunterx, ako sa k lokálnym premenným dostaneme, keď môžeme pristupovať len k vrchnej hodnote na stacku? No ja som vám trošku klamal. Odstrániť zo stacku môžeme len vrchnú hodnotu, pretože zo stacku vymazávame posnutím registru STK. Nič nám ale nebráni pozrieť sa na akékoľvek miesto na stacku. Na nájdenie týchto premenných nám slúžia inštrukcie: LOAD.S.pri/alt Offset - Načíta lokálnu premennú z Offset do pri/alt STOR.S.pri/alt Offset - Uloží pri/alt do lokálnej premennej z Offset PUSH.S Offset - Uloží hodnotu lokálnej premennej z Offset na zásobník To nám umožní spraviť napríklad: main() { new a = 1; new b = 2; // t = a; a = b; b = a; // Vymeníme a, b emit LOAD.S.pri a; // Načítame a do pri emit LOAD.S.alt b; // Načítame b do alt emit STOR.S.pri b; // Uložíme pri do b emit STOR.S.alt a; // Uložíme alt do a printf("a = %i, b = %i", a, b); // a = 2, b = 1 } 3. Volanie funkcii a FRM register Teraz vieme ako pracovať s lokálnymi premennými, ale ako to vlastne funguje? Na to sa musíme pozrieť, ako sa voláju funkcie. Povedzme že máme: func(a, b, c) { return a + b + c; } main() { new a = 1, c = 3; func(a, 2, c); return 1; } Toto by vyzeralo v asi nejak takto: Test() { //emit PROC; // PROC je automaticky vygenerované na začiatku každej funkcie // Ručne to písať nemusíme, preto je to zakomentované emit CONST.pri a + b + c; emit RETN; // POZOR! Iné ako RET } main() { new a = 1, c = 3; emit PUSH.S c; // Pushneme c na stack emit PUSH.C 2; // Pushneme 2 na stack emit PUSH.S a; // Pushneme a na stack // Všimnite si, že pushujeme v opačnom poradí. Posledný parameter sa pushuje ako prvý. // To je aby k nim funkcia mohla pristupovať v správnom poradí, keďže ona ich uvidí opačne. // c, ktorú sme dali na kopu papierov bude v tej kope najhlbšie. emit PUSH.C 12; // Počet parametrov * cell size emit CALL Test; } V tomto kóde máme 3 nové inštrukcie. CALL, PROC a RETN. Tieto inštrukcie taktiež používajú 2 nové registre FRM a CIP. CIP jednoducho uchováva adresu inštrukcie, ktorá sa práve vykonáva. Tento register sa neustále mení, ako sa vykonávajú inštrukcie. FRM uchováva STK na začiatku funkcie. CALL Adresa - STK = STK - cell size, [STK] = CIP + 8, CIP = Adresa Ak sa na to pozrieťe, prvé 2 časti vyzerajú ako push. A presne to aj robia. Call pushne CIP + 8 na zásobník. CIP + 8 je adresa dalšej inštrukcie po call, keďže samotná inštrukcia je cell (4 bajty) a Adresa je taktiež cell (4 bajty). Nakonie CALL do CIP vloží adresu Adresa. Tým zaistí, že dalšia inštrukcia, ktorá sa bude vykonávať nebude ďalšia inštrukcia v poradí, ale prvá inštrukcia funkcie, ktorú voláme. A prvá inštrukcia funkcie je vždy PROC. PROC - STK = STK - cell size, [STK] = FRM, FRM = STK Znovu dve časti sú push, konkrétne pushneme starú hodnotu FRM na zásobník. Potom do FRM dáme aktuálnu hodnotu STK. Toto nám umožnuje používať inštrukcie ako LOAD.S.pri. Vďaka FRM vieme spočítať, kde sa premenné nachádzajú. A nakoniec nová inštrukcia RETN. RETN - FRM = [STK], CIP = [STK + 4], STK = STK + 12 + [STK + 8] Kde [STK] je stará hodnota FRM od PROC, [STK+4] je adresa dalšej inštrukcie po CALL, [STK+8] je velkosť parametrov funkcie (naše emit PUSH.C 12;) Táto inštrukcia teda spravý niekoľko vecí. Vráti do FRM pôvodnú hodnotu zo zásobníku, ktorú tam uložil PROC Nastavý dalšiu inštrukciu na hodnotu zo zásobníku, teda na hodnotu, ktorú tam uložil CALL, teda na ďalšiu inštrukciu po CALL Vymaže zo zásobníku všetky uložené hodnoty a parametre funkcie. Stack teda vo vnútry funkcie Test v našom príklade vyzerá takto: STACK = Stary_FRM, Navratova_Adresa, Velkost_Parametrov (=12), a, 2, c Pre úplnosť presné definície tývhto inštrukcií sú. LOAD.S.pri/alt Offset - pri/alt = [FRM + Offset] STOR.S.pri/alt Offset - [FRM + Offset] = pri/alt PUSH.S Offset - STK = STK - cell size, [STK] = [FRM + Offset] Mentálne cvičenie: Pre inštrukcie sú mená lokálnych premenných vlastne len Offset. Aký offset má premenná a v tejto funkcii? Bonus: aký offset má b? Test(b) { new a; return a + b; } 4. Parametre Funkcií Ako ste si mohli všimnúť podla posledného mentálneho cvičenia, parametre funkcie majú vlastne taktiež svoj offset voči FRM. A naozaj aj na ne môžeme pristupovať aj k parametrom funkcie. Napríklad funkcia z cvičenia sa dá napísať aj takto: Test(b) { new a; emit LOAD.S.pri a; emit LOAD.S.alt b; emit ADD; emit RETN; // Návratová hodnota je uložená v pri } 5. Alokácia lokálnych premenných Ako som už písal, lokálne premenné sa alokujú obyčajným pushom. Ak máte new a; vznikne emit PUSH.C 0; new b = 5; vznikne emit PUSH.C 5; Ako sa ale tieto premenné dealokujú? Mohli by sme použiť vždy POP, ale to by bolo pomalé a neefektívne. Miesto totoho existuje inštrukcia STACK. STACK Size - STK = STK + Size Takže ak chcem dealokovať 10 premenných (10 * cell size = 40 bajtov), napíšem emit STACK 40; Takže napríklad funkcia AllocTest() { new a, b, c, d; { new e, f; // Nieco } // Nieco2 } Bude po compilacii vyzerať nejak takto: AllocTest() { emit PUSH.C 0; emit PUSH.C 0; emit PUSH.C 0; emit PUSH.C 0; { emit PUSH.C 0; emit PUSH.C 0; // Nieco emit STACK 8; } // Nieco2 emit STACK 16; } Všimnite si, že v tomto prípade {} ani nepotrebujem, napísal som ich sem len pre prehľadnosť. Ešte stále tu ale máme veľa PUSH.C 0. Čo ak budeme chcieť vela lokálnych premenných. Môžeme to nejak zlepšiť? V podstate áno, ale je to zložité. Za prvé, FRM je register číslo 5, takže LCTRL 5 nám načíta FRM do pri. MOVE.pri/alt - pri = alt/alt = pri FILL Size - Vyplní rozsah od alt, veľkosti Size hodnotou pri. alt musí byť násobok cell size. Test() { emit STACK -20; // Alokujeme 5 * cell size miesta na stacku emit ADDR.alt -20; // Do alt dáme adresu začiatku premenných. emit ZERO.pri; // Nastaví pri na 0 emit FILL 20; // Vyplníme miesto od STK velkosti 20 nulami, čiže vynulujeme našich 5 premenných // Máme 5 lokálnych premenných emit STACK 20; // uvolníme premenné } 6. Volanie native funkcií Native funkcie môžeme volať pomocou inštrukcie: SYSREQ.C Func - Zavolá native funkciu Func Native funkcie sa však chovajú inak, ako normálne funkcie. Na rozdiel od normalných PAWN funkcií si po sebe neupracú, takže všetky premenné, ktoré ste pushli na zásobník musíte vymazať ručne. Príklad volania native funkcie: CallSCM(playerid, color, const str[]) { emit push.s str; // Pushneme posledný parameter emit push.s color; // Pushneme stredný parameter emit push.s playerid; // Pushneme prvý parameter emit push.c 12; // Pushneme velkosť parametrov emit sysreq.c SendClientMessage; // Zavoláme SendClientMessage emit stack 16; // Upraceme zásobník. 12 pre parametre + 4 pre velkosť. // 4x Push * cell size = 16 emit retn; // výsledok native je taktiež v pri, takže môžeme rovno return } Taktiež je dôležité, aby ste native ktorý takto voláte niekde použili mimo emit. Ak daný native nieje nikde použitý normálne, compiler ho nezpozná a crashne (compiler v3.10.9). 7. Praktická motivácia Často chceme vytvoriť funkciu, ktorá berie premnlivý počet argumentov a posunie ich dalšej funkcii, napríklad format. To však spraviť v PAWN je veľmi zložité. Tu je ukážka jedného možného spôsobu, ako na to: Použijeme priamo parametre, ktoré poslali našej funkcii a oklameme format tak, aby si myslel, že sú to parametre pre neho. Samozrejme prvé 2 parametre musíme zmeniť. stock SendClientMessagef(playerid, color, const msg[], ...) { new p, c, stk, str; emit { // Zálohujeme premenné load.s.pri color stor.s.pri c load.s.pri playerid stor.s.pri p // Nastavíme max velkosť pola pre format, argument 2 const.pri 145 stor.s.pri color // Vytvoríme pole na heape a vložíme ho ako argument 1 pre format heap 145 stor.s.alt playerid stor.s.alt str // Uložíme si kópiu na neskôr // Uložíme STK do zálohy lctrl 4 stor.s.pri stk // Nastavíme STK tak, aby format zobral parametre tejto funkcie // ako si pamatáme, stack vo funkcii vyzerá takto // STACK = ..., c, p, OFRM, RETADDR, PARAMSIZE, playerid, color, msg, ... // A FRM ukazuje na OFRM. Ďalej na volanie funkcie chceme na stacku mať // STACK = PARAMSIZE, playerid, color, msg, ... // To znamená, že musíme zobrať FRM a posunúť ho o 8 bajtov (2 celly) lctrl 5 // Získame FRM add.c 8 // Pridáme 8 sctrl 4 // Vložíme do STK // Teraz môžeme pekne zavolať format sysreq.c format // Keďže native po sebe neupratujú, ani nepoužívajú stack // jediné, čo sa volaním zmenilo je pri (return formatu) a samozrejme obsah str // Vrátime parametre zo zálohy load.s.pri c stor.s.pri color load.s.pri p stor.s.pri playerid // Vrátime STK zo zálohy load.s.pri stk sctrl 4 // Zavoláme normálne SendClientMessage push.s str push.s color push.s playerid push.c 12 sysreq.c SendClientMessage stack 16 // Uvolníme string z heapu prec heap -145 // Alebo aj // load.s.pri str // sctrl 2 // 2 = HEA } return 1; } 8. Záver Na záver by som ešte chcel zabohovať na dokumentáciu pawna. 3 verzie PAWN Implementer's Guide v PDF po ruke v pohotovosti, ani jeden nezodpovedá tomu, ako to reálne funguje. Napríklad podla guide je STK pointer na volné misto nad poslednou hodnotou v zásobníku. To ale jednoduchým testom vidíme, že nieje pravda... Podľa guide taktiež CALL robí [STK] = CIP + 5 (inštrukcia má asi mať velkosť 1 bajt). To ale taktiež nieje pravda. Inštrukcie ako ADDR.pri/alt ani v jednej z týchto príručiek niesu, no compiler ich veselo používa. A samozrejme ak dáte native funkcii adresu, ktorá je pod STK, tak crashne server. Nedokážem nájsť ani vidieť žiadny dôvod, prečo by tomu tak malo byť. Nikde inde sa nič také nedeje. No každopádne tu ano, takže super. Anilen hlášku to nenapíše... Ak niekde nájdem na predaj náhradné nervy, tak sa uvidíme pri časti 3. V tej sa pozrieme na skoky a pointery.
  9. Emit #1: Základy Obtížnost: 7/5 Prečo to robiť jednoducho, keď to ide zložito? Tento tutoriál vyžaduje Zeexov Compiler verziu 3.10.9+, pretože používa nový operátor emit (nie direktívu). Osnova/obsah: Disclaimer Globálne Premenné Základné operácie Stack Zlahčováky Operátor emit Záver 1. Disclaimer Emit a amxassembly je určite zaujímavá vec. Je to však podobné atómovej bombe. Je fajn ju mať, ale nikdy ju nechceme použiť. Vyššie jazyky ako PAWN existujú z dobrého dôvodu. Písať kód v assembly je zbytočne zdĺhavé a nebezpečné. Vzniknutý kód je absolútne nečitateľný. Chyby v assembly niesu ako chyby v PAWN, kde vás buď upozorní compiler, alebo vám nefunguje to, čo ste spravili. Pri chybe v emit sa môže stať čokoľvek. Crashe, SendClientMessage začne zobrazovať TextDrawy, 2 + 2 je zrazu 5, mačky naháňajú psy, počítače začnú horieť... Emit vám dokáže spôsobiť chyby v úplne iných častiach serveru a neukázať žiadny náznak, že je to chyba emitu... Ak na to nieste psychicky pripravený, tak radšej prestaňte čítať. Tento tutoríal čítajte na vlastné riziko! Autor nebude zodpovedný za žiadnu škodu, ktorú si spôsobíťe používaním emitu alebo iným používaním týchto informácií! Autor nebude zodpovedný za vaše mentálne zdravie, ak sa pokúsite chápať emity! 2. Globálne premenné Prvá vec, ktorú treba vedieť pri používaní emit sú registre. Registre fungujú podobne ako premenné a pawn ich ma niekoľko 9+. Zatiaľ nás však budú zaujímať len 2: pri a alt. Pri je primárny register. Takmer všetko, čo budeme robiť používa pri. Alt je alternatívny register, ktorý sa používa hlavne keď potrebujeme robiť s 2 číslami. Napríklad ak chceme 2 čísla sčítať. Ďalej musíme vedieť inštrukcie. Inštrukcie sú akési príkazy, ktoré hovoria, čo sa má spraviť. Niektoré inštrukcie za sebou majú .pri alebo .alt, čo určuje, s ktorým registrom chceme pracovať. Napríklad: LOAD.pri Adresa - Načíta hodnotu z adresy Adresa do registra pri LOAD.alt Adresa - Načíta hodnotu z adresy Adresa do registra alt Všeobecne toto zapisujeme ako LOAD.pri/alt Adresa - Načíta hodnotu z [Adresa] do pri/alt Ďalej keď pracujeme s hodnotou na určitej adrese, používame zápis [Adresa]. Takže ešte inak sa to dá zapísať LOAD.pri/alt Adresa - pri/alt = [Adresa] Tento zápis nám hovorí, že zoberieme hodnotu z adresy Adresa a vložíme ju do registru pri alebo alt, podla toho, ktorú inštrukciu použijeme (LOAD.pri alebo LOAD.alt). STOR.pri/alt Adresa - [Adresa] = pri/alt A ako vidíťe, táto inštrukcia STOR nám zase uloží obsah registra na adresu Adresa. Samozrejme sa pravdepodobne pýtate, odkial máte zobrať adresu? Užitočne miesto adresy môžete dať meno globálnej premennej, takže môžeme napríklad spraviť: new a = 1; new b = 2; main() { printf("a = %i, b = %i", a, b); // a = 1, b = 2 // b = a; emit LOAD.pri a; // Načítame a do pri emit STOR.pri b; // Uložíme pri do b printf("a = %i, b = %i", a, b); // a = 1, b = 1 } 3. Základné operácie Samozrejme obvykle nechceme len presúvať hodnoty, ale s nimi niečo počítať. Na to môžeme použiť napríklad niektoré z týchto inštrukcií. CONST.pri/alt Hodnota - pri/alt = Hodnota ADD - pri = pri + alt SUB - pri = pri - alt SUB.alt - pri = alt - pri NEG - pri = -pri SMUL - pri = pri * alt SDIV - pri = pri / alt, alt = pri % alt XCHG - Vymení pri a alt S týmito inštrukciami už môžeme spraviť niečo ako c = a + b; new a = 3; new b = 2; new c; main() { printf("a = %i, b = %i, c = %i", a, b, c); // a = 3, b = 2, c = 0 // c = a + b; emit LOAD.pri a; // Načítame a do pri emit LOAD.alt b; // Naćítame b do alt emit ADD // sčítame pri a alt a výsledok vložíme do pri emit STOR.pri c; // uložíme pri do c printf("a = %i, b = %i, c = %i", a, b, c); // a = 3, b = 2, c = 5 } A veľa dalších vecí: new a = 3; new b = 2; new c; main() { printf("a = %i, b = %i, c = %i", a, b, c); // a = 3, b = 2, c = 0 // c = -a - b; emit LOAD.pri a; emit NEG; emit LOAD.alt b; emit SUB emit STOR.pri c; printf("a = %i, b = %i, c = %i", a, b, c); // a = 3, b = 2, c = -5 // c = a * -b; emit LOAD.pri b; // Načítame b do pri, pretože NEG funguje len na pri emit NEG; // pridáme mínus, takže pri = -b emit XCHG; // presunieme pri do alt, takže alt = -b emit LOAD.pri a; // načítame a do pri emit SMUL; // vynásobíme pri * alt, čiže a * -b emit STOR.pri c; // uložíme výsledok do c printf("a = %i, b = %i, c = %i", a, b, c); // a = 3, b = 2, c = -6 // a = a + 5; emit LOAD.pri a; // Načítame a do pri emit CONST.alt 5; // Načítame 5 do alt emit ADD; // sčítame emit STOR.pri a; // uložíme výsledok do a } 4. Stack Ok, ale čo ak chceme spraviť a * b + c * d; Ak začnete písať tento kód, zistíte, že nemáte kam uložiť medzihodnotu a * b. Ano, môžete skúsiť podvádzať a uložiť ju do r, ale čo ak miesto r to budete chcieť dať priamo do funkcie? Odpoveď je zásobník. Úlohou zásobníka je pre vás podržať hodnoty, ktoré potrebujete. Predstavte si zásobník ako hŕbu papierov. Vždy keď potrebujete si môžete na vrch papier odložiť a neskôr ho z vrchu zobrať, avšak nesmiete sa v tej hŕbe hrabať. Môžete brať a dávať len na vrch. PUSH.pri/alt - Vloží pri/alt na vrch zásobníku. POP.pri/alt - Vloží hodnotu z vrchu zásobníku do pri/alt. Takže môžeme spraviť napríklad: new a = 3, b = 2, c = 4, d = 4; new r; main() { // r = a * b + c * d; emit LOAD.pri a; emit LOAD.alt b; emit SMUL; emit PUSH.pri; // uložíme výsledok na zásobník emit LOAD.pri c; emit LOAD.pri d; emit SMUL; emit POP.alt; // vybereme výsledok prvého náspbenia zo zásobníku emit ADD; emit STOR.pri r; printf("r = %i", r); // r = 22 } Na stack môžeme vložiť viacero hodnôt, napríklad: new a = 1, b = 2, c = 3, d = 4; new r; main() { // r = a + b + c + d; emit LOAD.pri d; emit PUSH.pri; // STACK = d emit LOAD.pri c; emit PUSH.pri; // STACK = c d emit LOAD.pri b; emit PUSH.pri; // STACK = b c d emit LOAD.pri a; emit PUSH.pri; // STACK = a b c d emit POP.pri; // a // STACK = b c d emit POP.alt; // b // STACK = c d emit ADD; emit POP.alt; // c // STACK = d emit ADD; emit POP.alt; // d emit ADD; emit STOR.pri r; printf("r = %i", r); // r = 10 } Možno sa teraz spýtaťe, čo sa stane ak dám POP viac krát ako PUSH? Mačky začnú nahánať psov, alebo možno váš počítač vybuchne. Kdo vie... 5. Zľahčováky Existuje taktiež veľa inštrukcií, ktoré existujú na zľahčenie písanie, napríklad niektoré inštrukcie majú verziu .C, ktorá použije zadanú hodnotu miesto registra. Napr "ADD.C 5" pripočíta k registru pri 5, čiže pri += 5. ADD.C Hodnota - pri = pri + Hodnota SMUL.C Hodnota - pri = pri * Hodnota PUSH.C Hodnota - Vloží Hodnota na zásobník INC.pri/alt - pri/alt = pri/alt + 1 DEC.pri/alt - pri/alt = pri/alt - 1 ZERO.pri/alt - pri/alt = 0 ZERO Adresa - [Adresa] = 0 ... 6. Operátor emit Možno viete, že bežne sa nepoužíva emit ale #emit. emit ani v bežnom compilery pribalenom v samp nieje. Tak prečo ho používam tu? emit má totiž niekoľko výhod. Je napríklad možné písať inštrukcie do {} takto. emit { const.pri 5 const.alt 5 add stor.pri r } Vďaka tomu nemusíte neustále písať emit. Ďalej bežný emit "vracia" hodnotu uloženú v pri, takže môžete napísať: new a = emit const.pri 4; printf("%i, %i", a, emit const.pri 7); // 4, 7 A taktiež umožnuje písať inštrukcie oddelené čiarkou do () takto: printf("%i", emit(const.pri 2, const.alt 4, add)); // 6 Toto vám umožní oveľa lahšie integrovať emit so svojim kódom. Taktiež to umožnuje používať emit v Makrách cez #define. Nakoniec emit narozdiel od #emit robí určité kontroly pri kompilácii. Ak napríklad dáte lokálnu premennú do LOAD.pri, tak vám napíše error. To je hlavný dôvod, prečo som zvolil operátor emit pre tento tutoriál miesto #emit. Ak však nepotrebujete žiadnu z týchto výhod, všetko v tomto tutoriály sa dá použiť taktiež s #emit. 7. Záver V ďalšom diely tohto tutoriálu sa vrhneme na funkcie a lokálne premenné, taktiež si povieme viac o stacku.
  10. Wrong Time Wrong Place

    návod Využití proměnných v praxi [ * ]

    Obtížnost: Obsah: 1. Úvod 2. Kdy proměnné využíváme? 3. Konkrétní příklady 4. Závěr 1. Úvod: Rozhodl jsem se zkusit napsat novou formu návodů. Bude se jednat o pokus-omyl, uvidím, jak se takový návod ujme. Mělo by se jednat o jakési doplnění návodů, které již na fóru jsou o jistou praxi. Protože teorie je super, ale pokud člověk vůbec nechápe, na co se co má používat, tak s Pawnem začít vůbec nemůže, protože ho odradí množství informací, které z návodu nedostal a sám si je nedomyslí. Před čtením tohoto návodu doporučuji přečtení čistě teoretických návodů k základům Pawn, abyste rozuměli, co se v kterých částech kódu má dít. Naleznete je zde: https://pawno.cz/index.php?/forum/149-pawn-pro-začátečníky/ Zejména pak bude potřeba teoretický návod k proměnným. https://pawno.cz/index.php?/topic/53319-1-proměnná/ 2. Kdy proměnné využíváme? Proměnnou můžeme využít v případě, kdy si chceme uložit jakoukoliv informaci pro další použití. stock JmenoHrace(playerid) { new UlozeneJmeno[24 + 1]; //Deklarovali jsme si proměnnou s velikostí pro string/řetězec 25. (24 je maximální délka nicku + nulový znak) GetPlayerName(playerid, UlozeneJmeno, sizeof(UlozeneJmeno)); //Pomocí funkce GetPlayerName zjistíme nick hráče s id "playerid". //To se nám uloží do proměnné UlozeneJmeno. //Operátor sizeof() vrací velikost datového typu nebo objektu v bytech. V tomto případě 24 + 1 = 25. //Jedno místo v proměnné je vyhrazeno pro nulový znak. return UlozeneJmeno; //Příkaz return znamená navrátit. //V tomto případě nám funkce navrátí proměnnou ve formě stringu/řetězce, která se nazývá UlozeneJmeno. } Tuto funkci nyní můžeme využít kdekoliv ve scriptu, aniž musíme znovu a znovu proměnnou deklarovat. 3. Konkrétní příklady: Příklady budou s minimálním počtem komentářů, k pochopení, co se děje v kódu si přečtěte teoretické návody, které jsem poslal výše. Již jednou zmíněná funkce pro zjištění hráčova jména: stock JmenoHrace(playerid) { new UlozeneJmeno[MAX_PLAYER_NAME + 1]; //MAX_PLAYER_NAME má v základním includu a_samp hodnotu 24, stejně je ale nutno počítat s nulovým znakem. GetPlayerName(playerid, UlozeneJmeno, sizeof(UlozeneJmeno)); return UlozeneJmeno; } //Do proměnné UlozeneJmeno se nám uloží nick hráče, který poté pomocí příkazu return navrátíme. Odeslání zprávy do chatu i s údaji (pozn.: Nutná funkce JmenoHrace): public OnPlayerCommandText(playerid, cmdtext[]) { if(!strcmp(cmdtext, "/pozdravit")) { new StringZpravy[40]; format(StringZpravy, sizeof(StringZpravy), "Hráč %s zdraví", JmenoHrace(playerid)); SendClientMessageToAll(-1, StringZpravy); return 1; } return 0; } //Abychom mohli odeslat zprávu, která bude obsahovat proměnnou, musíme si ji naformátovat. //K tomu potřebujeme vytvořit proměnnou pro samotnou zprávu. (StringZpravy) Změna textu, když hráč napíše zprávu (pozn.: Nutná funkce JmenoHrace): public OnPlayerText(playerid, text[]) { new StringZpravy[145]; format(StringZpravy, sizeof(StringZpravy), "Hráč {FF0000}%s {00FF00}píše: {FFFFFF}%s", JmenoHrace(playerid), text); SendClientMessageToAll(0x00FF00FF, StringZpravy); return 0; } //Opět potřebujeme zprávu naformátovat. Naformátovanou zprávu uložíme do proměnné StringZpravy a poté ji odešleme. //Jak vidíte, lze ve zprávách použít i barvy ve složených závorkách. Pro systém omezení použití (pozn.: Nutná funkce JmenoHrace): new bool:PouzilKit[MAX_PLAYERS]; public OnPlayerCommandText(playerid, cmdtext[]) { if(!strcmp(cmdtext, "/kit")) { if(PouzilKit[playerid]) { SendClientMessage(playerid, -1, "Kit už jsi použil."); return 1; } else { new StringZpravy[50]; format(StringZpravy, sizeof(StringZpravy), "Hráč %s použil kit", JmenoHrace(playerid)); SendClientMessageToAll(-1, StringZpravy); GivePlayerWeapon(playerid, 24, 100); GivePlayerWeapon(playerid, 26, 100); GivePlayerWeapon(playerid, 32, 250); GivePlayerWeapon(playerid, 35, 5); PouzilKit[playerid] = true; return 1; } } return 0; } public OnPlayerSpawn(playerid) { PouzilKit[playerid] = false; return 1; } //Logická globální proměnná PouzilKit bude obsahovat informaci true/false, která se nastaví po použití příkazu /kit. //Poté můžeme kontrolovat, zda hodnota je true či false a podle toho vykonat další kód. Pro omezení počtu zabití (pozn.: Nutná funkce JmenoHrace) (pozn.: POZOR NA FAKEKILL): new ZabilHracu[MAX_PLAYERS]; public OnPlayerDeath(playerid, killerid, reason) { ZabilHracu[killerid]++; if(ZabilHracu[killerid] < 5) { SendClientMessage(killerid, 0xD00000FF, "Nezabíjej ostatní!"); } else { new StringZpravy[60]; format(StringZpravy, sizeof(StringZpravy), "Hráč %s byl vyhozen za zabíjení hráčů.", JmenoHrace(killerid)); SendClientMessageToAll(0xD00000FF, StringZpravy); ZabilHracu[killerid] = 0; Kick(killerid); } return 1; } //Globální proměnná s celým číslem nám přičte jedna pokaždé, když hráč zabije jiného hráče. //Podle hodnoty údaje uloženého v proměnné budeme vykonávat další kód. 4. Závěr: Doufám, že takový formát návodů se uchytí. Připomínám, že návod nemá vystihnout, jak proměnné deklarovat, ale jejich praktické využití. Za konstruktivní kritiku budu rád.
  11. EnTeRs

    návod Anti Rcon hack

    Zdravím vás. Dnes vám zde dám návod jak udělat ochranu na Rcon Heslo. Hodně lidí si stěžuje že jim hackeři zjistí Rcon heslo přes Rcon Hack a neví co s tím a změna hesla nepomůže. Dnes vám ukážu jak tuto nočmí můru vyřešit. Ke všemu nám stačí public OnRconLoginAttempt(ip[], password[], success) __________________________________________________________________________________________________________________________________________________________________________ 1 napíšeme public [ OnRconLoginAttempt(ip[], password[], success) ] 2. Nadefinujeme si new který je potřeba pro další funkce. 3. Pokud vše máme tak do publicu OnRconLoginAttempt(ip[], password[], success) vložíme tento kod. TIP if(strcmp(name,"=]En[T]eRs[=" Toto v Kodu můžete najít, slouží to k tomu, pokud se hráč přihlásí za nick =]En[T]eRs[= tak ochrana mu přihlášení dovolí, tudíž hráč bude oprávněně přihlášen na rcon. Pokud hráč bude mít nick EnTeRs tak ho to vyhodí proto že takový hráč nemá oprávnění se přihlásit na rcon účet. To by bylo vše a pokud vám tutoriál pomohl budu rád. Kdyby s tím byli problémy, tak mi napište sem do komentářů a problém společně vyřešíme. Doporučení Nejlepší způsob je si AntiRcon Hack dát do GameModu ale pokud to je ve FilterScriptu nevadí to.
  12. Práca so súbormi Obtiažnosť - * * * * * Vitajte pri mojom prvom návode pre pawn. Dnes Vám ukážem niečo o práci so súbormi použitím includu "file". Tento include obsahuje funkcie, ktoré nám budú umožňovať pracovať so súbormi. Môžeme do nich zapisovať údaje, čítať údaje a omnoho viac. Mnohí z Vás pre toto používate tzv. "INI" includy, ktoré plnia tú istú úlohu, ale k tomuto sa dostaneme ešte neskôr. Čítajte prosím s porozumením! Otvorenie a zatvorenie súboru: Súbor otvoríme pomocou funkcie fopen, ktorá vráti tzv. "file handle" súboru, s ktorým budeme pracovať. Ak nastane nejaká chyba, táto funkcia vráti hodnotu 0. Súbor je vždy potrebné na konci zavrieť funkciou fclose! Argumenty (fopen): name[] - Umiestnenie súboru s jeho príponou na konci, ktorý sa nachádza v priečinku "scriptfiles". mode - Mód, ktorý určuje, ako budeme pracovať so samotným súborom. Viď všetky typy módov nižšie. Typy módov: io_read - Pre čítanie zo súboru. io_write - Pre zápis do súboru, vytvorí súbor, vymaže celý jeho obsah! io_readwrite - Pre čítanie aj zápis do súboru, ak súbor neexistuje vytvorí ho. io_append - Pre zápis na koniec súboru. Argumenty (fclose): File:handle - Ako ste sa mohli dočítať vyššie, je to premenná v ktorej je uložený "handle" súboru. Ukážka: new File:subor = fopen("subor.txt", io_readwrite); if (subor) { //Tu budeme pracovať so súborom. fclose(subor); } Otvorili sme súbor "subor.txt" v priečinku scriptfiles, pomocou módu io_readwrite. Potom sme pridali podmienku ak nenastala chyba pri otváraní súboru (ak by nastala chyba premenná by mala hodnotu 0). Ďalej už len budeme pracovať so samotným súborom. Na konci sme súbor zavreli, čím sa zapísaný obsah uložil. Zápis do súboru: Na zápis do súboru použijeme funkciu fwrite, ktorá zapíše do nášho súboru celý riadok ako string. Pokiaľ chcete vpísať do súboru znaky s diakritiou je tu druhá varianta, použitie funkcie fputchar. Je však o niečo pomalšia v rýchlosti ako prvá varianta. Argumenty (fwrite): File:handle - "Handle" súboru, do ktorého chceme vykonať zápis. string[] - String, ktorý chceme do súboru zapísať. Argumenty (fputchar): File:handle - "Handle" súboru, do ktorého chceme vpísať znak. value - Znak ktorý chcete vpísať, môže to byť ASCII, alebo UTF-8 hodnota. bool:utf8 = true - Má byť znak vpísaný ako UTF-8? (použite false, pokiaľ chcete vpísať znak s diakritikou) *Volitelný argument Ukážka: new File:subor = fopen("subor.txt", io_write); if (subor) { fwrite(subor, "Toto je string, ktory zapisujem do mojho suboru!"); fclose(subor); } Otvorili sme súbor a zapisáli do neho text, nakoniec sme ho zatvorili. Ukážka č.2: new File:subor = fopen("subor.txt", io_write); if (subor) { new string[7] = "Sanios"; for (new i; i < sizeof (string); i++) { fputchar(subor, string[i]); } fclose(subor); } Otvorili sme súbor a vpísali do neho text, znak po znaku, nakoniec sme ho zatvorili. Čítanie zo súboru: Pre čítanie údajov zo súboru môžme taktiež použiť dve varianty. Tá prvá je použitím funkcie fread, ktorá prečíta celý riadok zo súboru a uloží ho do stringu. Tá druhá varianta je čítanie znak po znaku, za pomoci funkcie fgetchar?. Táto varianta má svoju výhodu, ale aj nevýhodu. Tá výhoda je, že obsahuje argument "utf8", ktorý nám umožňuje prečítať taktiež znaky s diakritikou. Funkcia vráti ASCII, alebo UTF-8 hodnotu. Nevýhoda je, že je to o niečo pomalšie, ako funkcia fread, ktorá prečíta celý riadok. Argumenty (fread): File:handle - "Handle" súboru, z ktorého chceme čítať string[] - String, do ktorého chceme prečítaný text z riadka uložiť. size = sizeof string - Počet polí stringu, do ktorého ukladáme text. *Volitelný argument bool:pack = false - Má byť použitý "pack" stringu? *Volitelný argument Upozornenie! - Pozri si tiež na konci odsek "Možné chyby a ich oprava"! Argumenty (fgetchar): File:handle - "Handle" súboru, z ktorého chceme čítať bool:utf8 - Má byť znak prečítaný ako UTF-8? (použite false, pokiaľ chcete prečítať znak s diakritikou) Ukážka: new File:subor = fopen("subor.txt", io_read); if (subor) { new string[128]; fread(subor, string); printf("String: %s\nPrvý znak stringu je %c", string, fgetchar(subor, false)); fclose(subor); } Otvorili sme súbor s módom pre čítanie, prečítali sme z neho riadok a prečítaný string sme vypísali v konzole servera spoločne so začiatočným znakom riadku, nakoniec sme súbor zatvorili. Porovnanie s "INI" includmi: Určite mnohí z Vás používate na prácu so súbormi nejaké "INI" includy, ako je "y_ini", "DOF2", alebo "dini". Určite si kladiete otázku, prečo používať základné funkcie, keď mám rýchlejší includ. Toto nie je pravda. "INI" súbor má svoju výhodu v tom, že zapisuje riadky v tvare "name=value", resp. "key=value". To znamená, že výhodou je určite prehľadnosť vo Vašom súbore a vždy budete vedieť, ktorá hodnota k čomu patrí. Samozrejme výhodou includu "file" je predovšetkým rýchlosť! Pripravil som si pár testov rýchlosti o zápise a čítaní zo súboru. Testy Možné chyby a ich oprava: V tejto sekcii Vám napíšem niečo o možných chybách, ktoré môžu nastať. Nájdete tu pochopiteľne aj samotnú opravu chyby. 1. Funkcia strcmp nevráti hodnotu 0, pretože stringy sa nezhodujú: Toto je dosť častá chyba. Nastane vtedy keď ste prečítali obsah riadka pomocou funkcie fread. Prečo sa teda stringy nezhodujú, keď sú v súbore zapísané správne? Pretože na konci súboru ostali dva znaky "\r\n". Tieto znaky vyjadrujú, že sa jedná o nový riadok. Nachádzajú sa na konci každého riadku, okrem posledného. Pre inšpiráciu ako to v skutočnosti vyzerá: Oprava: new File:subor = fopen("subor.txt", io_read); if (subor) { new string[128]; fread(subor, string); //Prečítali sme riadok a na konci máme dva znaky "\r\n". strdel(string, strlen(string)-2, strlen(string)); //Vymažeme posledné dva znaky. } fclose(subor); Scripty na ukážku: Pridám Vám na ukážku aj nejaký scripty, k čomu môžete napríklad includ "file" využiť. 1. Záznam o vraždách: Tento jednoduchý skript bude v súbore zaznamenávať údaje o vraždách. Do súboru sa zapíše meno obete, meno vraha a dôvod, akým bola obeť usmrtená. 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. 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á..
  14. Potreboval by som sa (chcem) sa naučiť pawno, link na niaký návod ? Začiaťky ? Na samp server samozrejme. Ďakujem moc
  15. EnTeRs

    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
  16. 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; }
  17. 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ý.
  18. 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!
  19. 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.
  20. 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
  21. 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ý.
  22. 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
  23. 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.
  24. 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ú.
  25. 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ý
×