Checking if the player`s XP changes

Hey devs! I am currently working on a script that detects when a player`s XP count changes, so that it can trigger a remote event located in Replicated Storage which will trigger a script inside ServerScriptService to check their XP and decide their rank. When the player gains XP, the rank of the player is not changed according to their XP. Does anybody know what the issue might be?

Local Script:

local player = game.Players.LocalPlayer

player.leaderstats.XP.Changed:Connect(function()
	game.ReplicatedStorage.ExpEvent:FireServer(player)
end)

Script:

game.ReplicatedStorage.ExpEvent.OnServerEvent:Connect(function(player)
	if player.leaderstats.XP.Value < 25 then
		player.leaderstats.Rank = "Unranked"
	elseif player.leaderstats.XP.Value >= 25 and player.leaderstats.XP.Value < 75 then
		player.leaderstats.Rank = "Bronze III"
	elseif player.leaderstats.XP.Value >= 75 and player.leaderstats.XP.Value < 150 then
		player.leaderstats.Rank = "Bronze II"
	elseif player.leaderstats.XP.Value >= 150 and player.leaderstats.XP.Value < 250 then
		player.leaderstats.Rank = "Bronze I"
	elseif player.leaderstats.XP.Value >= 250 and player.leaderstats.XP.Value < 350 then
		player.leaderstats.Rank = "Silver III"
	elseif player.leaderstats.XP.Value >= 350 and player.leaderstats.XP.Value < 450 then 
		player.leaderstats.Rank = "Silver II"
	elseif player.leaderstats.XP.Value >= 450 and player.leaderstats.XP.Value < 600 then 
		player.leaderstats.Rank = "Silver I"
	elseif player.leaderstats.XP.Value >= 600 and player.leaderstats.XP.Value < 800 then 
		player.leaderstats.Rank = "Gold III"
	elseif player.leaderstats.XP.Value >= 800 and player.leaderstats.XP.Value < 1000 then 
		player.leaderstats.Rank = "Gold II"
	elseif player.leaderstats.XP.Value >= 1000 and player.leaderstats.XP.Value < 1300 then 
		player.leaderstats.Rank = "Gold I"
	elseif player.leaderstats.XP.Value >= 1300 and player.leaderstats.XP.Value < 1600 then 
		player.leaderstats.Rank = "Diamond III"
	elseif player.leaderstats.XP.Value >= 1600 and player.leaderstats.XP.Value < 1900 then 
		player.leaderstats.Rank = "Diamond II"
	elseif player.leaderstats.XP.Value >= 1900 then 
		player.leaderstats.Rank = "Diamond I"
	end
end)

If anyone could help with this it would be very appreciated!

I was able to find the solution. Thanks to anyone that read the post anyways.

1 Like

Here is the solution if anyone is wondering:

Local Script

local player = game.Players.LocalPlayer
local leaderstats = player:WaitForChild("leaderstats")
local XP = leaderstats:WaitForChild("XP")

XP.Changed:Connect(function()
	game:GetService("ReplicatedStorage"):WaitForChild("ExpEvent"):FireServer(player)
end)

Script

game.ReplicatedStorage.ExpEvent.OnServerEvent:Connect(function(player)
	if player.leaderstats.XP.Value < 25 then
		player.leaderstats.Rank.Value = "Unranked"
	elseif player.leaderstats.XP.Value >= 25 and player.leaderstats.XP.Value < 75 then
		player.leaderstats.Rank.Value = "Bronze III"
	elseif player.leaderstats.XP.Value >= 75 and player.leaderstats.XP.Value < 150 then
		player.leaderstats.Rank.Value = "Bronze II"
	elseif player.leaderstats.XP.Value >= 150 and player.leaderstats.XP.Value < 250 then
		player.leaderstats.Rank.Value = "Bronze I"
	elseif player.leaderstats.XP.Value >= 250 and player.leaderstats.XP.Value < 350 then
		player.leaderstats.Rank.Value = "Silver III"
	elseif player.leaderstats.XP.Value >= 350 and player.leaderstats.XP.Value < 450 then 
		player.leaderstats.Rank.Value = "Silver II"
	elseif player.leaderstats.XP.Value >= 450 and player.leaderstats.XP.Value < 600 then 
		player.leaderstats.Rank.Value = "Silver I"
	elseif player.leaderstats.XP.Value >= 600 and player.leaderstats.XP.Value < 800 then 
		player.leaderstats.Rank.Value = "Gold III"
	elseif player.leaderstats.XP.Value >= 800 and player.leaderstats.XP.Value < 1000 then 
		player.leaderstats.Rank.Value = "Gold II"
	elseif player.leaderstats.XP.Value >= 1000 and player.leaderstats.XP.Value < 1300 then 
		player.leaderstats.Rank.Value = "Gold I"
	elseif player.leaderstats.XP.Value >= 1300 and player.leaderstats.XP.Value < 1600 then 
		player.leaderstats.Rank.Value = "Diamond III"
	elseif player.leaderstats.XP.Value >= 1600 and player.leaderstats.XP.Value < 1900 then 
		player.leaderstats.Rank.Value = "Diamond II"
	elseif player.leaderstats.XP.Value >= 1900 then 
		player.leaderstats.Rank.Value = "Diamond I"
	end
end)

I feel that you are heavily overcomplicating this. Instead of wasting network resources, just check on the server. You also don’t need the extra if checks.

Server code: (delete your LocalScript)

local Players = game:GetService("Players")

Players.PlayerAdded:Connect(function(player)
	local leaderstats = player:WaitForChild("leaderstats")
	local XP = leaderstats:WaitForChild("XP")
	local Rank = leaderstats:WaitForChild("Rank")
	
	XP.Changed:Connect(function(newXP)
		if newXP < 25 then
			Rank.Value = "Unranked"
		elseif newXP < 75 then
			Rank.Value = "Bronze III"
		elseif newXP < 150 then
			Rank.Value = "Bronze II"
		elseif newXP < 250 then
			Rank.Value = "Bronze I"
		elseif newXP < 350 then
			Rank.Value = "Silver III"
		elseif newXP < 450 then 
			Rank.Value = "Silver II"
		elseif newXP < 600 then 
			Rank.Value = "Silver I"
		elseif newXP < 800 then 
			Rank.Value = "Gold III"
		elseif newXP < 1000 then 
			Rank.Value = "Gold II"
		elseif newXP < 1300 then 
			Rank.Value = "Gold I"
		elseif newXP < 1600 then 
			Rank.Value = "Diamond III"
		elseif newXP < 1900 then 
			Rank.Value = "Diamond II"
		elseif newXP >= 1900 then 
			Rank.Value = "Diamond I"
		end
	end)
end)
1 Like

It won’t trigger in a LocalScript, you’ll have to put the event listener in the server script.
Also, I went ahead and optimized it a bit for you so you can change it easily later on.

local Ranks = {
	{ Title = "Unranked", MinXP = 0, MaxXP = 25 },
	{ Title = "Bronze III", MinXP = 25, MaxXP = 75 },
	{ Title = "Bronze II", MinXP = 75, MaxXP = 150 },
	{ Title = "Bronze I", MinXP = 150, MaxXP = 250 },
	-- etc...
}

game.Players.PlayerAdded:Connect(function (Player)
	local XP = Player.leaderstats.XP
	XP.Changed:Connect(function()
		for _, Rank in ipairs(Ranks) do
			if XP.Value >= Rank.MinXP and XP.Value < Rank.MaxXP then
				Player.leaderstats.Rank.Value = Rank.Title
			end
		end
	end)
end)
1 Like

Thank you to both for the solutions! I will go ahead and edit my code to make it less complicated like you guys suggested.

2 Likes

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.