local player = game.Players.LocalPlayer local camera = workspace.CurrentCamera local runService = game:GetService("RunService") local userInput = game:GetService("UserInputService") camera.CameraType = Enum.CameraType.Scriptable player.CameraMode = Enum.CameraMode.Classic local sensitivity = 0.15 local pitch = 0 local yaw = 0 local function hideHead(character) for _, obj in pairs(character:GetDescendants()) do if obj:IsA("BasePart") and obj.Name == "Head" then obj.LocalTransparencyModifier = 1 end if obj:IsA("Accessory") then local handle = obj:FindFirstChild("Handle") if handle then handle.LocalTransparencyModifier = 1 end end end end local function setupCharacter(character) local humanoid = character:WaitForChild("Humanoid") local root = character:WaitForChild("HumanoidRootPart") local head = character:WaitForChild("Head") humanoid.AutoRotate = false hideHead(character) userInput.MouseBehavior = Enum.MouseBehavior.LockCenter userInput.MouseIconEnabled = false userInput.InputChanged:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseMovement then yaw -= input.Delta.X * sensitivity pitch -= input.Delta.Y * sensitivity pitch = math.clamp(pitch, -80, 80) end end) runService.RenderStepped:Connect(function() if humanoid.Health <= 0 then return end -- Rotate character ONLY on Y root.CFrame = CFrame.new(root.Position) * CFrame.Angles(0, math.rad(yaw), 0) -- Camera uses root rotation, pitch applied locally local baseCFrame = root.CFrame * CFrame.new(0, 1.5, 0) camera.CFrame = baseCFrame * CFrame.Angles(math.rad(pitch), 0, 0) * CFrame.new(0, 0, -0.4) end) end if player.Character then setupCharacter(player.Character) end player.CharacterAdded:Connect(setupCharacter)