To not bore you people with the details, I'm working on a gun system with a server sided script in server-script-service. The issue is that traces occasionally just refuse to appear. The way the gun system works is that there is a single remote-event in replicated-storage, that event is fired by all the guns when being shot. Also, bare with me because I'm somewhat new.

Also, keep in mind that the server-sided script in server-script-service handles the shooting, damage handling and playing audio when reloading, which is why you see the "If not IsReloading then" line is there.

So, basically, my question is what are some ways of optimizing the gun system.

Example of the remote:

ShootRemote.OnServerEvent:Connect(function(player, tool, traceColor, mousepos, position)
	if not IsReloading then
		local ShootSound = tool.Handle:WaitForChild("Shoot")
		local MuzzleFlash = tool.Hole:WaitForChild("MuzzleEffect")
		local Hole = tool:WaitForChild("Hole")
		ShootSound:Play()

		MuzzleFlash.Enabled = true	

		local trace = Instance.new("Part")
		trace.Anchored = true
		trace.CanCollide = false
		trace.Transparency = 0.8
		trace.BrickColor = traceColor
		trace.Material = Enum.Material.Neon

		local distance = (Hole.CFrame.p - position).magnitude

		trace.Size = Vector3.new(0, 0, distance - 2)
		trace.CFrame = CFrame.new(Hole.CFrame.p, mousepos) * CFrame.new(0, 0, -			distance/2)
		trace.Parent = workspace
		
		wait(0.05)
		MuzzleFlash.Enabled = false

	end
end)