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

How to I make that if a player dies, they get respawned to the lobby?

Asked by 3 years ago

Basically, in my code, when someone dies during the round, they don't get respawned to the lobby. Here is my code:

-- Define variables

local ReplicatedStorage = game:GetService("ReplicatedStorage")

local ServerStorage = game:GetService("ServerStorage")

local MapsFolder = ServerStorage:WaitForChild("Maps")

local Status = ReplicatedStorage:WaitForChild("Status")

local GameLength = 110

local reward = 25

-- Game loop

while true do

    Status.Value = "Waiting for enough players"

    repeat wait(1) until game.Players.NumPlayers >= 2

    Status.Value = "Get Ready..."

    wait(8)

    Status.Value = "Intermission"

    wait(10)

    local plrs = {}

    for i, player in pairs(game.Players:GetPlayers()) do
        if player then
            table.insert(plrs,player) -- Add each player into plrs table
        end
    end

    wait(2)

    local AvailbleMaps = MapsFolder:GetChildren()

    local ChosenMap = AvailbleMaps[math.random(#AvailbleMaps)]

    Status.Value = ChosenMap.Name.." Chosen"

    wait(3)

    local ClonedMap = ChosenMap:Clone()
    ClonedMap.Parent = workspace

    -- Teleport players to the map

    local SpawnPoints = ClonedMap:FindFirstChild("SpawnPoints")

    if not SpawnPoints then
        print("SpawnPoints not found!")
    end

    local AvailbleSpawnPoints = SpawnPoints:GetChildren()

    for i, player in pairs(plrs) do
        if player then
            character = player.Character

            if character then
                -- Teleport them

                character:FindFirstChild("HumanoidRootPart").CFrame = AvailbleSpawnPoints[1].CFrame + Vector3.new(0,10,0)
                table.remove(AvailbleSpawnPoints,1)


                -- Give them a Hyperlaser Gun

                local HyperlaserGun = ServerStorage.HyperlaserGun:Clone()
                HyperlaserGun.Parent = player.Backpack

                local GameTag = Instance.new("BoolValue")
                GameTag.Name = "GameTag"
                GameTag.Parent = player.Character   
            else
                -- There is no character
                if not player then
                    table.remove(plrs,i)
                end
            end
        end
    end


    Status.Value = "Get ready to play!"

    wait(2)

    for i = GameLength,0,-1 do

        for x, player in pairs(plrs) do
            if player then

                character = player.Character

                if not character then
                    -- Left the game
                    character.GameTag:Destroy()
                else
                    if character:FindFirstChild("GameTag") then
                        -- They are still alive
                        print(player.Name.." is still alive")
                    else
                        -- They are dead
                        table.remove(plrs,x)
                        print(player.Name.." has been removed")
                    end
                end
            else
                table.remove(plrs,x)
                print(player.Name.." has been removed")
            end
        end

        Status.Value = "There are "..i.." seconds remaining, and "..#plrs.." players alive"

        if #plrs == 1 then
            -- Last person standing
            Status.Value = "The winner is "..plrs[1].Name
            plrs[1].leaderstats.LaserBucks.Value = plrs[1].leaderstats.LaserBucks.Value + reward
            break
        elseif #plrs == 0 then
            Status.Value = "No one survived!"
            break
        elseif i == 0 then
            Status.Value = "Time is up!"
            break
        end

        wait(1)
    end

    print("End of game")

    for i, player in pairs(game.Players:GetPlayers()) do
        character = player.Character

        if not character then
            -- Ignore them
        else
            if character:FindFirstChild("GameTag") then
                character.GameTag:Destroy()
            end

            if player.Backpack:FindFirstChild("HyperlaserGun") then
                player.Backpack.HyperlaserGun:Destroy()
            end

            if character:FindFirstChild("HyperlaserGun") then
                character.HyperlaserGun:Destroy()
            end

        end

        player:LoadCharacter()
    end

    ClonedMap:Destroy()

    Status.Value = "Round ended"

    wait(2)
end

Here is the part where the script recognizes that someone died during the game:

    for i = GameLength,0,-1 do

        for x, player in pairs(plrs) do
            if player then

                character = player.Character

                if not character then
                    -- Left the game
                    character.GameTag:Destroy()
                else
                    if character:FindFirstChild("GameTag") then
                        -- They are still alive
                        print(player.Name.." is still alive")
                    else
                        -- They are dead
                        table.remove(plrs,x)
                        print(player.Name.." has been removed")
                    end
                end
            else
                table.remove(plrs,x)
                print(player.Name.." has been removed")
            end
        end

An early thanks to all.

0
I HIGHLY recommend using teams for this usecase, it will make your life a lot easier. DinozCreates 1070 — 3y

1 answer

Log in to vote
0
Answered by 3 years ago

Im not sure where you want the players to spawn specifically but if you want them to spawn at the position they died at you could try this

local Players = game:GetService("Players")

-- A table of all the players' character cframe
local Positions = {}


Players.PlayerAdded:Connect(function(Player)
    Player.CharacterAdded:Connect(function(Character) 
        if Positions[Player] then
            local Root = Character:WaitForChild("HumanoidRootPart")
            Root.CFrame = Positions[Player] -- Teleport the player to the position he died at
            Positions[Player] = nil -- Remove the position
        end
    end)
    Player.CharacterDied:Connect(function(Character)
        local Root = Character:FindFirstChild("HumanoidRootPart")
        if Root then
            Positions[Player] = Root.CFrame -- Save the position
        end
    end)
end)
Ad

Answer this question