Camera Tool Zooms In & Out despite the Tool being unequipped

What I’m trying to achieve is a Camera FOV Zoom In & Out like in FOV Shooter games where you scroll the mouse wheel back and fourth to aim for your target.

Although the Tweens & Camera Mode settings function, it continues to do so whenever you unequip a tool and it’s the error/bug bothering me right now. I have tried :Disconnect() and it works perfectly fine until you equip it a 2nd time only for it to disfunction.

Here is the script I used:

--//Service Variables\\--
local TweenService = game:GetService("TweenService")

--//Zooming & First Person Functions\\--
local function ZoomIn()
	local FOV_ZoomIn = TweenService:Create(Camera, TweenInfo.new(), {FieldOfView = 35})
	Player.CameraMode = Enum.CameraMode.LockFirstPerson
	FOV_ZoomIn:Play()
end

local function ZoomOut()
	local FOV_ZoomOut = TweenService:Create(Camera, TweenInfo.new(), {FieldOfView = 70})
	Player.CameraMode = Enum.CameraMode.Classic
	FOV_ZoomOut:Play()
end

--///Tool Variables\\--
local Tool = script.Parent

--//Tool Main Functions\\--
Tool.Equipped:Connect(function(Mouse)
	Mouse.Button2Down:Connect(ZoomIn)
	Mouse.Button2Up:Connect(ZoomOut)
	
	Tool.Unequipped:Connect(function()
		ZoomOut()
	end)
end)

That is because you aren’t actually cancelling the connections, but instead just “zooming out” whenever the tool is unequipped. I also recommend you take the Unequipped listener out of the Equipped function as it creates multiple listeners for no reason. Here is how I would write it:

-- Services --

local TweenService = game:GetService("TweenService")
local Players = game:GetService("Players")

-- Variables --

local Tool = script.Parent

local Player = Players.LocalPlayer
local CurrentCamera = workspace.CurrentCamera

local DownConnection
local UpConnection
local CameraTween = nil

-- Functions --

local function ZoomIn()
	if CameraTween then
		CameraTween:Cancel()
		CameraTween = nil
	end
	
	CameraTween = TweenService:Create(CurrentCamera, TweenInfo.new(), {FieldOfView = 35})
	Player.CameraMode = Enum.CameraMode.LockFirstPerson
	CameraTween:Play()
end

local function ZoomOut()
	if CameraTween then
		CameraTween:Cancel()
		CameraTween = nil
	end

	CameraTween = TweenService:Create(CurrentCamera, TweenInfo.new(), {FieldOfView = 70})
	Player.CameraMode = Enum.CameraMode.Classic
	CameraTween:Play()
end

-- Scripting --

Tool.Equipped:Connect(function()
	DownConnection = Tool.Activated:Connect(ZoomIn)
	UpConnection = Tool.Deactivated:Connect(ZoomOut)
end)

Tool.Unequipped:Connect(function()
	DownConnection:Disconnect()
	UpConnection:Disconnect()
	ZoomOut()
end)

If you really want the Unequipped listener to be inside the Equipped listener, then make sure you disconnect it. You can do it like this:

-- Services --

local TweenService = game:GetService("TweenService")
local Players = game:GetService("Players")

-- Variables --

local Tool = script.Parent

local Player = Players.LocalPlayer
local CurrentCamera = workspace.CurrentCamera

local CameraTween = nil

-- Functions --

local function ZoomIn()
	if CameraTween then
		CameraTween:Cancel()
		CameraTween = nil
	end
	
	CameraTween = TweenService:Create(CurrentCamera, TweenInfo.new(), {FieldOfView = 35})
	Player.CameraMode = Enum.CameraMode.LockFirstPerson
	CameraTween:Play()
end

local function ZoomOut()
	if CameraTween then
		CameraTween:Cancel()
		CameraTween = nil
	end

	CameraTween = TweenService:Create(CurrentCamera, TweenInfo.new(), {FieldOfView = 70})
	Player.CameraMode = Enum.CameraMode.Classic
	CameraTween:Play()
end

-- Scripting --

Tool.Equipped:Connect(function()
	local DownConnection = Tool.Activated:Connect(ZoomIn)
	local UpConnection = Tool.Deactivated:Connect(ZoomOut)
	local UnequippedListener = nil
	
	UnequippedListener = Tool.Unequipped:Connect(function()
		DownConnection:Disconnect()
		UpConnection:Disconnect()
		UnequippedListener:Disconnect()
		ZoomOut()
	end)
end)