Scripting HelpersARCHIVE
A little piece of Roblox history. Preserved for everyone, one question at a time.Read about the archive →
✓ ANSWER ACCEPTED

Why does my military ranking script not work? It just keeps on adding XP.

So I am making a D-Day game based off of Call of Duty: WW2. Every time a player gets a certain amount of points they get a new rank, and they're character loads back up. Why does this not work? Can you fix my script?

game.Players.PlayerAdded:Connect(function(plr)
	
	local char = plr.Character
	
	local leaderstats = Instance.new('Folder')
	leaderstats.Name = 'leaderstats'
	leaderstats.Parent = plr
	
	local rank = Instance.new('StringValue')
	rank.Name = 'Rank'
	rank.Value = 'Private'
	rank.Parent = leaderstats
	
	local points = Instance.new('IntValue')
	points.Name = 'XP'
	points.Value = 0
	points.Parent = leaderstats
	
	while true do
		
		wait(1)
		points.Value = points.Value + 10
		
	end
	
	if (points.Value >= 50) then
		
		rank.Value = 'Private First Class'
		char:LoadCharacter()
		
	end
	
	if (points.Value >= 100) then
		
		rank.Value = 'Private Second Class'
		char:LoadCharacter()
		
	end
	
end)

2 answers

✓ Accepted answer

Your loop causes infinite yield which will cause the code below the while loop to never run. Either use 'spawn' or put the while loop in the end of the connection. Also, you should check for XP every time it updates.

The while loop acts like a wall to code under it, but not in it.

In line 19-24, you have a while loop going on. Since your condition is constant and you never specified a terminating condition, the loop is infinite. Thus, everything at line 26-38 will not execute.

You should instead listen for the Instance.Changed event. It fires when a property of an instance changes. For ValueBase objects (StringValue, IntValue, ect), the Changed event is modified to fire only on the Value property change.

local Players = game:GetService('Players')

Players.PlayerAdded:Connect(function(client)
	local leaderstats = Instance.new('Folder')
	leaderstats.Name = 'leaderstats'
	leaderstats.Parent = client
	
	local rank = Instance.new('StringValue')
	rank.Name = 'Rank'
	rank.Value = 'Private'
	rank.Parent = leaderstats
	
	local xp = Instance.new('IntValue')
	xp.Name = 'XP'
	xp.Value = 0
	xp.Parent = leaderstats

	xp.Changed:Connect(function(newXP)
		if (points.Value - 50 >= 0) then
			rank.Value = 'Private First Class'
			client:LoadCharacter()
		elseif (points.Value - 100 >= 0) then
        		rank.Value = 'Private Second Class'
			client:LoadCharacter()
		end
	end)
end)

while (true) do
	for _, client in ipairs(Players:GetPlayers()) do
		client.leaderstats.XP.Value = client.leaderstats.XP.Value + 10
	end
	wait(1)
end

Instead of multiple loops going on, why not just have one big loop?

Notice the better identifiers I used. Also, :LoadCharacter() is a member of the Player instance, not the character. Characters are just Models, if they had :LoadCharacter, then we'd be calling :LoadCharacter on buildings next thing

2 comments

0

That didn't work.

0

Give more detail other than "That didn't work." What is not working

This discussion is preserved as it was. New answers, comments, and votes are closed.