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)

3 comments
Players.ChildAdded or Players.PlayerAdded only sends one value. Your onPlayerEntered has 2 (newPlayer, player).
Players.PlayerAdded only sends one variable. The only variable of PlayerAdded is the player. Your onPlayerEntered has 2 variables (newPlayer, player) (Line 31).
yes and I did infact change that to just one value. But whenever I load into my game and test it out, the entire script freezes my game and whenever I kill someone the gui doesn't change and the player doesn't get his XP.