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

Why does a TeleportToPrivateServer must be passed an array of players error come up?

Asked by 2 years ago

Why does this error keep coming up although I'm clearly passing in an array of players already? Basically, I'm trying to create a teleportation system for a game where players can gather in a collider, and once there are enough players, they will be teleported to a private server where they can enjoy the game as a party. The code can be found below.

local TeleportService = game:GetService("TeleportService")
local Players = game:GetService("Players")

local elevators = game.Workspace.Elevators:GetChildren()

local elevatorList = {}


function getListSize(list)
    local elemCount = 0

    for key, value in pairs(list) do
        elemCount += 1
    end

    return elemCount
end


function listContains(list, object)
    for key, value in pairs(list) do
        if value == object then
            return true
        end
    end

    return false
end

function getIndexOfElement(list, object)
    for key, value in pairs(list) do 
        if value == object then
            return key
        end
    end

    return nil
end



function teleportPlayers(listOfPlayers)
    if listOfPlayers ~= nil and getListSize(listOfPlayers) ~= 0 then
        local players = {}
        for key, player in pairs(listOfPlayers) do
            if type(player) == "userdata" then
                players[getListSize(listOfPlayers)] = player
            end
        end

        local accessCode = TeleportService:ReserveServer(8402556022)
        TeleportService:TeleportToPrivateServer(8402556022, accessCode, players, nil, getListSize(listOfPlayers))
    end
end

for key, elevator in pairs(elevators) do
    -- Storing a dictionary of each elevator's key info(players inside) in a table array
    elevatorList[elevator] = {{}, false, 10} -- Key: Elevator Object, Value: Array of an array of players in the elevator, and a bool to tell if the elevator is full, and the number of seconds before the elevator teleports


    -- Checking for Collisions with the Entrance

    elevator.Touched:Connect(function (part)
        if part.Parent:FindFirstChildWhichIsA("Humanoid") then
            local playerList = elevatorList[elevator][1]
            local player = Players:GetPlayerFromCharacter(part.Parent)

            if not listContains(playerList, player) then -- If the player isn't already in the array of players     
                elevatorList[elevator][1][getListSize(playerList)] = player
                print("Add player")
            end
        end
    end)


    elevator.TouchEnded:Connect(function (part) -- If an elevator's touch ends
        if part.Parent:FindFirstChildWhichIsA("Humanoid") then 

            -- Remove the player from the array of players in the elevator
            local playerList = elevatorList[elevator][1]
            local player = Players:GetPlayerFromCharacter(part.Parent)

            local indexOfPlayer = getIndexOfElement(playerList, player)

            if listContains(playerList, player) then 
                elevatorList[elevator][1][indexOfPlayer] = nil
                print("Remove player")
            end

        end

    end)


end


while true do
    wait()

    -- Checking if each elevator is full or not 
    for key, elevator in pairs(elevators) do
        local elevatorMaxSize = elevator.Value.Value

        if getListSize(elevatorList[elevator][1]) == elevatorMaxSize and elevatorList[elevator][2] == false then
            elevatorList[elevator][2] = true  -- The elevator is ready to go
            print("Elevator full")
            -- Play the close door animation

        elseif getListSize(elevatorList[elevator][1]) > elevatorMaxSize and elevatorList[elevator][2] == true then
            print("Elevator too full")
            -- if doors are out of place, open the doors and change the ui to too full

            elevatorList[elevator][2] = false  -- The elevator is not ready to go

        elseif getListSize(elevatorList[elevator][1]) < elevatorMaxSize and elevatorList[elevator][2] == true  then
            -- If the people in the elevator is less than the max size
            elevatorList[elevator][2] = false

        end


        -- Countdown
        local elevatorFull = elevatorList[elevator][2]

        if elevatorFull == true then
            wait(1)
            elevatorList[elevator][3] -= 1
            print("Counting down ", elevatorList[elevator][1])

        elseif elevatorFull == false then
            elevatorList[elevator][3] = 10
        end

        if elevatorFull == true and elevatorList[elevator][3] <= 0 then
            print("Elevator teleporting... ", elevatorList[elevator][1])
            teleportPlayers(elevatorList[elevator][1])
        end
    end
end

The error occurs at line 52 where I teleport the players. I have no idea why this is not working. Even though the elements of the array clearly contain Player objects, I printed out the type of the object and it says 'userdata'. So I clearly have an array of Player objects, and I am passing it into the function. However, this error still comes up. I have no idea what to do.

0
Btw, the way this code works is by checking if the elevator is colliding with any Players, then if they are, add the player to the array of players in the elevator. If the size of the array is equal to the maximum number of players allowd in the elevator, then it will set the boolean, 'elevatorFull' to true, and that will trigger a countdown of 10 seconds before it teleports all the players into a SkylitGaming 0 — 2y
0
Also, for some reason, the function works when the array only consists of one element, but if there are multiple players, the error pops up. SkylitGaming 0 — 2y

1 answer

Log in to vote
0
Answered by 2 years ago

Never mind, it works now. I just changed the players[getListSize(listOfPlayers)] = player to a table.insert function

Ad

Answer this question