FANDOM


Na początku muszę dodać, żę nie jest to tutorial dla początkujących, którzy nie znają języka Lua. Jeżeli tego nie potrafisz, to przed zapoznaniem się z poradnikiem zapoznaj się z Lua dla początkujących i Lua w praktyce.

Przed napisaniem skryptu trzeba określić co chcemy zrobić. A więc;  drzwi dla VIP'ów to klocek ze skryptem. Jeżeli osoba na liście VIP'ów dotknie klocka, to zostanie przepuszczona, a jeżeli osoba z poza listy go dotknie, to zginie.

Na początku umieść na mapie klocek(part) i skaluj go do odpowiadającej Ci formy(kształt drzwi) i downolnie nazwij go(u mnie nosi nazwę "Door").

Teraz nadszedł czas na skrypt. Stwórz nowy skrypt wewnątrz tego klocka. Pierwszą rzeczą, którą powinien wykonać skrypt jest sprawdzenie czy dotyka go jakikolwiek klocek. W tym celu wchodzimy na oficjalną wiki i szukamy Part. W zakładce z Eventami znajduje się zdarzenie odpowiadające za wykrywanie kolizji. Jest to Touched, który zwraca zmienną Instance wskazującą na dotknięty obiekt. Musimy więc uzyskać dostęp do tego zdarzenia:

script.Parent.Touched:connect()

Jako argument funkcji listenera(connect) dajmy funkcję, która będzie przyjmowała jeden argument. Tym argumentem będzie właśnie ten klocek zwracany przez zdarzenie, czyli dotknięty klocek. Przykład:

function(TouchedBrick)
    
end

Teraz musimy sprawdzić, czy nasz klocek to postać. Każda postać posiada w swoim modelu obiekt "Humanoid".  A więc jeżeli jest to postać, to funkcja FindFirstChild wyprowadzona z postaci powinna dać wartość inną niż nil:

if TouchedBrick.Parent:FindFirstChild("Humanoid"~= nil then

end

Teraz nasz skrypt potrafi rozróżnić to, czy dotknął go zwykły klocek, czy gracz. Zostawmy na chwilę nasz event w spokoju i na samym początku skryptu utwórzmy tablicę. Tablica ta będzie przechowywała nazwy graczy VIP:

ListaVIP 
= {"Player1", "mrksiedzu", "jakis_nick"}

Pod nią utwórzmy funkcję, która jako argument przyjmnie tablicę(listę VIPów) i nazwę gracza, który dotknął klocka. Będzie ona sprawdziała czy nick gracza znajduje się w tablicy. Jeżeli będzie, funkcja zwróci prawdę, a jeżeli nie - zwróci fałsz:

function VipCheck(lista, gracz)

end

Wewnątrz tej funkcji umieśćmy zmienną lokalną typu logicznego i nadajmy jej wartość fałszywą. Pod nią stwórzmy pętlę for. Odliczanie zacznie się od jednego, a skończy na liczbie komórek tablicy i licznik będzię wzrastał o 1 co każde "okrążenie":

local vip 
= false;
for i
=1,
#lista,1 do

end

Teraz umieśćmy wewnątrz tej pętli warunek, który będzie sprawdzał, czy nazwa w bieżącym elemencie(i) jest taka sama jak nazwa podana w argumencie funkcji. Jeżeli tak będzie, to zmienna lokalna vip będzie miała wartość prawdziwą:

if(lista[i]
==gracz) then
    vip 
= true;
end

Nasza funkcja będzie zwracała wartość zmiennej lokalnej vip, a więc na końcu fukcji trzeba umieścić:

return vip;

Teraz wróćmy do naszego eventu. Wewnątrz warunku sprawdzającego, czy klocek jest częścią postaci utówrzmy jeszcze jeden warunek, który zostanie wykonany jeżeli funkcja VipCheck() zwróci prawdę. Jako pierwszy argument tej funkcji nadajmy zdefiniowaną na początku skryptu tablicę ListaVIP, a jako pierwszy argument dajmy nazwę rodzica dotkniętego klocka(czyli nazwę postaci):

if VipCheck(ListaVIP, TouchedBrick.Parent.Name) then
            
end

W bloku instrukcji warunku musimy zmienić dwa parametry naszych drzwi: CanCollide i Transparency. CanCollide mówi o tym, czy blok koliduje z innymi blokami. Jeśli to pole danego ma wartość fałszywą, to wszystkie bloki mogą przez niego przechodzić. Parametr Transparency mówi o przeźroczystości. Wartość ta jest zmiennoprzecinkowa i musi oscylować między 0(w pełni widzialny) a 1(niewidoczny). Nie chcemy jednak by nasz blok był w takim stanie całą wieczność. Wywołajmy więc funkcję wait() i jako argument wpiszmy 1, czyli liczbę sekund, które nasz skrypt będzie czekał. Po tym czasie blok wróci do swoich standardowych parametrów:

script.Parent.CanCollide = false;
script.Parent.Transparency = 0.5;
wait(1);
script.Parent.CanCollide = true;
script.Parent.Transparency = 0;

(OPCJONALNIE)Edytuj

Niektóre skrypty drzwi dla VIP'ów posiadają pewne zabezpieczenie, dzięki któremu nieproszona osoba nie przejdzie przez nie w czasie, gdy przechodzi przez nie VIP. Polega to na tym, że osoba, która nie jest VIP'em, a dotknie drzwi, zostanie zabita. Postacie w ROBLOX umierają gdy parametr Health w ich obiekcie Humanoid ma wartość równą lub mniejszą od zera. Dlatego wsytarczy użyć części warunku else na warunkuwykonującym funkcję VipCheck i wywołać tam śmierć postaci:

else
    TouchedBrick.Parent:FindFirstChild("Humanoid").Health = 0;

Przykładowy kodEdytuj

Całość wygląda mniej-więcej tak:

ListaVIP = {"mrksiedzu", "jakis_nick", "Player1"} --lista VIP'ow

function VipCheck(lista, gracz)--funkcja sprawdzajaca, czy nazwa gracza jest na danej liscie
    local vip = false;
    for i=1, #lista, 1 do
        if(lista[i]==gracz) then
            vip = true;
        end
    end
    return vip;
end

script.Parent.Touched:connect(function(TouchedBrick)--event wywolywany, gdy jakis klocek detknie drzwi
    if TouchedBrick.Parent:FindFirstChild("Humanoid") ~= nil then--warunek sprawdzajacy, czy klocek jest czescia postaci
        if VipCheck(ListaVIP, TouchedBrick.Parent.Name) then--sprawdzenie, czy gracz znajduje sie na liscie
            script.Parent.CanCollide = false;--drzwi przestaja kolidowac
            script.Parent.Transparency = 0.5;--drzwi sa polprzezroczyste
            wait(1);--skrypt czeka jedna sekunde
            script.Parent.CanCollide = true;--drzwi znowu koliduja
            script.Parent.Transparency = 0;--drzwi znowu sa nieprzezroczyste
        else
            TouchedBrick.Parent:FindFirstChild("Humanoid").Health = 0;--postac umiera(gdy nie jest na liscie)
        end
    end
end)

Ad blocker interference detected!


Wikia is a free-to-use site that makes money from advertising. We have a modified experience for viewers using ad blockers

Wikia is not accessible if you’ve made further modifications. Remove the custom ad blocker rule(s) and the page will load as expected.

Więcej z Fandomu

Losowa wiki