The scripts that I have will be pretty long so bear with me (however, I will show you which section of the script is mainly important to this issue)
I am trying to make a data storage system in my module script. What I am trying to attempt is saving the players money, however, if I use a certain script, the game can't recognize the value of the money and I get an error message saying this: ServerScriptService.Components.Button:35: attempt to compare number <= nil (this error message applies to another module script btw)
The script below works fine for other things except for the money system: (look near the bottom of script)
local Players = game:GetService("Players") local DataStoreService = game:GetService("DataStoreService") local PlayerData = DataStoreService:GetDataStore("PlayerData") local function LeaderboardSetup(value) local leaderstats = Instance.new("Folder") leaderstats.Name = "leaderstats" local money = Instance.new("IntValue") money.Name = "Money" money.Value = value money.Parent = leaderstats return leaderstats end local function LoadData(player) local success, result = pcall(function() return PlayerData:GetAsync(player.UserId) end) if not success then warn(result) end return success, result end local function SaveData(player, data) local success, result = pcall(function() PlayerData:SetAsync(player.UserId, data) end) if not success then warn(result) end return success end local sessionData = {} local playerAdded = Instance.new("BindableEvent") local playerRemoving = Instance.new("BindableEvent") local PlayerManager = {} PlayerManager.PlayerAdded = playerAdded.Event PlayerManager.PlayerRemoving = playerRemoving.Event function PlayerManager.Start() for _, player in ipairs(Players:GetPlayers()) do coroutine.wrap(PlayerManager.OnPlayerAdded)(player) end Players.PlayerAdded:Connect(PlayerManager.OnPlayerAdded) Players.PlayerRemoving:Connect(PlayerManager.OnPlayerRemoving) game:BindToClose(PlayerManager.OnClose) end function PlayerManager.OnPlayerAdded(player) player.CharacterAdded:Connect(function(character) PlayerManager.OnCharacterAdded(player, character) end) local success, data = LoadData(player) sessionData[player.UserId] = success and data or { Money = 0, UnlockIds = {} } local leaderstats = LeaderboardSetup(PlayerManager.GetMoney(player)) leaderstats.Parent = player playerAdded:Fire(player) end function PlayerManager.OnCharacterAdded(player, character) local humanoid = character:FindFirstChild("Humanoid") if humanoid then humanoid.Died:Connect(function() wait(3) player:LoadCharacter() end) end end function PlayerManager.GetMoney(player) --vv HERES THE SCRIPT BEFORE THE CHANGE vv-- local leaderstats = player:FindFirstChild("leaderstats") if leaderstats then local money = leaderstats:FindFirstChild("Money") if money then return money.Value end end return 0 --^^ HERES THE SCRIPT BEFORE THE CHANGE ^^-- end function PlayerManager.SetMoney(player, value) if value then sessionData[player.UserId].Money = value local leaderstats = player:FindFirstChild("leaderstats") if leaderstats then local money = leaderstats:FindFirstChild("Money") if money then money.Value = value end end end end function PlayerManager.OnPlayerRemoving(player) SaveData(player, sessionData[player.UserId]) playerRemoving:Fire(player) end function PlayerManager.OnClose() for _, player in ipairs(Players:GetPlayers()) do PlayerManager.OnPlayerAdded(player) end end return PlayerManager
However, the script below breaks the money system and can't recognize it: (look near the bottom of script again)
local Players = game:GetService("Players") local DataStoreService = game:GetService("DataStoreService") local PlayerData = DataStoreService:GetDataStore("PlayerData") local function LeaderboardSetup(value) local leaderstats = Instance.new("Folder") leaderstats.Name = "leaderstats" local money = Instance.new("IntValue") money.Name = "Money" money.Value = value money.Parent = leaderstats return leaderstats end local function LoadData(player) local success, result = pcall(function() return PlayerData:GetAsync(player.UserId) end) if not success then warn(result) end return success, result end local function SaveData(player, data) local success, result = pcall(function() PlayerData:SetAsync(player.UserId, data) end) if not success then warn(result) end return success end local sessionData = {} local playerAdded = Instance.new("BindableEvent") local playerRemoving = Instance.new("BindableEvent") local PlayerManager = {} PlayerManager.PlayerAdded = playerAdded.Event PlayerManager.PlayerRemoving = playerRemoving.Event function PlayerManager.Start() for _, player in ipairs(Players:GetPlayers()) do coroutine.wrap(PlayerManager.OnPlayerAdded)(player) end Players.PlayerAdded:Connect(PlayerManager.OnPlayerAdded) Players.PlayerRemoving:Connect(PlayerManager.OnPlayerRemoving) game:BindToClose(PlayerManager.OnClose) end function PlayerManager.OnPlayerAdded(player) player.CharacterAdded:Connect(function(character) PlayerManager.OnCharacterAdded(player, character) end) local success, data = LoadData(player) sessionData[player.UserId] = success and data or { Money = 0, UnlockIds = {} } local leaderstats = LeaderboardSetup(PlayerManager.GetMoney(player)) leaderstats.Parent = player playerAdded:Fire(player) end function PlayerManager.OnCharacterAdded(player, character) local humanoid = character:FindFirstChild("Humanoid") if humanoid then humanoid.Died:Connect(function() wait(3) player:LoadCharacter() end) end end function PlayerManager.GetMoney(player) --vv HERES THE SCRIPT THAT CHANGES AND BREAKS THE MONEY SYSTEM vv-- return sessionData[player.UserId].Money --^^HERES THE SCRIPT THAT CHANGES AND BREAKS THE MONEY SYSTEM^^-- end function PlayerManager.SetMoney(player, value) if value then sessionData[player.UserId].Money = value local leaderstats = player:FindFirstChild("leaderstats") if leaderstats then local money = leaderstats:FindFirstChild("Money") if money then money.Value = value end end end end function PlayerManager.OnPlayerRemoving(player) SaveData(player, sessionData[player.UserId]) playerRemoving:Fire(player) end function PlayerManager.OnClose() for _, player in ipairs(Players:GetPlayers()) do PlayerManager.OnPlayerAdded(player) end end return PlayerManager
I'm really sorry if this is hard to follow through without much context, but any help would be extremely appreciated!
Sorry guys, I've figured it out. Just decided to work for some reason haha