Why Does This Not Work...?

Hey guys, so I’ve made a working round system. It works perfectly, and there is a team system involved with it.

The only thing is though, for some reason the winning team, after the round ends and they win, they go back to the neutral team (as planned) but the losing team doesn’t go back to the neutral team for some reason. Any ideas why?

local ServerStorage = game:GetService("ServerStorage")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Players = game:GetService("Players")

local Maps = ServerStorage:WaitForChild('Maps'):GetChildren()
local Status = ReplicatedStorage:WaitForChild('Status')
while true do
  	
	
	--Intermission
	
	local Countdown = 20 -- intermission, make this as long as you want
	
	repeat wait(1)
		Countdown = Countdown - 1
		
		Status.Value = 'Intermission : '..Countdown
	until Countdown <= 0
	
	--Choose the map.
	
	Status.Value = 'Choosing Map...'
	
	local ChosenMap = Maps[math.random(1, #Maps)]:Clone()
    wait(0.5)
	local VSpawns = ChosenMap:FindFirstChild('VikingSpawns'):GetChildren() --You need to create this in your map
	local SSpawns = ChosenMap:FindFirstChild('SamuraiSpawns'):GetChildren() --You need to create this in your map
	local KSpawns = ChosenMap:FindFirstChild('KnightSpawns'):GetChildren() --You need to create this in your map

	wait(3) -- little pause, make this as long as you want
	
	ChosenMap.Parent = workspace
	Status.Value = 'Map chosen, teleporting players.'
	
	wait(2) -- little pause, make this as long as you want

	--teleport the players
	
	local playersInRound = {} -- track alive players
	local teams = {
		[1] = {}, -- Samurai
		[2] = {}, -- Vikings
		[3] = {} -- Knights
	}
	local iterator = math.random(1,3) -- Randomly choose the first team to fill
	local samuraiTeam = game:GetService("Teams"):FindFirstChild("Samurai") --Make sure this points to the correct team
	local vikingsTeam = game:GetService("Teams"):FindFirstChild("Vikings") --Make sure this points to the correct team
	local knightsTeam = game:GetService("Teams"):FindFirstChild("Knights") --Make sure this points to the correct team
	local neutralTeam = game:GetService("Teams"):FindFirstChild("Neutral") --Make sure this points to the correct team
	
	local connections = {} -- store connections to disconnect later
	for _, Player in pairs(Players:GetChildren()) do
		if Player.Character and Player.Character:FindFirstChild('Humanoid') then
			local team = nil
			table.insert(playersInRound, Player) -- add all players to table
			
			--Fill the teams
			if iterator > 3 then
				iterator = 1
			end
			
			if iterator == 1 then
				table.insert(teams[iterator], Player)
				local RandomSpawn = SSpawns[math.random(1, #SSpawns)]
				Player.Character.HumanoidRootPart.CFrame = RandomSpawn.CFrame
				Player.Team = samuraiTeam
			elseif iterator == 2 then
				table.insert(teams[iterator], Player)
				local RandomSpawn = VSpawns[math.random(1, #VSpawns)]
				Player.Character.HumanoidRootPart.CFrame = RandomSpawn.CFrame
				Player.Team = vikingsTeam
			else
				table.insert(teams[iterator], Player)
				local RandomSpawn = KSpawns[math.random(1, #KSpawns)]
				Player.Character.HumanoidRootPart.CFrame = RandomSpawn.CFrame
				Player.Team = knightsTeam
			end
			
			connections[Player.Name] = Player.Character.Humanoid.Died:Connect(function()
				table.remove(playersInRound, table.find(playersInRound, Player))
				
				--Find which team and remove the player from the team
				for i=1, 3 do
					if table.find(teams[i], Player) then
						table.remove(teams[i], table.find(teams[i], Player))
					end
				end
			end)
			
			iterator += 1
		end
	end
	
	connections["Removing"] = game.Players.PlayerRemoving:Connect(function(player) -- remove player from list if they leave
		local ind = table.find(playersInRound, player)
		if ind then
			table.remove(playersInRound, ind)
			--Find which team and remove the player from the team
			for i=1, 3 do
				if table.find(teams[i], player) then
					table.remove(teams[i], table.find(teams[i], player))
				end
			end
		end
	end)
	
	Countdown = 5 -- Starting Round In, make this as long as you want
	
	repeat wait(1)
		Countdown = Countdown - 1
		
		Status.Value = 'Starting Round in : '..Countdown
	until Countdown <= 0
	
	Countdown = 60 -- Game Time
	
	repeat wait(1)
		Countdown = Countdown - 1
		
		Status.Value = 'Ingame : '..Countdown
	until Countdown <= 0 or #playersInRound == 0 or (#teams[1] == 0 and #teams[2] == 0) or (#teams[1] == 0 and #teams[3] == 0) or (#teams[2] == 0 and #teams[3] == 0) 

    -- Determine winner and give reward
    if (#teams[2] == 0 and #teams[3] == 0) and #teams[1] > 0 then -- Samurai won
		    local success, message = pcall(function()
	        Status.Value = "Samurai won the game!"
            wait(3)
			local playerList = Players:GetChildren()
			for i=1, #playerList do
				local player = playerList[i]
				if player.Team == samuraiTeam then
		            print("The Winner is: " .. player.Name)
		            player.leaderstats.Wins.Value = player.leaderstats.Wins.Value + 1
					player.leaderstats.Denarius.Value = player.leaderstats.Denarius.Value + 100
					player.Team = neutralTeam
				end
			end
        end)
        if not success then
            warn("An error occurred while rewarding winner: " .. message)
        end
    elseif (#teams[1] == 0 and #teams[3] == 0) and #teams[2] > 0 then -- Vikings won
		    local success, message = pcall(function()
			        Status.Value = "Vikings won the game!"
                    wait(3)
			local playerList = Players:GetChildren()
			for i=1, #playerList do
				local player = playerList[i]
				if player.Team == vikingsTeam then
		            print("The Winner is: " .. player.Name)
		            player.leaderstats.Wins.Value = player.leaderstats.Wins.Value + 1
					player.leaderstats.Denarius.Value = player.leaderstats.Denarius.Value + 100
					player.Team = neutralTeam
				end
			end
        end)
        if not success then
            warn("An error occurred while rewarding winner: " .. message)
        end
    elseif (#teams[1] == 0 and #teams[2] == 0) and #teams[3] > 0 then -- Knights won
		    local success, message = pcall(function()
	        Status.Value = "Knights won the game!"
            wait(3)
			local playerList = Players:GetChildren()
			for i=1, #playerList do
				local player = playerList[i]
				if player.Team == knightsTeam then
		            print("The Winner is: " .. player.Name)
		            player.leaderstats.Wins.Value = player.leaderstats.Wins.Value + 1
					player.leaderstats.Denarius.Value = player.leaderstats.Denarius.Value + 100
					player.Team = neutralTeam
				end
			end
        end)
        if not success then
            warn("An error occurred while rewarding winner: " .. message)
        end
    else
        print("There was no winner.")
        Status.Value = "There was a stalemate this round"
        wait(3)
    end

	--Kill the players
	for _, connection in pairs(connections) do -- disconnect connections to prevent memory leaks
		connection:Disconnect()
	end
	
	for _, Player in pairs(playersInRound)do
		Player.Team = neutralTeam
		Player:LoadCharacter()
	end
	
	ChosenMap:Destroy()
	
	Status.Value = 'Round Ended, waiting for new game.'

	
	wait(4) -- little pause, make this as long as you want.
	
end

Sorry if the code is a bit long, but if I could have some help on this it would be greatly appreciated. Thankyou!

Ok, so heres my code:

local ServerStorage = game:GetService("ServerStorage")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local Players = game:GetService("Players")

local Maps = ServerStorage:WaitForChild('Maps'):GetChildren()
local Status = ReplicatedStorage:WaitForChild('Status')
while true do
  	
	
	--Intermission
	
	local Countdown = 20 -- intermission, make this as long as you want
	
	repeat wait(1)
		Countdown = Countdown - 1
		
		Status.Value = 'Intermission : '..Countdown
	until Countdown <= 0
	
	--Choose the map.
	
	Status.Value = 'Choosing Map...'
	
	local ChosenMap = Maps[math.random(1, #Maps)]:Clone()
    wait(0.5)
	local VSpawns = ChosenMap:FindFirstChild('VikingSpawns'):GetChildren() --You need to create this in your map
	local SSpawns = ChosenMap:FindFirstChild('SamuraiSpawns'):GetChildren() --You need to create this in your map
	local KSpawns = ChosenMap:FindFirstChild('KnightSpawns'):GetChildren() --You need to create this in your map

	wait(3) -- little pause, make this as long as you want
	
	ChosenMap.Parent = workspace
	Status.Value = 'Map chosen, teleporting players.'
	
	wait(2) -- little pause, make this as long as you want

	--teleport the players
	
	local playersInRound = {} -- track alive players
	local teams = {
		[1] = {}, -- Samurai
		[2] = {}, -- Vikings
		[3] = {} -- Knights
	}
	local iterator = math.random(1,3) -- Randomly choose the first team to fill
	local samuraiTeam = game:GetService("Teams"):FindFirstChild("Samurai") --Make sure this points to the correct team
	local vikingsTeam = game:GetService("Teams"):FindFirstChild("Vikings") --Make sure this points to the correct team
	local knightsTeam = game:GetService("Teams"):FindFirstChild("Knights") --Make sure this points to the correct team
	local neutralTeam = game:GetService("Teams"):FindFirstChild("Neutral") --Make sure this points to the correct team
	
	local connections = {} -- store connections to disconnect later
	for _, Player in pairs(Players:GetChildren()) do
		if Player.Character and Player.Character:FindFirstChild('Humanoid') then
			local team = nil
			table.insert(playersInRound, Player) -- add all players to table
			
			--Fill the teams
			if iterator > 3 then
				iterator = 1
			end
			
			if iterator == 1 then
				table.insert(teams[iterator], Player)
				local RandomSpawn = SSpawns[math.random(1, #SSpawns)]
				Player.Character.HumanoidRootPart.CFrame = RandomSpawn.CFrame
				Player.Team = samuraiTeam
			elseif iterator == 2 then
				table.insert(teams[iterator], Player)
				local RandomSpawn = VSpawns[math.random(1, #VSpawns)]
				Player.Character.HumanoidRootPart.CFrame = RandomSpawn.CFrame
				Player.Team = vikingsTeam
			else
				table.insert(teams[iterator], Player)
				local RandomSpawn = KSpawns[math.random(1, #KSpawns)]
				Player.Character.HumanoidRootPart.CFrame = RandomSpawn.CFrame
				Player.Team = knightsTeam
			end
			
			connections[Player.Name] = Player.Character.Humanoid.Died:Connect(function()
				table.remove(playersInRound, table.find(playersInRound, Player))
				
				--Find which team and remove the player from the team
				for i=1, 3 do
					if table.find(teams[i], Player) then
						table.remove(teams[i], table.find(teams[i], Player))
					end
				end
			end)
			
			iterator += 1
		end
	end
	
	connections["Removing"] = game.Players.PlayerRemoving:Connect(function(player) -- remove player from list if they leave
		local ind = table.find(playersInRound, player)
		if ind then
			table.remove(playersInRound, ind)
			--Find which team and remove the player from the team
			for i=1, 3 do
				if table.find(teams[i], player) then
					table.remove(teams[i], table.find(teams[i], player))
				end
			end
		end
	end)
	
	Countdown = 5 -- Starting Round In, make this as long as you want
	
	repeat wait(1)
		Countdown = Countdown - 1
		
		Status.Value = 'Starting Round in : '..Countdown
	until Countdown <= 0
	
	Countdown = 60 -- Game Time
	
	repeat wait(1)
		Countdown = Countdown - 1
		
		Status.Value = 'Ingame : '..Countdown
	until Countdown <= 0 or #playersInRound == 0 or (#teams[1] == 0 and #teams[2] == 0) or (#teams[1] == 0 and #teams[3] == 0) or (#teams[2] == 0 and #teams[3] == 0) 

    -- Determine winner and give reward
    if (#teams[2] == 0 and #teams[3] == 0) and #teams[1] > 0 then -- Samurai won
		    local success, message = pcall(function()
	        Status.Value = "Samurai won the game!"
            wait(3)
			local playerList = Players:GetChildren()
			for i=1, #playerList do
				local player = playerList[i]
				if player.Team == samuraiTeam then
		            print("The Winner is: " .. player.Name)
		            player.leaderstats.Wins.Value = player.leaderstats.Wins.Value + 1
					player.leaderstats.Denarius.Value = player.leaderstats.Denarius.Value + 100
					player.Team = neutralTeam
				end
			end
        end)
        if not success then
            warn("An error occurred while rewarding winner: " .. message)
        end
    elseif (#teams[1] == 0 and #teams[3] == 0) and #teams[2] > 0 then -- Vikings won
		    local success, message = pcall(function()
			        Status.Value = "Vikings won the game!"
                    wait(3)
			local playerList = Players:GetChildren()
			for i=1, #playerList do
				local player = playerList[i]
				if player.Team == vikingsTeam then
		            print("The Winner is: " .. player.Name)
		            player.leaderstats.Wins.Value = player.leaderstats.Wins.Value + 1
					player.leaderstats.Denarius.Value = player.leaderstats.Denarius.Value + 100
					player.Team = neutralTeam
				end
			end
        end)
        if not success then
            warn("An error occurred while rewarding winner: " .. message)
        end
    elseif (#teams[1] == 0 and #teams[2] == 0) and #teams[3] > 0 then -- Knights won
		    local success, message = pcall(function()
	        Status.Value = "Knights won the game!"
            wait(3)
			local playerList = Players:GetChildren()
			for i=1, #playerList do
				local player = playerList[i]
				if player.Team == knightsTeam then
		            print("The Winner is: " .. player.Name)
		            player.leaderstats.Wins.Value = player.leaderstats.Wins.Value + 1
					player.leaderstats.Denarius.Value = player.leaderstats.Denarius.Value + 100
					player.Team = neutralTeam
				end
			end
        end)
        if not success then
            warn("An error occurred while rewarding winner: " .. message)
        end
    else
        print("There was no winner.")
        Status.Value = "There was a stalemate this round"
        wait(3)
    end

	--Kill the players
	for _, connection in pairs(connections) do -- disconnect connections to prevent memory leaks
		connection:Disconnect()
	end
	
	for _, Player in pairs(Players:GetPlayers()) do
	if (not Player.Team == neutralTeam) then
		Player.Team = neutralTeam
		Player:LoadCharacter()
	end
end
	
	ChosenMap:Destroy()
	
	Status.Value = 'Round Ended, waiting for new game.'

	
	wait(4) -- little pause, make this as long as you want.
	
end

Sadly it still fails to work. @Trioxide

any errors?

30 characters

Let’s replace this

for _, Player in pairs(Players:GetPlayers()) do
	if (not Player.Team == neutralTeam) then
		Player.Team = neutralTeam
		Player:LoadCharacter()
	end
end

with

for _, Player in pairs(Players:GetPlayers()) do
	Player.Team = neutralTeam
	Player:LoadCharacter()
end

This should do the trick.

5 Likes