Teleporte Cross-Place com Persistência Segura de Dados
Este prompt cria um sistema avançado de teleporte entre places da mesma experiência Roblox, com preservação segura de dados como moedas, inventário, progresso, equipe e estado de sessão. Ele orienta a IA a integrar o código à arquitetura já existente do seu jogo, sem assumir nomes fixos de pastas, remotes ou módulos.
O resultado solicitado é um Script Luau de servidor pronto para colar no Roblox Studio, com persistência via DataStoreService, metadados temporários via TeleportData e validações contra tentativas de exploração. Também inclui tratamento de falhas, limites de requisição, recuperação no place de destino e um roteiro prático de testes em ambiente publicado.
É indicado para desenvolvedores que possuem experiências com lobby, mapas, dungeons, partidas, mundos separados ou qualquer fluxo que mova jogadores entre múltiplos places dentro do mesmo universe Roblox.
Atue como um desenvolvedor Roblox Luau sênior, especializado em arquitetura multiplayer, DataStoreService e TeleportService. Crie um sistema de teleporte entre places da mesma experiência Roblox que preserve dados do jogador de modo confiável, seguro e compatível com produção. Antes de gerar o código, use o contexto técnico que fornecerei abaixo como fonte de verdade. Meu contexto do jogo (preencherei ou ajustarei antes de enviar): - PlaceId de destino: [COLE_O_PLACE_ID_DE_DESTINO] - Nome/local do RemoteEvent usado para pedir teleporte, se já existir: [EX.: ReplicatedStorage.Remotes.RequestTeleport] - Nome/local de RemoteEvent para feedback visual ao cliente, se já existir: [OPCIONAL] - Sistema atual de dados: [EX.: ModuleScript ServerScriptService.Services.PlayerDataService / DataStore próprio / leaderstats / nenhum] - Funções já existentes para ler e salvar dados: [EX.: GetProfile(player), SaveProfile(player), LoadProfile(player)] - Estrutura dos dados a preservar: [EX.: Coins, Gems, Inventory, Level, QuestProgress, SelectedClass] - Regras de acesso ao teleporte: [EX.: somente ao tocar em um portal; requer nível 10; todos podem usar] - Objetos relevantes no Explorer e seus caminhos: [COLE AQUI] - Há vários destinos? [SIM/NÃO; descreva IDs, nomes e regras] - Comportamento desejado no destino: [EX.: spawnar em SpawnLocation chamado DungeonSpawn] Gere UM Script de servidor completo em Luau, pronto para colar em ServerScriptService, com um nome sugerido como CrossPlaceTeleportService.server.lua. Caso meu contexto já possua um módulo central de dados, integre-se a ele por meio de uma camada adaptadora claramente identificada no início do script, sem duplicar DataStore nem substituir silenciosamente o sistema existente. Caso não exista sistema de dados, implemente uma persistência mínima com DataStoreService, usando uma chave baseada em UserId e um schema de dados serializável. O script deve implementar estes requisitos técnicos: 1. Executar exclusivamente no servidor. O cliente pode apenas solicitar uma intenção de teleporte por RemoteEvent; o servidor deve validar player, destino permitido, estado da partida, cooldown, requisitos e proximidade/condição de acesso quando aplicável. Nunca aceite do cliente moedas, inventário, dano, permissões, PlaceId arbitrário ou dados a salvar. 2. Usar TeleportService:TeleportAsync() no servidor e TeleportOptions:SetTeleportData() para transportar apenas metadados mínimos, como versão do snapshot, requestId aleatório, destino lógico e timestamp. Não envie inventário completo ou dados sensíveis no TeleportData. Explique em comentários que TeleportData não substitui persistência no DataStore. 3. Antes do teleporte, obter um snapshot limpo dos dados no servidor, validar seus tipos, remover valores não serializáveis (Instances, funções, userdata e referências cíclicas), e salvá-lo de forma atômica com DataStoreService:UpdateAsync(). Inclua retries com backoff limitado para falhas transitórias, pcall e mensagens de diagnóstico via warn(). Não faça loops infinitos nem exceda limites de DataStore. 4. Salvar campos de controle no registro, incluindo schemaVersion, updatedAt, saveVersion e um identificador de transação/requestId. No place de destino, usar Player:GetJoinData() para ler TeleportData, validar rigorosamente tipo, timestamp, requestId e PlaceId/origem esperados. Em seguida, carregar os dados persistidos pelo UserId no DataStore ou pelo adaptador de dados existente; o DataStore deve ser a fonte de verdade, e TeleportData apenas serve para correlação e fluxo. 5. Proteger contra duplicação ou regressão de dados causada por tentativas repetidas, falha de teleporte ou chegada duplicada. Use saveVersion/requestId de modo documentado, nunca sobrescreva um registro mais novo com snapshot antigo e deixe claro nos comentários quais garantias são possíveis e quais dependem do serviço de dados já existente. 6. Tratar TeleportService.TeleportInitFailed, falhas de save e jogador saindo durante o processo. Implemente um bloqueio por jogador para impedir múltiplos teletransportes concorrentes, cooldown configurável, limpeza de conexões e restauração do estado caso o teleporte não seja iniciado. Não teleporte se o save obrigatório falhar. 7. Se houver RemoteEvent no contexto, conecte-o com OnServerEvent e aplique rate limit por jogador. Se não houver, deixe uma função pública/local bem documentada, como RequestTeleport(player, destinationKey), e mostre exatamente como outro Script de servidor deve chamá-la. Não crie LocalScript como solução principal. 8. Use task.wait, task.spawn e APIs modernas quando apropriado; evite APIs depreciadas. Inclua configurações concentradas no topo do arquivo, comentários explicativos em português e validação defensiva de todos os retornos de serviços Roblox. Entregue primeiro uma breve lista de premissas adotadas e possíveis pontos que devo ajustar conforme o contexto enviado. Depois forneça o código INTEGRAL em um único bloco markdown identificado como ```lua. Não omita trechos com frases como "restante do código", "implemente aqui" ou pseudocódigo. Se uma integração depender de função inexistente no meu contexto, crie uma interface adaptadora funcional e marque apenas os pontos de mapeamento com comentários claros. Após o código, escreva instruções objetivas para instalação no Explorer, configuração do PlaceId e RemoteEvent, permissões de API Services/DataStore no Roblox Studio, publicação dos dois places no mesmo universe, e um plano de testes. Inclua testes de sucesso, falha de DataStore, spam de RemoteEvent, teleporte duplicado, saída do jogador durante save e validação da recuperação dos dados no place de destino. Mantenha toda a resposta em português do Brasil.