What's new

-Średni LUA od podstaw! Poznaj i ty!

jestemPolakiem

Advanced User
Joined
Jan 1, 2010
Messages
310
Reaction score
21
300px-Lua-logo-nolabel.svg.png
Witam serdecznie wszystkich u?ytkownik?w tego forum! Chcia?bym zaprezentowa? wam m?j poradnik o programowaniu w j?zyku skryptowym LUA. Przedstawi? w nim og?lne podstawy programowania w j?zykach podobnych do LUA, a tak?e w samym nim. Og?ln? specyfik? kodu, budow? oraz poka?? jak sprawdza? dost?pno?? funkcji.

1. Programowanie - ogromny ?wiat kod?w i symboli
Je?li dopiero zaczynasz swoj? karier? z pisaniem skrypt?w, program?w oraz wielu innych aplikacji na komputer?w poradnik mo?e by? dla ciebie nie zrozumia?y. Znajomo?? j?zyku (w tym przypadku LUA) pozwoli ci na samodzielne tworzenie w?asnego ?wiata w grze.

Na pocz?tku dowiedzmy si? czym? jest to magiczne "programowanie" - przedstawi? wam tutaj ksi??kow? definicj? tego s?owa, kt?ra p??niej spr?buj? jasno obja?ni?.
Programowanie to proces projektowania, tworzenia, testowania i utrzymywania lub urz?dze? ( ). Kod ?r?d?owy jest napisany w , z u?yciem okre?lonych regu?, mo?e on by? modyfikacj? istniej?cego programu lub czym? zupe?nie nowym. Programowanie wymaga du?ej wiedzy i do?wiadczenia w wielu r??nych dziedzinach, jak projektowanie aplikacji, , , znajomo?? i narz?dzi programistycznych, wiedza nt. kompilator?w, czy spos?b dzia?ania podzespo??w . W , programowanie (implementacja) jest tylko jednym z etap?w powstawania programu.
?r?d?o: Wikipedia, wolna encyklopedia
Naszym j?zykiem wolno powiedzie?, ?e "programowanie" to tworzenie kodu ?r?d?owego (skryptu) wedle jasno ustalonych regu? j?zyka, a nast?pnie testowanie poprawno?ci jego dzia?ania i w razie potrzeby poprawianie b??d?w.

Wi?kszo?? j?zyk?w posiada podobny zapis - cho? nie zawsz? - np. r??nic? mi?dzy C++ a LUA s? wi?ksze ni? mi?dzy LUA a Pascal'em. Oznacza to, ?e je?li znasz si? na j?zyku LUA masz ju? jakie? podstawy w Pascal'u.

2. Algorytm - po?owa sukcesu?
Kolejnym wa?nym elementem jest "algorytm" - dla niekt?rych w og?le nie znane s??wko, ale to oczywi?cie si? mo?e zmieni?. Tradycyjne przedstawi? wam teori? ksi??kow?
Algorytm – w oraz sko?czony, uporz?dkowany ci?g jasno zdefiniowanych czynno?ci, koniecznych do wykonania pewnego rodzaju zada?
?r?d?o: Wikipedia, wolna encyklopedia
Je?li chodzi o prostsze znaczenie tej definicji, to po prostu lista zada?, kt?re musi wykona? program. Na przyk?ad, je?li chcemy, aby nasz skrypt dodawa? nam 100 sztuk z?ota (w tym przypadku gp) za ka?dy zdobyty poziom b?dziemy musieli stworzy? algorytm, kt?ry b?dzie sprawdza?, czy zdobyta umiej?tno?? to poziom, a nie np. walka mieczem, toporem lub poziom magiczny. Oto przyk?adowy by?by przyk?adowy algorytm :


  1. Pobierz dane (posta?, umiej?tno??, poprzedni poziom, poziom zdobyty)
  2. Sprawdzanie, czy umiej?tno?? to poziom, je?li tak to kontynuuje, a je?li nie to przerywa dzia?anie skryptu
  3. Dodaj postaci 100 sztuk z?ota (gp)
  4. Zwr?? pozytywny rezultat (czyli pozw?l na dalsze dzia?anie)

3. Tworzymy nasz pierwszy skrypt
Nie mog?em wcze?niej wyt?umaczy? wam jak dok?adnie napisa? skrypt, poniewa? wolno si? tego nauczy? tylko w praktyce. Naszym pierwszym skryptem b?dzie ten skrypt, do kt?rego wcze?niej napisali?my algorytm.
Najpierw musimy si? zorientowa? jaki to b?dzie dok?adnie skrypt - z jakiej dziedziny. Do wyboru mamy :


  • actions, te skryptu odpowiadaj? za u?ywanie przedmiot?w.
  • creaturescripts, te skrypty to wszystkie zdarzenia zwi?zanie z postaci?, zdobycie poziomu, atak, poruszanie si? postaci, zabicie potwora oraz ?mier?.
  • globalevents, te skrypty to wszystko to co dziej? si? w grze, zmiana o?wietlenia mapy podczas jakie? godziny.
  • movements, te skrypty odpowiadaj? za poruszanie si? postaci, zak?adanie i zdejmowanie ekwipunku.
  • npc, te skryptu dotycz? wszystkich postaci (handlarzy, os?b z kt?rymi mo?emy rozmawia? lub dostawa? misje)
  • talkactions, te skryptu odpowiadaj? za interakcje komend (np. je?li posta? napisz? !przyklad wykonania si? jaki? kod)

Jak ju? odkryli?cie nasz skrypt b?dzie idealnie pasowa? do creaturescripts. Pami?tajcie, ?e skrypty bardziej z?o?one mog? pasowa? do wielu kategorii, a nie tylko do jednej.
Kolejnym krokiem jest sprawdzanie kt?ra funkcj? system wywo?a, gdy otrzyma poziom. Tutaj jest lista (nie jestem pewien czy jest pe?na i aktualna), ale jak na pocz?tek mo?e by? :
PHP:
function onLogin(cid)     -- posta? loguj? si? do gry
function onLogout(cid)     -- posta? wylogowuje si? z gry 
function onJoinChannel(cid, channel, users)     -- posta? dochodzy do kana?u
function onLeaveChannel(cid, channel, users)     -- posta? opuszcza kana?
function onAdvance(cid, skill, oldLevel, newLevel)    -- posta? awansuje
function onLook(cid, thing, position, lookDistance)    -- posta? sprawdza opis obiektu (shift + PPM)
function onSendMail((cid, receiver, open, itemBox)    -- posta? wysy?a list
function onReceiveMail(cid, sender, open, itemBox)    -- posta? otrzymuj? list
function onTradeRequest(cid, target, item)    -- posta? chc? si? handlowa?
function onTradeAccept(cid, target, item)    -- posta? akceptuj? transakcje
function onTextEdit(cid, item, newText)        -- posta? edytuj? tekst (w ksi??ce)
function onReportBug(cid, comment)        -- posta? reportuj? b??d
function onThink(cid, interval)            -- posta? my?li
function onDirection(cid, old, current)        -- posta? zmienia kierunek
function onOutfit(cid, old, current)        -- posta? zmienia str?j
function onTarget(cid, target)    -- posta? zaznacza obiekt
function onFollow(cid, target)    -- posta? ?ledzi obiekt
function onAttack(cid, target)    -- posta? atakuj? obiekt
function onCast(cid, target)    -- posta? rzuca czar
function onKill(cid, target, damage, flags)    -- posta? zabija stworzenie (lub gracza)
function onDeath(cid, corpse, deathList)    -- posta? umiera
Jak wida? nasza funkcja to
PHP:
function onAdvance(cid, skill, oldLevel, newLevel)
Pod ka?dym z napis?w znajduj? si? jaka? warto?? dla aktualnego zdarzenia.


  • cid, czyli unikalny ID postaci
  • skill, czyli rodzaj umiej?tno?ci (poziom, magiczny poziom, walka mieczem itd.)
  • oldLevel, czyli poprzedni poziom
  • newLevel, czyli poziom, kt?ry teraz zdob?dziemy

Jak widzicie warto?ci kryj?ce pod nazwami (zmiennymi) s? nie znane, bo np. je?li posta? o ID 19920, dostanie awans z 1922 poziomu na w dziedzinie walki mieczem dane do tego b?d? takie


  • cid = 19920
  • skill = SKILL_SWORD
  • oldLevel = 19
  • newLevel = 22

Uwaga! SKILL__SWORD to tzw. alias (nazwa, kt?ra oznacza walk? mieczem - ustalona w plikach, w folderze "data/lib").
Teraz przechodzimy do kolejnego zadania, otwieramy plik data/creaturescripts/creaturescripts.xml i pod dowoln? linijk?, kt?ra stylem przypomina
PHP:
<event type="login" name="PlayerLogin" event="script" value="login.lua"/>
Dodajemy taki fragment kodu

PHP:
<event type="advance" name="bylejakanazwa" event="script" value="skrypt.lua"/>
Pierwsza warto?? kt?ra wyst?puj? w nawiasach po type to pod-typ skryptu - wystarczy uci?? z funkcji, kt?r? znale?li?my na li?cie przedrostek on i wszystko przepisa? ma?ymi literami. P??niej wpisujemy nazw?, mo?e by? ona oboj?tna (ale bez polskich znak?w), a na samych ko?cu w warto?ci value wpisujemy nazw? pliku, kt?ry zaraz zrobimy. Tutaj macie dok?adniejsze wyja?nienie

PHP:
<event type="pod-typ" name="nazwa" event="script" value="adres skryptu"/>
Teraz wystarczy zarejestrowa? zmienn?, aby system m?j potwierdzi? (zweryfikowa?) jej dzia?anie. M?wi?c, kr?tko, gdy tego podpunktu nie zrobimy nasz skrypt creaturescripts nie b?dzie dzia?a?. Wystarczy tylko doda? w pliku data/creaturescripts/scripts/login.lua doda? jedn? linijk? przyk?adowo takim kodem

PHP:
registerCreatureEvent(cid, "GuildMotd")

Fragment, kt?ry mamy doda? musi wygl?da? w?a?nie tak


PHP:
registerCreatureEvent(cid, "nazwa, kt?r? wcze?niej poda?e?")
Teraz ostatnim naszym zadaniem jest napisanie tego kodu - wi?c mog? powiedzie?, ?e si?gamy ju? ko?ca tego poradnika. Tworzymy nowy plik data/creaturescripts/scripts/skrypt.lua , kt?ry b?dzie mia? tak? warto?? (oczywi?cie zaraz wam wyt?umacz? jaka fraza dok?adnie co znaczy)

PHP:
function onAdvance(cid, skill, oldLevel, newLevel)
    if (skill == SKILL__LEVEL) then
        doPlayerAddItem(cid, 2146, 100)
    end
    return true
end
A teraz dwa obja?nienia dla tego skryptu - pierwsze na wz?r algorytmu, a p??niej obja?nienie skryptu (cz??ciowo, linijka po linijce).

PHP:
funkcja onAdvance(ID postaci, typ umiej?tno??, poprzedni poziom, zdobyty poziom)
    je?li (typ umiej?tno?ci r?wny jest umiej?tno?? poziom) wtedy
        dodaj przedmiot dla ID postaci (ID to 2146, ilo?? 100)
    koniec je?li
    zwr?? potwierdzenie
koniec funkcji
PHP:
function onAdvance(cid, skill, oldLevel, newLevel) -- funkcja, kt?ra odbierze system
    if (skill == SKILL__LEVEL) then -- sprawdzanie, czy umiej?tno?? to poziom
        doPlayerAddItem(cid, 2146, 100) -- dodanie nowego przedmiotu (o ID 2146, ilo?? to 100)
    end -- koniec sprawdzania
    return true -- zwr?? potwierdzenie
end -- koniec funkcji
Teraz skrypt powinien dzia?a? bez problemu - mo?e ?e co? ?le zrobili?cie. Wtedy radzi?by o ponownie przestudiowanie tego poradnika. To wszystko z mojej strony, je?li chodzi o bardzo nik?e podstawy programowania.
 

Xinx

Senior User
Joined
Jun 17, 2008
Messages
712
Reaction score
127
Age
31
Odp: LUA od podstaw! Poznaj i ty!

Poradnik jest ?adnie przygotowany, co wa?ne - jest czytelny oraz jest w nim zawarte wiele przydatnych wiadomo?ci, szczeg?lnie dla tych pocz?tkuj?cych skrypter?w. Gratulacje, kawa? dobrej roboty.
 

GM Kamo

Advanced User
Joined
Feb 12, 2009
Messages
168
Reaction score
6
Odp: LUA od podstaw! Poznaj i ty!

No, na boga, szcz??cie s? jeszcze ludzie, kt?rzy potrafi? swoj? wiedz? przekaza? innym...
Nie ma co, na prawd? si? postara?e?, szczere gratulacje. Sam z niego skorzysta?em.
 

Yoxino

Advanced User
Joined
Aug 12, 2009
Messages
478
Reaction score
51
Odp: LUA od podstaw! Poznaj i ty!

?adny poradnik, czytelny ale niestety (a mo?e stety) takich temat?w od podstaw jest tutaj du?o :)
Ale i tak 9/10

Pozdrawiam!
Yoxino
 
Top