Scripting Helpers is winding down operations and is now read-only. More info→
Ad
Log in to vote
0

Help With Spawning?

Asked by
Scootakip 299 Moderation Voter
7 years ago
for i,player in pairs(game.Players:GetPlayers())do
    local num = math.random(6)
    local torso=player.Character:FindFirstChild("Torso")
    if torso then
    if player.TeamColor == BrickColor.new("Really blue") then
       if num == 1 then
            torso.CFrame=CFrame.new(game.Workspace.City.BlueSpawns.Spawn1.Position + Vector3.new(0,i*5,0))
        elseif num == 2 then
            torso.CFrame=CFrame.new(game.Workspace.City.BlueSpawns.Spawn2.Position + Vector3.new(0,i*5,0))
        elseif num == 3 then
            torso.CFrame=CFrame.new(game.Workspace.City.BlueSpawns.Spawn3.Position + Vector3.new(0,i*5,0))
        elseif num == 4 then
            torso.CFrame=CFrame.new(game.Workspace.City.BlueSpawns.Spawn4.Position + Vector3.new(0,i*5,0))
        elseif num == 5 then
            torso.CFrame=CFrame.new(game.Workspace.City.BlueSpawns.Spawn5.Position + Vector3.new(0,i*5,0))
        elseif num == 6 then
            torso.CFrame=CFrame.new(game.Workspace.City.BlueSpawns.Spawn6.Position + Vector3.new(0,i*5,0))
end
    end
end 

    end

This script basically has each player get a random spawn to go to. However, I'd like to know if there's a good way to make it so that two players can't get assigned the same spawn. I'd appreciate some help with this.

1 answer

Log in to vote
1
Answered by
BlueTaslem 18071 Moderation Voter Administrator Community Moderator Super Administrator
7 years ago
Edited 7 years ago

First, cleanup.

  • Tab and space your code correctly!
  • Use workspace instead of game.Workspace to save yourself a lot of typing and reading
  • Don't repeat yourself:

When you find yourself doing something like Spawn1, Spawn2, Spawn3, it means it's time to use a list.

Supposing that BlueSpawns is just those 6 spawn locations, you can easily get a list of them using :GetChildren():

-- List of all spawns:
local potentialSpawns = workspace.City.BlueSpawns:GetChildren()

for i, player in pairs(game.Players:GetPlayers()) do
    local torso = player.Character:FindFirstChild("Torso")
    if torso then
        if player.TeamColor == BrickColor.new("Really blue") then
            -- Pick a random spawn from the list:
            local index = math.random(#potentialSpawns)
            local randomSpawn = potentialSpawns[index]
            -- Move to that random choice:
            torso.CFrame = CFrame.new(randomSpawn.Position + Vector3.new(0, i*5, 0))
        end
    end 
end

This code does the same thing that your code does, but it's better formatted and half the length. This makes it much easier to start with!

Don't repeat spawns

The behavior that you want is

"two players can't get assigned to the same spawn".

We can state this in a slightly more specific way:

Once a spawn has been chosen, that spawn should not be chosen again

We need to somehow "disable" that spawn from being selected again. Since right now we're just choosing a random thing from potentialSpawns, the easiest way is to remove that from potentialSpawns once we pick it.

In fact, that requires only one very small change to do:

local potentialSpawns = workspace.City.BlueSpawns:GetChildren()

for _, player in pairs(game.Players:GetPlayers()) do
    local torso = player.Character:FindFirstChild("Torso")
    if torso then
        if player.TeamColor == BrickColor.new("Really blue") then
            local index = math.random(#potentialSpawns)
            -- give table.remove an index, and it gives you what WAS there
            -- and simultaneously removes it:
            local randomSpawn = table.remove(potentialSpawns, index)
            -- since you can't repeat spawns, no need for that i*5
            torso.CFrame = CFrame.new(randomSpawn.Position + Vector3.new(0, 5, 0))
        end
    end 
end

You'll of course run into issues if there are more players on this team than spawns -- be extremely careful that that does not happen -- or deal with it directly.

Ad

Answer this question