Reklama
Pokazuje wyniki od 1 do 8 z 8

Temat: [Lua] Od zera do skryptera, czyli LUA: PODSTAWY i Actions*

  1. #1
    Avatar Grim90
    Data rejestracji
    2007
    Położenie
    Toruń / Brzozówka
    Wiek
    34
    Posty
    586
    Siła reputacji
    17

    Domyślny [Lua] Od zera do skryptera, czyli LUA: PODSTAWY i Actions*

    Witam, postanowiłem napisać poradnik tak, by ułatwić wszystkim zrozumienie LUA.

    LUA jest językiem skryptowym powstałym po to, by ułatwić pracę na OTS. Zamiast grzebać w C++ można grzebać w LUA co znaaaacznie przyspiesza i ułatwia całą robotę :)

    Do rzeczy!
    Na OTS jest kilka rodzajów 'zdarzeń':
    ACTIONS: Tutaj dzieje się wszystko, na co dasz USE, czyli klikniesz z controlem (o ile ktoś ma classic control wyłączone).
    MOVEMENTS - Tutaj dzieje się wszystko, co ma związek z wejściem na jakąś kratkę, zejściem, położeniem itemu gdzieś, zdjęciem go z miejsca, założeniem na siebie itemu itd.
    CREATURESCRIPTS - Uwaga! Na starszych OTS tego nie ma! CreatureScripts to zdarzenia związane z logowaniem gracza, wylogowaniem, śmiercią gracza, śmiercią potwora, zabiciem potwora.
    NPC - Nazwa mówi sama za siebie.
    SPELLS - Czary na naszym OTS.
    TALKACTIONS - Wszystko, co jest związane ze słowami. Można też dodać parametr słowa " i to, co jest po nim
    To chyba na tyle.

    Najłatwiej będzie na początek zrobić coś w actions.
    W folderze tym jest plik actions.xml

    Pliki XML to coś w rodzaju pojemników informacji, które pierw czyta OTS. W przypadku actions i innych, możesz napchać tysiące plików skryptów a Twój serwer i tak ich nie odczyta, jeśli nie dodasz stosownej linijki do actions.xml
    No ok, stwórzmy pierwszy skrypt. Niech to będzie dźwignia. Załóżmy, że gdy ją pociągniemy, otrzymamy jabłko.

    Polecam program Notepad++ do pisania skryptów.
    Wobec tego otwieramy actions.xml prawym przyciskiem myszki i 'edit with notepad++'.

    http://sourceforge.net/projects/notepad-plus/

    Aby dodać swój skrypt wystarczy linijka:

    <action itemid="1945" event="script" value="skrypt.lua"/>
    itemid określa id, co widać w cudzysłowiu. event nie zmieniamy a w value mamy ścieżkę do danego skryptu. Prościutkie.

    No ale chwila. Załóżmy, że mamy dwie dźwignie na OTS. Jak rózróżnić wówczas, o którą nam chodzi?

    ACTION ID
    Action ID jest czymś w rodzaju zmiennej, którą może posiadać KAŻDY item na OTS. Możesz jej ustalić 0, 100, 15123, ile chcesz.

    Gdy damy dźwigni action ID np. 2566 będzie to wyglądać wówczas tak:

    <action actionid="2566" event="script" value="skrypt.lua"/>
    No ok, jeśli nasza dźwignia ma taki action id już w edytorze map, dodaliśmy tę linijkę (musi być dodana powyżej '</actions>'), to czas na skrypt.

    Wchodzimy do foldera 'scripts' i tworzymy nowy plik tekstowy. Zmieniamy nazwę i wpisujemy 'skrypt.lua'.
    Uwaga! Musisz mieć ustawioną możliwość widzenia rozszerzenia pliku, tzn. dla skryptow .lua, dla dokumentów tekstowych .txt, inaczej skrypt ci się nie załaduje, bo będzie txt!

    By włączyć wyświetlanie rozszerzeń, w Eksploratorze Windows wybierz Narzędzia | Opcje folderów | Widok. Następnie odznacz opcję Ukryj rozszerzenia plików znanych typów.
    Ok, prawym na nasz skrypt i edit with notepad++.

    Cóż, na razie jest pusty :) No bo jaki ma być? Czas go zapełnić.

    Po pierwsze: Musimy go zabezpieczyć, jeśli by nam odbiło i pomyłkowo dalibyśmy innemu itemowi ten sam action ID. Załóżmy miecz jakiś by był z tym samym action id i gracz, który dawałby na niego 'use' dostawałby jabłko o.O. No ale to zaraz.

    Wszystkie skrypty actions skupiają się w środku funkcji onUse:

    function onUse(cid, item, fromPosition, itemEx, toPosition)

    end
    To, co widzisz w nawiasie to parametry funkcji, tzn. dane, którymi możemy operować.
    - cid oznacza gracza, który tę funkcję wywołuje, najprościej mówiąc CID = ja.
    - item to najprościej ujmując przedmiot, którego dotyczy cała akcja. W tym przypadku dźwignia.
    - fromPosition - pozycja w postaci tablicy, z której dano use
    - itemEx - w przypadku np. kilofu (pick), gdzie use zamiast na niego, dajemy np. na ziemię, wykorzystując owy kilof.
    - toPosition - pozycja w postaci tablicy, miejsca docelowego, na które dano use

    No ok, to chyba było banalne na razie. Zatem teraz pora na owe zabezpieczenie. Musimy przekazać OTSowi, że nam w tym przypadku chodzi tylko i wyłącznie o dźwignię. Odrzuci to wszystkie inne przedmioty i weźmie tylko pod uwagę dźwignie, które będą miały action id 2566.

    Kod:
    function onUse(cid, item, fromPosition, itemEx, toPosition)
    	if item.itemid == 1945 then
    
    	end
    end
    Mamy już najprostszy skrypt, co prawda nic nie robi, ale mamy :) Każdy IF musi mieć jeden end dla siebie, funkcja również, co widać. znaczek 'równa się', czyli '=' jest napisany podwójnie, to nie błąd, podwójne równa się oznacza przyrównywanie, pojedyncze oznacza nadpisanie wartości.

    X == Y <- sprawdza, czy X jest równy Y
    X = Y < - nadpisuje X wartością Y

    No dobra, teraz wprowadźmy coś do środka. ID jabłka to 2674.
    Funkcja dająca item... to doPlayerGiveItem(uid, item, count)

    Ok, teraz znowu widzimy nawias a w nim parametry. uid to id gracza, czyli wpiszemy... cid :), item to jabłko, czyli 2674 a count to ilość, dajmy 1: doPlayerGiveItem(cid, 2674, 1)

    Kod:
    function onUse(cid, item, fromPosition, itemEx, toPosition)
    	if item.itemid == 1945 then
    		doPlayerGiveItem(cid, 2674, 1) 
    	end
    end
    Wyjaśnię to najprościej z możliwych: jeśli pociągniesz za dźwignię z action id 2566, ots zauważy to i otworzy nasz skrypt, dalej jest filtrowanie, JEŚLI ID PRZEDMIOTU TO 1945, daj graczowi jabłko.

    Zapisujemy, wchodzimy na OTS, idziemy do naszej dźwigni i pociągamy :)

    if oznacza jeżeli, ale istnieją też inne operatory:

    if - jeśli
    elseif - przeciwnie, jeśli
    else - w przeciwnym wypadku
    To są podstawowe, o innych może napiszę :)

    Ok, przeróbmy nasz skrypt tak, by sprawdzał lvl gracza.

    Kod:
    function onUse(cid, item, fromPosition, itemEx, toPosition)
    	if item.itemid == 1945 then -- jeśli  id przedmiotu to 1945...
    		if getPlayerLevel(cid) >= 20 then -- jeśli gracz ma poziom wyzszy niz 20 albo rowny 20...
    			doPlayerGiveItem(cid, 2674, 1)  -- daj graczowi jablko
    		else -- w przeciwnym wypadku
    			doPlayerSendTextMessage(cid,22,"NOOBOWI NIE DAJE JABLEK!")  -- daj komunikat
    		end
    	end
    end
    Od razu zaznaczam, że wszystko, co jest napisane po -- jest komentarzem i nie jest brane pod uwagę przez nasz OTS.

    Myślę, że ten skrypt jest zrozumiały.

    Przedstawię teraz zmienne i powiem mniej więcej, po co są.

    LOCAL - zmienna lokalna, wywołuje się podczas wykonywania kodu, skryptu i ginie po jego zakończeniu. Jest to szybka, tymczasowa zmienna wewnętrzna, niekolidująca z niczym. Wywołuje się ją poprzez napisanie
    local nazwazmiennej
    GLOBAL - zmienna globalna, różni się tylko tym, że wywołuje się ją nie pisząc po prostu local i wywołuje się podczas startu OTSa. Jesli masz dwie takie same zmienne globalne o różnych wartościach, może nastąpić konflikt.
    Po co jest zmienna? Przykładowo mamy skrypt, w którym jest dwadzieścia miejsc, w których musimy podać np. id naszego jabłuszka :) Zamiast podawać 20x 2674 możemy wyżej dać
    Kod:
    local jablko = 2674
    i wszędzie zamiast 2674 wpisac po prostu... jablko :) Jakież to banalne.

    No ok, ale teraz co, gdy mamy więcej warunków, nie tylko level 20 i każdy inny przypadek?

    Z pomocą przychodzi else if :)

    Kod:
    function onUse(cid, item, fromPosition, itemEx, toPosition)
    
    	local oplata = 1000 -- tworze zmienna oplata
    
    	if item.itemid == 1945 then -- jesli ID przedmiotu to 1945...
    		if getPlayerLevel(cid) == 20 then -- ...jesli poziom jest rowny 20...
    			doPlayerGiveItem(cid, 2674, 1)  -- ... gracz dostaje jablko
    		elseif getPlayerLevel(cid) >= 30 then -- ... jesli poziom jest wiekszy lub rowny 30...
    			if doPlayerRemoveMoney(cid, oplata) == TRUE then --- ... jesli udalo sie pobrac od gracza oplate, ktora wczesniej zadeklarowalismy na 1000 gp...
    				doPlayerSendTextMessage(cid,22,"HAHAHA OKRADLEM CIE!")  -- ... dzwignia go okrada :(
    			end -- zakonczmy teraz to
    		else -- w przeciwnym wypadku...
    			doPlayerSendTextMessage(cid,22,"NOOBOWI NIE DAJE JABLEK!") -- ... gracz ma zly poziom na dostanie jablka
    		end -- zakonczmy teraz to
    	end -- zakonczmy teraz to
    end -- zakonczmy teraz to
    Mam nadzieję, że to nie było trudne.

    To są podstawy podstaw LUA

    Jak ktoś chce WSZYSTKIE funkcje LUA to polecam np.
    http://forum..pl/showthread.php?t=504
    http://otland.net/f55/lua-functions-list-14039/

    W następnym poradniku opiszę MOVEMENTS
    Piszę skrypty do OTS. Chcesz mieć unikalny quest, lub skrypt na swoim serwerze? Pisz do mnie. Na pewno się dogadamy.
    Piszę skrypty PHP, strony oraz gotowe serwisy, jeśli jesteś zainteresowany, napisz.
    http://radeg.pl

    Masz facebooka? Zapraszamy do grupy: Grim OTS!
    http://www.facebook.com/?ref=logo#!/...07707075989449

  2. #2
    Avatar Aureos
    Data rejestracji
    2009
    Wiek
    31
    Posty
    6,608
    Siła reputacji
    20

    Domyślny

    Co prawda do tutoriali z otlandu się nie równa, ale uznałbym to za najbardziej przystępny poradnik o lua na polskich forach ;]

    Zdania które najbardziej mi się spodobały: ;D
    To, co widzisz w nawiasie to parametry funkcji, tzn. dane, którymi możemy operować.
    Nigdzie tego nie było więc trzeba się było samemu domyślec ;p a tu jest
    Wyjaśnię to najprościej z możliwych: jeśli pociągniesz za dźwignię z action id 2566, ots zauważy to i otworzy nasz skrypt, dalej jest filtrowanie, JEŚLI ID PRZEDMIOTU TO 1945, daj graczowi jabłko.
    ---------------------

    Zabrakło mi wyjaśnienia, jaką funkcję pełni "RETURN". Ale ogólnie git

    Pisz wiencej1!!!1!!
    8/10

  3. Reklama
  4. #3
    Inteligentny

    Domyślny

    Czyli, że sugerujesz iż język LUA powstał specjalnie dla OTSów? lolz

  5. #4
    Avatar Pimpeq
    Data rejestracji
    2006
    Położenie
    :D
    Wiek
    31
    Posty
    39
    Siła reputacji
    0

    Domyślny

    Kiedyś też tak myślałem ^^ Pouczę się jeszcze lua i też napiszę artykuł o lua :P Ale opiszę takie funkcję, o których istnieniu 90% z was nigdy nie słyszała :P

    Interpreter lua ;) Sprawdź swoje skrypty bez odpalania otsa :P http://grzyby.no-ip.info/lua.exe

  6. #5
    Avatar Grim90
    Data rejestracji
    2007
    Położenie
    Toruń / Brzozówka
    Wiek
    34
    Posty
    586
    Siła reputacji
    17

    Domyślny

    Cytuj Inteligentny napisał Pokaż post
    Cytat został ukryty, ponieważ ignorujesz tego użytkownika. Pokaż cytat.
    Czyli, że sugerujesz iż język LUA powstał specjalnie dla OTSów? lolz
    Ja? Gdzie?
    Piszę skrypty do OTS. Chcesz mieć unikalny quest, lub skrypt na swoim serwerze? Pisz do mnie. Na pewno się dogadamy.
    Piszę skrypty PHP, strony oraz gotowe serwisy, jeśli jesteś zainteresowany, napisz.
    http://radeg.pl

    Masz facebooka? Zapraszamy do grupy: Grim OTS!
    http://www.facebook.com/?ref=logo#!/...07707075989449

  7. #6
    Avatar Pimpeq
    Data rejestracji
    2006
    Położenie
    :D
    Wiek
    31
    Posty
    39
    Siła reputacji
    0

    Domyślny

    Ty. Tu.
    Wszystkie funkcje lua powiadasz? Zabrzmiało to tak, że wykuję na pamięć funkcję do otsa i będę master z lua ;]
    A słyszałeś o takiej funkcji unpack? :)

    Interpreter lua ;) Sprawdź swoje skrypty bez odpalania otsa :P http://grzyby.no-ip.info/lua.exe

  8. #7
    Avatar Grim90
    Data rejestracji
    2007
    Położenie
    Toruń / Brzozówka
    Wiek
    34
    Posty
    586
    Siła reputacji
    17

    Domyślny

    Przecież to oczywiste, że ja tu piszę pod kątem OTSa. Kogo tu interesuje LUA, który jest językiem skryptowym całkiem innych aplikacji?

    A LUA używam również we własnym programie, który piszę.

    Lua ma wiele zastosowań, niekoniecznie OTS, chociaż jest tu popularnym językiem interpretowanym.
    Ostatnio zmieniony przez Grim90 : 01-08-2009, 21:31
    Piszę skrypty do OTS. Chcesz mieć unikalny quest, lub skrypt na swoim serwerze? Pisz do mnie. Na pewno się dogadamy.
    Piszę skrypty PHP, strony oraz gotowe serwisy, jeśli jesteś zainteresowany, napisz.
    http://radeg.pl

    Masz facebooka? Zapraszamy do grupy: Grim OTS!
    http://www.facebook.com/?ref=logo#!/...07707075989449

  9. #8
    Avatar Killavus
    Data rejestracji
    2005
    Położenie
    Wrocław
    Wiek
    31
    Posty
    915
    Siła reputacji
    19

    Domyślny

    Cytuj Pimpeq napisał Pokaż post
    Cytat został ukryty, ponieważ ignorujesz tego użytkownika. Pokaż cytat.
    Ty. Tu.

    Wszystkie funkcje lua powiadasz? Zabrzmiało to tak, że wykuję na pamięć funkcję do otsa i będę master z lua ;]
    A słyszałeś o takiej funkcji unpack? :)
    Nie chce mi się sprawdzać, ale pewnie coś związanego z formatowaniem strumieni bajtów?

    Dodam od siebie, że w celu nauczenia się składni czystego języka Lua, polecam stronę http://lua.org/ - znajdują się tam funkcje biblioteki standardowej (którą Pimpek tak szpanuje), parę (dość skomplikowanych niestety) przykładów instrukcji manipulujących wykonywaniem kodu (oprócz ifów jest sporo więcej), oraz wszelkie informacje potrzebne, aby osadzić skrypty *.lua w swoim programie napisanym w C / C++ (popularnie zwie się to API).

    Lua to dość prymitywny, proceduralny (to małe kłamstwo - czytajcie dalej :P) aczkolwiek całkowicie wystarczający do pracy z OpenTibią język skryptowy. Został wybrany ze względu na swoją lekkość i zadowalającą szybkość. Warto jednak zauważyć, że jest dość specyficzny - umożliwiający programowanie strukturalne, lecz robiący to w stylu bodajże (nie pamiętam dokładnie, proszę mnie poprawić jak coś) Smalltalka - z użyciem metatablic. Świetnym skrypterem Lua jest Jiddo - ten od starego już NPC systemu. Myślę, że jeżeli interesuje Cię ta tematyka i masz już dość dobrze opanowane podstawy, warto poczytać kod tego systemu, aby dowiedzieć się więcej na temat skomplikowanego tematu, jakim jest programowanie strukturalne w języku Lua. Przyda się to w pisaniu kodu w stylu DRY (nie powtarzaj sie).

    PS Zostawiam ten temat, chociaż osobiście skłaniałbym się do poradnika Tairensa pod względem przydatności - niemniej jednak - doskonała robota. Dlatego też niech zostaną oba :).

    Pozdrawiam
    Killavus
    Ostatnio zmieniony przez Killavus : 02-08-2009, 01:35

Reklama

Informacje o temacie

Użytkownicy przeglądający temat

Aktualnie 1 użytkowników przegląda ten temat. (0 użytkowników i 1 gości)

Podobne tematy

  1. [LUA] Krótsze odpowiedniki w lua - autorstwa Grimkka
    Przez Grimekk w dziale Artykuły developerskie
    Odpowiedzi: 2
    Ostatni post: 13-01-2014, 18:36
  2. [C++,LUA,XML] Jak zacząć od zera programowanie ?
    Przez | Nurgiel | w dziale Strefa developerska
    Odpowiedzi: 3
    Ostatni post: 27-05-2011, 10:18
  3. [Lua] Od zera do skryptera, czyli LUA: Pętle i tablice*
    Przez Grim90 w dziale Artykuły developerskie
    Odpowiedzi: 9
    Ostatni post: 21-08-2010, 02:47
  4. [Lua] Podstawy języka*
    Przez Tairens w dziale Artykuły developerskie
    Odpowiedzi: 12
    Ostatni post: 02-08-2009, 14:24
  5. [Podstawy] Podstawy związane z bazą danych MySQL dla OpenTibii*
    Przez Killavus w dziale Artykuły developerskie
    Odpowiedzi: 24
    Ostatni post: 27-06-2009, 22:32

Zakładki

Zakładki

Zasady postowania

  • Nie możesz pisać nowych tematów
  • Nie możesz pisać postów
  • Nie możesz używać załączników
  • Nie możesz edytować swoich postów
  •