Skocz do zawartości


Lua - eventy

Scripting

6 odpowiedzi w tym temacie

#1 RootKiller

    Huge Clucker

  • Użytkownicy
  • 204 postów

Napisano 31 październik 2011 - 22:56

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 - 03:16


#2 YoMen

    Big Clucker

  • Użytkownicy
  • 102 postów

Napisano 01 listopad 2011 - 13:07

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

Dołączona grafika


#3 RootKiller

    Huge Clucker

  • Użytkownicy
  • 204 postów

Napisano 01 listopad 2011 - 18:09

Spoko, nie ma za co ^^.

#4 MrSpy0x22

    Big Clucker

  • Użytkownicy
  • 145 postów

Napisano 06 sierpień 2012 - 15:53

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ć" ..

Dołączona grafika


#5 Wielebny

    Big Clucker

  • Użytkownicy
  • 89 postów

Napisano 06 sierpień 2012 - 22:09

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 - 22:13

PYLife RPG MTA --- BestPlay DM MTA --- FullServer DM SA:MP


#6 RootKiller

    Huge Clucker

  • Użytkownicy
  • 204 postów

Napisano 07 sierpień 2012 - 16:13

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

#7 Function

    Little Clucker

  • Użytkownicy
  • 24 postów

Napisano 04 październik 2012 - 20:20

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 - 20:21






Użytkownicy przeglądający ten temat: 1

0 użytkowników, 1 gości, 0 anonimowych