Teletransportando

Se você quiser construir uma experiência com muitos lugares distintos, como um mundo de fantasia com várias cidades, castelos, masmorras e uma vasta floresta, você pode usar TeleportService para permitir que os usuários se teletransportem entre lugares em um universo, servidores ou até mesmo para outra experiência.

TeleportService não suporta playtesting no Roblox Studio. Você deve publicar a experiência e usá-la no aplicativo Roblox para testes.

Configurando Teletransporte

Para habilitar o teletransporte em sua experiência, use TeleportService:TeleportAsync() . O método aceita três parâmetros:

  • PlaceId para que os usuários se teletransportem.
  • Um array contendo as Player instâncias que representam os usuários para se teleportar.
  • Uma instância TeleportOptions opcional que contém propriedades personalizadas para a chamada TeleportAsync().
local Players = game:GetService("Players")
local TeleportService = game:GetService("TeleportService")

local TARGET_PLACE_ID = 1234 -- substituir com o seu próprio ID de lugar

local playerToTeleport = Players:GetPlayers()[1] -- obtenha o primeiro usuário na experiência

TeleportService:TeleportAsync(TARGET_PLACE_ID, {playerToTeleport}, teleportOptions)

Você só pode chamar TeleportAsync() de scripts do lado do servidor. Essa limitação reduz a exploração do lado do cliente. Se necessário, você pode chamar Teleport() de scripts do lado do cliente, mas TeleportAsync() é o método recomendado.

Habilitando Teletransporte de Experiência Cruzada

Por motivos de segurança, teletransportar um usuário de sua experiência para outra experiência pertencente a outros, ou vice-versa, falha por padrão. Para habilitar o teletransporte entre experiências, abra Configurações do Jogo > Segurança e ative Permitir Teletransportes de Terceiros no Studio.

Criando Telas de Teleporte Personalizadas

Quando um usuário aciona um teleporte, ele vê a tela de carregamento padrão do Roblox enquanto espera pelo novo lugar para carregar. Você pode adicionar uma tela de teleporte personalizada para melhorar a imersão para os usuários chamando TeleportService:SetTeleportGui() no cliente e passando pelo ScreenGui para usar antes de teleportar o usuário. O exemplo a seguir define um ScreenGui personalizado localizado em ReplicatedStorage como a tela de carregamento quando um teleporte acontece. Ele não roda nenhum script dentro do ScreenGui .

local TeleportService = game:GetService("TeleportService")
local ReplicatedStorage = game:GetService("ReplicatedStorage")

local teleportGui = ReplicatedStorage.TeleportGui

TeleportService:SetTeleportGui(teleportGui)

Personalizando Opções de Teleporte

Você pode personalizar os teletransportes, como teletransportar usuários para um servidor específico e enviar dados do usuário junto com teletransportes, configurando a instância TeleportOptions e passando-a para o método TeleportService:TeleportAsync().

Teleportando para Servidores Específicos

Para teletransportar usuários para servidores específicos, defina o servidor de destino usando TeleportOptions e passe-o para o TeleportService:TeleportAsync() método. Se você não especificar um servidor, os usuários são teletransportados para um servidor público matchmade. As informações do primeiro usuário na lista são usadas para matchmake nesse servidor público.

Para teletransportar usuários para um servidor público específico, defina a propriedade TeleportOptions.ServerInstanceId como um ID de instância válido, que é um identificador exclusivo para um servidor público.

local teleportOptions = Instance.new("TeleportOptions")
teleportOptions.ServerInstanceId = targetServerId

Para teletransportar usuários para um servidor reservado específico, defina um TeleportOptions.ReservedServerAccessCode válido, que é um código exclusivo para entrar em um servidor reservado.

local teleportOptions = Instance.new("TeleportOptions")
teleportOptions.ReservedServerAccessCode = reservedServerCode

Para teletransportar usuários para um novo servidor reservado, defina TeleportOptions.ShouldReserveServer como verdadeiro.

local teleportOptions = Instance.new("TeleportOptions")
teleportOptions.ShouldReserveServer = true

Enviando dados do usuário junto com teletransportes

Teleportar um usuário entre lugares descarta todos os dados locais associados a esse usuário. Você pode usar as seguintes abordagens para lidar com a persistência de dados entre lugares.

  • Se sua experiência usar dados de usuário seguros , como moeda ou inventário da experiência, implemente armazenamento de dados ou armazenamento de memória para manter os dados de lugar para local.
  • Para enviar dados básicos não seguros de um lugar para local, chame TeleportOptions:SetTeleportData() antes de passá-los para TeleportAsync().

Não passe dados seguros usando TeleportOptions:SetTeleportData() porque tem o risco de exploração.

local teleportData = {
    randomNumber = RNG:NextInteger(1, 100),
}

local teleportOptions = Instance.new("TeleportOptions")
teleportOptions:SetTeleportData(teleportData)

Para obter todos os dados de um usuário que chega de um teleporte no servidor, use a função Player:GetJoinData(), que retorna um dicionário incluindo os dados associados ao usuário.

local Players = game:GetService("Players")

local function onPlayerAdded(player)
    local joinData = player:GetJoinData()
    local teleportData = joinData.TeleportData
    local randomNumber = teleportData.randomNumber

    print(player.Name .. "joined with the number" .. randomNumber)
end

Players.PlayerAdded:Connect(onPlayerAdded)

Para obter apenas os dados de teleporte no cliente, você pode usar TeleportService:GetLocalPlayerTeleportData() .

Manipulação de Teletransportes Falha

Como qualquer chamada de API que envolva solicitações de rede, os teletransportes podem falhar e gerar um erro. Mesmo que uma chamada seja bem-sucedida e o teletransporte seja iniciado, ela ainda pode falhar no último momento sem gerar um erro e deixar o usuário no servidor. Quando isso acontece, ela aciona TeleportService.TeleportInitFailed .

Enrole os teletransportes em uma chamada protegida (pcall() ) e tente novamente se falhar. O exemplo a seguir ModuleScript define uma função SafeTeleport para teletransportar o usuário em uma chamada protegida e uma função handleFailedTeleport para tentar novamente teletransportes falhados que são soluços únicos e deixam cair aqueles inválidos que podem ter erros no código.

local TeleportService = game:GetService("TeleportService")

local ATTEMPT_LIMIT = 5
local RETRY_DELAY = 1
local FLOOD_DELAY = 15

local function SafeTeleport(placeId, players, options)
    local attemptIndex = 0
    local success, result -- defina os resultados do pcall fora do loop para que os resultados possam ser reportados mais tarde

    repeat
        success, result = pcall(function()
            return TeleportService:TeleportAsync(placeId, players, options) -- teletransportar o usuário em uma chamada protegida para evitar erros
        end)
        attemptIndex += 1
        if not success then
            task.wait(RETRY_DELAY)
        end
    until success or attemptIndex == ATTEMPT_LIMIT -- pare de tentar se teletransportar se a chamada for bem-sucedida ou se o limite de tentativas for atingido

    if not success then
        warn(result) -- imprima o motivo da falha na saída
    end

    return success, result
end

local function handleFailedTeleport(player, teleportResult, errorMessage, targetPlaceId, teleportOptions)
    if teleportResult == Enum.TeleportResult.Flooded then
        task.wait(FLOOD_DELAY)
    elseif teleportResult == Enum.TeleportResult.Failure then
        task.wait(RETRY_DELAY)
    else
        -- se o teletransporte for inválido, denuncie o erro em vez de tentar
        error(("Invalid teleport [%s]: %s"):format(teleportResult.Name, errorMessage))
    end

    SafeTeleport(targetPlaceId, {player}, teleportOptions)
end

TeleportService.TeleportInitFailed:Connect(handleFailedTeleport)

return SafeTeleport

A função SafeTeleport recebe os mesmos argumentos que a função TeleportAsync(). Você pode usar a seguinte ModuleScript com a função SafeTeleport para realizar teletransportes de qualquer lugar da sua experiência para reduzir os teletransportes falhados.

local Players = game:GetService("Players")
local ServerScriptService = game:GetService("ServerScriptService")

local SafeTeleport = require(ServerScriptService.SafeTeleport)

local TARGET_PLACE_ID = 1818 -- substituir com o seu próprio ID de lugar

local playerToTeleport = Players:GetPlayers()[1] -- pegue o primeiro usuário no jogo

SafeTeleport(TARGET_PLACE_ID, {playerToTeleport}, teleportOptions)

Fonte: https://create.roblox.com

Comente algo legal

Your email address will not be published. Required fields are marked *