Karpio
Advanced User
- Joined
- Apr 11, 2008
- Messages
- 369
- Reaction score
- 57
Witam! Jest to m?j pierwszy poradnik, wi?c licz? na ostre komentarze. W poradniku opisz?:
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.
* 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.
Zmienne globalne:
- posiadaj? ?adnego przedrostka, np.
U?ycie zmiennych lokalnych w przyk?adzie:
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:
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:
za pomoc? tej funkcji mo?emy „wstrzykn??” do tablicy dan? warto??, np.
b) table.foreach(tablica, funkcja)
Za pomoc? tej funkcji mo?emy po kolei pobra? dane z tabeli i wrzuci? je do kolejnej funkcji, np.
Funkcja ta sortuje nam dane w tablicy, np.
d) table.getn(tablica)
Funkcja ta zlicza ilo?? danych w tabeli, np.
9
Wi?c w ?atwy spos?b mo?emy sprawdzi? ilo?? danych w tabeli. Ale jest jeszcze prostszy spos?b:
e) table.remove (table [, pos])
Funkcja ta umo?liwia nam kasowanie danych z tablicy. Oto przyk?ad u?ycia:
Innym u?yciem jest wpisanie pozycji, z kt?rej chcemy skasowa? dan?:
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
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.
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.
Jest to bardzo przydatna p?tla. Wykonuje ona okre?lon? ilo?? razy ten sam kod. budowa p?tli for:
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 :]
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:
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.
Ad. 8 – Ciekawostki.W LUA znajduje si? wiele przydatnych i ciekawych funkcji. Oto kilka z nich:

Prosz? o komentarze i pozdrawiam,
Karpio
PS: Zabraniam kopiowania!
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:Obja?nienie:function onSay(cid, words, param, channel)
-- kod skryptu
end
- 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
Funkcje zaczynaj?ce skrypt:function onSay(cid, words, param, channel)
doPlayerSendTextMessage(cid, 22, "Wyswietli si? zielony napis.")
end
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:Obja?nienie:if(getPlayerLevel(cid) == 1) then
--kod
elseif(getPlayerLevel(cid) == 2) then
--kod
else
--kod
end
* 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 lokalne:
- zaczynaj? si? od s?owa local, np.
- 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?tkulocal a = 1
Zmienne globalne:
- posiadaj? ?adnego przedrostka, np.
- zmienne te dotycz? zawsze wszystkich skrypt?w i s? najd?u?ej przechowywane w pami?cia = 1
U?ycie zmiennych lokalnych w przyk?adzie:
function onTimer()
local time = os.time()
dobroadcastMessage("Obecny czas to "..time..".")
return true
end
Ad. 5 – Tablice.
Skoro ju? wiemy jak wygl?daj? dane w tablicy to najwy?szy czas nauczy? si? je zapisywa? i pobiera?. Zapis wygl?da tak:
- {1,2,3,4,5,6}
- {x=1,y=2,z=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.
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.local tablica = {1,2,3,4,5}
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.
Funkcja unpack u?yta w przyk?adzie ‘rozpakowuje’ tablic?. Efektem dzia?ania naszego przyk?adu b?dzie:local tablica = {1,2,3,4,5,6,7}
table.insert(tablica, 8)
print(unpack(tablica))
a teraz inny przyk?ad:1 2 3 4 5 6 7 8
A teraz otrzymamy:local tablica = {2,3,4,5,6,7}
table.insert(tablica, 1, 9)
print(unpack(tablica))
gdy? w table.insert() podali?my dok?adn? pozycj?, gdzie ma zosta? „wstrzykni?ta” liczba 9.9 2 3 4 5 6 7
b) table.foreach(tablica, funkcja)
Za pomoc? tej funkcji mo?emy po kolei pobra? dane z tabeli i wrzuci? je do kolejnej funkcji, np.
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:local tablica = {1,2,3,4,5,”LOL”}
table.foreach(tablica, print)
c) table.sort(tablica [, funkcja])1 1
2 2
3 3
4 4
5 5
6 LOL
Funkcja ta sortuje nam dane w tablicy, np.
w rezultacie otrzymamy:local tablica = {5,9,-1,-99,1,6,87}
table.sort(tablica)
print(unpack(tablica))
Jak wida? warto?ci s? poustawiane rosn?co, a co je?li my wolimy malej?co?-99 -1 1 5 6 9 87
Tym razem otrzymamy wynik przeciwny:local tablica = {5,9,-1,-99,1,6,87}
table.sort(tablica, function(a,b) return a > b end)
print(unpack(tablica))
w podobny spos?b mo?emy napisa? inne funkcje, kt?re b?d? sortowa?y warto?ci tak jak sobie tego za?yczymy.87 9 6 5 1 -1 -99
d) table.getn(tablica)
Funkcja ta zlicza ilo?? danych w tabeli, np.
funkcja ta wy?wietli nam:local tablica = {1,2,3,4,5,6,7,8,9}
print(table.getn(tablica))
9
Wi?c w ?atwy spos?b mo?emy sprawdzi? ilo?? danych w tabeli. Ale jest jeszcze prostszy spos?b:
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.local tablica = {1,5,3,8,3,5,7,4}
print(#tablica)
e) table.remove (table [, pos])
Funkcja ta umo?liwia nam kasowanie danych z tablicy. Oto przyk?ad u?ycia:
Wynik tego b?dzie r?wny 0, gdy? funkcja usunie ca?? tabel?.local tablica = {x,5,f,2,4,65}
table.remove(tablica)
print(table.getn(tablica))
Innym u?yciem jest wpisanie pozycji, z kt?rej chcemy skasowa? dan?:
W tym wypadku otrzymamy:local tablica = {1,3,2}
print(table.getn(tablica))
table.remove(tablica, 2) -- Usuniecie liczby 3 z tablicy
print(table.getn(tablica))
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
g) table.find(table, value)a = {}
print(table.getn(a)) --> 0
table.setn(a, 10000)
print(table.getn(a)) --> 10000
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.
W tym przyk?adzie funkcja zwr?ci warto?? 3, gdy? liczba 5 znajduje si? w tabeli na 3 pozycji.a = {1,3,5,7,9}
print(table.find(a, 5)) --> 3
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.
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.a = {1,3,1,2,5,8,1,9}
print(table.countElements(a, 1)) --> 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:
Jest to najprostsza p?tla. Obja?nienie:for i = 1, 5 do
-- kod
end
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:
P?tla ta ma bardzo prosty warunek: je?li a jest mniejsze lub r?wne 10 to:local a = 0
while(a <= 10) do
print(„A jest mniejsze lub r?wne 10.)
a = a+1
end
wy?wietla w konsoli wiadomo?? i zwi?ksza a o jeden.
Ad. 7 – Komentarze.
Komentarze mog? by? liniowe, np.
lub blokowe, np.-- To jest komentarz liniowy
Komentarze blokowe s? u?ywane z regu?y do podania, np. Autora skryptu, jego wersji i innych danych na samym pocz?tku.--[[
a to jest
komentarz blokowy
]]--
Ad. 8 – Ciekawostki.
I tak oto doszli?my do ko?ca. Mam nadziej?, ?e poradnik si? spodoba? oraz co wa?niejsze, ?e czego? Was nauczy?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
Prosz? o komentarze i pozdrawiam,
Karpio
PS: Zabraniam kopiowania!