-- [[ Rscripts Risk Notice ]] -- This script is not verified by rscripts.net. Deal with caution. -- -- Stay safe: -- • Never log in on unofficial Roblox sites or lookalike domains. -- • Real Roblox links use roblox.com (check the .com ending). -- • Treat fake Roblox login / "claim reward" pages as phishing. -- [[ End Rscripts Risk Notice ]] --[[ ABLE.lol (all-in-one) Combat : Silent Aim (3-layer hook) | Aimbot (always on, no keys / no mouse buttons, no prediction) Visuals: Chams / Tracer / Skeleton / 2D Box (head -> feet) Player : Fly (velocity) | WalkSpeed textbox | Auto Slide/Crouch Rage : Void <-> Attack cycle, DESYNC (server sees you at the enemy, your screen does not), Anti Kill (mine / knife -> go above), hide attack motion, allies fixed once per round Skins : Skin case scan + Wrap + Charm (client side) Keys : Q silent | G fly | X rage | RightShift hide GUI ]] local Players = game:GetService("Players") local RunService = game:GetService("RunService") local UIS = game:GetService("UserInputService") local CoreGui = game:GetService("CoreGui") local RepStorage = game:GetService("ReplicatedStorage") local VIM; pcall(function() VIM = game:GetService("VirtualInputManager") end) local LP = Players.LocalPlayer local Camera = workspace.CurrentCamera -- ====================== SHARED STATE ====================== local DEFAULTS = { SA = false, TeamCheck = true, WallCheck = false, Learn = true, Log = false, FOV = 250, Aimbot = true, AimSmooth = 0.6, StickyAim = true, MouseHook = false, ChamsOn = false, TracerOn = false, SkelOn = false, BoxOn = false, Fly = false, FlySpeed = 80, Walk = false, WalkValue = 50, AutoSlide = false, Rage = false, VoidTime = 0.6, AttackTime = 0.6, SpawnTeams = true, AllyCount = 0, RageDist = 1, AntiKill = true, AntiKillHeight = 14, MineRadius = 9, HideAnim = false, HideView = false, SkinWeapon = "", AutoSkin = false, SkinKind = "skin", } local S = _G.__RIVALS_HUB if not S then S = { m1 = false, lastM1 = 0, target = nil, busy = false, hooked = false, hookMode = "none", fn = {}, conns = {}, token = 0, firing = false, rageActive = false, rageAttacking = false, ragePhase = "attack", ragePhaseT = 0, catalog = {}, selSkin = nil, } S.Shoot = setmetatable({}, { __mode = "k" }) S.remotes = setmetatable({}, { __mode = "k" }) S.bg = setmetatable({}, { __mode = "k" }) S.slide = setmetatable({}, { __mode = "k" }) S.lastArgs = setmetatable({}, { __mode = "k" }) _G.__RIVALS_HUB = S end for k, v in pairs(DEFAULTS) do if S[k] == nil then S[k] = v end end if S.ver ~= 3 then S.ver = 3; S.Aimbot = true; S.HideAnim = false; S.HideView = false; S.Allies = nil; S.AlliesLocked = false end S.mines = S.mines or setmetatable({}, { __mode = "k" }) -- cleanup of previous execution for _, c in ipairs(S.conns) do pcall(function() c:Disconnect() end) end S.conns = {} if S.gui then pcall(function() S.gui:Destroy() end) end if S.drawings then for _, d in ipairs(S.drawings) do pcall(function() d:Remove() end) end end S.drawings = {} S.esp = {} pcall(function() RunService:UnbindFromRenderStep("RSA_Aim") end) pcall(function() RunService:UnbindFromRenderStep("RSA_Restore") end) local function track(c) S.conns[#S.conns + 1] = c; return c end -- ====================== HELPERS ====================== local REMOTE_CLASSES = { RemoteEvent = true, UnreliableRemoteEvent = true, RemoteFunction = true } local KEYWORDS = { "shoot", "fire", "hit", "bullet", "damage", "attack", "weapon", "gun", "ray", "projectile", "melee", "swing", "trace" } local DENY = { "ping", "move", "sprint", "jump", "camera", "chat", "emote", "crouch", "slide", "vote", "purchase", "broadcast", "walk" } local function matches(name, list) for _, k in ipairs(list) do if string.find(name, k, 1, true) then return true end end return false end local function count(t) local n = 0; for _ in pairs(t) do n = n + 1 end; return n end local function myChar() return LP.Character end local function myRoot() local c = LP.Character; return c and c:FindFirstChild("HumanoidRootPart") end local function myHum() local c = LP.Character; return c and c:FindFirstChildOfClass("Humanoid") end local function aliveHum(ch) local h = ch and ch:FindFirstChildOfClass("Humanoid") if h and h.Health > 0 then return h end return nil end local function safe(f, ...) local ok, err = pcall(f, ...) if not ok and S.Log then warn("[ABLE.lol] " .. tostring(err)) end end -- ====================== TEAMS ====================== local TeamsService = game:GetService("Teams") -- Round start: the nearest people become allies. Done ONCE per round, then locked. local function computeSpawnTeams(force) if S.AlliesLocked and not force then return end local hrp = myRoot() if not hrp then return end local arr = {} for _, p in ipairs(Players:GetPlayers()) do if p ~= LP then local r = p.Character and p.Character:FindFirstChild("HumanoidRootPart") if r then arr[#arr + 1] = { p = p, d = (r.Position - hrp.Position).Magnitude } end end end table.sort(arr, function(a, b) return a.d < b.d end) local n = math.floor(#arr / 2) if S.AllyCount and S.AllyCount > 0 then n = math.min(math.floor(S.AllyCount), #arr) end local allies = {} for i = 1, n do allies[arr[i].p] = true end S.Allies = allies S.AlliesLocked = true S.allyCount, S.enemyCount = n, #arr - n end local function isEnemy(p) if p == LP then return false end if not S.TeamCheck then return true end local mine, theirs = LP.Team, p.Team if mine and theirs and #TeamsService:GetTeams() >= 2 then return mine ~= theirs end local a, b = LP:GetAttribute("Team"), p:GetAttribute("Team") if a ~= nil and b ~= nil then return a ~= b end if S.SpawnTeams and S.Allies and S.Allies[p] then return false end return true end track(LP.CharacterAdded:Connect(function() S.AlliesLocked = false -- new round: allow exactly one fresh snapshot task.delay(2.5, function() computeSpawnTeams(false) end) end)) task.spawn(function() task.wait(1); computeSpawnTeams(false) end) -- ====================== TARGETING ====================== local function visible(part, ch) local ignore = { Camera, ch } if LP.Character then ignore[#ignore + 1] = LP.Character end local params = RaycastParams.new() params.FilterType = Enum.RaycastFilterType.Exclude params.FilterDescendantsInstances = ignore local origin = Camera.CFrame.Position S.busy = true local ok, res = pcall(function() return workspace:Raycast(origin, part.Position - origin, params) end) S.busy = false return ok and res == nil end local function evalPlayer(p) if not isEnemy(p) then return nil end local ch = p.Character if not ch then return nil end if ch:FindFirstChildOfClass("Humanoid") and not aliveHum(ch) then return nil end local part = ch:FindFirstChild("Head") or ch:FindFirstChild("HumanoidRootPart") if not part then return nil end local sp, on = Camera:WorldToViewportPoint(part.Position) if not on then return nil end local vs = Camera.ViewportSize local d = math.sqrt((sp.X - vs.X / 2) ^ 2 + (sp.Y - vs.Y / 2) ^ 2) return { player = p, part = part, character = ch, d = d } end local function getTarget() -- sticky: keep the current lock while it is still alive / on screen / roughly inside FOV if S.StickyAim and S.lockPlayer and S.lockPlayer.Parent then local t = evalPlayer(S.lockPlayer) if t and t.d <= S.FOV * 1.25 and ((not S.WallCheck) or visible(t.part, t.character)) then return t end end local best for _, p in ipairs(Players:GetPlayers()) do local t = evalPlayer(p) if t and t.d <= S.FOV and ((not best) or t.d < best.d) then if (not S.WallCheck) or visible(t.part, t.character) then best = t end end end S.lockPlayer = best and best.player or nil return best end local function silentActive() return S.SA or S.rageAttacking end local function shooting() return S.m1 or S.rageAttacking or (tick() - S.lastM1) < 0.3 end -- ====================== ARG REWRITING ====================== local function playerOf(inst) local cur = inst while cur and cur ~= game do local ok, pl = pcall(function() if cur:IsA("Model") then return Players:GetPlayerFromCharacter(cur) end return nil end) if ok and pl then return pl end cur = cur.Parent end return nil end local function containsAim(v, depth) local t = typeof(v) if t == "Vector3" or t == "CFrame" then return true end if t == "Instance" then local ok, r = pcall(function() return v:IsA("BasePart") end) return ok and r end if t == "table" and depth < 4 then for _, x in next, v do if containsAim(x, depth + 1) then return true end end end return false end local function rewriteValue(v, tgt, depth) local t = typeof(v) local cam = Camera.CFrame.Position local origin = S.fakeOrigin or cam local aim = tgt.part.Position if t == "Vector3" then local m = v.Magnitude if m > 0.5 and m < 1.5 then local d = aim - origin if d.Magnitude > 0 then return d.Unit end return v end if (v - cam).Magnitude < 12 then return S.fakeOrigin or v end return aim elseif t == "CFrame" then local p = v.Position if (p - cam).Magnitude < 12 then return CFrame.new(origin, aim) end return CFrame.new(aim) elseif t == "Instance" then local pl = playerOf(v) if pl and pl ~= LP then local ok, isPart = pcall(function() return v:IsA("BasePart") end) if ok and isPart then return tgt.part end return tgt.character end return v elseif t == "table" and depth < 4 then local out = {} for k, x in next, v do out[k] = rewriteValue(x, tgt, depth + 1) end pcall(function() setmetatable(out, getmetatable(v)) end) return out end return v end local lastLog = {} local function logRemote(remote, cls, args) local now = tick() if lastLog[remote] and now - lastLog[remote] < 0.05 then return end lastLog[remote] = now local types = {} for i = 1, args.n do types[#types + 1] = typeof(args[i]) end print(("[ABLE.lol] %s | %s | args(%d): %s | bg=%d"):format( cls, remote:GetFullName(), args.n, table.concat(types, ", "), S.bg[remote] or 0)) end -- ====================== HOOK PROCESSORS ====================== local function coreRemote(remote, ...) local ok, cls = pcall(function() return remote.ClassName end) if not ok or not REMOTE_CLASSES[cls] then return nil end if S.slide[remote] then S.lastArgs[remote] = table.pack(...) end -- learn real slide/crouch args if not shooting() then S.bg[remote] = (S.bg[remote] or 0) + 1 return nil end if not silentActive() then return nil end local tgt = S.target if not tgt then return nil end local args = table.pack(...) if S.Log then logRemote(remote, cls, args) end if not S.Shoot[remote] then local name = string.lower(remote.Name) if matches(name, DENY) then return nil end if not containsAim(args, 0) then return nil end if matches(name, KEYWORDS) or (S.Learn and (S.bg[remote] or 0) < 4) then S.Shoot[remote] = true else return nil end end local out = table.pack() for i = 1, args.n do out[i] = rewriteValue(args[i], tgt, 0) end out.n = args.n return out end local function coreRay(method, ...) if not (silentActive() and shooting()) then return nil end local tgt = S.target if not tgt then return nil end local a = table.pack(...) local origin, dir if method == "Raycast" then origin, dir = a[1], a[2] if typeof(origin) ~= "Vector3" or typeof(dir) ~= "Vector3" then return nil end else local ray = a[1] if typeof(ray) ~= "Ray" then return nil end origin, dir = ray.Origin, ray.Direction end if dir.Magnitude < 40 then return nil end local cam = Camera.CFrame.Position local near = (origin - cam).Magnitude < 15 if not near then local hrp = myRoot() near = hrp and (origin - hrp.Position).Magnitude < 15 end if not near then return nil end local newOrigin = S.fakeOrigin or origin -- while raging, shoot from where the server thinks you are local to = tgt.part.Position - newOrigin if to.Magnitude < 0.1 then return nil end local len = math.max(dir.Magnitude, to.Magnitude + 10) -- always long enough to reach the head local nd = to.Unit * len if method == "Raycast" then a[1] = newOrigin; a[2] = nd else a[1] = Ray.new(newOrigin, nd) end return a end local function coreViewRay(ray) if not (silentActive() and shooting()) then return nil end local tgt = S.target if not tgt or typeof(ray) ~= "Ray" then return nil end local origin = S.fakeOrigin or ray.Origin local to = tgt.part.Position - origin if to.Magnitude < 0.1 then return nil end return Ray.new(origin, to.Unit * ray.Direction.Magnitude) -- straight at the head center end S.fn.processViewRay = function(ray) local ok, res = pcall(coreViewRay, ray) if ok then return res end return nil end S.fn.processRemote = function(remote, ...) local ok, res = pcall(coreRemote, remote, ...) if ok then return res end return nil end S.fn.processRay = function(method, ...) local ok, res = pcall(coreRay, method, ...) if ok then return res end return nil end -- ====================== HOOK INSTALL (once) ====================== local function installHooks() if S.hooked then return end local old local function callOld(self, method, ...) if setnamecallmethod then pcall(setnamecallmethod, method) end return old(self, ...) end local function handler(self, ...) local method = getnamecallmethod() if not S.busy and not (checkcaller and checkcaller()) then if method == "FireServer" or method == "InvokeServer" then local r = S.fn.processRemote(self, ...) if r then return callOld(self, method, table.unpack(r, 1, r.n)) end elseif (method == "Raycast" or method == "FindPartOnRay" or method == "FindPartOnRayWithIgnoreList") and self == workspace then local r = S.fn.processRay(method, ...) if r then return callOld(self, method, table.unpack(r, 1, r.n)) end elseif (method == "ViewportPointToRay" or method == "ScreenPointToRay") and self == Camera then local ray = callOld(self, method, ...) local nr = S.fn.processViewRay(ray) if nr then return nr end return ray end end return callOld(self, method, ...) end local wrapped = newcclosure and newcclosure(handler) or handler local ok1 = pcall(function() if hookmetamethod then old = hookmetamethod(game, "__namecall", wrapped) S.hookMode = "hookmetamethod" elseif getrawmetatable then local mt = getrawmetatable(game) if setreadonly then setreadonly(mt, false) elseif make_writeable then make_writeable(mt) end old = mt.__namecall mt.__namecall = wrapped if setreadonly then setreadonly(mt, true) end S.hookMode = "rawmetatable" else error("no metatable hook api") end end) if not ok1 then S.hookMode = "FAILED"; return end S.hooked = true if hookfunction then local list = { { "RemoteEvent", "FireServer" }, { "UnreliableRemoteEvent", "FireServer" }, { "RemoteFunction", "InvokeServer" } } local n = 0 for _, pr in ipairs(list) do local ok = pcall(function() local inst = Instance.new(pr[1]) local f = inst[pr[2]] inst:Destroy() local oldf oldf = hookfunction(f, newcclosure(function(self, ...) if not S.busy and not (checkcaller and checkcaller()) then local r = S.fn.processRemote(self, ...) if r then return oldf(self, table.unpack(r, 1, r.n)) end end return oldf(self, ...) end)) end) if ok then n = n + 1 end end S.hookMode = S.hookMode .. " + direct(" .. n .. ")" end end -- optional layer: games that read Mouse.Hit / Mouse.Target / Mouse.UnitRay (installed once, on demand) local function installMouseHook() if S.mouseHooked or not hookmetamethod then return end S.mouse = LP:GetMouse() local old old = hookmetamethod(game, "__index", newcclosure(function(self, key) if (key == "Hit" or key == "Target" or key == "UnitRay") and self == S.mouse and S.aimPart and not S.busy and silentActive() and shooting() and not (checkcaller and checkcaller()) then if key == "Hit" then return CFrame.new(S.aimPos) end if key == "Target" then return S.aimPart end local ur = old(self, "UnitRay") local origin = S.fakeOrigin or ur.Origin local d = S.aimPos - origin if d.Magnitude > 0.1 then return Ray.new(origin, d.Unit) end return ur end return old(self, key) end)) S.mouseHooked = true end -- ====================== REMOTE DISCOVERY ====================== local function classify(inst) local ok, cls = pcall(function() return inst.ClassName end) if not ok or not REMOTE_CLASSES[cls] then return end if S.remotes[inst] then return end S.remotes[inst] = cls local name = string.lower(inst.Name) if matches(name, KEYWORDS) and not matches(name, DENY) then S.Shoot[inst] = true end if string.find(name, "slide", 1, true) or string.find(name, "crouch", 1, true) then S.slide[inst] = true end end local function scanRemotes() local src if getinstances then local ok, r = pcall(getinstances) if ok then src = r end end if not src then src = game:GetDescendants() end for _, i in ipairs(src) do classify(i) end print(("[ABLE.lol] remotes: %d | shoot: %d | slide/crouch: %d"):format(count(S.remotes), count(S.Shoot), count(S.slide))) for r in pairs(S.slide) do print(" slide/crouch -> " .. S.remotes[r] .. " " .. r:GetFullName()) end end track(game.DescendantAdded:Connect(classify)) -- ====================== INPUT ====================== track(UIS.InputBegan:Connect(function(i) if i.UserInputType == Enum.UserInputType.MouseButton1 or i.UserInputType == Enum.UserInputType.Touch then S.m1 = true; S.lastM1 = tick() end end)) track(UIS.InputEnded:Connect(function(i) if i.UserInputType == Enum.UserInputType.MouseButton1 or i.UserInputType == Enum.UserInputType.Touch then S.m1 = false; S.lastM1 = tick() end end)) -- ====================== FIRE HELPER ====================== local function holdFire(on) if on == S.firing then if on and not mouse1press then local c = myChar() local tool = c and c:FindFirstChildOfClass("Tool") if tool then pcall(function() tool:Activate() end) end end return end S.firing = on local ok = false if on and mouse1press then ok = pcall(mouse1press) elseif (not on) and mouse1release then ok = pcall(mouse1release) end if not ok and VIM then local vs = Camera.ViewportSize pcall(function() VIM:SendMouseButtonEvent(vs.X / 2, vs.Y / 2, 0, on, game, 0) end) end end -- ====================== RAGE BOT ====================== -- DESYNC: after physics (Heartbeat) the root is moved to the attack / void spot. On the first -- render step of the NEXT frame it is moved back. The network send only ever sees the attack -- spot, while on your screen you keep walking and jumping normally. local VOID_Y = 6000 local function mineTrack(inst) if inst:IsA("BasePart") or inst:IsA("Model") then local n = string.lower(inst.Name) if (string.find(n, "mine", 1, true) or string.find(n, "claymore", 1, true)) and not string.find(n, "minecart", 1, true) and not string.find(n, "mining", 1, true) then S.mines[inst] = true end end end track(workspace.DescendantAdded:Connect(mineTrack)) task.spawn(function() local i = 0 for _, d in ipairs(workspace:GetDescendants()) do mineTrack(d) i = i + 1 if i % 4000 == 0 then task.wait() end end end) local function holdsKnife(ch) local tool = ch:FindFirstChildOfClass("Tool") if tool then local n = string.lower(tool.Name) if string.find(n, "knife", 1, true) or string.find(n, "dagger", 1, true) then return true end end local pl = Players:GetPlayerFromCharacter(ch) for _, k in ipairs({ "Weapon", "EquippedWeapon", "CurrentWeapon", "Equipped" }) do local v = ch:GetAttribute(k) if v == nil and pl then v = pl:GetAttribute(k) end if type(v) == "string" then local n = string.lower(v) if string.find(n, "knife", 1, true) or string.find(n, "dagger", 1, true) then return true end end end return false end local function dangerNear(pos) for m in pairs(S.mines) do if m.Parent then local ok, mp = pcall(function() if m:IsA("Model") then return m:GetPivot().Position end return m.Position end) if ok and mp and (mp - pos).Magnitude <= S.MineRadius then return "mine" end end end for _, p in ipairs(Players:GetPlayers()) do if isEnemy(p) and p.Character and aliveHum(p.Character) then local r = p.Character:FindFirstChild("HumanoidRootPart") if r and (r.Position - pos).Magnitude <= 25 and holdsKnife(p.Character) then return "knife" end end end return nil end local function pickRageTarget(fromPos) local best, bd for _, p in ipairs(Players:GetPlayers()) do if isEnemy(p) and p.Character and aliveHum(p.Character) then local r = p.Character:FindFirstChild("HumanoidRootPart") if r then local d = (r.Position - fromPos).Magnitude if (not bd) or d < bd then best, bd = p, d end end end end return best end local function stopRage() holdFire(false) S.rageAttacking = false S.fakeOrigin = nil S.rageActive = false S.rageTarget = nil S.rageDanger = nil end local function rageStep(dt) if not S.Rage then if S.rageActive then stopRage() end return end local hrp, hum = myRoot(), myHum() if not hrp or not hum or hum.Health <= 0 then if S.rageActive then stopRage() end return end if not S.rageActive then S.rageActive = true S.ragePhase, S.ragePhaseT = "attack", 0 if not S.Allies then computeSpawnTeams(false) end end local t = S.rageTarget if not (t and t.Character and aliveHum(t.Character)) then S.rageTarget = pickRageTarget(hrp.Position) t = S.rageTarget end if not t then holdFire(false); S.rageAttacking = false; S.fakeOrigin = nil return end S.ragePhaseT = S.ragePhaseT + dt if S.ragePhase == "void" and S.ragePhaseT >= S.VoidTime then S.ragePhase, S.ragePhaseT = "attack", 0 elseif S.ragePhase == "attack" and S.ragePhaseT >= S.AttackTime then S.ragePhase, S.ragePhaseT = "void", 0 end local tch = t.Character local troot = tch:FindFirstChild("HumanoidRootPart") local thead = tch:FindFirstChild("Head") or troot if not troot then return end local fake if S.ragePhase == "void" then S.rageAttacking = false S.fakeOrigin = nil S.rageDanger = nil holdFire(false) fake = CFrame.new(troot.Position.X, VOID_Y, troot.Position.Z) else S.rageAttacking = true local pos = (troot.CFrame * CFrame.new(0, 0, S.RageDist)).Position -- glued behind the enemy S.rageDanger = S.AntiKill and dangerNear(pos) or nil if S.rageDanger then pos = troot.Position + Vector3.new(0, S.AntiKillHeight, 0) end -- mine / knife -> above if (thead.Position - pos).Magnitude > 0.05 then fake = CFrame.lookAt(pos, thead.Position) else fake = CFrame.new(pos) end S.fakeOrigin = pos + Vector3.new(0, 1.5, 0) holdFire(true) S.lastM1 = tick() end -- desync: server gets `fake`, your screen gets the real CFrame back next frame S.realCF = hrp.CFrame S.restoreRoot = hrp S.needRestore = true hrp.CFrame = fake end -- ====================== MOVEMENT ====================== local function flyStep() local hrp, hum = myRoot(), myHum() if not (S.Fly and hrp and hum) then return end local dir = hum.MoveDirection local y = 0 if UIS:IsKeyDown(Enum.KeyCode.Space) then y = y + 1 end if UIS:IsKeyDown(Enum.KeyCode.LeftShift) then y = y - 1 end hrp.AssemblyLinearVelocity = Vector3.new(dir.X * S.FlySpeed, y * S.FlySpeed, dir.Z * S.FlySpeed) end local function walkStep() local hum = myHum() if S.Walk and hum then hum.WalkSpeed = S.WalkValue end end local function slideStep() if not S.AutoSlide then return end for remote in pairs(S.slide) do if remote.Parent then local a = S.lastArgs[remote] or { n = 0 } if S.remotes[remote] == "RemoteFunction" then task.spawn(function() pcall(function() remote:InvokeServer(table.unpack(a, 1, a.n)) end) end) else pcall(function() remote:FireServer(table.unpack(a, 1, a.n)) end) end end end end track(RunService.Heartbeat:Connect(function(dt) safe(function() if S.MouseHook and not S.mouseHooked then installMouseHook() end end) safe(flyStep) safe(walkStep) safe(slideStep) safe(rageStep, dt) -- last, so everything else sees the real position end)) -- ====================== AIMBOT (camera, every frame, always on) ====================== -- restore step: runs first every frame, puts the root back to your real position pcall(function() RunService:BindToRenderStep("RSA_Restore", Enum.RenderPriority.First.Value, function() if S.needRestore then S.needRestore = false local hrp = myRoot() if hrp and hrp == S.restoreRoot and S.realCF then hrp.CFrame = S.realCF end end end) end) local function setViewModelHidden(hidden) local v = hidden and 1 or 0 for _, m in ipairs(Camera:GetChildren()) do if m:IsA("BasePart") then m.LocalTransparencyModifier = v end for _, d in ipairs(m:GetDescendants()) do if d:IsA("BasePart") then d.LocalTransparencyModifier = v end end end end local function motionHide() if S.rageAttacking then if S.HideAnim then local hum = myHum() local animator = hum and hum:FindFirstChildOfClass("Animator") if animator then for _, tr in ipairs(animator:GetPlayingAnimationTracks()) do if tr.Priority.Value >= Enum.AnimationPriority.Action.Value then pcall(function() tr:Stop(0) end) end end end end if S.HideView then setViewModelHidden(true); S.viewHidden = true end elseif S.viewHidden then S.viewHidden = false setViewModelHidden(false) end end local function aimStep(dt) Camera = workspace.CurrentCamera local tgt if S.rageAttacking and S.rageTarget and S.rageTarget.Character then local ch = S.rageTarget.Character local part = ch:FindFirstChild("Head") or ch:FindFirstChild("HumanoidRootPart") if part then tgt = { player = S.rageTarget, part = part, character = ch } end elseif S.SA or S.Aimbot then local ok, t = pcall(getTarget) if ok then tgt = t end end S.target = tgt S.aimPart = tgt and tgt.part or nil S.aimPos = tgt and tgt.part.Position or nil motionHide() -- aimbot: always on, no mouse button, no key, NO prediction (current head position only) if not tgt or not S.Aimbot or S.rageAttacking then return end local cam = Camera.CFrame local goal = CFrame.lookAt(cam.Position, tgt.part.Position) local s = math.clamp(S.AimSmooth, 0.05, 1) local a = 1 - (1 - s) ^ (math.clamp(dt or 0.016, 0, 0.1) * 60) -- same feel at any FPS Camera.CFrame = cam:Lerp(goal, a) end pcall(function() RunService:BindToRenderStep("RSA_Aim", Enum.RenderPriority.Camera.Value + 1, function(dt) safe(aimStep, dt) end) end) -- ====================== ESP ====================== local gui = Instance.new("ScreenGui") gui.Name = "ABLE"; gui.ResetOnSpawn = false; gui.DisplayOrder = 9999; gui.IgnoreGuiInset = true pcall(function() gui.Parent = (gethui and gethui()) or CoreGui end) if not gui.Parent then gui.Parent = LP:WaitForChild("PlayerGui") end S.gui = gui local DUMMY = setmetatable({}, { __newindex = function() end, __index = function() return function() end end }) local function newDraw(t, props) local ok, d = pcall(function() return Drawing.new(t) end) if not ok or not d then return DUMMY end for k, v in pairs(props) do pcall(function() d[k] = v end) end S.drawings[#S.drawings + 1] = d return d end local R15 = { { "Head", "UpperTorso" }, { "UpperTorso", "LowerTorso" }, { "UpperTorso", "LeftUpperArm" }, { "LeftUpperArm", "LeftLowerArm" }, { "LeftLowerArm", "LeftHand" }, { "UpperTorso", "RightUpperArm" }, { "RightUpperArm", "RightLowerArm" }, { "RightLowerArm", "RightHand" }, { "LowerTorso", "LeftUpperLeg" }, { "LeftUpperLeg", "LeftLowerLeg" }, { "LeftLowerLeg", "LeftFoot" }, { "LowerTorso", "RightUpperLeg" }, { "RightUpperLeg", "RightLowerLeg" }, { "RightLowerLeg", "RightFoot" }, } local R6 = { { "Head", "Torso" }, { "Torso", "Left Arm" }, { "Torso", "Right Arm" }, { "Torso", "Left Leg" }, { "Torso", "Right Leg" } } local function makeESP(p) local e = {} e.box = newDraw("Square", { Filled = false, Thickness = 1.5, Visible = false }) e.boxO = newDraw("Square", { Filled = false, Thickness = 3, Color = Color3.new(0, 0, 0), Visible = false }) e.tracer = newDraw("Line", { Thickness = 1.3, Visible = false }) e.bones = {} for i = 1, 14 do e.bones[i] = newDraw("Line", { Thickness = 1.2, Visible = false }) end local h = Instance.new("Highlight") h.FillTransparency = 0.55; h.OutlineTransparency = 0 h.DepthMode = Enum.HighlightDepthMode.AlwaysOnTop h.Enabled = false; h.Parent = gui e.hl = h S.esp[p] = e return e end local function hideESP(e) e.box.Visible = false; e.boxO.Visible = false; e.tracer.Visible = false for _, b in ipairs(e.bones) do b.Visible = false end e.hl.Enabled = false; e.hl.Adornee = nil end track(Players.PlayerRemoving:Connect(function(p) local e = S.esp[p] if e then hideESP(e) pcall(function() e.hl:Destroy() end) S.esp[p] = nil end end)) local COL_ENEMY, COL_ALLY = Color3.fromRGB(255, 70, 70), Color3.fromRGB(70, 230, 120) local function espStep() Camera = workspace.CurrentCamera local any = S.ChamsOn or S.TracerOn or S.SkelOn or S.BoxOn local vs = Camera.ViewportSize for _, p in ipairs(Players:GetPlayers()) do if p ~= LP then local e = S.esp[p] or makeESP(p) local ch = p.Character local root = ch and ch:FindFirstChild("HumanoidRootPart") local head = ch and ch:FindFirstChild("Head") if not any or not root or not head or not aliveHum(ch) then hideESP(e) else local col = isEnemy(p) and COL_ENEMY or COL_ALLY local rsp, ron = Camera:WorldToViewportPoint(root.Position) if not ron then hideESP(e) else -- head top -> feet local top = head.Position + Vector3.new(0, head.Size.Y / 2 + 0.1, 0) local foot = ch:FindFirstChild("LeftFoot") or ch:FindFirstChild("Left Leg") local bottom = root.Position - Vector3.new(0, 3, 0) if foot then bottom = Vector3.new(root.Position.X, foot.Position.Y - foot.Size.Y / 2, root.Position.Z) end local tsp = Camera:WorldToViewportPoint(top) local bsp = Camera:WorldToViewportPoint(bottom) local h = bsp.Y - tsp.Y local w = h * 0.55 if S.BoxOn and h > 2 then e.boxO.Size = Vector2.new(w + 2, h + 2); e.boxO.Position = Vector2.new(rsp.X - w / 2 - 1, tsp.Y - 1); e.boxO.Visible = true e.box.Color = col; e.box.Size = Vector2.new(w, h); e.box.Position = Vector2.new(rsp.X - w / 2, tsp.Y); e.box.Visible = true else e.box.Visible = false; e.boxO.Visible = false end if S.TracerOn then e.tracer.Color = col e.tracer.From = Vector2.new(vs.X / 2, vs.Y) e.tracer.To = Vector2.new(rsp.X, bsp.Y) e.tracer.Visible = true else e.tracer.Visible = false end if S.SkelOn then local joints = ch:FindFirstChild("UpperTorso") and R15 or R6 for i = 1, 14 do local line = e.bones[i] local j = joints[i] local a, b = j and ch:FindFirstChild(j[1]), j and ch:FindFirstChild(j[2]) if a and b then local sa, onA = Camera:WorldToViewportPoint(a.Position) local sb, onB = Camera:WorldToViewportPoint(b.Position) if onA and onB then line.Color = col line.From = Vector2.new(sa.X, sa.Y); line.To = Vector2.new(sb.X, sb.Y) line.Visible = true else line.Visible = false end else line.Visible = false end end else for _, b in ipairs(e.bones) do b.Visible = false end end if S.ChamsOn then e.hl.Adornee = ch; e.hl.FillColor = col; e.hl.OutlineColor = col; e.hl.Enabled = true else e.hl.Enabled = false; e.hl.Adornee = nil end end end end end end local circle = newDraw("Circle", { Thickness = 1, NumSides = 64, Filled = false, Color = Color3.fromRGB(255, 70, 70), Transparency = 1, Visible = false }) track(RunService.RenderStepped:Connect(function() safe(espStep) local vs = Camera.ViewportSize circle.Visible = (S.SA or S.Aimbot) circle.Radius = S.FOV circle.Position = Vector2.new(vs.X / 2, vs.Y / 2) end)) -- ====================== SKINS / WRAPS / CHARMS (client side) ====================== local function scanSkins() local out, seen = {}, {} local function add(kind, caseName, inst, label) if seen[inst] or #out > 3000 then return end seen[inst] = true out[#out + 1] = { kind = kind, case = caseName, inst = inst, label = label } end for _, root in ipairs({ RepStorage, game:GetService("ReplicatedFirst"), workspace, LP }) do for _, inst in ipairs(root:GetDescendants()) do if not inst:IsDescendantOf(gui) then local n = string.lower(inst.Name) local kind if string.find(n, "case", 1, true) then kind = "skin" elseif string.find(n, "wrap", 1, true) then kind = "wrap" elseif string.find(n, "charm", 1, true) then kind = "charm" end if kind and #inst:GetChildren() > 0 then for _, c in ipairs(inst:GetChildren()) do add(kind, inst.Name, c, inst.Name .. " / " .. c.Name) if c:IsA("Folder") then for _, g in ipairs(c:GetChildren()) do add(kind, inst.Name, g, inst.Name .. " / " .. c.Name .. " / " .. g.Name) end end end end end end end S.catalog = out return #out end local function copyAppearance(sp, tp) pcall(function() tp.Color = sp.Color; tp.Material = sp.Material; tp.Reflectance = sp.Reflectance if sp:IsA("MeshPart") and tp:IsA("MeshPart") then pcall(function() tp.TextureID = sp.TextureID end) end end) for _, c in ipairs(tp:GetChildren()) do if c:IsA("SurfaceAppearance") or c:IsA("Texture") or c:IsA("Decal") then c:Destroy() end end for _, c in ipairs(sp:GetChildren()) do if c:IsA("SurfaceAppearance") or c:IsA("Texture") or c:IsA("Decal") then c:Clone().Parent = tp end end end local function applySkin(entry, target) local skin = entry.inst if skin:IsA("SurfaceAppearance") or skin:IsA("Texture") or skin:IsA("Decal") then for _, tp in ipairs(target:GetDescendants()) do if tp:IsA("BasePart") then for _, c in ipairs(tp:GetChildren()) do if c:IsA("SurfaceAppearance") then c:Destroy() end end skin:Clone().Parent = tp end end return end local sparts = {} for _, d in ipairs(skin:GetDescendants()) do if d:IsA("BasePart") then sparts[d.Name] = d end end if skin:IsA("BasePart") then sparts[skin.Name] = skin end local n = 0 for _, tp in ipairs(target:GetDescendants()) do if tp:IsA("BasePart") and sparts[tp.Name] then copyAppearance(sparts[tp.Name], tp); n = n + 1 end end if n == 0 and S.SkinWeapon ~= "" then local first for _, sp in pairs(sparts) do first = sp; break end if first then for _, tp in ipairs(target:GetDescendants()) do if tp:IsA("BasePart") then copyAppearance(first, tp) end end end end end local function applyCharm(entry, target) if target:FindFirstChild("RSA_Charm") then return end local base = target.PrimaryPart or target:FindFirstChildWhichIsA("BasePart", true) if not base then return end local clone = entry.inst:Clone() clone.Name = "RSA_Charm" local part = clone:IsA("BasePart") and clone or clone:FindFirstChildWhichIsA("BasePart", true) if not part then clone:Destroy(); return end for _, d in ipairs(clone:GetDescendants()) do if d:IsA("BasePart") then d.Anchored = false; d.CanCollide = false; d.Massless = true end end if clone:IsA("BasePart") then clone.Anchored = false; clone.CanCollide = false; clone.Massless = true end clone.Parent = target local cf = base.CFrame * CFrame.new(0, -0.6, 0) if clone:IsA("Model") then clone:PivotTo(cf) else clone.CFrame = cf end local w = Instance.new("WeldConstraint") w.Part0 = base; w.Part1 = part; w.Parent = part end local function weaponModels(filter) local out = {} local function consider(inst) if inst:IsA("Tool") or inst:IsA("Model") then local n = string.lower(inst.Name) if filter == "" or string.find(n, filter, 1, true) then out[#out + 1] = inst end end end local c = myChar() if c then for _, x in ipairs(c:GetChildren()) do consider(x) end end local bp = LP:FindFirstChildOfClass("Backpack") if bp then for _, x in ipairs(bp:GetChildren()) do consider(x) end end for _, x in ipairs(Camera:GetChildren()) do consider(x) end return out end local function applySelected(all) local e = S.selSkin if not e then return 0 end local filter = all and "" or string.lower(S.SkinWeapon or "") local n = 0 for _, m in ipairs(weaponModels(filter)) do if m:GetAttribute("RSA_" .. e.kind) ~= e.label then if e.kind == "charm" then applyCharm(e, m) else applySkin(e, m) end m:SetAttribute("RSA_" .. e.kind, e.label) n = n + 1 end end return n end local function unlockFlags() local n = 0 for _, root in ipairs({ LP, RepStorage }) do for _, v in ipairs(root:GetDescendants()) do if v:IsA("BoolValue") then local ln = string.lower(v.Name) if string.find(ln, "owned", 1, true) or string.find(ln, "unlock", 1, true) then pcall(function() v.Value = true end); n = n + 1 end end end end for k, val in pairs(LP:GetAttributes()) do local ln = string.lower(k) if typeof(val) == "boolean" and (string.find(ln, "owned", 1, true) or string.find(ln, "unlock", 1, true)) then pcall(function() LP:SetAttribute(k, true) end); n = n + 1 end end return n end local function dumpSkinData() print("===== [ABLE.lol] SKIN DATA DUMP =====") print("catalog entries: " .. #S.catalog) local shown = {} for _, e in ipairs(S.catalog) do if not shown[e.case] then shown[e.case] = 0 end if shown[e.case] < 5 then shown[e.case] = shown[e.case] + 1 print((" [%s] %s (%s)"):format(e.kind, e.label, e.inst.ClassName)) end end print("-- LocalPlayer children --") for _, c in ipairs(LP:GetChildren()) do print(" " .. c.ClassName .. " " .. c.Name) end print("-- inventory/data/skin/weapon named instances --") local n = 0 for _, root in ipairs({ LP, RepStorage }) do for _, v in ipairs(root:GetDescendants()) do local ln = string.lower(v.Name) if n < 80 and (string.find(ln, "inventory", 1, true) or string.find(ln, "equipped", 1, true) or string.find(ln, "loadout", 1, true) or string.find(ln, "cosmetic", 1, true)) then print(" " .. v.ClassName .. " " .. v:GetFullName()); n = n + 1 end end end print("===== END DUMP =====") end local autoAcc = 0 track(RunService.Heartbeat:Connect(function(dt) autoAcc = autoAcc + dt if autoAcc >= 0.5 then autoAcc = 0 if S.AutoSkin and S.selSkin then safe(applySelected, false) end end end)) -- ====================== GUI ====================== local C = { bg = Color3.fromRGB(14, 15, 20), row = Color3.fromRGB(24, 25, 33), bar = Color3.fromRGB(20, 21, 28), txt = Color3.fromRGB(220, 222, 232), sub = Color3.fromRGB(120, 124, 140), on = Color3.fromRGB(80, 220, 120), off = Color3.fromRGB(110, 114, 130), acc = Color3.fromRGB(255, 70, 70), } local function new(cls, props, parent) local i = Instance.new(cls) for k, v in pairs(props) do i[k] = v end i.Parent = parent return i end local win = new("Frame", { Size = UDim2.new(0, 310, 0, 460), Position = UDim2.new(0, 20, 0.5, -230), BackgroundColor3 = C.bg, BorderSizePixel = 0 }, gui) new("UICorner", { CornerRadius = UDim.new(0, 10) }, win) new("UIStroke", { Color = C.acc, Thickness = 1.2 }, win) local bar = new("Frame", { Size = UDim2.new(1, 0, 0, 32), BackgroundColor3 = C.bar, BorderSizePixel = 0 }, win) new("UICorner", { CornerRadius = UDim.new(0, 10) }, bar) new("TextLabel", { BackgroundTransparency = 1, Size = UDim2.new(1, -16, 1, 0), Position = UDim2.new(0, 12, 0, 0), Text = "ABLE.lol", Font = Enum.Font.GothamBold, TextSize = 14, TextColor3 = C.acc, TextXAlignment = Enum.TextXAlignment.Left, }, bar) local dragging, dragStart, startPos = false, nil, nil track(bar.InputBegan:Connect(function(i) if i.UserInputType == Enum.UserInputType.MouseButton1 or i.UserInputType == Enum.UserInputType.Touch then dragging, dragStart, startPos = true, i.Position, win.Position end end)) track(UIS.InputChanged:Connect(function(i) if dragging and (i.UserInputType == Enum.UserInputType.MouseMovement or i.UserInputType == Enum.UserInputType.Touch) then local d = i.Position - dragStart win.Position = UDim2.new(startPos.X.Scale, startPos.X.Offset + d.X, startPos.Y.Scale, startPos.Y.Offset + d.Y) end end)) track(UIS.InputEnded:Connect(function(i) if i.UserInputType == Enum.UserInputType.MouseButton1 or i.UserInputType == Enum.UserInputType.Touch then dragging = false end end)) local tabRow = new("Frame", { Size = UDim2.new(1, -12, 0, 26), Position = UDim2.new(0, 6, 0, 36), BackgroundTransparency = 1 }, win) new("UIListLayout", { FillDirection = Enum.FillDirection.Horizontal, Padding = UDim.new(0, 3) }, tabRow) local pages, tabBtns = {}, {} local function showPage(name) for n, pg in pairs(pages) do pg.Visible = (n == name) end for n, b in pairs(tabBtns) do b.TextColor3 = (n == name) and C.acc or C.sub end end local function addPage(name) local pg = new("ScrollingFrame", { Size = UDim2.new(1, -12, 1, -70), Position = UDim2.new(0, 6, 0, 66), BackgroundTransparency = 1, BorderSizePixel = 0, ScrollBarThickness = 3, CanvasSize = UDim2.new(0, 0, 0, 0), AutomaticCanvasSize = Enum.AutomaticSize.Y, Visible = false, }, win) new("UIListLayout", { Padding = UDim.new(0, 5), SortOrder = Enum.SortOrder.LayoutOrder }, pg) pages[name] = pg local b = new("TextButton", { Size = UDim2.new(0, 56, 1, 0), BackgroundColor3 = C.row, Text = name, Font = Enum.Font.GothamMedium, TextSize = 11, TextColor3 = C.sub, BorderSizePixel = 0, }, tabRow) new("UICorner", { CornerRadius = UDim.new(0, 6) }, b) b.MouseButton1Click:Connect(function() showPage(name) end) tabBtns[name] = b return pg end local refreshers = {} local function rowFrame(page, h) local f = new("Frame", { Size = UDim2.new(1, -6, 0, h or 28), BackgroundColor3 = C.row, BorderSizePixel = 0 }, page) new("UICorner", { CornerRadius = UDim.new(0, 6) }, f) return f end local function addToggle(page, text, key) local b = new("TextButton", { Size = UDim2.new(1, -6, 0, 28), BackgroundColor3 = C.row, Text = "", AutoButtonColor = false, BorderSizePixel = 0 }, page) new("UICorner", { CornerRadius = UDim.new(0, 6) }, b) new("TextLabel", { BackgroundTransparency = 1, Size = UDim2.new(1, -60, 1, 0), Position = UDim2.new(0, 10, 0, 0), Text = text, Font = Enum.Font.GothamMedium, TextSize = 12, TextColor3 = C.txt, TextXAlignment = Enum.TextXAlignment.Left, }, b) local st = new("TextLabel", { BackgroundTransparency = 1, Size = UDim2.new(0, 44, 1, 0), Position = UDim2.new(1, -52, 0, 0), Text = "OFF", Font = Enum.Font.GothamBold, TextSize = 12, TextColor3 = C.off, TextXAlignment = Enum.TextXAlignment.Right, }, b) local function refresh() st.Text = S[key] and "ON" or "OFF" st.TextColor3 = S[key] and C.on or C.off end b.MouseButton1Click:Connect(function() S[key] = not S[key]; refresh() end) refreshers[key] = refresh refresh() end local function addButton(page, text, cb) local b = new("TextButton", { Size = UDim2.new(1, -6, 0, 26), BackgroundColor3 = C.row, Text = text, Font = Enum.Font.GothamMedium, TextSize = 12, TextColor3 = C.txt, BorderSizePixel = 0, }, page) new("UICorner", { CornerRadius = UDim.new(0, 6) }, b) b.MouseButton1Click:Connect(function() safe(cb) end) return b end local function addInfo(page, h) local l = new("TextLabel", { Size = UDim2.new(1, -6, 0, h or 60), BackgroundColor3 = C.row, BorderSizePixel = 0, Text = "...", Font = Enum.Font.Code, TextSize = 11, TextColor3 = C.sub, TextWrapped = true, TextXAlignment = Enum.TextXAlignment.Left, TextYAlignment = Enum.TextYAlignment.Top, }, page) new("UICorner", { CornerRadius = UDim.new(0, 6) }, l) new("UIPadding", { PaddingLeft = UDim.new(0, 8), PaddingTop = UDim.new(0, 6) }, l) return l end local function addSlider(page, text, key, mn, mx, decimals) local f = rowFrame(page, 42) local lbl = new("TextLabel", { BackgroundTransparency = 1, Size = UDim2.new(1, -20, 0, 18), Position = UDim2.new(0, 10, 0, 4), Text = "", Font = Enum.Font.GothamMedium, TextSize = 12, TextColor3 = C.txt, TextXAlignment = Enum.TextXAlignment.Left, }, f) local tr = new("Frame", { Size = UDim2.new(1, -20, 0, 6), Position = UDim2.new(0, 10, 0, 28), BackgroundColor3 = C.bg, BorderSizePixel = 0 }, f) new("UICorner", { CornerRadius = UDim.new(0, 3) }, tr) local fill = new("Frame", { Size = UDim2.new(0, 0, 1, 0), BackgroundColor3 = C.acc, BorderSizePixel = 0 }, tr) new("UICorner", { CornerRadius = UDim.new(0, 3) }, fill) local mult = 10 ^ (decimals or 0) local function paint() lbl.Text = text .. ": " .. tostring(S[key]) fill.Size = UDim2.new(math.clamp((S[key] - mn) / (mx - mn), 0, 1), 0, 1, 0) end local sliding = false local function setFromX(x) local rel = math.clamp((x - tr.AbsolutePosition.X) / math.max(1, tr.AbsoluteSize.X), 0, 1) S[key] = math.floor((mn + rel * (mx - mn)) * mult + 0.5) / mult paint() end track(f.InputBegan:Connect(function(i) if i.UserInputType == Enum.UserInputType.MouseButton1 or i.UserInputType == Enum.UserInputType.Touch then sliding = true; setFromX(i.Position.X) end end)) track(UIS.InputChanged:Connect(function(i) if sliding and (i.UserInputType == Enum.UserInputType.MouseMovement or i.UserInputType == Enum.UserInputType.Touch) then setFromX(i.Position.X) end end)) track(UIS.InputEnded:Connect(function(i) if i.UserInputType == Enum.UserInputType.MouseButton1 or i.UserInputType == Enum.UserInputType.Touch then sliding = false end end)) paint() end local function addTextbox(page, text, key, isNumber) local f = rowFrame(page, 28) new("TextLabel", { BackgroundTransparency = 1, Size = UDim2.new(0.5, 0, 1, 0), Position = UDim2.new(0, 10, 0, 0), Text = text, Font = Enum.Font.GothamMedium, TextSize = 12, TextColor3 = C.txt, TextXAlignment = Enum.TextXAlignment.Left, }, f) local box = new("TextBox", { Size = UDim2.new(0.42, 0, 0, 20), Position = UDim2.new(0.55, 0, 0.5, -10), BackgroundColor3 = C.bg, Text = tostring(S[key]), PlaceholderText = "...", Font = Enum.Font.Code, TextSize = 12, TextColor3 = C.txt, ClearTextOnFocus = false, BorderSizePixel = 0, }, f) new("UICorner", { CornerRadius = UDim.new(0, 4) }, box) box.FocusLost:Connect(function() if isNumber then local n = tonumber(box.Text) if n then S[key] = n else box.Text = tostring(S[key]) end else S[key] = box.Text end end) end -- Combat page local pCombat = addPage("Combat") local combatInfo addToggle(pCombat, "Silent Aim (Q)", "SA") addToggle(pCombat, "Aimbot (always on)", "Aimbot") addToggle(pCombat, "Sticky lock (keep target)", "StickyAim") addSlider(pCombat, "Aimbot smooth (per frame)", "AimSmooth", 0.05, 1, 2) addToggle(pCombat, "Team Check (enemies only)", "TeamCheck") addToggle(pCombat, "Wall Check", "WallCheck") addSlider(pCombat, "FOV", "FOV", 50, 900, 0) addToggle(pCombat, "Mouse.Hit hook (heavy, optional)", "MouseHook") addToggle(pCombat, "Learn shoot remotes", "Learn") addToggle(pCombat, "Log remotes (F9)", "Log") addButton(pCombat, "Rescan remotes", scanRemotes) addButton(pCombat, "Clear learned remotes", function() S.Shoot = setmetatable({}, { __mode = "k" }) for inst in pairs(S.remotes) do local name = string.lower(inst.Name) if matches(name, KEYWORDS) and not matches(name, DENY) then S.Shoot[inst] = true end end end) combatInfo = addInfo(pCombat, 64) -- Visuals page local pVis = addPage("Visuals") addToggle(pVis, "Chams (Highlight)", "ChamsOn") addToggle(pVis, "Tracer", "TracerOn") addToggle(pVis, "Skeleton", "SkelOn") addToggle(pVis, "Box (head to feet)", "BoxOn") local visInfo = addInfo(pVis, 44) visInfo.Text = "red = enemy, green = ally\n(ally = same team / spawn-near)" -- Player page local pPlayer = addPage("Player") addToggle(pPlayer, "Fly (G)", "Fly") addSlider(pPlayer, "Fly speed", "FlySpeed", 10, 300, 0) addToggle(pPlayer, "WalkSpeed", "Walk") addTextbox(pPlayer, "Speed value", "WalkValue", true) addToggle(pPlayer, "Auto Slide / Crouch", "AutoSlide") local playerInfo = addInfo(pPlayer, 54) -- Rage page local pRage = addPage("Rage") addToggle(pRage, "Rage Bot (X)", "Rage") addTextbox(pRage, "Void time (sec)", "VoidTime", true) addTextbox(pRage, "Attack time (sec)", "AttackTime", true) addSlider(pRage, "Stick distance (0 = glued)", "RageDist", 0, 6, 1) addToggle(pRage, "Anti Kill (mine / knife -> above)", "AntiKill") addSlider(pRage, "Anti Kill height", "AntiKillHeight", 5, 40, 0) addToggle(pRage, "Hide attack animation", "HideAnim") addToggle(pRage, "Hide viewmodel while attacking", "HideView") addToggle(pRage, "Spawn-distance teams", "SpawnTeams") addTextbox(pRage, "Ally count (0 = half)", "AllyCount", true) addButton(pRage, "Re-mark allies now", function() computeSpawnTeams(true) end) local rageInfo = addInfo(pRage, 88) -- Skins page local pSkin = addPage("Skins") local skinInfo = addInfo(pSkin, 44) addButton(pSkin, "Scan skin cases / wraps / charms", function() scanSkins() end) addButton(pSkin, "Category: skin (tap to cycle)", function() end).Name = "CatBtn" addTextbox(pSkin, "Weapon (name has)", "SkinWeapon", false) local filterText = "" local listFrame = new("ScrollingFrame", { Size = UDim2.new(1, -6, 0, 130), BackgroundColor3 = C.row, BorderSizePixel = 0, ScrollBarThickness = 3, CanvasSize = UDim2.new(0, 0, 0, 0), AutomaticCanvasSize = Enum.AutomaticSize.Y, }, pSkin) new("UICorner", { CornerRadius = UDim.new(0, 6) }, listFrame) new("UIListLayout", { Padding = UDim.new(0, 2) }, listFrame) local function refreshSkinList() for _, c in ipairs(listFrame:GetChildren()) do if c:IsA("TextButton") then c:Destroy() end end local shown = 0 for _, e in ipairs(S.catalog) do if e.kind == S.SkinKind and (filterText == "" or string.find(string.lower(e.label), filterText, 1, true)) then if shown < 60 then shown = shown + 1 local b = new("TextButton", { Size = UDim2.new(1, -6, 0, 20), BackgroundColor3 = (S.selSkin == e) and C.acc or C.bg, Text = " " .. e.label, Font = Enum.Font.Code, TextSize = 11, TextColor3 = C.txt, TextXAlignment = Enum.TextXAlignment.Left, BorderSizePixel = 0, }, listFrame) b.MouseButton1Click:Connect(function() S.selSkin = e; refreshSkinList() end) end end end end for _, b in ipairs(pSkin:GetChildren()) do if b.Name == "CatBtn" then b.MouseButton1Click:Connect(function() local order = { skin = "wrap", wrap = "charm", charm = "skin" } S.SkinKind = order[S.SkinKind] or "skin" b.Text = "Category: " .. S.SkinKind .. " (tap to cycle)" refreshSkinList() end) end end local fbox = new("TextBox", { Size = UDim2.new(1, -6, 0, 24), BackgroundColor3 = C.row, Text = "", PlaceholderText = "filter list...", Font = Enum.Font.Code, TextSize = 12, TextColor3 = C.txt, ClearTextOnFocus = false, BorderSizePixel = 0, }, pSkin) new("UICorner", { CornerRadius = UDim.new(0, 6) }, fbox) fbox.FocusLost:Connect(function() filterText = string.lower(fbox.Text); refreshSkinList() end) addButton(pSkin, "Refresh list", refreshSkinList) addButton(pSkin, "Apply to weapon (name box)", function() applySelected(false) end) addButton(pSkin, "Apply to ALL weapons", function() applySelected(true) end) addToggle(pSkin, "Auto apply (viewmodel/tools)", "AutoSkin") addButton(pSkin, "Unlock flags (local only)", function() skinInfo.Text = "unlock flags set: " .. unlockFlags() end) addButton(pSkin, "Dump skin data (F9 console)", dumpSkinData) showPage("Combat") -- keybinds track(UIS.InputBegan:Connect(function(i, gpe) if gpe then return end local function flip(key) S[key] = not S[key]; if refreshers[key] then refreshers[key]() end end if i.KeyCode == Enum.KeyCode.Q then flip("SA") elseif i.KeyCode == Enum.KeyCode.G then flip("Fly") elseif i.KeyCode == Enum.KeyCode.X then flip("Rage") elseif i.KeyCode == Enum.KeyCode.RightShift then win.Visible = not win.Visible end end)) -- status updater local acc = 0 track(RunService.RenderStepped:Connect(function(dt) acc = acc + dt if acc < 0.25 then return end acc = 0 combatInfo.Text = ("hook: %s\nremotes: %d | shoot: %d\ntarget: %s"):format( S.hookMode, count(S.remotes), count(S.Shoot), S.target and S.target.player.Name or "none") playerInfo.Text = ("slide/crouch remotes: %d\nlearned args: %d\n(do a manual slide once to learn args)"):format( count(S.slide), count(S.lastArgs)) rageInfo.Text = ("phase: %s (%.1fs)\ntarget: %s\nallies: %s | enemies: %s%s"):format( S.rageActive and S.ragePhase or "idle", S.ragePhaseT or 0, S.rageTarget and S.rageTarget.Name or "none", tostring(S.allyCount or "?"), tostring(S.enemyCount or "?"), S.rageDanger and ("\nANTI-KILL: " .. S.rageDanger) or "") skinInfo.Text = ("catalog: %d | selected: %s"):format(#S.catalog, S.selSkin and S.selSkin.label or "none") end)) -- background-remote counter reset (old loops exit on re-execute) S.token = S.token + 1 local myToken = S.token task.spawn(function() while S.token == myToken do task.wait(5) S.bg = setmetatable({}, { __mode = "k" }) end end) installHooks() task.spawn(scanRemotes) task.spawn(function() scanSkins(); refreshSkinList() end) print("[ABLE.lol] loaded | hook = " .. S.hookMode .. " | Q silent E aimbot G fly X rage RShift GUI")