Is there a way to optimize my boss attacks script more and make the attacks all come out at the same time instead of one at a time?

I have an attacks script in my boss model which has a function list of all the bosses attacks but they only come out one at a time would anyone know why this is and could possibly help me with it? Also, in my “bonezone” move function I’m unable to identify the player’s humanoidrootpart I don’t know how to get the position of it right now… Help would be appreciated thank you!

local i__Boss__i = script.Parent.Boss
local i__Players__i = game.Players:GetPlayers()

local i__GasterTest__i = game:GetService('ServerStorage'):WaitForChild('GasterTest')
local i__GasterTestMulti1__i = game:GetService('ServerStorage'):WaitForChild('GasterTestMulti'):WaitForChild("GasterTest1")
local i__GasterTestMulti2__i = game:GetService('ServerStorage'):WaitForChild('GasterTestMulti'):WaitForChild("GasterTest2")
local i__GasterTestMulti3__i = game:GetService('ServerStorage'):WaitForChild('GasterTestMulti'):WaitForChild("GasterTest3")
local i__BoneZone__i = game:GetService('ServerStorage'):WaitForChild('SansBonezone')
local i__Bones__i = game:GetService('ServerStorage'):WaitForChild('Bones')
local i__humanoidrootpart__i = script.Parent.HumanoidRootPart
local i__dodges__i = script.Parent.Dodges
i__dodges__i.Value = 120
local v1 = nil
local v2 = nil
local v3 = nil
local v4 = nil
local v5 = nil
local v6 = nil
local v7 = nil

function fireBeam()
	v1 = i__GasterTest__i:Clone()
	v1.Parent = workspace
	v1:SetPrimaryPartCFrame(i__humanoidrootpart__i.CFrame)
	v1:TranslateBy(Vector3.new(5, 5, 5))
	task.wait(5)
	v1:Destroy()
end

function fireTrioBeam()
	v2 = i__GasterTestMulti1__i:Clone()
	v3 = i__GasterTestMulti2__i:Clone()
	v4 = i__GasterTestMulti3__i:Clone()
	v2.Parent = workspace
	v3.Parent = workspace
	v4.Parent = workspace
	v2:SetPrimaryPartCFrame(i__humanoidrootpart__i.CFrame)
	v3:SetPrimaryPartCFrame(i__humanoidrootpart__i.CFrame)
	v4:SetPrimaryPartCFrame(i__humanoidrootpart__i.CFrame)
	v2:TranslateBy(Vector3.new(7.5, 2.5, 0))
	v3:TranslateBy(Vector3.new(7.5, 7.5, 7.5))
	v4:TranslateBy(Vector3.new(0, 2.5, 7.5))
	task.wait(5)
	v2:Destroy()
	v3:Destroy()
	v4:Destroy()
end

function boneZone()
	v5 = i__BoneZone__i:Clone()
	v5.Parent = workspace
	v6 = i__Bones__i:Clone()
	v6.Parent = workspace
	v5.Position = workspace.Part.Position
	v6:SetPrimaryPartCFrame(workspace.Part.CFrame)
	v6:TranslateBy(Vector3.new(0, -100, 0))
	v5.Transparency = 1
	task.wait(0.1)
	v5.Transparency = 0
	task.wait(0.1)
	v5.Transparency = 1
	task.wait(0.1)
	v5.Transparency = 0
	task.wait(0.1)
	v5.Transparency = 1
	task.wait(0.1)
	v5.Transparency = 0
	task.wait(0.1)
	v5.Transparency = 1
	task.wait(0.1)
	v5.Transparency = 0
	task.wait(0.1)
	v5.Transparency = 1
	task.wait(0.1)
	v5.Transparency = 0
	task.wait(0.1)
	v6:TranslateBy(Vector3.new(0, 102.5, 0))
	task.wait(2)
	v5:Destroy()
	v6:Destroy()
end

----function boneCircle()
----	v11 = true


----	v11 = false
----end

while true do
	local attack = math.random(1,3)
	if attack == 1 then
		fireBeam()
	elseif attack == 2 then
		fireTrioBeam()
	elseif attack == 3 then
		boneZone()
				--if v11 == false then
				--	boneCircle()	
			--	end
	end
end

P.S. For the bonezone thing i initially want it to track to the closest player’s humanoidrootpart. The humanoidrootpart listed in the script currently is the bosses. Thank you so much for the help I appreciate it if any is given!


Children of the model.