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)[]
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 kod[]
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)