Scripting HelpersARCHIVE
A little piece of Roblox history. Preserved for everyone, one question at a time.Read about the archive →
✓ ANSWER ACCEPTED

Leaking Threads? How could i prevent it?

At the moment this will leak threads, how could I end the loop if the player is no longer in the game so that the script does not break.

Also I need to manually add the gui because of the way I will be using it so I cannot change this part!!

function onPlayerRespawn(property, plr)
		while true do
			if plr.Character ~= nil then break end
			wait(5)
		end
	print("Given gui")
	Workspace.ScreenGui:Clone().Parent = plr.PlayerGui
end

function onPlayerEntered(plr)
		while true do
			if plr.Character ~= nil then break end
			wait(5)
		end
		print("plr Added")
		Workspace.ScreenGui:Clone().Parent = plr.PlayerGui 
		plr.CharacterAdded:connect(function(property) onPlayerRespawn(property, plr) end)
end
game.Players.PlayerAdded:connect(onPlayerEntered)

Fixed

function onPlayerRespawn(property, plr)
        while plr and plr.Parent do
            if plr.Character then break end
            wait(1) --In my opinion, five seconds is too much. I'd just do wait(). It's up to you if you wan't to change that.
        end
        if not (plr and plr.Parent) then return end
    print("Given gui")
	if game.Workspace.FilteringEnabled then
		game.Workspace.FilteringEnabled = false
		wait(1)
		Workspace.ScreenGui:Clone().Parent = plr.PlayerGui
		wait(1)
		game.Workspace.FilteringEnabled = true
	else
		game.Workspace.FilteringEnabled = true
	end
    
end

function onPlayerEntered(plr)
        print("plr Added")
        plr.CharacterAdded:connect(function(property) onPlayerRespawn(property, plr) end)
end
game.Players.PlayerAdded:connect(onPlayerEntered)

2 answers

✓ Accepted answer

Your current script will copy the gui twice. But anyways, here is how you would stop the loop and end the function if the player is no longer in the game.

function onPlayerRespawn(property, plr)
        while plr and plr.Parent do
            if plr.Character then break end
            wait(5) --In my opinion, five seconds is too much. I'd just do wait(). It's up to you if you wan't to change that.
        end
		if not (plr and plr.Parent) then return end
    print("Given gui")
    Workspace.ScreenGui:Clone().Parent = plr.PlayerGui
end

function onPlayerEntered(plr)
        print("plr Added")
        plr.CharacterAdded:connect(function(property) onPlayerRespawn(property, plr) end)
end
game.Players.PlayerAdded:connect(onPlayerEntered)

Also, I'm not sure where the property variable is coming from. It's undefined, unless this isn't the entire script.

1 comment

0

Thanks for the help, i also added filtering so that the new gui is sent to the client

local a = "This will now work as expected"

this shows as an underline

local a = "this will work as expected"

this is bold text

(random code) this should hide after 15 lines of code

repeat wait() until player.Character ~= nil

local hum = player.Character:WaitForChild("Humanoid")

  

local animation = Tool.Anim

local AnimTrack = hum:LoadAnimation(animation)

  

Tool.Activated:Connect(function(mouse)

AnimTrack:Play()

end)

  

Tool.Unequipped:Connect(function()

AnimTrack:Stop()

end)
repeat wait() until player.Character ~= nil

local hum = player.Character:WaitForChild("Humanoid")

  

local animation = Tool.Anim

local AnimTrack = hum:LoadAnimation(animation)

  

Tool.Activated:Connect(function(mouse)

AnimTrack:Play()

end)

  

Tool.Unequipped:Connect(function()

AnimTrack:Stop()

end)

1 comment

0

what

This discussion is preserved as it was. New answers, comments, and votes are closed.