Hia.
Turns out you can’t store mixed tables in datastore
Put the tools in a table inside the data table to avoid that:
local store = game:GetService("DataStoreService")
local upg = store:GetDataStore('TestDatastore1')
function getData(player)
local data
local success,err = pcall(function()
data = upg:GetAsync(player.UserId)
end)
if success then
warn(player.Name..' Stats have loaded')
elseif err then
warn(err,'error has ocurred')
end
return data
end
function getSaveTable(player)
local stats = player:WaitForChild("leaderstats")
local stats2 = player:WaitForChild("secondaryData")
local Gold = stats.Gold
local Xp = stats2.Xp
local Xp_Max = stats2.Xp_Max
local Level = stats.Level
local save = {
["Gold"] = Gold.Value;
["Xp"] = Xp.Value;
["Xp_Max"] = Xp_Max.Value;
["Level"] = Level.Value;
["Tools"] = {}
}
for _, tool in pairs(player.Backpack:GetChildren()) do
if game.ServerStorage.Items.Tools:FindFirstChild(tool.Name) then
table.insert(save.Tools, tool.Name)
end
end
return save
end
function OnAdded(player)
local leaderstats = Instance.new("Folder", player)
leaderstats.Name = "leaderstats"
local secondaryData = Instance.new("Folder",player)
secondaryData.Name = "secondaryData"
local xp = Instance.new("IntValue",secondaryData)
xp.Name = "Xp"
local xp_max = Instance.new("IntValue",secondaryData)
xp_max.Name = "Xp_Max"
xp_max.Value = 100
local Gold = Instance.new("IntValue",leaderstats)
Gold.Name = "Gold"
Gold.Value = 1000
local level = Instance.new("IntValue",leaderstats)
level.Name = "Level"
level.Value = 1
local data = getData(player)
if data then
for i,v in pairs(data)do
print(i,v)
end
--getting the values from the table
xp.Value = data.Xp
xp_max.Value = data.Xp_Max
Gold.Value = data.Gold
level.Value = data.Level
for _,toolName in pairs(data.Tools) do
local tool = game.ServerStorage.Items.Tools:FindFirstChild(toolName)
if tool then
local newTool = tool:Clone()
newTool.Parent = player.Backpack
local newTool = tool:Clone()
newTool.Parent = player.StarterGear
end
end
end
end
function OnRemove(player)
local data = getSaveTable(player)
for i,v in pairs(data)do
print(i,v)
end
local success,err = pcall(function()
upg:SetAsync(player.UserId,data)
end)
if success then
warn(player.Name..' Stats have been saved')
elseif err then
warn(err)
end
end
game.Players.PlayerAdded:Connect(OnAdded)
game.Players.PlayerRemoving:Connect(OnRemove)
game:BindToClose(function()
for i,v in pairs(game.Players:GetPlayers()) do
OnRemove(v)
end
end)