Coding help regarding team sorting

Hi, I hope the following code makes sense. I have set up a round based game where the first player is set as the main character (team x) then removed from table.
I then created a for loop to distribute the remaining players in the remaining two teams. However, when starting the game, the players successfully switch from the lobby to the game, and the chosen player is successfuly set as team x, however the program only seems to execute the final ‘else’ statement when testing the game with 6 overall players- meaning 1 player goes to team x and the rest to team z.
Any clue why this is? (I suspect it is an error with my syntax)
Thanks
local Players = game.Players:GetPlayers()
local players = teams.Lobby:GetPlayers()

-- Sort first role

local index = math.random(1,#players) 
players[index].Team = teams["x"] 
table.remove(players,index) 

-- Sort Remaining Players

for i, player in ipairs (players) do
	if players == 5 then
		player1 = math.random(1,#players)
		player[player1].Team = teams["y"]
		table.remove(players, player1)
		player2 = math.random(1,#players)
		player[player2].Team = teams["y"]
		table.remove(players, player2)
		player3 = math.random(1,#players)
		player[player3].Team = teams["y"]
		table.remove(players, player3)
		player.Team = teams["z"] -- rest of the players set to this team
	elseif players == 6 then
		player1 = math.random(1,#players)
		player[player1].Team = teams["y"]
		table.remove(players, player1)
		player2 = math.random(1,#players)
		player[player2].Team = teams["y"]
		table.remove(players, player2)
		player3 = math.random(1,#players)
		player[player3].Team = teams["y"]
		table.remove(players, player3)
		player4 = math.random(1,#players)
		player[player4].Team = teams["y"]
		table.remove(players, player4)
		player.Team = teams["z"] -- rest of the players set to this team
	else	-- Just put this in to complete the statement flow
		player.Team = teams["z"]
	end
end

The reason why it’s using the last else statement is because players is not equal to 5 or 6. The code is seeing players as a table and not a number so that’s why. What you want to do instead is

if table.getn(players) == number then

or

if #players == number then

From what I can see in your code, you want to team a random player into x, team the remaining players - 2 in y and the rest into z, can’t you do this instead?

local Players = game.Players:GetPlayers()
local players = teams.Lobby:GetPlayers()
local teams = game:GetService("Teams")

-- Sort first role

local index = math.random(#players) 
players[index].Team = teams["x"] 
table.remove(players,index) 

-- Sort Remaining Players

local total = #players

for i = 1, (total - 2) do
	randIndex = math.random(#players)
	players[randIndex].Team = teams["y"]
	table.remove(players, randIndex)
end

for i, player in ipairs(players) do
	player.Team = teams["z"]
end

And yes @B2ontwitch is correct about that because you’re checking if a table is equal to a number, you forgot to do the length operation

Im assume you were doing that for y because the total was 5, you teamed 3, when it was 6, you teamed 4

Hi, when implementing these changes, the lobby → game function seems to break, as only the first player is assigned to team x- and the rest stay in the lobby. Any clue why?

This works, thank you very much!

1 Like

Anytime! If you have more questions or issues don’t be afraid to make another post!

Hi, just quickly i forgot to ask, this works for a set number of players. The main idea i had is for the lobby to be able to host a maximum of 10 players, and the game would start after a while at a minimum of 6 players. How would i go about improving this code to cater for additional situations (as when the players get to say 10, i would like more than just 2 players on team z aka i would like to alter the split e.g. 1x 5y 3z)

Are oyu planning on adding a maximum amount of players in all teams? So like, there can be a maximum of 5 people in the Y team, you can’t have 6 or more

ps i am currently attempting a code I will let you know if it is successful.

I have managed to make it work for a different number of players! thank you for your help!
-Additionally, do you have any idea if you can send players to multiple c frames when loading the game as opposed to one? as it seems funny when the players all sit on top of eachothers heads when waiting to get into the map. This is the current code:

function teleportPlayers()
local players = game.Players:GetPlayers()
for i,v in pairs(players) do
v.Character.HumanoidRootPart.CFrame = currentmap:FindFirstChild(chosenmap.Value).Palace.Spawn.CFrame
end
end

You can put multiple spawns in your map and have it randomly choose one of those spawns and set the RootPart’s CFrame to the randomly chosen spawn

Put the Spawns in a folder

1 Like