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