M
Description
this Users of this script can easily defeat opponents with a rage bot and hit enemies with every bullet using silent aim, no matter how bad their aim is. Furthermore, it is a script that possesses all the advantages, being free, keyless, and having incredibly fast loading.
GAMERIVALS [❄️FREEZE RAY❄️]
UPDATEDOct 11, 2026
ACCESSKeyless
PLATFORMDesktop
Script source Luau
-- [[ BloxScripts Risk Notice ]]
-- This script has not been verified by BloxScripts.fun. 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 BloxScripts 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")Review the source before using it. Executions count successful copies, capped at 10 per user and network per script in 24 hours.
Community discussion
0Start the conversation.


Your community, in one place