AIMBOT SCRIPT V2
Key RequiredUniversal

AIMBOT SCRIPT V2

Universal ScriptVeldranVeldran 8.4K views 3.2K executesUpdated Dec 18, 2025
Unrated
00
Lua Script•414 lines (13130 chars)
-- AIMBOT MEJORADO (LocalScript)
-- Pegar en StarterPlayer -> StarterPlayerScripts

local Players = game:GetService("Players")
local RunService = game:GetService("RunService")
local UIS = game:GetService("UserInputService")

local LocalPlayer = Players.LocalPlayer
local Camera = workspace.CurrentCamera

-- ======================
-- CONFIGURACIÓN (ajusta si quieres)
-- ======================
local SMOOTHNESS = 0.18    -- 0..1, menor = más directo; 0.18 es suave pero rápido
local MAX_TARGET_DIST = 1000 -- distancia máxima para considerar objetivos
local AIM_PART_DEFAULT = "Head" -- parte por defecto

-- ======================
-- ESTADO
-- ======================
local AimbotEnabled = false
local TeamAimbotEnabled = false
local NPCAimbotEnabled = false

local TargetPartName = AIM_PART_DEFAULT
local SelectedPlayer = nil -- override por lista (Player)
local CurrentTargetModel = nil -- model (player.Character o modelo NPC)

-- ======================
-- UTIL: chequear vida
-- ======================
local function isModelAlive(model)
	if not model or not model:IsA("Model") then return false end
	local humanoid = model:FindFirstChildWhichIsA("Humanoid")
	if not humanoid then return false end
	if humanoid.Health and humanoid.Health > 0 then return true end
	return false
end

-- ======================
-- UTIL: obtener parte objetivo
-- ======================
local function getPartForModel(model, partName)
	if not model then return nil end

	-- intentos mapeo
	local candidates = {partName}
	-- añadimos nombres comunes
	if partName == "Torso" then
		candidates = {"Torso","UpperTorso","LowerTorso","HumanoidRootPart"}
	elseif partName == "HumanoidRootPart" then
		candidates = {"HumanoidRootPart"}
	elseif partName == "Head" then
		candidates = {"Head"}
	end

	for _,name in ipairs(candidates) do
		local p = model:FindFirstChild(name)
		if p and p:IsA("BasePart") then return p end
	end

	-- fallback
	for _,fallback in ipairs({"Head","HumanoidRootPart","UpperTorso","Torso"}) do
		local p = model:FindFirstChild(fallback)
		if p and p:IsA("BasePart") then return p end
	end

	return nil
end

-- ======================
-- BUSCADORES DE TARGETS
-- ======================

-- jugador enemigo más cercano (respeta TeamAimbot flag cuando se llame)
local function getClosestPlayer(filterEnemiesOnly)
	local best, bestDist = nil, math.huge
	local camPos = Camera.CFrame.Position

	for _,pl in ipairs(Players:GetPlayers()) do
		if pl ~= LocalPlayer and pl.Character and isModelAlive(pl.Character) then
			-- si se requiere solo enemigos, ignorar aliados
			if filterEnemiesOnly and pl.Team == LocalPlayer.Team then
				-- ignorar
			else
				local hrp = pl.Character:FindFirstChild("HumanoidRootPart") or pl.Character.PrimaryPart
				if hrp then
					local d = (hrp.Position - camPos).Magnitude
					if d < bestDist and d <= MAX_TARGET_DIST then
						best, bestDist = pl, d
					end
				end
			end
		end
	end

	return best -- retorna Player o nil
end

-- NPC más cercano (modelo con Humanoid, no asociado a Players)
local function getClosestNPC()
	local best, bestDist = nil, math.huge
	local camPos = Camera.CFrame.Position

	-- Si tienes una carpeta con NPCs (recomendado), cámbialo para iterar esa carpeta en vez de workspace:GetChildren()
	for _,obj in ipairs(workspace:GetChildren()) do
		if obj:IsA("Model") and not Players:GetPlayerFromCharacter(obj) then
			local hum = obj:FindFirstChildWhichIsA("Humanoid")
			local hrp = obj:FindFirstChild("HumanoidRootPart") or obj.PrimaryPart
			if hum and hrp and hum.Health and hum.Health > 0 then
				local d = (hrp.Position - camPos).Magnitude
				if d < bestDist and d <= MAX_TARGET_DIST then
					best, bestDist = obj, d
				end
			end
		end
	end

	return best -- Model or nil
end

-- resolver objetivo final (prioridad: SelectedPlayer override, NPC if NPCAimbot on, team/enemy logic, fallback to any player)
local function resolveTargetModel()
	-- 1) Si hay selección manual y sigue viva -> usarla
	if SelectedPlayer and SelectedPlayer.Character and isModelAlive(SelectedPlayer.Character) then
		return SelectedPlayer.Character
	end

	-- 2) Si NPC AIMBOT está ON -> priorizar NPCs vivos cercanos
	if NPCAimbotEnabled then
		local npc = getClosestNPC()
		if npc then return npc end
	end

	-- 3) Si TeamAimbot ON -> encontrar enemigo más cercano
	if TeamAimbotEnabled then
		local enemyPlayer = getClosestPlayer(true)
		if enemyPlayer and enemyPlayer.Character and isModelAlive(enemyPlayer.Character) then
			return enemyPlayer.Character
		end
	end

	-- 4) Si TeamAimbot OFF -> buscar cualquier jugador vivo más cercano (FFA)
	local anyPlayer = getClosestPlayer(false)
	if anyPlayer and anyPlayer.Character and isModelAlive(anyPlayer.Character) then
		return anyPlayer.Character
	end

	-- 5) fallback: si no hay jugadores vivos, buscar NPC como extremo
	local fallbackNPC = getClosestNPC()
	if fallbackNPC then return fallbackNPC end

	return nil
end

-- ======================
-- GUI (neón) + LISTA con show/hide + selección
-- ======================
local function createNeonGUI()
	local playerGui = LocalPlayer:WaitForChild("PlayerGui")
	local screen = Instance.new("ScreenGui")
	screen.Name = "AimbotNeonGUI"
	screen.ResetOnSpawn = false
	screen.Parent = playerGui

	-- OPEN button (top-right)
	local openBtn = Instance.new("TextButton")
	openBtn.Name = "OpenBtn"
	openBtn.Parent = screen
	openBtn.Size = UDim2.new(0,120,0,44)
	openBtn.Position = UDim2.new(0.85, 0, 0.03, 0)
	openBtn.Text = "OPEN"
	openBtn.BackgroundTransparency = 0
	openBtn.BackgroundColor3 = Color3.fromRGB(12,12,12)
	openBtn.TextColor3 = Color3.fromRGB(200,255,255)
	openBtn.Font = Enum.Font.GothamBold
	openBtn.TextSize = 18
	openBtn.AutoButtonColor = true

	-- neon style stroke + gradient
	local stroke = Instance.new("UIStroke", openBtn)
	stroke.Thickness = 2
	stroke.Color = Color3.fromRGB(0, 255, 200)
	local grad = Instance.new("UIGradient", openBtn)
	grad.Color = ColorSequence.new({ColorSequenceKeypoint.new(0, Color3.fromRGB(0,120,255)), ColorSequenceKeypoint.new(1, Color3.fromRGB(0,255,200))})

	-- MAIN FRAME (hidden by default)
	local frame = Instance.new("Frame", screen)
	frame.Name = "MainFrame"
	frame.Size = UDim2.new(0, 360, 0, 460)
	frame.Position = UDim2.new(0.55, 0, 0.12, 0)
	frame.BackgroundColor3 = Color3.fromRGB(8,8,8)
	frame.BorderSizePixel = 0
	frame.Visible = false

	-- neon top
	local top = Instance.new("Frame", frame)
	top.Size = UDim2.new(1,0,0,48)
	top.Position = UDim2.new(0,0,0,0)
	top.BackgroundColor3 = Color3.fromRGB(2,2,2)
	local title = Instance.new("TextLabel", top)
	title.Size = UDim2.new(0.8,0,1,0)
	title.Position = UDim2.new(0.02,0,0,0)
	title.BackgroundTransparency = 1
	title.Text = "AIMBOT NEON"
	title.TextColor3 = Color3.fromRGB(0,255,200)
	title.Font = Enum.Font.GothamBlack
	title.TextSize = 20

	local closeX = Instance.new("TextButton", top)
	closeX.Size = UDim2.new(0,36,0,36)
	closeX.Position = UDim2.new(0.93,0,0.08,0)
	closeX.Text = "X"
	closeX.TextColor3 = Color3.fromRGB(255,255,255)
	closeX.BackgroundColor3 = Color3.fromRGB(40,0,0)

	-- Buttons area
	local btnY = 0.12
	local function makeBtn(text)
		local b = Instance.new("TextButton", frame)
		b.Size = UDim2.new(0.88,0,0,44)
		b.Position = UDim2.new(0.06,0,btnY,0)
		btnY = btnY + 0.12
		b.Text = text
		b.TextScaled = true
		b.Font = Enum.Font.GothamBold
		b.BackgroundColor3 = Color3.fromRGB(10,10,10)
		b.TextColor3 = Color3.fromRGB(180,255,230)
		local s = Instance.new("UIStroke", b)
		s.Color = Color3.fromRGB(0,200,180)
		s.Thickness = 1.6
		return b
	end

	local lockBtn = makeBtn("LOCK (OFF)")
	local teamBtn = makeBtn("TEAM AIMBOT (OFF)")
	local npcBtn = makeBtn("NPC AIMBOT (OFF)")

	-- Part input
	local partBox = Instance.new("TextBox", frame)
	partBox.Size = UDim2.new(0.88,0,0,34)
	partBox.Position = UDim2.new(0.06,0,0.5,0)
	partBox.PlaceholderText = "Parte objetivo (Head default)"
	partBox.Text = ""
	partBox.BackgroundColor3 = Color3.fromRGB(6,6,6)
	partBox.TextColor3 = Color3.fromRGB(200,255,230)

	-- List toggle button
	local listToggle = Instance.new("TextButton", frame)
	listToggle.Size = UDim2.new(0.88,0,0,36)
	listToggle.Position = UDim2.new(0.06,0,0.58,0)
	listToggle.Text = "Mostrar lista de jugadores"
	listToggle.TextColor3 = Color3.fromRGB(200,255,230)
	listToggle.BackgroundColor3 = Color3.fromRGB(10,10,10)
	listToggle.Font = Enum.Font.GothamSemibold

	-- Player list (compact) with scroll
	local listFrame = Instance.new("Frame", frame)
	listFrame.Size = UDim2.new(0.88,0,0,170)
	listFrame.Position = UDim2.new(0.06,0,0.65,0)
	listFrame.BackgroundColor3 = Color3.fromRGB(4,4,4)
	listFrame.Visible = false
	local scroll = Instance.new("ScrollingFrame", listFrame)
	scroll.Size = UDim2.new(1,-8,1,-8)
	scroll.Position = UDim2.new(0,4,0,4)
	scroll.BackgroundTransparency = 1
	scroll.CanvasSize = UDim2.new(0,0,0,0)
	scroll.ScrollBarThickness = 8

	local function populatePlayerList()
		scroll:ClearAllChildren()
		local y = 0
		for _,pl in ipairs(Players:GetPlayers()) do
			if pl ~= LocalPlayer then
				local b = Instance.new("TextButton", scroll)
				b.Size = UDim2.new(1,-10,0,30)
				b.Position = UDim2.new(0,5,0,y)
				b.Text = pl.Name
				b.TextColor3 = Color3.fromRGB(200,255,230)
				b.BackgroundColor3 = Color3.fromRGB(12,12,12)
				b.Font = Enum.Font.Gotham
				b.TextScaled = true

				b.MouseButton1Click:Connect(function()
					SelectedPlayer = pl
					-- close list automatically
					listFrame.Visible = false
					listToggle.Text = "Mostrar lista de jugadores"
				end)

				y = y + 34
			end
		end
		scroll.CanvasSize = UDim2.new(0,0,0, math.max(1,y))
	end

	-- EVENTS: wiring buttons
	openBtn.MouseButton1Click:Connect(function()
		frame.Visible = not frame.Visible
		openBtn.Text = frame.Visible and "CLOSE" or "OPEN"
		if frame.Visible then populatePlayerList() end
	end)

	closeX.MouseButton1Click:Connect(function()
		frame.Visible = false
		openBtn.Text = "OPEN"
	end)

	lockBtn.MouseButton1Click:Connect(function()
		AimbotEnabled = not AimbotEnabled
		lockBtn.Text = AimbotEnabled and "LOCK: ON" or "LOCK (OFF)"
	end)

	teamBtn.MouseButton1Click:Connect(function()
		TeamAimbotEnabled = not TeamAimbotEnabled
		teamBtn.Text = TeamAimbotEnabled and "TEAM: ON" or "TEAM AIMBOT (OFF)"
	end)

	npcBtn.MouseButton1Click:Connect(function()
		NPCAimbotEnabled = not NPCAimbotEnabled
		npcBtn.Text = NPCAimbotEnabled and "NPC: ON" or "NPC AIMBOT (OFF)"
	end)

	partBox.FocusLost:Connect(function()
		if partBox.Text and partBox.Text ~= "" then
			TargetPartName = partBox.Text
		else
			TargetPartName = AIM_PART_DEFAULT
		end
	end)

	listToggle.MouseButton1Click:Connect(function()
		listFrame.Visible = not listFrame.Visible
		listToggle.Text = listFrame.Visible and "Ocultar lista de jugadores" or "Mostrar lista de jugadores"
		if listFrame.Visible then populatePlayerList() end
	end)

	-- return UI references for debug if needed
	return {
		OpenBtn = openBtn,
		Frame = frame,
		Populate = populatePlayerList
	}
end

-- crear GUI
local UI = createNeonGUI()

-- ======================
-- AIMBOT LOOP: apunta a modelo vivo; si muere, retargetea
-- ======================
RunService.RenderStepped:Connect(function(dt)
	-- limpiar selectedPlayer si murió o desconectó
	if SelectedPlayer and (not SelectedPlayer.Parent or not (SelectedPlayer.Character and isModelAlive(SelectedPlayer.Character))) then
		SelectedPlayer = nil
	end

	if not AimbotEnabled then return end

	-- resolver objetivo
	local resolved = resolveTargetModel()
	if not resolved then
		CurrentTargetModel = nil
		return
	end

	-- si resolved no está vivo, saltamos
	if not isModelAlive(resolved) then
		CurrentTargetModel = nil
		return
	end

	-- obtener parte a mirar
	local part = getPartForModel(resolved, TargetPartName)
	if not part then return end

	-- aplicar suavizado y apuntar (solo rotación)
	local camPos = Camera.CFrame.Position
	local desired = CFrame.new(camPos, part.Position)
	local lerpAlpha = math.clamp(1 - SMOOTHNESS, 0, 1)
	-- frame-rate independent lerp
	local t = 1 - math.exp(- (1 - SMOOTHNESS) * 60 * dt)
	local newCFrame = Camera.CFrame:Lerp(desired, t)
	Camera.CFrame = CFrame.new(camPos, (newCFrame * CFrame.new(0,0,-1)).Position)

	CurrentTargetModel = resolved
end)

-- ======================
-- ATajos teclado (F abrir, C toggle aimbot, T toggle team)
-- ======================
UIS.InputBegan:Connect(function(input, gp)
	if gp then return end
	if input.UserInputType == Enum.UserInputType.Keyboard then
		if input.KeyCode == Enum.KeyCode.F then
			if UI and UI.OpenBtn then UI.OpenBtn:Activate() end
		elseif input.KeyCode == Enum.KeyCode.C then
			AimbotEnabled = not AimbotEnabled
		elseif input.KeyCode == Enum.KeyCode.T then
			TeamAimbotEnabled = not TeamAimbotEnabled
		end
	end
end)

-- ======================
-- actualizar lista dinámicamente si entran/salen jugadores
-- ======================
Players.PlayerAdded:Connect(function() if UI and UI.Populate then UI.Populate() end end)
Players.PlayerRemoving:Connect(function()
	if SelectedPlayer and not Players:FindFirstChild(SelectedPlayer.Name) then SelectedPlayer = nil end
	if UI and UI.Populate then UI.Populate() end
end)

print("Aimbot mejorado cargado.")

Features & Information

Este script es la V2 de mi anterior script aimbot, este lleva con una nueva mejora, detecta muerte, al detectar la muerte de algun jugador/enemigo, cambia al siguiente enemigo cercano, algo que la V1 no tenia Quizas suba proximamente la V3, el aimbot final que subire, pues ya esta hecho, pero solo es de mi uso personal, Si lo llegase a subir seria con KEY, pero a mi no me gusta poner KEYs, entonces NO, No habra Key para la V3, porque no saldra, esten atentos si algun dia quiera cambiar mi decision
#Unirversal#GPT#Aimbot#V

Community Comments (2)

dwdwdwdwdwdw2dwdwdwdwdwdw2Dec 18, 2025

a

Key

More Scripts for Universal Scripts