Datasaving broken?

image

Similar issue to this but instead with player.userID

Woops sorry I forgot to paste the data saving code:

local PlayerStatManager = {}
-- Data stores cannot be affected by localscripts
-- You MUST use this module in a script

local DataStoreService = game:GetService("DataStoreService")
local playerData = DataStoreService:GetDataStore("PlayerData")

-- Table to hold player information for the current session
-- you dont have to continue using datastoreservice to get saved data
local sessionData = {}

local AUTOSAVE_INTERVAL = 60

local function getDefaultData()
	return {
		Money = 10,
		Win = 0
	}	
end

-- Function that creates a leaderboard with Money and Experience
local function createLeaderboard(player)
	local leaderstats = Instance.new("Folder")
	leaderstats.Name = "leaderstats"
	leaderstats.Parent = player
	
	local money = Instance.new("IntValue")
	money.Name = "Money"
	money.Parent = leaderstats
	
	local win = Instance.new("NumberValue")
	win.Name = "Win"
	win.Parent = leaderstats

end

-- Function that updates the leaderboard when a player's stats are changed
local function updateLeaderboardValues(player)
	local playerUserId = "Player_" .. player.UserId
	
	local money = player.leaderstats.Money
	local win = player.leaderstats.Win
	
	if sessionData[playerUserId]["Money"]then
		money.Value = sessionData[playerUserId]["Money"]
	end
	
	if sessionData[playerUserId]["Win"]then
		win.Value = sessionData[playerUserId]["Win"]
	end
end


-- Function that other scripts can call to change a player's stats
function PlayerStatManager:ChangeStat(player, statName, value)
	local playerUserId = "Player_" .. player.UserId
	assert(typeof(sessionData[playerUserId][statName]) == typeof(value), "ChangeStat error: types do not match")

	sessionData[playerUserId][statName] = value
	updateLeaderboardValues(player)
end

-- Function that returns the stat associated with statName (no request sent)
function PlayerStatManager:GetStat(player, statName)
	local playerUserId = "Player_" .. player.UserId
	return sessionData[playerUserId][statName]
end

-- Function that other scripts can call to change a player's stats
function PlayerStatManager:IncrementStat(player, statName, value)
	local playerUserId = "Player_" .. player.UserId
	assert(typeof(value) == "number", "IncrementStat error: types do not match")
	assert(typeof(sessionData[playerUserId][statName]) == "number", "Increment error: type must be number")

	sessionData[playerUserId][statName] += value
	updateLeaderboardValues(player)
end

-- Function to delete all of a player's data
function PlayerStatManager:WipeData(player)
	local playerUserId = "Player_" .. player.UserId

	local success, err = pcall(function()
		playerData:RemoveAsync(playerUserId) -- Removes the given key from data store 
	end)
	sessionData[playerUserId] = getDefaultData()
	if not success then
		warn("WipeData error: failed to wipe player's data")
	end
	updateLeaderboardValues(player)
end

-- Function to add player to the "sessionData" table
local function setupPlayerData(player)
	createLeaderboard(player)

	local playerUserId = "Player_" .. player.UserId
	local success, data = pcall(function()
		return playerData:GetAsync(playerUserId) -- return any data saved based on the userid key
	end)	
	if success then
		if data then
			--Data exists for this player
			sessionData[playerUserId] = data
			-- Maybe check if new values are nil if you want to add data
		else
			-- Data store is working, but no current data for this player
			sessionData[playerUserId] = getDefaultData()
		end
		updateLeaderboardValues(player)
	else
		warn("Cannot access data store for player!")
	end
end

-- Function to save player's data
local function savePlayerData(playerUserId)
	--print(playerUserId .. "'s data saved"
	--print(sessionData[playerUserId])
	if sessionData[playerUserId] then
		local tries = 0 
		local success, err
		repeat
			tries = tries + 1
			success, err = pcall(function()
				playerData:UpdateAsync(playerUserId, function(oldValue)
					return sessionData[playerUserId]
				end)
			end)
			if not success then wait(2) end
		until tries == 3 or success
		if not success then
			warn("Cannot save data for player!")
		end
	end
end

-- Function to save player data on exit
local function saveOnExit(player)
	local playerUserId = "Player_" .. player.UserId
	savePlayerData(playerUserId)
end


-- Function to periodically save player data
local function autoSave()
	while wait(AUTOSAVE_INTERVAL) do
		for playerUserId, data in pairs(sessionData) do
			savePlayerData(playerUserId)
		end
	end
end


-- Start running "autoSave()" function in the background
spawn(autoSave)

-- Connect "SetupPlayerData()" function to "Playeradded" event
game.Players.PlayerAdded:Connect(setupPlayerData)

-- Connect "saveOnExit()" function to "PlayerRemoving" event
game.Players.PlayerRemoving:Connect(saveOnExit)

return PlayerStatManager

So basically using GetStat on Money returns nil, it doesnt exist?
but my wins work, I can’t add anything new to my leaderstats.

could this also be affecting my data requests?


while true do
	for _, player in pairs(Players:GetPlayers()) do
		local leaderstats = player:FindFirstChild("leaderstats")

		if not leaderstats then
			warn("Couldn't find leaderstats!")
			break
		end

		local statsValue = leaderstats:FindFirstChild(statsName)

		if not statsValue then
			warn("Couldn't find " .. statsName .. " in leaderstats!")
			break
		end

		pcall(function()
			DataStore:UpdateAsync(player.UserId, function()
				return tonumber(statsValue.Value)
			end)
		end)
	end

	for _, item in pairs(Contents.Items:GetChildren()) do
		if item:IsA("Frame") then
			item:Destroy()
		end
	end

	getItems()

	wait()
	Frame.Heading.Heading.Text = statsName .. " Leaderboard"
	Contents.GuideTopBar.Value.Text = statsName
	wait(updateEvery) -- 90 seconds
end

Without the data saving code, we really can’t fix anything. Op pasted in code

Generally this warning means that you are sending far to many data requests.