Reklama
Pokazuje wyniki od 1 do 13 z 13

Temat: [Lua] Podstawy języka*

  1. #1

    Data rejestracji
    2006
    Posty
    27
    Siła reputacji
    0

    Domyślny [Lua] Podstawy języka*

    Zaczynając artykuł chciałbym stwierdzić, że w silnikach nastąpiło dość duże rozróżnienie w posiadanych funkcjach.
    Ja będe opierał się na tych Tfs'owskich gdyż wydaje mi się, że jest to teraz najpopoularniejszy silnik.
    Podstawowymi funkcjami o które opiera się każdy skrypt są:

    Actions:
    Kod:
    function onUse(cid, item, fromPosition, itemEx, toPosition)
    	cid - użytkownik
    	item - przedmiot używany
    	formPosition - pozycja na której znajduje sie użytkownik przedmiotu
    	itemEx - przedmiot na którym został użyty przedmiot (item)
    	toPosition - pozycja na której znajduje się przedmiot
    	Wywoływana gdy używamy przedmiotu.
    	Deklaracja w actions.xml:
    	<action itemid="itemid" script="sciezka.lua" />
    	<action uniqueid="uniqueid" script="sciezka.lua"/>
    	<action actionid="actionid" script="sciezka.lua"/>
    Movements:
    Kod:
    function onAddItem(moveitem, tileitem, position):
    	moveitem - przedmiot na którym 'wrzucamy' przedmiot
    	tileitem - kratka na którą 'wrzucamy' przedmiot
    	position - pozycja
    	Wywoływana gdy 'rzucimy' jakiś przedmiot na drugim.
    	Szczerze się przyznam, że onAddItem raz wychodzą raz nie więc ekspertem w nich nie jestem.
    	Deklaracja w movements.xml:
    	<movevent event="AddItem" tileitem="1" itemid="itemid" script="dough.lua"/>
    function onStepIn(cid, item, position, fromPosition)
    	cid - użytkownik
    	item - przedmiot
    	position - pozycja
    	formPosition - z pozycji
    	Wywoływana gdy po wejściu na daną pozycje.
    	Deklaracja w movements.xml:
    	<movevent event="StepIn" itemid="itemid" script="sciezka.lua""/>
    	<movevent event="StepIn" uniqueid="uniqueid" script="sciezka.lua"/>
    	<movevent event="StepIn" actionid="actionid" script="sciezka.lua"/>
    function onStepOut(cid, item, position, fromPosition)
    	Argumenty funkcji jak wyzej.
    	Wywołana po zejściu z danej pozycji.
    	Deklaracja w movements.xml:
    	<movevent event="StepOut" itemid="itemid" script="sciezka.lua""/>
    	<movevent event="StepOut" uniqueid="uniqueid" script="sciezka.lua"/>
    	<movevent event="StepOut" actionid="actionid" script="sciezka.lua"/>
    function onEquip(cid, item, slot)
    	cid - użytkownok
    	item - przedmiot
    	slot - miejsce na które wkładamy przedmiot
    	Wywoływana po założeniu jakiegoś Eq
    	Deklaracja w movements.xml:
    	<movevent event="Equip" itemid="itemid" slot="slot" function="sciezka.lua"/>
    function onDeEquip(cid, item, slot)
    	Odwrotność funckji onEquip. Argumenty te same.
    	Deklaracja w movements.xml:
    	<movevent event="DeEquip" itemid="itemid" slot="slot" function="sciezka.lua""/>
    Talkactions
    Kod:
    function onSay(cid, words, param)
    	cid - użytkownik
    	words - słowo kluczowe(stałe)
    	param - parametr(w odróżnieniu od words jest zmienne)
    	Funkcja wywoływana mową
    	Deklaracja w talkactions.xml:
    	<talkaction words="słowo_kluczowe" script="sciezka.lua"/>
    Uważam, że są to informacje podstawowe. Nie chce narazie wdrażać się w tematyke Creaturescripts gdyż wydaje mi się, że i tak każdy zacznie
    od talkactions ,a reszta sama przyjdzie, lecz na pewno potem rozwine o Creaturescripts ten artykuł.

    Tak jak powiedziałem, mój artykuł opierać się będzie o TFS, lecz nie chciałbym zupełnie wprowadzić jedynie funkcje TFS'owskie, więc wkleje
    funkcje które były dostępne w TFS 0.2. <a href = "http://rafb.net/p/a6IwIa68.html">Funkcje</a>

    Podstawy jakiegokolwiek działania już mamy, więc teraz możnaby przejść do samego programowania w lua.

    I.Typy zmiennych

    W lua zmienne nie są tak rygorystycznie potraktowane jak w np c++, gdzie każda deklaracja poprzedzona jest typem zmiennej.
    Są dwa rodzaje zmiennych:
    lokalne - 'local'
    globalne - najczęściej zapisywane w global.lua lub w lib/constant.lua
    Zmienne mogą przyjmować takie wartości jak:
    boolen - wartość logiczna zwracana wartość to true/false
    integer - wartość liczbowa zwraca poprostu liczbe
    tablicowa - zbiór elementów, niekoniecznie jednej maści

    Jak deklarujemy zmienne:
    Kod:
    local logiczna = false ---boolen
    local liczba = 15 -- integer
    local tablica = {15, 20, 16, 50} -- tablicowa
    local str = "String"
    local str2 = 'String'
    -- laczenie (konkatenacja) lancuchow - nie mozna uzywac +!
    local osoba = "Tato"
    local str3 = "Witaj" .. osoba .. "!"
    -- str3 => "Witaj Tato!"
    Możliwe jest również sprawdzenie typu zmiennej. W tym wypadku używamy funkcji:
    Kod:
    type(nazwa_zmiennej)
    Kod:
    local n = 12
    local s = 't'
    local t = { 1, 2, 3 }
    local x = true
    doPlayerSendTextMessage( cid, MSG_INFO_DESCR,
       type( n ) .. ' ' .. type( s ) .. ' ' .. type( t ) .. ' ' .. type( x ) )
    -- wypisze graczowi => number string table boolean
    II.Operatory arytmetyczne

    Operatory arytmetyczne to nic prosteszego tylko znane Nam z matematyki znaki. Nie będe się tutaj rozwodził na ich temat bo znacie na pewno je doskonale
    ze szkoły. Przejdź od razu do ich działania w lua.

    Kod:
    ==  Znak przyrównania
    =   Znak równości, nadaje wartość zmiennej
    +   Znak dodawania
    -   Znak odejmowania
    ~=  Znak oznaczający że coś jest różne od
    >   Znak większości
    <   Znak mniejszości
    <=  Znak mniejszy lub równy
    >=  Znak większy lub równy
    Uważam, że to są to najważniejsze operatory arytmetyczne. Niech nie zwiedzie Was to że to matematyka itd, bo dobre ich opanowanie to klucz do dobrego
    programowania.

    III.Instrukcje warunkowe

    Instrukcje warunkowe to bardzo proste instrukcje sprawdzające najczęściej czy lewa strona spełnia nierówność z prawą stroną. To tego będą potrzebne
    nam operatory arytmetyczne omówione z poprzednim rozdziale. Wygląda ona tak:
    Kod:
    	if cos operator_aryt cos2 then
    		--kod
    	elseif cos operator_aryt cos2 then
    		--kod
    	else
    		--kod
    	end
    Kod:
    Czyli np.:
    	if 4 == 5 then
    		--Warunek nie spełniony przechodzimy dalej.
    	elseif 4 == 4 then
    		--Warunek spełniony, tutaj będzie pracować nasz skrypt
    	else
    		--Jeżeli oba powyższe warunki nie byłyby spełnione wykonałoby sie to
    	end	-- Każda instrukcje kończymy end'em.
    Są też zagnieżdżone instrukcje warunkowe które w lua są dość często spotykane tzn.:
    Kod:
    	if 4 ~= 5 then
    		if 8 == 8 then
    			--kod
    		else
    			--kod
    		end
    	else
    		--kod
    	end
    W takim wypadku else zawsze nalezy do najblizszego if'a.
    W instrukcjach warunkowych moga rowniez wystapic zmienne np.:
    Kod:
    local cos = 10
    local cos1 = 15
    	if cos == cos1 then
    	elseif cos > cos1 then
    	else
    	end
    W tym wypadku porownujemy dwie zmienne.Do ktorych przypisane są wartości. W przypadku zmiennych logicznych sprawdzana jest zgodność
    wartości logicznych.

    IV.Troche wiecej o tablicach
    [code]
    local tablica = {15, 20, 16, 50}
    [code]
    Jest to znany Nam przyklad z poprzedniego paragrafu. Jest to tablica 4-elementowa. W lua nietypowym jest numerowanie elementów tablicy.
    Przebiega ona od numeru 1, a nie jak większośći języków programowania od 0.
    Chcą 'wyciągnąć' wartość 20 z naszej tablicy odnosimy sie poprostu w ten sposób
    Kod:
    tablica[2]
    Tablice używane są najczęściej do optymalizacji kodu, w czym pomagają pętle, o których zaraz powiemy.

    Istnieje również typ tablic w których sami możemy decydować o ich indeksowaniu.
    Teraz prawdopodobnie wydaje Ci się 'Ledwo co rozumiem zwykłe tablice, a teraz te o jeszcze innych zasadach panujących'.
    Spokojnie, wrócisz do tego na pewno gdy zwykłe tablice będą Ci ciążyły ;)
    Nazwa tych tablic, to tablice asocjacyjne.

    Zacznijmy od przykładu:
    Kod:
    local tab = { 1, 2, 3, foo = 'bar' }
    -- tab[1] == 1
    -- tab[2] == 2
    -- tab[3] == 3
    -- tab.foo == 'bar'
    Jak widzisz w pierwszych trzech elemenetach indeksowanie jest standardowe, ale element numer 4.
    W tym wypadku indeksem tablicy jest nie liczba [4], ale 'foo'.
    To nie wszystko, bo możemy również stworzyć tablicę w tablicy:
    Kod:
    local tab = 
    [2134] = {4, 8, 3, 5}
    [2135] = {4, 8, 3, 5}
    [2136] = {4, 8, 3, 5]
    Chcą wyciągnąć wartość 5, z tablicy o indeksie [2134], stosuje coś takiego:
    Kod:
    tab[2134][4]
    V.Pętle
    Pętle są to swoiste funkcje które powtarzają kod w określonej liczbie razy. Właście w pętli możemy skorzystać z dobrodziejstw niesionych przez
    tablica. No to zacznijmy od kodu, to rozjaśni sytuacje.

    Mamy dwa kody, pierwszy jest bez użycia pętli:
    Kod:
    function onUse(cid, item, fromPosition, itemEx, toPosition)
    
    if item.uid == 1234 then
    	doPlayerAddItem(cid, 4567, 1)
    	doPlayerAddItem(cid, 4568, 1)
    	doPlayerAddItem(cid, 4569, 1)
    	doPlayerAddItem(cid, 4570, 1)
    	doPlayerAddItem(cid, 4571, 1)
    	doPlayerAddItem(cid, 4572, 1)
    	doPlayerAddItem(cid, 4576, 1)
    	doPlayerAddItem(cid, 4574, 1)
    	doPlayerAddItem(cid, 4579, 1)
    end
    end
    Coś dużo takich samych instrukcji wyszło, co nie?
    Spójrzmy teraz na kod z użyciem pętli:
    Kod:
    function onUse(cid, item, fromPosition, itemEx, toPosition)
    local tablica = {4567, 4568, 4569, 4570, 4571, 4572, 4576, 4574, 4579}
    if item.uid == 1234 then
    	for i = 1, #tablica do
    		doPlayerAddItem(cid, tablica[i], 1)
    	end
    end
    end
    Czy nie wygląda to estetyczniej i czytelniej?
    Teraz przejdźmy do samej budowy pętli:
    Kod:
    	for (wartosc liczbowa(bardzo czesto i = 1), do jakiej wartości liczbowej i ma zapętlać) do
    		ciało_pętli
    	end
    Ja w swojej pętli użyłem znaczka '#' jest on niczym innym jak operatorem pobierającym największy element tablicy co w wypadku
    pokazanej wyżej tablicy to 9.
    Ciekawie tez wyglada sama funkcja:
    Kod:
    	doPlayerAddItem(cid, tablica[i], 1)
    W tym wypadku poprostu pobiera element tablicy, ponieważ zmienna jaka jest i, przyjmuje dla kazdego zapetlenie wartosc wieksza o 1.

    Istnieją również pętle które wspomagają użycie tablic asocjacyjnych podanych jak przykład pierwszy, wróć proszę do nich
    czytając tą część poradnika o pętlach ;)

    Pierwszy rodzaj pętli:

    Kod:
    for element in tablica do
       -- w tej petli przy kazdej iteracji (obiegu) zmienna element bedzie ustawiana na nastepny element tablicy.
    end
    Drugi rodzaj pętli:

    Kod:
    for klucz, element in pairs( tablica ) do
       -- druga wersja - w tym wypadku zmienna klucz bedzie ustawiona na klucz do wartosci, a element na wartość. Przykladowo dla tablicy:
       -- tab = { 12, 23, 36, x = 'y' }
       -- zmienne beda przyjmowaly nastepujace wartosci:
       -- klucz = 1, element = 12
       -- klucz = 2, element = 23
       -- klucz = 3, element = 36
       -- klucz = 'x', element = 'y'
    end
    No i oczywiście przyda się przykład, który jest zaczerpnięty z silnika DeadTouch:
    Kod:
    local itemArr =
    {
    item.itemid,
    item.actionid,
    item.uid,
    pos.x,
    pos.y,
    pos.z
    }
                            
    local itemArrNames = { "ID", "AID", "UID", "X", "Y", "Z" }
                            
    for i, v in pairs(itemArr) do
        if type(v) ~= "table" then
            if v ~= 0 and v < 70000 then                                    
                 msg = msg .. "[" .. itemArrNames[i] .. ": " .. v .. "]"
            end
        else
            msg = msg .. "[" .. itemArrNames[i] .. ": " .. implode(v, "/") .. "]"
        end
    end
    VI.Funkcje
    Pisząc ten artykuł, użyłem w nim pare razy funkcji, nie informując Cię Drogi Czytelniku o tym, za co serdecznie przepraszam.
    Teraz poświęce ten podrozdział tylko funckjom, co myślę zrekompensuje moje wcześniejsze niedbalstwo.

    Zacznijmy od prostego przykładu, funkcji:
    Kod:
    doPlayerAddItem(cid, item_id, ilosc)
    Tak wygląda bez 'dopasowania' do danej sytuacji argumentów, a tak gdy mamy konkretny przykład:
    Kod:
    doPlayerAddItem(cid, 4567, 1)
    Zacznijmy od tego, że funkcja to zbite w jakieś konkretne informacje, działanie który ma określony cel, czyli
    na przykład funkcja wyżej podana ma dać nam item.Abyśmy mogli decydować jaki to item i ile tych itemów potrzebne nam
    są argumenty funkcji.

    Kod:
    doPlayerAddItem(cid, item_id, ilosc)
    To teraz spróbujmy napisać własną funkcję:
    Kod:
    function onDoQuest(cid, storage_value, reward, reward_number)
    Chcemy, aby ta funkcja dawała graczowi item o id = reward , o ilosc = reward_number oraz zmieniała storage value = storage_value
    Cid tutaj oznacza osobę wykonująca tzn gracza.
    Musimy się zastanowić, co zrobić, aby nasza funkcja była jak najbardziej uniwersalną, aby podczas używania jej w skrypcie
    nie trzebaby dodawać za dużo instrukcji.
    1. Na pewno musimy sprawdzić czy gracz już czasem nie zrobił danego questa
    2. Musimy sprawdzić czy gracz ma tyle wolnego capa.
    3. Jeżeli spełnia te warunki no to musimy mu dać item.
    4. Miło też by było gdyby wiedział co dostaje, więc wyświetlamy nazwę itemu.
    5. Trzeba również się zabezpieczyć przed kolejnym wykonaniem tego quest'a.
    6. Jeżeli nie spełnił dwóch pierwszych warunków, trzeba go o tym poinformować.

    Jeżeli już wszystko obmyśliliśmy i mamy pewność, jak nasza funkcja ma działać, to bierzemy się za jej pisanie.
    W moim wypadku wygląda to tak:

    Kod:
    function onDoQuest(cid, storage_value, reward, reward_number)
    local freeCap = getItemWeight(reward, reward_number)
    local itemName = getItemNameById(reward)
    	if getPlayerStorageValue(cid, storage_value) < 1 then
    		if getPlayerFreeCap(cid) >= freeCap then
    			doPlayerAddItem(cid, reward, reward_number)
    			setPlayerStorageValue(cid, storage_value, 1)
    			doPlayerSendTextMessage(cid, MESSAGE_EVENT_ADVANCE, "You have found "..reward_number..""..itemName..".")
    		else
    			doPlayerSendCancel(cid, "You don/'t have enough capacity.")
    		end
    	else
    		doPlayerSendCancel(cid, "It is empty.")
    	end
    	return TRUE
    end
    Widzicie zapewne w przed ostatniej linijce 'return TRUE', to jest tzw zwracanie wartości, w tej funckji akurat zwraca 1, ponieważ(dziękuje za przypomnienie Killa) w tym wypadku w global.lua TRUE = 1, FALSE = 0.
    Może również zwracać:
    Kod:
    return 10
    local zmienna = 40
    return zmienna
    return FALSE --return 0
    local table = {}
    return table
    VII.Eventy
    Ostatnim rozdziałem będą eventy. Są to funkcje wywołujące funkcje po określonym czasie.
    Na przykład mamy funkcję zabierzGraczowiPunktyŻycia(ilość_pkt_życia).
    Chcemy żeby ta funkcja zadziałała no, ale np po 10 sekundach. Nic prostszego!
    Z pomocą przychodzą nam właście Eventy.
    Wyglądają one tak:
    Kod:
    ciekawyEvent = addEvent(funkcja_uzywana, czas_w_milisekundach, argumenty_funkc_używanej)
    Umieściłem go w zmiennej ciekawyEvent, ponieważ przyda nam się to aby można zastopować Event w razie jakiejś ewentualności.
    Wyglądałoby to tak:
    Kod:
    stopEvent(ciekawyEvent)
    Wywołując nasz konkretny Event będzie to wyglądało tak:
    Kod:
    addEvent(zabierzGraczowiPunktyŻycia, 10 * 1000, {10})
    -------------------------------------------------------------------------------------------------------------------------------
    Dziękuje bardzo Killavusowi za wzbogacenie tego artykułu paroma cennymi informacjami(pętle, zmienna string, motywacja do napisania o tablicach asocjacyjnych, jak i rozpoczęcie tego wątku.)
    Artykuł pogłębiłem o pare informacji jak i dodałem dział o Funkcjach oraz o Eventach.
    Jeżeli widzicie jakieś błędy lub macie jakieś uwagi proszę zgłaszać, proszę również o informacje o czym jeszcze
    chcielibyście poczytać.

    Pozdrawiam,
    Tairens
    Ostatnio zmieniony przez Tairens : 02-08-2009, 14:45

  2. #2
    Low - Bazyl

    Domyślny

    Ciekawie napisane, podoba mi się to, że w końcu ktoś zdecydował się o tym napisać.

    Może zacznę dzięki temu programować w LUA :D

    Thx, podoba mi się!

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

    Domyślny

    Tak właśnie myślałem, czemu na otfans.pl wrzuciłeś i już z pół roku leży a na Torgu bida ;P Poradnik profesjonalniejszy niż ten drugi z działu, ma też 2 "nowości" pętle i tablice. Ogólnie jest git

    Nadal tylko nie mogę znaleźć nigdzie o co chodzi ze "storage value" itp.

  5. #4
    kakashi32

    Domyślny

    #Topic

    Bardzo ładny, przejżyście napisany poradnik. Napewno się przyda ;D

    #Aureos

    To może ja spróbuje Ci to wytłumaczyć. StorageValue jak sama nazwa mówi służy do przchowywania jakiejś wartości, np 425, lub "Hello" . Pierwsza funkcja:
    Kod:
    setPlayerStorageValue(cid, key, value)
    key - "klucz", czyli numer pod jakim zapisujesz daną wartość, za jego pomocą odnosimy się do jego wartości(patrz niżej)
    value - wartość, jaką przypisać do "klucza", np 4124, "Hi", -7567.

    ustawia pod danym "kluczem", daną wartość.

    Funkcja:
    Kod:
    getPlayerStorageValue(cid, key)
    zwraca naszą wartość zapisaną pod danym "kluczem". Czyli np. chcemy, aby po wejściu na x pozycję teleportowano nas na pozycje x1, ale tylko jeden raz. Oto przykładowy skrypt z zastosowaniem storageValue:

    Kod:
    function onStepIn(cid, item, position, fromPosition)
    x1 = {x = 123, y = 423, z=5, stackpos = 1}
    if getPlayerStorageValue(cid, 666) ~= 1 then
    doTeleportThing(cid, x1)
    setPlayerStorageValue(cid, 666, 1)
    else
    doPlayerSendCancel(cid, "Juz raz sie teleportowales")
    end
    end
    Jak zauważyłeś powyższy skrypt sprawdza czy pod "kluczem" == 666 ;D jest zapisana wartość różna od "1", jeśli tak to wykonuje "jakieś" zadania w naszym wypadku teleportuje gracza na pozycję x1, i (TU WAŻNE) ustawia storageValue == 666 na "1", aby za drugim razem skrypt się już nie wykonał.

    Jest jeszcze funkcja setGlobalStorageValue, która działa na tej samej zasadzie, z jedną różnicą, że nie odwołujemy się do niej bez argumenu
    "uid" (w tym wypadku "cid "). Czyli te funkcje wyglądają tak:

    Kod:
    setGlobalStorageValue(key, value)
    getGlobalStorageValue(key)
    Jeśli coś pokręciłem, to przepraszam. W taki sposób ja to rozumiem, więc może się trochę różnić od prawdy :(. Można tego posta potraktować jako dodatek do poradnika jeśli autor się zgadza;D.

  6. #5
    Avatar Aragornik
    Data rejestracji
    2007
    Posty
    19
    Siła reputacji
    0

    Domyślny

    Nie opisałeś jednej rzeczy
    Czy jak zadeklarujemy w skrypcie np:
    Google = 997
    Jest to wartość globalna więc czy możemy użyć jej w innym skrypcie bez deklaracji zmiennej?
    WOC

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

    Domyślny

    Cytuj Aragornik napisał Pokaż post
    Cytat został ukryty, ponieważ ignorujesz tego użytkownika. Pokaż cytat.
    Nie opisałeś jednej rzeczy
    Czy jak zadeklarujemy w skrypcie np:
    Google = 997
    Jest to wartość globalna więc czy możemy użyć jej w innym skrypcie bez deklaracji zmiennej?
    W jednym z moich artykułów jest to opisane.
    USE YOUR EYES:
    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

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

    Domyślny

    Co do lua, polecam programik mojego autorstwa ;))
    http://grzyby.no-ip.info/lua.exe

    Plik czysty
    http://www.virscan.org/report/4ae1bd...fcc42c0a9.html

    The file Lua.exe appears to be clean.
    Łatwo można nim sprawdzić czy się nie zrobiło błędu składniowego w skrypcie (zapomniany end itd.)
    ;]

  9. #8

    Data rejestracji
    2006
    Posty
    27
    Siła reputacji
    0

    Domyślny

    Cytuj Tairens napisał Pokaż post
    Cytat został ukryty, ponieważ ignorujesz tego użytkownika. Pokaż cytat.
    globalne - najczęściej zapisywane w global.lua lub w lib/constant.lua
    Napisałem o zmiennych globalnych:)

    Pozdrawiam,
    Tairens

  10. #9
    Avatar Aragornik
    Data rejestracji
    2007
    Posty
    19
    Siła reputacji
    0

    Domyślny

    Ale nie oto mi chodziło, wiem że można zadeklarować w global.lua jakąś globalną ale czy jak napiszemy w skrypcie np.:
    item2342 = 2342
    to czy będziemy mogli używać "item2342" w innych skryptach bez deklaracji podam przykładowe 2 skrypty newb:

    Pierwszy skrypt
    Function onUse(cid, item, frompos, item2, topos)
    addon = Nobleman
    ifitem.uid == 44301 then
    ifgetplayeritem(cid, 2160, 300)=True doPlayerSendDefaultCancel(Gratulacje, Zakupiles Addon.)
    doPlayerAddOutfit(cid, addon, 1)
    doPlayerAddOutfit(cid, addon, 2)
    doPlayerRemoveItem(cid, 2160,300)
    else
    end

    drugi skrypt odrębny

    Function onUse(cid, item, frompos, item2, topos)
    ifitem.uid == 44302 then
    ifgetplayeritem(cid, 2161, 300)=True doPlayerSendDefaultCancel(Gratulacje, Zakupiles Addon.)
    doPlayerAddOutfit(cid, addon, 1)
    doPlayerAddOutfit(cid, addon, 2)
    doPlayerRemoveItem(cid, 2160,300)
    else
    end

    Czy trzeba dodać w global.lua?
    WOC

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

    Domyślny

    Pytanie idiotyczne. Oczywiście że nie -.- Tylko zmienne z global.lua mają zasięg globalny, chociaż chyba jeżeli zadeklarujesz jakąś nową funkcję, np. w jakimś skrypcie talkactions, to masz możliwość używania tej funkcji w całych talkactions - przynajmniej tak mi się wydaje, bo napisałem funkcję transforma i działa mi w kilku skryptach bez ponownej deklaracji funkcji :P

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

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

    Domyślny

    Uważam, że używanie programu Pimpka jest dość nierozsądne, skoro można ściągnąć interpreter z oficjalnej strony głównej. Do edycji plików Lua polecam program Notepad++ dla Windows, oraz Vim dla Linuksa.

    W poradniku zapomniano o bardzo ważnym typie zmiennej w Lua - mianowicie "string". Stringi (łańcuchy znaków) to nic innego jak wszelkiego rodzaju napisy. Przykłady:
    Kod:
    local str = "String"
    local str2 = 'String'
    -- laczenie (konkatenacja) lancuchow - nie mozna uzywac +!
    local osoba = "Tato"
    local str3 = "Witaj" .. osoba .. "!"
    -- str3 => "Witaj Tato!"
    Przy okazji dodam, że typ zmiennej możemy sprawdzić, używając funkcji type:
    Kod:
    local n = 12
    local s = 't'
    local t = { 1, 2, 3 }
    local x = true
    doPlayerSendTextMessage( cid, MSG_INFO_DESCR,
       type( n ) .. ' ' .. type( s ) .. ' ' .. type( t ) .. ' ' .. type( x ) )
    -- wypisze graczowi => number string table boolean
    W Lua występuje także specjalna wartość nil - oznacza ona NIC. Nie zero, nie fałsz - po prostu nic. Jeżeli tego nie rozumiecie - zrozumienie przyjdzie wraz z praktyką programowania :). O przypisywaniu do zmiennych funkcji można sporo napisać, ale nie chcę mieszać nikomu w głowie.

    Warto wspomnieć o tzw. tablicach asocjacyjnych (słownikach) oraz dwóch ciekawych instrukcjach, które znacząco ułatwiają przeglądanie zawartości tablic.

    Czymże jest tablica asocjacyjna? To nic innego jak tablica, która jest indeksowana nie tylko liczbami, lecz także łańcuchami znaków. Przykład:
    Kod:
    local tab = { 1, 2, 3, foo = 'bar' }
    -- tab[1] == 1
    -- tab[2] == 2
    -- tab[3] == 3
    -- tab.foo == 'bar'
    Do takich zmiennych odwołujemy się tak:
    Kod:
    tablica.zmienna
    Głównym problemem w tym wypadku jest to, że styl odwołania się jest niejednolity. Jak np. w tym momencie jedną pętlą wyświetlić całą zawartość tablicy? Tutaj z pomocą przychodzą nam dwie wersje instrukcji for, które chciałem przedstawić.
    Składnia:
    Kod:
    for element in tablica do
       -- w tej petli przy kazdej iteracji (obiegu) zmienna element bedzie ustawiana na nastepny element tablicy.
    end 
    
    for klucz, element in pairs( tablica ) do
       -- druga wersja - w tym wypadku zmienna klucz bedzie ustawiona na klucz do wartosci, a element na wartosc. Przykladowo dla tablicy:
       -- tab = { 12, 23, 36, x = 'y' }
       -- zmienne beda przyjmowaly nastepujace wartosci:
       -- klucz = 1, element = 12
       -- klucz = 2, element = 23
       -- klucz = 3, element = 36
       -- klucz = 'x', element = 'y'
    end
    Przykład zastosowania tej pętli, prosto z DeadToucha:
    Kod:
                            local itemArr =
                            {
                                    item.itemid,
                                    item.actionid,
                                    item.uid,
                                    pos.x,
                                    pos.y,
                                    pos.z
                            }
                            
                            local itemArrNames = { "ID", "AID", "UID", "X", "Y", "Z" }
                            
                            for i, v in pairs(itemArr) do
                                    if type(v) ~= "table" then
                                            if v ~= 0 and v < 70000 then                                    
                                                    msg = msg .. "[" .. itemArrNames[i] .. ": " .. v .. "]"
                                            end
                                    else
                                            msg = msg .. "[" .. itemArrNames[i] .. ": " .. implode(v, "/") .. "]"
                                    end
                            end
    To wszystko co chciałbym dodać. Bardzo ładny poradnik! :)

    Pozdrawiam
    Killavus

  13. #12

    Data rejestracji
    2006
    Posty
    27
    Siła reputacji
    0

    Domyślny

    Artykuł został zwiększony o informacje podane jakie podał Killavus, jak i zostały dopisane działy Funkcje i Event'y.

    Pozdrawiam,
    Tairens

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

    Domyślny

    To jeszcze tylko mały błąd, który zauważyłem. Stwierdzasz, że instrukcja:
    Kod:
    return TRUE
    Zwraca prawdę. Otóż nie! Zajrzyjmy do global.lua w OTSie i ujrzymy następujące linijki:
    Kod:
    TRUE = 1
    FALSE = 0
    Tutaj zwracana jest wartość liczbowa 1! Nie zmienia to oczywiście faktu, że dla operacji logicznych to wciąż prawda - w Lua w operacjach logicznych prawdą jest wszystko co nie jest: 0, '', "", nil. Takie zaczerpnięcie z języka C, które ułatwia pracę kosztem pewnej 'niechlujności' kodu.

    Pozdrawiam
    Killavus

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. [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
  3. [Podstawy] Jak dobrze odblokować porty w Neostradzie*
    Przez Lo Kiki w dziale Artykuły developerskie
    Odpowiedzi: 124
    Ostatni post: 15-06-2010, 19:09
  4. [Lua] Od zera do skryptera, czyli LUA: PODSTAWY i Actions*
    Przez Grim90 w dziale Artykuły developerskie
    Odpowiedzi: 7
    Ostatni post: 02-08-2009, 01:05
  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
  •