Hello! So i made this XP system, but i don't really get it how does it work... I don't get how does it count those levels and how does it get the maxXP value so accurately. Can someone please explain what have i done here, as well as answer why sometimes the white bar goes way over and why sometimes the XP is negative value?! How could i do this more efficiently? P.s i'm still kind of new to the whole game developing...
Server script:
game.Players.PlayerAdded:Connect(function(plr)
local leaderstats = Instance.new("Folder",plr)
leaderstats.Name = "leaderstats"
local XP = Instance.new("NumberValue",leaderstats)
XP.Name = "XP"
XP.Value = 0
local Level = Instance.new("IntValue",leaderstats)
Level.Name = "Level"
Level.Value = 0
----
local maxXP = 5000
game.ReplicatedStorage.RemoteEvent1.OnServerEvent:Connect(function()
XP.Value = XP.Value + 20000
end)
while wait() do
if XP.Value == maxXP then
maxXP = 5000 + (50*Level.Value*Level.Value)
XP.Value = 0
Level.Value = Level.Value + 1
elseif XP.Value > maxXP then
maxXP = 5000 + (50*Level.Value*Level.Value)
XP.Value = XP.Value - maxXP
Level.Value = Level.Value + 1
print("lvl "..Level.Value)
print(XP.Value)
print("Max "..maxXP)
end
game.ReplicatedStorage.RemoteEvent:FireClient(plr,maxXP,Level,XP)
end
end)
Local script:
local plr = game.Players.LocalPlayer
--local XP = plr.leaderstats.XP
game.ReplicatedStorage.RemoteEvent.OnClientEvent:Connect(function(maxXP,level,XP)
script.Parent.Text = XP.Value.."/"..maxXP
script.Parent.Parent.Level.Text = level.Value
script.Parent.Parent.Bar:TweenSize(UDim2.new(0,(XP.Value / maxXP * 147),0,21),"Out","Quad",0.25)
end)
script.Parent.Parent.TextButton.MouseButton1Click:Connect(function()
game.ReplicatedStorage.RemoteEvent1:FireServer(plr)
end)
game.ReplicatedStorage.RemoteEvent2.OnClientEvent:Connect(function(drift,currXP,count)
if drift == true then
script.Parent.Parent.CurrentXP.Size = UDim2.new(0.110,0,40)
wait()
script.Parent.Parent.CurrentXP.Text = currXP
wait()
script.Parent.Parent.CurrentXP.Size = UDim2.new(0.100,0,30)
else
if count >= 10 then
script.Parent.Parent.CurrentXP.Size = UDim2.new(0.100,0,30)
script.Parent.Parent.CurrentXP.Text = ""
end
end
end)
Video demo: https://youtu.be/ptcx-NnhQTI

1 comment
you could just do level.Value^2 instead of level.Value * level.Value