Data store not saving

local DataStoreService = game:GetService("DataStoreService")
local SaveData = DataStoreService:GetDataStore("SaveData")
local ToolFolder = game:GetService("ServerStorage"):FindFirstChild("SavedTools")
local Players = game:GetService("Players")

Players.PlayerAdded:Connect(function(Player)
	local ToolData = SaveData:GetAsync(Player.UserId)
	
	local Backpack = Player:WaitForChild("Backpack")
	local StarterGear = Player:WaitForChild("StarterGear")
	
	if ToolData then
		for i, v in pairs(ToolData) do
			if ToolFolder:FindFirstChild(v) and not Backpack:FindFirstChild(v) and not StarterGear:FindFirstChild(v) then
				ToolFolder[v]:Clone().Parent = Backpack
				ToolFolder[v]:Clone().Parent = StarterGear
			end
		end
	end
	
	Player.CharacterRemoving:Connect(function(Character)
		Character:WaitForChild("Humanoid"):UnequipTools()
	end)
end)

Players.PlayerRemoving:Connect(function(Player)
	local ToolTable
	
	for i,v in pairs(Player.Backpack:GetChildren()) do
        if not ToolTable then ToolTable = {} end
		table.insert(ToolTable, v.Name)
	end
	if ToolTable then
		SaveData:SetAsync(Player.UserId, ToolTable)
	end
end)

game:BindToClose(function()
   task.wait(2)
end)
1 Like

Okā€¦ thatā€™s odd I didnā€™t buy anything but I remembered a item I bought last time even though last time it didnā€™t save lol.

what do you mean? char limitation

Ok so it does save the items but if I didnā€™t have that small code there it wouldnā€™t save them

ye, this is because the script stops running cause the server no longer exists.
or something along the lines of this

1 Like

I recommend using pcall function when you loading data.

local ToolData

local success, errMsg = pcall(function()
    ToolData = SaveData:GetAsync(Player.UserId)
end)

if not success then
 player:Kick()
 warn(errMsg)
end

if success and ToolData then
-- next code
end
1 Like

yes, I was going to mention this but had a feeling this is what you were going to say

So like this?


local success, errMsg = pcall(function()
	ToolData = SaveData:GetAsync(Player.UserId)
end)

if not success then
	player:Kick()
	warn(errMsg)
end

if success and ToolData then
	local DataStoreService = game:GetService("DataStoreService")
	local SaveData = DataStoreService:GetDataStore("SaveData")
	local ToolFolder = game:GetService("ServerStorage"):FindFirstChild("SavedTools")
	local Players = game:GetService("Players")

	Players.PlayerAdded:Connect(function(Player)
		local ToolData = SaveData:GetAsync(Player.UserId)

		local Backpack = Player:WaitForChild("Backpack")
		local StarterGear = Player:WaitForChild("StarterGear")

		if ToolData then
			for i, v in pairs(ToolData) do
				if ToolFolder:FindFirstChild(v) and not Backpack:FindFirstChild(v) and not StarterGear:FindFirstChild(v) then
					ToolFolder[v]:Clone().Parent = Backpack
					ToolFolder[v]:Clone().Parent = StarterGear
				end
			end
		end

		Player.CharacterRemoving:Connect(function(Character)
			Character:WaitForChild("Humanoid"):UnequipTools()
		end)
	end)

	Players.PlayerRemoving:Connect(function(Player)
		local ToolTable

		for i,v in pairs(Player.Backpack:GetChildren()) do
			if not ToolTable then ToolTable = {} end
			table.insert(ToolTable, v.Name)
		end
		if ToolTable then
			SaveData:SetAsync(Player.UserId, ToolTable)
		end
	end)

	game:BindToClose(function()
		task.wait(2)
	end)
end

Also when you using SetAsync, I recommend pcall function.

Could you give me a example to a pcall function Iā€™m new thanks

local success, errMsg = pcall(function()
	ToolData = SaveData:GetAsync(Player.UserId)
end)

if not success then
	player:Kick("Error while loading data")
	warn(errMsg)
end

if success and ToolData then
	local DataStoreService = game:GetService("DataStoreService")
	local SaveData = DataStoreService:GetDataStore("SaveData")
	local ToolFolder = game:GetService("ServerStorage"):FindFirstChild("SavedTools")
	local Players = game:GetService("Players")

	Players.PlayerAdded:Connect(function(Player)
		local ToolData = SaveData:GetAsync(Player.UserId)

		local Backpack = Player:WaitForChild("Backpack")
		local StarterGear = Player:WaitForChild("StarterGear")

		if ToolData then
			for i, v in pairs(ToolData) do
				if ToolFolder:FindFirstChild(v) and not Backpack:FindFirstChild(v) and not StarterGear:FindFirstChild(v) then
					ToolFolder[v]:Clone().Parent = Backpack
					ToolFolder[v]:Clone().Parent = StarterGear
				end
			end
		end

		Player.CharacterRemoving:Connect(function(Character)
			Character:WaitForChild("Humanoid"):UnequipTools()
		end)
	end)

	Players.PlayerRemoving:Connect(function(Player)
		local ToolTable

		for i,v in pairs(Player.Backpack:GetChildren()) do
			if not ToolTable then ToolTable = {} end
			table.insert(ToolTable, v.Name)
		end
     local success, errMsg = pcall(function()
	     ToolData = SaveData:SetAsync(Player.UserId, ToolTable)
      end)
	end)

	game:BindToClose(function()
		task.wait(2)
	end)
end

Thatā€™s it I think

1 Like

Ok its broke againā€¦ I swear its the animations I go too change one and it breaks I thinkā€¦

And the output says

ServerScriptService.SaveTools:6: attempt to index nil with ā€˜Kickā€™

ooh try :kick lowercase. I made a typo :<

output says

ServerScriptService.SaveTools:6: attempt to index nil with ā€˜kickā€™

on line 6 which is

Player:kick(ā€œError while loading dataā€)

1 Like

what is parameter name of player?

parameter Sorry what is that is it a players name?

parameter is like

game.Players.PlayerAdded:Connect(function(player) -- this variable

end)

so try this

player:kick("Error while loading data")

Output: says:

ServerScriptService.SaveTools:6: attempt to index nil with ā€˜kickā€™

explorer