That’s probably because you didn’t connected it into the game:BindToClose() function which will run everytime the Server is about to close. It’s always good to use this since it will save the Data of all Players whenever the Server closes. Add this code below at the end of your Script - This should take care of it.
Another thing that you can do is try using ProfileService - A powerful module for Saving, Managing and Updating Data, It is currently the best Module for Data Saving so far and i really recommend you using it.
game:BindToClose(function()
-- Always run this on a pcall in-case some Internal error
-- or whatever else happens
pcall(function()
for Index, Player in pairs(game:GetService("Players"):GetPlayers()) do
if Index and Player then
local success, errormessage = pcall(function()
Datastore:SetAsync("time-"..player.UserId,player.leaderstats.Time.Value)
Datastore:SetAsync("rebirths-"..player.UserId,player.leaderstats.Rebirths.Value)
end)
end
end
end)
end)
local Datastore = game:GetService("DataStoreService"):GetDataStore("PlayerSave3")
game.Players.PlayerAdded:Connect(function(player)
local leaderstats = Instance.new("Folder")
leaderstats.Name = "leaderstats"
leaderstats.Parent = player
local time = Instance.new("NumberValue")
time.Name = "Time"
time.Parent = leaderstats
local rebirths = Instance.new("IntValue")
rebirths.Name = "Rebirths"
rebirths.Parent = leaderstats
local dataFolder = Instance.new("Folder")
dataFolder.Name = player.Name
dataFolder.Parent = serverStorage.RemoteData
local timeData, rebirthsData
local success,errormessage = pcall(function()
timeData = Datastore:GetAsync("time-"..player.UserId)
rebirthsData = Datastore:GetAsync("rebirths-"..player.UserId)
end)
if success then
if timeData then
time.Value = timeData
rebirths.Value = rebirthsData
end
end
end)
game.Players.PlayerRemoving:Connect(function(player)
local success, errormessage = pcall(function()
Datastore:SetAsync("time-"..player.UserId,player.leaderstats.Time.Value)
Datastore:SetAsync("rebirths-"..player.UserId,player.leaderstats.Rebirths.Value)
end)
end)
game:BindToClose(function()
-- Always run this on a pcall in-case some Internal error
-- or whatever else happens
pcall(function()
for Index, Player in pairs(game:GetService("Players"):GetPlayers()) do
if Index and Player then
local success, errormessage = pcall(function()
Datastore:SetAsync("time-"..player.UserId,player.leaderstats.Time.Value)
Datastore:SetAsync("rebirths-"..player.UserId,player.leaderstats.Rebirths.Value)
end)
end
end
end)
end)
local Players = game:GetService("Players")
local DataStoreService = game:GetService("DataStoreService")
local SaveDataStore = DataStoreService:GetDataStore("PlayerSave3")
local function SavePlayerData(player)
local success,errormsg = pcall(function()
local SaveData = {}
for i,stats in pairs(player.leaderstats:GetChildren()) do
SaveData[stats.Name] = stats.Value
end
SaveDataStore:SetAsync(player.UserId,SaveData)
end)
if not success then
return errormsg
end
end
Players.PlayerAdded:Connect(function(player)
local Stats = Instance.new("Folder")
Stats.Name = "leaderstats"
Stats.Parent = player
local time = Instance.new("IntValue")
time.Name = "Time"
time.Parent = leaderstats
local rebirths = Instance.new("IntValue")
rebirths.Name = "Rebirths"
rebirths.Parent = leaderstats
local Data = SaveDataStore:GetAsync(player.UserId)
if Data then
print("✅")
for i,stats in pairs(Stats:GetChildren()) do
stats.Value = Data[stats.Name]
end
else
print("❌")
end
end)
Players.PlayerRemoving:Connect(function(player)
local errormsg = SavePlayerData(player)
print("Saved")
if errormsg then
warn(errormsg)
end
end)
game:BindToClose(function()
for i,player in pairs(Players:GetPlayers()) do
local errormsg = SavePlayerData(player)
if errormsg then
warn(errormsg)
end
end
wait(2)
end)
I got a script that I could share it with you if you want to look at it and change the values
local DSS = game:GetService("DataStoreService")
local DataStore = DSS:GetDataStore("DataStore")
game.Players.PlayerAdded:Connect(function(player)
--[[
Leaderstats
- Parent Folder for stats
]]
local leaderstats = Instance.new("Folder")
leaderstats.Name = "leaderstats"
leaderstats.Parent = player
--[[
Coins
]]
local Coins = Instance.new("IntValue")
Coins.Name = "Coins" -- used for general buildings, in shops etc.
Coins.Value = 0
Coins.Parent = leaderstats
--[[
Aether
]]
local Aether = Instance.new("IntValue")
Aether.Name = "Aether" -- used for battles and specific buildings
Aether.Value = 0
Aether.Parent = leaderstats
local Gems = Instance.new("IntValue")
Gems.Name = "Gems" -- used to speed-up work and to buy special items
Gems.Value = 0
Gems.Parent = leaderstats
local data
local success, errorMessage = pcall(function()
data = DataStore:GetAsync(player.UserId)
end)
if success and data ~= nil then -- CHANGE HERE COINS/AETHER/GEMS
print("Data successfully loaded!")
Coins.Value = data.Coins
Aether.Value = data.Aether
Gems.Value = data.Gems
else
warn(errorMessage)
end
end)
game.Players.PlayerRemoving:Connect(function(player) -- CHANGE HERE COINS/AETHER/GEMS
local leaderstats = player.leaderstats
local data = {
Coins = leaderstats.Coins.Value;
Aether = leaderstats.Aether.Value;
Gems = leaderstats.Gems.Value;
}
local success, errorMessage = pcall(function()
DataStore:SetAsync(player.UserId,data)
end)
if success then
print("Data successfully saved!")
else
warn(errorMessage)
end
end)
Please ignore the random comments in my script, I used those for references. In this case you got Coins, Aether and Gems. Change those to whatever you want (both at the start of the code where they’re first introduced and later, when used for DataStore
Edit: Also, to remove any possible bugs related to how they’re written, Always use uppercase on first letter of your currency (coins → Coins)
I have tried doing a very new version of your Code and i hopefully fixed alot of errors and made it more readable. It should work now, Let me know if it works.
-- Services
local DataStoreService = game:GetService("DataStoreService")
local ServerStorage = game:GetService("ServerStorage")
local Players = game:GetService("Players")
-- DataStore
local PlayerSaveDataStore = DataStoreService:GetDataStore("PlayerSave3")
-- Local Functions
local function LoadData(Player)
local Leaderstats = Instance.new("Folder")
Leaderstats.Name = "leaderstats"
Leaderstats.Parent = Player
local Time = Instance.new("IntValue")
Time.Name = "Time"
Time.Parent = Leaderstats
local Rebirths = Instance.new("IntValue")
Rebirths.Name = "Rebirths"
Rebirths.Parent = Leaderstats
local DataFolder = Instance.new("Folder")
DataFolder.Name = Player.Name
DataFolder.Parent = ServerStorage:FindFirstChild("RemoteData") or warn("No RemoteData Folder was found inside ServerStorage")
local TimeData;
local RebirthData;
local Ok, Result = pcall(function()
TimeData = PlayerSaveDataStore:GetAsync("time-"..Player.UserId)
RebirthData = PlayerSaveDataStore:GetAsync("rebirths-"..Player.UserId)
end)
if Ok then
if TimeData ~= nil then
Time.Value = TimeData
end
if RebirthData ~= nil then
Rebirths.Value = RebirthData
end
else
-- An error happened;
-- If Player is in game we're gonna kick them and send a message with the error reason.
if Player then
pcall(function()
Player:Kick("\nAn unexpected error happened while trying to Load your Data.\nPlease, Wait a few moments and re-join the Game!")
end)
end
task.spawn(function()
return error(string.format("[DataStore]: An unexpected error happened while trying to Load %s's Data:\n%s", Player.Name, tostring(Result)), 3)
end)
end
end
local function SaveData(Player)
local Ok, Result = pcall(function()
PlayerSaveDataStore:SetAsync("time-"..Player.UserId, Player.leaderstats.Time.Value)
PlayerSaveDataStore:SetAsync("rebirths-"..Player.UserId, Player.leaderstats.Rebirths.Value)
end)
-- Save Data didn't work? Send an error message.
if not Ok then
task.spawn(function()
return error(string.format("[DataStore]: An unexpected error happened while trying to Save %s's Data:\n%s", Player.Name, tostring(Result)), 3)
end)
end
end
-- Events & Connections
local PlayerAddedConnection = Players.PlayerAdded:Connect(LoadData)
local PlayerRemovingConnection = Players.PlayerRemoving:Connect(SaveData)
-- BindToClose
game:BindToClose(function()
-- Save data to all Players
pcall(function()
for Index, Player in pairs(Players:GetPlayers()) do
if Index and Player then
pcall(SaveData, Player)
end
end
end)
end)
-- Run the LoadData function to all Players in-case they Joined before the Script ran
for Index, Player in pairs(Players:GetPlayers()) do
if Index and Player then
task.spawn(function()
pcall(LoadData, Player)
end)
end
end
local Players = game:GetService("Players")
local DataStoreService = game:GetService("DataStoreService")
local SaveDataStore = DataStoreService:GetDataStore("PlayerSave3")
local function SavePlayerData(player)
local success,errormsg = pcall(function()
local SaveData = {}
for i,stats in pairs(player.leaderstats:GetChildren()) do
SaveData[stats.Name] = stats.Value
end
SaveDataStore:SetAsync(player.UserId,SaveData)
end)
if not success then
return errormsg
end
end
Players.PlayerAdded:Connect(function(player)
local Stats = Instance.new("Folder")
Stats.Name = "leaderstats"
Stats.Parent = player
local statstime = Instance.new("IntValue")
statstime .Name = "Time"
statstime .Parent = leaderstats
local rebirths = Instance.new("IntValue")
rebirths.Name = "Rebirths"
rebirths.Parent = leaderstats
local Data = SaveDataStore:GetAsync(player.UserId)
if Data then
print("✅")
for i,stats in pairs(Stats:GetChildren()) do
stats.Value = Data[stats.Name]
end
else
print("❌")
end
end)
Players.PlayerRemoving:Connect(function(player)
local errormsg = SavePlayerData(player)
print("Saved")
if errormsg then
warn(errormsg)
end
end)
game:BindToClose(function()
for i,player in pairs(Players:GetPlayers()) do
local errormsg = SavePlayerData(player)
if errormsg then
warn(errormsg)
end
end
wait(2)
end)
``