Jump to content

návod Biblia jazyka Pawn pre začiatočníka


Tanga

Recommended Posts

• Píšte mi SZ, že čo mám doplniť... Po 7 dňoch už nebudem môcť upraviť príspevok!

Úvod:
 • Si profesionál, ktorý je presvedčený, že tento návod byť dobrý nemôže. Pozri si len to čo potrebuješ, nič lepšie spraviť neviem ajtak.
 • Si začiatočník, ktorý sa chce naučiť pawn čo najrýchlejšie. Toto je najmenej zábavná časť pawna, ale vedieť ju musíš. Čítaj všetko zaradom.
Čo je to pawno:


 • Pawno je program s ktorým vytváraš veci do GTA. Jazyk, ktorý Pawno používa sa volá Pawn.
 • Pravdepodobne ho už máš stiahnutý (Pawno) so serverom, ak nie, sťahuj tu.


Prvý pohľad:


 • Pre tento návod budeš musieť upraviť súbor server.cfg v tom čo si stiahol na:

 

echo Executing Server Config...
lanmode 1
rcon_password asd
maxplayers 5
port 7777
hostname SA-MP 0.3 Server
gamemode0 Ucenie
filterscripts 
announce 0
query 1
chatlogging 0
weburl www.sa-mp.com
onfoot_rate 40
incar_rate 40
weapon_rate 40
stream_distance 300.0
stream_rate 1000
maxnpc 0
logtimeformat [%H:%M:%S]

 


 • Pravdepodobne si už otvoril aj nejaký ten skript, ak nie, choď do rozbaleného priečinka čo si stiahol, zložka pawno a otvor pawno.exe. Potom klikni vlavo hore na taký prázdny papier, čím otvoríš nový projekt.
 • Pre začatie programovania odtiaľ všetko zmaž a prilep tam toto:toto ešte nie je hrateľný mód, len vysvetlenie

 

#include <a_samp>

main()
{
    print("Tvoj server funguje!!!");
    return 1; 
}

 

•  Stlač F5 a vyskočí ti okno kam chceš súbor uložiť. Vyber priečinok gamemode v tom čo si stiahol a ulož to s názvom Uceniebez mäkčeňa. Vyskočí ti okno s textom
    Pawn compiler 3.2.3664              Copyright © 1997-2006, ITB CompuPhase - to len znamená, že súbor bol zakódovaný, aby ho vedel server prečítať. Ak ti tam zobrazuje niečo iné než tento text, je to buď chyba, alebo varovanie.
 • Spusti program samp-server.exe a vyskočí ti čierne okno s nejakými textami. To je tvoj server. Vidíš, že funguje. Môžeš ho zavrieť.
 • Riadok s príkazom print() zobrazuje správu v tom čiernom okne, tiež známom ako konzola, alebo server, alebo čierne okno :) .


Čo je čo - syntax:tvorba textu


 • Pri písaní "bloku" (dovtípiš sa nižšie) je vždy nutné ho vytvoriť aj zavrieť zátvorkami {, }.
Príkaz:


  • Príkaz sa píše v tvare:

príkaz(argument); // argument je to s čím príkaz pracuje

  • To je napríklad print. Tvar príkazu print je:

print(text);

 

Základná podmienka:


 • Základná podmienka - vykoná sa nejaký príkaz len v prípade, že sa niečo stane. Má nasledujúcu formu

if (podmienka) // if = ak (z angličtiny)
{
    príkaz(argument);
}
else if (podmienka)
{
    príkaz(argument);
}
...

 

Cyklus:


  • Cyklus je niečo, čo sa opakuje viac krát. Zatiaľ si uvedieme tiež len jeden typ - cyklus while (z angličtiny = "pokial"). Má takýto tvar:

while (základnápodmienka) // Pokial platí podmienka, bude sa to opakovať
{
    príkaz(argument);
}

• Rozdiel medzi podmienkou a cyklom - podmienka sa vykoná len raz a kód pokračuje ďalej, cyklus sa opakuje kým platí základná podmienka a ďalší kód sa dovtedy nevykoná.

Premenná:


  • Premenná je niečo, čo má nejakú hodnotu. Premenná môže byť "auto" a mať hodnotu "20€", ak je to Škoda 120. Môže byť "Meno hráča" a mať hodnotu "Tango". Použitie

new premenna = hodnota; // Textové premenné vysvetlujem nižšie.

  • Príklady na premenné:

new auto = 500;
new rychlost = 120;
new preplatok = 1;
new dlh = 984654896541968156478946541654687435468468796512321035746841318463249684632168798432169749685146984651;
new znamka = 5;

• Konštanta:Toto si nemusíš čítať


  • Doom bol poriadne podvedený - údajne mu povedali, že v pawn nie sú konštantné, odkazujem tím čo to povedali - "...".
  • Ak vytvárate niečo, čo sa nikdy nemení, je rýchlejšie a efektívnejšie použiť konštantu.
  • Konštanta je niečo, čo má stálu hodnotu - nemení sa. Zapisuje sa takto:

new const konstanta = hodnota;

  • Ako napríklad:

new const gravitacia = 9,81;
new const tangoveIQ = 160; 

* Dá sa vytvoriť aj pomocou #define.


 • String:


  • String z angličtiny znamená reťazec.
  • Predstav si premennú. Niečo = niečo. Predstav si tabulku - dva stĺpce. V prvom stĺpci je meno premennej a v druhom hodnota. Akokeby tým, že vytvoríš premennú jej pridelíš jednu bunku do ktorej sa potom zapisuje (len jedno číslo na jednu premennú). Tak a text funguje na tom istom princípe. Predstav si, že každý znak má jeden štvorček v ktorom je uložený... Povedzme, že je premenná X s textom a slovo "slovo" by teda potrebovalo 5 štvorčekov - na každé písmeno jedno. Teda v tabulke v riadku X by bolo 5 štvorčekov.
  • Definovanie textu vyzerá takto:

new premenna[pocetznakov];
premenna = "hodnota"; // treba dať do úvodzoviek

  • A použitie:

#include <a_samp>

main()
{
    new text[4];
    text = "ahoj";
    printf("%s", text); // AK nevieš prečo %s, kukni môj návod na FORMAT
    return 1;
}

 

• Reálne číslo:Aj s desatinnou čiarkou

  • Nie všade sa uspokojíš s číslom bez desatinnej čiarky. Napríklad poloha hráča je uložená presne na viac desatinných čísel. Ak chceš vytvoriť takú premenú, použi:

new Float:premenna = hodnota;

 

 

 • Práca s premennými:


1. Premena textu na celé číslo - číselnápremenná = strval(textovápremenná).

2. Premena celého čísla na text - valstr(textovápremenná, číselná).
3. Zaokrúhlenie desatinného čísla - číselnápremenná = floatround(desatinnápremenná, floatround_round).

 



• Čo je to funkcia:
  • To je ako ten main v príkladoch hore - funkcia je niečo, čo vracia po vykonaní hodnotu. Return z angličtiny znamená návrat - keď sa vykoná blok funkcie main, vráti hodnotu - 1 - je to funkcia.


Prvé programovanie:


  • Vždy keď dopíšeš tento kód, stlač F5 a spusti samp-server.exe - konzolu.
  • Pod programovaním myslím upravovanie kódu Ucenie, ktorý si vytvoril na začiatku.

  • Najprv si vyskúšaš, že ako to funguje - jednoduchý program, ktorý len pričituje číslo. Použije sa cyklus while.

#include <a_samp>

main()
{
    new i = 0;
    while (i < 5000) // dokým i je menšie než 5000
    {
    	i = i + 1;
    	printf("%d",i); // Toto je spôsob napísania hodnoty premennej. Keď si dočítate tento návod, pozrite si návod v mojom podpise FORMAT
    }
    return 1;
}

  • Ďalej príklad, ktorý zmení hodnotu konštanty:

#include <a_samp>

main()
{
    new const i = 0;
    while (i < 5000) // dokým i je menšie než 5000
    {
    	i = i + 1;
    	printf("%d",i);
    }
    return 1;
}

  • Vypísalo ti error 022: must be lvalue (non-constant) pri stlačení F5? Dobre, to znamená, že konštanta sa nedá upravovať. (spravil si to správne)
  • Teraz skúsme nejaké matematické operácie:môžeš si to robiť sám, ja ti len ukazujem ako by som toto spravil ja

#include <a_samp>

main()
{
    new prvecislo = 1;
    new druhecislo = 2;
    new tretiecislo = prvecislo + druhecislo; 
    new const vysledok = tretiecislo + 15; // Tu ti nevyhodí error, že konštantu meníš, pretože tu ju vytváraš
    printf("%d", vysledok + 10); // Tu ti tiež nevyhodí error, vypíše 28, lebo konštantu nezmení, len vypíše číslo o 10 väčšie 
    new styri = 2 * 2;
    printf("%d", styri / 2); // Vypíše 2
    return 1;
}

Teraz už normálny kód z SAMP:

#include <a_samp>

public OnPlayerConnect(playerid)
{
    SendClientMessage(playerid, 0xFFFFFFAA, "Vitaj, hráč, posielam ti správu!");
    return 1;
}

  • Presne tak... To je všetko z syntaxe jazyka pawn. Jediné čo treba už len naspamäť vedieť tieto publicy.


Matematické a logické operátory:Do rite nejde mi sem dať normálnu velkosť!

  • Matematické operátory sú tie, ktoré používaš v matematike :lol:  - znamienka. A logické sú tie, čo používaš v podmienkach. K tomu nemám moc čo dodať, akurát kompletný kód.

#include <a_samp>

main()
{
    new prvecislo = 1;
    new druhecislo = 2;
    new tretiecislo = prvecislo + druhecislo; // 3
    druhecislo = druhecislo + 1; // 3
    druhecislo += 1; // 3 - pričítanie o jedna
    druhecislo++; // 4 - pričítanie o jedna
    druhecislo -= 2; // 2 - odčítanie dvoch
    druhecislo--; // 1 - odčítanie jedného
    druhecislo *= 5; // 5 - vynásobí číslo piatimi
    druhecislo /= 5; // 1 - vydelí číslo piatimi
    new i = 0;
    while (i < 2)
    {
        druhecislo++;
        i++;
    } // druhecislo = 3
    if (druhecislo <= tretiecislo) // ak druhé číslo je menšie, alebo rovné tretiemu
    {
        if (druhecislo == tretiecislo) // POZOR: AK JE TO V PODMIENKE, ==, AK CHCEŠ ZMENIŤ PREMENNÚ TAK =
        {
            print("Tento vysledok nikdy neziskas.");
        }
    }
    if ((druhecislo == 5) && (1 == 1))
    {
        
    }
    return 1;
}


Otázky a odpovede:

 

  • Čo je to #include čo sa hore píše? To je vloženie kódu do tvojho kódu. Napríklad a_samp je kód, ktorý obsahuje funkcie zo sa-mp - napríklad poslanie správy - počítač totiž nevie čo to je bez a_samp. Môžeš si stiahnuť include policajné zbrane a príkazom PridajZbran() niekomu pridáš zbraň...
  • Únikové znaky:


• Únikové znaky to sú tie divné veci začínajúce lomítkom. Únikový znak je skratka pre niečo, čo by bol problém zapísať.
• Únikový znak vpíšeš do textu normálne akoby dve písmená.
• Môžete použiť napr.: "\n" čo je znak na nový riadok, "\a" čo je znak na pípnutie, "\b" čo je backspace, "\t" je tabulátor... Šak si ich vygooglite :).

 

#include <a_samp>

main()
{
    print("\aPrave som pipol");
    return 1;
}

 


  • Ak máš otázku, prosím pošli mi ju v SZ, aby sa nezaspamoval tento topic. Dakujem ;) .


Časté chyby:


 • warning 211: possibly unintended assignment - namiesto == si dal do podmienky =...
 • warning 217: loose indentation - zle si to odriadkoval - chýba medzera, alebo tak...
 • warning 201: redefinition of constant/macro - snažíš sa definovať niečo, čo už je. Predto daj riadok #undef PREMENNA
 • error 030: compound statement not closed at the end of file (started at line 5) - na konci kódu si neukončil podmienku.
 • error 003: declaration of a local variable must appear in a compound block - chýba ti dakde zátvorka {.
 • error 010: invalid function or declaration - neznáma funkcia - najčastejšie pri chýbajúcej zátvorke, alebo pri preklepe.
 • Ak ti nejaká častá chyba napadne, pošli mi to v SZ, aby tu nebol zaspamovaný topic. Ďakujem ;) .

 

 

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ý

Link to comment
Share on other sites

Asi najlepší návod čo si tu zatiaľ napísal, len...

 

main()

{
print("Tvoj server funguje!!!"); // v print nesmieš použiť mäkčene
return 1;
}

- mäkčene tam použiť môžeš.

 

Inak good..

Link to comment
Share on other sites

 

Príkaz:

Spoiler

  • Príkaz sa píše v tvare: príkaz(argument); // argument je to s čím príkaz pracuje

  • To je napríklad print. Tvar príkazu print je:

print(text);

 

to nejsou příkazy ale funkce skriptovacího jazyka pawn

 

Link to comment
Share on other sites

Hej, nižšie to rozoberám, že funkcie a príkazy....
Neviem či explicitne, ale niekde sa dole dá naraziť na to, že príkaz čo vracia hodnotu je funkcia.
Dík za opravu :).

Link to comment
Share on other sites

Sice ocenuji tvoji dobre minenou myslenku, ale musim upozornit na par nepresnosti...

1. príkaz(argument); "prikaz" je celkem matouci, radci bych pouzil slovo "funkce". Pod príkazem si každý představí "/command"

2.

if (podmienka) // if = ak (z angličtiny)
{
príkaz(argument);
}
else if (podmienka)
{
príkaz(argument);
}

je to matouci muzu pouzit:

if(podminka)

{

promena++;

}

 

nikde jsem nepouzil funkci, ale taky je to spravne, takze bych to spis napsal jako:

if (podmienka) // if = ak (z angličtiny)
{
//kod
}
else if (podmienka)
{
//kod
}

navic jsi nikomu nevysvetlil jak tam funguje to else, aby si ho zacatecnik nezacal psat za kazdou druhou podminku a pak se divil proc mu to nedela to co on chce.

3.

new const gravitacia = 9,81;

v pawnu se pouziva desetina tecka a ne desetina carka.

4. co se tyce cyklu, tak jsi opomenul cyklus for, ktery se vyuziva casteji nez while. Protoze se s nim pohodlneji pracuje, kdyz je treba prochazet napriklad promenou typu array.

 

5.

new dlh = 984654896541968156478946541654687435468468796512321035746841318463249684632168798432169749685146984651;

pawno umi jen do 2 147 483 647

Link to comment
Share on other sites

1. Dík to mi nenapadlo :)
2. Dobrý nápad
3. Áha, no jasne :d.
4. Chcem spraviť návod na for samostatne, keďže je tak využívaný.
5. To bol len vtip, že dlh je taký velký :d. Ináč ani na 64-bitovom PC by mi nezobralo viac než 2147483647? Toto som nevedel.

Link to comment
Share on other sites

Sice ocenuji tvoji dobre minenou myslenku, ale musim upozornit na par nepresnosti...

1. príkaz(argument); "prikaz" je celkem matouci, radci bych pouzil slovo "funkce". Pod príkazem si každý představí "/command"

2.

if (podmienka) // if = ak (z angličtiny)
{
príkaz(argument);
}
else if (podmienka)
{
príkaz(argument);
}

je to matouci muzu pouzit:

if(podminka)

{

promena++;

}

 

nikde jsem nepouzil funkci, ale taky je to spravne, takze bych to spis napsal jako:

if (podmienka) // if = ak (z angličtiny)
{
//kod
}
else if (podmienka)
{
//kod
}

navic jsi nikomu nevysvetlil jak tam funguje to else, aby si ho zacatecnik nezacal psat za kazdou druhou podminku a pak se divil proc mu to nedela to co on chce.

3.

new const gravitacia = 9,81;

v pawnu se pouziva desetina tecka a ne desetina carka.

4. co se tyce cyklu, tak jsi opomenul cyklus for, ktery se vyuziva casteji nez while. Protoze se s nim pohodlneji pracuje, kdyz je treba prochazet napriklad promenou typu array.

 

5.

new dlh = 984654896541968156478946541654687435468468796512321035746841318463249684632168798432169749685146984651;

pawno umi jen do 2 147 483 647

 

ATomasi chtěl bych se zeptat jaký je rozdíl nebo jak se používá const

Link to comment
Share on other sites

 

ATomasi chtěl bych se zeptat jaký je rozdíl nebo jak se používá const

Jak bylo receno, je to pevne nastavena hodnota promene, kterou nelze zmenit.

Ovsem nevidim tam vyuziti, osobne pouzivam define, protoze to zmeni tu hodnotu pri kompilaci, tedy je to rychlejsi nez tu promenou hledat v pameti. Ale mozna je to pozustatek ze starych jazyku, treba pascal zadne define nema tam vyuziti constanty nejake je :d

Link to comment
Share on other sites

ATOMAS:
Ja by som to const ani neuvádzal, lenže DOOMa raz potrollili, že const neexistuje..
Chcel som napísať define, ale tam explicitne nevidieť, že je to konštanta, tak som použil const.
Osobne by som const v živote nepoužil, define zriedka :d.

Link to comment
Share on other sites

Vlastne jsem si vzpomel k cemu by se const dal vyuzit :)

 

Kdyz mas nejakou funkci, do ktere odesilat nejaky udaj, a potrebujes udelat, aby ten udaj nesel zmenit. V podstate const je takova pojistka proti tomu, aby sis ty sam omylem neco nezmenil, kdyz to menit nechces. V podstate te pak compiler upozorni, ze upravujes neco, u ceho sis upravu bloknul.

 

treba:

stock fce(const parametr)
{
parametr = 5;//tady by ti to mnelo hodit chybu..
return 1;
}
Link to comment
Share on other sites

 

Vlastne jsem si vzpomel k cemu by se const dal vyuzit :)

 

Kdyz mas nejakou funkci, do ktere odesilat nejaky udaj, a potrebujes udelat, aby ten udaj nesel zmenit. V podstate const je takova pojistka proti tomu, aby sis ty sam omylem neco nezmenil, kdyz to menit nechces. V podstate te pak compiler upozorni, ze upravujes neco, u ceho sis upravu bloknul.

 

treba:

stock fce(const parametr)
{
parametr = 5;//tady by ti to mnelo hodit chybu..
return 1;
}

 

Tak to se celkem hodí ;) ještě bych se chtěl zeptat když definuji u stocku nebo u publicu nějaké no dám příklad...

 

stock GetPlayerStats(playerid,money=-1)

Když tam nedám money a použiji to takto : GetPlayerStats(playerid) tak mi to doplní automaticky hodnotu -1 ale co když tam těch proměnných mám více ? Jak se pawn zachová .. Když použiji: stock GetPlayerStats(playerid,money=-1,points=-1) A co když to použiji takto: GetPlayerStats(playerid,/*Tady jakože money*/,100); A jak se pawn zachová bude to brát jako money nebo points

Link to comment
Share on other sites

Pokud tam mas vice "defaltnich" parametru. A potrebujes nejaky preskocit, tak to nejde. Musis ho zadat. Jinak to bere jak oten dalsi parametr.

GetPlayerStats(playerid,100);//money = 100 points = -1;
GetPlayerStats(playerid,-1,100);//money = -1 points = 100;
Link to comment
Share on other sites

 

Vlastne jsem si vzpomel k cemu by se const dal vyuzit  :)

 

Kdyz mas nejakou funkci, do ktere odesilat nejaky udaj, a potrebujes udelat, aby ten udaj nesel zmenit. V podstate const je takova pojistka proti tomu, aby sis ty sam omylem neco nezmenil, kdyz to menit nechces. V podstate te pak compiler upozorni, ze upravujes neco, u ceho sis upravu bloknul.

---------------

Ináč to mám napísané aj v tom príspevku hore xDDDDDDDDDDDDDDDDD.

Isigar píš si SZ a nie také veci čo sú dokonca napísané hore...

Link to comment
Share on other sites

  • 3 weeks later...
  • Hlavní moderátor

 

Pokud tam mas vice "defaltnich" parametru. A potrebujes nejaky preskocit, tak to nejde. Musis ho zadat. Jinak to bere jak oten dalsi parametr.

GetPlayerStats(playerid,100);//money = 100 points = -1;
GetPlayerStats(playerid,-1,100);//money = -1 points = 100;

 

jde to:

GetPlayerStats(playerid,.points = 99); //money zůstane -1, points bude 99

tím, že před parametr uvedeme tečku, pak jeho identifikátor a nakonec mu přiřadíme hodnotu, kterou chceme, můžeme vynechat defaultní parametry, které jsou před ním (použití je uvedeno třeba zde, u této fce jsou všechny parametry defaultní, tudíž je zde pěkně vidět, že pomocí tohoto můžeme porušit pořadí parametrů)

toto ale opravdu nepatří do tutoriálu pro začátečníky, omlouvám se autorovy, jen jsem chtěl podotknout, že to, na co se Isigar ptal, je možné

Link to comment
Share on other sites

jde to:

GetPlayerStats(playerid,.points = 99); //money zůstane -1, points bude 99

tím, že před parametr uvedeme tečku, pak jeho identifikátor a nakonec mu přiřadíme hodnotu, kterou chceme, můžeme vynechat defaultní parametry, které jsou před ním (použití je uvedeno třeba zde, u této fce jsou všechny parametry defaultní, tudíž je zde pěkně vidět, že pomocí tohoto můžeme porušit pořadí parametrů)

toto ale opravdu nepatří do tutoriálu pro začátečníky, omlouvám se autorovy, jen jsem chtěl podotknout, že to, na co se Isigar ptal, je možné

:o A já už myslel že nikdy nepříjdeš

Link to comment
Share on other sites

---------------

Ináč to mám napísané aj v tom príspevku hore xDDDDDDDDDDDDDDDDD.

Isigar píš si SZ a nie také veci čo sú dokonca napísané hore...

Ne tohle tam nemas :d

Ty tam mas pouze definovanou promenou, coz jsem rikal ze tam nevidim vyuziti kdyz existuje define, ktery se prepisuje pri kompilaci. Takze jedine vyuziti const vydim v callbacku, ale opet jen jako antiblbostni pojistku :d

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...