local Player = game.Players.LocalPlayer
local Character = Player.Character
local MainFrame = script.Parent
local Camera = workspace.CurrentCamera
local Humanoid = Character:WaitForChild("Humanoid")
local Mouse = Player:GetMouse()
local RunService = game:GetService("RunService")
local MaxDegree = math.rad(80)

local currentCam = 0
local connection

local function updateAccessoryTransparency(target, isTransparent)
	for _, child in target:GetChildren() do
		if child:IsA("Accessory") then
			updateAccessoryTransparency(child, isTransparent)
		elseif child:IsA("BasePart") then
			local hasRelevantAttachment = child:FindFirstChild("HatAttachment") or 
				child:FindFirstChild("FaceCenterAttachment") or 
				child:FindFirstChild("FaceFrontAttachment") or
				child:FindFirstChild("FaceRearAttachment") or 
				child:FindFirstChild("HairAttachment") or 
				child:FindFirstChild("NeckAttachment") or 
				child:FindFirstChild("WaistFrontAttachment")

			if hasRelevantAttachment then
				child.LocalTransparencyModifier = isTransparent and 1 or child.Transparency
			end
		end
	end
end

local function updateCharacterTransparency(character, isTransparent)
	for _, part in character:GetChildren() do
		if part:IsA("BasePart") then
			if isTransparent or part.Name == "Head" then
				part.LocalTransparencyModifier = 1
			else
				part.LocalTransparencyModifier = part.Transparency
			end
			updateAccessoryTransparency(part, isTransparent)
		elseif part:IsA("Folder") or part:IsA("Model") then
			updateAccessoryTransparency(part, isTransparent)
		end
	end
end

local Exceptions = {
	FP = function()
		if currentCam == 0 then
			currentCam += 1
			Camera.FieldOfView = 70
			Camera.CameraSubject = Character:FindFirstChild("Head")
			updateAccessoryTransparency(Character)
		elseif currentCam == 1 then
			currentCam += 1
			updateAccessoryTransparency(Character, true)
			updateCharacterTransparency(Character, true)
			Camera.FieldOfView = 90
			connection = RunService.RenderStepped:Connect(function()
				local mousePos = Vector2.new(Mouse.X, Mouse.Y)
				local screenCenter = Camera.ViewportSize / 2
				local delta = mousePos - screenCenter

				local angle = Vector2.new((delta.Y / screenCenter.Y) * MaxDegree, (delta.X / screenCenter.X) * MaxDegree)
				Camera.CFrame = Character.Head.CFrame * CFrame.new(0, 0, (-Character.Head.Size.Z / 2) * 1.25) * CFrame.Angles(-angle.X, -angle.Y, 0)
			end)
		elseif currentCam == 2 then
			connection:Disconnect()
			updateAccessoryTransparency(Character)
			currentCam = 0
			Camera.FieldOfView = 70
			Camera.CameraSubject = Humanoid
		end
	end,
	ExcludedFrame2 = function() 
		-- templt
	end,
}

local function onButtonClick(button)
	if Exceptions[button.Name] then
		Exceptions[button.Name]()
	else
		local targetFrame = MainFrame.Parent:FindFirstChild(button.Name)
		if targetFrame and targetFrame:IsA("Frame") then
			targetFrame.Visible = true
			print("Frame named '" .. targetFrame.Name .. "' is now visible.")
		else
			warn("Frame named '" .. button.Name .. "' not found.")
		end
	end
end

for _, child in pairs(MainFrame:GetChildren()) do
	if child:IsA("TextButton") then
		child.MouseButton1Click:Connect(function()
			onButtonClick(child)
		end)
	end
end


is there any easier way to handle the FP function without the need of any external functions?