New Loop help for AFK system

Hello Guys,
i need a bit help with my loop. I am already sitting 3 hours on this and i don’t have any ideas anymore how i can make it work, not even Ai helped me.
I wanna make an AFK function for my game and this code kinda works but the Lobbywait is always set back to 30 because of the loop but i have no idea how to rewrite the loop and keeping the logic of it.
I want that the Lobbycountdown works as long as more then 3 Players are in the Game and not AFK. And i want that the Round repeat gets active when a player gets Afk and the players in the game drop below 3 yk?

local Lobbywait = 30

local function round()
	while true do
		local requiredPlayers = 3
		repeat
			wait(1)
			status.Value = "At least " .. requiredPlayers .. " players are needed to start a round"

			local activePlayers = 0
			for _, Plr in pairs(game.Players:GetPlayers()) do
				if not Plr:FindFirstChild("isAFK") then
					activePlayers = activePlayers + 1
				end
			end
		until activePlayers >= requiredPlayers
		
		inRound.Value = false
		
		local function lobbyCountdown()
			for i = Lobbywait, 0, -1 do
				status.Value = "Voting begins in " .. i .. " seconds"
				wait(1)
			end
		end
		
		lobbyCountdown()

Here is the full script if anyone needs it.

local intermission = 20
local choose = 10
local roundLength = (math.random(2,4) * 60)

local inRound = game.ReplicatedStorage.InRound
local ChooseMode = game.ReplicatedStorage.ChooseMode
local status = game.ReplicatedStorage.Status
local LStatus = game.Workspace:WaitForChild("Lobby").SystemSign.SurfaceGui.SIGN

local playingTeam = game.Teams.Playing
local lobbyTeam = game.Teams.Lobby

local Modes = game.ReplicatedStorage:WaitForChild("Modes")

local RoundTimer = game.ReplicatedStorage:WaitForChild("RoundTimer")

local roguesrevengeModule = require(game.ReplicatedStorage:WaitForChild("rougeRevengeSystem"))
local reversedModeModule = require(game.ReplicatedStorage:WaitForChild("reversedSystem"))
local deathModeModule = require(game.ReplicatedStorage:WaitForChild("deathmodeSystem"))
local murderMysteryModule = require(game.ReplicatedStorage:WaitForChild("murderMysterySystem"))

local Sounds = game.ReplicatedStorage.Sounds

local function formatTime(seconds)
	local minutes = math.floor(seconds / 60)
	local remainingSeconds = seconds % 60
	return string.format("%02d:%02d", minutes, remainingSeconds)
end

inRound.Changed:Connect(function()
	if inRound.Value == true then
		for _, plr in pairs(game.Players:GetPlayers()) do
			local char = plr.Character
			local human = char:WaitForChild("Humanoid")
			local openEvent = game.ReplicatedStorage.CurrencyEvents:FindFirstChild("OpenClaim")

			plr.Team = playingTeam

			human.Died:Connect(function()
				plr.Team = lobbyTeam
			end)
		end
	else
		local spawns = game.Workspace.Lobby:FindFirstChild("Spawns"):GetChildren()
		local spawnIndex = 1

		for _, plr in pairs(game.Players:GetPlayers()) do
			local char = plr.Character
			if char then  -- Check if the player's character exists
				local humanRoot = char:WaitForChild("HumanoidRootPart")
				local human = char:WaitForChild("Humanoid")
				local openEvent = game.ReplicatedStorage.CurrencyEvents:FindFirstChild("OpenClaim")

				if plr.Team == playingTeam then
					if spawnIndex > #spawns then
						spawnIndex = 1  -- Reset to the first spawn point if we exceed the number of available spawns
					end

					local spawnPoint = spawns[spawnIndex]
					humanRoot.CFrame = spawnPoint.CFrame
					spawnIndex = spawnIndex + 1  -- Move to the next spawn point for the next player

					plr.Team = lobbyTeam

					human:UnequipTools()
					plr.Backpack:ClearAllChildren()
				end

				openEvent:FireClient(plr)
			end
		end
	end
end)

local Lobbywait = 30

local function round()
	while true do
		local requiredPlayers = 3
		repeat
			wait(1)
			status.Value = "At least " .. requiredPlayers .. " players are needed to start a round"

			local activePlayers = 0
			for _, Plr in pairs(game.Players:GetPlayers()) do
				if not Plr:FindFirstChild("isAFK") then
					activePlayers = activePlayers + 1
				end
			end
		until activePlayers >= requiredPlayers
		
		inRound.Value = false
		
		local function lobbyCountdown()
			for i = Lobbywait, 0, -1 do
				status.Value = "Voting begins in " .. i .. " seconds"
				wait(1)
			end
		end
		
		lobbyCountdown()
		
		game.ReplicatedStorage:FindFirstChild("VotingEnabled").Value = true

		for i = intermission, 0, -1 do
			status.Value = "Research begins in " .. i .. " seconds"
			wait(1)
		end
		game.ReplicatedStorage:FindFirstChild("VotingEnabled").Value = false

		local modeBoolValues = Modes:GetChildren()
		local randomModeIndex = math.random(1, #modeBoolValues)
		local chosenModeBoolValue = modeBoolValues[randomModeIndex]

		chosenModeBoolValue.Value = true
		ChooseMode.Value = true

		for i = 5, 0, -1 do
			status.Value = "Mode gets Chosen"
			wait(1)
		end

		ChooseMode.Value = false
		inRound.Value = true

		if chosenModeBoolValue.Name == "Roguemode" then
			roguesrevengeModule.ChooseRoles()
		elseif chosenModeBoolValue.Name == "Reversed" then
			reversedModeModule.ChooseRoles()
		elseif chosenModeBoolValue.Name == "Deathmode" then
			deathModeModule.ChooseRoles()
		elseif chosenModeBoolValue.Name == "MurderMystery" then
			murderMysteryModule.ChooseRoles()
		end

		local modeStartTime = tick() -- Record the time when the mode starts

		for i = roundLength, 0, -1 do
			local elapsedTime = tick() - modeStartTime
			local remainingTime = roundLength - elapsedTime

			status.Value = "Crew escapes in " .. formatTime(remainingTime) .. " Minutes"
			RoundTimer.Value = remainingTime  -- Update RoundTimer with remaining time

			local playing = {}
			local murderer = nil
			local nonMurderers = {}
			local death = nil 

			for _, plr in pairs(game.Players:GetChildren()) do
				if plr.Team.Name == "Playing" then
					table.insert(playing, plr.Name)
					if chosenModeBoolValue.Name == "Deathmode" then
						if plr:WaitForChild("Role").Value == "Death" then
							death = plr
						elseif plr:WaitForChild("Role").Value == "Rogue" then
							murderer = plr
						else
							table.insert(nonMurderers, plr)
						end

					else
						if plr:WaitForChild("Role").Value == "Rogue" then
							murderer = plr
						else
							table.insert(nonMurderers, plr)
						end
					end
				end
			end
			
			if murderer and not death and #nonMurderers == 0 then
				status.Value = "The Rogue has Won this Round"
				Sounds.Murder:Play()
				wait(2)
				chosenModeBoolValue.Value = false
				break
				
			elseif death and (not murderer or i == 0) and #nonMurderers == 0 then
				status.Value = "The Death has Won this Round"
				Sounds.Death:Play()
				wait(2)
				chosenModeBoolValue.Value = false
				break

			elseif death and #nonMurderers > 0 and (not murderer or i == 0) then
				status.Value = "Death helped the Crew"
				Sounds.Innocents:Play()
				Sounds.Death:Play()
				wait(2)
				chosenModeBoolValue.Value = false
				break
				

			elseif #nonMurderers > 0 and (not murderer or i == 0) then
				status.Value = "The Crew won this Round"
				Sounds.Innocents:Play()
				wait(2)
				chosenModeBoolValue.Value = false
				break

			elseif #playing == 0 then
				status.Value = "Everyone died, Round end!"
				wait(3)
				chosenModeBoolValue.Value = false
				break
			

			elseif #playing == 1 then
				status.Value = playing[1] .. " Has Won The Game!"
				for i, plr in pairs(game.Players:GetChildren()) do
					if playing[1] == plr.Name then
					end
				end
				wait(3)
				break
			end
			wait(1)
		end
		wait(3)
	end
end


spawn(round)

I really need help and would be thankful if someone helped me :))

1 Like

im pretty sure you can use the Idled event to check if the player is AFK?

2 Likes