Загрузка данных
-- Настройки аимлока
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)