Saltar al contenido
Roblox Lab
Consejos para creadores

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.

Leyenda:Información confirmadaConsejo generalPendiente de verificar

Qué es un OrderedDataStore

Información confirmada

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

Información confirmada

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
end

Leer el top 10

Información confirmada

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)
end

Buenas prácticas

Consejo general
  • 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: GetNameFromUserIdAsync también es una petición.

Mostrar el ranking en una web

Información confirmada

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.

Guías relacionadas