Hello, I am developing a element type game with my friends and I played around with loops and I suddenly realized that the loop is causing intense server lag if many people use the move, which is a problem because it's meant for many people to be in a server and i don't want it to lag and the players having a bad experience. When one person uses it the activity goes up to something like 6% which is not ideal with many players. The lag is coming from line 92, and seems to increase the more i do the move Here is the script :

local Debris = game:GetService("Debris")
local TweenService = game:GetService("TweenService")
local RunService = game:GetService("RunService")

local Connection4
local Connection5
local Connection6
game.ReplicatedStorage.Fire.Events.Move2.OnServerEvent:Connect(function(Player)
	local function GetMouse()
		local MS
		local Num = math.random(1,10)..math.random(1,10)..math.random(1,10)..math.random(1,10)
		game.ReplicatedStorage.GetMouse:FireClient(Player,Num)
		game.ReplicatedStorage.GetMouse.OnServerEvent:Connect(function(Player,M,N)
			if N == Num then
				MS = M
			end
		end)
		repeat wait() until MS
		return MS
	end 
	local AlreadyHit = {}
	local Burning = {}
	local FlamePart = Instance.new("Part")
	local Duration = true
	local Anim = Instance.new("Animation",Player.Character)
	Anim.AnimationId = "rbxassetid://10545496514"
	Anim = Player.Character.Humanoid.Animator:LoadAnimation(Anim)
	Anim:Play()

	FlamePart.Parent = workspace.Debris
	FlamePart:SetNetworkOwner(Player)
	FlamePart.Size = Vector3.new(1,1,1)
	FlamePart.Anchored = true
	FlamePart.CanCollide = false
	FlamePart.Transparency = 1
	local HitPart =  Instance.new("Part")
	HitPart.Parent = workspace.Debris
	HitPart.Anchored = true
	HitPart.Transparency = 1
	HitPart.CanCollide = false
	HitPart.Size = Vector3.new(4.5,4.5,40)
	HitPart.CFrame = CFrame.new((Player.Character.HumanoidRootPart.CFrame * CFrame.new(0,0,-2)).Position,GetMouse()) * CFrame.new(0,0,-(HitPart.Size.Z/2 + 2))
	local Sound = game.ReplicatedStorage.Fire.SoundEffects.Flamethrower:Clone()
	Sound.Parent = Player.Character.HumanoidRootPart
	Sound:Play()
	HitPart.Touched:Connect(function(t)
		if t.Parent:FindFirstChild("Humanoid") then
			if table.find(AlreadyHit,t.Parent) == nil and not t:IsDescendantOf(Player.Character) then
				table.insert(AlreadyHit,t.Parent)
				table.insert(Burning,t.Parent)
				for i, v in pairs(t.Parent:GetChildren()) do
					if v:IsA("Part") or v:IsA("MeshPart") then
						coroutine.wrap(function()
							for l,k in pairs(game.ReplicatedStorage.Fire.ParticleEmitters.BurningEffect:GetChildren()) do
								k = k:Clone()
								k.Parent = v
								k.Enabled = true
								coroutine.wrap(function()
									wait(3)
									for i, v in pairs(Burning) do
										if v == t.Parent then
											table.remove(Burning,i)
										end
									end
									for i, v in pairs(AlreadyHit) do
										if v == t.Parent then
											table.remove(AlreadyHit,i)
										end
									end
									k.Enabled = false
									Debris:AddItem(k,1)
								end)()
							end
						end)()
					end
				end
 				coroutine.wrap(function()
				     while true do
						wait(.5)
						if table.find(Burning,t.Parent) ~= nil then
							t.Parent:FindFirstChild("Humanoid"):TakeDamage(4.5783)
						end
						if Duration == false or table.find(Burning,t.Parent) == nil then
							break
						end
					end
				end)()
			end
		end
	end)
	coroutine.wrap(function()
	 Connection4 = RunService.Stepped:Connect(function()
			if HitPart ~= nil then
			HitPart.CFrame = CFrame.new((Player.Character.HumanoidRootPart.CFrame * CFrame.new(0,0,-2)).Position,GetMouse()) * CFrame.new(0,0,-(HitPart.Size.Z/2 + 2))
			else
				Connection4:Disconnect()
			end
	    	end)
	end)()
	for i, v in pairs(game.ReplicatedStorage.Fire.ParticleEmitters.Flamethrower:GetChildren()) do
	    v = v:Clone()
		v.Parent = FlamePart
		v.Enabled = true
		spawn(function()
			wait(5)
			v.Enabled = false
		end)
	end
	coroutine.wrap(function()
	Connection5 = RunService.Heartbeat:Connect(function()
	 if Duration == true then
		FlamePart.CFrame = CFrame.new((Player.Character.HumanoidRootPart.CFrame * CFrame.new(0,0,-2)).Position,GetMouse())
	end
	end)
	end)()
	spawn(function()
	wait(5)
	Connection4:Disconnect()
	Connection5:Disconnect()
	Anim = nil
	Debris:AddItem(FlamePart,1)
	HitPart:Destroy()
	HitPart = nil
	Duration = false
	end)	
end)