-- Aim Lock (Head Only) LocalScript for Roblox
-- Place this LocalScript in StarterPlayerScripts.
-- Features:
-- * Targets player Head (falls back to HumanoidRootPart)
-- * Can lock through walls by selecting players based on screen proximity (ignores occlusion)
-- * Toggle lock with X
-- * Max distance: 2500 studs
-- * Smooth camera interpolation with configurable sensitivity
local Players = game:GetService("Players")
local RunService = game:GetService("RunService")
local UserInputService = game:GetService("UserInputService")
local LocalPlayer = Players.LocalPlayer
local Camera = workspace.CurrentCamera
-- Settings
local AimLockKey = Enum.KeyCode.X
local AimSensitivity = 0.12 -- 0..1 per-frame lerp factor (0 = no movement, 1 = snap)
local MaxDistance = 2500 -- studs
local MaxScreenSelectRadius = 60 -- pixels tolerance to consider the player's head under mouse
local PreferHead = true -- prefer "Head" part; fallback to "HumanoidRootPart" if missing
-- State
local aimLockEnabled = false
local targetPlayer = nil
local lockedPart = nil
local mouse = LocalPlayer:GetMouse()
-- Helper: get preferred "head root" part for a character
local function getHeadRootPart(character)
if not character then return nil end
if PreferHead then
local head = character:FindFirstChild("Head")
if head and head:IsA("BasePart") then
return head
end
end
-- Fallback
local hrp = character:FindFirstChild("HumanoidRootPart")
if hrp and hrp:IsA("BasePart") then
return hrp
end
return nil
end
-- Helper: measure distance from camera to a world position
local function distanceFromCamera(pos)
return (Camera.CFrame.Position - pos).Magnitude
end
-- Find a player whose head projects nearest to the mouse cursor on screen (works through walls)
local function findPlayerUnderCursor()
local mx = mouse.X
local my = mouse.Y
local bestPlayer = nil
local bestPart = nil
local bestDist = math.huge
for _, plr in ipairs(Players:GetPlayers()) do
if plr ~= LocalPlayer and plr.Character and plr.Character.Parent then
local part = getHeadRootPart(plr.Character)
if part then
local pos = part.Position
-- Distance check in world space
if distanceFromCamera(pos) <= MaxDistance then
-- Project to viewport
local viewportPoint, onScreen = Camera:WorldToViewportPoint(pos)
-- WorldToViewportPoint returns a Vector3 where Z <= 0 means behind camera; treat behind as offscreen
if onScreen and viewportPoint.Z > 0 then
local dx = viewportPoint.X - mx
local dy = viewportPoint.Y - my
local screenDist = math.sqrt(dx*dx + dy*dy)
if screenDist < MaxScreenSelectRadius and screenDist < bestDist then
bestDist = screenDist
bestPlayer = plr
bestPart = part
end
end
end
end
end
end
return bestPlayer, bestPart
end
-- Lock onto the player under the mouse (via screen proximity)
local function lockOntoMouseTarget()
local player, part = findPlayerUnderCursor()
if player and part then
targetPlayer = player
lockedPart = part
aimLockEnabled = true
print(string.format("Aim Lock Enabled -> Locked to player: %s (part: %s)", player.Name, lockedPart.Name))
else
print("No valid player head under cursor within distance to lock onto.")
end
end
local function clearLock()
aimLockEnabled = false
targetPlayer = nil
lockedPart = nil
print("Aim Lock Disabled")
end
-- Toggle lock: press X to lock to the nearest player's head under cursor, press again to clear.
UserInputService.InputBegan:Connect(function(input, gameProcessedEvent)
if gameProcessedEvent then return end
if input.UserInputType == Enum.UserInputType.Keyboard and input.KeyCode == AimLockKey then
if aimLockEnabled then
clearLock()
else
lockOntoMouseTarget()
end
end
end)
-- Main update: smoothly aim camera toward target head root
RunService.RenderStepped:Connect(function()
if not aimLockEnabled or not targetPlayer then
return
end
-- Validate player and character
if not targetPlayer.Parent or not targetPlayer.Character or not targetPlayer.Character.Parent then
clearLock()
return
end
-- Choose aim part: prefer lockedPart if still valid and descendant of character
local aimPart = nil
if lockedPart and lockedPart:IsDescendantOf(targetPlayer.Character) then
aimPart = lockedPart
else
aimPart = getHeadRootPart(targetPlayer.Character)
lockedPart = aimPart -- update lockedPart to current head fallback
end
if not aimPart then
clearLock()
return
end
-- Distance check
local aimPos = aimPart.Position
if distanceFromCamera(aimPos) > MaxDistance then
clearLock()
return
end
-- Compute desired camera CFrame that looks at the aim position
local camPos = Camera.CFrame.Position
local desiredCFrame = CFrame.new(camPos, aimPos)
-- Lerp camera CFrame toward desired look-at orientation
local t = math.clamp(AimSensitivity, 0, 1)
Camera.CFrame = Camera.CFrame:Lerp(desiredCFrame, t)
end)
improve this aimbot script by making it easier to lock on players when pressing X and looking at players: meaning just make it easier to lock onto a player