Hello! I've recently been wondering how to properly use the DataStoreService for my leveling system. There are no script errors but whenever I test my game the script doesn't work. I have a gui that display's the players xp and level, but when testing my game the xp and level do not show up, the only thing that shows up is the two blank text labels. Also, the leaderstats do not show up either, it's just a leaderboard that states my username. I am wanting my script to be whenever the player achieves new levels and gains xp in game, whenever they join back later on their level and xp remain just as it was when they left and knowing the errors in my script would help me out a ton. I am just recently getting to learn data storage's and I am currently stuck. Any help is appreciated!!
local DataStoreService = game:GetService("DataStoreService") local levelDataStore = DataStoreService:GetDataStore("levelDataStore") local xpDataStore = DataStoreService:GetDataStore("xpDataStore") function onXPChanged(player, XP, level) if XP.Value>=level.Value * 10 then XP.Value = 0 level.Value = level.Value + 1 end end function onLevelUp(player, XP, level) local m = Instance.new("Hint") m.Parent = game.Workspace m.Text = player.Name .. " has leveled up!" wait(3) m.Parent = nil player.Humanoid.Health = 0 end function onPlayerRespawned(player) wait(5) player.Character.Humanoid.Health = player.Character.Humanoid.Health + player.leaderstats.Level * 10 player.Character.Humanoid.MaxHealth = player.Character.Humanoid.MaxHealth + player.leaderstats.Level * 10 end function onPlayerEntered(newPlayer, player) local stats = Instance.new("IntValue") stats.Name = "leaderstats" local stats2 = Instance.new("IntValue") stats2.Name = "Tycoon" local kills = Instance.new("IntValue") kills.Name = "Kills" kills.Value = 0 local deaths = Instance.new("IntValue") deaths.Name = "Deaths" deaths.Value = 0 local level = Instance.new("IntValue") level.Name = "Level" -- The Name of LV level.Value = levelDataStore:GetAsync("Player_"..player.UserId) or 1 local xp = Instance.new("IntValue") xp.Name = "XP" -- The Name of XP xp.Value = xpDataStore:GetAsync("Player_"..player.UserId) or 0 local data local success, errormessage = pcall(function() data = levelDataStore:GetAsync(player.UserId.."-xp") data = xpDataStore:GetAsync(player.UserId.."-level") end) if success then level.Value = data xp.Value = data else print("There was a problem loading your data.") warn(errormessage) end game.Players.PlayerRemoving:Connect(function(player) local s, e = pcall(function() levelDataStore:SetAsync("Player_"..player.UserId, player.Level.Value) xpDataStore:SetAsync("Player_"..player.UserId, player.Level.Current.Value) end) if s then print("Successfully saved data!") else print("There was an error when saving data.") end end) stats2.Parent = newPlayer stats.Parent = newPlayer kills.Parent = stats deaths.Parent = stats level.Parent = stats xp.Parent = stats xp.Changed:connect(function() onXPChanged(newPlayer, xp, level) end) level.Changed:connect(function() onLevelUp(newPlayer, xp, level) end) while true do if newPlayer.Character ~= nil then break end wait(5) end local humanoid = newPlayer.Character.Humanoid humanoid.Died:connect(function() onHumanoidDied(humanoid, newPlayer) end ) newPlayer.Changed:connect(function(property) onPlayerRespawn(property, newPlayer) end ) stats.Parent = newPlayer end function Send_DB_Event_Died(victim, killer) local killername = "unknown" if killer ~= nil then killername = killer.Name end print(victim.Name, " was killed by ", killername) if shared["deaths"] ~= nil then shared["deaths"](victim, killer) print("Death event sent.") end end function Send_DB_Event_Kill(killer, victim) print(killer.Name, " killed ", victim.Name) if shared["kills"] ~= nil then shared["kills"](killer, victim) print("Kill event sent.") end end function onHumanoidDied(humanoid, player) local stats = player:findFirstChild("leaderstats") if stats ~= nil then local deaths = stats:findFirstChild("Deaths") deaths.Value = deaths.Value + 1 local killer = getKillerOfHumanoidIfStillInGame(humanoid) Send_DB_Event_Died(player, killer) handleKillCount(humanoid, player) end end function onPlayerRespawn(property, player) if property == "Character" and player.Character ~= nil then local humanoid = player.Character.Humanoid local p = player local h = humanoid humanoid.Died:connect(function() onHumanoidDied(h, p) end ) end end function getKillerOfHumanoidIfStillInGame(humanoid) local tag = humanoid:findFirstChild("creator") if tag ~= nil then local killer = tag.Value if killer.Parent ~= nil then return killer end end return nil end function handleKillCount(humanoid, player) local killer = getKillerOfHumanoidIfStillInGame(humanoid) if killer ~= nil then local stats = killer:findFirstChild("leaderstats") if stats ~= nil then local kills = stats:findFirstChild("Kills") local xp = stats:findFirstChild("XP") if killer ~= player then kills.Value = kills.Value + 1 xp.Value = xp.Value + 3 else kills.Value = kills.Value - 0 end Send_DB_Event_Kill(killer, player) end end end game.Players.ChildAdded:connect(onPlayerEntered)