Here is the whole code which is in one script:
local DataStoreService = game:GetService("DataStoreService")
local Stats = DataStoreService:GetDataStore("Stats")
game.Players.PlayerAdded:connect(function(player)
-- get parts for system
local info = Instance.new("StringValue", game.Workspace.Player_Information)
info.Name = player.Name
-- set up other parts
Instance.new("StringValue",info).Name = "Inventory"
Instance.new("StringValue", info.Inventory).Name = "Gloves"
Instance.new("IntValue", info).Name = "Box_Bux"
Instance.new("StringValue", info).Name = "Wearing"
Instance.new("StringValue", info.Wearing).Name = "Gloves"
local can_save = Instance.new("BoolValue", info)
can_save.Name = "Can_Save"
can_save.Value = true
local stats = game.Lighting.Stats:Clone()
stats.Parent = info
-- load data table
local success, message = pcall(function()
stat_table = Stats:GetAsync(player.UserId)
end)
if success then
if stat_table ~= nil then
print(stat_table["Gloves_Inventory"])
print(stat_table["Fitness"])
stats.Strength.Value = stat_table.Strength
stats.Fitness.Value = stat_table.Fitness
stats.Endurance.Value = stat_table.Endurance
stats.Speed.Value = stat_table.Speed
if stat_table.Box_Bux ~= nil then
print("loaded properly")
info.Box_Bux.Value = stat_table.Box_Bux
-- load gloves in inventory
local gloves_in_inv = stat_table.Gloves_Inventory
local rounds = string.len(gloves_in_inv)/4
for i = 1, rounds do
Instance.new("StringValue", info.Inventory.Gloves).Name = string.sub(gloves_in_inv, 1 + ((i - 1)*4), 4 + ((i - 1)*4))
end
Instance.new("StringValue", info.Wearing.Gloves).Name = stat_table.Glove_Wearing
else
print("dis route")
info.Box_Bux.Value = 0
Instance.new("StringValue", info.Wearing.Gloves).Name = "G001"
Instance.new("StringValue", info.Inventory.Gloves).Name = "G001"
end
else
print("dis 1")
stats.Strength.Value = 0
stats.Fitness.Value = 0
stats.Endurance.Value = 0
stats.Speed.Value = 0
info.Box_Bux.Value = 0
Instance.new("StringValue", info.Wearing.Gloves).Name = "G001"
Instance.new("StringValue", info.Inventory.Gloves).Name = "G001"
end
else
can_save.Value = false
player:Kick("Your data hasn't loaded correctly, but you haven't lost any data! Please simply rejoin the game!")
end
end)
game.Players.PlayerRemoving:connect(function(player)
local player_folder = game.Workspace.Player_Information:FindFirstChild(player.Name)
if player_folder.Can_Save.Value == true then
print("saving")
-- strength
local strength = player_folder.Stats.Strength.Value
-- fitness
local fitness = player_folder.Stats.Fitness.Value
-- endurance
local endurance = player_folder.Stats.Endurance.Value
-- speed
local speed = player_folder.Stats.Speed.Value
-- gloves in inventory
local gloves_inv = player_folder.Inventory.Gloves:GetChildren()
local gloves_owned = {}
for i = 1, #gloves_inv do
gloves_owned[i] = gloves_inv[i].Name
end
-- gloves wearing
local gloves_wear = player_folder.Wearing.Gloves:GetChildren()
local gloves_wearing = {}
for i = 1, #gloves_inv do
gloves_wearing[i] = gloves_wear[i].Name
end
local data_table = {
["Strength"] = strength,
["Fitness"] = fitness,
["Endurance"] = endurance,
["Speed"] = speed,
["Gloves_Inventory"] = table.concat(gloves_owned, ""),
["Glove_Wearing"] = table.concat(gloves_wearing, ""),
["Box_Bux"] = player_folder.Box_Bux.Value
}
print(data_table["Gloves_Inventory"])
print(data_table["Fitness"])
Stats:SetAsync(player.UserId, data_table)
end
game.Workspace.Player_Information:FindFirstChild(player.Name):Remove()
end)
Essentially the code is saving player stats, and clothing etc which is all held in objects in the workspace in a player file. (a folder). I don't think there's anything wrong particularly with what I'm saving, It seems to be how it is saving. When I play the game it's so inconstant with saving, when I play on my own, and then leave, it just doesn't save at all. It saved in 2 player test mode however, so I'm not sure what the issue is. I also added in a script with the bind to close function and a wait of 10, however this appeared to change nothing. I'm not sure how to fix this as there are no errors, and people's data gets seemingly randomly reset.

5 comments
I have read a few other posts, and I'll attempt moving the script from workspace to ServerScriptService, and I'll try using bind to close again.
Do not use workspace / lighting for storage use server storage. 2nd Do not use Remove it is deprecated. 3rd do not kick the player if the data fails to load retry instead with a small delay.
Line 107 and 114 use #gloves_inv
ah! that was why it wasn't working at all! mustve been giving an error as the for loop was running too many or too few times. I will take your advice too, thank you very much, you have saved me hours of crying lol.
Yeah listen to Kingdom he helped write my Data Store, lets just say he is the Data Store master.