-- 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.")