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
#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
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.