Jump to content

Základy Pawn


Petr

Recommended Posts

Zdravím,

jsem tu s dalším tutoriálem, tentokrát se podíváme na základní syntaxi jazyku Pawn.

_____________________________________________________

0) Obsah:

1) Proměnné

2) Funkce

3) Public

4) Podmínky

_____________________________________________________

1) Proměnné:

v Pawn se vyskytují 2 druhy proměnných podle oblasti působnosti:

A) Globální (Global) (1.1)

B) Lokální (Local) (1.2)

Mohou se také rozdělit typy proměnných, podle obsahu, pro který jsou určeny:

I) Integer (=Celé číslo)

II) Float (=Desetinné číslo)

III) String (=Textový řetězec)

IV) File (=Proměnná pro soubory)

V) Boolean (=Hodnoty true[1]/false[0])

VI) Text (=Textdrawy)

VII) Text3D =(3D Text :d )

 

 

1.1 Globální

V překladu to jsou ty proměnné, které využíváte kdekoli v celém vašem scriptu. V praxi to znamená, že to jsou ty, které vytváříte pomocí new nahoře před prvním callbackem. Samozřejmě to tak nemusí být, můžete si ji vytvořit i někde jinde, ale musíte splňovat 1 pravidlo (viz dole).

 

Využití těchto proměnných:

* Objectid, vehicleid, ...

* Timery

* Hodnotých zakázaných věcí (Zbraně, ... )

* Různé proměnné, které musíte použít ve více callbacích

____________________

 

1.2 Lokální

Naopak tento typ proměnné, nazývající se lokální, můžete využít pouze v oblasti, pro kterou ji vytvoříte. Napsal jsem to asi blbě, vysvětlím to na příkladu. Máte proměnnou, kterou použijete POUZE v 1 callbacku, nemá tedy cenu ji tvořit jako globální, ale je výhodnější ji vytvořit jako lokální pro daný callback. Týkat se to může i stocků, oblastí podmínek, ...

 

Využití:

* Proměnné, využité pouze v 1 callbacku

* Proměnné, u kterých je nutno zajistit, aby se na nich udržela správná hodnota při křížení akcí. (= Hlavně stringy, je lepší si string vytvořit jako lokální proměnnou než jako globální, může nastat, že se poté vpíše úplně jiný obsah, než jsme požadovali.)

____________________

 

Proměnné můžeme také rozvětvovat do pole proměnných

Př.: promenna[pole][pole2]...

 

POZOR: Při použítí rozvětvování se vám násobí počet proměnných, podle velikosti pole.

POZOR: Maximální počet polí v promenný jsou 2!

Využití:

* Různé systémy (House, vehicle, ...)

* Zakázané zbraně, vozidla, ...

* Rozvětvení proměnné pro každého hráče

 

POZOR: Pokud chcete použít takovouto proměnnou, musíte ji také náležitě vytvořit.

new promenna[MAX_HODNOTA][MAX_HODNOTA2];

kde MAX_HODNOTA a MAX_HODNOTA2 jsou hodnoty, které určují Maxmální hodnotu pole - 1

 

Vytvoření proměnné

New

New nám prostě jednoduše vytvoří proměnnou. Nevím co k tomu napsat, asi jen to, že název proměnné v něm musí odpovídat názvu proměnné při používání.

 

Zde také definujete typ proměnné (viz nahoře) a další věc je ta, že zde i vytváříte pole (viz také nahoře), přičemž vyplňovaná hodnota je maximální hodnota pole.

 

new bool:Zaklad[50];

Vytvoří proměnnou "Zaklad" typu boolean s velikostí pole 50 (0 - 49).

 

 

Static

static také vytvoří proměnnou, ale my už máme new, k čemu static? Nejlepší bude, když Vám to ukážu na příkladu:

Máme public, ve kterým chceme, aby se při každém načtení zvýšila hodnota lokální proměnný o 1

Když ale použijeme toto...:

Public blabla() {

new A;

A++;

print("%d", A);

return 1;

}

...tak to bude vypisovat pokaždé hodnotu 1? Proč? Standartní hodnota při vytvoření proměnný je 0. Přičteme 1. Máme 1. Vypíšeme. Public naběhne znovu. ALE opět se vytvoří proměnná s hodnotou 0. A jedeme znovu.

 

Když to ale použijeme takto...:

Public blabla() {

static A;

A++;

print("%d", A);

return 1;

}

Tak se nám hodnota A "uloží", i když už public skončí a poté se načte znovu. Výpis tedy bude: 1,2,3,4,5,6,...

static tedy zajistí, že se hodnota uchová.

ffredyk: "static je globální proměnná na lokální použití."

 

Platí zde stejná pravidla jako u new

_____________________________________________________

 

 

2) Funkce:

Další věc, co bych mohl probrat jsou funkce.

Každá funkce má svůj Název. (2.1) :d

Dále také muže obsahovat:

* Parametry (2.2)

* Return (2.3)

 

2.1 Název:

Nebudu to asi rozepisovat, myslím, že by vám mohlo stačit pár příkladů.

CreateVehicle

AddPlayerClass

SetPlayerColor

 

2.2 Parametry:

Slouží vlastně k nastavení atribut toho, co funkce vykonává. Uvedu šablonu a poté příklad:

Funkce(P1, P2, P3);

SendClientMessage(playerid, COLOR_WHITE, "Blabla");

Myslím, že jasné ne?

 

Do parametrů můžete dosazovat promenné (které jsme se naučili výše) nebo rovnou hodnoty (Integer, Float, String).

 

POZOR: Každá funkce má vlastní specificky nastavené parametry

 

2.3 Return:

Zdálo by se, že je to vše k základu funkcí. Není tomu tak, poslední část je Return. Return navrací specifickou hodnotu, kterou má každá funkce předvolená. Není to však tak, že každá funkce vrací hodnotu. Return funckí je vlastně vysvětlení toho, proč před CreateVehicle cpete tu proměnnou, abyste pak to auto mohli upravovat. CreateVehicle totiž vrací svoje vehicleid a to se uloží do proměnné.

 

Příklady funkcí s returnem:

CreateVehicle

CreateObject

CreatePickup

GetPlayerVehicleID

GetPlayerColor

 

POZOR: Zdálo by se že i GetPlayerName, není tomu tak.

Využití returnu:

new vehicleid = CreateVehicle(...);

AddVehicleComponent(vehicleid, 1010);

 

 

 

TIP: Všechny parametry, returny najdete na wiki.sa-mp.com

 

 

Určitě jste viděli kód, kde byla třeba funkce AddHouse. Přitom taková to funkce neexistuje. Jak to ten týpek udělal? No vytvořil si vlastní funkci.

 

Můžeme se rozhodnout:

A) Pokud je funkce relativně malá, můžeme ji uložit do mezipaměti (stock)

B) Když je ale větší, je lepší si pro ni udělat public a načítat ji přímo z pawn souboru.

Využijeme A, protože o B si něco řekneme později.

 

stock MojeFunkce(par1, par2) {

/*

kód mé funkce

*/

return HODNOTA_RETURNU_MÉ_FUNKCE;

}

 

Můžete takto vytvořit právě ten dům s využitím proměnných s polem. Samozřejmě i cokoli jiného ale není problém takto udělat. (Pozor na ty velikosti)

_____________________________________________________

 

3) Public

A) Standartní (3.1)

B) Vytvořený (3.2)

 

Už jsem o tom mluvil výše ve funkcích, public se na serveru vyvolává přímo z PAWN souboru oproti stocku, který je uložen v mezipaměti. Je tedy vhodnější pro obsáhlejší operace.

 

Změna tady je, že každý public musí mít nějáký return.

 

Př.:

forward MujPublic(

 

3.1 Standartní:

Co k tomu asi říct. No je to public, který uže máte vytvořený SAMP týmem v pawnu. Každý se vyvolává při jiné akci, máte to napsané i v názvu publicu. Ukážu rovnou příklady:

OnGameModeInit, OnPlayerRequestClass, OnDialogResponse, ...

 

Tyto publicy můžeme také rozdělit takto:

I) Vykoná se při akci serveru (OnGameModeInit, OnFilterScriptInit, ...)

II) Vykoná se při akci hráče (OnPlayerConnect, OnPlayerSpawn, ...)

 

 

3.2 Vytvořený:

Je tu jedna změna oproti funkcím. Musíte public předvytvořit pomocí funkce forward.

 

POZOR: Do forward musíte dát parametry, které chcete použít v public, navíc i ve stejném pořadí.

 

Př.:

forward MujPublic(Parametr1, bool:Parametr2, Float:Parametr3, Parametr4[]);

 

public MujPublic(Parametr1, bool:Parametr2, Float:Parametr3, Parametr4[]) {

Potom si dáte funkce který chcete, samozřejmě nezapomenout return.

 

No a public máte vytvořený. Ale jak ho vyvoláme? Existuji 3 možnosti.

 

1) Timer (SetTimer, SetTimerEx)

2) CallLocalFunction (vyvolá public, který MUSÍ být ve stejném scriptu, jako tato funkce)

3) CallRemoteFunction (vyvolá public, který MŮŽE být i v jakémkoli jiném aktivním scriptu na serveru)

 

Tip: Doporučuji si tyto funkce projít na wiki.

 

_____________________________________________________

4. Podmínky

Podmínky, problém mnoha lidí, přitom je to tak jednoduché. Rovnou ukážu příklad.

if(Hodnota1 == Hodnota2) {

Celá podmínka vlastně znamená: "Pokud je Hodnota1 rovna Hodnota2".

Ale teď, jak tam dostaneme ty funkce? Zarolujte si nahoru do kapitoly 2.3.

Ano, return nám pomůže, ten nám totiž vrací hodnotu funkce, kterou my potřebujeme do porovnání v podmínce. Můžeme tedy použít:

if(IsPlayerAdmin(playerid) == 1) {

TIP: " == 1)" můžeme vynechat, když se jedná o podmínky true/false (pravda/nepravda), 1 je totiž standartní hodnota u tohoto typu.

 

A teď jaké máme možnosti. Ukážu zase na příkladu: Pozn.: (X Kč = X/24,59 EUR)

"Pokud koupíš 10 rohlíků, musíš zaplatit 20 Kč, nebo pokud koupíš 5 rohlíků, musíš zaplatit 10 Kč."

V překladu do pawnerštiny to bude takto:

if(Rohliku == 10) {

//zaplať 20 Kč

}

else if(Rohliku == 5) {

//zaplať 10 Kč

}

Co tam dělá to else? No to je to slovíčko nebo. Přece buď si koupím 5 rohlíků, nebo si jich koupím 10. Příjdeš k pokladně, a prodavačka se tě zeptá. "Máte 5 nebo 10 rohlíků?" a nebude se ptát. "Máte 10 rohlíků?" a potom "Máte 5 rohlíků?".

Kdyby se takto ptala na vše, tak bych ji musel zabít :d

 

No to ale není vše. Ještě dáme jeden příklad.

"Když nakoupíte za 500 Kč, obdržíte od nás zdarma kopanec do prdele, pokud nakoupít za míň, dostanete 2x nakopáno."

Bude to vypadat takto:

if(CenaNákupu >= 500) {

//Dostal jsi nakopáno do prdele.

}

//No ale jak to vyřešit teď? Else if by se dalo použít, ale je to zbytečné. uKážu na obrázku.

podminka.png

Červená oblast je ta, kterou nám zabírá první podmínka. Zbýva pak už jen ta druhá. Je tedy pro nás výhodnější použít Pouze else (nebo)

Celý to bude znít:

"Pokud je CenaNákupu větší/rovno 500 (tak se stane to a to...) NEBO (je menší) (tak se stane to a to...)"

Celý to tedy bude vypadat takto:

if(CenaNakupu >= 500) {

//Kopanec

}

else {

//2x Kopanec

}

Tip: Operátory, které můžete použít, najdete ZDE

 

 

Uf, teď už se mozek zavařil, psal jsem to totiž podruhý, poprvý mě zradila technika, zrovna když jsem to neměl uloženy. :d

 

PS: Počítám s tím, že mě někdo vytknete moje nazvosloví, něco jsem prostě nevěděl jak nazvat. :p

Snad jsem tam nic nedosral, psal jsem to rovnou a nečetl jsem to po sobě, kdyby něco pište, opravím. :)

 

Později sem ještě doplním:

for, switch, while, atd.

 

Poděkování:

ffredyk - online úprava profesionálního názvosloví (říkal jsem to, že někdo bude to názvosloví kritizovat) :d :D

Link to comment
Share on other sites

good 10/10

btw. tobě se dneska něja líbí psát TuT-y :d jo a není tohle tady už po 2.? :d

 

Toto byl 1., pak jsem napsal další 2, něják jsem se nudil no :d

Díky za hodnocení

Link to comment
Share on other sites

Necital som to cele, ale...

I) Integer (=Celé číslo)

II) Float (=Desetinné číslo)

III) String (=Textový řetězec)

IV) File (=Proměnná pro soubory)

je rovnake, ako napisat, ze jedla su: Chlieb, Pecivo, Zakusok a Jablko. Zabudol si na vela podstatnych datovych typov.

Link to comment
Share on other sites

Necital som to cele, ale...
I) Integer (=Celé číslo)

II) Float (=Desetinné číslo)

III) String (=Textový řetězec)

IV) File (=Proměnná pro soubory)

je rovnake, ako napisat, ze jedla su: Chlieb, Pecivo, Zakusok a Jablko. Zabudol si na vela podstatnych datovych typov.

 

Zkus přečíst nadpis, základy :)

Link to comment
Share on other sites

Meh, no tak napriklad taky datovy typ boolean je o vela dolezitejsi v zakladoch, ako datovy typ File.

 

Já ho tam nedal? A sakra, tak to jo, sry, to jsem zapomněl :)

GJ :thumbup:

Link to comment
Share on other sites

  • 2 weeks later...
":2ziw32sf]
Necital som to cele, ale...
I) Integer (=Celé číslo)

II) Float (=Desetinné číslo)

III) String (=Textový řetězec)

IV) File (=Proměnná pro soubory)

je rovnake, ako napisat, ze jedla su: Chlieb, Pecivo, Zakusok a Jablko. Zabudol si na vela podstatnych datovych typov.

 

Zkus přečíst nadpis, základy :)

 

mohl by si me priucit osobne treba prez skype "fresse"

Link to comment
Share on other sites

Tak se nám hodnota A "uloží", i když už public skončí a poté se načte znovu. Výpis tedy bude: 1,2,3,4,5,6,...

static tedy zajistí, že se hodnota uchová.

ffredyk: "static je globální proměnná na lokální použití."

 

co to ??? :lol:

Link to comment
Share on other sites

Tak se nám hodnota A "uloží", i když už public skončí a poté se načte znovu. Výpis tedy bude: 1,2,3,4,5,6,...

static tedy zajistí, že se hodnota uchová.

ffredyk: "static je globální proměnná na lokální použití."

 

co to ??? :lol:

 

Ale ffredykovi se sem tam nelíbilo moje názvosloví, tak jsem ho ocitoval, než abych si jeho definici přivlastnil :d

 

_______________

wow pekne...

 

ps. chýba tam

 

Text3D:

Text:

A ešte niečo nespomeniem si.

BTW mohol si spomenúť ako sa vytvorí vlastný typ premennej :d npr.

new Q:premena;

 

:p

 

Díky, chtěl jsem tam původně dát jenom ty základní, ale když už jsem tam nacpal file, tak tam dodám i tyto, co jsi psal.

Link to comment
Share on other sites

  • 4 months later...
  • 4 months later...

Prekrásne tak toto ma fascinovalo :d pak v 2 casti bys mohol rozpisať tie textdrawy dialogy infoboxy ci jak je ta tabulka druha a nejake malickosti este :d 1o/1o

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...