I tried everything, even turning on API, but my stats won’t save. How do I fix this?
This is a regular script in ServerScriptService named “Save”
local ds = game:GetService("DataStoreService"):GetDataStore("SaveData")
game.Players.PlayerAdded:Connect(function(plr)
wait()
local plrkey = "id_"..plr.UserId
local saves = plr.leaderstats.Money
local Save = ds:SetAsync(plrkey)
if Save then
saves.Value = Save[1]
else
local numbersave = {saves.Value}
ds:SetAsync(plrkey, numbersave)
end
end)
game.Players.PlayerRemoving:Connect(function(plr)
ds:SetAsync("id_"..plr.UserId, {plr.leaderstats.Money.Value})
end)
local ds = game:GetService("DataStoreService"):GetDataStore("SaveData")
game.Players.PlayerAdded:Connect(function(plr)
wait()
local plrkey = "id_"..plr.UserId
local saves = plr.leaderstats.Money
local Save = ds:GetAsync(plrkey)
if Save then
saves.Value = Save[1]
else
local numbersave = {saves.Value}
ds:GetAsync(plrkey, numbersave)
end
end)
game.Players.PlayerRemoving:Connect(function(plr)
ds:SetAsync("id_"..plr.UserId, {plr.leaderstats.Money.Value})
end)
Ohh okay. But when player is removed, it writes to datastore, right?
Here’s what I have now:
local ds = game:GetService("DataStoreService"):GetDataStore("SaveData")
game.Players.PlayerAdded:Connect(function(plr)
wait()
local plrkey = "id_"..plr.UserId
local saves = plr.leaderstats.Money
local Save = ds:GetAsync(plrkey)
if Save then
saves.Value = Save[1]
else
local numbersave = {saves.Value}
ds:SetAsync(plrkey, numbersave)
end
end)
game.Players.PlayerRemoving:Connect(function(plr)
ds:SetAsync("id_"..plr.UserId, {plr.leaderstats.Money.Value})
end)
Yes, that looks correct now.
Once more thing to note, if your testing this in studio then sometimes it fails to catch the PlayerRemoving before the test has shut down, so you could also add a BindToClose to make sure the data is saved before it’s shut down.
game:BindToClose(function() for _, plr in pairs(game.Players:GetPlayers()) do ds:SetAsync("id_"..plr.UserId, {plr.leaderstats.Money.Value}) end end)
so your full script:
local ds = game:GetService("DataStoreService"):GetDataStore("SaveData")
game.Players.PlayerAdded:Connect(function(plr)
wait()
local plrkey = "id_"..plr.UserId
local saves = plr.leaderstats.Money
local Save = ds:GetAsync(plrkey)
if Save then
saves.Value = Save[1]
else
local numbersave = {saves.Value}
ds:SetAsync(plrkey, numbersave)
end
end)
game.Players.PlayerRemoving:Connect(function(plr)
ds:SetAsync("id_"..plr.UserId, {plr.leaderstats.Money.Value})
end)
game:BindToClose(function() for _, plr in pairs(game.Players:GetPlayers()) do ds:SetAsync("id_"..plr.UserId, {plr.leaderstats.Money.Value}) end end)
local ds = game:GetService("DataStoreService"):GetDataStore("SaveData")
game.Players.PlayerAdded:Connect(function(plr)
wait()
local plrkey = "id_"..plr.UserId
local saves = plr.leaderstats.Money
local Save = ds:GetAsync(plrkey)
if Save then
saves.Value = Save[1]
else
local numbersave = {saves.Value}
ds:SetAsync(plrkey, numbersave)
end
end)
game:BindToClose(function() for _, plr in pairs(Players:GetPlayers())
do ds:SetAsync("id_"..plr.UserId, {plr.leaderstats.Money.Value}) end
end)
local DataStore = game:GetService("DataStoreService"):GetDataStore("SaveData")
game.Players.PlayerAdded:Connect(function(plr)
wait()
local plrid = "id_"..plr.UserId
local saveMoney = plr.leaderstats.Money
local GetSaved = DataStore:GetAsync(plrid)
if GetSaved then
saveMoney.Value = GetSaved[2]
else
local NumberForSaving = {saveMoney.Value}
DataStore:GetAsync(plrid, NumberForSaving)
end
end)
game.Players.PlayerRemoving:Connect(function(plr)
DataStore:SetAsync("id_"..plr.UserId, {plr.leaderstats.Money.Value})
end)
I just checked your code and run it here and it saved as it should.
That error is just because the SetAsync was called more than once to quickly for the same player (caused by the BindToClose) so that’s nothing to worry about for now.
local ds = game:GetService("DataStoreService"):GetDataStore("SaveData")
game.Players.PlayerAdded:Connect(function(plr)
wait()
local plrkey = "id_"..plr.UserId
local saves = plr.leaderstats.Money
local Save = ds:GetAsync(plrkey)
if Save then
saves.Value = Save[1]
else
local numbersave = {saves.Value}
ds:SetAsync(plrkey, numbersave)
end
end)
game.Players.PlayerRemoving:Connect(function(plr)
ds:SetAsync("id_"..plr.UserId, {plr.leaderstats.Money.Value})
end)
game:BindToClose(function() for _, plr in pairs(game.Players:GetPlayers()) do ds:SetAsync("id_"..plr.UserId, {plr.leaderstats.Money.Value}) end end)
See my previous post above.
If you have another PlayerAdded event connected elsewhere to set up the leaderstats folder for the player then it could be causing an issue. It’s best to do it all in the same event.