Cómo crear un ranking global en Roblox con OrderedDataStore (y mostrarlo en una web)
Publicado el 2 min de lectura
Un ranking global anima a los jugadores a volver y a competir. En Roblox se construye con **OrderedDataStore**, un almacén de datos que guarda números y los devuelve ordenados. Este tutorial explica cómo hacerlo, con el mismo sistema que usa el TOP de Roba un Huevo Premium.
Qué es un OrderedDataStore
Es un DataStore especial cuyos valores son números enteros y que permite pedir las entradas ordenadas de mayor a menor (o al revés). Es justo lo que necesita un ranking: la clave es el UserId del jugador y el valor, su puntuación.
Guardar la puntuación
En un Script de servidor (los DataStores no funcionan desde el cliente), guarda la puntuación de cada jugador cada cierto tiempo. Los valores deben ser enteros, así que redondea:
local DataStoreService = game:GetService("DataStoreService")
local Players = game:GetService("Players")
local ranking = DataStoreService:GetOrderedDataStore("MonedasRanking_v1")
local function guardar(player)
local monedas = player:GetAttribute("Monedas") or 0
local ok, err = pcall(function()
ranking:SetAsync(tostring(player.UserId), math.floor(monedas))
end)
if not ok then
warn("No se pudo guardar en el ranking:", err)
end
endLeer el top 10
Con GetSortedAsync(false, 10) obtienes las 10 entradas más altas (el false indica orden descendente). Cada entrada tiene key (el UserId como texto) y value (la puntuación):
local function top10()
local ok, pages = pcall(function()
return ranking:GetSortedAsync(false, 10)
end)
if not ok then return {} end
local lista = {}
for i, entrada in ipairs(pages:GetCurrentPage()) do
local userId = tonumber(entrada.key)
local okName, nombre = pcall(function()
return Players:GetNameFromUserIdAsync(userId)
end)
table.insert(lista, {
puesto = i,
nombre = okName and nombre or "Jugador",
valor = entrada.value,
})
end
return lista
end
-- Actualiza los jugadores conectados y el tablero cada minuto
while true do
for _, p in ipairs(Players:GetPlayers()) do guardar(p) end
local datos = top10()
-- aquí pintas «datos» en tu tablero (SurfaceGui, TextLabels...)
task.wait(60)
endBuenas prácticas
- No actualices en cada cambio. Los DataStores tienen límites de peticiones: guarda y lee cada 60 segundos, como hace Roba un Huevo Premium.
- Envuelve todo en `pcall`: las peticiones pueden fallar y no deben romper tu juego.
- Pon versión al nombre («_v1»): si cambias cómo se calcula la puntuación, crea «_v2» y empiezas un ranking limpio.
- Calcula la puntuación en el servidor, nunca con valores enviados por el cliente. Lo explicamos en por qué no confiar en el cliente.
- Guarda en caché los nombres de usuario:
GetNameFromUserIdAsynctambién es una petición.
Mostrar el ranking en una web
Roblox ofrece Open Cloud, una API web oficial que permite leer tus OrderedDataStores desde fuera del juego con una clave de API que creas en el Creator Hub. La petición es un GET a la ruta /cloud/v2/universes/{universo}/ordered-data-stores/{nombre}/scopes/global/entries con los parámetros maxPageSize=10 y orderBy=value desc.
Atención: La clave de API es un secreto. Nunca la pongas en el código de una página web ni en un script del cliente: haz la petición desde un servidor o una función que guarde la clave como secreto, y da a la clave solo permiso de lectura.
Así funciona el TOP en directo de la página principal: una pequeña función en el servidor consulta Open Cloud cada minuto y la web muestra el resultado con los avatares de los jugadores.