Alright. I’m having a little difficulty reading the code, so I’ll give you a working system and you can learn from it or build it up from there. Also, the LocalScript should know when the player joined and it shouldn’t need a RemoteEvent for that. Here is a function you can call or link to a RemoteEvent which will spawn the player on a random spawn whenever it is called.
local spawns = { -- side note, the spawns probably don't need this degree of accuracy. You should be able to round off all of those decimals.
CFrame.new(64.65, 16105.011, -3289.95),
CFrame.new(114.65, 16105.011, -3289.95),
CFrame.new(164.65, 16105.011, -3289.95),
CFrame.new(214.65, 16105.011, -3289.95)
}
local function spawnPlayer(player)
local character = player.Character or player.CharacterAdded:Wait() -- Get the character. If it doesn't exist, wait for the event ChildAdded to be called.
local hrp = character:FindFirstChild("HumanoidRootPart") or character:WaitForChild("HumanoidRootPart", 3) -- Get the HumanoidRootPart if it exists, or wait for it to exist. I can't remember if you need to recursively check for things to exist like this, but it won't hurt.
hrp.CFrame = spawns[math.random(#spawns)]
end