What's new

-Średni Od zera do skryptera - czyli poradnik LUA!

Karpio

Advanced User
Joined
Apr 11, 2008
Messages
369
Reaction score
58
Witam! Jest to m?j pierwszy poradnik, wi?c licz? na ostre komentarze. W poradniku opisz?:
1. Og?lnie o LUA.
2. Pocz?tek skryptu.
3. U?ycie if’?w.
4. Zmienne.
5. Tablice.
Funkcje zwi?zane z tablicami.
6. P?tle
a) FOR
b) WHILE
7. Komentarze.
8. Ciekawe funkcje.
Ad. 1 – Og?lnie o LUA.​
Lua - j?zyk programowania pierwotnie zaprojektowany dla rozszerzenia funkcjonalno?ci r??nych aplikacji, jednak cz?sto u?ywany jako samodzielny j?zyk. Lua wi??e w sobie prost? sk?adni? procedury (podobn? do Pascala) z konstrukcjami opisu danych opartymi na tablicach asocjacyjnych i rozszerzalnej semantyce.
J?zyk ten zaimplementowany jest jako ma?a biblioteka j?zyka C napisana wg standardu ANSI C. Celami implementacji s?: prostota, wydajno?? i przeno?no?? kodu.
Jest on cz?sto u?ywany w OpenTibia Serverach do tworzenia skrypt?w m.in. czar?w, wykonywania polece?, a tak?e w modyfikacji MTA:SA do tworzenia gamemod?w i skrypt?w. Opr?cz tego, ca?y interfejs gier takich jak World of Warcraft, Runes of Magic czy RObLOX opiera si? na technologiach XML i w?a?nie j?zyku skryptowym Lua. Modyfikacja Garry's Mod prawie ca?kowicie opiera si? na dodatkach napisanych w Lua przez fan?w.
//Wikipedia​
Ad. 2 – Pocz?tek skryptu.​
Skrypt zaczynamy od zadeklarowania funkcji (np. function onTimer()), a ko?czymy s?owem end (z ang. Koniec). Na przyk?ad:
function onSay(cid, words, param, channel)
-- kod skryptu
end
Obja?nienie:
  • function – pokazuje, w kt?rym miejscu zaczyna si? skrypt
  • onSay – w tym wypadku chodzi o funkcj?, gdy gracz wypowie dane s?owo
  • (cid, words, param, channel) – wszystko co znajduje si? w nawiasie to tzw. Sta?e. Maj? one przypisan? z g?ry warto?? i mo?na ich u?ywa? w skrypcie.
  • --kod skryptu – do skryptu mo?na wprowadza? r??ne komentarze, ale o tym w rozdziale o komentarzach
  • end – zako?czenie funkcji
Przyk?adowy skrypt:
function onSay(cid, words, param, channel)
doPlayerSendTextMessage(cid, 22, "Wyswietli si? zielony napis.")
end
Funkcje zaczynaj?ce skrypt:
Actions
onUse(cid, item, fromPosition, itemEx, toPosition)
Creaturescripts
onLogin(cid)
onLogout(cid)
onAdvance(cid, skill, oldLevel, newLevel)
onStatsChange(cid, attacker, type, combat, value)
onDirection(cid, old, current)
onSendMail(cid, receiver, item, openbox)
onReceiveMail(cid, sender, item, openbox)
onTradeRequest(cid, target, item)
onTradeAccept(cid, target, item, targetItem)
onJoinChannel(cid, channel, users)
onLeaveChannel (cid, channel, users)
onLook(cid, thing, position, lookDistance)
onThink(cid, interval)
onTextEdit(cid, item, newText)
onReportbug(cid, comment)
onAreaCombat(cid, tileItem, tilePosition, isAggressive)
onTarget(cid, target)
onFollow(cid, target)
onCombat(cid, target)
onAttack(cid, target)
onCast(cid, target)
onKill(cid, target, lastHit)
onDeath(cid, corpse, deathList)
onPrepareDeath(cid, deathList)
Globalevents
onThink(interval, lastExecution, thinkInterval)
onStartup()
onShutdown()
onRecord(current, old, cid)
onTimer()
Movements
onStepIn(cid, item, position, lastPosition, fromPosition, toPosition, actor)
onStepOut(cid, item, position, lastPosition, fromPosition, toPosition, actor)
onEquip(cid, item, slot)
onDeEquip(cid, item, slot)
onAddItem(moveItem, tileItem, position, cid)
onRemoveItem(moveItem, tileItem, position, cid)
Spells
onCastSpell(cid, var)
Talkactions
onSay(cid, words, param, channel)
Weapons
onUseWeapon(cid, var)
Ad. 3 – U?ycie if’?w.​
W ka?dym skrypcie mo?na stawia? warunki: if, elseif oraz else. Ka?dy if musi by? zako?czony end’em. Przyk?ad:
if(getPlayerLevel(cid) == 1) then
--kod
elseif(getPlayerLevel(cid) == 2) then
--kod
else
--kod
end
Obja?nienie:
* if – czyli warunek je?li co? r?wna si? czemu? to
* elseif – mo?e by? u?yty wiele razy po if’ie
* else – je?eli wcze?niejsze warunki nie zosta?y spe?nione to wykona si? fragment za else
* end – zako?czenie if’a
* then – u?ywane po zapisie warunku w if oraz elseif

Ad. 4 – Zmienne.
Zmienne mog? by? lokalne i globalne. U?ywa si? ich do zapami?tywania i przekazywania danych.
Zmienne lokalne:
- zaczynaj? si? od s?owa local, np.
local a = 1
- zmienne te dotycz? tylko danego bloku if’a je?li zosta?y w nim zadeklarowane lub ca?ego skryptu je?li zapisano je na pocz?tku
Zmienne globalne:
- posiadaj? ?adnego przedrostka, np.
- zmienne te dotycz? zawsze wszystkich skrypt?w i s? najd?u?ej przechowywane w pami?ci
U?ycie zmiennych lokalnych w przyk?adzie:
function onTimer()
local time = os.time()
dobroadcastMessage("Obecny czas to "..time..".")
return true
end

Ad. 5 – Tablice.​
Tablice s? przydatne je?li chcemy zapisa? wi?ksz? ilo?? danych. Dane te zawsze oddzielone s? przecinkiem. Zapis danych w tablicy mo?e by? nast?puj?cy:
  1. {1,2,3,4,5,6}
  2. {x=1,y=2,z=3}
  3. jest jeszcze inny spos?b (mieszany: {a=1, 5, 4, x=1000}), ale nie b?d? o nim pisa?, gdy? jest ma?o wygodny.
Skoro ju? wiemy jak wygl?daj? dane w tablicy to najwy?szy czas nauczy? si? je zapisywa? i pobiera?. Zapis wygl?da tak:
local tablica = {1,2,3,4,5}
Przy sposobie 1. dane z tablicy pobiera si? poprzez tablica[index], gdzie tablica to zmienna zawieraj?ca tablic?, a index to pozycja, z kt?rej chcemy pobra? dane.
Z kolei w sposobie 2. pobiera si? dane przez tablica.index, gdzie index to nazwa zmiennej w tabeli, np. x, y z przyk?adu.
Dodawa? dane do tabeli mo?e trzema sposobami:
1. tabela[index] = warto?? (w tabeli {1,2,3})
2. tabela.index = warto?? (w tabeli {x=1,y=2})
3. table.insert(tablica, [pozycja,] warto??)
Ad. 5.1 – Funkcje zwi?zane z tablicami​
a) table.insert(tablica, [pozycja,] warto??)
za pomoc? tej funkcji mo?emy „wstrzykn??” do tablicy dan? warto??, np.
local tablica = {1,2,3,4,5,6,7}
table.insert(tablica, 8)
print(unpack(tablica))
Funkcja unpack u?yta w przyk?adzie ‘rozpakowuje’ tablic?. Efektem dzia?ania naszego przyk?adu b?dzie:
1 2 3 4 5 6 7 8
a teraz inny przyk?ad:
local tablica = {2,3,4,5,6,7}
table.insert(tablica, 1, 9)
print(unpack(tablica))
A teraz otrzymamy:
9 2 3 4 5 6 7
gdy? w table.insert() podali?my dok?adn? pozycj?, gdzie ma zosta? „wstrzykni?ta” liczba 9.
b) table.foreach(tablica, funkcja)
Za pomoc? tej funkcji mo?emy po kolei pobra? dane z tabeli i wrzuci? je do kolejnej funkcji, np.
local tablica = {1,2,3,4,5,”LOL”}
table.foreach(tablica, print)
print jest w tym wypadku u?yt? przez nas funkcj?. Jej parametrami zostan? index oraz warto?? z tablicy. Wynikiem dzia?ania przyk?adu b?dzie:
1 1
2 2
3 3
4 4
5 5
6 LOL
c) table.sort(tablica [, funkcja])
Funkcja ta sortuje nam dane w tablicy, np.
local tablica = {5,9,-1,-99,1,6,87}
table.sort(tablica)
print(unpack(tablica))
w rezultacie otrzymamy:
-99 -1 1 5 6 9 87
Jak wida? warto?ci s? poustawiane rosn?co, a co je?li my wolimy malej?co?
local tablica = {5,9,-1,-99,1,6,87}
table.sort(tablica, function(a,b) return a > b end)
print(unpack(tablica))
Tym razem otrzymamy wynik przeciwny:
87 9 6 5 1 -1 -99
w podobny spos?b mo?emy napisa? inne funkcje, kt?re b?d? sortowa?y warto?ci tak jak sobie tego za?yczymy.
d) table.getn(tablica)
Funkcja ta zlicza ilo?? danych w tabeli, np.
local tablica = {1,2,3,4,5,6,7,8,9}
print(table.getn(tablica))
funkcja ta wy?wietli nam:
9
Wi?c w ?atwy spos?b mo?emy sprawdzi? ilo?? danych w tabeli. Ale jest jeszcze prostszy spos?b:
local tablica = {1,5,3,8,3,5,7,4}
print(#tablica)
Znaczek # sprawia, ?e jest pobierana ilo?? danych w tabeli tak jak za pomoc? funkcji table.getn(), wynikiem dzia?ania przyk?adu oczywi?cie b?dzie liczba 8, bo tyle jest danych.
e) table.remove (table [, pos])
Funkcja ta umo?liwia nam kasowanie danych z tablicy. Oto przyk?ad u?ycia:
local tablica = {x,5,f,2,4,65}
table.remove(tablica)
print(table.getn(tablica))
Wynik tego b?dzie r?wny 0, gdy? funkcja usunie ca?? tabel?.
Innym u?yciem jest wpisanie pozycji, z kt?rej chcemy skasowa? dan?:
local tablica = {1,3,2}
print(table.getn(tablica))
table.remove(tablica, 2) -- Usuniecie liczby 3 z tablicy
print(table.getn(tablica))
W tym wypadku otrzymamy:
3
2
f) table.setn(table, value)
Ta funkcja s?u?y jedynie do zmiany maksymalnej warto?ci tablicy. Funkcja ma?o przydatna, ale te? wymaga opisu :)
a = {}
print(table.getn(a)) --> 0
table.setn(a, 10000)
print(table.getn(a)) --> 10000
g) table.find(table, value)
Jest to funkcja napisana w LUA. Przeszukuje ona tablic? w poszukiwaniu warto?ci value. Je?li j? znajdzie to zwr?ci pozycje, na kt?rej ta warto?? si? znajduje. Np.
a = {1,3,5,7,9}
print(table.find(a, 5)) --> 3
W tym przyk?adzie funkcja zwr?ci warto?? 3, gdy? liczba 5 znajduje si? w tabeli na 3 pozycji.
h) table.countElements(table, item)
Jest to funkcja, kt?ra zlicza ilo?? element?w w tablicy. Oczywi?cie jak mo?na si? domy?li?. Np.
a = {1,3,1,2,5,8,1,9}
print(table.countElements(a, 1)) --> 3
Funkcja ta zliczy wszystkie jedynki w tabeli i wy?wietli ich liczb?. W tym przypadku jedynek jest 3 i funkcja wy?wietla nam liczb? 3.
Ad. 6 – P?tle.​
a) P?tla for.
Jest to bardzo przydatna p?tla. Wykonuje ona okre?lon? ilo?? razy ten sam kod. budowa p?tli for:
for i = 1, 5 do
-- kod
end
Jest to najprostsza p?tla. Obja?nienie:
i – jest to tymczasowa zmienna, przyjmuje ona warto?? r?wn? numerowi p?tli, kt?ra obecnie si? wykonuje (w tym wypadku p?tla wykona si? 5 razy).
A teraz przyk?ad z po??czeniem p?tli for oraz tablicy :]
local a = {2160, 2162, 2165} – s? to przyk?adowe numery itemid
for i = 1, #a do – dla przypomnienia znaczek # sprawia ?e zostaje zwr?cona ilo?? danych w tablicy
doPlayerAddItem(cid, a, 1) – gracz za ka?dym zap?tleniem dostanie inny item z tablicy
end – zako?czenie p?tli

b) P?tla while.
Jest to p?tla, kt?ra wykonuje si? dot?d, dop?ki warunek w niej postawiony b?dzie prawdziwy. Przyk?ad:
local a = 0
while(a <= 10) do
print(„A jest mniejsze lub r?wne 10.)
a = a+1
end
P?tla ta ma bardzo prosty warunek: je?li a jest mniejsze lub r?wne 10 to:
wy?wietla w konsoli wiadomo?? i zwi?ksza a o jeden.

Ad. 7 – Komentarze.
Komentarze s? to teksty wprowadzane do skryptu. Teksty te s? ignorowane przez silnik wi?c mo?na w nich zapisa? informacje, np. o znaczeniu zmiennych w configu :]
Komentarze mog? by? liniowe, np.
-- To jest komentarz liniowy
lub blokowe, np.
--[[
a to jest
komentarz blokowy
]]--
Komentarze blokowe s? u?ywane z regu?y do podania, np. Autora skryptu, jego wersji i innych danych na samym pocz?tku.

Ad. 8 – Ciekawostki.
W LUA znajduje si? wiele przydatnych i ciekawych funkcji. Oto kilka z nich:
math.random(od, do) – funkcja losuje liczb? od do i j? zwraca
math.pi() – funkcja zwraca warto?? liczby Pi
math.huge() – funkcja zwraca warto?? niesko?czono?ci xD
math.floor(liczba) – funkcja zaokr?gla liczb? w d?? (np. 1.5 do 1)
math.ceil(liczba) – funkcja zaokr?gla liczb? w g?r? (np. 1.5 do 2)
math.min(liczby) – z podanych liczb zwraca najmniejsz?
math.max(liczby) – z podanych liczb zwraca najwi?ksz?
math.modf(liczba) – rozbija liczb? na pe?n? liczb? i warto?? po przecinku
math.sqrt(liczba) - zwraca pierwiastek z podanej liczby
math.deg(liczba) - zamienia liczb? z radian?w na stopnie
math.rad(liczba) - zamienia liczb? ze stopni na radiany
math.sin(x) - sinus k?ta x podanego w radianach
math.cos(x) - cosinus k?ta x podanego w radianach
math.tan(x) - tangens k?ta x podanego w radianach
os.time() – zwraca aktualny czas w sekundach od roku 1970
os.date([format [, time]]) – zwraca r??ne warto?ci zwi?zane z dat?
os.difftime(t2, t1) – zwraca r??nic? czasu mi?dzy t2 i t2
os.remove(filename) – funkcja usuwa plik filename (musi by? z rozszerzeniem)
os.rename(oldname, newname) – funkcja zmienia nazw? pliku
os.getenv(varname) - zwraca warto?? zmiennej varname lub nil je?li zmienna jest pusta (brak zmiennej? :>)
dofile(lokalizacja) - do??cza do skryptu plik z lokalizacji podanej w funkcji
print("msg") – wy?wietla wiadomo?? o tre?ci msg w konsoli silnika
I tak oto doszli?my do ko?ca. Mam nadziej?, ?e poradnik si? spodoba? oraz co wa?niejsze, ?e czego? Was nauczy? :)
Prosz? o komentarze i pozdrawiam,
Karpio
PS: Zabraniam kopiowania!
 

Xart Irok

Senior User
Joined
Sep 7, 2008
Messages
2,925
Reaction score
419
Age
32
Odp: Od zera do skryptera - czyli poradnik LUA!

Ca?kiem dobra praca stosowanie tabel p?tl? na pewno b?d? m?g? z tego opanowa? do perfekcji bo to co wiem to ma?o co tu jest napisane bardzo ciekawe polecam na przysz?o??
 

Karpio

Advanced User
Joined
Apr 11, 2008
Messages
369
Reaction score
58
Odp: Od zera do skryptera - czyli poradnik LUA!

Mo?e jeszcze jakie? komentarze?

Pzdr
 

*Javimax*

Advanced User
Joined
Nov 18, 2008
Messages
414
Reaction score
43
Odp: Od zera do skryptera - czyli poradnik LUA!

?wietny poradnik tak trzymaj czekam na dalsze cz??ci poradnika :D
 

Do Mycia

Advanced User
Joined
Apr 19, 2008
Messages
455
Reaction score
12
Odp: Od zera do skryptera - czyli poradnik LUA!

?adnie tak trzymaj dzi?ki tobie mo?e wreszcie naucz? si? j?zyka lua czekam na dalsze t?umaczenie mo?e innego j?zyka xD Thx
 

zaki002

New User
Joined
Dec 3, 2009
Messages
7
Reaction score
0
Odp: Od zera do skryptera - czyli poradnik LUA!

Troch? trudne do wykorzystania w robieniu skrypt?w : / przynajmniej dla mnie bo jestem pocz?tkuj?cy cho? jak si? troch? pog??bi? w tym temacie to zrozumiem :)
Ale ?adnie zrobiony i przejrzysty, naprawd? dobra robota.
 

programowiec

Active User
Joined
Apr 5, 2008
Messages
62
Reaction score
0
Odp: Od zera do skryptera - czyli poradnik LUA!

M?g?by? jeszcze opisa? wst?py do skryptu ale poradnik
Gites Malines xD

10/10
Czysto i przej?y?cie
 
R

Rahim

Guest
Odp: Od zera do skryptera - czyli poradnik LUA!

Ja pierdole

Tym oto stwierdzeniem m?g?bym zako?czy? opis tego? poradnika, ale my?l?, ?e fajnie by?o by opisa?, dlaczego ten poradnik to kompletna klapa. ;)

Ad. 1

Nie ma do czego si? przyczepi?... bo to tylko cytat z wiki.

Ad. 2
function – pokazuje, w kt?rym miejscu zaczyna si? skrypt
Od kiedy function oznacza pocz?tek skryptu? Czy?bym nie m?g? np. umie?ci? ?adnej zmiennej wcze?niej? Ale? oczywi?cie, ?e mog?! Haha. "function" u?ywany jest do deklaracji funkcji, niczego innego.

Ad. 3
Jeszcze do strawienia, ale strasznie s?abo opisane.

Ad. 4
posiadaj? ?adnego przedrostka
:eek:

zmienne te dotycz? zawsze wszystkich skrypt?w i s? najd?u?ej przechowywane w pami?ci
Powiedzia? co wiedzia?. Nie ka?da zmienna globalna mo?e zosta? u?yta w ka?dym skrypcie. Je?li zadeklarowali?my zmienn? globaln? np. w actions, to w movements ju? jej nie u?yjemy. Wyj?tkiem b?dzie deklaracja zmiennej w global.lua/functions.lua itp. Wtedy zmienna b?dzie dost?pna dla ka?dego rodzaju skryptu, bo zmienna zostanie zapisana w obszarach pami?ci ka?dego rodzaju skryptu.

Ad. 5
jest jeszcze inny spos?b (mieszany: {a=1, 5, 4, x=1000}), ale nie b?d? o nim pisa?, gdy? jest ma?o wygodny.
Dlaczego ma?o wygodny?

Unpacki to chyba z mojego poradniczka si? wzi??o, nieprawda?? ;)

f) table.setn(table, value)
Ta funkcja s?u?y jedynie do zmiany maksymalnej warto?ci tablicy. Funkcja ma?o przydatna, ale te? wymaga opisu :)

O?, mistrzu, a wiesz mo?e, ?e table.setn zostalo usuni?te z biblioteki LUA ju? hen czasu temu? ;) Tzn. ?e taka funkcja ju? nie istnieje.

Nast?pnym razem co? sam przetestuj, nie bierzesz ?ywcem z lua-users.org ;)
 

Vill

New User
Joined
Nov 8, 2009
Messages
5
Reaction score
2
Odp: Od zera do skryptera - czyli poradnik LUA!

Moim skromnym zdaniem, i uwa?nym okiem obserwatora (a przegl?da?em naprawd? wiele poradnik?w), to tak naprawd? nic nowego nie przeczyta?em, wszystkie te informacje ju? s? zawarte w innych miejscach. Gratki dla autora za skumulowanie tego wszystkiego w jednym miejscu, ale za robienie posortowanego ba?aganu z kompletnego chaosu nie jest nadzwyczajn? umiej?tno?ci?.
Wida?, ?e:
  • nieodpowiednio dobra?e? materia?y umieszczone w poradniku do poziomu (nie s?dz?, ?eby na "?rednim" poziomie LUA trzebaby by?o wyja?nia? funkcje IF),
  • przy braku wiedzy stosujesz metod? unikow? (w punkcie drugim sama lista funkcji nie t?umaczy zupe?nie nic),
  • jeszcze raz postuluj? o kolorowanie skrypt?w ?eby by?y bardziej czytelne, przyk?ad:
    onUse(cid, item, fromPosition, itemEx, toPosition)
    if(getPlayerLevel(cid) ~= 10) then --je?li(poziom(gracza) jest r??ny od 10) to
    doPlayerAddExp(cid, 4200)--dodaj(graczowi, 4200) expa
    else
    doPlayerSendTextMessage(cid, 4, "Tylko gracz na dziesi?tym poziomie mo?e tego u?y?!")
    end
    end
  • poniewa? jestem maniakiem funkcjonalno?ci zastanawia mnie, do czego w otsach mo?e si? przyda?:
    math.pi() – funkcja zwraca warto?? liczby Pi
Og?lnie to nie wiem, jaki to poziom poradnika, mnie wcale nie poruszy?, a nie zadziwi?. Sorry.
Pozdrawiam,
~Vill
 

GregoRex

Senior User
Joined
Dec 26, 2008
Messages
1,185
Reaction score
95
Age
29
Odp: Od zera do skryptera - czyli poradnik LUA!

return true
Nie wyt?umaczy?e? o co w tym chodzi.
Opisz to, prosz? ci?.
Btw. ?wietny poradnik, na pewno bardziej mi si? przyda Tw?j poradnik ni? Gelia. :)
Przejrzysty, du?o uczy, itp.
Reput leci.

function onSendMail(cid, receiver, item, openbox)
doPlaterSendTextMessage(cid, 22, "Wyslales paczke do ".. (getPlayerName(cid)))
end
Dobrze? :D

@down
No w?a?nie zauwa?y?em t? liter?wk?. To nie b??d logiczny tylko pomy?ka w pisaniu, ale dzi?ki xd
 
Last edited:

Sterger

Advanced User
Joined
Jun 2, 2008
Messages
217
Reaction score
10
Odp: Od zera do skryptera - czyli poradnik LUA!

Ja si? nie znam na pisaniu skrypt?w ale jeden b??d widz?... :p

doPlaterSentTextMessage(cid, 22, "Wyslales paczke do ".. (getPlayerName(cid)))
end

Popraw na ""Send" ,bo chyba nie zadzia?a :rolleyes: Chyba nie jestem pewien ,bo nie jestem skrypterem... :p
 

Karpio

Advanced User
Joined
Apr 11, 2008
Messages
369
Reaction score
58
Odp: Od zera do skryptera - czyli poradnik LUA!

@2x up:
jak ju? to Player a nie Plater :D
 

Srokes

Advanced User
Joined
Mar 8, 2009
Messages
155
Reaction score
3
Age
28
Odp: Od zera do skryptera - czyli poradnik LUA!

Bardzo dobry poradnik du?o na nim si? nauczy?em xd nale?y Ci si? reput :)
 

cabron

Active User
Joined
Jan 5, 2010
Messages
53
Reaction score
1
Age
30
Odp: Od zera do skryptera - czyli poradnik LUA!

Nom jednym s?owem poradnik jest " Git " :D Postara?e? si? wypowied? o tej kwesti jest bardzo stosowna wi?c pocz?tkuj?cy skrypterzy doceni? ten poradnik i bardzo im si? spodoba rzecz bior?c " Tak My?le ^^ " Wi?c Moja Ocena Na Tw?j Poradnik To : 9/10 Gdy? pomog?e? wielu innym skrypterom Pozdro :D
 
Top