Help needed on making XP System

I’m trying to make an XP System in a module script, but it got me wondering how I would make the script loop until all remaining extra XP is added, like if I were to add 500 XP to myself, and if there are more XP left, it would add more, eventually leveling up, but what if it takes 5 level ups to finish all extras? what would I do to make that happen? I’m kinda new to scripting,

local module = {}
local players = game:GetService('Players')
local localplayer = players.LocalPlayer or players.PlayerAdded:Wait()
local datastoreservice = require(game:GetService('ReplicatedStorage').Services.DataStore2)

datastoreservice.Combine('xpKey21^','savedXp','savedMax','currentLevel')
local valueDatastore = datastoreservice('savedXp', localplayer)
local maxDatastore = datastoreservice('savedMax', localplayer)
local levelDatastore = datastoreservice('currentLevel', localplayer)

local xpValue = Instance.new('NumberValue')
xpValue.Value = valueDatastore:Get(0)
xpValue.Parent = localplayer
xpValue.Name = 'xp'
local xpRequired = Instance.new('NumberValue')
xpRequired.Value = maxDatastore:Get(5)
xpRequired.Parent = localplayer
xpRequired.Name = 'maxXp'
local level = Instance.new('NumberValue')
level.Value = maxDatastore:Get(1)
level.Parent = localplayer
level.Name = 'level'

function module:Get(which:string)
	local instance = string.lower(which)
	if instance == 'max' then
		return xpRequired
	else
		return xpValue
	end
end

function module:Increase(amount:number)
	if xpRequired.Value <= xpValue.Value then
		local val = xpValue + amount - xpRequired.Value
		local ogMax = xpRequired.Value
		if val then
			xpValue:Set(val)
			maxDatastore:Increment(5)
			xpValue.Value = val
			xpRequired.Value = ogMax + 5
			level.Value += 1
			levelDatastore:Increment(1)
		else
			valueDatastore:Set(0)
			maxDatastore:Increment(5)
			xpValue.Value = 0
			xpRequired.Value = ogMax + 5
			
		end
	else

		valueDatastore:Increment(amount)
	end
end

function module:Decrease(amount:number)
	if 0 >= xpValue.Value then
		local val = math.abs(xpValue.Value - amount)
		xpValue:Set(val)
		maxDatastore:Increment(-5)
		xpValue.Value = val
		xpRequired.Value = maxDatastore:Get()
	else

		valueDatastore:Increment(amount)
	end
end

return module

1 Like