these are my data store scripts: Leaderstats:
game.StarterGui.ResetPlayerGuiOnSpawn = false
local DataStoreService = game:GetService("DataStoreService")
local playerData = DataStoreService:GetDataStore("PlayerData")
game.Players.PlayerAdded:connect(function(Player)
local leaderstats = Instance.new("Folder", Player)
leaderstats.Name = "leaderstats"
local val1 = Instance.new("StringValue",Player)
val1.Name = 'GotPet'
val1.Value = ''
local val2 = Instance.new("StringValue",Player)
val2.Name = 'OpenValue'
val2.Value = ''
local Gems = Instance.new("IntValue", leaderstats)
Gems.Name = "Gems"
Gems.Value = 0
local Rebirths = Instance.new("IntValue", leaderstats)
Rebirths.Name = "Rebirths"
Rebirths.Value = 0
local Coins = Instance.new("IntValue", leaderstats)
Coins.Name = "Coins"
Coins.Value = 0
local playerUserId = "Player_" .. Player.UserId --Gets player ID
local Success, Result = pcall(function()
return playerData:GetAsync(playerUserId)
end)
if Result then
print("Data found!")
Coins.Value = Result[1] -- // Since in the saving part, Coins are the one that is set as the first value of the table, we set Coins as [1]
Rebirths.Value = Result[2]
Gems.Value = Result[3]
else
print("DataStore working but No data found")
warn(Result)
end
end)
local function onPlayerExit(player) --Runs when players exit
local success, Err = pcall(function()
print("Data Saved successfully")
local playerUserId = "Player_" .. player.UserId
playerData:SetAsync(playerUserId, {player.leaderstats.Coins.Value, player.leaderstats.Rebirths.Value, player.leaderstats.Gems.Value}) -- Now set as a table instead of individually
end)
if not success then
warn(Err)
warn('Could not save data!')
end
end
game.Players.PlayerRemoving:Connect(onPlayerExit)
here is the Pet datastore:
local Players = game:GetService("Players")
local DS = game:GetService("DataStoreService"):GetDataStore("PetsSave")
local SaveOnChange = true
local Cooldown = 0
local function Thread(f)
coroutine.resume(coroutine.create(f))
end
local Array = {
["Stats"] = {
},
["PlayerValues"] = {
},
["Pets"] = {
['CurrentPet'] = '',
["Orange puppy"] = 'unowned',
["Dequinious"] = 'unowned',
["Gerreard"] = 'unowned',
["Amazing Pet"] = 'unowned',
["Uncommon Pet"] = 'unowned',
["Rare Pet"] = 'unowned',
["Unobtainable Pet"] = 'unowned',
["Lollie"] = 'unowned',
["Dog"] = 'unowned',
["Panda"] = 'unowned',
["Bunny"] = 'unowned',
["Cat"] = 'owned',
}
}
Players.PlayerAdded:connect(function(plr)
for i,v in pairs(Array.PlayerValues) do
local x
if type(v) == "number" then
x = Instance.new("NumberValue", plr)
x.Name = tostring(i)
x.Value = v
elseif type(v)=="string" then
x=Instance.new("StringValue",plr)
x.Name=tostring(i)
x.Value=v
elseif type(v)=="boolean" then
x=Instance.new("BoolValue",plr)
x.Name=tostring(i) x.Value=v
end
end
local ID = plr.userId
if DS:GetAsync("User_"..tostring(ID)) == nil then
print("Player "..plr.Name.."("..tostring(ID)..") has no data file, creating a new data file.")
local NewData=DS:SetAsync("User_"..tostring(ID),Array)
end
local Data = DS:GetAsync("User_"..tostring(ID))
repeat wait() until Data ~= nil
print("User_"..tostring(ID).." Data Loading...")
--Create leaderstats
local Stats = Instance.new("IntValue",plr)
Stats.Name = "leaderstats"
--Create Pets
local Pets = Instance.new("Configuration",plr)
Pets.Name = "Pets"
Thread(function()
for i,v in pairs(Array.Stats) do
local x
if type(v) == "number" then
x = Instance.new("NumberValue",Stats)
x.Name = tostring(i)
x.Value = Data.Stats[i] or v
elseif type(v) == "string" then
x = Instance.new("StringValue",Stats)
x.Name = tostring(i)
x.Value = Data.Stats[i] or v
elseif type(v) == "boolean" then
x = Instance.new("BoolValue",Stats)
x.Name = tostring(i)
x.Value = Data.Stats[i] or v
end
if x == nil or x["Value"] == nil or SaveOnChange == false then
return
end
local Deb = false
x.Changed:connect(function(val)
Deb=true
local NewArray = {["Stats"]={};["Pets"]={}}
Thread(function()
for i,v in pairs(plr:WaitForChild("leaderstats"):GetChildren()) do
NewArray.Stats[v.Name] = v.Value
end
end)
for i,v in pairs(plr:WaitForChild("Pets"):GetChildren()) do
NewArray.Pets[v.Name]=v.Value
end
DS:UpdateAsync("User_"..tostring(ID), function(OldVal)
local NewVal=NewArray or OldVal
return NewVal
end)
wait(Cooldown)
Deb=false
end)
end
end)
for i,v in pairs(Array.Pets) do
local x
if type(v) == "number" then
x = Instance.new("NumberValue", Pets)
x.Name = tostring(i)
x.Value = Data.Pets[i] or v
elseif type(v)=="string" then
x=Instance.new("StringValue",Pets)
x.Name=tostring(i)
x.Value=Data.Pets[i] or v
elseif type(v)=="boolean" then
x=Instance.new("BoolValue",Pets)
x.Name=tostring(i) x.Value=Data.Pets[i] or v
end
if x==nil or x["Value"]==nil or SaveOnChange==false then
return
end
local Deb=false
x.Changed:connect(function(val)
Deb=true
local NewArray={["Stats"]={};["Pets"]={}}
Thread(function()
for i,v in pairs(plr:WaitForChild("leaderstats"):GetChildren()) do
NewArray.Stats[v.Name] = v.Value
end
end)
for i,v in pairs(plr:WaitForChild("Pets"):GetChildren()) do
NewArray.Pets[v.Name]=v.Value
end
DS:UpdateAsync("User_"..tostring(ID),function(OldVal)
local NewVal = NewArray or OldVal
return NewVal
end)
wait(Cooldown)
Deb=false
end)
end
print(plr.Name.."("..tostring(ID)..")'s Data is ready.")
end)
Players.PlayerRemoving:connect(function(plr)
local ID=plr.userId
local Data=DS:GetAsync("User_"..tostring(ID))
if Data==nil then
return
end
local NewArray={["Stats"]={};["Pets"]={}}
Thread(function()
for i,v in pairs(plr:WaitForChild("leaderstats"):GetChildren()) do
NewArray.Stats[v.Name]=v.Value
end
end)
for i,v in pairs(plr:WaitForChild("Pets"):GetChildren()) do
NewArray.Pets[v.Name]=v.Value
end
DS:UpdateAsync("User_"..tostring(ID), function(OldVal)
local NewVal = NewArray or OldVal
return NewVal
end)
end)
local function SaveAll()
for _,v in ipairs(Players:GetPlayers()) do
Thread(function()
local ID = v.userId
local Data = DS:GetAsync("User_"..tostring(ID))
if Data ~= nil then
local NewArray = {["Stats"] = {}; ["Pets"] = {}}
Thread(function()
for _,v2 in pairs(v:WaitForChild("leaderstats"):GetChildren()) do
NewArray.Stats[v2.Name] = v2.Value
end
end)
for _,v2 in pairs(v:WaitForChild("Pets"):GetChildren()) do
NewArray.Pets[v2.Name] = v2.Value
end
DS:UpdateAsync("User_"..tostring(ID), function(OldVal)
local NewVal=NewArray or OldVal
return NewVal
end)
end
end)
end
end
game:BindToClose(function()
SaveAll()
end)
