PROGRAMACIÓN: Tutorial de DataStoreService


#1

Introducción

Un juego bien elaborado y de temática, obviamente permitirá a los jugadores comprar objetos, casas, autos, o simplemente cosas que necesiten ser almacenadas sesión por sesión de juego, para más tarde volverlas a cargar. Por eso es necesario saber:

  • Qué es el DataStoreService
  • Cómo funciona el DataStoreService

y sobre todo:

  • Ventajas y desventajas del DataStoreService

Qué es el DataStoreService

El DataStoreService es un servicio de ROBLOX que permite almacenar y obtener datos (previamente también almacenados) guardados con un método de encriptación personal, que más tarde nos permitirá desencriptarla y cargarla a cada uno de los clientes que se unan a nuestro juego. En pocas palabras: Es un servicio que guarda y retorna datos.

El DataStoreService funciona por cada juego, o sea, ejemplo: *Jailbreak no podrá obtener los datos de Prison Life, porque Prison Life usa una identificación del DataStoreService diferente, esta identificación es el placeId.

Cómo funciona el DataStoreService

Cuando guardas un dato (string) en la DataStoreService es una especie de table.insert() que va añadiendo esos datos a esa tabla, que es tu DataStoreService identificada con el placeId de tu juego.

EJEMPLO

local DataStores = {
     ['placeId'] = {
          ['placeDataStoreName'] = {
               -- EJEMPLO: GetDataStore("placeDataStoreName"):GetAsync("palabraClave") retorna: el valor guardado previamente.
               ['palabraClave'] = nil; -- DATO GUARDADO
          };
     };
};

--[[
     Si hiciéramos esto: 
     local DataStore = game:GetService('placeDataStoreName'):GetAsync('palabraClave');

     print(tostring(DataStore));

     El valor que sería impreso sería nil
--]]

Pero no complicándolos más, guardar un dato es fácil, igual recibirlo.

  • Cómo se guarda un dato:
    PLANTILLA: DataStore:SetAsync(palabraClave, valorAGuardar)

Si quisiéramos guardar, por ejemplo los puntos de un jugador, sería.

local function GuardarDatos(Jugador, Puntos)
     local Si, No = pcall(function(
          DataStore:SetAsync(Jugador.UserId, Puntos)
     ));

     if (Si) then
          print("Puntos del jugador x guardados");
     end;
end;

Obviamente la variable DataStore del ejemplo, debe estar pre-definida, podría ser una así:

local DataStore = game:GetService("DataStoreService"):GetDataStore("PuntosDeJugadores");
  • Cómo se carga un dato:
    PLANTILLA: DataStore:GetAsync(palabraClave) Retorna el valor que previamente debió haber sido guardado

Si quisiéramos cargar un dato sería.

local function CargarDatos(Jugador)
     if (DataStore:GetAsync(Jugador.UserId)) then
           print("Los puntos del jugador x son: " .. DataStore:GetAsync(Jugador.UserId));
     end;
end;

De igual manera como en el punto anterior, la variable DataStore debe estar pre-definida.

  • Cómo se borra un dato:
    PLANTILLA: DataStore:RemoveAsync(palabraClave)

Si quisiéramos por ejemplo, desaparecer de la faz de la tierra los puntos de un jugador, sería.

local function RemoverDatos(Jugador)
     if (DataStore:GetAsync(Jugador.UserId)) then
          DataStore:RemoveAsync(Jugador.UserId);
     end;
end;

NOTA: El servicio de DataStoreService tiene muchas más funciones que las de :GetAsync() y :SetAsync() pero estas serán para otro tutorial si veo que apoyan este.


Ahora viene lo más importante, las ventajas y desventajas de usar el DataStoreService primero que todo aclarar que el servicio tiene ciertos límites que van ligados proporcionalmente al número de jugadores que se encuentran en el servidor.

O sea, el número de solicitudes no podrá exceder cierto cálculo que es definido por el número de jugadores en tu juego.

Estos límites son:
(sólo pondré los límites de las funciones del servicio que hemos visto hoy)

Tipo de solicitud Método de solicitud Cantidad de solicitudes permitidas por minuto
Obtener GetAsync() 60 + (el número de jugadores) * 10
Postear SetAsync() RemoveAsync() 60 + (el número de jugadores) * 10

Además también hay límites para el nombre de la DataStore, para la cantidad de caracteres usados en la palabra clave o en el número de caracteres almacenados en el valor guardado, estos son:

Componente Máximo número de caracteres
Palabra clave 50 caracteres
Nombre de la DataStore 50 caracteres
Datos guardados 260,000 caracteres

NOTA: La densidad de caracteres de las variables pueden ser checados con la función: string.len(variable) o variable:len() para evitar errores en la consola.

Ediatándolo me di cuenta de que no puse las ventajas, pues aquí van: Te permite que los jugadores puedan salir de una sesión a otra y todavía conservar sus datos, lo que lo hace más adictivo por la ambición de querer seguir acumulando datos.


Esto fue todo por hoy, es mi primer tutorial en el maravilloso DevForum y espero que no sea el último.

Si te gustó valora esto con un :heart: y obviamente comenta y da tu opinión.

REFERENCIAS
RobloxDevHub: DataStore Limits and Errors
RobloxDevHub: DataStoreService


DATO CURIOSO
Antes en ROBLOX existía una función que iba en el PlayerObject :LoadValue() y :SaveValue() pero era muy precario y perecía de seguridad.


#2

Gracias por la info.


#3

Gracias ,no solo por ese tutorial sino por el aceptarme aquí