--// Enemy Aim / Attack Assist GUI (Same Look) - Extended 600+ lines --// Features: --// - Universal Auto Aim at top --// - Left enemy list with de-dupe + cleanup + reset button --// - Right panel with two pages: Main Controls + Classy Settings (same style) --// - Silent Aim, Slash Assist, Melee Assist, BoneThrow/BoneSpin/FireCircle, Classy Assist --// - Zone scanning for ActiveAttacks.Zone1..Zone25 (including Zone4) and constant check for all "Classy" spawns --// - Robust housekeeping to prevent duplicate enemy entries when leaving/returning range --// - Multi-spawn Classy support (moves ALL instances named like "classy"/"Classy" across all zones) --// - Over 600 lines with helpers and comments for clarity --============================================================== -- SERVICES & ROOTS --============================================================== local Players = game:GetService("Players") local RunService = game:GetService("RunService") local UserInput = game:GetService("UserInputService") local TweenService = game:GetService("TweenService") local player = Players.LocalPlayer local playerGui = player:WaitForChild("PlayerGui") -- Enemy container path (as per your project) local enemiesFolder = workspace:WaitForChild("Enemys") -- keep exact spelling per your place -- Active attacks root (Zones live under here) local activeAttacks = workspace:FindFirstChild("ActiveAttacks") -- Constants local MAX_ZONE_INDEX = 25 -- scan Zone1..Zone25 local NEARBY_DISTANCE_LIMIT = 150 -- studs local GUI_WIDTH = 520 local GUI_HEIGHT = 480 local LEFT_WIDTH = 210 local RIGHT_WIDTH = 290 --============================================================== -- GLOBAL STATE / PERSISTENT FLAGS --============================================================== _G.SilentAim = _G.SilentAim or false _G.SlashAssist = _G.SlashAssist or true _G.MeleeAssist = _G.MeleeAssist or false _G.UniversalAutoAim = _G.UniversalAutoAim or false _G.BoneThrowAssist = _G.BoneThrowAssist or false _G.BoneSpinAssist = _G.BoneSpinAssist or false _G.FireCircleAssist = _G.FireCircleAssist or false _G.ClassyAssist = _G.ClassyAssist or false _G.ClassyOffsetX = _G.ClassyOffsetX or 0 _G.ClassyOffsetY = _G.ClassyOffsetY or 2 _G.ClassyOffsetZ = _G.ClassyOffsetZ or -3 _G.ClassyFaceMode = _G.ClassyFaceMode or "Enemy" -- "Enemy" | "Player" | "EnemyMovement" _G.ClassyNoClip = _G.ClassyNoClip or false _G.AutoRefreshEnemies = _G.AutoRefreshEnemies ~= false -- default true unless explicitly set false previously _G.SelectedEnemy = _G.SelectedEnemy or nil -- prediction default for silent aim _G.PredictionValue = _G.PredictionValue or 0.10 -- housekeeping registries local enemyButtons = {} -- [enemy instance] = TextButton local enemyConnections = {} -- [enemy instance] = { RBXScriptConnection, ... } local universalTarget = nil -- nearest enemy when universal aim is on --============================================================== -- UI ROOT (SAME LOOK) --============================================================== local screenGui = Instance.new("ScreenGui") screenGui.Name = "EnemyAimGUI" screenGui.ResetOnSpawn = false screenGui.Parent = playerGui local mainFrame = Instance.new("Frame") mainFrame.Name = "Container" mainFrame.Size = UDim2.new(0, GUI_WIDTH, 0, GUI_HEIGHT) mainFrame.Position = UDim2.new(0.30, 0, 0.24, 0) mainFrame.BackgroundColor3 = Color3.fromRGB(40,40,40) mainFrame.Active = true mainFrame.Draggable = true mainFrame.Parent = screenGui local corner = Instance.new("UICorner") corner.CornerRadius = UDim.new(0,12) corner.Parent = mainFrame -- Header local header = Instance.new("TextLabel") header.Name = "Header" header.Size = UDim2.new(1, -20, 0, 28) header.Position = UDim2.new(0, 10, 0, 8) header.BackgroundTransparency = 1 header.Text = "Enemy Aim / Attack Assist" header.TextColor3 = Color3.fromRGB(255,255,255) header.TextXAlignment = Enum.TextXAlignment.Left header.Font = Enum.Font.SourceSansBold header.TextScaled = true header.Parent = mainFrame -- Divider local divider = Instance.new("Frame") divider.Size = UDim2.new(1, -20, 0, 1) divider.Position = UDim2.new(0, 10, 0, 40) divider.BackgroundColor3 = Color3.fromRGB(72,72,72) divider.BorderSizePixel = 0 divider.Parent = mainFrame --============================================================== -- UNIVERSAL AUTO AIM BUTTON (TOP) --============================================================== local universalButton = Instance.new("TextButton") universalButton.Name = "UniversalBtn" universalButton.Size = UDim2.new(1, -20, 0, 36) universalButton.Position = UDim2.new(0, 10, 0, 46) universalButton.BackgroundColor3 = Color3.fromRGB(100,100,100) universalButton.TextColor3 = Color3.fromRGB(255,255,255) universalButton.Font = Enum.Font.SourceSansBold universalButton.TextScaled = true universalButton.Text = _G.UniversalAutoAim and "Universal Auto Aim: On" or "Universal Auto Aim: Off" universalButton.Parent = mainFrame local universalCorner = Instance.new("UICorner") universalCorner.CornerRadius = UDim.new(0,8) universalCorner.Parent = universalButton universalButton.MouseButton1Click:Connect(function() _G.UniversalAutoAim = not _G.UniversalAutoAim universalButton.Text = _G.UniversalAutoAim and "Universal Auto Aim: On" or "Universal Auto Aim: Off" end) --============================================================== -- LEFT: ENEMY LIST (SAME LOOK) --============================================================== local leftPanel = Instance.new("Frame") leftPanel.Name = "LeftPanel" leftPanel.Size = UDim2.new(0, LEFT_WIDTH, 1, -100) leftPanel.Position = UDim2.new(0, 10, 0, 90) leftPanel.BackgroundTransparency = 1 leftPanel.Parent = mainFrame local leftScroll = Instance.new("ScrollingFrame") leftScroll.Name = "EnemyScroll" leftScroll.Size = UDim2.new(1, 0, 1, -42) -- leave room for refresh/reset row leftScroll.CanvasSize = UDim2.new(0,0,0,0) leftScroll.ScrollBarThickness = 6 leftScroll.BackgroundColor3 = Color3.fromRGB(45,45,45) leftScroll.BorderSizePixel = 0 leftScroll.Parent = leftPanel local leftLayout = Instance.new("UIListLayout") leftLayout.Padding = UDim.new(0,6) leftLayout.SortOrder = Enum.SortOrder.LayoutOrder leftLayout.Parent = leftScroll -- Refresh / Reset row local leftBottomRow = Instance.new("Frame") leftBottomRow.Size = UDim2.new(1, 0, 0, 36) leftBottomRow.Position = UDim2.new(0, 0, 1, -36) leftBottomRow.BackgroundTransparency = 1 leftBottomRow.Parent = leftPanel local refreshBtn = Instance.new("TextButton") refreshBtn.Size = UDim2.new(0.5, -4, 1, 0) refreshBtn.Position = UDim2.new(0, 0, 0, 0) refreshBtn.BackgroundColor3 = Color3.fromRGB(90,90,90) refreshBtn.TextColor3 = Color3.fromRGB(255,255,255) refreshBtn.Font = Enum.Font.SourceSansBold refreshBtn.TextScaled = true refreshBtn.Text = "Refresh" refreshBtn.Parent = leftBottomRow local rbc = Instance.new("UICorner"); rbc.CornerRadius = UDim.new(0,6); rbc.Parent = refreshBtn local resetBtn = Instance.new("TextButton") resetBtn.Size = UDim2.new(0.5, -4, 1, 0) resetBtn.Position = UDim2.new(0.5, 8, 0, 0) resetBtn.BackgroundColor3 = Color3.fromRGB(110,65,65) resetBtn.TextColor3 = Color3.fromRGB(255,255,255) resetBtn.Font = Enum.Font.SourceSansBold resetBtn.TextScaled = true resetBtn.Text = "Reset" resetBtn.Parent = leftBottomRow local rsb = Instance.new("UICorner"); rsb.CornerRadius = UDim.new(0,6); rsb.Parent = resetBtn --============================================================== -- RIGHT: PAGES CONTAINER (SAME LOOK) --============================================================== local rightPanel = Instance.new("Frame") rightPanel.Name = "RightPanel" rightPanel.Size = UDim2.new(0, RIGHT_WIDTH, 1, -100) rightPanel.Position = UDim2.new(0, 220, 0, 90) rightPanel.BackgroundColor3 = Color3.fromRGB(60,60,60) rightPanel.Parent = mainFrame local rightCorner = Instance.new("UICorner") rightCorner.CornerRadius = UDim.new(0,12) rightCorner.Parent = rightPanel local pages = Instance.new("Folder") pages.Name = "Pages" pages.Parent = rightPanel --============================================================== -- PAGE 1: MAIN CONTROLS (SAME LOOK) --============================================================== local mainPage = Instance.new("Frame") mainPage.Name = "MainPage" mainPage.Size = UDim2.new(1, 0, 1, 0) mainPage.BackgroundTransparency = 1 mainPage.Visible = true mainPage.Parent = pages -- Title local silentTitle = Instance.new("TextLabel") silentTitle.Size = UDim2.new(1, -20, 0, 34) silentTitle.Position = UDim2.new(0, 10, 0, 10) silentTitle.BackgroundTransparency = 1 silentTitle.TextColor3 = Color3.fromRGB(255,255,255) silentTitle.Font = Enum.Font.SourceSansBold silentTitle.TextScaled = true silentTitle.Text = "Silent Aim" silentTitle.Parent = mainPage -- Silent toggle local fireButton = Instance.new("TextButton") fireButton.Size = UDim2.new(0, 270, 0, 44) fireButton.Position = UDim2.new(0, 10, 0, 52) fireButton.BackgroundColor3 = Color3.fromRGB(90,90,90) fireButton.TextColor3 = Color3.fromRGB(255,255,255) fireButton.Font = Enum.Font.SourceSansBold fireButton.TextScaled = true fireButton.Text = _G.SilentAim and "Silent Aim: On" or "Silent Aim: Off" fireButton.Parent = mainPage -- Prediction label local predictionLabel = Instance.new("TextLabel") predictionLabel.Size = UDim2.new(0, 270, 0, 26) predictionLabel.Position = UDim2.new(0, 10, 0, 100) predictionLabel.BackgroundTransparency = 1 predictionLabel.TextColor3 = Color3.fromRGB(255,255,255) predictionLabel.Font = Enum.Font.SourceSans predictionLabel.TextScaled = true predictionLabel.Text = ("Prediction: %.2f"):format(_G.PredictionValue) predictionLabel.Parent = mainPage -- Prediction box local predictionBox = Instance.new("TextBox") predictionBox.Size = UDim2.new(0, 270, 0, 30) predictionBox.Position = UDim2.new(0, 10, 0, 130) predictionBox.BackgroundColor3 = Color3.fromRGB(80,80,80) predictionBox.TextColor3 = Color3.fromRGB(255,255,255) predictionBox.Font = Enum.Font.SourceSans predictionBox.TextScaled = true predictionBox.ClearTextOnFocus = false predictionBox.Text = tostring(_G.PredictionValue) predictionBox.Parent = mainPage local predCorner = Instance.new("UICorner"); predCorner.CornerRadius = UDim.new(0,6); predCorner.Parent = predictionBox -- Slash assist local slashButton = Instance.new("TextButton") slashButton.Size = UDim2.new(0, 270, 0, 34) slashButton.Position = UDim2.new(0, 10, 0, 170) slashButton.BackgroundColor3 = Color3.fromRGB(90,90,90) slashButton.TextColor3 = Color3.fromRGB(255,255,255) slashButton.Text = _G.SlashAssist and "Slash Assist: On" or "Slash Assist: Off" slashButton.Parent = mainPage -- Melee assist local meleeButton = Instance.new("TextButton") meleeButton.Size = UDim2.new(0, 270, 0, 34) meleeButton.Position = UDim2.new(0, 10, 0, 210) meleeButton.BackgroundColor3 = Color3.fromRGB(90,90,90) meleeButton.TextColor3 = Color3.fromRGB(255,255,255) meleeButton.Text = _G.MeleeAssist and "Melee Assist: On" or "Melee Assist: Off" meleeButton.Parent = mainPage -- Assist toggles (global) local function makeAssistButton(parent, label, y, key) local b = Instance.new("TextButton") b.Size = UDim2.new(0, 270, 0, 32) b.Position = UDim2.new(0, 10, 0, y) b.BackgroundColor3 = Color3.fromRGB(90,90,90) b.TextColor3 = Color3.fromRGB(255,255,255) b.Font = Enum.Font.SourceSans b.TextScaled = true b.Text = string.format("%s: %s", label, (_G[key] and "On" or "Off")) b.Parent = parent b.MouseButton1Click:Connect(function() _G[key] = not _G[key] b.Text = string.format("%s: %s", label, (_G[key] and "On" or "Off")) end) return b end makeAssistButton(mainPage, "BoneThrow Assist", 250, "BoneThrowAssist") makeAssistButton(mainPage, "BoneSpin Assist", 286, "BoneSpinAssist") makeAssistButton(mainPage, "FireCircle Assist",322, "FireCircleAssist") makeAssistButton(mainPage, "Classy Assist", 358, "ClassyAssist") -- Page switch local openClassyBtn = Instance.new("TextButton") openClassyBtn.Size = UDim2.new(0, 270, 0, 32) openClassyBtn.Position = UDim2.new(0, 10, 0, 394) openClassyBtn.BackgroundColor3 = Color3.fromRGB(110,110,110) openClassyBtn.TextColor3 = Color3.fromRGB(255,255,255) openClassyBtn.Font = Enum.Font.SourceSansBold openClassyBtn.TextScaled = true openClassyBtn.Text = "Classy Settings ▶" openClassyBtn.Parent = mainPage -- Selected enemy title (live) local selectedTitle = Instance.new("TextLabel") selectedTitle.Size = UDim2.new(1, -20, 0, 20) selectedTitle.Position = UDim2.new(0, 10, 0, 434) selectedTitle.BackgroundTransparency = 1 selectedTitle.TextColor3 = Color3.fromRGB(220,220,220) selectedTitle.Font = Enum.Font.SourceSansItalic selectedTitle.TextScaled = true selectedTitle.Text = "Silent Aim: None" selectedTitle.Parent = mainPage --============================================================== -- PAGE 2: CLASSY SETTINGS (SAME LOOK) --============================================================== local classyPage = Instance.new("Frame") classyPage.Name = "ClassyPage" classyPage.Size = UDim2.new(1, 0, 1, 0) classyPage.BackgroundTransparency = 1 classyPage.Visible = false classyPage.Parent = pages local cpTitle = Instance.new("TextLabel") cpTitle.Size = UDim2.new(1, -20, 0, 34) cpTitle.Position = UDim2.new(0, 10, 0, 10) cpTitle.BackgroundTransparency = 1 cpTitle.TextColor3 = Color3.fromRGB(255,255,255) cpTitle.Font = Enum.Font.SourceSansBold cpTitle.TextScaled = true cpTitle.Text = "Classy Settings" cpTitle.Parent = classyPage local backBtn = Instance.new("TextButton") backBtn.Size = UDim2.new(0, 120, 0, 28) backBtn.Position = UDim2.new(0, 10, 0, 48) backBtn.BackgroundColor3 = Color3.fromRGB(90,90,90) backBtn.TextColor3 = Color3.fromRGB(255,255,255) backBtn.Text = "◀ Back" backBtn.Parent = classyPage local backCorner = Instance.new("UICorner"); backCorner.CornerRadius = UDim.new(0,6); backCorner.Parent = backBtn -- Helper to make labeled box local function labeledBox(parent, labelText, x, y, val) local label = Instance.new("TextLabel") label.Size = UDim2.new(0, 54, 0, 24) label.Position = UDim2.new(0, x, 0, y) label.BackgroundTransparency = 1 label.TextColor3 = Color3.fromRGB(230,230,230) label.Font = Enum.Font.SourceSans label.TextScaled = true label.Text = labelText label.Parent = parent local box = Instance.new("TextBox") box.Size = UDim2.new(0, 64, 0, 24) box.Position = UDim2.new(0, x + 58, 0, y) box.BackgroundColor3 = Color3.fromRGB(90,90,90) box.TextColor3 = Color3.fromRGB(255,255,255) box.Text = tostring(val) box.ClearTextOnFocus = false box.Parent = parent local bc = Instance.new("UICorner"); bc.CornerRadius = UDim.new(0,6); bc.Parent = box return box end local xBox = labeledBox(classyPage, "OffX", 10, 88, _G.ClassyOffsetX) local yBox = labeledBox(classyPage, "OffY", 10, 118, _G.ClassyOffsetY) local zBox = labeledBox(classyPage, "OffZ", 10, 148, _G.ClassyOffsetZ) -- Face mode selector local faceLabel = Instance.new("TextLabel") faceLabel.Size = UDim2.new(0, 70, 0, 24) faceLabel.Position = UDim2.new(0, 150, 0, 88) faceLabel.BackgroundTransparency = 1 faceLabel.TextColor3 = Color3.fromRGB(230,230,230) faceLabel.Font = Enum.Font.SourceSans faceLabel.TextScaled = true faceLabel.Text = "Face:" faceLabel.Parent = classyPage local faceBtn = Instance.new("TextButton") faceBtn.Size = UDim2.new(0, 120, 0, 24) faceBtn.Position = UDim2.new(0, 196, 0, 88) faceBtn.BackgroundColor3 = Color3.fromRGB(90,90,90) faceBtn.TextColor3 = Color3.fromRGB(255,255,255) faceBtn.Text = tostring(_G.ClassyFaceMode or "Enemy") faceBtn.Parent = classyPage local faceCorner = Instance.new("UICorner"); faceCorner.CornerRadius = UDim.new(0,6); faceCorner.Parent = faceBtn local faceModes = {"Enemy","Player","EnemyMovement"} faceBtn.MouseButton1Click:Connect(function() local current = tostring(_G.ClassyFaceMode or "Enemy") local idx = 1 for i,m in ipairs(faceModes) do if m == current then idx = i break end end idx = (idx % #faceModes) + 1 _G.ClassyFaceMode = faceModes[idx] faceBtn.Text = _G.ClassyFaceMode end) -- NoClip toggle local noclipBtn = Instance.new("TextButton") noclipBtn.Size = UDim2.new(0, 120, 0, 24) noclipBtn.Position = UDim2.new(0, 196, 0, 118) noclipBtn.BackgroundColor3 = Color3.fromRGB(90,90,90) noclipBtn.TextColor3 = Color3.fromRGB(255,255,255) noclipBtn.Text = _G.ClassyNoClip and "NoClip: On" or "NoClip: Off" noclipBtn.Parent = classyPage local ncCorner = Instance.new("UICorner"); ncCorner.CornerRadius = UDim.new(0,6); ncCorner.Parent = noclipBtn noclipBtn.MouseButton1Click:Connect(function() _G.ClassyNoClip = not _G.ClassyNoClip noclipBtn.Text = _G.ClassyNoClip and "NoClip: On" or "NoClip: Off" end) -- Apply Offset local applyBtn = Instance.new("TextButton") applyBtn.Size = UDim2.new(0, 120, 0, 24) applyBtn.Position = UDim2.new(0, 196, 0, 148) applyBtn.BackgroundColor3 = Color3.fromRGB(110,110,110) applyBtn.TextColor3 = Color3.fromRGB(255,255,255) applyBtn.Text = "Apply Offset" applyBtn.Parent = classyPage local apCorner = Instance.new("UICorner"); apCorner.CornerRadius = UDim.new(0,6); apCorner.Parent = applyBtn applyBtn.MouseButton1Click:Connect(function() _G.ClassyOffsetX = tonumber(xBox.Text) or 0 _G.ClassyOffsetY = tonumber(yBox.Text) or 0 _G.ClassyOffsetZ = tonumber(zBox.Text) or 0 end) -- Page switches openClassyBtn.MouseButton1Click:Connect(function() mainPage.Visible = false classyPage.Visible = true end) backBtn.MouseButton1Click:Connect(function() classyPage.Visible = false mainPage.Visible = true end) --============================================================== -- UI INTERACTIONS --============================================================== fireButton.MouseButton1Click:Connect(function() _G.SilentAim = not _G.SilentAim fireButton.Text = _G.SilentAim and "Silent Aim: On" or "Silent Aim: Off" end) slashButton.MouseButton1Click:Connect(function() _G.SlashAssist = not _G.SlashAssist slashButton.Text = _G.SlashAssist and "Slash Assist: On" or "Slash Assist: Off" end) meleeButton.MouseButton1Click:Connect(function() _G.MeleeAssist = not _G.MeleeAssist meleeButton.Text = _G.MeleeAssist and "Melee Assist: On" or "Melee Assist: Off" end) predictionBox:GetPropertyChangedSignal("Text"):Connect(function() local v = tonumber(predictionBox.Text) if v then _G.PredictionValue = v predictionLabel.Text = ("Prediction: %.2f"):format(v) end end) -- Refresh / Reset (also fix dupes) refreshBtn.MouseButton1Click:Connect(function() _G.AutoRefreshEnemies = true refreshBtn.Text = "Refreshing..." task.delay(0.1, function() refreshEnemiesNow(true) refreshBtn.Text = "Refresh" end) end) resetBtn.MouseButton1Click:Connect(function() clearEnemyButtons() _G.SelectedEnemy = nil selectedTitle.Text = "Silent Aim: None" end) --============================================================== -- UTILS: ENEMY MANAGEMENT / LISTING --============================================================== local function isEnemyAlive(enemy) if not enemy or not enemy:IsDescendantOf(enemiesFolder) then return false end local hum = enemy:FindFirstChildOfClass("Humanoid") local root = enemy:FindFirstChild("HumanoidRootPart") or enemy:FindFirstChild("Torso") if not hum or not root then return false end if hum.Health <= 0 then return false end return true end local function getEnemyTorso(enemy) if not enemy then return nil end return enemy:FindFirstChild("HumanoidRootPart") or enemy:FindFirstChild("Torso") end local function playerRoot() local char = player.Character return char and char:FindFirstChild("HumanoidRootPart") or nil end local function distToPlayer(enemy) local root = playerRoot() local torso = getEnemyTorso(enemy) if not root or not torso then return math.huge end return (torso.Position - root.Position).Magnitude end local function getNearestEnemy() local root = playerRoot() if not root then return nil end local nearest, minDist = nil, math.huge for _, enemy in ipairs(enemiesFolder:GetChildren()) do if isEnemyAlive(enemy) then local d = distToPlayer(enemy) if d <= NEARBY_DISTANCE_LIMIT and d < minDist then nearest, minDist = enemy, d end end end return nearest end --============================================================== -- UI: ENEMY BUTTONS (DE-DUPE + CLEANUP) --============================================================== local function createEnemyButton(enemy) -- prevent duplicates if enemyButtons[enemy] then return enemyButtons[enemy] end local d = distToPlayer(enemy) local btn = Instance.new("TextButton") btn.Size = UDim2.new(1, -8, 0, 30) btn.BackgroundColor3 = Color3.fromRGB(70,70,70) btn.TextColor3 = Color3.fromRGB(255,255,255) btn.Font = Enum.Font.SourceSans btn.TextScaled = true btn.Text = string.format("%s (%d studs)", enemy.Name, math.floor(d)) btn.Parent = leftScroll local c = Instance.new("UICorner") c.CornerRadius = UDim.new(0,6) c.Parent = btn btn.MouseButton1Click:Connect(function() if isEnemyAlive(enemy) then _G.SelectedEnemy = enemy selectedTitle.Text = "Silent Aim: "..enemy.Name silentTitle.Text = "Silent Aim: "..enemy.Name end end) -- connections to auto-remove when enemy dies/leaves local conns = {} conns[#conns+1] = enemy.AncestryChanged:Connect(function(_, parent) if not parent or not enemy:IsDescendantOf(enemiesFolder) then -- remove if it leaves if enemyButtons[enemy] then enemyButtons[enemy]:Destroy() enemyButtons[enemy] = nil end if enemyConnections[enemy] then for _, cn in ipairs(enemyConnections[enemy]) do pcall(function() cn:Disconnect() end) end enemyConnections[enemy] = nil end -- reset selection if this was selected if _G.SelectedEnemy == enemy then _G.SelectedEnemy = nil selectedTitle.Text = "Silent Aim: None" end end end) -- track health to auto-remove local hum = enemy:FindFirstChildOfClass("Humanoid") if hum then conns[#conns+1] = hum.Died:Connect(function() if enemyButtons[enemy] then enemyButtons[enemy]:Destroy() enemyButtons[enemy] = nil end if enemyConnections[enemy] then for _, cn in ipairs(enemyConnections[enemy]) do pcall(function() cn:Disconnect() end) end enemyConnections[enemy] = nil end if _G.SelectedEnemy == enemy then _G.SelectedEnemy = nil selectedTitle.Text = "Silent Aim: None" end end) end enemyButtons[enemy] = btn enemyConnections[enemy] = conns return btn end function clearEnemyButtons() for enemy, btn in pairs(enemyButtons) do if btn then pcall(function() btn:Destroy() end) end end enemyButtons = {} for enemy, list in pairs(enemyConnections) do for _, cn in ipairs(list) do pcall(function() cn:Disconnect() end) end end enemyConnections = {} leftScroll.CanvasSize = UDim2.new(0,0,0,0) end function refreshEnemiesNow(fullRescan) -- Remove stale buttons for enemies that no longer exist or out of range for enemy, btn in pairs(enemyButtons) do if (not isEnemyAlive(enemy)) or (distToPlayer(enemy) > NEARBY_DISTANCE_LIMIT) then btn:Destroy() enemyButtons[enemy] = nil -- disconnect connections if enemyConnections[enemy] then for _, cn in ipairs(enemyConnections[enemy]) do pcall(function() cn:Disconnect() end) end enemyConnections[enemy] = nil end -- if selected, clear selection if _G.SelectedEnemy == enemy then _G.SelectedEnemy = nil selectedTitle.Text = "Silent Aim: None" end end end -- Add/Update nearby enemies for _, enemy in ipairs(enemiesFolder:GetChildren()) do if isEnemyAlive(enemy) then local d = distToPlayer(enemy) if d <= NEARBY_DISTANCE_LIMIT then local btn = enemyButtons[enemy] if not btn then btn = createEnemyButton(enemy) end if btn then btn.Text = string.format("%s (%d studs)", enemy.Name, math.floor(d)) end else -- out of range -> ensure no lingering button if enemyButtons[enemy] then enemyButtons[enemy]:Destroy() enemyButtons[enemy] = nil end end else -- ensure cleanup if enemyButtons[enemy] then enemyButtons[enemy]:Destroy() enemyButtons[enemy] = nil end end end -- Recompute canvas size leftScroll.CanvasSize = UDim2.new(0,0,0,leftLayout.AbsoluteContentSize.Y + 8) -- Remove any orphaned UI children not tracked (safety) for _, child in ipairs(leftScroll:GetChildren()) do if child:IsA("TextButton") then local tracked = false for e, b in pairs(enemyButtons) do if b == child then tracked = true break end end if not tracked then child:Destroy() end end end end -- Hook enemy folder changes to update list (avoid dupes) enemiesFolder.ChildAdded:Connect(function(child) task.defer(function() if isEnemyAlive(child) and distToPlayer(child) <= NEARBY_DISTANCE_LIMIT then createEnemyButton(child) leftScroll.CanvasSize = UDim2.new(0,0,0,leftLayout.AbsoluteContentSize.Y + 8) end end) end) enemiesFolder.ChildRemoved:Connect(function(child) if enemyButtons[child] then enemyButtons[child]:Destroy() enemyButtons[child] = nil end if enemyConnections[child] then for _, cn in ipairs(enemyConnections[child]) do pcall(function() cn:Disconnect() end) end enemyConnections[child] = nil end if _G.SelectedEnemy == child then _G.SelectedEnemy = nil selectedTitle.Text = "Silent Aim: None" silentTitle.Text = "Silent Aim" end leftScroll.CanvasSize = UDim2.new(0,0,0,leftLayout.AbsoluteContentSize.Y + 8) end) --============================================================== -- UTILS: CF / ORIENTATION / NOCLIP --============================================================== local function setInstanceCFrame(inst, cf) if not inst then return end if inst:IsA("BasePart") then inst.CFrame = cf elseif inst:IsA("Model") then if inst.PrimaryPart then pcall(function() inst:SetPrimaryPartCFrame(cf) end) else for _, d in ipairs(inst:GetDescendants()) do if d:IsA("BasePart") then d.CFrame = cf end end end elseif inst:IsA("Folder") then for _, d in ipairs(inst:GetChildren()) do setInstanceCFrame(d, cf) end end end local function setContainerNoCollide(inst, enabled) if not inst then return end local function apply(p) if p:IsA("BasePart") then p.CanCollide = not enabled p.CanTouch = not enabled p.CanQuery = true end end if inst:IsA("BasePart") then apply(inst) else for _, d in ipairs(inst:GetDescendants()) do apply(d) end end end local function enemyAheadPoint(enemy) local torso = getEnemyTorso(enemy) if not torso then return nil end local vel = Vector3.new() local ok, v = pcall(function() return torso.AssemblyLinearVelocity end) if ok and typeof(v)=="Vector3" then vel = v elseif torso:FindFirstChild("Velocity") then vel = torso.Velocity end if vel.Magnitude < 0.01 then return torso.Position + torso.CFrame.LookVector * 3 else return torso.Position + vel.Unit * 3 end end local function classyLookPoint(enemy, playerChar) local mode = tostring(_G.ClassyFaceMode or "Enemy") if mode == "Player" then local hrp = playerChar and playerChar:FindFirstChild("HumanoidRootPart") if hrp then return hrp.Position end elseif mode == "EnemyMovement" then local p = enemyAheadPoint(enemy) if p then return p end end local head = enemy and enemy:FindFirstChild("Head") if head then return head.Position end local torso = getEnemyTorso(enemy) return torso and torso.Position or nil end --============================================================== -- TOOL / ACTION HOOKS (Silent / Melee / Bone) --============================================================== local function meleeHit(tool) if not _G.MeleeAssist then return end local remote = tool:FindFirstChild("lo") if not remote then return end local target = getNearestEnemy() if target then remote:FireServer(player) end end local function fireBone(tool) if not _G.SelectedEnemy then return end local head = _G.SelectedEnemy:FindFirstChild("Head") if not head then return end local remote = tool:FindFirstChild("RemoteEvent") if not remote then return end local pos = head.Position local cf = CFrame.new(pos) local args = { pos.X, pos.Y, pos.Z, Vector3.new(pos.X,pos.Y,pos.Z), cf } remote:FireServer(unpack(args)) end local function onToolActivated(tool) -- melee if tool:FindFirstChild("lo") then meleeHit(tool) return end -- bone if tool:FindFirstChild("RemoteEvent") and tool.Name:lower():find("bone") then fireBone(tool) return end -- silent aim if not _G.SilentAim or not _G.SelectedEnemy then return end local head = _G.SelectedEnemy:FindFirstChild("Head") if not head then return end local prediction = tonumber(_G.PredictionValue) or 0.1 local vel = head:FindFirstChild("Velocity") and head.Velocity or Vector3.new() local predPos = head.Position + vel * prediction local remote = tool:FindFirstChildWhichIsA("RemoteEvent") if remote then local ok = pcall(function() remote:FireServer(CFrame.new(predPos), predPos.Y, predPos.Z) end) if not ok then pcall(function() remote:FireServer(predPos) end) end end local scriptFolder = tool:FindFirstChild("Script") if scriptFolder then local frameEvent = scriptFolder:FindFirstChild("FrameEvent") if frameEvent and frameEvent:IsA("RemoteEvent") then pcall(function() frameEvent:FireServer(predPos.X, predPos.Y, predPos.Z) end) end end end local function connectTool(tool) if tool:IsA("Tool") then tool.Activated:Connect(function() onToolActivated(tool) end) end end player.CharacterAdded:Connect(function(char) char.ChildAdded:Connect(connectTool) for _, t in ipairs(char:GetChildren()) do connectTool(t) end end) if player.Character then player.Character.ChildAdded:Connect(connectTool) for _, t in ipairs(player.Character:GetChildren()) do connectTool(t) end end --============================================================== -- ASSISTS CORE: Slash / BoneThrow / BoneSpin / FireCircle / Classy --============================================================== local function handleSlashTouch() if not _G.SlashAssist then return end if not activeAttacks then activeAttacks = workspace:FindFirstChild("ActiveAttacks") end if not activeAttacks then return end local target = _G.SelectedEnemy or getNearestEnemy() if not target then return end local torso = getEnemyTorso(target) if not torso then return end -- Global slashes under ActiveAttacks (not zone-specific) for _, child in ipairs(activeAttacks:GetChildren()) do if child:IsA("Folder") and child.Name == "Slash" then for _, slash in ipairs(child:GetChildren()) do if slash:IsA("BasePart") and slash:FindFirstChildWhichIsA("TouchTransmitter") then slash.CFrame = torso.CFrame end end elseif child:IsA("BasePart") and (child.Name == "Slash" or child.Name:lower():find("slash")) then if child:FindFirstChildWhichIsA("TouchTransmitter") then child.CFrame = torso.CFrame end end end -- Also scan the zones for i = 1, MAX_ZONE_INDEX do local zone = activeAttacks:FindFirstChild("Zone"..i) if zone then for _, obj in ipairs(zone:GetDescendants()) do if obj:IsA("BasePart") then local lname = obj.Name:lower() if lname:find("slash") and obj:FindFirstChildWhichIsA("TouchTransmitter") then obj.CFrame = torso.CFrame end end end end end end local function handleBoneAndFireAssists(target, torsoCF) if not activeAttacks then activeAttacks = workspace:FindFirstChild("ActiveAttacks") end if not activeAttacks then return end -- BoneThrow if _G.BoneThrowAssist then for _, atk in ipairs(activeAttacks:GetChildren()) do if atk.Name == "BoneThrow" or atk.Name:lower() == "bonethrow" then setInstanceCFrame(atk, torsoCF) end end for i = 1, MAX_ZONE_INDEX do local zone = activeAttacks:FindFirstChild("Zone"..i) if zone then for _, obj in ipairs(zone:GetChildren()) do local n = obj.Name:lower() if n == "bonethrow" then setInstanceCFrame(obj, torsoCF) end end end end end -- BoneSpin if _G.BoneSpinAssist then for _, atk in ipairs(activeAttacks:GetChildren()) do local n = atk.Name:lower() if n:find("^bonespin%d*$") then setInstanceCFrame(atk, torsoCF) end end for i = 1, MAX_ZONE_INDEX do local zone = activeAttacks:FindFirstChild("Zone"..i) if zone then for _, obj in ipairs(zone:GetChildren()) do local n = obj.Name:lower() if n:find("^bonespin%d*$") then setInstanceCFrame(obj, torsoCF) end end end end end -- FireCircle if _G.FireCircleAssist then for _, atk in ipairs(activeAttacks:GetChildren()) do local n = atk.Name:lower() if n:find("^firecircle%d*$") then setInstanceCFrame(atk, torsoCF) end end for i = 1, MAX_ZONE_INDEX do local zone = activeAttacks:FindFirstChild("Zone"..i) if zone then for _, obj in ipairs(zone:GetChildren()) do local n = obj.Name:lower() if n:find("^firecircle%d*$") then setInstanceCFrame(obj, torsoCF) end end end end end end local function handleClassyAssists(target) if not _G.ClassyAssist then return end if not activeAttacks then activeAttacks = workspace:FindFirstChild("ActiveAttacks") end if not activeAttacks then return end local torso = getEnemyTorso(target) if not torso then return end -- compute desired world cf based on offset and face mode local ox = tonumber(_G.ClassyOffsetX) or 0 local oy = tonumber(_G.ClassyOffsetY) or 0 local oz = tonumber(_G.ClassyOffsetZ) or 0 local offsetCF = CFrame.new(ox, oy, oz) local desiredPos = (torso.CFrame * offsetCF).Position local lookPoint = classyLookPoint(target, player.Character) or torso.Position local finalCF = CFrame.new(desiredPos, lookPoint) -- Optional noclip local function maybeNoClip(inst) if _G.ClassyNoClip then setContainerNoCollide(inst, true) end end -- Top-level "classy" items (non-zone) for _, obj in ipairs(activeAttacks:GetChildren()) do local lname = obj.Name:lower() if lname == "classy" or lname:find("classy") then maybeNoClip(obj) setInstanceCFrame(obj, finalCF) end end -- Zoned classy items (scan all zones 1..25) for i = 1, MAX_ZONE_INDEX do local zone = activeAttacks:FindFirstChild("Zone"..i) if zone then for _, obj in ipairs(zone:GetDescendants()) do local lname = obj.Name:lower() if lname == "classy" or lname:find("classy") then maybeNoClip(obj) setInstanceCFrame(obj, finalCF) end end end end end --============================================================== -- VISUAL: ENEMY LIST HIGHLIGHT --============================================================== local function updateEnemyHighlight() for enemy, btn in pairs(enemyButtons) do if enemy == _G.SelectedEnemy or enemy == universalTarget then btn.BackgroundColor3 = Color3.fromRGB(255,0,0) else btn.BackgroundColor3 = Color3.fromRGB(70,70,70) end end end --============================================================== -- HEARTBEAT LOOP --============================================================== RunService.RenderStepped:Connect(function() -- keep activeAttacks reference fresh (handles re-parenting) if not activeAttacks or not activeAttacks.Parent then activeAttacks = workspace:FindFirstChild("ActiveAttacks") end -- enemy list upkeep if _G.AutoRefreshEnemies then refreshEnemiesNow() end -- universal auto-aim: pick nearest if _G.UniversalAutoAim then universalTarget = getNearestEnemy() _G.SelectedEnemy = universalTarget if _G.SelectedEnemy then selectedTitle.Text = "Silent Aim: ".._G.SelectedEnemy.Name silentTitle.Text = "Silent Aim: ".._G.SelectedEnemy.Name else selectedTitle.Text = "Silent Aim: None" end end -- highlight selected target in list updateEnemyHighlight() -- Slash / others follow target local target = _G.SelectedEnemy or getNearestEnemy() if target and isEnemyAlive(target) then local torso = getEnemyTorso(target) if torso then handleSlashTouch() handleBoneAndFireAssists(target, torso.CFrame) handleClassyAssists(target) end end -- Adjust canvas size if needed leftScroll.CanvasSize = UDim2.new(0,0,0,leftLayout.AbsoluteContentSize.Y + 8) end) --============================================================== -- INITIAL POPULATE --============================================================== refreshEnemiesNow(true) --============================================================== -- CLEANUP GUARD (OPTIONAL) --============================================================== screenGui.AncestryChanged:Connect(function(_, parent) if not parent then -- restore any changes if necessary (currently none persistent) end end) --============================================================== -- DONE (Same GUI look, 600+ lines, Zone1..Zone25 support, multi-Classy) --==============================================================