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


-- Настройки аимлока
local Settings = {
    LockPart = "Head",             -- Куда целиться ("Head" или "HumanoidRootPart")
    AliveCheck = true,             -- Проверка, жив ли противник
    Smoothness = 0.2,              -- Плавность (от 0.05 до 1. Чем МЕНЬШЕ значение, тем плавнее доводка мыши)
    ActivationKey = Enum.KeyCode.X -- Клавиша активации (X)
}

-- Сервисы Roblox
local Players = game:GetService("Players")
local LocalPlayer = Players.LocalPlayer
local Camera = workspace.CurrentCamera
local RunService = game:GetService("RunService")
local UserInputService = game:GetService("UserInputService")

-- Переменные состояния
local IsHoldingKey = false
local CurrentTarget = nil

-- Функция поиска ближайшего к прицелу игрока
local function GetPlayerClosestToCrosshair()
    local ClosestTarget = nil
    local ShortestDistance = math.huge
    -- Получаем центр игрового экрана (Viewport)
    local ScreenCenter = Vector2.new(Camera.ViewportSize.X / 2, Camera.ViewportSize.Y / 2)

    for _, player in pairs(Players:GetPlayers()) do
        if player ~= LocalPlayer then
            local character = player.Character
            if character and character:FindFirstChild(Settings.LockPart) then
                local humanoid = character:FindFirstChildOfClass("Humanoid")
                if not Settings.AliveCheck or (humanoid and humanoid.Health > 0) then
                    
                    local targetPart = character[Settings.LockPart]
                    -- Используем ViewportPoint, чтобы прицел не косил выше головы из-за верхнего бара Roblox
                    local screenPosition, onScreen = Camera:WorldToViewportPoint(targetPart.Position)
                    
                    if onScreen then
                        local targetPos2D = Vector2.new(screenPosition.X, screenPosition.Y)
                        local distanceToCenter = (targetPos2D - ScreenCenter).Magnitude
                        
                        if distanceToCenter < ShortestDistance then
                            ShortestDistance = distanceToCenter
                            ClosestTarget = targetPart
                        end
                    end
                end
            end
        end
    end
    return ClosestTarget
end

-- Проверка валидности зафиксированной цели
local function IsTargetValid(target)
    if not target or not target.Parent or not target.Parent:FindFirstChildOfClass("Humanoid") then 
        return false 
    end
    
    local humanoid = target.Parent:FindFirstChildOfClass("Humanoid")
    if Settings.AliveCheck and humanoid.Health <= 0 then 
        return false 
    end
    
    local _, onScreen = Camera:WorldToViewportPoint(target.Position)
    if not onScreen then 
        return false 
    end
    
    return true
end

-- Нажатие на X — жестко фиксируем ОДНУ цель
UserInputService.InputBegan:Connect(function(input, gameProcessedEvent)
    if not gameProcessedEvent and input.KeyCode == Settings.ActivationKey then
        IsHoldingKey = true
        CurrentTarget = GetPlayerClosestToCrosshair()
    end
end)

-- Отпускание X — сброс фиксации
UserInputService.InputEnded:Connect(function(input)
    if input.KeyCode == Settings.ActivationKey then
        IsHoldingKey = false
        CurrentTarget = nil
    end
end)

-- Плавное ведение мыши за целью каждый кадр
RunService.RenderStepped:Connect(function()
    if IsHoldingKey then
        -- Если цель сдохла или убежала за экран — отлипаем
        if CurrentTarget and not IsTargetValid(CurrentTarget) then
            CurrentTarget = nil
        end
        
        -- Если цель заблокирована и жива
        if CurrentTarget then
            local ScreenCenter = Vector2.new(Camera.ViewportSize.X / 2, Camera.ViewportSize.Y / 2)
            local targetSrc, onScreen = Camera:WorldToViewportPoint(CurrentTarget.Position)
            
            if onScreen then
                -- Вычисляем точное расстояние в пикселях до головы противника
                local distanceX = targetSrc.X - ScreenCenter.X
                local distanceY = targetSrc.Y - ScreenCenter.Y
                
                -- Умножаем на Smoothness, чтобы мышь двигалась не мгновенно, а плавно доводилась до головы
                local mouseMoveX = distanceX * Settings.Smoothness
                local mouseMoveY = distanceY * Settings.Smoothness
                
                -- Эмулируем движение мыши без конфликта с отдачей San Diego RP
                mousemoverel(mouseMoveX, mouseMoveY)
            end
        end
    end
end)