Skocz do zawartości



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


4 odpowiedzi w tym temacie

#1 Dante

    Huge Clucker

  • Użytkownicy
  • 246 postów

Napisano 27 lipiec 2014 - 10:24

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:

Spoiler


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 Dołączona grafika


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.multith...PL/Interior_IDs



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

#2 Blacha

    Newbie

  • Użytkownicy
  • 3 postów

Napisano 30 sierpień 2014 - 13:38

Zrobie zadanie panie profesorze xD

#3 rolor2013

    Newbie

  • Użytkownicy
  • 4 postów

Napisano 28 maj 2015 - 19:02

Nieźle. W następnej części powinieneś opisać coś trudniejszego, bo każdy potrafi sobie wyszukać w MTA:SA wiki funkcji :)
Nie mówię że ten nie był przydatny, bo opisał podstawy skryptowania, ale potem wiedząc, jak takie rzeczy robić, powinno się umieć skorzystać z wiki i dowiedzieć, jakie są argumenty funkcji lub nazwa. :D

Użytkownik rolor2013 edytował ten post 28 maj 2015 - 19:06


#4 TRIN

    Spammer

  • Użytkownicy
  • 290 postów

Napisano 25 wrzesień 2016 - 18:29

Superancki poradnik, dzięki nie mu zrobiłem pewien skrypt :)

#5 Algorithm

    Big Clucker

  • Użytkownicy
  • 147 postów

Napisano 25 wrzesień 2016 - 19:01

Wyświetl postUżytkownik TRIN dnia 25 wrzesień 2016 - 18:29 napisał

Superancki poradnik, dzięki nie mu zrobiłem pewien skrypt :)
pochwal się mój przyjacielu jaki





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

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