Ten samouczek wykorzystuje Verse, aby można było skorzystać z niektórych funkcji. Dzięki wykorzystaniu Verse w tym samouczku, możesz:
-
Co pewien czas aktywować i odtwarzać animacje, aby utworzyć mechanikę rozgrywki.
-
Aktualizować informacje o wyniku gracza dla wszystkich graczy w minigrze.
-
Tworzyć opóźnienia spawnu gracza i losowe czasy spawnu przedmiotów.
Możesz ponownie wykorzystać kod, aby wykonać następujące zadania:
-
Przełączać urządzenia, które są włączone i wyłączone w momencie, gdy gra przechodzi z HUB-u do rozgrywki i z powrotem do HUB-u.
-
Sprawdzać wyniki graczy, aby wyszukać najlepszy wynik i wyświetlić go w HUB-ie.
-
Kończyć grę i teleportować graczy z powrotem do HUB-u po zakończeniu minigry.
Konfiguracja urządzenia Verse i edytowalnych obiektów
Postępuj zgodnie z poniższą instrukcją, aby skonfigurować urządzenie Verse i edytowalne obiekty:
-
Utwórz nowe urządzenie Verse o nazwie
tiltnboom
i dodaj je do poziomu. Aby się dowiedzieć, jak to zrobić, patrz Stwórz własne urządzenie, korzystając z Verse. -
Na początku pliku dodaj następujące moduły:
using { /Fortnite.com/Characters } using { /Fortnite.com/Devices } using { /Fortnite.com/Game } using { /UnrealEngine.com/Temporary/Diagnostics } using { /Verse.org/Random } using { /Verse.org/Simulation }
- Dodaj następujące pola do definicji klasy
tiltnboom
:-
Dwa edytowalne urządzenia
trigger
; ActivateGameTrigger i EndGameTrigger. Do aktywacji gry służyActivateGameTrigger
. Ten aktywator może zostać aktywowany przez cokolwiek, np. przez teleporter do gry lub po filmiku otwierającym.EndGameTrigger
służy do zakończenia minigry i usunięcia wszystkich kamer i urządzeń sterujących z graczy, gdy gra się skończy.
@editable ActivateGameTrigger:trigger_device = trigger_device{} @editable EndGameTrigger:trigger_device = trigger_device{}
-
Edytowalne urządzenie licznika czasu o nazwie GameTimer. Kończy grę po upływie określonego czasu.
-
Tablica
array
urządzeń sekwencji filmowej o nazwieCannonballSequences
, każde urządzenie w tablicy odtwarza inną pozycję lądowania kuli armatniej. -
Tablica przestrzeni obrażeń o nazwie DamageVolumes, które są włączane i wyłączane na podstawie stanu gry.
-
Tablica generatorów przedmiotów o nazwie ItemSpawners, która losowo spawnuje losową liczbę przedmiotów w trakcie gry.
-
Urządzenie strefy punktowanej o nazwie CaptureArea. Przyznaje graczom punkty za przebywanie na tratwie, jest włączane i wyłączane na podstawie stanu gry.
-
Urządzenie menedżera wyników o nazwie
ScoreManager
, które resetuje wyniki graczy, gdy gra się rozpoczyna, a w momencie zakończenia gry określa, który gracz wygrał. -
Teleporter o nazwie
HUBTeleporter
, który po zakończeniu gry przenosi wszystkich z powrotem do HUB-u. -
Urządzenie odwołania do gracza o nazwie PlayerReference, które wyświetla zwycięskiego gracza w HUB-ie między grami.
@editable GameTimer:timer_device = timer_device{} @editable CannonballSequences:[]cinematic_sequence_device = array{} @editable DamageVolumes:[]damage_volume_device = array{} @editable ItemSpawners:[]item_spawner_device = array{} @editable CaptureArea:capture_area_device = capture_area_device{} @editable ScoreManager:score_manager_device = score_manager_device{} @editable HUBTeleporter:teleporter_device = teleporter_device{} @editable PlayerReference:player_reference_device = player_reference_device{}
-
-
Dwie edytowalne tablice paneli startowych gracza o nazwach
PlayerSpawners
iHUBSpawners
. Wyłączają spawnowanie, gdy minigra się zakończy, i zabierają graczy z powrotem do HUB-u po minigrze.@editable PlayerSpawners:[]player_spawner_device = array{} @editable HUBSpawners:[]player_spawner_device = array{}
-
Dwie edytowalne wartości
float
o nazwachMinimumItemSpawnTime
iMaximumItemSpawnTime
. Są to minimalne i maksymalne czasy oczekiwania na spawnowanie kolejnych przedmiotów na tratwie.@editable MinimumItemSpawnTime:float = 5.0 @editable MaximumItemSpawnTime:float = 10.0
-
Edytowalna wartość
float
o nazwieDelayAfterGame
. Opóźnienie teleportowania graczy z powrotem do HUB-u po zakończeniu gry.@editable DelayAfterGame:float = 5.0
-
Wartość
float
o nazwieDelayBetweenCannonballSequences
. Opóźnienie spawnowania kul armatnich między sekwencjami przez cały czas trwania minigry.DelayBetweenCannonballSequences:float = 8.0
-
Zmienna logiczna o nazwie
GameActive
, określająca, czy gra jest aktywna.var GameActive:logic = false
Rozpoczynanie gry
Gdy minigra się rozpoczyna, zostaje uruchomionych kilka urządzeń, a wynik gracza resetuje się do 0.
-
Nad definicją klasy
tiltnboom
dodaj kanał dziennika, aby zapisywać komunikaty charakterystyczne dla minigry. Następnie do definicji klasy dodaj rejestrator, który będzie używany z kanałem dziennika.tiltnboom_log_channel := class(log_channel){} # Urządzenie trybu kreatywnego utworzone w Verse, które można umieścić w poziomie tiltnboom := class(creative_device): Logger:log = log{Channel := tiltnboom_log_channel}
-
Dodaj nową metodę
OnTriggered
do definicji klasytiltnboom
, która przyjmujeInitiatingAgent
i uruchamia grę. Do metody dodaj wyrażenieif
, które zwraca, czy gra jest już aktywna, aby uniknąć rozpoczęcia gry, gdy inna gra jest już uruchomiona.OnTriggered(InitiatingAgent:?agent):void= if (GameActive?): return spawn{StartGame()}
-
W
OnBegin()
, zasubskrybujTriggeredEvent
aktywatora ActivateGameTrigger do funkcjiOnTriggered
, aby rozpocząć grę. Każde urządzenie, które musi być włączone na początku minigry, zasubskrybuje to zdarzenie i włączy się po aktywowaniu zdarzenia OnTrigger.OnBegin<override>()<suspends>:void= ActivateGameTrigger.TriggeredEvent.Subscribe(OnTriggered)
-
Dodaj nową metodę
StartGame()
, która obsługuje logikę, aby rozpocząć grę. Do tej funkcji dodaj modyfikator<suspends>
, aby mogła działać asynchronicznie.Najpierw ustaw
GameActive
na wartośćtrue
, aby zasygnalizować, że gra jest aktywna. Następnie włączCaptureArea
i każdą przestrzeń obrażeńDamageVolume
w tablicyDamageVolumes
.Dla każdego gracza, jeśli jego wynik jest większy niż 0, zresetuj wynik, przyznając graczowi odwrotność bieżącego wyniku, co ustawi jego wynik na 0.
Następnie w wyrażeniu race ustaw wyścig między zakończeniem licznika czasu, wykonaniem sekwencji kuli armatniej i spawnowaniem losowych przedmiotów. Sekwencja kuli armatniej i spawnowanie losowych przedmiotów to pętle nieskończone, ale są anulowane natychmiast po zakończeniu licznika czasu.
Gdy gra się skończy, wywołaj funkcję
OnGameFinished()
, aby obsłużyć czyszczenie na koniec gry.StartGame()<suspends>:void= Logger.Print("Uruchamianie gry.") set GameActive = true CaptureArea.Enable() for (DamageVolume : DamageVolumes): DamageVolume.Enable() for: Player : GetPlayspace().GetPlayers() PlayerScore := ScoreManager.GetCurrentScore(Player) PlayerScore > 0 do: ScoreManager.SetScoreAward(-PlayerScore) ScoreManager.Activate(Player) race: GameTimer.SuccessEvent.Await() StartCannonSequence() SpawnRandomItems() OnGameFinished()
Tworzenie pętli kuli armatniej
W tej sekcji opisano dodawanie funkcji, która odtwarza sekwencje filmowe kuli armatniej.
-
Dodaj nową metodę
StartCannonSequence()
do definicji klasytiltnboom
, która odtwarza sekwencje poziomu kuli armatniej i używa pętli, aby odtwarzać wyrażenie opóźnienia i wstawiać opóźnienie między kulami armatnimi. Do tej funkcji dodaj modyfikator<suspends>
, aby mogła działać asynchronicznie.W pętli wybierz losową sekwencję w tablicy
CannonballSequences
, indeksując ją przy użyciuGetRandomInt()
. Odtwórz sekwencję, a następnie uśpij na czasDelayBetweenCannonballSequences
przed odtworzeniem kolejnej sekwencji.StartCannonSequence()<suspends>:void= loop: RandomCannonballSequence:int = GetRandomInt(0, CannonballSequences.Length - 1) if (CannonballSequence := CannonballSequences[RandomCannonballSequence]): Logger.Print("Ustaw CannonballSequence na {RandomCannonballSequence}") CannonballSequence.Play() Sleep(DelayBetweenCannonballSequences)
Tworzenie pętli losowego spawnowania przedmiotów
W tej sekcji opisano tworzenie funkcji, która zapętla spawnowanie losowych przedmiotów w losowych lokalizacjach na tratwie, co może zarówno pomóc, jak i przeszkodzić graczom w wygraniu minigry.
-
Dodaj nową metodę o nazwie
SpawnRandomItems
do definicji klasytiltnboom
. Ta metoda kontroluje przedmioty, które spawnują się na tratwie. -
Pobierz liczbę przedmiotów w tablicy
ItemSpawners
, następnie zapętl przejście przez tablicę. Użyj losowej wartościint
, aby pobrać losowy generator przedmiotów z tablicy, następnie go aktywuj. Uśpij na losowy czas między spawnowaniem przedmiotów. -
Pętla losowo decyduje, ile przedmiotów zespawnować, i losowo wybiera przedmiot do zespawnowania, tyle razy, ile wynosi
NumberOfItemsToSpawn
.DelayBetweenItemSpawns
generuje nieustaloną z góry długość czasu oczekiwania między spawnami.SpawnRandomItems()<suspends>:void= ItemSpawnerCount:int = ItemSpawners.Length - 1 loop: NumberOfItemsToSpawn:int = GetRandomInt(0, ItemSpawnerCount) # Spawnuje losowo wybrany przedmiot tyle razy, ile wynosi NumberOfItemsToSpawn. for: CurrentItemSpawnNumber := 0..NumberOfItemsToSpawn RandomItemToSpawn:int = GetRandomInt(0, ItemSpawnerCount) SelectedItemSpawner := ItemSpawners[RandomItemToSpawn] do: SelectedItemSpawner.SpawnItem() Logger.Print("Spawnowane losowe przedmioty.") DelayBetweenItemSpawns:float = GetRandomFloat(MinimumItemSpawnTime, MaximumItemSpawnTime)
Kończenie gry
Na koniec minigry musisz wysłać wynik zwycięzcy do HUB-u, wyłączyć urządzenia i teleportować graczy z powrotem do HUB-u.
-
Dodaj nową metodę
OnGameFinished
do definicji klasytiltnboom
. Gdy gra się skończy, ta funkcja ustawi grę na nieaktywną i wyłączy odnośne urządzenia.OnGameFinished()<suspends>:void= Logger.Print("Koniec gry.") set GameActive = false CaptureArea.Disable() for (PlayerSpawner : PlayerSpawners): PlayerSpawner.Disable() for (DamageVolume : DamageVolumes): DamageVolume.Disable()
-
Dodaj zmienną
int
o nazwieHighestScore
, aby śledzić gracza z najwyższym wynikiem, a także odwołanie do zmiennej opcji do tego graczaWinningPlayer
.var HighestScore:int = -1 var WinningPlayer:?agent = false
-
W wyrażeniu
for
/do pobierz wszystkich graczy w przestrzeni gry, następnie dla każdego z nich pobierzFortCharacter
. Unieruchom postać w miejscu za pomocąPutInStasis()
, przekazując nowy zestawstasis_args
, aby umożliwić wstawianie emotek i obracanie się, dzięki czemu gracze będą mogli świętować zakończenie gry.for: Player : GetPlayspace().GetPlayers() FortCharacter := Player.GetFortCharacter[] do: FortCharacter.PutInStasis(stasis_args{AllowTurning := true, AllowEmotes := true})
-
W instrukcji
if
sprawdź wynik każdego gracza, aby wyszukać i przechować zwycięski wynik w urządzeniu odwołania do gracza w HUB-ie.if (ScoreManager.GetCurrentScore(Player) > HighestScore): set HighestScore = ScoreManager.GetCurrentScore(Player) set WinningPlayer = option{Player}
-
Na koniec, w innej instrukcji if, wywołaj
TeleportPlayersToHUB()
, aby po wyszukaniu zwycięskiego wyniku teleportować wszystkich z powrotem do HUB-u.if(Winner := WinningPlayer?): PlayerReference.Register(Winner) TeleportPlayersToHUB()
Teleportowanie graczy z powrotem do HUB-u
Po obliczeniu wyników i ogłoszeniu zwycięzcy wszyscy gracze powinni się teleportować z powrotem do HUB-u.
-
Dodaj nową metodę
TeleportPlayersToHUB()
do definicji klasy tiltnboom. Ta metoda włącza wszystkie punkty spawnu gracza w HUB-ie, następnie odczekuje kilka sekund, zanim przeteleportuje wszystkich z powrotem do HUB-u. Ta metoda powinna też aktywowaćEndGameTrigger
, aby usunąć kamerę i urządzenia sterujące z graczy.TeleportPlayersToHUB()<suspends>:void= for (HUBSpawner : HUBSpawners): HUBSpawner.Enable() Sleep(DelayAfterGame) EndGameTrigger.Trigger()
-
W wyrażeniu
for
teleportuj każdego gracza z powrotem doHUBTeleporter
i zwolnij go z trybu bezruchu.for: Player : GetPlayspace().GetPlayers() FortCharacter := Player.GetFortCharacter[] do: HUBTeleporter.Teleport(Player) Sleep(1.0) FortCharacter.ReleaseFromStasis()
Praca własna
Zmodyfikuj kod, aby utworzyć różne zadania do wykonania przez urządzenie licznika czasu. Zamiast określania czasu trwania minigry, możesz użyć urządzenia licznika czasu, aby odmierzyć czas wyścigu.
using { /Fortnite.com/Characters }
using { /Fortnite.com/Devices }
using { /Fortnite.com/Game }
using { /UnrealEngine.com/Temporary/Diagnostics }
using { /Verse.org/Random }
using { /Verse.org/Simulation }
tiltnboom_log_channel := class(log_channel){}
# Urządzenie trybu kreatywnego utworzone w Verse, które można umieścić w poziomie
tiltnboom := class(creative_device):
Logger:log = log{Channel := tiltnboom_log_channel}
# Aktywator służący do aktywacji tej gry. Ten aktywator może zostać aktywowany przez cokolwiek, np. przez teleporter do gry lub po filmiku otwierającym.
@editable
ActivateGameTrigger:trigger_device = trigger_device{}
# Aktywator służący do kończenia tej gry. Służy do usunięcia kamery i urządzeń sterujących z graczy, gdy gra się skończy.
@editable
EndGameTrigger:trigger_device = trigger_device{}
# Urządzenie licznika czasu używane do zakończenia gry po upływie określonego czasu.
@editable
GameTimer:timer_device = timer_device{}
# Tablica sekwencji, w której każda sekwencja jest inną pozycją lądowania kuli armatniej.
@editable
CannonballSequences:[]cinematic_sequence_device = array{}
# Tablica przestrzeni obrażeń, używana do ich włączania i wyłączania na podstawie stanu gry.
@editable
DamageVolumes:[]damage_volume_device = array{}
# Tablica punktów spawnu graczy dla danej gry, używana do ich wyłączania, gdy gra się skończy.
@editable
PlayerSpawners:[]player_spawner_device = array{}
# Tablica punktów spawnu graczy w HUB-ie, używana do ich włączania po zakończeniu gry, aby gracze mogli wrócić do HUB-u.
@editable
HUBSpawners:[]player_spawner_device = array{}
# Tablica generatorów przedmiotów służąca do losowego spawnowania losowej liczby przedmiotów w trakcie gry.
@editable
ItemSpawners:[]item_spawner_device = array{}
# Urządzenie strefy punktowanej, które przyznaje graczom punkty za przebywanie na tratwie. Używane do włączania i wyłączania go na podstawie stanu gry.
@editable
CaptureArea:capture_area_device = capture_area_device{}
# Urządzenie menedżera wyników używane do resetowania wyników graczy na początku gry, a także do określania zwycięskiego gracza na koniec gry.
@editable
ScoreManager:score_manager_device = score_manager_device{}
# Teleporter używany do sprowadzenia wszystkich z powrotem do HUB-u, gdy gra się skończy.
@editable
HUBTeleporter:teleporter_device = teleporter_device{}
# Minimalna długość czasu między spawnowaniem losowych przedmiotów.
@editable
MinimumItemSpawnTime:float = 5.0
# Maksymalna długość czasu między spawnowaniem losowych przedmiotów.
@editable
MaximumItemSpawnTime:float = 10.0
# Urządzenie odwołania do gracza używane do wyświetlania zwycięskiego gracza w HUB-ie między grami.
@editable
PlayerReference:player_reference_device = player_reference_device{}
# Długość czasu oczekiwania po zakończeniu gry, zanim wszyscy gracze zostaną z powrotem teleportowani do HUB-u.
@editable
DelayAfterGame:float = 5.0
# Długość czasu oczekiwania między sekwencjami kuli armatniej.
DelayBetweenCannonballSequences:float = 8.0
# Globalna zmienna logiczna określająca, czy gra jest aktywna.
var GameActive:logic = false
OnBegin<override>()<suspends>:void=
# Zasubskrybuj TriggeredEvent aktywatora ActivateGameTrigger, aby urządzenie mogło rozpoczynać grę w momencie aktywacji aktywatora.
ActivateGameTrigger.TriggeredEvent.Subscribe(OnTriggered)
# Rozpoczyna grę w momencie aktywacji ActivateGameTrigger
# gdy gra nie została aktywowana już wcześniej.
OnTriggered(InitiatingAgent:?agent):void=
# Nie uruchamiaj gry, jeśli gra już działa.
if (GameActive?):
return
spawn{StartGame()}
# Jeśli gra nie była aktywna, a została aktywowana, ustaw grę na aktywną i włącz urządzenia dla gry.
# Następnie zresetuj wyniki wszystkich graczy, zasubskrybuj SuccessEvent urządzenia licznika czasu, aby zakończyć grę, gdy upłynie czas,
# zacznij wystrzeliwać kule armatnie w kierunku graczy i zacznij spawnować losowe przedmioty.
StartGame()<suspends>:void=
Logger.Print("Uruchamianie gry.")
set GameActive = true
# Włącz urządzenia używane w grze.
CaptureArea.Enable()
for (DamageVolume : DamageVolumes):
DamageVolume.Enable()
# Dla każdego gracza, gdy jego wynik jest większy niż 0, zresetuj wynik, przyznając graczowi odwrotność
# jego wyniku, aby ustawić wynik na 0.
for:
Player : GetPlayspace().GetPlayers()
PlayerScore := ScoreManager.GetCurrentScore(Player)
PlayerScore > 0
do:
ScoreManager.SetScoreAward(-PlayerScore)
ScoreManager.Activate(Player)
# Wyścig między zakończeniem licznika czasu, wykonaniem sekwencji kuli armatniej i spawnowaniem losowych przedmiotów.
# Sekwencja kuli armatniej i spawnowanie losowych przedmiotów to pętle nieskończone, ale zostaną anulowane natychmiast po zakończeniu licznika czasu.
race:
GameTimer.SuccessEvent.Await()
StartCannonSequence()
SpawnRandomItems()
# Gra zostaje zakończona, ponieważ licznik czasu dobiegł do końca. Obsłuż poruszających się graczy i zarejestruj gracza, który wygrał.
OnGameFinished()
# Jeśli w trakcie pętli gra przestanie być aktywna, wyjdź z pętli i przestań wystrzeliwać kule armatnie.
# W przeciwnym razie losowo wybierz sekwencję z tablicy i ją odtwórz, następnie odczekaj osiem sekund przed odtworzeniem kolejnej sekwencji.
StartCannonSequence()<suspends>:void=
loop:
# Wybierz losową sekwencję spośród sekwencji kuli armatniej, aby ją odtworzyć.
RandomCannonballSequence:int = GetRandomInt(0, CannonballSequences.Length - 1)
if (CannonballSequence := CannonballSequences[RandomCannonballSequence]):
Logger.Print("Ustaw CannonballSequence na {RandomCannonballSequence}")
# Odtwórz losową wybraną sekwencję kuli armatniej
CannonballSequence.Play()
# Odczekaj przez liczbę sekund określoną przez DelayBetweenCannonBallSequences przed kolejną sekwencją.
Sleep(DelayBetweenCannonballSequences)
# Pobierz długość tablicy ItemSpawners, przejdź pętlą przez tablicę i aktywuj losową liczbę generatorów przedmiotów.
# Odczekaj losowy czas między spawnowaniem przedmiotów, powtarzaj te kroki, aż gra stanie się nieaktywna.
SpawnRandomItems()<suspends>:void=
ItemSpawnerCount:int = ItemSpawners.Length - 1
loop:
# Losowo zdecyduj, ile przedmiotów spawnować tym razem.
NumberOfItemsToSpawn:int = GetRandomInt(0, ItemSpawnerCount)
# Spawnuje losowo wybrany przedmiot tyle razy, ile wynosi NumberOfItemsToSpawn.
for:
CurrentItemSpawnNumber := 0..NumberOfItemsToSpawn
RandomItemToSpawn:int = GetRandomInt(0, ItemSpawnerCount)
SelectedItemSpawner := ItemSpawners[RandomItemToSpawn]
do:
SelectedItemSpawner.SpawnItem()
# Wygeneruj losowy czas oczekiwania między spawnami przedmiotów.
Logger.Print("Spawnowane losowe przedmioty.")
DelayBetweenItemSpawns:float = GetRandomFloat(MinimumItemSpawnTime, MaximumItemSpawnTime)
# Odczekaj przez czas określony przez DelayBetweenItemSpawns liczony w sekundach
Sleep(DelayBetweenItemSpawns)
# Gdy gra się skończy, ustaw grę na nieaktywną i wyłącz odpowiednie urządzenia.
# Następnie znajdź zwycięskiego gracza i ustaw urządzenie odwołania do gracza na tego gracza.
# Na koniec teleportuj wszystkich z powrotem do HUB-u.
OnGameFinished()<suspends>:void=
Logger.Print("Koniec gry.")
set GameActive = false
# Wyłącz urządzenia używane w grze.
CaptureArea.Disable()
for (PlayerSpawner : PlayerSpawners):
PlayerSpawner.Disable()
for (DamageVolume : DamageVolumes):
DamageVolume.Disable()
# Pobierz graczy z najwyższym wynikiem i przechowaj ich w urządzeniu odwołania do gracza.
var HighestScore:int = -1
var WinningPlayer:?agent = false
for:
Player : GetPlayspace().GetPlayers()
FortCharacter := Player.GetFortCharacter[]
do:
# Unieruchom gracza.
FortCharacter.PutInStasis(stasis_args{AllowTurning := true, AllowEmotes := true})
# Sprawdź, czy wynik tego gracza jest większy niż aktualnie wyszukany najwyższy wynik.
if (ScoreManager.GetCurrentScore(Player) > HighestScore):
# Zaktualizuj najwyższy wynik i zwycięskiego gracza
set HighestScore = ScoreManager.GetCurrentScore(Player)
set WinningPlayer = option{Player}
if(Winner := WinningPlayer?):
PlayerReference.Register(Winner)
TeleportPlayersToHUB()
#Włącz wszystkie punkty spawnu gracza w HUB-ie, następnie odczekaj kilka sekund, zanim przeteleportujesz wszystkich z powrotem do HUB-u.
# Aktywuj też EndGameTrigger, aby usunąć kamerę i urządzenia sterujące z graczy.
TeleportPlayersToHUB()<suspends>:void=
# Włącz punkty spawnu w HUB-ie.
for (HUBSpawner : HUBSpawners):
HUBSpawner.Enable()
# Opóźnienie po zakończeniu gry.
Sleep(DelayAfterGame)
# Poinformuj inne urządzenia, że gra się skończyła.
EndGameTrigger.Trigger()
# Przenieś wszystkich graczy do HUB-u.
for:
Player : GetPlayspace().GetPlayers()
FortCharacter := Player.GetFortCharacter[]
do:
HUBTeleporter.Teleport(Player)
# Odczekaj jedną sekundę, aż teleportacja się zakończy.
Sleep(1.0)
# Zakończ unieruchomienie gracza.
FortCharacter.ReleaseFromStasis()