EzData v2
An easier way to save players data!
Features
- Multiple Data Stores
- Easily Save & Load Data
- Automatically create data objects (ex: leaderstats)
Module
Marketplace
Source:
--> Define Class
local EzData = {}
EzData.__index = EzData
--> Services
local DataStoreService = game:GetService("DataStoreService")
--> Class Methods
function EzData.NewDataStore(DataStoreName: string)
local Class = {
["DataStore"] = DataStoreService:GetDataStore(DataStoreName),
}
return setmetatable(Class, {__index = EzData})
end
function EzData:Save(player: Player, DataTable)
local succ, err = pcall(function()
self["DataStore"]:SetAsync(player.UserId, DataTable)
end)
return succ, err
end
function EzData:ErasePlayerData(player: Player, DefaultDataTable: {}?)
if DefaultDataTable == nil then
DefaultDataTable = {}
end
local succ, err = pcall(function()
self["DataStore"]:SetAsync(player.UserId, DefaultDataTable)
end)
return succ, err
end
function EzData:Load(player: Player, DefaultDataTable: {}?)
local Data = nil
local Succ, err = pcall(function()
Data = self["DataStore"]:GetAsync(player.UserId)
end)
if Data == nil and DefaultDataTable ~= nil and type(DefaultDataTable) == "table" then
Data = DefaultDataTable
end
return Data, Succ, err
end
function EzData:CreateDataObjects(player: Player, Data)
local function load(N, V)
local function title(s)
return s:sub(1, 1):upper() .. s:sub(2, #s)
end
local _type = type(V)
local instanceType = _type == "table" and "Folder" or `{title(_type)}Value`
instanceType = _type == "boolean" and "BoolValue" or instanceType
local Inst = Instance.new(instanceType)
if instanceType ~= "Folder" then
Inst.Value = V
end
Inst.Name = N
return Inst
end
local function DigTable(tbl, forceParent)
for index, v in pairs(tbl) do
if type(v) == "table" then
local folder = load(index, v)
folder.Parent = player
DigTable(v, folder)
else
local inst = load(index, v)
if forceParent == nil then
inst.Parent = player
else
inst.Parent = forceParent
end
end
end
end
DigTable(Data)
end
return EzData
Documentation
--[[
-- Requiring the module
local EzData = require(game:GetService("ReplicatedStorage"):WaitForChild("EzData v2"))
-- Creating a data store
local DataStore = EzData.NewDataStore("Test Data Store")
-- Creating a Default Data Table
local DefaultDataTable = {
["leaderstats"] = {
["Kills"] = 0,
["Deaths"] = 0,
}
}
-- Saving Player Data
DataStore:Save(player: Player, DataTable: {})
-- Loading Player Data
local SavedData: {}, Succ: boolean, Err: string = EzData:Load(player: Player)
-- Erase Player Data
DataStore:ErasePlayerData(player: Player, DefaultDataTable: {})
-- Creating Data Objects
DataStore:CreateDataObjects(player: Player, SavedData: {})
]]--
Example Script
--> Services
local Players = game:GetService("Players")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
--> Variables
local EzData = require(ReplicatedStorage:WaitForChild("EzData v2"))
local PlayerData = EzData.NewDataStore("Player_Data_1")
local DefaultDataTable = {
["leaderstats"] = {
["Deaths"] = 0,
["Kills"] = 0,
["Level"] = 1,
},
["XP"] = 0,
}
--> Functions
function PlayerAdded(player: Player)
local SavedData = PlayerData:Load(player, DefaultDataTable)
PlayerData:CreateDataObjects(player, SavedData)
end
function PlayerRemoving(player: Player)
local DataTable = {}
local leaderstats = player:FindFirstChild("leaderstats")
local Deaths = leaderstats:FindFirstChild("Deaths")
local Kills = leaderstats:FindFirstChild("Kills")
local Level = leaderstats:FindFirstChild("Level")
local XP = player:FindFirstChild("XP")
DataTable["leaderstats"] = {
["Deaths"] = Deaths.Value,
["Kills"] = Kills.Value,
["Level"] = Level.Value,
}
DataTable["XP"] = XP.Value
PlayerData:Save(player, DataTable)
end
--> Connections
Players.PlayerAdded:Connect(PlayerAdded)
Players.PlayerRemoving:Connect(PlayerRemoving)
Uncopylocked Game
Feedback
Reply below with any feedback, suggestions or errors!