PL/Client side scripts

From Multi Theft Auto: Wiki

Skrypty typu clientside to skrypty działające po stronie klienta. Oznacza to, że mają one dostęp do większej ilości informacji o grze (bo działają równolegle z nią), ale mniej o serwerze i innych graczach na nim się znajdujących.

Są przydatne do rzeczy takich jak efekty wizualne (rysowanie funkcjami dx*), tworzeniem i modyfikowaniem elementów GUI.

Jak to działa?

Skrypty clientsideowskie są bardzo podobne do skryptów serversideowskich (tych działających po stronie serwera).

Skrypty serwerowe i klienckie bazują na bardzo podobnym systemie zdarzeń. Skrypty serwerowe i klienckie muszą znajdować się w różnych plikach, a każdy plik musi posiadać wpis w pliku meta.xml (tag <script> i atrybut type przyjmujący wartości server dla skryptów serwerowych i client dla skryptów klienckich).

Przykład (meta.xml):

<!-- GUI (client) testing script -->
<meta>
	<script src="guitest.lua" type="client" />
	<info author="IJs" />
</meta>

Komunikacja pomiędzy skryptami klienckimi i serwerowymi (i odwrotnie) odbywa się za pomocą funkcji triggerClientEvent i triggerServerEvent. Owe funkcje wysyłają żądanie wykonania danej funkcji (pierwszy/trzeci parametr funkcji triggerClientEvent i pierwszy triggerServerEvent). Komunikacja polega na wywoływaniu zdarzeń. Zanim jednak będziemy mogli wywołać przez serwer zdarzenie u klienta, należy zarejestrować zdarzenie w skrypcie klienckim - funkcją addEvent. Następnie do zdarzenia przypisujemy uchwyt (lub uchwyty bo liczba uchwytów do danego zdarzenia nie jest z góry ograniczona) - funkcją addEventHandler. W tym momencie serwer ma możliwość wywołania zdarzenia o podanej przez nas nazwie (przy użyciu addEvent/addEventHandler). Jeżeli chcemy działać w drugą stronę (tzn. komunikować się z klienta do serwera) musimy powtórzyć powyższe kroki, z tym że do wywołania zdarzenia znajdującego się na serwerze klient musi użyć funkcji triggerServerEvent.

Przykład:

Client-side:

function recvRandomPlayer(randompn)
   outputChatBox("Serwer wylosował gracza o nazwie:" .. randompn)
end

addEvent("recvRandomPlayer", true)
addEventHandler("recvRandomPlayer", getRootElement(), recvRandomPlayer)

lub jak kto woli prościej:

addEvent("recvRandomPlayer", true)
addEventHandler("recvRandomPlayer", getRootElement(), 
   function ( randompn )
      outputChatBox("Serwer wylosował gracza o nazwie:" .. randompn)      
   end
)

Server-side:

triggerClientEvent ( gracz, "recvRandomPlayer", getRootElement(), getPlayerName( getRandomPlayer() ) )