Загрузка данных


-- FirstPersonCamera (LocalScript)
local Players = game:GetService("Players")
local RunService = game:GetService("RunService")
local UserInputService = game:GetService("UserInputService")

local player = Players.LocalPlayer
local camera = workspace.CurrentCamera

-- Ждём появления персонажа
local character = player.Character or player.CharacterAdded:Wait()
local humanoidRootPart = character:WaitForChild("HumanoidRootPart")
local head = character:WaitForChild("Head")

-- Скрываем все части тела чтобы не видеть себя изнутри
local function hideCharacter()
    for _, part in ipairs(character:GetDescendants()) do
        if part:IsA("BasePart") or part:IsA("Decal") then
            part.LocalTransparencyModifier = 1
        end
    end
end

character.DescendantAdded:Connect(function(part)
    if part:IsA("BasePart") or part:IsA("Decal") then
        part.LocalTransparencyModifier = 1
    end
end)

hideCharacter()

-- Захват мыши
UserInputService.MouseBehavior = Enum.MouseBehavior.LockCenter

-- Параметры камеры
local rotX = 0  -- вертикаль (pitch)
local rotY = 0  -- горизонталь (yaw)
local sensitivity = 0.003
local maxPitch = math.rad(80)

camera.CameraType = Enum.CameraType.Scriptable

RunService.RenderStepped:Connect(function()
    if not character or not character.Parent then return end

    -- Читаем движение мыши
    local delta = UserInputService:GetMouseDelta()
    rotY = rotY - delta.X * sensitivity
    rotX = rotX - delta.Y * sensitivity
    rotX = math.clamp(rotX, -maxPitch, maxPitch)

    -- Позиция камеры = глаза персонажа
    local eyePosition = head.Position + Vector3.new(0, 0.2, 0)

    -- Строим CFrame камеры
    local cameraCFrame = CFrame.new(eyePosition)
        * CFrame.Angles(0, rotY, 0)
        * CFrame.Angles(rotX, 0, 0)

    camera.CFrame = cameraCFrame

    -- Поворачиваем тело персонажа вслед за горизонтальным взглядом
    humanoidRootPart.CFrame = CFrame.new(humanoidRootPart.Position)
        * CFrame.Angles(0, rotY, 0)
end)