Enable Camera Script When Tool is Equipped

Hi Everyone,

I have been working on a third person game for a while now and have been stumped on this problem. I can’t make it so the custom camera starts when my tool is equipped and stops when unequipped. Please help.

ModuleScript – Starter Player Scripts

local Players = game:GetService("Players")
local Workspace = game:GetService("Workspace")
local RunService = game:GetService("RunService")
local UserInputService = game:GetService("UserInputService")

local Camera = Workspace.CurrentCamera
local Player = Players.LocalPlayer
local Character = Player.Character or Player.CharacterAdded:Wait()

local Humanoid = Character:WaitForChild("Humanoid")
local HumanoidRootPart = Character:WaitForChild("HumanoidRootPart")
local Head = Character:WaitForChild("Head")

local OrbitalCamera = {
	settings = {
		popper = false,
		sensitivity = Vector2.new(120, 120),
		offset = CFrame.new(2, 3, 15),
		verticalLimit = NumberRange.new(-5 * math.pi / 12, 5 * math.pi / 12),
		combinations = {
			{true, false, false, false, 0, 0},
			{true, true, false, false, math.pi / 4},
			{false, true, false, false, math.pi / 2},
			{false, true, true, false, 3 * math.pi / 4},
			{false, false, true, false, math.pi},
			{false, false, true, true, 5 * math.pi / 4},
			{false, false, false, true, 3 * math.pi / 2},
			{true, false, false, true, 7 * math.pi / 4}
		}
	}
}

local DeltaX = 0
local DeltaY = 0

local AngleH = 0
local AngleV = 0

local W = false
local A = false
local S = false
local D = false

local RenderStepped = nil
local InputChanged = nil
local InputBegan = nil
local InputEnded = nil

function OrbitalCamera:Start()
	Humanoid.AutoRotate = false
	Camera.CameraType = Enum.CameraType.Scriptable
	UserInputService.MouseBehavior = Enum.MouseBehavior.LockCenter
	RenderStepped = RunService.RenderStepped:Connect(function()
		AngleH = AngleH - DeltaX / self.settings.sensitivity.X
		DeltaX = 0
		AngleV = math.clamp(AngleV - DeltaY / self.settings.sensitivity.Y, self.settings.verticalLimit.Min, self.settings.verticalLimit.Max)
		DeltaY = 0
		local finalCFrame = CFrame.new(HumanoidRootPart.Position) * CFrame.Angles(0, AngleH, 0) * CFrame.Angles(AngleV, 0, 0) * self.settings.offset
		if self.settings.popper then
			local direction = (finalCFrame.Position - Head.Position).Unit * ((self.settings.offset.Position).Magnitude)
			local raycastResult = Workspace:Raycast(Head.Position, direction)
			if raycastResult then
				local distance = (raycastResult.Position - finalCFrame.Position).Magnitude
				finalCFrame = finalCFrame * CFrame.new(0, 0, -distance)
			end
		end
		Camera.CFrame = finalCFrame
		if W or A or S or D then
			for _, value in pairs(self.settings.combinations) do
				if value[1] == W and value[2] == A and value[3] == S and value[4] == D then
					local directionVector = Camera.CFrame.LookVector
					local targetCFrame = CFrame.new(HumanoidRootPart.Position, HumanoidRootPart.Position + Vector3.new(directionVector.X, 0, directionVector.Z))
					HumanoidRootPart.CFrame = HumanoidRootPart.CFrame:Lerp(targetCFrame * CFrame.Angles(0, value[5], 0), 0.25)
				end
			end
		end
	end)
	InputChanged = UserInputService.InputChanged:Connect(function(input, gameProcessedEvent)
		if not gameProcessedEvent then
			if input.UserInputType == Enum.UserInputType.MouseMovement then
				if DeltaX ~= input.Delta.X then
					DeltaX = input.Delta.X
				end
				if DeltaY ~= input.Delta.Y then
					DeltaY = input.Delta.Y
				end
			end
		end
	end)
	InputBegan = UserInputService.InputBegan:Connect(function(input, gameProcessedEvent)
		if not gameProcessedEvent then
			if input.KeyCode == Enum.KeyCode.W then
				W = true
			elseif input.KeyCode == Enum.KeyCode.A then
				A = true
			elseif input.KeyCode == Enum.KeyCode.S then
				S = true
			elseif input.KeyCode == Enum.KeyCode.D then
				D = true
			end
		end
	end)
	InputEnded = UserInputService.InputEnded:Connect(function(input, gameProcessedEvent)
		if not gameProcessedEvent then
			if input.KeyCode == Enum.KeyCode.W then
				W = false
			elseif input.KeyCode == Enum.KeyCode.A then
				A = false
			elseif input.KeyCode == Enum.KeyCode.S then
				S = false
			elseif input.KeyCode == Enum.KeyCode.D then
				D = false
			end
		end
	end)
end

function OrbitalCamera:Stop()
	Humanoid.AutoRotate = true
	Camera.CameraType = Enum.CameraType.Custom
	UserInputService.MouseBehavior = Enum.MouseBehavior.Default
	if RenderStepped then RenderStepped:Disconnect() end
	if InputChanged then InputChanged:Disconnect() end
	if InputBegan then InputBegan:Disconnect() end
	if InputEnded then InputEnded:Disconnect() end
end

return OrbitalCamera

Equip Activation (LocalScipt) – Childed To Tool

 local StarterPlayerScripts = game:GetService("StarterPlayerScripts")
 
 local ModuleScript = StarterPlayerScripts:WaitForChild("ModuleScript")
 
 local cam = require(StarterPlayerScripts:WaitForChild("ModuleScript"))
 
 local camera = workspace.Camera
 
 local player = game:GetService("Players").LocalPlayer
 
 cam:Stop()
 
 script.Parent.Equipped:Connect(function()
 
 cam:Start()
 
 end)
 
 script.Parent.Unequipped:Connect(function()
 
 cam:Stop()
 
 camera.CameraSubject = player.Character
 
 ModuleScript.normalOffset = Vector3.new(0,0,0)
 
 end)

Are you getting an error? Because my script is telling me
local StarterPlayerScripts = game:GetService("StarterPlayerScripts")
is equal to nil. I think you meant to do
local StarterPlayerScripts = game:GetService("StarterPlayer").StarterPlayerScripts

It works, but my walking now gets messed up and choppy when I equip the tool.