So I was creating magic where I used Bodygyro to Aim. In the script, I make that bodygyro cframe always follow the user mouse but somehow it isn't accurate like this.

Aiming script (local script)

mouse.KeyDown:Connect(function(key)
	if key == "q" and isKeyHeld == false then
		if debounce == false and char:FindFirstChild("Fire") then
			if player.Character.Charge.CurrentME.Value > 1100 then
				if script.Parent.Values.QMove.Value == false then
					debounce = true
					isKeyHeld = true

                                        local char = player.Character
                                        local root = char:WaitForChild("HumanoidRootPart")

					local bp = Instance.new("BodyPosition")
					bp.Name = "Firebp"
					bp.Parent = root
					bp.P = bp.P * 4
					bp.D = 200
					bp.MaxForce = Vector3.new(math.huge,math.huge,math.huge)
					bp.Position = root.Position
					local bg = Instance.new("BodyGyro")
					bg.Name = "Firebg"
					bg.Parent = root
					bg.P = bg.P * 4
					bg.D = 200
					bg.MaxTorque = Vector3.new(math.huge,math.huge,math.huge)
					while isKeyHeld == true do
						bg.CFrame = CFrame.new(root.Position,mouse.Hit.p)
						wait()
					end
				end	
			end
		end
	end
end)

Fireball cloning script

remotes.FireRemote.OnServerEvent:Connect(function(plr, skill,mouse)
	if skill == "Fireball" then
		repeat wait() until keyholded == false
		local char = plr.Character
		local newblast = assets.QMove.FireQ:Clone()
		newblast.CFrame = char.HumanoidRootPart.CFrame * CFrame.new(0,0,-4)

		local bv = Instance.new("BodyVelocity", newblast)
		bv.MaxForce = Vector3.new(math.huge,math.huge,math.huge)
		bv.Velocity = (char.HumanoidRootPart.CFrame.lookVector * 100)

		newblast.Parent = plr.Character.HumanoidRootPart

		local name = Instance.new("StringValue",newblast)
		name.Name = "Owner"
		name.Value = plr.Name

		local shootsound = script.Parent.Sounds.shoot:Clone()
		shootsound.Parent = plr.Character.HumanoidRootPart
		shootsound:Play()
		shootsound:Destroy()

		newblast.damagebonus.Value = damagebonus

		while wait() do
			if (newblast.Position - char.HumanoidRootPart.Position).magnitude > 800 then
				newblast:Destroy()
			end
		end
	end
end)