Infinite Yields, and not being able to find children

Hi I’m trying to make a boombox for my game but it isn’t working. I need to find a child called “PlaySong” but I can’t find it. I tried .Child, WaitForChild, and FindFirstChild but it always resulted in nothing, errors, or infinite yields. Here is my codez;

Client:

local PlaySong = script.Parent.PlaySong
local Tool = script.Parent

local Backpack = script.Parent.Parent
local PlayerGui = script.Parent.Parent.Parent.PlayerGui
Tool.Equipped:Connect(function()
	for i, v in pairs(PlayerGui.Gui:GetChildren()) do
		v.Visible = true
	end
end)
Tool.Unequipped:Connect(function()
	for i, v in pairs(PlayerGui.Gui:GetChildren()) do
		v.Visible = false
	end
	if script.Parent:FindFirstChild("Sound") then
		print(script.Parent.Sound.Name)
		script.Parent.Sound:Destroy()
	end
end)

PlaySong:

local Backpack = script.Parent.Parent.Parent.Parent.Backpack

local Boombox = Backpack.Boombox

local PlaySong = Boombox:FindFirstChild("PlaySong")
local ID = script.Parent.Parent.ID.Text

local Handle = Boombox:FindFirstChild("Handle")
Boombox.PlaySong:FireServer(Handle, ID)
print("Fired Server")

Server:

local Backpack = script.Parent.Parent.Parent.Parent.Backpack
Backpack.Boombox.PlaySong.OnServerEvent:Connect(function(Player, Handle, ID)
	local Sound = Instance.new("Sound", Handle)
	Sound.SoundId = ("rbxassetid://"..ID)
	Sound:Play()
	print(Sound.Name, Sound.Parent, "Working", Sound.SoundId)
end)

I can provide additional information if needed. Please help.

umm why so many parents?

maybe the parts have only been created on the client, if so then it wouldnt work on the server.

You were right about that, thanks, but it still says it isn’t PlaySong can’t be found.

Because that’s the path to backpack?

if its a localscript, just use this?

local Player = game:GetService("Players").LocalPlayer
local BP = Player.Backpack

Well it doesn’t really matter, does it?

It probably does, is playsong script inside a tool?

Yes it is inside a tool.filerererererere

Then just reference the tool?

local Tool = script.Parent
local PlaySong = Tool:WaitForChild("PlaySong")

The scripts with many parents were in the player gui so they don’t have that power. But it still doesn’t matter.

does it even know that it’s Boombox is? maybe do a print check

I can’t because the script giving a problem fires an event when it give the error.

When a tool is equipped it changed its parent to player.Character

The item is in the tool. That has nothing to do with this I don’t think.