I am currently working on a King of The Hill script and the loop doesn't seem to be breaking at all.

So, basically, I am firing a BindableFunction which is script.Parent.King. That is my BindableFunction, however, when I execute it when I am out of range, the loop doesn't break.

local val = false

local function update(upd)
	val = upd
	while wait(1) do
		if val == false then
			val = false
			break
		end
		print("give | king of hill")
	end
end

script.Parent.King.OnInvoke = update

game.Players.PlayerAdded:Connect(function(plr)
	plr.CharacterAdded:connect(function(character)
		while wait(0.5) do
			local mag = (script.Parent.Position - character:FindFirstChild("HumanoidRootPart").Position).magnitude
			if mag <= 16 then
				script.Parent.King:Invoke(true)
			else
				script.Parent.King:Invoke(false)
			end
		end
	end)
end)

That is my code, please let me know if you have any solutions.