TeleportService

Show Deprecated
Not Creatable
Service

TeleportService is responsible for transporting Players between different places and servers.

For more information on how to teleport players between servers, see Teleporting Between Places.

Summary

Methods

Events

Properties

Methods

GetArrivingTeleportGui

This function returns the customLoadingScreen the LocalPlayer arrived into the place with.

Note, the customLoadingScreen will not be used if the destination place is in a different game.

Loading Screen

During a teleport, while the destination place is loading, the customLoadingScreen is parented to the CoreGui. Once the place has loaded the loading screen is parented to nil.

If you wish to preserve the customLoadingScreen and perform your own transitions, you will need to parent it to the local player's PlayerGui. For an example of this, see the code sample below.

Studio Limitation

This service does not work during playtesting in Roblox Studio — To test aspects of your game using it, you must publish the game and play it in the Roblox application.


Returns

The customLoadingScreen the LocalPlayer arrived into the place with.

Code Samples

Handling a Teleport Loading GUI

local TeleportService = game:GetService("TeleportService")
local Players = game:GetService("Players")
local ReplicatedFirst = game:GetService("ReplicatedFirst")
local customLoadingScreen = TeleportService:GetArrivingTeleportGui()
if customLoadingScreen then
local playerGui = Players.LocalPlayer:WaitForChild("PlayerGui")
ReplicatedFirst:RemoveDefaultLoadingScreen()
customLoadingScreen.Parent = playerGui
task.wait(5)
customLoadingScreen:Destroy()
end

GetLocalPlayerTeleportData

Variant

This function returns the teleport data the Players.LocalPlayer arrived with. It can only be called from the client.

Exploiters can spoof teleport data. Send secure data such as player currency through a server-side service such as DataStoreService to prevent tampering.


Returns

Variant

The teleport data the Players.LocalPlayer arrived into the place with.

Code Samples

Getting LocalPlayer Teleport Data

local TeleportService = game:GetService("TeleportService")
local teleportData = TeleportService:GetLocalPlayerTeleportData()
print("Local player arrived with this data:", teleportData)

GetTeleportSetting

Variant

This function retrieves a teleport setting saved using TeleportService:SetTeleportSetting() using the given key.

This method is intended for use on the client only and should not be used on the server.

Teleport settings are preserved across teleportations within the same game. This means data can be saved using TeleportService:SetTeleportSetting() in one place and retrieved using GetTeleportSetting in another place the user has been teleported to.

For example, in a game that allowed crouching you could save whether the user is currently crouching prior to teleporting as a teleport setting. This could then be retrieved in the destination place after the teleportation:


local TeleportService = game:GetService("TeleportService")
local isCrouching = TeleportService:GetTeleportSetting("isCrouching")

If no teleport setting exists under the given key, this function will return nil.

Differences from GlobalDataStores

Although they share some similarities, there are some key differences between teleport settings and datastores:

  • GlobalDataStore:SetAsync() stores the data on Roblox servers whereas SetTeleportSetting stores the data locally
  • Data stored in a GlobalDataStore is preserved after the user leaves the game universe whereas teleport settings are not
  • GlobalDataStores can only be accessed on the server, whereas teleport settings can only be accessed on the client
  • GlobalDataStores have usage limits, whereas teleport settings do not

In general teleport settings should be used to preserve client side information within a single play session across different places in a game. GlobalDataStores should be used to save important player data that needs to be accessed across player sessions.

Teleport settings and security

As teleport settings are stored locally, it is possible they can be manipulated by malicious users. This risk can be mitigated by employing server side validation.

Studio limitation

This service does not work during playtesting in Roblox Studio — To test aspects of your game using it, you must publish the game and play it in the Roblox application.

Parameters

setting: string

The key the value was stored under using TeleportService:SetTeleportSetting().


Returns

Variant

The value stored under the given key.

SetTeleportGui

void

This function sets the custom teleport GUI that will be shown to the local user during teleportation, prior to the teleport being invoked.

Note, the teleport GUI will not be used if the destination place is in a different game. It will also not persist across multiple teleports and will need to be set prior to each one.

This function should only be used on the client. If the teleportation function is called from the server (as is the case with TeleportService:TeleportAsync()) then this function should be called on the client prior to this. One way of doing this is listening to a RemoteEvent that fires several seconds before teleportation.

Loading screen

During a teleport, while the destination place is loading, the customLoadingScreen is parented to the CoreGui. Once the place has loaded the loading screen is parented to nil.

This ScreenGui can be fetched at the destination place using TeleportService:GetArrivingTeleportGui(), allowing you to parent it to the PlayerGui and perform your own transitions.

You are advised to also parent the ScreenGui to the PlayerGui in the start place while the teleport is initiating.

Studio Limitation

This service does not work during playtesting in Roblox Studio — To test aspects of your game using it, you must publish the game and play it in the Roblox application.

Parameters

The loading ScreenGui that is to be displayed during teleportation.


Returns

void

Code Samples

Teleporting the local player

local TeleportService = game:GetService("TeleportService")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Players = game:GetService("Players")
local playerGui = Players.LocalPlayer:WaitForChild("PlayerGui")
local PLACE_ID = 0 -- replace here
local loadingGui = ReplicatedStorage:FindFirstChild("LoadingGui")
-- parent the loading gui for this place
loadingGui.Parent = playerGui
-- set the loading gui for the destination place
TeleportService:SetTeleportGui(loadingGui)
TeleportService:Teleport(PLACE_ID)

SetTeleportSetting

void

This function stores a value under a given key that persists across all teleportations in the same game.

This method is intended for use on the client only and should not be used on the server.

The stored value can later be retrieved using TeleportService:GetTeleportSetting(). This will work in the current place and any subsequent places the Players.LocalPlayer teleports to, provided they are in the same game.

For example, in a game that allowed crouching you could save whether the user is currently crouching prior to teleporting as a teleport setting:


local TeleportService = game:GetService("TeleportService")
local isCrouching = false
TeleportService:SetTeleportSetting("isCrouching", isCrouching)

The stored value can take one of the following forms:

  • A table without mixed keys (all strings or all integers)
  • A string
  • A number
  • A bool

If data is already stored under the given key, the previous value will be overwritten by the new value.

Differences from GlobalDataStores

Although they share some similarities, there are some key differences between teleport settings and datastores:

  • GlobalDataStore:SetAsync() stores the data on Roblox servers whereas SetTeleportSetting stores the data locally
  • Data stored in a GlobalDataStore is preserved after the user leaves the game universe whereas teleport settings are not
  • GlobalDataStores can only be accessed on the server, whereas teleport settings can only be accessed on the client
  • GlobalDataStores have usage limits, whereas teleport settings do not

In general teleport settings should be used to preserve client side information within a single play session across different places in a game. GlobalDataStores should be used to save important player data that needs to be accessed across player sessions.

Teleport settings and security

As teleport settings are stored locally, it is possible they can be manipulated by malicious users. This risk can be mitigated by employing server side validation.

Studio limitation

This service does not work during playtesting in Roblox Studio — To test aspects of your game using it, you must publish the game and play it in the Roblox application.

Parameters

setting: string

The key to store the value under. This key can be used to retrieve the value using TeleportService:GetTeleportSetting().

value: Variant

The value to store.


Returns

void

Teleport

void

This method should not be used for new work; the numerous teleport functions have been combined into a single method, TeleportAsync(), which should be used instead.

Parameters

placeId: number

The ID of the place to teleport to.

player: Instance

The Player to teleport, if this function is being called from the client this defaults to the Players.LocalPlayer.

Default Value: "nil"
teleportData: Variant

Optional data to be passed to the destination place. Can be retrieved using TeleportService:GetLocalPlayerTeleportData().

customLoadingScreen: Instance

Optional custom loading screen to be placed in the CoreGui at the destination place. Can be retrieved using TeleportService:GetArrivingTeleportGui().

Default Value: "nil"

Returns

void

Code Samples

Teleporting the local player

local TeleportService = game:GetService("TeleportService")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Players = game:GetService("Players")
local playerGui = Players.LocalPlayer:WaitForChild("PlayerGui")
local PLACE_ID = 0 -- replace here
local loadingGui = ReplicatedStorage:FindFirstChild("LoadingGui")
-- parent the loading gui for this place
loadingGui.Parent = playerGui
-- set the loading gui for the destination place
TeleportService:SetTeleportGui(loadingGui)
TeleportService:Teleport(PLACE_ID)
Teleporting from the server

local Players = game:GetService("Players")
local TeleportService = game:GetService("TeleportService")
local PLACE_ID = 0 -- replace here
local USER_ID = 1 -- replace with player's UserId
local player = Players:GetPlayerByUserId(USER_ID)
TeleportService:Teleport(PLACE_ID, player)

TeleportToPlaceInstance

void

This method should not be used for new work; the numerous teleport functions have been combined into a single method, TeleportAsync(), which should be used instead.

Parameters

placeId: number

The ID of the place to teleport to.

instanceId: string

The DataModel.JobId of the server instance to teleport to.

player: Instance

The Player to teleport, if this function is being called from the client this defaults to the Players.LocalPlayer.

Default Value: "nil"
spawnName: string

Optional name of the SpawnLocation to spawn at.

Default Value: ""
teleportData: Variant

Optional data to be passed to the destination place. Can be retrieved using TeleportService:GetLocalPlayerTeleportData().

customLoadingScreen: Instance

Optional custom loading screen to be placed in the CoreGui at the destination place. Can be retrieved using TeleportService:GetArrivingTeleportGui().

Default Value: "nil"

Returns

void

Code Samples

Following Another Player

local TeleportService = game:GetService("TeleportService")
local Players = game:GetService("Players")
Players.PlayerAdded:Connect(function(player)
-- Is this player following anyone?
local followId = player.FollowUserId
-- If so, find out where they are
if followId and followId ~= 0 then
local _currentInstance, placeId, jobId
local success, errorMessage, _currentInstance, placeId, jobId = pcall(function()
-- followId is the user ID of the player that you want to retrieve the place and job ID for
return TeleportService:GetPlayerPlaceInstanceAsync(followId)
end)
if success then
-- Teleport player
TeleportService:TeleportToPlaceInstance(placeId, jobId, player)
else
warn(errorMessage)
end
else
warn("Player " .. player.UserId .. " is not following another player!")
end
end)

TeleportToPrivateServer

void

This method should not be used for new work; the numerous teleport functions have been combined into a single method, TeleportAsync(), which should be used instead.

Parameters

placeId: number

The ID of the place to teleport to.

reservedServerAccessCode: string

The reserved server access code returned by TeleportService:ReserveServer().

players: Objects

An array of Players to teleport.

spawnName: string

Optional name of the SpawnLocation to spawn at.

Default Value: ""
teleportData: Variant

Optional data to be passed to the destination place. Can be retrieved using TeleportService:GetLocalPlayerTeleportData().

customLoadingScreen: Instance

Optional custom loading screen to be placed in the CoreGui at the destination place. Can be retrieved using TeleportService:GetArrivingTeleportGui().

Default Value: "nil"

Returns

void

Code Samples

TeleportService: Teleport to a Reserved Server via Chat

local TeleportService = game:GetService("TeleportService")
local Players = game:GetService("Players")
local DataStoreService = game:GetService("DataStoreService")
local dataStore = DataStoreService:GetGlobalDataStore()
-- Get the saved code
local code = dataStore:GetAsync("ReservedServer")
if typeof(code) ~= "string" then -- None saved, create one
code = TeleportService:ReserveServer(game.PlaceId)
dataStore:SetAsync("ReservedServer", code)
end
local function joined(player)
player.Chatted:Connect(function(message)
if message == "reserved" then
TeleportService:TeleportToPrivateServer(game.PlaceId, code, { player })
end
end)
end
Players.PlayerAdded:Connect(joined)
TeleportService: Teleport to a Reserved Server

local TeleportService = game:GetService("TeleportService")
local Players = game:GetService("Players")
local code = TeleportService:ReserveServer(game.PlaceId)
local players = Players:GetPlayers()
TeleportService:TeleportToPrivateServer(game.PlaceId, code, players)
-- You could add extra arguments to this function: spawnName, teleportData and customLoadingScreen

TeleportToSpawnByName

void

This method should not be used for new work; the numerous teleport functions have been combined into a single method, TeleportAsync(), which should be used instead.

Parameters

placeId: number

The ID of the place to teleport to.

spawnName: string

The name of the SpawnLocation to spawn at.

player: Instance

The Player to teleport, if this function is being called from the client this defaults to the Players.LocalPlayer.

Default Value: "nil"
teleportData: Variant

Optional data to be passed to the destination place. Can be retrieved using TeleportService:GetLocalPlayerTeleportData().

customLoadingScreen: Instance

Optional custom loading screen to be placed in the CoreGui at the destination place. Can be retrieved using TeleportService:GetArrivingTeleportGui().

Default Value: "nil"

Returns

void

Code Samples

TeleportService:TeleportToSpawnByName

local TeleportService = game:GetService("TeleportService")
TeleportService:TeleportToSpawnByName(1818, "TeleportSpawn")

GetPlayerPlaceInstanceAsync

Yields

This function returns the PlaceId and JobId of the server the user with the given UserId is in, provided it is in the same game as the current place.

Then, TeleportService:TeleportToPlaceInstance() can be called with this information to allow a user to join the target user's server.

Upon a successful lookup, the function returns the following values:

#NameTypeDescription
1 currentInstanceboolA bool indicating if the user was found in the current instance
2errorstringAn error message in the event of the lookup failing
3placeIdint64The PlaceId of the server the user is in
4instanceIdstringThe JobId of the server the user is in

If there is a problem during lookup, such as the user being offline, an error is thrown. It is recommended that you wrap calls to this function in pcall.

Limitations

You should be aware of the following limitations when using this function:

  • This function can only be called by the server.
  • This function may fail to return the correct information if the user is teleporting.
  • It is possible for this function to throw an error, hence developers should wrap it in a pcall() (see example below)
  • As this function returns the JobId of the server and not the access code returned by TeleportService:ReserveServer(), the id returned is not appropriate for use with reserved servers.

Studio Limitation

This service does not work during playtesting in Roblox Studio — To test aspects of your game using it, you must publish the game and play it in the Roblox application.

Parameters

userId: number

The Player.UserId of the Player.


Returns

See the table above.

Code Samples

Following Another Player

local TeleportService = game:GetService("TeleportService")
local Players = game:GetService("Players")
Players.PlayerAdded:Connect(function(player)
-- Is this player following anyone?
local followId = player.FollowUserId
-- If so, find out where they are
if followId and followId ~= 0 then
local _currentInstance, placeId, jobId
local success, errorMessage, _currentInstance, placeId, jobId = pcall(function()
-- followId is the user ID of the player that you want to retrieve the place and job ID for
return TeleportService:GetPlayerPlaceInstanceAsync(followId)
end)
if success then
-- Teleport player
TeleportService:TeleportToPlaceInstance(placeId, jobId, player)
else
warn(errorMessage)
end
else
warn("Player " .. player.UserId .. " is not following another player!")
end
end)

ReserveServer

Yields

This function returns an access code that can be used to teleport players to a reserved server, along with the server's DataModel.PrivateServerId. It can only be called on the server.

Reserved Servers

You can access reserved servers using:

You can see if the current server is a reserved server by using the following code:


local isReserved = game.PrivateServerId ~= "" and game.PrivateServerOwnerId == 0

The DataModel.PrivateServerId is constant across all server instances associated with the server access code, the DataModel.JobId is not.

Studio Limitation

This service does not work during playtesting in Roblox Studio; to test aspects of your game using it, you must publish the game and play it in the Roblox application.

Cross-Platform Play

Players on Xbox One with cross-platform play disabled will arrive in a different server with players with cross-platform play enabled. This can cause multiple game servers with the same PrivateServerId to exist."

Parameters

placeId: number

The DataModel.PlaceId of the place the reserved server is being created for.


Returns

The server access code required by TeleportService:TeleportToPrivateServer() and the DataModel.PrivateServerId for the reserved server.

Code Samples

TeleportService: Teleport to a Reserved Server

local TeleportService = game:GetService("TeleportService")
local Players = game:GetService("Players")
local code = TeleportService:ReserveServer(game.PlaceId)
local players = Players:GetPlayers()
TeleportService:TeleportToPrivateServer(game.PlaceId, code, players)
-- You could add extra arguments to this function: spawnName, teleportData and customLoadingScreen
TeleportService: Teleport to a Reserved Server via Chat

local TeleportService = game:GetService("TeleportService")
local Players = game:GetService("Players")
local DataStoreService = game:GetService("DataStoreService")
local dataStore = DataStoreService:GetGlobalDataStore()
-- Get the saved code
local code = dataStore:GetAsync("ReservedServer")
if typeof(code) ~= "string" then -- None saved, create one
code = TeleportService:ReserveServer(game.PlaceId)
dataStore:SetAsync("ReservedServer", code)
end
local function joined(player)
player.Chatted:Connect(function(message)
if message == "reserved" then
TeleportService:TeleportToPrivateServer(game.PlaceId, code, { player })
end
end)
end
Players.PlayerAdded:Connect(joined)

TeleportAsync

Yields

This function serves as the all-encompassing method to teleport a player or group of players from one server to another. It can be used to:

  • Teleport players to a different place.
  • Teleport players to a specific server.
  • Teleport players to a reserved server.

Group Teleport Limitations

  • Groups of players can only be teleported within a single experience.
  • No more than 50 players can be teleported with a single TeleportService:TeleportAsync() call.

Potential Errors

This is a list of potential reasons a teleport may fail, ranging from invalid teleports to network issues.

ErrorDescription
Invalid placeIdThe provided place ID is below 0.
Players emptyThe provided list of players to teleport is empty.
List of players instances is incorrectAny of the provided players is not a Player object.
TeleportOptions not of correct typeThe provided teleportOption is not a TeleportOptions object.
TeleportAsync called from ClientThe client called TeleportAsync, which can only be called from the server.
Incompatible Parameters Conflicting teleport options were used and TeleportService doesn't know where to send the player.

Conflicting TeleportOption parameters:
* ReservedServerAccessCode and ServerInstanceId
* ShouldReserveServer and ServerInstanceId
* ShouldReserveServer and ReservedServerAccessCode

For more information on how to teleport players between servers and receive user data from a teleport, see Teleporting Between Places.

Parameters

placeId: number

The place ID the player(s) should be teleported to.

players: Objects

An array of the player(s) to teleport.

teleportOptions: Instance

An optional TeleportOptions object containing additional arguments to the TeleportService:TeleportAsync() call. If this is not passed, no result will be returned.

Default Value: "nil"

Returns

If a TeleportOptions parameter is passed, this will be a TeleportAsyncResult object that provides information about the final teleport destination.

TeleportPartyAsync

Yields

This method should not be used for new work; the numerous teleport functions have been combined into a single method, TeleportAsync(), which should be used instead.

Parameters

placeId: number

The ID of the place to teleport to.

players: Objects

An array containing the Players to teleport.

teleportData: Variant

Optional data to be passed to the destination place. Can be retrieved using TeleportService:GetLocalPlayerTeleportData().

customLoadingScreen: Instance

Optional custom loading screen to be placed in the CoreGui at the destination place. Can be retrieved using TeleportService:GetArrivingTeleportGui().

Default Value: "nil"

Returns

The DataModel.JobId of the server instance the Players were teleported to.

Code Samples

Teleport all players in the server

local Players = game:GetService("Players")
local TeleportService = game:GetService("TeleportService")
local PLACE_ID = 0 -- replace
local playerList = Players:GetPlayers()
local success, result = pcall(function()
return TeleportService:TeleportPartyAsync(PLACE_ID, playerList)
end)
if success then
local jobId = result
print("Players teleported to", jobId)
else
warn(result)
end

Events

LocalPlayerArrivedFromTeleport

This function fires when the Players.LocalPlayer enters the place following a teleport. The teleportData and customLoadingScreen are provided as arguments.

When fetching teleportData and the customLoadingScreen you are advised to use TeleportService:GetLocalPlayerTeleportData() and TeleportService:GetArrivingTeleportGui() instead. This is because these functions can be called immediately without having to wait for this event to fire.

This event should be connected immediately in a LocalScript parented to ReplicatedFirst. Otherwise, when the connection is made the event may have already fired.

Loading Screen

During a teleport, while the destination place is loading, the customLoadingScreen is parented to the CoreGui. Once the place has loaded the loading screen is parented to nil.

If you wish to preserve the customLoadingScreen and perform your own transitions, you will need to parent it to the local player's PlayerGui. For example, using the following code inside a LocalScript in ReplicatedFirst:


local TeleportService = game:GetService("TeleportService")
local Players = game:GetService("Players")
local ReplicatedFirst = game:GetService("ReplicatedFirst")
TeleportService.LocalPlayerArrivedFromTeleport:Connect(function(customLoadingScreen, teleportData)
local playerGui = Players.LocalPlayer:WaitForChild("PlayerGui")
ReplicatedFirst:RemoveDefaultLoadingScreen()
customLoadingScreen.Parent = playerGui
-- animate screen here
wait(5)
-- destroy screen
customLoadingScreen:Destroy()
end)

The customLoadingScreen will not be used if the destination place is in a different game.

Studio Limitation

This service does not work during playtesting in Roblox Studio — To test aspects of your game using it, you must publish the game and play it in the Roblox application.

Parameters

loadingGui: Instance

The customLoadingScreen the LocalPlayer arrived into the place with.

dataTable: Variant

The teleportData the LocalPlayer arrived into the place with.


TeleportInitFailed

This event fires on both the client and the server when a request to teleport from a function such as TeleportService:TeleportAsync() fails and the player does not leave the current server. It provides a reason for the failure, as well as all of the information necessary to retry the teleport. If a group teleport fails, the event will fire once per player.

TeleportOptions

The TeleportOptions object provided by this event is not identical to the one passed to the original TeleportService:TeleportAsync() call. It is a new object populated with the necessary parameters to retry the teleport and send the player to the exact same destination. This is especially important for facilitating group teleports when they fail.

Original Teleport TypeTeleport DataReservedServerAccessCodeServerInstanceIdShouldReserveServer
Individual player to placeOriginal valueNoneNonefalse
Player(s) to reserved serverOriginal valueOriginal value, or the code generated if ShouldReserveServer was originally trueNonefalse
Player(s) to specific serverOriginal valueNoneOriginal valuefalse
Players to placeOriginal valueNoneSame destination ID as the other players in the original teleportfalse

For more information on how to teleport players between servers, see Teleporting Between Places.

Parameters

player: Instance

The Player instance that failed to teleport.

teleportResult: Enum.TeleportResult

The reason for the teleport failure.

errorMessage: string

The message provided to the player explaining the teleport failure.

placeId: number

The original target place ID of the teleport.

teleportOptions: Instance

A TeleportOptions object that can be passed back to TeleportService:TeleportAsync() to retry the failed teleport.