I'm trying to make a fishing system but there is a problem. If I cast it once or twice it is fine, but on the third time the fishing rod pulls me and the rod with "pointer" or the lure on the end of the line. The pointer seems to also be attached to rod when it should fly off. Does anyone know how to fix this?

local ReplicatedStorage = game:GetService("ReplicatedStorage")
local RemoteThrow = ReplicatedStorage:FindFirstChild("RemoteThrow")
local RemoteRetract = ReplicatedStorage:FindFirstChild("RemoteRetract")
local RemoteSendOwnerName = ReplicatedStorage:FindFirstChild("RemoteSendOwnerName")
local Players = game:GetService('Players')
local onGround = false
local dt = 2
local DBA = false

function CreateFishHandler()
	local NewFishHandler = script.FishHandler:Clone()
	NewFishHandler.Disabled = false
	NewFishHandler.Parent = script.Parent
end

CreateFishHandler()

function FishFunc(player, mouse, rootpart, LP)
	for i, v in pairs(script.Parent.Pointer:GetChildren()) do
		if v:IsA("ParticleEmitter") then
			v.Enabled = false
		end
	end
	script.Parent:WaitForChild("FishHandler"):Destroy()
	local FishingGui = script.Parent.FishingIndicator:Clone()
	FishingGui.Parent = player.PlayerGui
	local Number = FishingGui.Frame.ImageLabel.Number
	script.Parent.StartNumberDrop:Fire(Number)
	script.Parent.StartNumberDropRE:FireClient(player, Number)
	script.Parent.ICaughtAFish.Event:Connect(function(sucess)
		FishingGui:Destroy()
		DBA = true
		if DBA == false then
			if sucess == true then
				print("yay")
			else
				print("uSuck")
			end
			DBA = true
		end
		
		local bv = script.Parent.Pointer:FindFirstChild("BodyVelocity")
		if bv then
			bv:Destroy()
		end
		script.Parent.isThrown.Value = false
		script.Parent.Pointer.CanCollide = false
		local length = (mouse.p - rootpart.Position).Magnitude
		attach(script.Parent.Pointer, script.Parent.Device, CFrame.new(0,0,0))
		script.Parent.Pointer.RopeConstraint.Length = 1 
		script.Parent.Reeling.Value = false
	end)
end


if not RemoteThrow then
	RemoteThrow = Instance.new("RemoteEvent", ReplicatedStorage)
	RemoteThrow.Name = "RemoteThrow"
end

if not RemoteRetract then
	RemoteRetract = Instance.new("RemoteEvent", ReplicatedStorage)
	RemoteRetract.Name = "RemoteRetract"
end

if not RemoteSendOwnerName then
	RemoteSendOwnerName = Instance.new("RemoteEvent", ReplicatedStorage)
	RemoteSendOwnerName.Name = "RemoteSendOwnerName"
end


local Pointer = script.Parent.Pointer

script.Parent.Pointer.Touched:Connect(function(Part)
	onGround = true
end)

script.Parent.Pointer.TouchEnded:Connect(function()
	onGround = false
end)

function attach(source, destination, offset)
	local weld = Instance.new("WeldConstraint", destination)
	weld.Name = "thing"
	source.CFrame = destination.CFrame * offset
	weld.Part0 = source
	weld.Part1 = destination


end

attach(script.Parent.Pointer, script.Parent.Device, CFrame.new(0,0,0))

local function onThrow(player, mouse, rootpart, Maxlength, speed, LP)
	CreateFishHandler()

	if player.Name == script.Parent.Parent.Name  then
		if not script.Parent.isThrown.Value then
			script.Parent.isThrown.Value = true
			
			script.Parent.Handle.woosh.Volume = .25
			if not onGround then
				script.Parent.Handle.woosh:Play()
			end
			local WeldConstraint = script.Parent.Device:FindFirstChild("thing")
			if WeldConstraint then
				WeldConstraint:Destroy()
			end

			local factor = 1
			local direction = mouse.p - script.Parent.Pointer.Position
			local length = direction.Magnitude
			direction = direction.Unit
			local result = (direction + rootpart.UpVector).Unit
			local BodyVelocity = Instance.new("BodyVelocity", Pointer)
			length = math.clamp(length, 1, Maxlength)
			Pointer.RopeConstraint.Length = length
			BodyVelocity.P = 10e10
			BodyVelocity.MaxForce = Vector3.new(10e10, 10e10,10e10)
			BodyVelocity.Velocity = factor * speed * result
			Pointer.CanCollide = true
			wait(length / speed)
			BodyVelocity:Destroy()
		end
	end
end


local function onRetract(player, mouse, rootpart, LP)
	if script.Parent.Reeling.Value == false then
		if player.Name == script.Parent.Parent.Name then
			if script.Parent.isThrown.Value then
				if script.Parent.IsFish.Value == false then
					Pointer.CanCollide = false
					script.Parent:WaitForChild("FishHandler"):Destroy()
					local bv = script.Parent.Pointer:FindFirstChild("BodyVelocity")
					if bv then
						bv:Destroy()
					end
					script.Parent.isThrown.Value = false
					local length = (mouse.p - rootpart.Position).Magnitude
					attach(script.Parent.Pointer, script.Parent.Device, CFrame.new(0,0,0))
					script.Parent.Pointer.RopeConstraint.Length = 1 
				else
					FishFunc(player, mouse, rootpart, LP)
				end
			end
		end
	end
end


RemoteThrow.OnServerEvent:Connect(onThrow)
RemoteRetract.OnServerEvent:Connect(onRetract)