How can I make this ball shooting script work?

  1. What do you want to achieve? When the player presses Q, a “ball of water rises up from the water” (this part is already done.) when they release Q, the ball flies in the direction of their mouse.

  2. What is the issue? I’ve done everything to the best of my ability but it doesn’t go flying, it only rises above the water.

  3. What solutions have you tried so far? none, that’s why I’m here-

local UIS = game:GetService("UserInputService")
local RS = game:GetService("ReplicatedStorage")

local player = game.Players.LocalPlayer
local mouse = player:GetMouse()
local character = player.Character

local waterBall = RS.waterBall:Clone()
local bv = Instance.new("BodyVelocity")
bv.P = 4000
bv.Velocity = Vector3.new(0,2,0)
bv.MaxForce = Vector3.new(4000,4000,4000)

local bvClone = bv:Clone()

local target = mouse.Target

local debounce = false

UIS.InputBegan:Connect(function(input,gameprocessed)
	if gameprocessed then return end
	
	if input.KeyCode == Enum.KeyCode.Q then
		if mouse.Target == workspace.Terrain then
			
			debounce = true
			
			waterBall.Parent = workspace
			waterBall.Position = mouse.Hit.p - Vector3.new(0,0,0)
			bv.Parent = waterBall
			
			for count = 1,5 do
				wait(1)
				bv.Velocity = bv.Velocity/2
			end
		end
	end
	wait(2)
	debounce = false
end)

UIS.InputEnded:Connect(function(input, gameprocessed)
	if input.KeyCode == Enum.KeyCode.Q then
		
		local velocity = Instance.new("BodyVelocity", waterBall)
		velocity.Velocity = CFrame.new(mouse.Hit.p, waterBall.Position).LookVector * 100

		waterBall.Touched:Connect(function(Touched)
			if Touched:isDescendantOf(character) then return end
			
			waterBall:Destroy()

			if Touched.Parent:FindFirstChild("Humanoid") then
				Touched.Parent:FindFirstChild("Humanoid"):TakeDamage(10)
			end

			wait(1)
		end)
	end
end)

all help is appreciated :>