Tables are not saving

  1. What do you want to achieve Lets say i have a shop, a player buys a tool from shop. I want that tool to be saved in a folder

  2. What is the issue? It is not saving, no warnings or errors

  3. What solutions have you tried so far? Tried to look at everything, still cant find a solution

--Server script
local remotecon = require(game.ServerScriptService.remotescript)


local buytool = game.ReplicatedStorage.Remotes.buytool -- wherever the remote event is

local toolactivated = game.ReplicatedStorage.Remotes.activatetool
local sell = require(game.ServerScriptService.sell)

buytool.OnServerInvoke = function(player, toolName, status)
	local something = remotecon.buy(player,toolName, status)
	return something
end

game.ReplicatedStorage.Remotes.strength.OnServerInvoke = function(plr , toolName)
	plr.leaderstats.Strength.Changed:Connect(function(value)
		math.clamp(plr.leaderstats.Strngth.Value , 0 , plr.Storage.Value)
	end)
end

local buyst = game.ReplicatedStorage.Remotes.buyst -- wherever the remote event is

buyst.OnServerInvoke = function(player, storagen, status)
	local something = remotecon.buyst(player,storagen, status)
	return something
end

local buycl = game.ReplicatedStorage.Remotes.buycl -- wherever the remote event is

buycl.OnServerInvoke = function(player, classname, status)
	local something = remotecon.buycl(player,classname, status)
	return something
end

toolactivated.OnServerEvent:Connect(function(player)
	remotecon.toolactive(player)
end) 

local httpService = game:GetService('HttpService')
local dss = game:GetService("DataStoreService")
local ds = dss:GetDataStore("datamaSnef")
local players = game:GetService("Players")

local loadedPlayers = {}

players.PlayerAdded:Connect(function(player)
	local data = ds:GetAsync(player.UserId)
	
	if data  then
		data = httpService:JSONDecode(data)
		local tooldata = nil
		for key,value in pairs(data) do
			pcall(function()
				player.leaderstats[key].Value = value
				tooldata = ds:GetAsync(player.UserId.."ownedtools")
				tooldata = httpService:JSONDecode(tooldata)

			end)
		end
		for _,toolname in pairs(tooldata) do
			local val = Instance.new("StringValue")
			val.Name = toolname
			val.Parent = player.Ownedtools
		end
		
	end
	table.insert(loadedPlayers,player)
end)

players.PlayerRemoving:Connect(function(player)
	
	
	local found = table.find(loadedPlayers,player)
	if found then
		table.remove(loadedPlayers,found)
		local saveData = {}
		local ownedtools = {}
		for _,value in pairs(player.leaderstats:GetChildren()) do
			saveData[value.Name] = value.Value
		end
		for i,v in pairs(player.Ownedtools:GetChildren()) do
			local val = Instance.new("StringValue")
			val.Name = v.Name
			val.Parent = player.Ownedtools
			table.insert(ownedtools,val)
			
			print("saved")
		
		end
		local function attemptSave(i)
			i = i or 0
			i+=1
			if not pcall(function()
					ds:SetAsync(player.UserId,httpService:JSONEncode(saveData))
					ds:SetAsync(player.UserId.."ownedtools",httpService:JSONEncode(ownedtools))
				end) then
				if i <= 10 then
					task.wait(1)
					attemptSave()
				end
			end
		end
		attemptSave()
	end
end)

please help me ASAP , thank you.

please help me , i cant find a solution. :frowning:

Try using UpdateAsync instead of SetAsync

i solved it by using this code

local save = {}

local dss = game:GetService("DataStoreService")
local ds = dss:GetDataStore("datamaSnef")
local players = game:GetService("Players")



function save.playeraddede(player)

	local coindata
	pcall(function()
		coindata = ds:GetAsync(player.UserId.."Coins")
	end)
	if coindata ~= nil then
		player.leaderstats.Coins.Value = coindata 
	end

	local strndata
	local stdata
	local equippedst
	local equippped 
	local cl
	local equippedcl


	local ownedstr = ds:GetAsync(player.UserId.."Ownedst") or {}
	local ownedtools = ds:GetAsync(player.UserId.."Ownedtools") or {}
	local ownedcl = ds:GetAsync(player.UserId.."Ownedcl") or {}
	pcall(function()

		print("BOBOUX")


		strndata = ds:GetAsync(player.UserId.."Strength")
		stdata = ds:GetAsync(player.UserId.."Storage")
		equippedst = ds:GetAsync(player.UserId.."Equippedst")
		equippped = ds:GetAsync(player.UserId.."Equipped")
		cl = ds:GetAsync(player.UserId.."Class")
		equippedcl = ds:GetAsync(player.UserId.."Equippedcl")

	end)
	if strndata ~= nil then
		player.leaderstats.Strength.Value = strndata 

	end

	if cl ~= nil then
		player.leaderstats.Class.Value = cl 

	end


	if stdata ~= nil then
		player.Storage.Value = stdata 

	end

	if equippedst ~= nil then
		player.Equippedst.Value = equippedst 

	end


	if equippped ~= nil then
		player.Equipped.Value = equippped 

	end


	if cl ~= nil then
		player.EquippedCl.Value = cl

	end



	for i,v in pairs(ownedstr) do
		local val = Instance.new("StringValue", player.Ownedst)
		val.Name = v
	end


	for i,v in pairs(ownedtools) do
		local val = Instance.new("StringValue", player.Ownedtools)
		val.Name = v
	end


	for i,v in pairs(ownedcl) do
		local val = Instance.new("StringValue", player.Ownedcl)
		val.Name = v
	end


	local toolinplayer = game.ReplicatedStorage.Shared.Tools:FindFirstChild(equippped):Clone()
	toolinplayer.Parent = player.Backpack



	local gemdata
	pcall(function()
		gemdata = ds:GetAsync(player.UserId.."Gems")
	end)
	if gemdata ~= nil then
		player.leaderstats.Gems.Value = gemdata 
	end

end

for _,player in pairs(players:GetPlayers()) do
	coroutine.wrap(save.playeraddede)(player)
end

players.PlayerAdded:Connect(save.playeraddede)

players.PlayerRemoving:Connect(function(plr)
	pcall(function()

		local ownedstr = {}
		local ownedtools = {}
		local ownedcl = {}

		for i,v in pairs(plr.Ownedst:GetChildren()) do
			table.insert(ownedstr,v.Name)
		end

		for i,v in pairs(plr.Ownedtools:GetChildren()) do
			table.insert(ownedtools,v.Name)
		end

		for i,v in pairs(plr.Ownedcl:GetChildren()) do
			table.insert(ownedcl,v.Name)
			print(ownedcl)
		end

		ds:SetAsync(plr.UserId.."Coins", plr.leaderstats.Coins.Value)
		ds:SetAsync(plr.UserId.."Strength", plr.leaderstats.Strength.Value)
		ds:SetAsync(plr.UserId.."Gems", plr.leaderstats.Gems.Value)
		ds:SetAsync(plr.UserId.."Equippedst" ,plr.Equippedst.Value)
		ds:SetAsync(plr.UserId.."Class", plr.leaderstats.Class.Value)
		ds:SetAsync(plr.UserId.."Storage",plr.Storage.Value)
		ds:SetAsync(plr.UserId.."Equippedcl",plr.Equippedcl.Value)
		ds:SetAsync(plr.UserId.."Ownedst",ownedstr)
		ds:SetAsync(plr.UserId.."Ownedtools",ownedtools)
		ds:SetAsync(plr.UserId.."Ownedcl",ownedcl)

		ds:SetAsync(plr.UserId.."Equipped" ,plr.Equipped.Value)

	end)

end)

game:BindToClose(function(plr)
	wait(2)
	pcall(function()

		local ownedstr = {}
		local ownedtools = {}
		local ownedcl = {}

		for i,v in pairs(plr.Ownedst:GetChildren()) do
			table.insert(ownedstr,v.Name)
		end

		for i,v in pairs(plr.Ownedtools:GetChildren()) do
			table.insert(ownedtools,v.Name)
		end

		for i,v in pairs(plr.Ownedcl:GetChildren()) do
			table.insert(ownedcl,v.Name)
			print(ownedcl)
		end

		ds:SetAsync(plr.UserId.."Coins", plr.leaderstats.Coins.Value)
		ds:SetAsync(plr.UserId.."Strength", plr.leaderstats.Strength.Value)
		ds:SetAsync(plr.UserId.."Gems", plr.leaderstats.Gems.Value)
		ds:SetAsync(plr.UserId.."Equippedst" ,plr.Equippedst.Value)
		ds:SetAsync(plr.UserId.."Class", plr.leaderstats.Class.Value)
		ds:SetAsync(plr.UserId.."Storage",plr.Storage.Value)
		ds:SetAsync(plr.UserId.."Equippedcl",plr.Equippedcl.Value)
		ds:SetAsync(plr.UserId.."Ownedst",ownedstr)
		ds:SetAsync(plr.UserId.."Ownedtools",ownedtools)
		ds:SetAsync(plr.UserId.."Ownedcl",ownedcl)

		ds:SetAsync(plr.UserId.."Equipped" ,plr.Equipped.Value)

	end)
end)
return save
1 Like