SpawnLocation
*Ta zawartość została przetłumaczona przy użyciu narzędzi AI (w wersji beta) i może zawierać błędy. Aby wyświetlić tę stronę w języku angielskim, kliknij tutaj.
Lokalizacje odrodzenia, lub "odrodzenia" określają, gdzie Player odrodzi się po śmierci.Można je skonfigurować, aby pozwolić tylko niektórym graczom korzystać z każdego spawnu, używając Teams .Kontrolują one również, jak ForceFields są skonfigurowane dla nowo powstałych graczy.
Miejsca spawnu mogą być używane jako punkty kontrolne, tak jak w przeszkodzie, za pomocą właściwości SpawnLocation.AllowTeamChangeOnTouch, więc gdy gracz je dotknie, zmieni drużynę na drużynę SpawnLocation.W tym przypadku tylko pierwszy Team powinien mieć ustawiony Team.AutoAssignable na prawdę, inaczej gracze nie rozpoczną na pierwszym punktu kontrolnym.
Zauważ, czy SpawnLocation zostanie dodany do Workspace w Studio z ustawieniem SpawnLocation.Neutral na fałsz, zostanie utworzona drużyna odpowiadająca SpawnLocation.TeamColor jeśli nie istnieje już.Zachowanie to nie występuje, gdy spawny są tworzone w grze za pomocą Script lub jeśli właściwości SpawnLocation zostaną zmienione po ich już dodaniu.Zaleca się, aby programiści zawsze ręcznie tworzyli swoje zespoły i nie polegali na tym zachowaniu.
Generowanie zasad
Istnieje kilka zasad, które wchodzą w grę dla danego SpawnLocation, gdy gracz odrodzi się:
- Gdy jest ustawiony na fałsz tylko z pasującym odrodzą się ponad nim
- Gdy SpawnLocation.Neutral jest ustawione na prawdę, każdy gracz może wygenerować ponad nim niezależnie od SpawnLocation.TeamColor
- Jeśli wiele prawidłowych odrodzeń jest dostępnych dla Player, losowe zostanie wybrane
- Gracze pojawią się w różnych punktach na szczycie SpawnLocation, ale obecnie nadal mogą pojawiać się na wierzchu siebie nawzajem, jeśli pojawią się tuż po sobie
Zobacz także:
- Jeśli chcesz skonfigurować, jak długo potrwa odrodzenie gracza, przyjrzyj się właściwości RespawnTime
Przykłady kodu
This sample demonstrates how SpawnLocations can be used to make a checkpoint system. Typically this would be done Studio and not in Lua, but this example serves as a comprehensive example of what Team and SpawnLocation properties need to be used to achieve this setup.
local Teams = game:GetService("Teams")
-- create start team (AutoAssignable = true)
local startTeam = Instance.new("Team")
startTeam.Name = "Start"
startTeam.AutoAssignable = true
startTeam.TeamColor = BrickColor.new("White")
startTeam.Parent = Teams
-- create checkpoint teams (Autoassignable = false), ensuring all TeamColors are unique
local team1 = Instance.new("Team")
team1.Name = "Checkpoint 1"
team1.AutoAssignable = false
team1.TeamColor = BrickColor.new("Bright blue")
team1.Parent = Teams
local team2 = Instance.new("Team")
team2.Name = "Checkpoint 2"
team2.AutoAssignable = false
team2.TeamColor = BrickColor.new("Bright green")
team2.Parent = Teams
local team3 = Instance.new("Team")
team3.Name = "Checkpoint 2"
team3.AutoAssignable = false
team3.TeamColor = BrickColor.new("Bright red")
team3.Parent = Teams
-- create spawns
local startSpawn = Instance.new("SpawnLocation")
startSpawn.Anchored = true
startSpawn.Size = Vector3.new(5, 1, 5)
startSpawn.Neutral = false
startSpawn.AllowTeamChangeOnTouch = false
startSpawn.TeamColor = startTeam.TeamColor
startSpawn.BrickColor = startTeam.TeamColor
startSpawn.Parent = game.Workspace
local team1Spawn = Instance.new("SpawnLocation")
team1Spawn.Anchored = true
team1Spawn.Size = Vector3.new(5, 1, 5)
team1Spawn.Neutral = false
team1Spawn.AllowTeamChangeOnTouch = true
team1Spawn.TeamColor = team1.TeamColor
team1Spawn.BrickColor = team1.TeamColor
team1Spawn.Parent = game.Workspace
local team2Spawn = Instance.new("SpawnLocation")
team2Spawn.Anchored = true
team2Spawn.Size = Vector3.new(5, 1, 5)
team2Spawn.Neutral = false
team2Spawn.AllowTeamChangeOnTouch = true
team2Spawn.TeamColor = team2.TeamColor
team2Spawn.BrickColor = team2.TeamColor
team2Spawn.Parent = game.Workspace
local team3Spawn = Instance.new("SpawnLocation")
team3Spawn.Anchored = true
team3Spawn.Size = Vector3.new(5, 1, 5)
team3Spawn.Neutral = false
team3Spawn.AllowTeamChangeOnTouch = true
team3Spawn.TeamColor = team3.TeamColor
team3Spawn.BrickColor = team3.TeamColor
team3Spawn.Parent = game.Workspace
-- position spawns
startSpawn.CFrame = CFrame.new(0, 0.5, 0)
team1Spawn.CFrame = CFrame.new(10, 0.5, 0)
team2Spawn.CFrame = CFrame.new(20, 0.5, 0)
team3Spawn.CFrame = CFrame.new(30, 0.5, 0)
Podsumowanie
Właściwości
Pozwala Player dołączyć do zespołu, dotykając SpawnLocation.Gdy ustawiono na prawdę, jeśli znak Player wchodzi w kontakt z SpawnLocation, gracz Player.TeamColor zostanie ustawiony na SpawnLocation.TeamColor.
Długość czasu, w sekundach, które ForceField zostaną zastosowane do Player postaci generującej się w tej SpawnLocation .Jeśli czas trwania wynosi zero, ForceField nie jest nigdy tworzony i nie uruchomi wydarzeń Instance.DescendantAdded lub Instance.ChildAdded.
Ustawia, czy SpawnLocation jest włączone, czy nie.Gdy wyłączono graczy nie mogą pojawić się w SpawnLocation i funkcja AllowTeamChangeOnTouch jest wyłączona.
Czy SpawnLocation jest powiązany z określoną drużyną, czy nie.Oznacza to, że każdy Player, z dowolnego Team, może się na nim pojawić, jeśli ta właściwość jest ustawiona na prawdę.
Ustawia, do jakiego zespołu SpawnLocation należy.Jeśli właściwość SpawnLocation.Neutral jest fałszywa, tylko Players z tą samą Player.TeamColor jak kolor zespołu zrodzenia będzie mógł się tam pojawić.
Ustawia ogólną formę obiektu.
Określa, czy część jest nieruchoma z fizyki.
Prędkość kątowa montażu części.
Centrum masy złożenia części w przestrzeni świata.
Liniowa prędkość montażu części.
Całkowita masa montażu części.
Odwołanie do części korzeniowej zbioru.
Określa rodzaj powierzchni dla tylnej strony części (+ kierunek Z).
Określa rodzaj powierzchni dla dolnej strony części (-Y kierunek).
Określa kolor części.
Określa pozycję i orientację BasePart w świecie.
Określa, czy część może zderzyć się z innymi częściami.
Określa, czy część jest rozważana podczas operacji zapytania przestrzennego.
Określa, czy zdarzenia Touched i TouchEnded wystrzelają z części.
Określa, czy część rzuca cień, czy nie.
Opisuje pozycję świata, w której znajduje się centrum masy części.
Opisuje nazwę grupakolizji części.
Określa kolor części.
Wskazuje aktualne właściwości fizyczne części.
Określa kilka fizycznych właściwości części.
Używany do włączania lub wyłączania sił aerodynamicznych na częściach i zespołach.
Rzeczywisty rozmiar fizyczny BasePart zgodnie z silnikiem fizycznym.
Określa rodzaj powierzchni dla przodu części (-Z kierunek).
Określa rodzaj powierzchni dla lewej strony części (-X kierunek).
Określa mnożnik dla BasePart.Transparency, który jest widoczny tylko dla lokalnego klienta.
Określa, czy część jest wybieralna w Studio.
Opisuje masę części, produkt jej gęstości i objętości.
Określa, czy część przyczynia się do całkowitej masy lub bezwładności jej twardego ciało.
Określa teksturę i domyślne właściwości fizyczne części.
Nazwa MaterialVariant.
Opisuje rotację części w świecie.
Określa przesunięcie osi części od jej CFrame.
Opisuje pozycję części w świecie.
Czas od ostatniej rejestrowanej aktualizacjafizyki.
Określa, ile część odzwierciedla niebo.
Opisuje najmniejszą zmianę rozmiaru dozwoloną przez metodę Skalowanie.
Opisuje twarze, na których można zmienić rozmiar części.
Określa rodzaj powierzchni dla prawej strony części (+X kierunek).
Główna zasada określania głównej części złożenia.
Rotacja części w stopniach dla trzech osi.
Określa wymiary części (długość, szerokość, wysokość).
Określa rodzaj powierzchni dla górnej części części (+ kierunek Y).
Określa, jak dużo część może być widoczna poprzez (odwrotność przeźroczystości części).
Metody
Metody odziedziczeni z: BasePartZastosuj impuls kątowy do złożenia.
Zastosuj impuls do zgromadzenia na zgromadzeniu center of mass .
Zastosuj impuls do złożenia w określonej pozycji.
Zwraca, czy części mogą się ze sobą zderzać.
Sprawdza, czy możesz ustawić własność sieci części.
Zwraca tabelę części połączonych z obiektem za pomocą dowolnego rodzaju sztywnego stawu.
Zwróć wszystkie stawy lub ograniczenia, które są połączone z tą częścią.
Zwraca wartość właściwości Mass .
Zwraca obecnego gracza, który jest właścicielem sieci tej części lub nil w przypadku serwera.
Zwraca prawdę, jeśli silnik gry automatycznie decyduje o właścicielu sieci dla tej części.
Zwraca podstawową część zespołu części.
Zwraca tabelę wszystkich BasePart.CanCollide prawdziwych części, które się z tym częścią pokrywają.
Zwraca liniową prędkość montażu części w danym położeniu względem tej części.
Wyświetla prawdę, jeśli obiekt jest połączony z częścią, która go utrzyma w miejscu (np. częścią Anchored), w przeciwnym razie wyświetla fałsz.
Zmienia rozmiar obiektu tak jak za pomocą narzędzia przesuwania rozmiaru Studio.
Ustawia danego gracza jako właściciela sieci dla tej i wszystkich połączonych części.
Pozwala silnikowi gry dynamicznie decydować, kto będzie zajmował się fizyką części (jeden z klientów lub serwer).
- IntersectAsync(parts : Instances,collisionfidelity : Enum.CollisionFidelity,renderFidelity : Enum.RenderFidelity):Instance
Tworzy nową IntersectOperation z pokrywającej się geometrii części i innych części w danym obszarze.
- SubtractAsync(parts : Instances,collisionfidelity : Enum.CollisionFidelity,renderFidelity : Enum.RenderFidelity):Instance
Tworzy nowy UnionOperation z części, odejmując geometrię zajętą przez części w danym array.
- UnionAsync(parts : Instances,collisionfidelity : Enum.CollisionFidelity,renderFidelity : Enum.RenderFidelity):Instance
Tworzy nowy UnionOperation z części, plus geometrię zajętą przez części w danym array.
Otrzymuje pivot z PVInstance .
Przekształca PVInstance wraz z całym jego potomkiem PVInstances tak, że osie zostaną teraz umieszczone w określonym CFrame .
Zdarzenia
Zdarzenia odziedziczeni z: BasePartWypala się, gdy część przestaje dotykać innej części w wyniku ruchu fizycznego.
Wypala się, gdy część dotyka innej części w wyniku ruchu fizycznego.
Właściwości
AllowTeamChangeOnTouch
Pozwala Player dołączyć do zespołu, dotykając SpawnLocation.Gdy ustawiono na prawdę, jeśli znak Player wchodzi w kontakt z SpawnLocation, gracz Player.TeamColor zostanie ustawiony na SpawnLocation.TeamColor.Player.Neutral zostanie również ustawiony na SpawnLocation.Neutral po kontaktować się, co oznacza, że gracz może również stać się neutralny, dotykając lokalizacji spawnu.
Nie będzie to działać, gdy SpawnLocation.Enabled jest ustawione na fałsz.
Tworzenie punktów kontrolnych
Ta funkcja jest często używana do tworzenia punktów kontrolnych na torach przeszkód lub podobnych grach.
Przykłady kodu
This sample demonstrates how SpawnLocations can be used to make a checkpoint system. Typically this would be done Studio and not in Lua, but this example serves as a comprehensive example of what Team and SpawnLocation properties need to be used to achieve this setup.
local Teams = game:GetService("Teams")
-- create start team (AutoAssignable = true)
local startTeam = Instance.new("Team")
startTeam.Name = "Start"
startTeam.AutoAssignable = true
startTeam.TeamColor = BrickColor.new("White")
startTeam.Parent = Teams
-- create checkpoint teams (Autoassignable = false), ensuring all TeamColors are unique
local team1 = Instance.new("Team")
team1.Name = "Checkpoint 1"
team1.AutoAssignable = false
team1.TeamColor = BrickColor.new("Bright blue")
team1.Parent = Teams
local team2 = Instance.new("Team")
team2.Name = "Checkpoint 2"
team2.AutoAssignable = false
team2.TeamColor = BrickColor.new("Bright green")
team2.Parent = Teams
local team3 = Instance.new("Team")
team3.Name = "Checkpoint 2"
team3.AutoAssignable = false
team3.TeamColor = BrickColor.new("Bright red")
team3.Parent = Teams
-- create spawns
local startSpawn = Instance.new("SpawnLocation")
startSpawn.Anchored = true
startSpawn.Size = Vector3.new(5, 1, 5)
startSpawn.Neutral = false
startSpawn.AllowTeamChangeOnTouch = false
startSpawn.TeamColor = startTeam.TeamColor
startSpawn.BrickColor = startTeam.TeamColor
startSpawn.Parent = game.Workspace
local team1Spawn = Instance.new("SpawnLocation")
team1Spawn.Anchored = true
team1Spawn.Size = Vector3.new(5, 1, 5)
team1Spawn.Neutral = false
team1Spawn.AllowTeamChangeOnTouch = true
team1Spawn.TeamColor = team1.TeamColor
team1Spawn.BrickColor = team1.TeamColor
team1Spawn.Parent = game.Workspace
local team2Spawn = Instance.new("SpawnLocation")
team2Spawn.Anchored = true
team2Spawn.Size = Vector3.new(5, 1, 5)
team2Spawn.Neutral = false
team2Spawn.AllowTeamChangeOnTouch = true
team2Spawn.TeamColor = team2.TeamColor
team2Spawn.BrickColor = team2.TeamColor
team2Spawn.Parent = game.Workspace
local team3Spawn = Instance.new("SpawnLocation")
team3Spawn.Anchored = true
team3Spawn.Size = Vector3.new(5, 1, 5)
team3Spawn.Neutral = false
team3Spawn.AllowTeamChangeOnTouch = true
team3Spawn.TeamColor = team3.TeamColor
team3Spawn.BrickColor = team3.TeamColor
team3Spawn.Parent = game.Workspace
-- position spawns
startSpawn.CFrame = CFrame.new(0, 0.5, 0)
team1Spawn.CFrame = CFrame.new(10, 0.5, 0)
team2Spawn.CFrame = CFrame.new(20, 0.5, 0)
team3Spawn.CFrame = CFrame.new(30, 0.5, 0)
Duration
Długość czasu, w sekundach, które ForceField zostaną zastosowane do Player postaci generującej się w tej SpawnLocation .Jeśli czas trwania wynosi zero, ForceField nie jest nigdy tworzony i nie uruchomi wydarzeń Instance.DescendantAdded lub Instance.ChildAdded.
Domyślna wartość tej właściwości wynosi 10 sekund.
Funkcja czasu pozwala programistom łatwo udzielić Players ochrony przed "spawn killing", które może być frustrującym doświadczeniem dla graczy.Uwaga, ForceFields będzie chronić użytkowników tylko przed Explosions i bronią, która używa Humanoid:TakeDamage() do zadawania obrażeń lub w inny sposób sprawdzania ForceField.
Przykłady kodu
This sample will create a neutral SpawnLocation in the Workspace that'll give players spawning a ForceField for 20 seconds.
local spawnLocation = Instance.new("SpawnLocation")
spawnLocation.Anchored = true
spawnLocation.Size = Vector3.new(5, 1, 5)
spawnLocation.Neutral = true -- anyone can spawn here
spawnLocation.Duration = 20
spawnLocation.Parent = workspace
Enabled
Ustawia, czy SpawnLocation jest włączone, czy nie. Gdy jest wyłączone, gracze nie mogą się pojawić w SpawnLocation i funkcjonalność SpawnLocation.AllowTeamChangeOnTouch jest wyłączona.
Właściwość ta zapewnia najwygodniejszy sposób zapobiegania Players pojawieniu się na spawnie
Uwaga, chociaż zmiana zespołu na dotknięcie za pomocą SpawnLocation.AllowTeamChangeOnTouch jest wyłączona, gdy włączono prawdę do fałszu, inne dotknięte wydarzenia za pomocą BasePart.Touched nadal będą wystrzeliwane.
Przykłady kodu
The following sample will create a SpawnLocation in the Workspace that will become semi-transparent when it is disabled.
local spawnLocation = Instance.new("SpawnLocation")
spawnLocation.Anchored = true
spawnLocation.Size = Vector3.new(5, 1, 5)
spawnLocation.Neutral = true -- anyone can spawn here
spawnLocation.Enabled = true
spawnLocation.Parent = workspace
local function onEnabledChanged()
spawnLocation.Transparency = spawnLocation.Enabled and 0 or 0.5
end
spawnLocation:GetPropertyChangedSignal("Enabled"):Connect(onEnabledChanged)
task.wait(5)
spawnLocation.Enabled = false -- transparency = 0.5
Neutral
Czy spawn jest powiązany z określoną drużyną, czy nie.Oznacza to, że każdy Player, z dowolnego Team, może się na nim pojawić, jeśli ta właściwość jest ustawiona na prawdę.
Jeśli Neutral jest ustawiony na fałsz, tylko gracze, których Player.TeamColor jest równy SpawnLocation.TeamColor, mogą korzystać z SpawnLocation.
Jeśli SpawnLocation.AllowTeamChangeOnTouch jest prawdą, Player.Neutral zostanie ustawiony na tę właściwość po kontakcie ze spawnem.
Przykłady kodu
This sample demonstrates how SpawnLocations can be used to make a checkpoint system. Typically this would be done Studio and not in Lua, but this example serves as a comprehensive example of what Team and SpawnLocation properties need to be used to achieve this setup.
local Teams = game:GetService("Teams")
-- create start team (AutoAssignable = true)
local startTeam = Instance.new("Team")
startTeam.Name = "Start"
startTeam.AutoAssignable = true
startTeam.TeamColor = BrickColor.new("White")
startTeam.Parent = Teams
-- create checkpoint teams (Autoassignable = false), ensuring all TeamColors are unique
local team1 = Instance.new("Team")
team1.Name = "Checkpoint 1"
team1.AutoAssignable = false
team1.TeamColor = BrickColor.new("Bright blue")
team1.Parent = Teams
local team2 = Instance.new("Team")
team2.Name = "Checkpoint 2"
team2.AutoAssignable = false
team2.TeamColor = BrickColor.new("Bright green")
team2.Parent = Teams
local team3 = Instance.new("Team")
team3.Name = "Checkpoint 2"
team3.AutoAssignable = false
team3.TeamColor = BrickColor.new("Bright red")
team3.Parent = Teams
-- create spawns
local startSpawn = Instance.new("SpawnLocation")
startSpawn.Anchored = true
startSpawn.Size = Vector3.new(5, 1, 5)
startSpawn.Neutral = false
startSpawn.AllowTeamChangeOnTouch = false
startSpawn.TeamColor = startTeam.TeamColor
startSpawn.BrickColor = startTeam.TeamColor
startSpawn.Parent = game.Workspace
local team1Spawn = Instance.new("SpawnLocation")
team1Spawn.Anchored = true
team1Spawn.Size = Vector3.new(5, 1, 5)
team1Spawn.Neutral = false
team1Spawn.AllowTeamChangeOnTouch = true
team1Spawn.TeamColor = team1.TeamColor
team1Spawn.BrickColor = team1.TeamColor
team1Spawn.Parent = game.Workspace
local team2Spawn = Instance.new("SpawnLocation")
team2Spawn.Anchored = true
team2Spawn.Size = Vector3.new(5, 1, 5)
team2Spawn.Neutral = false
team2Spawn.AllowTeamChangeOnTouch = true
team2Spawn.TeamColor = team2.TeamColor
team2Spawn.BrickColor = team2.TeamColor
team2Spawn.Parent = game.Workspace
local team3Spawn = Instance.new("SpawnLocation")
team3Spawn.Anchored = true
team3Spawn.Size = Vector3.new(5, 1, 5)
team3Spawn.Neutral = false
team3Spawn.AllowTeamChangeOnTouch = true
team3Spawn.TeamColor = team3.TeamColor
team3Spawn.BrickColor = team3.TeamColor
team3Spawn.Parent = game.Workspace
-- position spawns
startSpawn.CFrame = CFrame.new(0, 0.5, 0)
team1Spawn.CFrame = CFrame.new(10, 0.5, 0)
team2Spawn.CFrame = CFrame.new(20, 0.5, 0)
team3Spawn.CFrame = CFrame.new(30, 0.5, 0)
TeamColor
Właściwość TeamColor określa, do jakiej drużyny należy SpawnLocation .Jeśli właściwość SpawnLocation.Neutral jest fałszywa, tylko Players z tą samą Player.TeamColor jak kolor zespołu zrodzenia będzie mógł się tam pojawić.
Jeśli SpawnLocation.AllowTeamChangeOnTouch jest prawdą, Player.Neutral zostanie ustawiony na tę właściwość po kontakcie ze spawnem.
Przykłady kodu
This sample demonstrates how SpawnLocations can be used to make a checkpoint system. Typically this would be done Studio and not in Lua, but this example serves as a comprehensive example of what Team and SpawnLocation properties need to be used to achieve this setup.
local Teams = game:GetService("Teams")
-- create start team (AutoAssignable = true)
local startTeam = Instance.new("Team")
startTeam.Name = "Start"
startTeam.AutoAssignable = true
startTeam.TeamColor = BrickColor.new("White")
startTeam.Parent = Teams
-- create checkpoint teams (Autoassignable = false), ensuring all TeamColors are unique
local team1 = Instance.new("Team")
team1.Name = "Checkpoint 1"
team1.AutoAssignable = false
team1.TeamColor = BrickColor.new("Bright blue")
team1.Parent = Teams
local team2 = Instance.new("Team")
team2.Name = "Checkpoint 2"
team2.AutoAssignable = false
team2.TeamColor = BrickColor.new("Bright green")
team2.Parent = Teams
local team3 = Instance.new("Team")
team3.Name = "Checkpoint 2"
team3.AutoAssignable = false
team3.TeamColor = BrickColor.new("Bright red")
team3.Parent = Teams
-- create spawns
local startSpawn = Instance.new("SpawnLocation")
startSpawn.Anchored = true
startSpawn.Size = Vector3.new(5, 1, 5)
startSpawn.Neutral = false
startSpawn.AllowTeamChangeOnTouch = false
startSpawn.TeamColor = startTeam.TeamColor
startSpawn.BrickColor = startTeam.TeamColor
startSpawn.Parent = game.Workspace
local team1Spawn = Instance.new("SpawnLocation")
team1Spawn.Anchored = true
team1Spawn.Size = Vector3.new(5, 1, 5)
team1Spawn.Neutral = false
team1Spawn.AllowTeamChangeOnTouch = true
team1Spawn.TeamColor = team1.TeamColor
team1Spawn.BrickColor = team1.TeamColor
team1Spawn.Parent = game.Workspace
local team2Spawn = Instance.new("SpawnLocation")
team2Spawn.Anchored = true
team2Spawn.Size = Vector3.new(5, 1, 5)
team2Spawn.Neutral = false
team2Spawn.AllowTeamChangeOnTouch = true
team2Spawn.TeamColor = team2.TeamColor
team2Spawn.BrickColor = team2.TeamColor
team2Spawn.Parent = game.Workspace
local team3Spawn = Instance.new("SpawnLocation")
team3Spawn.Anchored = true
team3Spawn.Size = Vector3.new(5, 1, 5)
team3Spawn.Neutral = false
team3Spawn.AllowTeamChangeOnTouch = true
team3Spawn.TeamColor = team3.TeamColor
team3Spawn.BrickColor = team3.TeamColor
team3Spawn.Parent = game.Workspace
-- position spawns
startSpawn.CFrame = CFrame.new(0, 0.5, 0)
team1Spawn.CFrame = CFrame.new(10, 0.5, 0)
team2Spawn.CFrame = CFrame.new(20, 0.5, 0)
team3Spawn.CFrame = CFrame.new(30, 0.5, 0)