I'm having trouble trying to figure out why the saving function in my datastore script isn't working. The script is a normal script object located in ServerScriptService. I can edit my stats manually when testing, but when save functions are carried out, the return values are the ones that are already saved and apparently just get saved again despite being changed. My code is as follows:






local DataStoreService = game:GetService("DataStoreService")
local StatStore = DataStoreService:GetDataStore("StatData")



local function saveData(player)
	local dataTable = {
		player.stats.Cash.Value;
		player.stats.Level.Value;
		player.stats.XP.Value
	}
	
	for i,v in pairs(dataTable) do
		print(i .. "index current value set to: " .. v)
	end
	
	local success, err = pcall(function()
		StatStore:SetAsync(player.UserId, dataTable)
		for i,v in pairs(dataTable) do
			print(i .. "index value now set to: " .. v)
		end
	end)
	
	if success then
		print("Data was saved!")
	else
		print("Data was not saved!")
		warn(err)
	end
end

--[[manual save function
game.Workspace.SavePart.Touched:Connect(function(player1)
	local player = game:GetService("Players"):GetPlayerFromCharacter(player1.Parent)
	saveData(player)
end)
]]


game.Players.PlayerAdded:Connect(function (player)
	local leaderstats = Instance.new("Folder")
	leaderstats.Name = "stats"
	leaderstats.Parent = player
	
	local cash = Instance.new("IntValue")
	cash.Name = "Cash"
	cash.Parent = leaderstats
	
	local level = Instance.new("IntValue")
	level.Name = "Level"
	level.Parent = leaderstats
	
	local xp = Instance.new("IntValue")
	xp.Name = "XP"
	xp.Parent = leaderstats
	
	
	local data
	local success, err = pcall(function()
		data = StatStore:GetAsync(player.UserId)
	end)
	
	if success and data then
		print("Player has saved data! " .. data[1] .. "dollars, " .. data[2] .. " levels, and " .. data[3] .. " XP.")
		cash.Value = data[1]
		level.Value = data[2]
		xp.Value = data[3]
	else
		print("Player has no saved data.")
	end
end)




game.Players.PlayerRemoving:Connect(function(player) --save on leave
	local success, err = pcall(function()
		saveData(player)
	end)
	if success then
		print("Data has been saved upon player leaving.") --this prints but no actual data changes
	else
		print("Data was NOT saved upon player leaving.")
	end
end)



game:BindToClose(function() --crash save
	for _, player in pairs(game.Players:GetPlayers()) do
		local success, err  = pcall(function()
			saveData(player)
		end)

		if success then
			print("Data has been saved upon shutdown!")
		else
			print("Data has not been saved upon shutdown!")
		end
	end
end)