How to load all players before script runs

I have a server script that runs immediately when players join, but I wait it to wait until all players have loaded in. How do I do this? Here’s the script:

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local timeCounter = ReplicatedStorage.Time
local timeUntil = ReplicatedStorage.TimeUntil
local gravel = ReplicatedStorage.Gravel
local runners = ReplicatedStorage.Runners
local lobby = ReplicatedStorage.Lobby
local load = ReplicatedStorage.Load

local Players = game:GetService("Players")

local Teams = game:GetService("Teams")
local lobbyTeam = Teams.Lobby
local gravelTeam = Teams.Gravel
local runnersTeam = Teams.Runners

local lobbySpawn = game.Workspace.Lobby.LobbySpawn
local gravelWait = game.Workspace.GravelWaiting.GravelWaiting
local runnerSpawn = game.Workspace.Playground.RunnerSpawn
local gravelSpawn = game.Workspace.Playground.GravelSpawn

while true do
	--intermission
	timeUntil.Value = "Intermission"
	for seconds = 20, 0, -1 do
		timeCounter.Value = seconds
		task.wait(1)
	end
	if #Players:GetPlayers() <= 1 then
		while #Players:GetPlayers() <= 1 do
			timeUntil.Value = "Not enough players."
			task.wait(3)
			timeUntil.Value = "Intermission"
			for seconds = 20, 0, -1 do
				timeCounter.Value = seconds
				task.wait(1)
			end
		end
	end
	--set gravel
	local gravelPlayer = Players:GetPlayers()[math.random(1, #Players:GetPlayers())]
	gravel:FireClient(gravelPlayer)
	gravelPlayer.Team = gravelTeam
	print(gravelPlayer.Name .." is now gravel")
	local gravelChar = gravelPlayer.Character
	if not gravelChar or not gravelChar.Parent then
		gravelPlayer.CharacterAdded:Wait()
	end
	local gravelHrp = gravelChar:WaitForChild("HumanoidRootPart")
	local gravelHumanoid = gravelChar:WaitForChild("Humanoid")
	gravelHrp.CFrame = gravelWait.CFrame
	gravelHumanoid.WalkSpeed = 20
	-- send players to game
	for i, plr in pairs(lobbyTeam:GetPlayers()) do
		runners:FireClient(plr)
		plr.Team = runnersTeam
		local char = plr.Character
		if not char or not char.Parent then
			char.CharacterAdded:Wait()
		end
		local hrp = char:WaitForChild("HumanoidRootPart")
		hrp.CFrame = runnerSpawn.CFrame
	end
	-- headstart
	timeUntil.Value = "Gravel spawns in:"
	for seconds = 30, 0, -1 do
		timeCounter.Value = seconds
		task.wait(1)
	end
	-- start game(this loop is where the break has to be)
	gravelHrp.CFrame = gravelSpawn.CFrame
	timeUntil.Value = "Game in progress."
	for seconds = 300, 0, -1 do
		timeCounter.Value = seconds
		if #runnersTeam:GetPlayers() == 0 then
			break
		end
		task.wait(1)
	end
	-- game over/send to lobby
	timeUntil.Value = "Game Over"
	task.wait(3)
	if #runnersTeam:GetPlayers() >= 1 then
		timeUntil.Value = "Runners Win!"
	else
		timeUntil.Value = "Gravel Wins!"
	end
	gravelHumanoid.WalkSpeed = 16
	for i, plr in pairs(Players:GetPlayers()) do
		plr.Team = lobbyTeam
		lobby:FireClient(plr)
		local char = plr.Character
		if not char or not char.Parent then
			char.CharacterAdded:Wait()
		end
		local hrp = char:WaitForChild("HumanoidRootPart")
		hrp.CFrame = lobbySpawn.CFrame
	end
	task.wait(3)
end

increase the value

#Players:GetPlayers() <= must be a higher value than 1 the amount of players you want to start the game

local ReplicatedStorage = game:GetService(“ReplicatedStorage”)
local timeCounter = ReplicatedStorage.Time
local timeUntil = ReplicatedStorage.TimeUntil
local gravel = ReplicatedStorage.Gravel
local runners = ReplicatedStorage.Runners
local lobby = ReplicatedStorage.Lobby
local load = ReplicatedStorage.Load

local Players = game:GetService(“Players”)

local Teams = game:GetService(“Teams”)
local lobbyTeam = Teams.Lobby
local gravelTeam = Teams.Gravel
local runnersTeam = Teams.Runners

local lobbySpawn = game.Workspace.Lobby.LobbySpawn
local gravelWait = game.Workspace.GravelWaiting.GravelWaiting
local runnerSpawn = game.Workspace.Playground.RunnerSpawn
local gravelSpawn = game.Workspace.Playground.GravelSpawn

while true do
–intermission
timeUntil.Value = “Intermission”
for seconds = 20, 0, -1 do
timeCounter.Value = seconds
task.wait(1)
end
if #Players:GetPlayers() <= 2 then --or the number you want–
while #Players:GetPlayers() <= 2 do --or the number you want–
timeUntil.Value = “Not enough players.”
task.wait(3)
timeUntil.Value = “Intermission”
for seconds = 20, 0, -1 do
timeCounter.Value = seconds
task.wait(1)
end
end
end
–set gravel
local gravelPlayer = Players:GetPlayers()[math.random(1, #Players:GetPlayers())]
gravel:FireClient(gravelPlayer)
gravelPlayer.Team = gravelTeam
print(gravelPlayer.Name …" is now gravel")
local gravelChar = gravelPlayer.Character
if not gravelChar or not gravelChar.Parent then
gravelPlayer.CharacterAdded:Wait()
end
local gravelHrp = gravelChar:WaitForChild(“HumanoidRootPart”)
local gravelHumanoid = gravelChar:WaitForChild(“Humanoid”)
gravelHrp.CFrame = gravelWait.CFrame
gravelHumanoid.WalkSpeed = 20
– send players to game
for i, plr in pairs(lobbyTeam:GetPlayers()) do
runners:FireClient(plr)
plr.Team = runnersTeam
local char = plr.Character
if not char or not char.Parent then
char.CharacterAdded:Wait()
end
local hrp = char:WaitForChild(“HumanoidRootPart”)
hrp.CFrame = runnerSpawn.CFrame
end
– headstart
timeUntil.Value = “Gravel spawns in:”
for seconds = 30, 0, -1 do
timeCounter.Value = seconds
task.wait(1)
end
– start game(this loop is where the break has to be)
gravelHrp.CFrame = gravelSpawn.CFrame
timeUntil.Value = “Game in progress.”
for seconds = 300, 0, -1 do
timeCounter.Value = seconds
if #runnersTeam:GetPlayers() == 0 then
break
end
task.wait(1)
end
– game over/send to lobby
timeUntil.Value = “Game Over”
task.wait(3)
if #runnersTeam:GetPlayers() >= 1 then
timeUntil.Value = “Runners Win!”
else
timeUntil.Value = “Gravel Wins!”
end
gravelHumanoid.WalkSpeed = 16
for i, plr in pairs(Players:GetPlayers()) do
plr.Team = lobbyTeam
lobby:FireClient(plr)
local char = plr.Character
if not char or not char.Parent then
char.CharacterAdded:Wait()
end
local hrp = char:WaitForChild(“HumanoidRootPart”)
hrp.CFrame = lobbySpawn.CFrame
end
task.wait(3)
end

1 Like

That’s not the problem. I only need 2 players to start, so there is only 1 or less players, it won’t start. The problem is that it starts when the 2 players join, but before they fully load in everything.

Just do this:

game.Players.PlayerAdded:Connect(function(player)
   if #game.Players:GetChildren == 2 then
      --whatever code here
   end
end)