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!
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)
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)