What's new

-Łatwy Poradnik dla pocz?tkuj?cych skrypter?w!

Xayan

Senior User
Joined
Jul 4, 2009
Messages
2,608
Reaction score
390
Age
28
Witam!

Zdecydowa?em si? napisa? ten poradnik z my?l? o pocz?tkuj?cych skrypterach. My?l?, ?e wszystko odpowiednio wyt?umacz?.

1. O LUA og?lnie.

LUA jest j?zykiem skryptowym stosowanym do prywatnych serwer?w Tibii oraz World of Warcraft. Jednak nie tylko. Przydaje si? tak?e przy programowaniu w innych j?zykach, np. C++.
Przyk?adowo:
Mamy gr?. Za ka?dym razem, gdy chcemy doda? nowe poziomy, edytujemy kod gry i od nowa musimy go kompilowa?. Kiedy u?yjemy plik?w LUA, w kt?rych b?d? znajdowa? si? dane poziom?w, kompilacja b?dzie zb?dna.

2. Co nam b?dzie potrzebne?

Og?lnie wystarczy notatnik, ale ja proponuj? Notepad++. Jest to program freeware, kt?ry mo?na pobra? st?d: .
Umo?liwia on otwarcie wielu plik?w na raz, co znacznie przyspiesza ich edycj?. Ma r?wnie? mas? przydatnych funkcji, mi?dzy innymi tasker, dzi?ki kt?remu mo?emy co? nagra? (np. ruchy i kliki myszk?), a nast?pnie to odtworzy?. Zach?cam do poznania wszystkich dost?pnych funkcji.

3. Funkcje g??wne.

Tak wi?c: skrypt LUA sk?ada si? z g??wnej funkcji oraz kodu zawartego w niej. G??wna funkcja okre?la, przy jakiej czynno?ci skrypt zostanie aktywowany. I oto funkcje, kt?re wyst?puj? w silniku The Forgotten Server:
Code:
Actions
onUse(cid, item, fromPosition, itemEx, toPosition)

TalkActions
onSay(cid, words, param, channel)

GlobalEvents
onThink(interval, lastExecution)

Movements
onStepIn(cid, item, position, fromPosition)
onStepOut(cid, item, position, fromPosition)
onAddItem(moveitem, tileitem, position, cid)
onRemoveItem(item, tile, pos)

CreatureScripts
onLogin(cid)
onLogout(cid)
onAdvance(cid, skill, oldLevel, newLevel)
onSendMail(cid, receiver, item, openBox)
onSendMail(cid, sender, item, openBox)
onJoinChannel(cid, channel, users)
onLeaveChannel(cid, channel, users)
onLook(cid, thing, position, lookDistance)
onKill(cid, target)

Jak pewnie wiesz, w folderze silnika znajduj? si? podfoldery, ka?dy do innego rodzaju skrypt?w.
Ka?d? funkcj? g??wn? nale?y zako?czy? s?owem end.

4. Pierwszy skrypt.

Zr?bmy skrypt, kt?ry b?dzie przyzywa? smoka, gdy co? powiemy.
Tak wi?c musimy zacz?? od funkcji g??wnej:

Code:
onSay(cid, words, param, channel)
end

Teraz, aby smok zosta? przyzwany, musimy wstawi? odpowiedni? funkcj? mi?dzy te dwie linijki kodu:

Code:
doCreateMonster(name, pos)

Jak wida?, w funkcji musz? zosta? u?yte dwie dane. Name, czyli nazwa potwora oraz pos, czyli pozycja, na kt?rej potw?r zostanie przyzwany. Mamy przyzwa? smoka, wi?c zamiast name wpisujemy "Dragon". Koniecznie z cudzys?owami, poniewa? bez nich, silnik wzi??by imi? za zmienn?. O tym za chwil?.

Tak wi?c obecny skrypt wygl?da nast?puj?co:

Code:
onSay(cid, words, param, channel)
	doCreateMonster("Dragon", pos)
end

Lecz po co r?cznie wpisywa? pozycj?? Teraz zastosujemy zmienn?! Prezentuje si? ona nast?puj?co:

Code:
local nazwazmiennej = funkcja

Jak widzimy, przez s?owo local "m?wimy" silnikowi, ?e jest to zmienna. Jednak gdzie j? umie?ci? w skrypcie? Bezpo?rednio po rozpocz?ciu g??wnej funkcji, czyli w drugiej linijce. Teraz mo?emy wpisa? dowoln? nazw? zmiennej, np. pozycjagracza. Natomiast zamiast funkcja wpisujemy:

Code:
getCreaturePosition(cid)

Owa funkcja pobiera pozycj? gracza i zapisuje j? w zmiennej pozycjagracza. Cid w funkcji oznacza, ?e tyczy si? ona osoby wykonuj?cej czynno??.

Teraz mo?emy u?y? naszej zmiennej w funkcji przyzywaj?cej smoka. Teraz ca?y skrypt wygl?da nast?puj?co:

Code:
onSay(cid, words, param, channel)
	local pozycjagracza = getCreaturePosition(cid)
	doCreateMonster("Dragon", pozycjagracza)
end

Koniec. Oto ca?y skrypt.

5. Zwrotnice, czyli if oraz else.

Napiszmy prosty skrytp, kt?ry da graczowi 4200 expa.

Code:
onUse(cid, item, fromPosition, itemEx, toPosition)
	doPlayerAddExp(cid, 4200)
end

Proste, prawda? No to teraz zr?bmy, ?e se skryptu mo?e skorzysta? gracz z lvl'em r?wnym 1. Stosujemy do tego instrukcj? if.

Code:
if(getPlayerLevel(cid) == 1) then

Nast?pnie dodajemy funkcj?...

Code:
doPlayerAddExp(cid, 4200)

Instrukcj? if trzeba zako?czy? tak samo, jak funkcj? g??wn?, czyli na ko?cu wpisujemy s??wko end. Ca?y skrypt b?dzie wygl?da? wi?c nast?puj?co:

Code:
onUse(cid, item, fromPosition, itemEx, toPosition)
	if(getPlayerLevel(cid) == 1) then
		doPlayerAddExp(cid, 4200)
	end
end

Teraz podam wam "znaki" stosowane w instrukcji if:

Code:
== - jest r?wne
< - jest mniejsze
> - jest wi?ksze
<= - jest mniejsze, lub r?wne
>= - jest wi?ksze, lub r?wne
~= - w przybli?eniu

Jednak ulepszmy troch? skrypt. Je?eli gracz nie ma pierwszego levela, to niech zostanie o tym poinformowany. U?yjmy do tego else:

Code:
onUse(cid, item, fromPosition, itemEx, toPosition)
	if(getPlayerLevel(cid) == 1) then
		doPlayerAddExp(cid, 4200)
	else
		doPlayerSendTextMessage(cid, 4, "This can be using only by players with level 1!")
	end
end

@Xart:
Dzi?ki xP
 

Xart Irok

Senior User
Joined
Sep 7, 2008
Messages
2,925
Reaction score
419
Age
32
Odp: Poradnik dla pocz?tkuj?cych skrypter?w!

prawie ze dobrze tylko zapomniales o jeszcze jednym rownaniu
~= - przyblizeniu
i popraw znacznik przed 5 etapem skryptow
tylko ja bym zaczol od napisanie czegos w actions bo to jest nalogowo uzywane wiec warto tam jest opisac poradnik powinen wyzej wylodowac
 

Xayan

Senior User
Joined
Jul 4, 2009
Messages
2,608
Reaction score
390
Age
28
Odp: Poradnik dla pocz?tkuj?cych skrypter?w!

Od?wie?am! Tylko jeden komentarz? ;x
 

Xayan

Senior User
Joined
Jul 4, 2009
Messages
2,608
Reaction score
390
Age
28
Odp: Poradnik dla pocz?tkuj?cych skrypter?w!

Od?wie?am! Komentowa?!
 

aquatter

User
Joined
Mar 22, 2009
Messages
30
Reaction score
0
Odp: Poradnik dla pocz?tkuj?cych skrypter?w!

Hmm, no bardzo ciekawy poradnik dla pocz?tkuj?cych. Mi si? na pewno przyda ;) Ciekawie napisany, czytelny, nie zauwa?y?em b??d?w. Du?y + dla Ciebie.
 

Silnikarz

Advanced User
Joined
Oct 17, 2008
Messages
282
Reaction score
27
Age
29
Odp: Poradnik dla pocz?tkuj?cych skrypter?w!

Poradnik nie do?? przejrzysty ale nie na tyle ?eby nie mo?na by?o si? nauczy?

Poradnik ?wietny dla pocz?tkuj?cych skrypter?w, z pewno?ci? przyda si?
wielu skrypterom.

Daje 7/10 za napisanie poradnika.

Pozdrawiam,
Silnikarz.
 

zarzyk

Active User
Joined
Apr 18, 2008
Messages
52
Reaction score
1
Odp: Poradnik dla pocz?tkuj?cych skrypter?w!

Bardzo ?adnie napisany poradnik my?l? ze wielu nowych skrypter?w doceni tw?j wysi?ek, wiele os?b b?dzie z niego korzysta?.
 

Vill

New User
Joined
Nov 8, 2009
Messages
5
Reaction score
2
Odp: Poradnik dla pocz?tkuj?cych skrypter?w!

prawie ze dobrze tylko zapomniales o jeszcze jednym rownaniu
~= - przyblizeniu
Jakie w przybli?eniu?
Tylda (~) oraz znak r?wno?ci (=) oznacza razem "jest r??ne".
Je?li chcieliby?my (bo mo?emy, a co!) napisa? skrypt, kt?ry powoduje, ?e ka?dy mo?e u?y? tego przedmiotu, pod warunkiem, ?e jego poziom do?wiadczenia jest ni?szy ni? 10, lub wy?szy ni? 10 ale nie jest r?wny. Wygl?da to tak:
onUse(cid, item, fromPosition, itemEx, toPosition)
if(getPlayerLevel(cid) < 10 or getPlayerLevel(cid) > 10) then --je?li(poziom(gracza) jest ni?szy ni? 10 LUB poziom(gracza) jest wy?szy ni? 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
Albo zamiast dw?ch warunk?w u?yjemy (~=):
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
Celowo pokolorowa?em skrypt zgodnie ze sk?adni?, aby u?atwi? zrozumienie zasad. W podobnych kolorach (opr?cz czerwonego) zaznacza edytor tekstowy Notepad++. Je?li jeszcze nie macie tego programu, to zalecam ponownie zajrzenie do poradnika Xayana: Poradnik dla pocz?tkuj?cych skrypter?w!, punkt 2.
Moim zdaniem, ka?dy poradnik powinien zawiera? te kolory i obowi?zkowo komentarze do skrypt?w. Przy okazji, je?li zapiszemy co? w programie, za podw?jnym minusem (--) to nie b?dzie to odczytywane przez kompilator, czyli zastosujemy komentarz niewidoczny dla programu, ale pomocny dla programisty, ewentualnie osoby, kt?ra b?dzie z naszego skryptu korzysta?, tak jak w skryptach powy?ej. Mo?ecie z pe?n? ?wiadomo?ci? skopiowa? ca?y tekst, w??cznie z moim t?umaczeniem do pliku <nazwaskryptu>.lua, a i tak b?dzie dzia?a?.
Aby wzi?? wi?cej linijek w komentarz, mo?na po kolei dodawa? w ka?dej na pocz?tku dwa minusy, albo przed komentarzem u?y? operatora minus, minus, nawias, nawias (--[[) a za komentarzem nawias, nawias, minus, minus (]]--).
na przyk?adzie:
onUse(cid, item, fromPosition, itemEx, toPosition)
if(getPlayerLevel(cid) < 10 or getPlayerLevel(cid) > 10) then --[[ Tutaj mo?emy sobie doda? dowoln? ilo?? linijek komentarza
A i tak wszystko zostanie pomini?te przez kompilator. Np:
"Vill naprawd? ma talent pedagogiczny..."
"...I powinien pisa? poradniki..."
"...jak tylko mu si? ju? zachce je pisa?..."
Ala ma kota,
#$^*!@& --->
@->->- KWIATEK
]]--

doPlayerAddExp(cid, 4200) --dodaj(graczowi, 4200) expa
else
doPlayerSendTextMessage(cid, 4, "Tylko gracz na dziesi?tym poziomie mo?e tego u?y?!")
end
end
Pozdrawiam,
~Vill
P.S. Na serio, jak ju? si? zdecyduj?, to naprawd? zaczn? pisa? poradniki...
 
Last edited:
Top