Game Starting Issues

Hello all!

I’m currently working on a small project. I am trying to make a script that works with a sword fighting game. I have tried to watch a few videos to help me along the way, I tried to make up the code, but it really has not helped.
I am trying to fix the GUI at the top, it currently says “Waiting for players” and then “Intermission”. I set the code to
wait (10)
After 10 Seconds go by, you are still stuck in the game, and you are not teleported to the map.

This is my main script.
– Define variables

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local ServerStorage = game:GetService("ServerStorage")
local MapsFolder = ServerStorage:WaitForChild("Maps")

local Status = ReplicatedStorage:WaitForChild("Status")
local reward = 25
local plrs = "Players"
local Players = "plrs"
local GameLength = 70


--Game Loop

while true do
	
	Status.Value = "Waiting for enough players"
	repeat wait(1) until game.Players.NumPlayers >= 2
	
	Status.Value = "Intermission"
	
	wait(10)
	
	local plrs = {} 
	for i, player in pairs(game.Players:GetPlayers()) do
		if player then
			table.insert(plrs,player) -- Add each player into plrs table
		end
	end
	
	wait(2)     


local AvailableMaps = MapsFolder:GetChildren()


local ChosenMap = AvailableMaps[math.random(1,#AvailableMaps)]


Status.Value = ChosenMap.Name.." Chosen"

local ClonedMap = ChosenMap:Clone()
ClonedMap.Parent = workspace

--Teleport players to map. 


local SpawnPoints = ClonedMap:FindFirstChild("SpawnPoints")

if not ("SpawnPoint")then
	print ("SpawnPoints not found!")
end





local AvailableSpawnPoints = SpawnPoints:GetChildren()

for i, player in pairs(plrs) do
	if player then
		character = player.Character
		if character then
			
		end
	end
end
	-- Teleport them
character:FindFirstChild("HumanoidRootPart").CFrame = AvailableSpawnPoints[1].CFrame
table.remove(AvailabeSpawnPoints)


--give them sword
local Sword = ServerStorage.SwordClone()
Sword.Parent = player.Backpack

local GameTag = Instance.new ("BoostValue")
GameTag.Name = ("GameTag")
GameTag.Parent = player.character

 
	--There is no character
	if not player then
		table.remove(plrs,i)
		end
	end
end


Status.Value = "Get ready to play!"

wait(2)

for i = GameLength,0,-1 do
	  for x, player in pairs(plrs) do
		if player then
			
			character = player.Character
			
			if not character then
				
				--left game
			else
				if character:FindFirstChild("GameTag") then
					--They are still alive
					
					print(player.Name.."is still in the game!")
				
				else --they are dead
					table.remove(plrs,x)
				
				end
			end
		else
			  table.remove(plrs,x)
			print (player.Name.."Has been removed!")
			
		end
	end
	Status.Value = "There are "..i.."Seconds remaining, and "..#plrs.."players left"
	
	if #plrs == 1 then
		--last person standing
		
		Status.Value = "The winner is " ..plrs[1].Name
		plrs[1].leaderstats.Money.Value = plrs [1].leaderstats.Money.Value + reward
		break
	  elseif #plrs == 0 then
		Status.Value= "Nobody won!"
	elseif i == 0 then
		  Status.Value = "Time up!"
		break
		
	end
	wait(1)
	
end

print ("End of game")

for i, player in pairs(game.Players:GetPlayers()) do
	character = player.character
	if not character then
		--ignore them
	else 
		if character:FindFirstChild("GameTag") then
			character.GameTag:Destroy()
			
		end
	if player.Backpack:FindFirstChild("Sword")then
	player.Backpack.Sword:Destroy()
	end
		if character.Backpack:FindFirstChild("Sword") then
	character.Backpack.Sword:Destroy()
		
	end
player:Loadcharacter()
end
ClonedMap:Destroy()

	wait (2)
	
	Status.Value = "Game Ended!"
end
1 Like

This is interesting. What exactly does it do?:

if not ("SpawnPoint")then
	print ("SpawnPoints not found!")
end

Also, could you insert print statements throughout the script to see which line is erroring?

EDIT: There seem to be a lot of global variables that aren’t reliable.

Are you cloning the Sword here? Because if SwordClone is an Instance, calling it with no arguments should create an error.

That’s the thing, I do not have a error in the console.

What is BoostValue?
Also, for checking if they are one of the characters added you could use CollectionService.

Edit @snorebear
This makes it so if there is no spawn point for the player to go to, it will print out. “SpawnPoints not found!”

Boost Value is basically the reward the players get if they were to win the match.

If you intend to give all the players the sword and teleport them you should put the code to give them the sword and teleport them in the for loop.
Also Instance.new(“BoostValue”) will always error, BoostValue is not a class that exists.

Are you able to help, I was following the code from a Youtuber, strange it messed up. I did change a bit myself.

In your script you have a line waiting for players:

repeat wait(1) until game.Players.NumPlayers >= 2

I do not see a defined variable for NumPlayers, if I am reading this correctly.

So what should I put? If you are able to help me. :slight_smile:

Also, why are you using WaitForChild and NumPlayers?
NumPlayers is deprecated. You should only need to use WaitForChild if you can’t guarantee the object will exist when the script is running. (ex: object in StarterGui, an object created in another script, or the script being in ReplicatedFirst)
Instead of using NumPlayers, you could use GetPlayers

local Players = game:GetService"Players"
local function getnumplayers()
return #Players:GetPlayers()
end

Also, i’m confused about this, because the code inside of the if statement will never run.

not “SpawnPoint” will always be false, if you want it to see if the spawnpoints exist then you should change it to:

if not SpawnPoints then

Because SpawnPoints will be nil if the SpawnPoints object doesn’t exist, so it will run under the condition there is no child named “SpawnPoints” under the ClonedMap.

Can you quote that area for me, just checked my code, all I see is Status.Value = “Waiting for enough players”
repeat wait(1) until game.Players.NumPlayers >= 2

Is that what you want me to change?

Yes, something like this would do.

local Players = game:GetService"Players"
local function getnumplayers()
return #Players:GetPlayers()
end
while getnumplayers() < 2 do wait(1) end

Should I just change that whole line with that?

What exactly are you using to see the errors, from what I see through this code you should be getting tons of errors.

If you are using the Developer Console, make sure you are looking in the Server Log. However for studio I recommend using the Output.

Preferably, you would define the function and the Players service above the loop you use for the game.

As I did state, I was using a video to help me through. I was using @Alvin_Blox actually.

I want the game to have 2 or more players… How do I put that in code? :wink: