-- This script is made by Gemini, I don't deserve the rights to it. -- ========================================== -- SISTEMA DE REINICIO AUTOMÁTICO (CLEANUP) -- ========================================== local globalEnv = getgenv and getgenv() or _G if globalEnv.XenoCleanup then pcall(function() globalEnv.XenoCleanup() end) end local isScriptRunning = true local connections = {} local Players = game:GetService("Players") local UserInputService = game:GetService("UserInputService") local PathfindingService = game:GetService("PathfindingService") local StarterGui = game:GetService("StarterGui") local RunService = game:GetService("RunService") local LocalPlayer = Players.LocalPlayer local mouse = LocalPlayer:GetMouse() local function notify(title, text) pcall(function() StarterGui:SetCore("SendNotification", { Title = title, Text = text, Duration = 3 }) end) end -- ========================================== -- VARIABLES GLOBALES Y CONFIGURACIÓN -- ========================================== local isTracking = false local targetMode = "Todos" local movementMode = "Perseguir" -- "Perseguir", "Huir", "Merodear", "ClickToMove" local clickToMovePos = nil local wanderTarget = nil local entityMode = "Jugadores" local manualTargetEntity = nil local activeTargetRoot = nil -- Configuraciones F1 local allowJumping = true local ignoreSpecialBlocks = false local autoAttack = false local unequipAfterUse = false local ignoreDead = true local autoJumpHazards = false local isFreelock = false local attackDistance = 10 local trackingRadius = math.huge local deadRadius = 0 local maxDropDistance = math.huge local trackingTask = nil local rigCheckTask = nil local currentLookTarget = nil local lastRigType = nil local cachedNPCs = {} local globalHeartbeatJumpTime = 0 local isESPEnabled = false local espBoxes = {} -- Elementos de Interfaz local btnESP = nil local settingsFrame = nil local mainFrame = nil local pathVisualsFolder = workspace:FindFirstChild("XenoPathVisuals") local espVisualsFolder = workspace:FindFirstChild("XenoESPVisualsFolder") if not espVisualsFolder then espVisualsFolder = Instance.new("Folder") espVisualsFolder.Name = "XenoESPVisualsFolder" espVisualsFolder.Parent = workspace end if not pathVisualsFolder then pathVisualsFolder = Instance.new("Folder") pathVisualsFolder.Name = "XenoPathVisuals" pathVisualsFolder.Parent = workspace end local function toggleESP() isESPEnabled = not isESPEnabled notify("Visual", "ESP Objetivos: " .. (isESPEnabled and "ACTIVADO" or "DESACTIVADO")) if btnESP then btnESP.Text = isESPEnabled and "SI" or "NO" btnESP.TextColor3 = isESPEnabled and Color3.fromRGB(0, 200, 50) or Color3.fromRGB(200, 50, 50) local stroke = btnESP:FindFirstChildOfClass("UIStroke") if stroke then stroke.Color = isESPEnabled and Color3.fromRGB(0, 200, 50) or Color3.fromRGB(200, 50, 50) end end if not isESPEnabled then for char, box in pairs(espBoxes) do if box.proxyPart then box.proxyPart:Destroy() end end table.clear(espBoxes) if espVisualsFolder then espVisualsFolder:ClearAllChildren() end end end local isJumpingHazard = false local hazardJumpDirection = Vector3.zero -- ========================================== -- EVENTO CLICK TO MOVE -- ========================================== table.insert(connections, mouse.Button1Down:Connect(function() if isScriptRunning and isTracking and movementMode == "ClickToMove" then if mouse.Hit then clickToMovePos = mouse.Hit.Position notify("Ruta", "Moviendo a la ubicación seleccionada") end end end)) -- ========================================== -- FUNCIÓN PARA VOLVER ARRASTRABLES LAS VENTANAS -- ========================================== local function enableDragging(frame, dragHandle) dragHandle = dragHandle or frame local dragging = false local dragInput, dragStart, startPos table.insert(connections, dragHandle.InputBegan:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then dragging = true dragStart = input.Position startPos = frame.Position input.Changed:Connect(function() if input.UserInputState == Enum.UserInputState.End then dragging = false end end) end end)) table.insert(connections, dragHandle.InputChanged:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch then dragInput = input end end)) table.insert(connections, UserInputService.InputChanged:Connect(function(input) if input == dragInput and dragging then local delta = input.Position - dragStart frame.Position = UDim2.new(startPos.X.Scale, startPos.X.Offset + delta.X, startPos.Y.Scale, startPos.Y.Offset + delta.Y) end end)) end -- ========================================== -- INTERFAZ DE CONTROLES Y CONFIGURACIÓN (UI) -- ========================================== local sg = Instance.new("ScreenGui") sg.Name = "XenoControlsGui" sg.ResetOnSpawn = false local success = pcall(function() sg.Parent = LocalPlayer:FindFirstChild("PlayerGui") or game:GetService("CoreGui") end) local function createControlsUI() if not success then return end mainFrame = Instance.new("Frame") mainFrame.Size = UDim2.new(0, 240, 0, 310) mainFrame.Position = UDim2.new(0, 30, 0.5, -155) mainFrame.BackgroundColor3 = Color3.fromRGB(18, 18, 20) mainFrame.BackgroundTransparency = 0.7 mainFrame.BorderSizePixel = 0 mainFrame.Parent = sg local mainCorner = Instance.new("UICorner") mainCorner.CornerRadius = UDim.new(0, 16) mainCorner.Parent = mainFrame local mainStroke = Instance.new("UIStroke") mainStroke.Color = Color3.fromRGB(255, 255, 255) mainStroke.Thickness = 1.5 mainStroke.Parent = mainFrame local headerFrame = Instance.new("Frame") headerFrame.Size = UDim2.new(1, 0, 0, 42) headerFrame.BackgroundTransparency = 1 headerFrame.Parent = mainFrame local titleLabel = Instance.new("TextLabel") titleLabel.Size = UDim2.new(1, -90, 1, 0) titleLabel.Position = UDim2.new(0, 15, 0, 0) titleLabel.BackgroundTransparency = 1 titleLabel.Text = "Controles" titleLabel.TextColor3 = Color3.fromRGB(255, 255, 255) titleLabel.Font = Enum.Font.SourceSans titleLabel.TextSize = 22 titleLabel.TextXAlignment = Enum.TextXAlignment.Left titleLabel.Parent = headerFrame local btnMin = Instance.new("TextButton") btnMin.Size = UDim2.new(0, 32, 0, 32) btnMin.Position = UDim2.new(1, -75, 0, 5) btnMin.BackgroundColor3 = Color3.fromRGB(25, 25, 28) btnMin.Text = "—" btnMin.TextColor3 = Color3.fromRGB(255, 255, 255) btnMin.Font = Enum.Font.SourceSansBold btnMin.TextSize = 16 btnMin.Parent = headerFrame local minCorner = Instance.new("UICorner") minCorner.CornerRadius = UDim.new(1, 0) minCorner.Parent = btnMin local minStroke = Instance.new("UIStroke") minStroke.Color = Color3.fromRGB(255, 255, 255) minStroke.Thickness = 1.2 minStroke.Parent = btnMin local btnClose = Instance.new("TextButton") btnClose.Size = UDim2.new(0, 32, 0, 32) btnClose.Position = UDim2.new(1, -38, 0, 5) btnClose.BackgroundColor3 = Color3.fromRGB(25, 25, 28) btnClose.Text = "X" btnClose.TextColor3 = Color3.fromRGB(255, 255, 255) btnClose.Font = Enum.Font.SourceSansBold btnClose.TextSize = 16 btnClose.Parent = headerFrame local closeCorner = Instance.new("UICorner") closeCorner.CornerRadius = UDim.new(1, 0) closeCorner.Parent = btnClose local closeStroke = Instance.new("UIStroke") closeStroke.Color = Color3.fromRGB(255, 255, 255) closeStroke.Thickness = 1.2 closeStroke.Parent = btnClose local contentFrame = Instance.new("Frame") contentFrame.Size = UDim2.new(1, -20, 1, -50) contentFrame.Position = UDim2.new(0, 10, 0, 42) contentFrame.BackgroundTransparency = 1 contentFrame.Parent = mainFrame local contentLayout = Instance.new("UIListLayout") contentLayout.Parent = contentFrame contentLayout.SortOrder = Enum.SortOrder.LayoutOrder contentLayout.Padding = UDim.new(0, 6) local controlsList = { "F1: Abrir conf. adicional", "F2: Jugadores/ NPC's", "F3: Pers/Huir/Merodear/Click", "F4: Activar / Desactivar", "F5: Filtrar Alid. / Enem.", "F6: Ciclar objetivos", "Mantener F6: Modo autom." } for _, text in ipairs(controlsList) do local lbl = Instance.new("TextLabel") lbl.Size = UDim2.new(1, 0, 0, 22) lbl.BackgroundTransparency = 1 lbl.Text = text lbl.TextColor3 = Color3.fromRGB(255, 255, 255) lbl.Font = Enum.Font.SourceSans lbl.TextSize = 16 lbl.TextXAlignment = Enum.TextXAlignment.Center lbl.Parent = contentFrame end enableDragging(mainFrame, headerFrame) local isMinimized = false table.insert(connections, btnMin.MouseButton1Click:Connect(function() isMinimized = not isMinimized contentFrame.Visible = not isMinimized mainFrame.Size = isMinimized and UDim2.new(0, 240, 0, 42) or UDim2.new(0, 240, 0, 310) end)) table.insert(connections, btnClose.MouseButton1Click:Connect(function() if globalEnv.XenoCleanup then globalEnv.XenoCleanup() end end)) settingsFrame = Instance.new("Frame") settingsFrame.Size = UDim2.new(0, 230, 0, 490) settingsFrame.Position = UDim2.new(0, 280, 0.5, -245) settingsFrame.BackgroundColor3 = Color3.fromRGB(18, 18, 20) settingsFrame.BackgroundTransparency = 0.7 settingsFrame.BorderSizePixel = 0 settingsFrame.Visible = false settingsFrame.Parent = sg local settingsCorner = Instance.new("UICorner") settingsCorner.CornerRadius = UDim.new(0, 16) settingsCorner.Parent = settingsFrame local settingsStroke = Instance.new("UIStroke") settingsStroke.Color = Color3.fromRGB(255, 255, 255) settingsStroke.Thickness = 1.5 settingsStroke.Parent = settingsFrame local settingsHeader = Instance.new("Frame") settingsHeader.Size = UDim2.new(1, 0, 0, 35) settingsHeader.BackgroundTransparency = 1 settingsHeader.Parent = settingsFrame local settingsTitle = Instance.new("TextLabel") settingsTitle.Size = UDim2.new(1, 0, 1, 0) settingsTitle.BackgroundTransparency = 1 settingsTitle.Text = "Configuración adicional" settingsTitle.TextColor3 = Color3.fromRGB(255, 255, 255) settingsTitle.Font = Enum.Font.SourceSans settingsTitle.TextSize = 20 settingsTitle.Parent = settingsHeader enableDragging(settingsFrame, settingsHeader) local settingsListContainer = Instance.new("Frame") settingsListContainer.Size = UDim2.new(1, -20, 1, -60) settingsListContainer.Position = UDim2.new(0, 10, 0, 35) settingsListContainer.BackgroundTransparency = 1 settingsListContainer.Parent = settingsFrame local settingsListLayout = Instance.new("UIListLayout") settingsListLayout.Parent = settingsListContainer settingsListLayout.SortOrder = Enum.SortOrder.LayoutOrder settingsListLayout.Padding = UDim.new(0, 7) local function createToggleRow(labelText, defaultState, callback) local row = Instance.new("Frame") row.Size = UDim2.new(1, 0, 0, 28) row.BackgroundTransparency = 1 row.Parent = settingsListContainer local label = Instance.new("TextLabel") label.Size = UDim2.new(0.68, 0, 1, 0) label.BackgroundTransparency = 1 label.Text = labelText .. " :" label.TextColor3 = Color3.fromRGB(255, 255, 255) label.Font = Enum.Font.SourceSans label.TextSize = 15 label.TextXAlignment = Enum.TextXAlignment.Left label.Parent = row local btn = Instance.new("TextButton") btn.Size = UDim2.new(0.32, 0, 1, 0) btn.Position = UDim2.new(0.68, 0, 0, 0) btn.BackgroundColor3 = Color3.fromRGB(25, 25, 28) btn.BackgroundTransparency = 0.5 btn.Text = defaultState and "SI" or "NO" btn.TextColor3 = defaultState and Color3.fromRGB(0, 200, 50) or Color3.fromRGB(200, 50, 50) btn.Font = Enum.Font.SourceSansBold btn.TextSize = 14 btn.Parent = row local pillCorner = Instance.new("UICorner") pillCorner.CornerRadius = UDim.new(0.5, 0) pillCorner.Parent = btn local btnStroke = Instance.new("UIStroke") btnStroke.Color = defaultState and Color3.fromRGB(0, 200, 50) or Color3.fromRGB(200, 50, 50) btnStroke.Thickness = 1.5 btnStroke.Parent = btn table.insert(connections, btn.MouseButton1Click:Connect(function() local newState = callback() btn.Text = newState and "SI" or "NO" btn.TextColor3 = newState and Color3.fromRGB(0, 200, 50) or Color3.fromRGB(200, 50, 50) btnStroke.Color = newState and Color3.fromRGB(0, 200, 50) or Color3.fromRGB(200, 50, 50) end)) return btn end local function createInputRow(labelText, defaultValue, callback) local row = Instance.new("Frame") row.Size = UDim2.new(1, 0, 0, 28) row.BackgroundTransparency = 1 row.Parent = settingsListContainer local label = Instance.new("TextLabel") label.Size = UDim2.new(0.68, 0, 1, 0) label.BackgroundTransparency = 1 label.Text = labelText .. " :" label.TextColor3 = Color3.fromRGB(255, 255, 255) label.Font = Enum.Font.SourceSans label.TextSize = 15 label.TextXAlignment = Enum.TextXAlignment.Left label.Parent = row local box = Instance.new("TextBox") box.Size = UDim2.new(0.32, 0, 1, 0) box.Position = UDim2.new(0.68, 0, 0, 0) box.BackgroundColor3 = Color3.fromRGB(25, 25, 28) box.Text = tostring(defaultValue) box.TextColor3 = Color3.fromRGB(255, 255, 255) box.Font = Enum.Font.SourceSansBold box.TextSize = 14 box.Parent = row local boxCorner = Instance.new("UICorner") boxCorner.CornerRadius = UDim.new(0.5, 0) boxCorner.Parent = box local boxStroke = Instance.new("UIStroke") boxStroke.Color = Color3.fromRGB(255, 255, 255) boxStroke.Thickness = 1 boxStroke.Parent = box table.insert(connections, box.FocusLost:Connect(function() callback(box) end)) end createToggleRow("Saltar", allowJumping, function() allowJumping = not allowJumping return allowJumping end) createToggleRow("Ignorar peligros", ignoreSpecialBlocks, function() ignoreSpecialBlocks = not ignoreSpecialBlocks return ignoreSpecialBlocks end) createToggleRow("Saltar peligros", autoJumpHazards, function() autoJumpHazards = not autoJumpHazards return autoJumpHazards end) createToggleRow("Ignorar muertos", ignoreDead, function() ignoreDead = not ignoreDead return ignoreDead end) btnESP = createToggleRow("Ver objetivos", isESPEnabled, function() toggleESP() return isESPEnabled end) createToggleRow("Auto usar herramientas", autoAttack, function() autoAttack = not autoAttack return autoAttack end) createToggleRow("Deseleccionar al usar", unequipAfterUse, function() unequipAfterUse = not unequipAfterUse return unequipAfterUse end) createToggleRow("Freelock", isFreelock, function() isFreelock = not isFreelock return isFreelock end) createInputRow("Rango uso herr.", attackDistance, function(box) local num = tonumber(box.Text) if num and num >= 0 then attackDistance = num end box.Text = tostring(attackDistance) end) createInputRow("Rango de búsqueda", "Inf", function(box) local txt = box.Text local num = tonumber(txt) if not num or num < 0 then if txt:lower() == "inf" or txt == "" then trackingRadius = math.huge box.Text = "Inf" else box.Text = trackingRadius == math.huge and "Inf" or tostring(trackingRadius) end else trackingRadius = num box.Text = tostring(trackingRadius) end end) createInputRow("Zona muerta", deadRadius, function(box) local num = tonumber(box.Text) if not num or num < 0 then box.Text = tostring(deadRadius) return end deadRadius = num box.Text = tostring(deadRadius) end) createInputRow("Dist. de caída máx.", "Inf", function(box) local txt = box.Text local num = tonumber(txt) if not num or num < 0 then if txt:lower() == "inf" or txt == "" then maxDropDistance = math.huge box.Text = "Inf" else box.Text = maxDropDistance == math.huge and "Inf" or tostring(maxDropDistance) end else maxDropDistance = num box.Text = tostring(maxDropDistance) end end) local footerLabel = Instance.new("TextLabel") footerLabel.Size = UDim2.new(1, 0, 0, 20) footerLabel.Position = UDim2.new(0, 0, 1, -25) footerLabel.BackgroundTransparency = 1 footerLabel.Text = "(F1 para cerrar ventana)" footerLabel.TextColor3 = Color3.fromRGB(200, 200, 200) footerLabel.Font = Enum.Font.SourceSansItalic footerLabel.TextSize = 14 footerLabel.Parent = settingsFrame end createControlsUI() -- ========================================== -- SISTEMA DE DETECCIÓN Y MODIFICADORES -- ========================================== local function checkPartForModifiers(obj) if obj:IsA("BasePart") then local name = string.lower(obj.Name) if obj:IsA("TrussPart") or string.find(name, "ladder") or string.find(name, "escalera") or string.find(name, "climb") or string.find(name, "truss") then if not obj:FindFirstChildOfClass("PathfindingLink") then local halfHeight = obj.Size.Y / 2 local attBottom = Instance.new("Attachment") attBottom.Name = "XenoLadderBottom" attBottom.Position = Vector3.new(0, -halfHeight + 1.5, 0) attBottom.Parent = obj local attTop = Instance.new("Attachment") attTop.Name = "XenoLadderTop" attTop.Position = Vector3.new(0, halfHeight - 1, 0) attTop.Parent = obj local link = Instance.new("PathfindingLink") link.Attachment0 = attBottom link.Attachment1 = attTop link.IsBidirectional = true link.Label = "Climbable" link.Parent = obj end return end if obj:FindFirstChildOfClass("PathfindingModifier") then return end if obj:IsA("Seat") or obj:IsA("VehicleSeat") then local modifier = Instance.new("PathfindingModifier") modifier.Label = "SeatHazard" modifier.Parent = obj return end if string.find(name, "kill") or string.find(name, "lava") or string.find(name, "damage") or string.find(name, "spike") or string.find(name, "acid") or string.find(name, "hurt") or string.find(name, "muerte") or string.find(name, "daño") or string.find(name, "dano") or string.find(name, "pincho") or string.find(name, "trampa") or string.find(name, "trip") then local isSmallHazard = (obj.Size.X <= 4 or obj.Size.Z <= 4) and obj.Size.Y <= 1 local modifier = Instance.new("PathfindingModifier") modifier.Label = isSmallHazard and "SmallHazard" or "Hazard" modifier.Parent = obj elseif string.find(name, "seat") or string.find(name, "asiento") then local modifier = Instance.new("PathfindingModifier") modifier.Label = "Hazard" modifier.Parent = obj elseif string.find(name, "teleport") or string.find(name, "portal") or string.find(name, "tp") or string.find(name, "pad") then local modifier = Instance.new("PathfindingModifier") modifier.Label = "Teleporter" modifier.Parent = obj elseif string.find(name, "conveyor") or string.find(name, "belt") or string.find(name, "cinta") or string.find(name, "transportadora") or (obj.Anchored and obj.AssemblyLinearVelocity.Magnitude > 1) then local modifier = Instance.new("PathfindingModifier") modifier.Label = "Conveyor" modifier.Parent = obj elseif obj.Material == Enum.Material.Ice or string.find(name, "ice") or string.find(name, "hielo") or string.find(name, "slide") or string.find(name, "slip") or string.find(name, "desliza") or string.find(name, "resbala") then local modifier = Instance.new("PathfindingModifier") modifier.Label = "Slippery" modifier.Parent = obj end end end local function checkNPC(obj) if obj:IsA("Model") and obj ~= LocalPlayer.Character then local hum = obj:FindFirstChildOfClass("Humanoid") if hum then local root = obj:FindFirstChild("HumanoidRootPart") or obj.PrimaryPart if root and not Players:GetPlayerFromCharacter(obj) then local exists = false for _, npc in ipairs(cachedNPCs) do if npc == obj then exists = true break end end if not exists then table.insert(cachedNPCs, obj) end end end end end task.spawn(function() local descendants = workspace:GetDescendants() for i, obj in ipairs(descendants) do if not isScriptRunning then break end checkPartForModifiers(obj) if obj:IsA("Model") then checkNPC(obj) end if i % 1000 == 0 then task.wait() end end end) table.insert(connections, workspace.DescendantAdded:Connect(function(obj) checkPartForModifiers(obj) if obj:IsA("Model") then task.delay(0.5, function() if obj and obj.Parent then checkNPC(obj) end end) elseif obj:IsA("Humanoid") and obj.Parent:IsA("Model") then checkNPC(obj.Parent) end end)) task.spawn(function() while task.wait(10) do if not isScriptRunning then break end for i = #cachedNPCs, 1, -1 do local npc = cachedNPCs[i] if not npc or not npc.Parent then table.remove(cachedNPCs, i) end end end end) local function clearPathVisuals() for _, child in ipairs(pathVisualsFolder:GetChildren()) do child:Destroy() end end local function drawPath(waypoints, color, transparency) if not waypoints then return end color = color or Color3.fromRGB(0, 255, 150) transparency = transparency or 0.3 for i = 1, #waypoints - 1 do local p1 = waypoints[i].Position local p2 = waypoints[i + 1].Position local distance = (p1 - p2).Magnitude local line = Instance.new("Part") line.Size = Vector3.new(0.05, 0.05, distance) line.CFrame = CFrame.lookAt(p1, p2) * CFrame.new(0, 0, -distance / 2) line.Anchored = true line.CanCollide = false line.Material = Enum.Material.Neon line.Color = color line.Transparency = transparency line.Parent = pathVisualsFolder end end local function getSafeRootPart(character) if not character then return nil end return character:FindFirstChild("HumanoidRootPart") or character.PrimaryPart or character:FindFirstChild("Torso") or character:FindFirstChild("UpperTorso") end local function getAvailableEntities() local list = {} if entityMode == "Jugadores" or entityMode == "Ambos" then for _, p in ipairs(Players:GetPlayers()) do if p ~= LocalPlayer and p.Character then table.insert(list, {name = p.DisplayName, accountName = p.Name, char = p.Character, isPlayer = true, player = p}) end end end if entityMode == "NPCs" or entityMode == "Ambos" then for _, npc in ipairs(cachedNPCs) do if npc and npc.Parent then table.insert(list, {name = npc.Name, char = npc, isPlayer = false}) end end end return list end local function getTargetsSortedByDistance() local targets = {} local myChar = LocalPlayer.Character local myRoot = getSafeRootPart(myChar) if not myRoot then return targets end if manualTargetEntity then if manualTargetEntity.isPlayer then local p = Players:FindFirstChild(manualTargetEntity.accountName) if p then local pChar = p.Character if pChar then local targetRoot = getSafeRootPart(pChar) local hum = pChar:FindFirstChildOfClass("Humanoid") local isAlive = hum and hum.Health > 0 and hum:GetState() ~= Enum.HumanoidStateType.Dead if not ignoreDead or isAlive then if targetRoot then manualTargetEntity.char = pChar local dist = (myRoot.Position - targetRoot.Position).Magnitude if dist <= trackingRadius then table.insert(targets, {character = pChar, distance = dist}) return targets end end end end return targets else local npcChar = manualTargetEntity.char local isAlive = false if npcChar and npcChar.Parent then local targetRoot = getSafeRootPart(npcChar) local hum = npcChar:FindFirstChildOfClass("Humanoid") local aliveCheck = hum and hum.Health > 0 and hum:GetState() ~= Enum.HumanoidStateType.Dead if not ignoreDead or aliveCheck then if targetRoot then isAlive = true local dist = (myRoot.Position - targetRoot.Position).Magnitude if dist <= trackingRadius then table.insert(targets, {character = npcChar, distance = dist}) return targets end end end end if not isAlive then local foundNewNPC = nil for _, npc in ipairs(cachedNPCs) do if npc and npc.Parent and npc.Name == manualTargetEntity.name then local root = getSafeRootPart(npc) local hum = npc:FindFirstChildOfClass("Humanoid") local aliveCheck = hum and hum.Health > 0 and hum:GetState() ~= Enum.HumanoidStateType.Dead if root and (not ignoreDead or aliveCheck) then foundNewNPC = npc break end end end if foundNewNPC then manualTargetEntity.char = foundNewNPC local targetRoot = getSafeRootPart(foundNewNPC) local dist = (myRoot.Position - targetRoot.Position).Magnitude if dist <= trackingRadius then table.insert(targets, {character = foundNewNPC, distance = dist}) return targets end else return targets end end end end end local entities = getAvailableEntities() for _, ent in ipairs(entities) do local targetRoot = getSafeRootPart(ent.char) local hum = ent.char:FindFirstChildOfClass("Humanoid") local isAlive = hum and hum.Health > 0 and hum:GetState() ~= Enum.HumanoidStateType.Dead local canTarget = not ignoreDead or isAlive if targetRoot and canTarget then local isValidTarget = true if ent.isPlayer then local player = ent.player if targetMode == "Enemigos" then if LocalPlayer.Team ~= nil and player.Team ~= nil then if LocalPlayer.Team == player.Team then isValidTarget = false end elseif not LocalPlayer.Neutral and not player.Neutral then if LocalPlayer.TeamColor == player.TeamColor then isValidTarget = false end end elseif targetMode == "Aliados" then if LocalPlayer.Team ~= nil and player.Team ~= nil then if LocalPlayer.Team ~= player.Team then isValidTarget = false end elseif not LocalPlayer.Neutral and not player.Neutral then if LocalPlayer.TeamColor ~= player.TeamColor then isValidTarget = false end else isValidTarget = false end end else if targetMode == "Aliados" then isValidTarget = false end end if isValidTarget then local distance = (myRoot.Position - targetRoot.Position).Magnitude if distance <= trackingRadius then table.insert(targets, {character = ent.char, distance = distance}) end end end end table.sort(targets, function(a, b) return a.distance < b.distance end) return targets end local function getFloorPosition(position) local raycastParams = RaycastParams.new() if LocalPlayer.Character then raycastParams.FilterDescendantsInstances = {LocalPlayer.Character, pathVisualsFolder} end raycastParams.FilterType = Enum.RaycastFilterType.Exclude local result = workspace:Raycast(position + Vector3.new(0, 3, 0), Vector3.new(0, -53, 0), raycastParams) if result then return result.Position end return position end local function startRigCheck() rigCheckTask = task.spawn(function() while isTracking and isScriptRunning do local char = LocalPlayer.Character if char then local humanoid = char:FindFirstChildOfClass("Humanoid") local rootPart = getSafeRootPart(char) if humanoid and rootPart then local rigType = "Personalizado" if humanoid.RigType == Enum.HumanoidRigType.R6 and char:FindFirstChild("Torso") then rigType = "R6" elseif humanoid.RigType == Enum.HumanoidRigType.R15 and char:FindFirstChild("UpperTorso") then rigType = "R15" end if not char:FindFirstChild("HumanoidRootPart") then rigType = "Personalizado" end if rigType ~= lastRigType then lastRigType = rigType end end end task.wait(3) end end) end -- ========================================== -- AIMBOT / SISTEMA DE ATAQUE A DISTANCIA GLOBAL -- ========================================== local function handleAutoAttack() if not autoAttack then return end local char = LocalPlayer.Character if not char then return end local rootPart = getSafeRootPart(char) if not rootPart then return end local sortedTargets = getTargetsSortedByDistance() if #sortedTargets == 0 then return end local bestTarget = sortedTargets[1] if bestTarget.distance > attackDistance then return end local targetRoot = getSafeRootPart(bestTarget.character) if not targetRoot then return end local lookAtPos = Vector3.new(targetRoot.Position.X, rootPart.Position.Y, targetRoot.Position.Z) rootPart.CFrame = CFrame.lookAt(rootPart.Position, lookAtPos) local cam = workspace.CurrentCamera cam.CFrame = CFrame.lookAt(cam.CFrame.Position, targetRoot.Position) local tool = char:FindFirstChildOfClass("Tool") if not tool then local backpack = LocalPlayer:FindFirstChild("Backpack") if backpack then tool = backpack:FindFirstChildOfClass("Tool") if tool then local hum = char:FindFirstChildOfClass("Humanoid") if hum then hum:EquipTool(tool) end end end end if tool then tool:Activate() if unequipAfterUse then local hum = char:FindFirstChildOfClass("Humanoid") if hum then task.delay(0.1, function() hum:UnequipTools() end) end end end end local function isHitClimbable(hit) if not hit or not hit.Instance then return false end local pName = string.lower(hit.Instance.Name) return hit.Instance:IsA("TrussPart") or string.find(pName, "ladder") or string.find(pName, "escalera") or string.find(pName, "climb") or string.find(pName, "truss") end local function startTrackingLogic() startRigCheck() trackingTask = task.spawn(function() while isTracking and isScriptRunning do local char = LocalPlayer.Character if not char then task.wait(0.5) continue end local humanoid = char:FindFirstChildOfClass("Humanoid") local rootPart = getSafeRootPart(char) if not humanoid or not rootPart then task.wait(0.5) continue end if humanoid.Health <= 0 then notify("Sistema", "Jugador eliminado. Pathfinder pausado (esperando reaparición)...") -- Pausar el bucle hasta que el jugador reaparezca y tenga un Humanoid con vida repeat task.wait(0.5) char = LocalPlayer.Character humanoid = char and char:FindFirstChildOfClass("Humanoid") rootPart = getSafeRootPart(char) until not isTracking or not isScriptRunning or (humanoid and humanoid.Health > 0 and rootPart) if not isTracking or not isScriptRunning then break end notify("Sistema", "¡Reaparecido! Reanudando pathfinder...") continue end if humanoid.Sit and allowJumping then humanoid.Jump = true end local canJumpHighEnough = true if humanoid.UseJumpPower then if humanoid.JumpPower < 50 then canJumpHighEnough = false end else if humanoid.JumpHeight < 7.2 then canJumpHighEnough = false end end humanoid.AutoJumpEnabled = canJumpHighEnough and allowJumping local bestTargetChar = nil local bestTargetRoot = nil local bestWaypoints = nil local isPartialPath = false local validTargetPos = nil clearPathVisuals() if movementMode == "ClickToMove" then if clickToMovePos then validTargetPos = clickToMovePos bestTargetRoot = {Position = clickToMovePos} else task.wait(0.2) continue end elseif movementMode == "Merodear" then if not wanderTarget or (rootPart.Position - wanderTarget).Magnitude < 5 then local angle = math.random() * math.pi * 2 local distance = math.random(25, 60) local randomPos = rootPart.Position + Vector3.new(math.cos(angle) * distance, 0, math.sin(angle) * distance) wanderTarget = getFloorPosition(randomPos) end validTargetPos = wanderTarget bestTargetRoot = {Position = wanderTarget} else local sortedTargets = getTargetsSortedByDistance() for _, targetInfo in ipairs(sortedTargets) do local targetChar = targetInfo.character local targetRoot = getSafeRootPart(targetChar) if not targetRoot then continue end local distanceToTarget = (rootPart.Position - targetRoot.Position).Magnitude if movementMode == "Perseguir" and deadRadius > 0 and distanceToTarget <= deadRadius then bestTargetChar = targetChar bestTargetRoot = targetRoot bestWaypoints = {} break end if movementMode == "Huir" then local runDirection = (rootPart.Position - targetRoot.Position).Unit if runDirection.Magnitude ~= runDirection.Magnitude then runDirection = Vector3.new(1, 0, 0) end local fleeDestination = rootPart.Position + (Vector3.new(runDirection.X, 0, runDirection.Z).Unit * 45) validTargetPos = getFloorPosition(fleeDestination) else validTargetPos = getFloorPosition(targetRoot.Position) end bestTargetChar = targetChar bestTargetRoot = targetRoot break end end if bestTargetRoot and validTargetPos then local agentRadius = 1.8 local agentHeight = 5.0 if rootPart and rootPart.Size.Y > 3 then agentRadius = (math.max(rootPart.Size.X, rootPart.Size.Z) / 2) + 0.2 agentHeight = rootPart.Size.Y + 3 end local pathParams = { AgentRadius = agentRadius, AgentHeight = agentHeight, AgentCanJump = canJumpHighEnough and allowJumping, AgentCanDrop = true, AgentMaxDrop = maxDropDistance, WaypointSpacing = math.max(1.5, agentRadius), Costs = { Climbable = 1 } } local path = PathfindingService:CreatePath(pathParams) local success = pcall(function() path:ComputeAsync(rootPart.Position, validTargetPos) end) if success then local waypoints = path:GetWaypoints() local pathStatus = path.Status if pathStatus == Enum.PathStatus.Success or pathStatus == Enum.PathStatus.ClosestNoPath then for w = 1, #waypoints - 1 do if (waypoints[w].Position.Y - waypoints[w+1].Position.Y) > maxDropDistance then pathStatus = Enum.PathStatus.NoPath break end end end if autoJumpHazards and (pathStatus == Enum.PathStatus.Success or pathStatus == Enum.PathStatus.ClosestNoPath) then local filtered = {} local i = 1 local rp = RaycastParams.new() if char then rp.FilterDescendantsInstances = {char, pathVisualsFolder} end rp.FilterType = Enum.RaycastFilterType.Exclude while i <= #waypoints do table.insert(filtered, waypoints[i]) local hit = workspace:Raycast(waypoints[i].Position + Vector3.new(0, 2, 0), Vector3.new(0, -6, 0), rp) local isOnHazard = false if hit and hit.Instance then for _, child in ipairs(hit.Instance:GetChildren()) do if child:IsA("PathfindingModifier") and (child.Label == "Hazard" or child.Label == "SmallHazard") then isOnHazard = true; break end end end if isOnHazard then local nextSafe = i + 1 for j = i + 1, #waypoints do local h2 = workspace:Raycast(waypoints[j].Position + Vector3.new(0, 2, 0), Vector3.new(0, -6, 0), rp) local isSafe = true if h2 and h2.Instance then for _, c in ipairs(h2.Instance:GetChildren()) do if c:IsA("PathfindingModifier") and (c.Label == "Hazard" or c.Label == "SmallHazard") then isSafe = false; break end end end if isSafe then nextSafe = j; break end end if nextSafe <= #waypoints then waypoints[nextSafe].Action = Enum.PathWaypointAction.Jump table.insert(filtered, waypoints[nextSafe]) i = nextSafe + 1 else break end else i = i + 1 end end waypoints = filtered end if pathStatus == Enum.PathStatus.Success then drawPath(waypoints, Color3.fromRGB(255, 255, 255), 0.7) bestWaypoints = waypoints elseif pathStatus == Enum.PathStatus.ClosestNoPath then if #waypoints > 0 then drawPath(waypoints, Color3.fromRGB(255, 255, 255), 0.85) bestWaypoints = waypoints isPartialPath = true else wanderTarget = nil end else wanderTarget = nil end end if bestWaypoints then activeTargetRoot = bestTargetRoot local initialTargetPos = bestTargetRoot.Position local currentDist = (rootPart.Position - initialTargetPos).Magnitude handleAutoAttack() if movementMode == "Perseguir" and deadRadius > 0 and currentDist <= deadRadius then clearPathVisuals() humanoid:MoveTo(rootPart.Position) currentLookTarget = bestTargetRoot.Position task.wait(0.1) else local recalcThreshold = 2 * math.sqrt(currentDist) recalcThreshold = math.max(recalcThreshold, 2) drawPath(bestWaypoints, Color3.fromRGB(0, 255, 150), 0.3) local lastJumpTime = 0 local function forzarSalto() if not canJumpHighEnough or not allowJumping then return end if humanoid:GetState() == Enum.HumanoidStateType.Climbing then return end if tick() - lastJumpTime > 0.4 then if not ignoreSpecialBlocks then local checkCFrame = rootPart.CFrame * CFrame.new(0, 10, 0) local checkSize = Vector3.new(3, 20, 3) local overlapParams = OverlapParams.new() overlapParams.FilterDescendantsInstances = {char, pathVisualsFolder} overlapParams.FilterType = Enum.RaycastFilterType.Exclude local partsAbove = workspace:GetPartBoundsInBox(checkCFrame, checkSize, overlapParams) for _, part in ipairs(partsAbove) do local isHazard = false for _, child in ipairs(part:GetChildren()) do if child:IsA("PathfindingModifier") and child.Label == "Hazard" then isHazard = true break end end if isHazard then return end end end humanoid:ChangeState(Enum.HumanoidStateType.Jumping) humanoid.Jump = true lastJumpTime = tick() end end local startIndex = 1 local skipDistance = math.clamp(humanoid.WalkSpeed * 0.12, 1.5, 6) for i = 1, #bestWaypoints do local flatWp = Vector3.new(bestWaypoints[i].Position.X, 0, bestWaypoints[i].Position.Z) local flatRoot = Vector3.new(rootPart.Position.X, 0, rootPart.Position.Z) if (flatRoot - flatWp).Magnitude > skipDistance then startIndex = i break end end if startIndex > #bestWaypoints then startIndex = #bestWaypoints end local shouldRecalculate = false for i = startIndex, #bestWaypoints do local waypoint = bestWaypoints[i] if not isTracking or not isScriptRunning or humanoid.Health <= 0 then break end if shouldRecalculate then break end if not LocalPlayer.Character or not getSafeRootPart(LocalPlayer.Character) then break end if movementMode ~= "ClickToMove" and movementMode ~= "Merodear" and bestTargetRoot then local targetDeviance = (bestTargetRoot.Position - initialTargetPos).Magnitude if targetDeviance > recalcThreshold then shouldRecalculate = true break end end if movementMode == "Perseguir" and deadRadius > 0 and (rootPart.Position - bestTargetRoot.Position).Magnitude <= deadRadius then break end local waypointPosition = waypoint.Position currentLookTarget = waypointPosition if waypoint.Action == Enum.PathWaypointAction.Jump then forzarSalto() end humanoid:MoveTo(waypointPosition) local waypointStartTime = tick() local lastStuckPos = rootPart.Position local stuckTimer = 0 local flatDistance = math.huge repeat local dt = task.wait() if not isTracking or not isScriptRunning or humanoid.Health <= 0 or not LocalPlayer.Character or not getSafeRootPart(LocalPlayer.Character) then break end if isJumpingHazard then local currentState = humanoid:GetState() local isMidAir = (currentState == Enum.HumanoidStateType.Freefall or currentState == Enum.HumanoidStateType.Jumping) if tick() - globalHeartbeatJumpTime > 0.5 and not isMidAir then isJumpingHazard = false globalHeartbeatJumpTime = 0 humanoid:MoveTo(waypointPosition) end end local currentRoot = getSafeRootPart(LocalPlayer.Character) local flatWaypoint = Vector3.new(waypointPosition.X, 0, waypointPosition.Z) local flatPlayer = Vector3.new(currentRoot.Position.X, 0, currentRoot.Position.Z) flatDistance = (flatWaypoint - flatPlayer).Magnitude handleAutoAttack() if not isJumpingHazard then if movementMode ~= "ClickToMove" and movementMode ~= "Merodear" and bestTargetRoot then local targetDeviance = (bestTargetRoot.Position - initialTargetPos).Magnitude if targetDeviance > recalcThreshold then shouldRecalculate = true break end end if humanoid.Sit and allowJumping then humanoid.Jump = true shouldRecalculate = true break end local rayParams = RaycastParams.new() rayParams.FilterDescendantsInstances = {char, pathVisualsFolder} rayParams.FilterType = Enum.RaycastFilterType.Exclude if waypointPosition.Y > (currentRoot.Position.Y + 1.2) and flatDistance <= 4.0 then forzarSalto() end local rawLookDir = humanoid.MoveDirection if rawLookDir.Magnitude < 0.01 then rawLookDir = currentRoot.CFrame.LookVector end local flatRaw = Vector3.new(rawLookDir.X, 0, rawLookDir.Z) local flatLookDir = (flatRaw.Magnitude > 0.01) and (flatRaw.Unit * 2.5) or (rawLookDir * 2.5) local dynamicSize = char:GetExtentsSize() local hitKnee = workspace:Raycast(currentRoot.Position - Vector3.new(0, (dynamicSize.Y / 2) * 0.5, 0), flatLookDir, rayParams) local hitWaist = workspace:Raycast(currentRoot.Position, flatLookDir, rayParams) if hitKnee or hitWaist then if not (isHitClimbable(hitKnee) or isHitClimbable(hitWaist) or humanoid:GetState() == Enum.HumanoidStateType.Climbing) then forzarSalto() end end local currentFlatPos = Vector3.new(currentRoot.Position.X, 0, currentRoot.Position.Z) local lastFlatPos = Vector3.new(lastStuckPos.X, 0, lastStuckPos.Z) local distMoved = (currentFlatPos - lastFlatPos).Magnitude if distMoved < 0.05 then stuckTimer = stuckTimer + dt if stuckTimer > 0.6 then forzarSalto() shouldRecalculate = true break end else stuckTimer = 0 lastStuckPos = currentRoot.Position end end if tick() - waypointStartTime > 1.5 then break end until flatDistance <= 2.5 or not isTracking or shouldRecalculate if isTracking and not shouldRecalculate and not isJumpingHazard then local fallStart = tick() local currentState = humanoid:GetState() local targetAirPos = waypointPosition if bestWaypoints and i < #bestWaypoints then targetAirPos = bestWaypoints[i + 1].Position end while (currentState == Enum.HumanoidStateType.Freefall or currentState == Enum.HumanoidStateType.Jumping) and isTracking do if tick() - fallStart > 1.5 then break end task.wait(0.05) currentState = humanoid:GetState() humanoid:MoveTo(targetAirPos) end end end end if isPartialPath and movementMode == "Perseguir" then currentLookTarget = bestTargetRoot.Position if bestTargetRoot.Position.Y > rootPart.Position.Y + 2 then forzarSalto() end task.wait(0.2) end end else activeTargetRoot = nil clearPathVisuals() humanoid:MoveTo(rootPart.Position) currentLookTarget = nil task.wait(0.4) end end end) end -- ========================================== -- SISTEMA DE SALTO INDEPENDIENTE DIAGONAL -- ========================================== table.insert(connections, RunService.Heartbeat:Connect(function() if not isScriptRunning or not isTracking or not autoJumpHazards then return end local char = LocalPlayer.Character if not char then return end local humanoid = char:FindFirstChildOfClass("Humanoid") local rootPart = getSafeRootPart(char) if humanoid and rootPart and humanoid.Health > 0 then local state = humanoid:GetState() local function getHazardJumpDirection() local jumpDir = Vector3.zero if humanoid.MoveDirection.Magnitude > 0.01 then jumpDir = Vector3.new(humanoid.MoveDirection.X, 0, humanoid.MoveDirection.Z).Unit elseif currentLookTarget then local routeDir = (currentLookTarget - rootPart.Position) if routeDir.Magnitude > 0.01 then jumpDir = Vector3.new(routeDir.X, 0, routeDir.Z).Unit end end if jumpDir == Vector3.zero or jumpDir.Magnitude ~= jumpDir.Magnitude then local lookDir = rootPart.CFrame.LookVector jumpDir = Vector3.new(lookDir.X, 0, lookDir.Z).Unit end return jumpDir end if state == Enum.HumanoidStateType.Landed or state == Enum.HumanoidStateType.Running then if tick() - globalHeartbeatJumpTime > 0.5 then isJumpingHazard = false end end if isJumpingHazard then if tick() - globalHeartbeatJumpTime < 0.2 then humanoid.Jump = true end end if state ~= Enum.HumanoidStateType.Jumping and state ~= Enum.HumanoidStateType.Freefall and state ~= Enum.HumanoidStateType.Climbing then local overlapParams = OverlapParams.new() overlapParams.FilterDescendantsInstances = {char, pathVisualsFolder} overlapParams.FilterType = Enum.RaycastFilterType.Exclude local function checkModifiers(part) for _, child in ipairs(part:GetChildren()) do if child:IsA("PathfindingModifier") and child.Label == "SmallHazard" then return true end end return false end local rayParams = RaycastParams.new() rayParams.FilterDescendantsInstances = {char, pathVisualsFolder} rayParams.FilterType = Enum.RaycastFilterType.Exclude local dir = humanoid.MoveDirection if dir.Magnitude < 0.01 then dir = rootPart.CFrame.LookVector end local flatDir = Vector3.new(dir.X, 0, dir.Z).Unit if flatDir.Magnitude > 0 then local predictPos = rootPart.Position + (flatDir * 2.5) local predictRay = workspace:Raycast(predictPos, Vector3.new(0, -4, 0), rayParams) if predictRay and predictRay.Instance and checkModifiers(predictRay.Instance) then humanoid.Jump = true humanoid:ChangeState(Enum.HumanoidStateType.Jumping) isJumpingHazard = true hazardJumpDirection = getHazardJumpDirection() globalHeartbeatJumpTime = tick() return end end local checkSize = char:GetExtentsSize() + Vector3.new(0.5, 1, 0.5) local partsTouching = workspace:GetPartBoundsInBox(rootPart.CFrame, checkSize, overlapParams) for _, part in ipairs(partsTouching) do local floorName = string.lower(part.Name) local isHazard = part:IsA("Seat") or part:IsA("VehicleSeat") or string.find(floorName, "conveyor") or string.find(floorName, "belt") or string.find(floorName, "cinta") or string.find(floorName, "asiento") or string.find(floorName, "seat") or (part.Anchored and part.AssemblyLinearVelocity.Magnitude > 1) if not isHazard then isHazard = checkModifiers(part) end if isHazard then if humanoid.Sit then humanoid.Sit = false end humanoid.Jump = true humanoid:ChangeState(Enum.HumanoidStateType.Jumping) isJumpingHazard = true hazardJumpDirection = getHazardJumpDirection() globalHeartbeatJumpTime = tick() break end end end end end)) -- ========================================== -- SISTEMA ESP VISUAL -- ========================================== RunService:BindToRenderStep("XenoESPVisuals", Enum.RenderPriority.Camera.Value + 1, function() if not isScriptRunning or not isESPEnabled then return end local validTargets = getTargetsSortedByDistance() local currentValid = {} for _, targetInfo in ipairs(validTargets) do local char = targetInfo.character local root = getSafeRootPart(char) if not root then continue end currentValid[char] = true if not espBoxes[char] then local proxy = Instance.new("Part") proxy.Size = Vector3.new(2.5, 2.5, 2.5) proxy.Transparency = 1 proxy.Anchored = true proxy.CanCollide = false proxy.CFrame = CFrame.new(root.Position) proxy.Parent = espVisualsFolder local adorn = Instance.new("BoxHandleAdornment") adorn.Name = "XenoESPAdornment" adorn.Adornee = proxy adorn.AlwaysOnTop = true adorn.ZIndex = 5 adorn.Size = proxy.Size adorn.Transparency = 0.5 adorn.Color3 = Color3.fromRGB(0, 255, 0) adorn.Parent = proxy espBoxes[char] = {proxyPart = proxy, adornment = adorn} else espBoxes[char].proxyPart.CFrame = CFrame.new(root.Position) end end for char, box in pairs(espBoxes) do if not currentValid[char] then if box.proxyPart then box.proxyPart:Destroy() end espBoxes[char] = nil end end end) -- ========================================== -- FUERZA DE CÁMARA -- ========================================== RunService:BindToRenderStep("XenoCameraForce", Enum.RenderPriority.Camera.Value + 5, function(deltaTime) if not isScriptRunning then return end if isTracking and currentLookTarget then local char = LocalPlayer.Character if not char then return end local head = char:FindFirstChild("Head") local rootPart = getSafeRootPart(char) if not head and not rootPart then return end local charExtents = char:GetExtentsSize() local headPosition = head and head.Position or (rootPart.Position + Vector3.new(0, (charExtents.Y / 2) - 0.5, 0)) local camera = workspace.CurrentCamera local camDist = (camera.CFrame.Position - headPosition).Magnitude local isInDeadZone = false if activeTargetRoot and deadRadius > 0 and movementMode == "Perseguir" then if (rootPart.Position - activeTargetRoot.Position).Magnitude <= deadRadius then isInDeadZone = true end end if isFreelock and (camDist <= 1.5 or isInDeadZone) then return end if camDist <= 1.5 then local camPos = camera.CFrame.Position local lookAtTarget = Vector3.new(currentLookTarget.X, camPos.Y, currentLookTarget.Z) if (lookAtTarget - camPos).Magnitude > 0.1 then local targetCFrame = CFrame.lookAt(camPos, lookAtTarget) camera.CFrame = camera.CFrame:Lerp(targetCFrame, deltaTime * 12) end end end end) -- ========================================== -- MANEJO DE ENTRADA (TECLAS Y RETENCIÓN F6) -- ========================================== local f6PressTime = 0 local f6TriggeredHold = false table.insert(connections, UserInputService.InputBegan:Connect(function(input, gameProcessed) if not isScriptRunning then return end if input.KeyCode == Enum.KeyCode.F1 then if settingsFrame then settingsFrame.Visible = not settingsFrame.Visible end elseif input.KeyCode == Enum.KeyCode.F4 then isTracking = not isTracking if isTracking then lastRigType = nil notify("IY Pathfinder", string.upper(movementMode) .. ": ACTIVADO") startTrackingLogic() else notify("IY Pathfinder", "Sistema: DESACTIVADO") activeTargetRoot = nil clearPathVisuals() currentLookTarget = nil isJumpingHazard = false if trackingTask then task.cancel(trackingTask) trackingTask = nil end if rigCheckTask then task.cancel(rigCheckTask) rigCheckTask = nil end local char = LocalPlayer.Character if char then local humanoid = char:FindFirstChildOfClass("Humanoid") local rootPart = getSafeRootPart(char) if humanoid and rootPart then humanoid:MoveTo(rootPart.Position) end end end elseif input.KeyCode == Enum.KeyCode.F2 then if entityMode == "Jugadores" then entityMode = "NPCs" notify("Entidades", "Objetivos: SOLO NPC's") elseif entityMode == "NPCs" then entityMode = "Ambos" notify("Entidades", "Objetivos: JUGADORES Y NPC's") else entityMode = "Jugadores" notify("Entidades", "Objetivos: SOLO JUGADORES") end manualTargetEntity = nil elseif input.KeyCode == Enum.KeyCode.F5 then if targetMode == "Todos" then targetMode = "Enemigos" notify("Filtro", "Modo: SOLO ENEMIGOS") elseif targetMode == "Enemigos" then targetMode = "Aliados" notify("Filtro", "Modo: SOLO ALIADOS") else targetMode = "Todos" notify("Filtro", "Modo: TODOS LOS JUGADORES/NPCs") end elseif input.KeyCode == Enum.KeyCode.F6 then f6PressTime = tick() f6TriggeredHold = false task.delay(0.4, function() if UserInputService:IsKeyDown(Enum.KeyCode.F6) and not f6TriggeredHold then f6TriggeredHold = true manualTargetEntity = nil notify("Objetivo", "Modo: AUTO") end end) elseif input.KeyCode == Enum.KeyCode.F3 then if movementMode == "Perseguir" then movementMode = "Huir" notify("Comportamiento", "Modo: HUIR DEL OBJETIVO") elseif movementMode == "Huir" then movementMode = "Merodear" notify("Comportamiento", "Modo: MERODEAR ALEATORIAMENTE") elseif movementMode == "Merodear" then movementMode = "ClickToMove" notify("Comportamiento", "Modo: CLICK TO MOVE") else movementMode = "Perseguir" notify("Comportamiento", "Modo: PERSEGUIR AL OBJETIVO") end end end)) table.insert(connections, UserInputService.InputEnded:Connect(function(input) if not isScriptRunning then return end if input.KeyCode == Enum.KeyCode.F6 then if not f6TriggeredHold and (tick() - f6PressTime < 0.4) then local entitiesList = getAvailableEntities() if #entitiesList == 0 then notify("Selección", "No hay entidades disponibles (" .. entityMode .. ").") return end table.sort(entitiesList, function(a, b) return string.lower(a.name) < string.lower(b.name) end) local currentIndex = 0 if manualTargetEntity then for i, ent in ipairs(entitiesList) do if ent.isPlayer and manualTargetEntity.isPlayer and ent.accountName == manualTargetEntity.accountName then currentIndex = i break elseif not ent.isPlayer and not manualTargetEntity.isPlayer and ent.name == manualTargetEntity.name then currentIndex = i break end end end currentIndex = currentIndex + 1 if currentIndex > #entitiesList then manualTargetEntity = nil notify("Objetivo", "Modo: AUTO") else manualTargetEntity = entitiesList[currentIndex] notify("Objetivo", "Fijado en: " .. manualTargetEntity.name) end end end end)) -- Cleanup global globalEnv.XenoCleanup = function() isScriptRunning = false isTracking = false for _, conn in ipairs(connections) do if conn then conn:Disconnect() end end table.clear(connections) RunService:UnbindFromRenderStep("XenoCameraForce") RunService:UnbindFromRenderStep("XenoESPVisuals") if trackingTask then task.cancel(trackingTask) end if rigCheckTask then task.cancel(rigCheckTask) end if sg and sg.Parent then sg:Destroy() end if pathVisualsFolder and pathVisualsFolder.Parent then pathVisualsFolder:Destroy() end end