local Players = game:GetService("Players") local RunService = game:GetService("RunService") local UserInputService = game:GetService("UserInputService") local TweenService = game:GetService("TweenService") local LocalPlayer = Players.LocalPlayer local camera = workspace.CurrentCamera -- Camera Settings local CAMERA_OFFSET = Vector3.new(2, 2.5, 9) local SENSITIVITY = 0.45 local cameraEnabled = false local cameraAngleX = 0 local cameraAngleY = -10 local lastTouchPos = nil -------------------------------------------------------------------------------- -- 1. FORCE CAMERA & PLAYER SETTINGS -------------------------------------------------------------------------------- local function enableThirdPerson() LocalPlayer.CameraMode = Enum.CameraMode.Classic -- Store current facing direction local character = LocalPlayer.Character if character and character:FindFirstChild("HumanoidRootPart") then local _, yRot, _ = character.HumanoidRootPart.CFrame:ToOrientation() cameraAngleX = math.deg(yRot) cameraAngleY = -10 end end -------------------------------------------------------------------------------- -- 2. COMPACT UI TOGGLE BUTTON -------------------------------------------------------------------------------- local screenGui = Instance.new("ScreenGui") screenGui.Name = "CamToggleGui" screenGui.ResetOnSpawn = false screenGui.Parent = LocalPlayer:WaitForChild("PlayerGui") local toggleBtn = Instance.new("TextButton") toggleBtn.Name = "CamToggle" toggleBtn.Size = UDim2.new(0, 75, 0, 32) toggleBtn.Position = UDim2.new(0.9, -80, 0.15, 0) toggleBtn.BackgroundColor3 = Color3.fromRGB(45, 40, 60) toggleBtn.Text = "CAM: OFF" toggleBtn.TextColor3 = Color3.fromRGB(200, 195, 225) toggleBtn.TextSize = 12 toggleBtn.FontFace = Font.fromName("FredokaOne") toggleBtn.AutoButtonColor = false toggleBtn.Parent = screenGui local btnCorner = Instance.new("UICorner") btnCorner.CornerRadius = UDim.new(0, 10) btnCorner.Parent = toggleBtn -------------------------------------------------------------------------------- -- 3. TOUCH / DRAG INPUTS -------------------------------------------------------------------------------- UserInputService.InputBegan:Connect(function(input, gameProcessed) if gameProcessed or not cameraEnabled then return end if input.UserInputType == Enum.UserInputType.Touch or input.UserInputType == Enum.UserInputType.MouseButton1 then lastTouchPos = input.Position end end) UserInputService.InputChanged:Connect(function(input, gameProcessed) if not cameraEnabled or not lastTouchPos then return end if input.UserInputType == Enum.UserInputType.Touch or input.UserInputType == Enum.UserInputType.MouseMovement then local currentPos = input.Position local delta = currentPos - lastTouchPos lastTouchPos = currentPos cameraAngleX = cameraAngleX - (delta.X * SENSITIVITY) cameraAngleY = math.clamp(cameraAngleY - (delta.Y * SENSITIVITY), -60, 60) end end) UserInputService.InputEnded:Connect(function(input) if input.UserInputType == Enum.UserInputType.Touch or input.UserInputType == Enum.UserInputType.MouseButton1 then lastTouchPos = nil end end) -------------------------------------------------------------------------------- -- 4. OVERRIDE CAMERA LOOP (RenderPriority Override) -------------------------------------------------------------------------------- -- Priority set to Camera.Value + 1 so it overrides built-in camera scripts RunService:BindToRenderStep("OverrideThirdPersonCam", Enum.RenderPriority.Camera.Value + 1, function() if not cameraEnabled then return end local character = LocalPlayer.Character if not character then return end local head = character:FindFirstChild("Head") local rootPart = character:FindFirstChild("HumanoidRootPart") if not head or not rootPart then return end -- Enforce Scriptable camera every frame camera.CameraType = Enum.CameraType.Scriptable local startCFrame = CFrame.new(head.Position) local rotation = CFrame.Angles(0, math.rad(cameraAngleX), 0) * CFrame.Angles(math.rad(cameraAngleY), 0, 0) camera.CFrame = startCFrame * rotation * CFrame.new(CAMERA_OFFSET.X, CAMERA_OFFSET.Y, CAMERA_OFFSET.Z) rootPart.CFrame = CFrame.new(rootPart.Position) * CFrame.Angles(0, math.rad(cameraAngleX), 0) end) -------------------------------------------------------------------------------- -- 5. TOGGLE HANDLER -------------------------------------------------------------------------------- toggleBtn.MouseButton1Click:Connect(function() cameraEnabled = not cameraEnabled if cameraEnabled then toggleBtn.Text = "CAM: ON" toggleBtn.TextColor3 = Color3.fromRGB(255, 255, 255) toggleBtn.BackgroundColor3 = Color3.fromRGB(255, 120, 180) enableThirdPerson() else toggleBtn.Text = "CAM: OFF" toggleBtn.TextColor3 = Color3.fromRGB(200, 195, 225) toggleBtn.BackgroundColor3 = Color3.fromRGB(45, 40, 60) -- Restore default camera controls camera.CameraType = Enum.CameraType.Custom end end)