←  [MTA] Poradniki oraz Tutoriale

Grand Theft Auto & Multiplayers

»

Lua - eventy

- zdjęcie RootKiller 31 paź 2011

Dołączona grafika

Witam. Każdy z was wie że Multi Theft Auto posiada system eventów. Co to są te eventy? Już tłumaczę - są to zdarzenia, które poprzez wywołanie funkcji dodanych za pomocą argumentu addEventHandler z listy w serwerze/kliencie, uruchamiają daną funkcję w skrypcie .lua. Wywołują się, gdy np. jakiś gracz połączy się do serwera itp.

1. Lista Eventów (Zdarzeń).
Listę wszystkich eventów można znaleźć na oficjalnym wiki Multi Thet Auto:
• Eventy Klienta - Client_Scripting_Events
• Eventy Serwera - Server_Scripting_Events

2. Własne Eventy (Zdarzenia).
Proces dodawania własnych eventów jest bardzo prosty i służy do tego funkcja:
addEvent ( string, bool )
string - Jest to nazwa eventu, na przykład "mójEvent".
bool - Czy chcesz aby event mógł zostać wywoływany poprzez funkcje triggerEvent, triggerClientEvent oraz triggerServerEvent.

Poniżej przedstawiam przykład dodania własnego eventu.
addEvent ( "mójWłasnyEvent", true )

3. Dodawanie uchwytów do eventów.
Pierwszą częścią tego punktu jest zapoznanie z funkcją addEventHandler. Co ta funkcja robi? Już mówię! Dodaje funkcje do puli eventów o danej nazwie, a następnie wykonuje ją podczas wywołania.

addEventHandler ( string, element, function )
string - Nazwa eventu, do którego funkcja ma zostać przypisana.
element - Główny element eventu, najczęściej getRootElement ( ) - można go wykorzystać w funkcji za pomocą zmiennej source.
function - Funkcja, która zostaje dodana do danej puli eventów.

Przykład dodawania własnego eventu:
function mojaFunkcja ( )

end
addEvent ( "mójEvent", true )
addEventHandler ( "mójEvent", getRootElement ( ), mojaFunkcja )

Przykład dodawania do puli eventu stworzonego przez team mta lub moduł rozszerzający możliwości serwera:
function gdyGraczSiePolaczy ( )
		outputChatBox ( "Gracz " .. getPlayerName ( source ) .. " dołączył do serwera!", 255, 0, 0 )
end
addEventHandler ( "onPlayerJoin", getRootElement ( ), gdyGraczSiePolaczy )

4. Wywoływanie eventów.
Wywoływanie eventów jest chyba najpotrzebniejszym elementem dla systemu eventów w mta. Do wywołania eventów musisz znać kilka funkcji podanych poniżej:

Wywoływanie eventu lokalnie dla strony (Serwer/klient) side:
triggerEvent ( string, element, [ arguments ] )
string - Nazwa eventu, który chcesz wywołać.
element - Główny element wywoływanego eventu.
arguments (OPCJONALNE) - Opcjonalny argument zawierający nieskończoną ilość argumentów. (Poniżej przykład)

Wywoływanie eventu z klienta do serwera:
triggerServerEvent ( string, element, [ arguments ] )
string - Nazwa eventu, który chcesz wywołać.
element - Główny element wywoływanego eventu.
arguments (OPCJONALNE) - Opcjonalny argument zawierający nieskończoną ilość argumentów. (Poniżej przykład)

Wywoływanie eventu z serwera do klienta:
triggerClientEvent ( [ element ], string, element, [ arguments ] )
element (OPCJONALNE) - Element, dla którego ma zostać wysłany event (klient gry - gracz),
string - Nazwa eventu, który chcesz wywołać.
element - Główny element wywoływanego eventu.
arguments (OPCJONALNE) - Opcjonalny argument zawierający nieskończoną ilość argumentów. (Poniżej przykład)

Przykład:
Serwer:
triggerClientEvent ( "mójEvent", getRootElement ( ) )
Klient:
function mojEvent  ( )
	  outputChatBox ( "Serwer nadsyła event! Który został pomyślnie odebrany!" )
end
addEvent ( "mójEvent", true )
addEventHandler ( "mójEvent", getRootElement ( ), mojEvent )

5. Zakończenie Poradnika.
I to koniec poradnika. Mam nadzieję, że w miarę wytłumaczyłem działanie systemu eventów w Multi Theft Auto. Niebawem więcej tutoriali!

Pozdrawiam!
Użytkownik Arctos edytował ten post 03 listopad 2011 - 04:16
Odpowiedz

- zdjęcie YoMen 01 lis 2011

Bardzo dobry tutorial, dodaję do oficjalnych. Dzięki za pomoc w rozwijaniu GTA&M ;)
Odpowiedz

- zdjęcie RootKiller 01 lis 2011

Spoko, nie ma za co ^^.
Odpowiedz

- zdjęcie MrSpy0x22 06 sie 2012

Ja mam jedno pytanie, które bądź co bądź dla nowych powinno zostać umieszczone jako informacja w Twoim "poradniku".
Czy nazwa funkcji może być taka sama jak event, który ta funkcja wywołuje ?
Czyli coś takiego:
function onPlayerMute()
    -- Kod
end
addEventHandler("onPlayerMute" , getRootElement() , onPlayerMute)

Nie rozumiem za bardzo tej polityki z eventami na chwilę obecną więc proszę nie "krzyczeć" ..
Odpowiedz

- zdjęcie Wielebny 06 sie 2012

Powinieneś unikać nazywania funkcji tak samo, jak nazywa się event.
http://wiki.multithe...AddEventHandler

Cytat

Note: It is strongly advised that you do not use the same name for your handler function as the event name, as this can lead to confusion if multiple handler functions are used.

Od siebie dodam, że jeżeli używa się danej funkcji tylko raz, tylko przy tym evencie, to można zaoszczedzić troche czasu i długości kodu, używając funkcji anonimowej:

addEventHandler("onPlayerMute" , getRootElement() , function()
-- kod
end)

Przy okazji zyskujemy trochę na czytelności.

A odnośnie samego poradnika - opisy komend triggerServerEvent, triggerClientEvent, triggerEvent są błędne, RootKiller zapomniał o uwzględnieniu źródła eventu.
Użytkownik Wielebny edytował ten post 06 sierpień 2012 - 23:13
Odpowiedz

- zdjęcie RootKiller 07 sie 2012

Co prawda, to prawda. Dzięki za poprawkę, jak znajdę czas to dopiszę to do tutka.
Odpowiedz

- zdjęcie Function 04 paź 2012

http://wiki.multithe...AddEventHandler

Cytat

Note: It is strongly advised that you do not use the same name for your handler function as the event name, as this can lead to confusion if multiple handler functions are used.

Niepotrzebna ta notka jest. Wiki jest dokumentacją MTA a nie poradnikiem do skryptowania w LUA, niech lepiej dopiszą notki o problemach podczas skryptowania w MTA. Co najlepsze ta notka nie tyczy się tylko addEventHandler ale także i elementów dokumentacji.
Użytkownik Mati edytował ten post 04 październik 2012 - 21:21
Odpowiedz