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

How To Make Sandbox Spawns As Individuals But Not Show On The Leaderboard?

Asked by 10 years ago

You know how in some sandboxes, when you spawn, you have your own spawn, and won't spawn anywhere else, and it doesn't show on the leaderboard, only stuff like KOs and WOs, or points will show.

I looked at this but I'm confused, it's not mine and I want to do my own. Could you explain it? And will it work?

function waitForChild(instance, name)
    while not instance:FindFirstChild(name) do
        instance.ChildAdded:wait()
    end
end

function waitForAnyChild(instance)
    while not instance:GetChildren()[1] do
        instance.ChildAdded:wait()
    end
end


print("ControlSpawning script", "waiting for children...")
waitForChild(game.Workspace, "BuildingPlates")
waitForChild(game, "Players")

local debris = game:GetService("Debris")
local assigning = false


function getFirstAvailablePlayerNumber2(player)
    return 0
end

function getFirstAvailablePlayerNumber(player)

    print("getFirstAvailablePlayerNumber()", "waiting...")

   -- wait for previous person to be assigned
    while(assigning) do 
        assigning.Changed:wait()
    end 

    assigning = true

    local playerNumber = 1
    local numberOfBaseplates = #game.Workspace.BuildingPlates:GetChildren()
    local players = game.Players:GetChildren()
    local numberOfPlayers = #players

    print("getFirstAvailablePlayerNumber()", "numberOfBaseplates:", numberOfBaseplates, "numberOfPlayers:", numberOfPlayers)

    for i=1,numberOfBaseplates do
        local isTaken = false
        for j=1,numberOfPlayers do
            if(players[j]:FindFirstChild("playerNumber") ~= nil) then
                if(players[j].playerNumber.Value == i) then
                    isTaken = true
                end
            end
        end
        if(isTaken == false) then
            -- We've found the first (lowest) available number
            playerNumber = i
            print("getFirstAvailablePlayerNumber()", "numberOfBaseplates:", numberOfBaseplates, "numberOfPlayers:", numberOfPlayers, "playerNumber:", playerNumber)
            assigning = false
            return playerNumber
        end
    end

    -- Shouldn't get here
    print("All baseplates are full.  That shouldn't happen.")
    assigning = false
    return 0
end

function onPlayerRespawn(player)

    -- only interested in events where the player gets a new character
    if player.Character == nil then return end

    print("onPlayerRespawn()", player.Name, "getting playerNumber...")
    if player:FindFirstChild("playerNumber") == nil then
        playerNumber = Instance.new("IntValue")
        playerNumber.Name = "playerNumber"
        playerNumber.Value = getFirstAvailablePlayerNumber(player)
        playerNumber.Parent = player
    end

    print("onPlayerRespawn()", player.Name, "playerNumber:", player.playerNumber.Value, "yielding...")

    wait()

    local char = player.Character.Torso
    local placeToSpawnTo = game.Workspace.SpawnPoints:FindFirstChild("SpawnLocation"..tostring(player.playerNumber.Value))
    if placeToSpawnTo ~= nil then 
        print("onPlayerRespawn()", player.Name, "playerNumber:", player.playerNumber.Value, "placeToSpawnTo:", placeToSpawnTo.Name)
        -- set Y position 3 studs above spawn position (otherwise player's torso is stuck in ground)
        char.CFrame = CFrame.new( placeToSpawnTo.Position + Vector3.new(0,3,0) )
    else 
        -- Couldn't find spawn location with that name.
        -- So, spawn in the normal spawn location (outside the plates)
        -- Extra players without baseplates are given playerNumber 0, and they spawn here.
        print("Spawning", player.Name, ", playerNumber:", player.playerNumber.Value, "in neutral spawner.")
    end

    -- Remove the forcefield because it's ugly.
    waitForChild(player.Character, "ForceField")
    --forceField:Remove()

    -- draw fancy crap
    local fire1 = Instance.new("Fire")
    fire1.Color = Color3.new(1, 1, 1)
    fire1.SecondaryColor = Color3.new(0, 0, 1)
    fire1.Heat = 20
    fire1.Size = 10
    fire1.Parent = placeToSpawnTo
    --debris:AddItem(fire1, 5.00)

    local fire2 = Instance.new("Fire")
    fire2.Color = Color3.new(0.02, 0.02, 0.1)
    fire2.SecondaryColor = Color3.new(0.1, 0.1, 0.10)
    fire2.Heat = 0
    fire2.Size = 2.5

    fire2.Parent = player.Character.Torso
    --debris:AddItem(fire2, 10.00)

    wait(0.2)
    fire1.Size = 8
    wait(0.2)
    fire1.Color = Color3.new(.8, .8, .8)
    fire1.Size = 5
    wait(0.2)
    fire1.Size = 3
    wait(0.2)
    fire1.Enabled = false;
    wait(2)
    fire2.Enabled = false;

    print("Fire created")

end

function onPlayerEntered(newPlayer)

    -- start to listen for new humanoid
    newPlayer.Changed:connect(function(property) onPlayerPropChanged(property, newPlayer) end )
    onPlayerRespawn(newPlayer)
end


function onPlayerPropChanged(property, player)

    if property == "Character" then
        onPlayerRespawn(player)
    end

end

game.Players.ChildAdded:connect(onPlayerEntered)
print("ControlSpawning script", "Players.ChildAdded event has been added.")

-- In Play Solo mode, the event doesn't fire.  So, we have to manually fire it.
-- Wait for Player
print("Waiting for any child in game.Players...")
waitForAnyChild(game.Players)
local players = game.Players:GetChildren()
if(players[1]:FindFirstChild("playerNumber") == nil) then
    print("Manually adding playerNumber")
    onPlayerEntered(players[1])
else
    print("Player already has playerNumber.")
end

Thanks.

Answer this question