While loop inside PlayerAdded not working

Hello, I have 2 loops inside a PlayerAdded function. The first loop works, the second loop doesn’t work and I am not getting errors. Does someone know why it doesn’t work? And how can I fix this?

local function ChangeWalkSpeed(Player, NewWalkSpeed)
	if Player and Player.Character then
		if Player.Character:FindFirstChildWhichIsA("Humanoid") then
			Player.Character:FindFirstChildWhichIsA("Humanoid").WalkSpeed = NewWalkSpeed
		end
	end
end
game.Players.PlayerAdded:connect(function(Player)
	local Lead = Instance.new("Folder")
	Lead.Name = "hiddenstats"
	Lead.Parent = Player
	local RebirthMultipler = Instance.new("NumberValue",Lead)
	RebirthMultipler.Name = "RebirthMultipler"
	RebirthMultipler.Value = 1
	RebirthMultipler.Parent = Lead
	local RebirthMultipler = Instance.new("IntValue",Lead)
	RebirthMultipler.Name = "RebirthMultiplerTime"
	RebirthMultipler.Value = 0
	RebirthMultipler.Parent = Lead
	local RebirthMultipler = Instance.new("IntValue",Lead)
	RebirthMultipler.Name = "SpeedMultiplerTime"
	RebirthMultipler.Value = 0
	RebirthMultipler.Parent = Lead
	wait(14)
local a = Player.hiddenstats.RebirthMultiplerTime
local b = Player.hiddenstats.SpeedMultiplerTime
local rebm = Player.hiddenstats.RebirthMultipler
while wait(1)do -- this works --
	if b.Value >0 then
	a.Value = a.Value -1
		rebm.Value = 2
		else
			a.Value = a.Value +1
			a.Value = a.Value - 1
			rebm.Value = 1
			end
	end
while wait(1)do -- this doesn't work--
	if b.Value >0 then
		b.Value = b.Value -1
		ChangeWalkSpeed(Player, 32)
		else
			b.Value = b.Value +1
			b.Value = b.Value - 1
		ChangeWalkSpeed(Player, 16)
			end
	end
end)

Well your issue is that the loop will not run because the code is already running another loop, you could use coroutines to put these loops in separate threads so they work independently

local function ChangeWalkSpeed(Player, NewWalkSpeed)
	if Player and Player.Character then
		if Player.Character:FindFirstChildWhichIsA("Humanoid") then
			Player.Character:FindFirstChildWhichIsA("Humanoid").WalkSpeed = NewWalkSpeed
		end
	end
end
game.Players.PlayerAdded:connect(function(Player)
	local Lead = Instance.new("Folder")
	Lead.Name = "hiddenstats"
	Lead.Parent = Player
	local RebirthMultipler = Instance.new("NumberValue",Lead)
	RebirthMultipler.Name = "RebirthMultipler"
	RebirthMultipler.Value = 1
	RebirthMultipler.Parent = Lead
	local RebirthMultipler = Instance.new("IntValue",Lead)
	RebirthMultipler.Name = "RebirthMultiplerTime"
	RebirthMultipler.Value = 0
	RebirthMultipler.Parent = Lead
	local RebirthMultipler = Instance.new("IntValue",Lead)
	RebirthMultipler.Name = "SpeedMultiplerTime"
	RebirthMultipler.Value = 0
	RebirthMultipler.Parent = Lead
	wait(14)
	local a = Player.hiddenstats.RebirthMultiplerTime
	local b = Player.hiddenstats.SpeedMultiplerTime
	local rebm = Player.hiddenstats.RebirthMultipler
	coroutine.wrap(function()
		while wait(1)do -- this works --
			if b.Value >0 then
				a.Value = a.Value -1
				rebm.Value = 2
			else
				a.Value = a.Value +1
				a.Value = a.Value - 1
				rebm.Value = 1
			end
		end
	end)()
	coroutine.wrap(function()
		while wait(1)do -- this doesn't work--
			if b.Value >0 then
				b.Value = b.Value -1
				ChangeWalkSpeed(Player, 32)
			else
				b.Value = b.Value +1
				b.Value = b.Value - 1
				ChangeWalkSpeed(Player, 16)
			end
		end
	end)()
end)
1 Like

I got a question. Does it also work with 3 loops? Or only 2?

It can work with as many loops as want ao long as you coroutine it

1 Like

it works with any amount of loops if you do it right, a quick shortcut I do is using spawn(function() to put the function inside of a new thread

1 Like

I wouldn’t trust spawn due to how execution can take longer for it to run depending on conditions like frame rate and throttling conditions, as it runs the next time roblox runs an update cycle, which basically acts like a wait(). Coroutines from my information don’t have this issue and are more preferred in general to use over spawn, but to each their own of course

1 Like

I don’t believe there is a hard coded limit for the maximum amount of coroutines but it will eventually fail (if you make hundreds of them) but you really shouldn’t use it like this. It is always better if you use bindable or remote events to let the server know when your value has changed rather than constantly checking.

You might even be able to use :Changed for this.