Birb Aimbot
Key RequiredUniversal

Birb Aimbot

Universal ScriptAHAXAHAX 582 views 8.5K executesUpdated Aug 11, 2026
Unrated
00
Lua Script•341 lines (12356 chars)
local Players = game:GetService("Players")
local RunService = game:GetService("RunService")
local ContextActionService = game:GetService("ContextActionService")
local UserInputService = game:GetService("UserInputService")
local Workspace = game:GetService("Workspace")

local LocalPlayer = Players.LocalPlayer
local Camera = Workspace.CurrentCamera

-- Configuration State
local Config = {
	TargetLock = true, -- Changed to TRUE by default so it works immediately
	WallCheck = true,
	FOV = 150,
	TrackingSpeed = 0.5, -- 0.01 (Very Slow) to 1 (Instant snap)
	AimKeybind = Enum.KeyCode.E,
	SwitchKeybind = Enum.KeyCode.Q,
	UIToggleKeybind = Enum.KeyCode.RightShift
}

-- Runtime State
local isAiming = false
local currentTarget = nil

--========================================================
-- UI CREATION
--========================================================

local ScreenGui = Instance.new("ScreenGui")
ScreenGui.Name = "TargetingUI"
ScreenGui.ResetOnSpawn = false
ScreenGui.Parent = LocalPlayer:WaitForChild("PlayerGui")

-- FOV VISUALIZER (Always visible)
local FOVCircle = Instance.new("Frame")
FOVCircle.Name = "FOVCircle"
FOVCircle.AnchorPoint = Vector2.new(0.5, 0.5)
FOVCircle.Position = UDim2.new(0.5, 0, 0.5, 0)
FOVCircle.Size = UDim2.new(0, Config.FOV * 2, 0, Config.FOV * 2)
FOVCircle.BackgroundTransparency = 1
FOVCircle.Parent = ScreenGui

local FOVCorner = Instance.new("UICorner")
FOVCorner.CornerRadius = UDim.new(0.5, 0)
FOVCorner.Parent = FOVCircle

local FOVStroke = Instance.new("UIStroke")
FOVStroke.Color = Color3.fromRGB(255, 50, 50)
FOVStroke.Thickness = 1.5
FOVStroke.Transparency = 0.2
FOVStroke.Parent = FOVCircle

-- Menu Toggle Button (Mobile/PC)
local OpenCloseBtn = Instance.new("TextButton")
OpenCloseBtn.Size = UDim2.new(0, 80, 0, 30)
OpenCloseBtn.Position = UDim2.new(0, 10, 0, 10)
OpenCloseBtn.BackgroundColor3 = Color3.fromRGB(40, 40, 45)
OpenCloseBtn.Text = "Menu"
OpenCloseBtn.TextColor3 = Color3.fromRGB(255, 255, 255)
OpenCloseBtn.Font = Enum.Font.GothamBold
OpenCloseBtn.TextSize = 12
Instance.new("UICorner", OpenCloseBtn).CornerRadius = UDim.new(0, 6)
OpenCloseBtn.Parent = ScreenGui

-- Main Menu Window
local MainFrame = Instance.new("Frame")
MainFrame.Size = UDim2.new(0, 240, 0, 280)
MainFrame.Position = UDim2.new(0.05, 0, 0.2, 0)
MainFrame.BackgroundColor3 = Color3.fromRGB(30, 30, 35)
MainFrame.BorderSizePixel = 0
MainFrame.Active = true
MainFrame.Parent = ScreenGui

local UICorner = Instance.new("UICorner")
UICorner.CornerRadius = UDim.new(0, 8)
UICorner.Parent = MainFrame

local Title = Instance.new("TextLabel")
Title.Size = UDim2.new(1, 0, 0, 35)
Title.BackgroundTransparency = 1
Title.Text = "TARGETING SYSTEM"
Title.TextColor3 = Color3.fromRGB(255, 255, 255)
Title.Font = Enum.Font.GothamBold
Title.TextSize = 14
Title.Parent = MainFrame

local UIListLayout = Instance.new("UIListLayout")
UIListLayout.Parent = MainFrame
UIListLayout.SortOrder = Enum.SortOrder.LayoutOrder
UIListLayout.Padding = UDim.new(0, 8)
UIListLayout.HorizontalAlignment = Enum.HorizontalAlignment.Center

OpenCloseBtn.MouseButton1Click:Connect(function()
	MainFrame.Visible = not MainFrame.Visible
end)

-- Make Menu Draggable
local dragging, dragInput, dragStart, startPos
MainFrame.InputBegan:Connect(function(input)
	if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
		dragging = true
		dragStart = input.Position
		startPos = MainFrame.Position
		input.Changed:Connect(function()
			if input.UserInputState == Enum.UserInputState.End then dragging = false end
		end)
	end
end)
MainFrame.InputChanged:Connect(function(input)
	if input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch then dragInput = input end
end)
UserInputService.InputChanged:Connect(function(input)
	if input == dragInput and dragging then
		local delta = input.Position - dragStart
		MainFrame.Position = UDim2.new(startPos.X.Scale, startPos.X.Offset + delta.X, startPos.Y.Scale, startPos.Y.Offset + delta.Y)
	end
end)

-- UI Helpers
local function createToggle(name, defaultState, callback)
	local Btn = Instance.new("TextButton")
	Btn.Size = UDim2.new(0.9, 0, 0, 35)
	Btn.BackgroundColor3 = defaultState and Color3.fromRGB(80, 200, 80) or Color3.fromRGB(200, 80, 80)
	Btn.Text = name .. ": " .. (defaultState and "ON" or "OFF")
	Btn.TextColor3 = Color3.fromRGB(255, 255, 255)
	Btn.Font = Enum.Font.GothamSemibold
	Btn.TextSize = 13
	Instance.new("UICorner", Btn).CornerRadius = UDim.new(0, 6)
	Btn.Parent = MainFrame
	local state = defaultState
	Btn.MouseButton1Click:Connect(function()
		state = not state
		Btn.BackgroundColor3 = state and Color3.fromRGB(80, 200, 80) or Color3.fromRGB(200, 80, 80)
		Btn.Text = name .. ": " .. (state and "ON" or "OFF")
		callback(state)
	end)
end

local function createInput(name, defaultVal, callback)
	local Frame = Instance.new("Frame")
	Frame.Size = UDim2.new(0.9, 0, 0, 35)
	Frame.BackgroundTransparency = 1
	Frame.Parent = MainFrame
	
	local Label = Instance.new("TextLabel")
	Label.Size = UDim2.new(0.6, 0, 1, 0)
	Label.BackgroundTransparency = 1
	Label.Text = name
	Label.TextColor3 = Color3.fromRGB(200, 200, 200)
	Label.Font = Enum.Font.Gotham
	Label.TextSize = 13
	Label.TextXAlignment = Enum.TextXAlignment.Left
	Label.Parent = Frame
	
	local TextBox = Instance.new("TextBox")
	TextBox.Size = UDim2.new(0.35, 0, 1, 0)
	TextBox.Position = UDim2.new(0.65, 0, 0, 0)
	TextBox.BackgroundColor3 = Color3.fromRGB(50, 50, 55)
	TextBox.TextColor3 = Color3.fromRGB(255, 255, 255)
	TextBox.Text = tostring(defaultVal)
	TextBox.Font = Enum.Font.Gotham
	TextBox.TextSize = 13
	Instance.new("UICorner", TextBox).CornerRadius = UDim.new(0, 6)
	TextBox.Parent = Frame
	
	TextBox.FocusLost:Connect(function()
		callback(TextBox.Text)
	end)
end

local TitlePadding = Instance.new("Frame")
TitlePadding.Size = UDim2.new(1,0,0,2)
TitlePadding.BackgroundTransparency = 1
TitlePadding.Parent = MainFrame

createToggle("Target Lock", Config.TargetLock, function(val) Config.TargetLock = val end)
createToggle("Wall Check", Config.WallCheck, function(val) Config.WallCheck = val end)

createInput("FOV Radius", Config.FOV, function(val) 
	local newFOV = tonumber(val) or Config.FOV 
	Config.FOV = newFOV
	FOVCircle.Size = UDim2.new(0, newFOV * 2, 0, newFOV * 2) -- Dynamically updates UI FOV
end)
createInput("Aim Speed", Config.TrackingSpeed, function(val) 
	Config.TrackingSpeed = math.clamp(tonumber(val) or Config.TrackingSpeed, 0.01, 1) 
end)

--========================================================
-- ADVANCED LOGIC & MATH
--========================================================

-- Recursive Piercing Raycast (Ignores invisible/non-solid barriers)
local function getPiercingRaycast(origin, direction, targetChar, ignoreList, depth)
	if depth > 5 then return false end -- Safety limit to prevent lag
	
	local rayParams = RaycastParams.new()
	rayParams.FilterDescendantsInstances = ignoreList
	rayParams.FilterType = Enum.RaycastFilterType.Exclude
	rayParams.IgnoreWater = true

	local result = Workspace:Raycast(origin, direction, rayParams)
	
	if result then
		if result.Instance:IsDescendantOf(targetChar) then
			return true -- Successfully hit the target
		end
		
		-- If it hits an invisible part, non-collidable part, or baseplate, ignore it and keep raycasting
		if result.Instance.Transparency >= 0.5 or not result.Instance.CanCollide or result.Instance.Name == "HumanoidRootPart" then
			table.insert(ignoreList, result.Instance)
			return getPiercingRaycast(origin, direction, targetChar, ignoreList, depth + 1)
		end
		
		return false -- We hit a solid, visible wall
	end
	
	return true -- We hit absolutely nothing, path is completely clear
end

local function isVisible(targetChar)
	if not Config.WallCheck then return true end
	
	-- Prioritize the Head because feet/torso often clip through floors, breaking the check
	local targetPart = targetChar:FindFirstChild("Head") or targetChar:FindFirstChild("HumanoidRootPart")
	if not targetPart then return false end
	
	local origin = Camera.CFrame.Position
	local direction = targetPart.Position - origin
	
	local ignoreList = {}
	if LocalPlayer.Character then
		table.insert(ignoreList, LocalPlayer.Character)
	end
	
	return getPiercingRaycast(origin, direction, targetChar, ignoreList, 0)
end

local function getClosestTarget(excludeTarget)
	local closestPlayer = nil
	local shortestDistance = Config.FOV
	local screenCenter = Vector2.new(Camera.ViewportSize.X / 2, Camera.ViewportSize.Y / 2)
	
	for _, player in pairs(Players:GetPlayers()) do
		if player ~= LocalPlayer and player.Character then
			local targetPart = player.Character:FindFirstChild("Head") or player.Character:FindFirstChild("HumanoidRootPart")
			local humanoid = player.Character:FindFirstChild("Humanoid")
			
			if targetPart and humanoid and humanoid.Health > 0 and player.Character ~= excludeTarget then
				local screenPoint, onScreen = Camera:WorldToViewportPoint(targetPart.Position)
				
				if onScreen then
					local distance = (Vector2.new(screenPoint.X, screenPoint.Y) - screenCenter).Magnitude
					if distance <= shortestDistance then
						if isVisible(player.Character) then
							shortestDistance = distance
							closestPlayer = player.Character
						end
					end
				end
			end
		end
	end
	
	return closestPlayer
end

--========================================================
-- CONTROLS
--========================================================

ContextActionService:BindAction("AimLockAction", function(actionName, inputState)
	if inputState == Enum.UserInputState.Begin then
		isAiming = not isAiming
		if isAiming then
			FOVStroke.Color = Color3.fromRGB(50, 255, 50) -- Crosshair Turns Green
		else
			currentTarget = nil
			FOVStroke.Color = Color3.fromRGB(255, 50, 50) -- Crosshair Turns Red
		end
	end
end, true, Config.AimKeybind)
ContextActionService:SetTitle("AimLockAction", "Aim")
ContextActionService:SetPosition("AimLockAction", UDim2.new(0.7, 0, 0.5, 0))

ContextActionService:BindAction("SwitchTargetAction", function(actionName, inputState)
	if inputState == Enum.UserInputState.Begin and isAiming then
		local newTarget = getClosestTarget(currentTarget)
		if newTarget then currentTarget = newTarget end
	end
end, true, Config.SwitchKeybind)
ContextActionService:SetTitle("SwitchTargetAction", "Switch")
ContextActionService:SetPosition("SwitchTargetAction", UDim2.new(0.7, 0, 0.35, 0))

-- Keyboard shortcut to open/close menu
ContextActionService:BindAction("ToggleUIAction", function(actionName, inputState)
	if inputState == Enum.UserInputState.Begin then
		MainFrame.Visible = not MainFrame.Visible
	end
end, false, Config.UIToggleKeybind)

--========================================================
-- CONTINUOUS CAMERA AIM & AUTO-RETARGET
--========================================================

RunService:BindToRenderStep("AimLockLoop", Enum.RenderPriority.Camera.Value + 1, function()
	if Config.TargetLock and isAiming then
		
		-- 1. Validate Current Target
		if currentTarget then
			local targetPart = currentTarget:FindFirstChild("Head") or currentTarget:FindFirstChild("HumanoidRootPart")
			local humanoid = currentTarget:FindFirstChild("Humanoid")
			
			if not targetPart or not humanoid or humanoid.Health <= 0 then
				currentTarget = nil -- Target died or despawned
			elseif Config.WallCheck and not isVisible(currentTarget) then
				currentTarget = nil -- Target went behind a solid wall
			else
				-- Check if target escaped the FOV radius
				local screenPoint, onScreen = Camera:WorldToViewportPoint(targetPart.Position)
				local screenCenter = Vector2.new(Camera.ViewportSize.X / 2, Camera.ViewportSize.Y / 2)
				local distance = (Vector2.new(screenPoint.X, screenPoint.Y) - screenCenter).Magnitude
				
				if not onScreen or distance > Config.FOV then
					currentTarget = nil 
				end
			end
		end
		
		-- 2. Auto-Acquire New Target (if we lost the old one)
		if not currentTarget then
			currentTarget = getClosestTarget()
		end
		
		-- 3. Snap Camera to Target
		if currentTarget then
			local targetPart = currentTarget:FindFirstChild("Head") or currentTarget:FindFirstChild("HumanoidRootPart")
			local targetCFrame = CFrame.lookAt(Camera.CFrame.Position, targetPart.Position)
			Camera.CFrame = Camera.CFrame:Lerp(targetCFrame, Config.TrackingSpeed)
		end
	end
end)

Features & Information

Description: This is an optimized, cross-platform aim-lock script for Roblox. It features a draggable GUI, a dynamic FOV visualizer, and an advanced wall-check that ignores invisible barriers and glass to keep your lock perfectly secure. Key Features: * PC & Mobile Support: Automatically adds on-screen buttons for touch devices. * Smart Wall Check: Pierces through invisible/non-solid walls, only breaking the lock on true solid objects. * Dynamic FOV Circle: Visual indicator that turns from Red (Idle) to Green (Locked). * Auto-Retargeting: Automatically drops dead or hidden targets and snaps to the next closest enemy. * Smooth Camera Tracking: Fully adjustable aim speed (from smooth human-like assist to instant snap). * Draggable Menu: Clean dark-mode UI that can be moved around the screen. Settings update in real-time. Controls: * Aim Lock: Press E (PC) or the "Aim" screen button (Mobile). * Switch Target: Press Q (PC) or the "Switch" screen button (Mobile). * Toggle Menu: Press Right Shift (PC) or the "Menu" screen button (Mobile). Menu Settings: * Target Lock: Toggle the main aiming system ON or OFF. * Wall Check: Toggle whether the aim breaks when enemies go behind walls. * FOV Radius: Type a number to instantly change the size of the aim circle. * Aim Speed: Type a number between 0.01 (very slow) and 1 (instant snap).
#Roblox#Aimbot#Universal#Work in any executor

Community Comments (0)

No comments yet for this script.

More Scripts for Universal Scripts