Skocz do zawartości
ThePiotrek

Poradnik LUA dla początkujacych - część druga

Rekomendowane odpowiedzi

Witajcie w drugiej już części mojego poradnika dla początkujących! Dziś zaprezentuje Wam bardzo ważną rzecz, czyli konsolę debugscript. Uruchamiamy ją wpisując /debugscript 3 - oczywiście musimy mieć rangę Administratora. Rozróżniamy na niej trzy typy wiadomości: INFO, WARNING i ERROR

 

 

  • Info

      Wywoływane jedynie przez funkcję w skrypcie, tak dokładniej to outputDebugString. Możemy dzięki niej sprawdzić dokąd wykonuje się kod, lub np. poinformować że gracz x otrzymał osiągnięcie Y.

 

  • Warning

Jest to ostrzeżenie, tworzone jedynie przez serwer. Pojawia się np. gdy parser nie znajdzie funkcji którą określiliśmy w addEventHandler.

 

  • Error

Wywoływane przez funkcję error lub przez parser. Występuje np. gdy wstawimy za mało albo za dużo endów.

 

 

1. Marker, i dawanie pojazdu graczowi

 

No więc tak, zaczynamy! Dziś stworzymy marker, po wejściu do którego otrzymamy pojazd Infernus, i będziemy mogli go otrzymać raz, na jedno połączenie z serwerem.

 

 

No więc tak, musimy stworzyć marker. Będzie on na Grove Street, więc używamy funkcji createMarker, by stworzyć go na podanych koordynatach. Marker nasz będzie miał rozmiar 2, oraz będzie czerwony. Tworzymy więc taki kod, zaraz po kodzie z poprzedniego poradnika:

local darmowyInfernus = createMarker(2488.8708496094, -1656.8953857422, 12.5, "cylinder" 2, 255, 000, 000)

255, 000, 000 oznacza kolor markera w RGB - nasz będzie czerwony. 

"cylinder" to rodzaj markera. 

Swoją pozycję możemy sprawdzić następującym kodem:

 

function getPos ()
  x,y,z = getElementPosition(source)
outputChatBox(""..x..","..y..","..z.."", soure)
end


   addCommandHandler("pos", getPos)

 

 

No więc tak, mamy już marker, teraz czas na funkcję.

function darmoweAuto (player)

if getElementType(player) ~= "player" then return end

  if getPedOccupiedVehicle(player) then -- jesli gracz jest w pojezdzie, wyswietlamy mu informacje
 outputChatBox("Najpierw wysiądź z pojazdu!", player)
  return end

  if getElementData(player, "wzialAuto") == true then -- jesli gracz wzial auto, nie pozwalamy mu go wziac jeszcze raz
 outputChatBox("Wziąłeś/aś już auto, wyjdź i ponownie wejdź na serwer by wziąć je znowu.", player)
  return end

   x, y, z = getElementPosition(player)
  infernus = createVehicle(411, x, y, z) -- tworzymy pojazd w miejscu w ktorym jest gracz
   warpPedIntoVehicle(player, infernus) -- teleportujemy gracza do pojazdu
  setElementData(player, "wzialAuto", true)
   outputChatBox("Dostałeś/aś Infernusa, jeździj ostrożnie! :)", player)
end

   addEventHandler("onMarkerHit", darmowyInfernus, darmoweAuto)

Mam nadzieję że zrozumieliście kod. Zastanawiacie się pewnie, po co pierwszy warunek. Po to, że po stronie serwera, w marker może wejść "wszystko" czyli np. pojazd, więc wywalało by nam błędy. Zacznę, od wyjaśnienia funkcji set/getElementData. Do czego ona służy i co ona tak właściwie robi? Jest to takie tymczasowe zapisywanie danych dla gracza. Dane te są usuwane po wyjściu gracza z serwera. Możemy użyć tego np. właśnie w takim kodzie jaki teraz napisałem. A także np. na arenie Paintball, zapisywać graczowi używając setElementData ile razy dostał, potem sprawdzić getElementData, i jeśli == się 3 wtedy wyrzucić go z areny.

 

 

2. Warunki IF

 

Przepraszam, że pokazuję Wam to dopiero w drugiej części. IF to po angielsku jeśli. Możemy użyć tego warunku, żeby na przykład sprawdzić czy gracz wziął już pojazd, jak to było wyżej.

 

Przykład wygląda tak:

if a == b then
outputChatBox("A to to samo co B!")
end

Jak możecie zauważyć, warunek kończymy używając end. Jest także else, czyli gdy warunek nie wykona się poprawnie. Wygląda to przykładowo tak:

if a == b then
outputChatBox("A ma taką samą wartość jak B!")
else
outputChatBox("A ma inną wartość niż B!")
end

A także elseif, czyli jeśli warunek nie wykona się poprawnie, oraz coś tam, na przykład:

if a == b then
outputChatBox("A ma taką samą wartość jak B!")
elseif c == d
outputChatBox("A ma inną wartość niż B, ale C ma taką samą wartość jak D!")
end

Teraz kolejna przydatna rzecz, czyli return. Jeśli zrobiłbym coś takiego:

if getElementData(source, "test") == 4 then
outputChatBox("Nie o to chodziło!")
end


outputChatBox("O to chodziło!")

I getElementData(source, "test") równałoby się 4, to wyświetliłby się obydwie wiadomości. Jeśli natomiast zrobiłbym tak:

  if getElementData(source, "test") == 4 then
 outputChatBox("Nie o to chodziło!")
  return end


  outputChatBox("O to chodziło!")

To już tylko pierwsza, ponieważ użyliśmy return czyli z angielskiego zawróć. Ta funkcja po prostu zatrzymuje kod w miejscu w którym została postawiona, a raczej nie wykonuje go dalej dla danego gracza.

 

Teraz poznacie inne warunki.

< gdy jedna liczba jest mniejsza od drugiej

> gdy jedna liczba jest większa od drugiej

~= gdy jedna wartość jest inna od drugiej, np. A ~= B

== gdy jedna wartość jest równa drugiej np. A == A

<= Gdy jedna liczba jest mniejsza albo równa drugiej np. 1 <= 2

>= gdy jedna liczba jest większa albo równa drugiej np. 2 >= 1

 

lub po prostu if (costam) then - gdy wartość wynosi true, chociaż nie jestem pewny.

 

Z IF'ów to już chyba wszystko, teraz zajmiemy się funkcjami anonimowymi.

 

 

3. Funkcje anonimowe

Więc tak, czym jest funkcja anonimowa? Jest to funkcja bez nazwy, może być deklarowana np. w addEventHandler.

 

Przykład:

addEventHandler("onPlayerChat", resourceRoot, 
function ( )

  if isPlayerMuted(source) then
 outputChatBox("Jesteś wyciszony/a i nie możesz pisać!", source)
  return end

end)

Możemy też tak:

addEventHandler("onPlayerChat", resourceRoot, function ( ) outputChatBox("Napisałeś/aś coś.", source) end)

Funkcji anonimowych nie możemy użyć np. potem w addEventHandler, ponieważ nie ma nazwy. No chyba, że zdefiniujemy ją w addEventHandler ;)

 

 

4. Teleport po wejściu w marker

 

Był już pojazd, teraz teleport! 

 

Więc tak, najpierw tworzymy marker, ponownie na Grove Street, ale tym razem niebieski. Niebieski jest kolorem domyślnym, więc nie musimy go wpisywać.

local teleportNaMost = createMarker(2466.1545410156, -1662.1614990234, 12.5, "cylinder", 2)

Teraz tworzymy funkcję, 

function teleport (player)

   if getElementType(player) ~= "player" then return end

  setElementPosition(player, 2440.1860351563, -1646.46875, 27.388200759888)

end

  addEventHandler("onMarkerHit", teleportNaMost, teleport)

I już, działa! Po wejściu w marker powinno nas przeteleportować na most. Pamiętaj, że jeżeli chcesz by gracz został przeteleportowany do interioru użyj funkcji setElementInterior(source, ID), gdzie source to element gracza, a ID to ID interioru które możesz sprawdzić na: https://wiki.multitheftauto.com/wiki/PL/Interior_IDs

 

 

 

To na dziś koniec. Zadanie domowe: stwórz teleport do domu CJ. ID Interioru domu CJ to 3.

 

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Poprawiłem Ci kod i dodałem przydatną funkcję usuwająca auta, które wziął gracz z markera, bo zasyfi Ci serwer.

 
addEventHandler("onMarkerHit", darmowyInfernus, function ( element )
	if getElementType(element) ~= "player" then return end
	if getPedOccupiedVehicle(element) then -- jesli gracz jest w pojezdzie, wyswietlamy mu informacje
		outputChatBox("Najpierw wysiądź z pojazdu!", element)
	return end
	if getElementData(element, "wzialAuto") == true then -- jesli gracz wzial auto, nie pozwalamy mu go wziac jeszcze raz
		outputChatBox("Wziąłeś/aś już auto, wyjdź i ponownie wejdź na serwer by wziąć je znowu.", element)
	return end
	x, y, z = getElementPosition(element)
	infernus = createVehicle(411, x, y, z) -- tworzymy pojazd w miejscu w ktorym jest gracz
	setElementData ( infernus, "prywatne", getPlayerName ( element )
	warpPedIntoVehicle(element, infernus) -- teleportujemy gracza do pojazdu
	setElementData(element, "wzialAuto", true)
	outputChatBox("Dostałeś/aś Infernusa, jeździj ostrożnie! :)", element)
end)


addEventHandler ( "onPlayerQuit", root, function()
	for _,v in ipairs ( getElementsByType ( "vehicle" ) ) do
		if getElementData ( v, "prywatne" ) == getPlayerName ( source ) then
			destroyElement ( v )
		end
	end)

Edytowane przez PanMaszyna

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Mój kod był taki prosty, ponieważ to poradnik dla początkujących ;) Tak jakby kogoś to ciekawiło, to kod PanaMaszyny działa tak, że stworzonemu pojazdowi zapisuje elementData, "prywatny", a gdy gracz wyjdzie z serwera to niszczy pojazdy stworzone przez niego, czyli takie mające elementData "prywatny"

Edytowane przez ThePiotrek

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Pozwólcie że zapytam, ale ja to wogóle Green jestem i nawet nie wiem czy to pisać w meta.xml czy w server.lua i jakiego edytora używać i czy lua się kompiluje jakoś tak jak pawn?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Pozwólcie że zapytam, ale ja to wogóle Green jestem i nawet nie wiem czy to pisać w meta.xml czy w server.lua i jakiego edytora używać i czy lua się kompiluje jakoś tak jak pawn?

Moje pierwsze poradniki rozjaśnią trochę Trochę wiedzę. http://pawno.pl/index.php?/topic/25243-lua-coding-e01-tworzenie-skryptu-opartego-o-mysql/ i http://pawno.pl/index.php?/topic/25254-lua-coding-e02-tworzenie-skryptu-opartego-o-mysql/ - radzę poczytać całe. :P

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

l0nger Poradziłem se. Odkryłem że w konsoli trzeba wstukać: "start Zasob" xD

 

//PS: ThePiotrek kontynuuj ten poradnik ponieważ jest bardzo fajny dla ludzi którzy uczą się podstaw(czyli ja) i więcej przykładów różnych funkcji bo wydaje mi się że więcej da się nauczyć z takiego przykładu np. teleport gdzieś tam niż pisać co po kolei trzeba zrobić.

Edytowane przez ManieQ535

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ę.

×