Leaderboard Global Top 100 com OrderedDataStore
Gere um sistema profissional de leaderboard global Top 100 para Roblox usando OrderedDataStore. O prompt orienta a IA a criar um Script de servidor pronto para integração, com persistência segura de pontuações, ordenação global, paginação e atualização controlada para respeitar os limites de API do DataStore.
Ideal para jogos de simulador, obby, RPG, tycoon, corrida ou qualquer experiência que precise comparar a melhor pontuação de jogadores entre todos os servidores. O resultado deve considerar o contexto real do seu Explorer, leaderstats, atributos, RemoteEvents e modelos de interface existentes.
O prompt reforça arquitetura servidor-autoritativa, validação de dados, tratamento de falhas, tentativas com backoff, cache de resultados e instruções detalhadas de teste no Roblox Studio, incluindo a configuração de acesso a API Services.
Atue como um desenvolvedor Roblox Luau sênior, especialista em persistência escalável, DataStoreService e arquitetura servidor-autoritativa. Crie um sistema completo de leaderboard global Top 100 baseado em OrderedDataStore, adaptado ao contexto do meu jogo fornecido abaixo. Antes de escrever o código, analise o contexto e assuma somente o que estiver explicitamente informado. Se faltar uma informação indispensável, faça no máximo 5 perguntas objetivas antes de gerar o script. Se o contexto estiver suficiente, gere diretamente a implementação. Não invente caminhos do Explorer, RemoteEvents, nomes de leaderstats, modelos, Frames ou APIs externas que eu não tenha informado. Quando houver uma escolha de arquitetura, explique-a brevemente antes do código. CONTEXTO DO MEU JOGO (vou preencher): - Métrica que define o ranking (ex.: Wins, Coins, Time, XP): [PREENCHER] - Onde essa métrica existe e seu tipo (ex.: Player.leaderstats.Wins, IntValue): [PREENCHER] - A pontuação pode diminuir? [SIM/NÃO] - Nome desejado para o OrderedDataStore: [PREENCHER] - Caminho do template/partes visuais do leaderboard no Workspace, se existir: [PREENCHER ou NENHUM] - Estrutura visual disponível para cada linha do ranking (ex.: Rank, Username, Score): [PREENCHER ou NENHUMA] - Intervalo desejado de atualização do ranking em segundos: [PREENCHER] - Intervalo desejado de salvamento da pontuação por jogador: [PREENCHER] - RemoteEvents/RemoteFunctions existentes e seus caminhos/finalidades: [PREENCHER ou NENHUM] - Outras regras, como excluir administradores, mínimo de pontuação ou formato numérico: [PREENCHER] TIPO E LOCALIZAÇÃO OBRIGATÓRIOS: gere um único Script de servidor para ser colocado em ServerScriptService, por exemplo com o nome GlobalLeaderboardServer. O script deve usar DataStoreService e Players. Não gere LocalScript como fonte de verdade do ranking, não salve dados no cliente e não permita que o cliente informe diretamente o valor de score a ser persistido. Caso exista uma interface física ou SurfaceGui já descrita no contexto, o mesmo Script de servidor poderá atualizar seus elementos visuais; se não houver interface definida, exponha os dados do Top 100 apenas por uma tabela/estrutura interna claramente documentada e explique exatamente como conectar uma UI depois, sem inventar assets. REQUISITOS TÉCNICOS DO SCRIPT: 1. Use OrderedDataStore corretamente para armazenar valores numéricos inteiros e obter o Top 100 com GetSortedAsync em ordem decrescente. Faça paginação com AdvanceToNextPageAsync quando necessário para alcançar até 100 entradas, sem assumir que uma única página terá todos os resultados. 2. Salve a pontuação de forma servidor-autoritativa: leia o valor diretamente do objeto confiável indicado no contexto. Conecte mudanças relevantes da métrica para agendar persistência com debounce/dirty flag, evitando SetAsync a cada alteração. Salve também em PlayerRemoving e execute BindToClose com prazo controlado para tentar persistir jogadores pendentes. 3. Implemente proteção operacional para chamadas DataStore: pcall, número limitado de tentativas, espera com backoff exponencial moderado e mensagens warn claras em falhas. Não faça loops agressivos, polling por frame, chamadas desnecessárias nem ignore limites de requisição do DataStore. 4. Mantenha cache do Top 100 em memória e impeça consultas simultâneas duplicadas com lock/flag de atualização. Atualize em intervalo configurável, com uma atualização inicial após o servidor iniciar. Trate valores inválidos, negativos quando não permitidos, NaN/infinito e scores ausentes de modo seguro. 5. Para cada UserId retornado pelo OrderedDataStore, resolva o nome do jogador com Players:GetNameFromUserIdAsync de maneira protegida e com cache de nomes, reduzindo chamadas repetidas. Caso a resolução falhe, use um fallback legível como “UserId <id>”. 6. Se uma SurfaceGui/GUI for informada no contexto, atualize somente os objetos existentes, limpe linhas antigas de forma segura e preencha posição, nome e score. Preserve templates e não destrua objetos permanentes indevidamente. Formate números de maneira legível (por exemplo, 1.234 ou 1.2K) conforme a regra informada. 7. Se for necessário consumir RemoteEvent existente para solicitar atualização visual, valide rigorosamente jogador, argumentos, limites de frequência e permissões no servidor. Nunca aceite do cliente valores de dano, moeda, inventário ou score. Se nenhum Remote for necessário, não crie um apenas por conveniência. ENTREGA OBRIGATÓRIA: responda em português do Brasil. Primeiro apresente uma lista curta de pré-requisitos e decisões assumidas. Depois forneça o código Luau integral, sem pseudocódigo, dentro de um único bloco markdown ```lua. O código deve ser pronto para colar, ter comentários úteis em português, tipos Luau quando agregarem clareza, constantes configuráveis no topo e validações defensivas. Após o código, inclua instruções numeradas para instalação no Explorer, configuração de Game Settings > Security > Enable Studio Access to API Services para testes, publicação em experiência de teste, simulação com múltiplos jogadores e verificação de falhas no Output. Explique também limitações reais: DataStores não são ferramenta para atualização instantânea global e o ranking pode ter atraso devido a cache, intervalos e orçamento de requisições.