Skocz do zawartości
szymex

Od zera do LUA Mastera - Funkcje, zdarzenia, wiki

Rekomendowane odpowiedzi

Witam po raz kolejny w moim poradniku! Dzisiaj trochę o funkcjach i zdarzeniach. Tak więc zaczynamy...

Na początku opiszę prostą budowę funkcji (najprostszego bloku kodu).

function sendMessage(player, text) -- tworzymy funkcję o nazwie sendMessage i argumentach(to takie zmienne; może być ich więcej) player oraz text
    if(player ~= nil) then -- sprawdzamy warunkiem if czy zmienna player nie równa się nil
        outputChatBox(text, player) -- wysyłamy wiadomość o treści text do gracza 'player'.
    end
end -- kończymy funkcję

Jak widzimy w przeciwieństwie do PAWN w LUA nie ma klamer. Po prostu tworzymy funkcję i zamykamy ją wyrazem 'end'. Nazwy funkcji piszemy z małej litery! Z takich bloków składają się praktycznie wszystkie skrypty.
Co do zmiennej player powinna ona przechowywać element gracza - dokładniej o tym trochę później.

Event (zdarzenie) to tak jak sama nazwa mówi jakieś wydarzenie na serwerze. Przykłady:
- gracz wchodzi na serwer - onPlayerJoin
- gracz wychodzi z serwera - onPlayerQuit
- gracz klika myszką - onPlayerClick
Biblioteka MTA posiada dość sporo zdarzeń, z których możemy korzystać pisząc skrypty, ale oprócz nich możemy również sami tworzyć nowe event'y. Do czego są one nam potrzebne? Dzięki tym event'om wywołujemy funkcję. Najprostszy przykład:

function hello() -- tworzymy funkcję "hello"
    outputChatBox("Witamy na serwerze.", source) -- dodajemy funkcję wysyłają do gracza wiadomość
end -- zamyka funkcję
addEvenHandler("onPlayerJoin", getRootElement(), hello) -- podpinamy wbudowany event MTA "onPlayerJoin" pod funkcję "hello"

Source jest to zmienna zwracana przez event i przechowująca element, który wykonał dane zdarzenie. W sytuacji powyżej source będzie gracz, który wszedł na serwer.

Nowe zdarzenie tworzymy w następujący sposób:

function hello()
    outputChatBox("Witamy na serwerze.", source)
end
addEvent("helloPlayer", true) -- tworzymy event 'helloPlayer'; true oznacza, że event będzie aktywny
addEventHandler("helloPlayer", getRootElement(), helloPlayer) -- podpinamy nowy event pod funkcję

Funkcje - czyli trzecia rzecz, którą chciałbym omówić (ja nazywam je komendami wydawanymi przez skrypt dla serwera/gry). Służą one do wydawania poleceń dla serwera. Na przykład możemy mu rozkazać wyrzucić gracza, czy pobrać jego IP. Biblioteka MTA jest strasznie bogata w te polecenia. Uwierzcie mi, że nie ma porównania do PAWN. Kilka przykładów:

outputChatBox("tekst", gracz) -- wysyła wiadomość go gracza
getServerName() -- pobiera nazwę serwera
givePlayerMoney(player, 1000) -- daje graczowi tysiaka

Jest tego mnóstwo i nie jestem w stanie wszystkich wypisać, bo nawet ich nie pamiętam. Dlatego istnieje specjalna strona wiki na której znajdziecie spis wszystkich funkcji i event'ów, które posiada biblioteka MTA. Polecam mimo wszystko korzystanie z angielskiej wersji (jeżeli ktoś ma problemy to przyda się translator). Na początku można się pogubić, ale wystarczy trochę posiedzieć i potem korzystanie z tej strony jest naprawdę proste, a żeby było Wam łatwiej przygotowałem dwa SS'y.
r55DoXy.png
rJMQ9Fa.png

Pamiętajcie, że istnieją dwie strony po których możemy pisać skrypty: server/client. Opowiem o nich i ich łączeniu w następnym poradniku. W tym przedstawiłem wszystko od strony server'a.

Zadanko na koniec: przeanalizujcie funkcję poniżej krok po kroku - prostota.

local nazwa = "Gaming"

function playerJoin()
outputChatBox("Witaj na serwerze ".. nazwa .."! Życzymy miłej zabawy.", source)
for k, player in ipairs(getElementsByType("player")) do
if(source ~= player) then
outputChatBox("Gracz ".. getPlayerName(source) .." wszedł na serwer.", player)
end
end
addEventHandler("onPlayerJoin", root, playerJoin)

Ciekawostka:
Zamiast getRootElement() możemy użyć zwykłego wyrazu 'root', analogicznie po stronie klienta zamiast getLocalPlayer() używamy 'localPlayer'.

Jeżeli czegoś nie zrozumieliście, albo potrzebujecie więcej przykładów piszcie pod spodem lub na PW/GG. Z chęcią odpowiem. W kolejnym poradniku postaram się wyjaśnić różnicę pomiędzy stronami klienta a serwera oraz opowiedzieć o sposobie ich łączenia.

((Na szybko pisałem trochę :|))

Autor: szymex
Zakaz kopiowania i rozpowszechniania bez mojej zgody!

Edytowane przez szymex

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

if(player != nil)
WHAT? Takiego operatora warunkowego nie ma w lua. Zamiast tego jest:

if player ~= nil -- rozne od nil
Edytowane przez l0nger

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Takie pytanie, jeżeli mam np: 

outputChatBox("tekst", gracz)
to co mam podać w 'gracz', jego id? nazwę?

Podajesz element, do którego ma się odnieść. W wielu przypadkach jest to source lub zdefiniowana przez Ciebie nazwa w funkcji - na przykład:

addEventHandler("onPlayerJoin", resourceRoot, function()
    -- Z dokumentacji dla zdarzenia "onPlayerJoin" wiemy, że "source" zwraca element gracza,
    -- który dołączył do gry. Dlatego też powitajmy go, wysyłając mu wiadomość - a, co!
    outputChatBox("Witaj "..getPlayerName(source).." na serwerze!", source)
end)
addCommandHandler("witaj", resourceRoot, function(player)
    -- Zarzucamy pętle, aby znaleźć wszystkich graczy i się z nimi przywitać.
    for k, i in ipairs(getElementsByType("player")) do -- k (klucz); i - wartość;
        -- Prosty warunek, by nie przywitać się z samym sobą.
        if player ~= i then
            -- Wysyłamy do znalezionego gracza wiadomość z powitaniem.
            outputChatBox(getPlayerName(player).." się z Tobą przywitał!", i)
            -- Zwróci: Enerv się z Tobą przywitał!
        end
    end
    -- Po wykonaniu pętli wyświetla nam wiadomość zwrotną, tak dla formalności.
    outputChatBox("Przywitałeś/aś się ze wszystkimi graczami na serwerze.", player)
end)

if(player != nil)
WHAT? Takiego operatora warunkowego nie ma w lua. Zamiast tego jest:

if player ~= nil -- rozne od nil

Dokładnie (ew. "inne niż"), tutaj pełna lista dostępnych operatorów z ich opisem.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Poradnik piękny. ;) I pomyśleć, że większość czasu poświęciłem nauce pawno - teraz kiedy ogarniam ten język w 100% żałuję tego. Chyba zacznę nauki LUA. Dzięki za poradnik. :)

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Ktoś tam u góry pyta o player(ID) - w MTA nie ma domyślnie IDów, wszystko oparte jest na elementach. Najlepiej będzie jeśli wyobrazisz sobie talię kart. Każdy AS jest kartą, karta to element. Więc jak widzisz mamy 54 elementy o typie "karta" ale każda z kart może się różnić od siebie szczegółami.

Tak samo gracze, każdy gracz jest elementem (Player) i ilu jest graczy tyle jest elementów o typie gracz. Oczywiście możesz samemu napisać skrypt do IDów - sam jednego używam. Przydatne zwłaszcza gdy jesteś przyzwyczajony do działania IDów z SAMPa.

Edytowane przez blint

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

  • Przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.

×