
Key RequiredUniversal

local Players = game:GetService("Players")
local RunService = game:GetService("RunService")
local UIS = game:GetService("UserInputService")
local Workspace = game:GetService("Workspace")
local CS = game:GetService("CollectionService")
local TweenService = game:GetService("TweenService")
local LP = Players.LocalPlayer
local CONFIG = {
enabled = true,
preset = "UNSTOPPABLE",
strength = 1,
legitMask = 0.45,
watchedPause = true,
microGain = 0.5,
coyote = true,
coyoteTime = 0.38,
jumpBuffer = true,
bufferTime = 0.22,
perfectTiming = true,
runUp = true,
maxRunBoost = 1.22,
edgeProbe = 6,
jumpCapMult = 1,
autoBhop = false,
airControl = true,
airControlGain = 1,
wallhop = true,
autoWallhop = true,
wallhopGain = 9,
wallhopCooldown = 0.3,
wallhopRange = 2.4,
wallhopVetoS = true,
iceGrip = true,
conveyorCancel = true,
platformStick = true,
platformLead = true,
trussAssist = true,
trussBoost = 1.5,
stumbleRecovery = true,
lipHop = true,
comboGrace = true,
comboWindow = 0.4,
lethalSave = false,
fallGuard = true,
hazardSensor = true,
sensorRange = 30,
windCancel = true,
gravityMult = 1,
speedMult = 1,
autopilot = false,
noclip = false,
maxFlight = 0.9,
hud = true,
persist = true,
guiKey = "RightShift",
quickKey = "RightControl",
powerKey = "LeftControl",
autoEdgeHop = true,
hopDebounce = 0.18,
planAim = true,
aimGain = 0.45,
aimHold = 0.6,
wallhopTargetNext = true,
wallhopTopAim = true,
wallhopHeights = 9,
hazardSidestep = true,
sidestepRange = 6,
sidestepPower = 7,
sidestepCooldown = 0.5,
hazardTiming = true,
}
local PRESETS = {
UNSTOPPABLE = {strength=1, legitMask=0.45, microGain=0.5, coyote=true, coyoteTime=0.38, jumpBuffer=true, bufferTime=0.22, perfectTiming=true, runUp=true, maxRunBoost=1.22, edgeProbe=6, autoBhop=false, airControl=true, airControlGain=1, wallhop=true, autoWallhop=true, wallhopGain=9, wallhopCooldown=0.3, wallhopRange=2.4, wallhopVetoS=true, iceGrip=true, conveyorCancel=true, platformStick=true, platformLead=true, trussAssist=true, trussBoost=1.5, stumbleRecovery=true, lipHop=true, autoEdgeHop=true, planAim=true, aimGain=0.55, aimHold=0.65, hopDebounce=0.16, wallhopTargetNext=true, wallhopTopAim=true, wallhopHeights=12, hazardSidestep=true, sidestepRange=7, sidestepPower=8, comboGrace=true, comboWindow=0.4, lethalSave=false, fallGuard=true, hazardSensor=true, windCancel=true, gravityMult=1, speedMult=1, autopilot=false, noclip=false},
ALMOST_HUMAN = {strength=0.85, legitMask=0.85, microGain=0.32, coyote=true, coyoteTime=0.28, jumpBuffer=true, bufferTime=0.18, perfectTiming=true, runUp=true, maxRunBoost=1.1, edgeProbe=5, autoBhop=false, airControl=true, airControlGain=0.8, wallhop=true, autoWallhop=true, wallhopGain=7, wallhopCooldown=0.32, wallhopRange=2.2, wallhopVetoS=true, iceGrip=true, conveyorCancel=true, platformStick=true, platformLead=true, trussAssist=true, trussBoost=1.3, stumbleRecovery=true, lipHop=true, autoEdgeHop=true, planAim=true, aimGain=0.4, aimHold=0.5, hopDebounce=0.22, wallhopTargetNext=true, wallhopTopAim=true, wallhopHeights=9, hazardSidestep=true, sidestepRange=6, sidestepPower=6.5, comboGrace=true, comboWindow=0.3, lethalSave=false, fallGuard=true, hazardSensor=false, windCancel=true, gravityMult=1, speedMult=1, autopilot=false, noclip=false},
SUBTLE = {strength=0.6, legitMask=1, microGain=0.18, coyote=true, coyoteTime=0.22, jumpBuffer=true, bufferTime=0.15, perfectTiming=true, runUp=false, maxRunBoost=1.05, edgeProbe=4, autoBhop=false, airControl=true, airControlGain=0.6, wallhop=false, autoWallhop=false, wallhopGain=6, wallhopCooldown=0.34, wallhopRange=2, wallhopVetoS=true, iceGrip=true, conveyorCancel=true, platformStick=true, platformLead=true, trussAssist=true, trussBoost=1.2, stumbleRecovery=true, lipHop=false, autoEdgeHop=false, planAim=true, aimGain=0.25, aimHold=0.4, hopDebounce=0.3, wallhopTargetNext=false, wallhopTopAim=false, wallhopHeights=6, hazardSidestep=false, sidestepRange=5, sidestepPower=5, comboGrace=true, comboWindow=0.25, lethalSave=false, fallGuard=true, hazardSensor=false, windCancel=true, gravityMult=1, speedMult=1, autopilot=false, noclip=false},
SPEEDRUNNER = {strength=0.95, legitMask=0.55, microGain=0.45, coyote=true, coyoteTime=0.34, jumpBuffer=true, bufferTime=0.22, perfectTiming=true, runUp=true, maxRunBoost=1.3, edgeProbe=6, autoBhop=false, airControl=true, airControlGain=1.1, wallhop=true, autoWallhop=true, wallhopGain=11, wallhopCooldown=0.22, wallhopRange=2.6, wallhopVetoS=true, iceGrip=true, conveyorCancel=true, platformStick=true, platformLead=true, trussAssist=true, trussBoost=2, stumbleRecovery=true, lipHop=true, autoEdgeHop=true, planAim=true, aimGain=0.5, aimHold=0.6, hopDebounce=0.12, wallhopTargetNext=true, wallhopTopAim=true, wallhopHeights=12, hazardSidestep=true, sidestepRange=7, sidestepPower=7, autoBhop=true, comboGrace=true, comboWindow=0.4, lethalSave=false, fallGuard=true, hazardSensor=true, windCancel=true, gravityMult=1, speedMult=1.08, autopilot=false, noclip=false},
GHOST = {strength=1, legitMask=0.1, microGain=0.9, coyote=true, coyoteTime=0.45, jumpBuffer=true, bufferTime=0.3, perfectTiming=true, runUp=true, maxRunBoost=1.5, edgeProbe=8, autoBhop=false, airControl=true, airControlGain=1.8, wallhop=true, autoWallhop=true, wallhopGain=14, wallhopCooldown=0.18, wallhopRange=3, wallhopVetoS=true, iceGrip=true, conveyorCancel=true, platformStick=true, platformLead=true, trussAssist=true, trussBoost=2.5, stumbleRecovery=true, lipHop=true, autoEdgeHop=true, planAim=true, aimGain=0.7, aimHold=0.8, hopDebounce=0.1, wallhopTargetNext=true, wallhopTopAim=true, wallhopHeights=14, hazardSidestep=true, sidestepRange=9, sidestepPower=9, comboGrace=true, comboWindow=0.8, lethalSave=true, fallGuard=true, hazardSensor=true, windCancel=true, gravityMult=0.85, speedMult=1.15, autopilot=true, noclip=true},
}
local TOGGLES = {
{key="coyote", group="JUMP", name="Coyote Window"},
{key="jumpBuffer", group="JUMP", name="Jump Buffering"},
{key="perfectTiming", group="JUMP", name="Perfect Edge Timing"},
{key="runUp", group="JUMP", name="Run Up Boost On Long Gaps"},
{key="autoEdgeHop", group="JUMP", name="Auto Edge Hop (does the jump)"},
{key="airControl", group="AIR", name="Air Control"},
{key="planAim", group="AIR", name="In Flight Landing Aim"},
{key="wallhop", group="AIR", name="Wallhop Assist"},
{key="autoWallhop", group="AIR", name="Auto Wallhop On Contact"},
{key="wallhopTargetNext", group="AIR", name="Wallhop Aims At Opposite Wall"},
{key="wallhopTopAim", group="AIR", name="Wallhop Climbs Onto Ledges"},
{key="iceGrip", group="GROUND", name="Ice And Slip Grip"},
{key="conveyorCancel", group="GROUND", name="Conveyor Cancel"},
{key="platformStick", group="GROUND", name="Platform Stick When Idle"},
{key="platformLead", group="GROUND", name="Platform Lead Prediction"},
{key="trussAssist", group="GROUND", name="Truss Climb Assist"},
{key="stumbleRecovery", group="GROUND", name="Stumble Recovery"},
{key="lipHop", group="GROUND", name="Lip Hop (auto jump over lips)"},
{key="comboGrace", group="SAFETY", name="Combo Damage Grace"},
{key="lethalSave", group="SAFETY", name="Lethal Save (visible)"},
{key="fallGuard", group="SAFETY", name="Fall Damage Guard"},
{key="hazardSidestep", group="SAFETY", name="Hazard Sidestep (grounded)"},
{key="hazardSensor", group="INFO", name="Hazard Sensor Highlights"},
{key="hazardTiming", group="INFO", name="Hazard Impact Timer HUD"},
{key="windCancel", group="INFO", name="Wind Cancel"},
{key="hud", group="INFO", name="Show HUD"},
{key="autoBhop", group="ADVANCED", name="Bunny Hop (visible)"},
{key="autopilot", group="ADVANCED", name="Autopilot (visible)"},
{key="noclip", group="ADVANCED", name="Ghost Noclip (visible)"},
}
local SLIDERS = {
{key="maxRunBoost", min=1.05, max=1.5, step=0.01, label="Max Run Up Boost", group="TIMING"},
{key="edgeProbe", min=3, max=9, step=0.5, label="Edge Probe Distance", group="TIMING"},
{key="coyoteTime", min=0, max=0.6, step=0.02, label="Coyote Window", group="TIMING"},
{key="bufferTime", min=0, max=0.5, step=0.02, label="Jump Buffer Time", group="TIMING"},
{key="jumpCapMult", min=1, max=1.15, step=0.01, label="Jump Power Ceiling", group="TIMING"},
{key="maxFlight", min=0.4, max=1.2, step=0.05, label="Jump Solver Time Cap", group="TIMING"},
{key="aimGain", min=0.1, max=1, step=0.05, label="Landing Aim Strength", group="TIMING"},
{key="aimHold", min=0.2, max=1.2, step=0.05, label="Landing Aim Window", group="TIMING"},
{key="hopDebounce", min=0.05, max=0.5, step=0.01, label="Auto Hop Reaction Delay", group="TIMING"},
{key="wallhopGain", min=4, max=16, step=0.5, label="Wallhop Push Off", group="WALLHOP"},
{key="wallhopCooldown", min=0.15, max=0.8, step=0.01, label="Wallhop Cooldown", group="WALLHOP"},
{key="wallhopRange", min=1.6, max=3.5, step=0.1, label="Wall Detector Range", group="WALLHOP"},
{key="wallhopHeights", min=4, max=14, step=1, label="Ledge Search Height", group="WALLHOP"},
{key="sidestepRange", min=3, max=12, step=1, label="Hazard Sidestep Range", group="SAFETY"},
{key="sidestepPower", min=3, max=14, step=0.5, label="Hazard Sidestep Power", group="SAFETY"},
{key="sidestepCooldown", min=0.2, max=1.2, step=0.05, label="Hazard Sidestep Cooldown", group="SAFETY"},
{key="airControlGain", min=0.5, max=2.5, step=0.05, label="Air Control Gain", group="TUNING"},
{key="microGain", min=0, max=1, step=0.05, label="Micro Correction Gain", group="TUNING"},
{key="trussBoost", min=1, max=2.5, step=0.1, label="Truss Climb Speed", group="TUNING"},
{key="comboWindow", min=0.2, max=1, step=0.05, label="Combo Grace Window", group="SAFETY"},
{key="speedMult", min=1, max=1.4, step=0.02, label="Speed Multiplier (visible)", group="ADVANCED"},
{key="gravityMult", min=0.4, max=1.2, step=0.05, label="Gravity Multiplier (visible)", group="ADVANCED"},
{key="sensorRange", min=12, max=60, step=2, label="Sensor Range", group="ADVANCED"},
{key="legitMask", min=0, max=1, step=0.05, label="Legit Look Smoothing", group="STEALTH"},
{key="strength", min=0.3, max=1, step=0.05, label="Assistance Strength", group="STEALTH"},
}
local function normalizeSpecs()
local i
for i = #TOGGLES, 1, -1 do
local entry = TOGGLES[i]
if type(entry) ~= "table" then
table.remove(TOGGLES, i)
else
if type(entry.key) ~= "string" or entry.key == "" then
entry.key = "option" .. i
end
if type(entry.name) ~= "string" then
entry.name = entry.key
end
if type(entry.group) ~= "string" then
entry.group = "MISC"
end
if CONFIG[entry.key] == nil then
CONFIG[entry.key] = false
end
end
end
for i = #SLIDERS, 1, -1 do
local entry = SLIDERS[i]
if type(entry) ~= "table" then
table.remove(SLIDERS, i)
else
if type(entry.key) ~= "string" or entry.key == "" then
entry.key = "value" .. i
end
if type(entry.min) ~= "number" then
entry.min = 0
end
if type(entry.max) ~= "number" or entry.max <= entry.min then
entry.max = entry.min + 1
end
if type(entry.step) ~= "number" or entry.step <= 0 then
entry.step = 0.05
end
if type(entry.label) ~= "string" then
entry.label = entry.key
end
if type(entry.group) ~= "string" then
entry.group = "TUNING"
end
if type(CONFIG[entry.key]) ~= "number" then
CONFIG[entry.key] = entry.min
end
end
end
end
normalizeSpecs()
local Theme = {
bg = Color3.fromRGB(12, 13, 16),
panel = Color3.fromRGB(18, 20, 24),
row = Color3.fromRGB(24, 26, 32),
rowAlt = Color3.fromRGB(28, 31, 38),
accent = Color3.fromRGB(94, 214, 255),
good = Color3.fromRGB(104, 226, 154),
bad = Color3.fromRGB(226, 104, 104),
warn = Color3.fromRGB(240, 196, 90),
text = Color3.fromRGB(232, 236, 244),
dim = Color3.fromRGB(140, 148, 164),
track = Color3.fromRGB(44, 48, 58),
}
local Stats = {jumps=0, grips=0, timing=0, wallhops=0, graces=0, hops=0, lipHops=0, aims=0, dodges=0, plats=0, frames=0}
local Hazard = {map = setmetatable({}, {__mode = "k"}), list = {}, refresh = 0}
local Sensor = {hls = {}, at = 0, count = 0}
local Ctl = {
grounded = false, groundedAt = 0, leftAt = 0, jumpAt = -99, buffered = 0,
lastSpeed = 0, watched = false, clipState = nil, plan = nil, planUntil = 0,
wallReady = false, wallCd = 0, hopCd = 0, sensorAt = 0, conveyorCd = 0,
stuckAt = 0, lastPos = nil, lastJumpT = 0, touchLock = nil, lastHud = 0,
topCd = 0, gripCd = 0, graceCd = 0,
aimTarget = nil, aimPart = nil, aimSet = 0, aimUntil = 0,
sidestepCd = 0, hazardDist = 0, hazardEta = 0, blockedAt = 0, flash = "", flashAt = 0,
}
local function ensureDefaults(target, defaults)
for key, value in pairs(defaults) do
if target[key] == nil then
target[key] = value
end
end
for key, value in pairs(target) do
if value == nil then
target[key] = defaults[key]
end
end
end
ensureDefaults(CONFIG, {
enabled = true, strength = 1, legitMask = 0.45, microGain = 0.5, coyote = true, coyoteTime = 0.38,
jumpBuffer = true, bufferTime = 0.22, perfectTiming = true, runUp = true, maxRunBoost = 1.22,
edgeProbe = 6, jumpCapMult = 1, autoBhop = false, airControl = true, airControlGain = 1,
planAim = true, wallhop = true, autoWallhop = true, wallhopGain = 9, wallhopCooldown = 0.3,
wallhopRange = 2.4, wallhopVetoS = true, wallhopTargetNext = true, wallhopTopAim = true, wallhopHeights = 9,
iceGrip = true, conveyorCancel = true, platformStick = true, platformLead = true, trussAssist = true,
trussBoost = 1.5, stumbleRecovery = true, lipHop = true, autoEdgeHop = true, hopDebounce = 0.18,
aimGain = 0.45, aimHold = 0.6, comboGrace = true, comboWindow = 0.4, lethalSave = false,
fallGuard = true, hazardSensor = true, hazardTiming = true, hazardSidestep = true, sidestepRange = 6,
sidestepPower = 7, sidestepCooldown = 0.5, sensorRange = 30, windCancel = true, gravityMult = 1,
speedMult = 1, autopilot = false, noclip = false, maxFlight = 0.9, hud = true, persist = true,
})
ensureDefaults(Ctl, {
grounded = false, groundedAt = 0, leftAt = 0, jumpAt = -99, buffered = 0, lastSpeed = 0,
watched = false, planUntil = 0, wallReady = false, wallCd = 0, hopCd = 0, sensorAt = 0,
conveyorCd = 0, stuckAt = 0, lastJumpT = 0, lastHud = 0, topCd = 0, gripCd = 0, graceCd = 0,
aimSet = 0, aimUntil = 0, sidestepCd = 0, hazardDist = 0, hazardEta = 0, blockedAt = 0,
flash = "", flashAt = 0, clipState = nil, plan = nil, aimTarget = nil, aimPart = nil, touchLock = nil,
})
ensureDefaults(Stats, {jumps = 0, grips = 0, timing = 0, wallhops = 0, graces = 0, hops = 0, lipHops = 0, aims = 0, dodges = 0, plats = 0, frames = 0})
ensureDefaults(Sensor, {hls = {}, at = 0, count = 0})
ensureDefaults(Hazard, {list = {}, refresh = 0})
local function clamp(v, a, b)
a = tonumber(a) or 0
b = tonumber(b) or 1
if b <= a then
b = a + 1
end
v = tonumber(v)
if v == nil then
return a
end
if v < a then
return a
elseif v > b then
return b
end
return v
end
local function lerp(a, b, t)
return a + (b - a) * t
end
local function flat(v)
return Vector3.new(v.X, 0, v.Z)
end
local function rayParams()
local p = RaycastParams.new()
p.FilterType = Enum.RaycastFilterType.Exclude
p.FilterDescendantsInstances = char and {char} or {}
p.IgnoreWater = false
return p
end
local function cast(origin, dir)
return Workspace:Raycast(origin, dir, rayParams())
end
local function floorProbe(position)
local origin = position + Vector3.new(0, 2.5, 0)
local hit = cast(origin, Vector3.new(0, -7, 0))
if hit and hit.Normal.Y > 0.35 then return hit end
return nil
end
local function isHazard(part)
if not part then return false end
local cached = Hazard.map[part]
if cached ~= nil then
return cached
end
if CS:HasTag(part, "Safe") then
Hazard.map[part] = false
return false
end
local flag = false
local name = string.lower(part.Name)
local words = {"kill", "spike", "lava", "hurt", "damage", "death", "saw", "trap", "acid", "fire", "laser", "lazer", "void", "poison", "zap", "instakill", "deadly"}
for i = 1, #words do
if string.find(name, words[i], 1, true) then
flag = true
break
end
end
if not flag then
local tags = {"Kill", "Damage", "Hazard", "Lava", "Spike", "Trap", "Deadly", "KillBrick"}
for i = 1, #tags do
if CS:HasTag(part, tags[i]) then
flag = true
break
end
end
end
if not flag and part:GetAttribute("Damage") then
flag = true
end
Hazard.map[part] = flag
return flag
end
local function hazardNear(position, radius)
local parts = Workspace:GetPartBoundsInRadius(position, radius)
for i = 1, #parts do
if isHazard(parts[i]) then return true end
end
return false
end
local function refreshHazards()
if T < Hazard.refresh then return end
Hazard.refresh = T + 1.5
Hazard.list = {}
if not root then return end
local parts = Workspace:GetPartBoundsInRadius(root.Position, 90)
for i = 1, #parts do
local part = parts[i]
if isHazard(part) then table.insert(Hazard.list, part) end
end
end
local function charParts()
local list = {}
if not char then return list end
for _, part in ipairs(char:GetDescendants()) do
if part:IsA("BasePart") then table.insert(list, part) end
end
return list
end
local function applyClip(state)
if Ctl.clipState == state then return end
Ctl.clipState = state
for _, part in ipairs(charParts()) do
pcall(function() part.CanCollide = not state end)
end
end
local function shield(duration)
Ctl.touchLock = math.max(Ctl.touchLock or 0, T + duration)
for _, part in ipairs(charParts()) do
pcall(function() part.CanTouch = false end)
end
end
local function unshield()
Ctl.touchLock = nil
for _, part in ipairs(charParts()) do
pcall(function() part.CanTouch = true end)
end
end
local function wantsJump()
return Ctl.jumpAt > T - 0.001
end
local function inputDir()
local cam = Workspace.CurrentCamera
if not cam then return Vector3.new() end
local look = flat(cam.CFrame.LookVector)
local right = flat(cam.CFrame.RightVector)
if look.Magnitude < 0.01 then look = Vector3.new(0, 0, -1) else look = look.Unit end
if right.Magnitude < 0.01 then right = Vector3.new(1, 0, 0) else right = right.Unit end
local dir = Vector3.new()
if UIS:IsKeyDown(Enum.KeyCode.W) then dir = dir + look end
if UIS:IsKeyDown(Enum.KeyCode.S) then dir = dir - look end
if UIS:IsKeyDown(Enum.KeyCode.D) then dir = dir + right end
if UIS:IsKeyDown(Enum.KeyCode.A) then dir = dir - right end
if UIS:IsKeyDown(Enum.KeyCode.Up) then dir = dir + look end
if UIS:IsKeyDown(Enum.KeyCode.Down) then dir = dir - look end
if dir.Magnitude < 0.05 then return Vector3.new() end
return dir.Unit
end
local function walkSpeed()
return hum and hum.WalkSpeed or 16
end
local function jumpVelocity()
if not hum then return 50 end
local g = Workspace.Gravity * CONFIG.gravityMult
local base = hum.UseJumpPower and hum.JumpPower or math.sqrt(math.max(2 * g * hum.JumpHeight, 1))
if not base or base <= 0 then base = 50 end
return base * CONFIG.jumpCapMult
end
local function landingSearch(dirHorizontal, maxDistance)
if not root or dirHorizontal.Magnitude < 0.1 then return nil end
local best = nil
local step = 2.5
local origin = root.Position
local heading = dirHorizontal.Unit
local dist = 3
while dist <= maxDistance do
local probe = origin + heading * dist
local hit = cast(probe + Vector3.new(0, 7, 0), Vector3.new(0, -70, 0))
if hit and hit.Normal.Y > 0.5 and not isHazard(hit.Instance) then
local top = hit.Position
if top.Y < origin.Y + jumpVelocity() * 0.75 and top.Y > origin.Y - 60 then
local solidCount = 0
local offsets = {Vector3.new(1.6, 0, 0), Vector3.new(-1.6, 0, 0), Vector3.new(0, 0, 1.6), Vector3.new(0, 0, -1.6)}
for i = 1, 4 do
local check = cast(top + offsets[i] + Vector3.new(0, 5, 0), Vector3.new(0, -12, 0))
if check and not isHazard(check.Instance) then solidCount = solidCount + 1 end
end
if solidCount >= 3 then
if not best or dist < best.dist then
best = {pos = top, part = hit.Instance, dist = dist, solid = solidCount}
end
end
end
end
dist = dist + step
end
return best
end
local function micro(delta)
if not root or delta.Magnitude < 0.01 then return end
local scale = CONFIG.microGain * CONFIG.strength
if Ctl.watched and CONFIG.watchedPause then scale = scale * (1 - CONFIG.legitMask * 0.5) end
root.AssemblyLinearVelocity = root.AssemblyLinearVelocity + delta * scale
end
local function sensorStep()
if not CONFIG.hazardSensor then
if Sensor.count > 0 then
for part, mark in pairs(Sensor.hls) do
pcall(function() mark:Destroy() end)
end
Sensor.hls = {}
Sensor.count = 0
end
return
end
if not root then return end
refreshHazards()
local keep = {}
local count = 0
for i = 1, #Hazard.list do
local part = Hazard.list[i]
if part.Parent and (part.Position - root.Position).Magnitude <= CONFIG.sensorRange then
keep[part] = true
count = count + 1
local mark = Sensor.hls[part]
if not mark or not mark.Parent then
mark = Instance.new("Highlight")
mark.Name = "OA_Sensor"
mark.Adornee = part
mark.FillColor = Color3.fromRGB(255, 96, 96)
mark.FillTransparency = 0.92
mark.OutlineColor = Color3.fromRGB(255, 76, 76)
mark.OutlineTransparency = 0.3
mark.DepthMode = Enum.HighlightDepthMode.Occluded
mark.Parent = Workspace
Sensor.hls[part] = mark
end
end
end
for part, mark in pairs(Sensor.hls) do
if not keep[part] or not part.Parent then
pcall(function() mark:Destroy() end)
Sensor.hls[part] = nil
end
end
Sensor.count = count
end
local function lipHop()
if not CONFIG.lipHop or not Ctl.grounded or T < Ctl.hopCd then
return
end
local dir = flat(root.AssemblyLinearVelocity)
if dir.Magnitude < 1.5 then
dir = inputDir()
end
if dir.Magnitude < 0.1 then
return
end
local ahead = dir.Unit * 1.5
local shin = cast(root.Position + Vector3.new(0, 0.3, 0), ahead)
if not shin then
return
end
if cast(root.Position + Vector3.new(0, 2.2, 0), ahead) then
return
end
local top = cast(root.Position + ahead + Vector3.new(0, 3.5, 0), Vector3.new(0, -6, 0))
if not top or top.Normal.Y < 0.4 or isHazard(top.Instance) then
return
end
local lip = top.Position.Y - root.Position.Y
if lip < 0.3 or lip > 1.8 then
return
end
Ctl.hopCd = T + 0.35
pcall(function()
hum.Jump = true
hum:ChangeState(Enum.HumanoidStateType.Jumping)
end)
Stats.lipHops = Stats.lipHops + 1
end
local WALL_DIRS = {
Vector3.new(1, 0, 0), Vector3.new(-1, 0, 0), Vector3.new(0, 0, 1), Vector3.new(0, 0, -1),
Vector3.new(0.707, 0, 0.707), Vector3.new(-0.707, 0, 0.707), Vector3.new(0.707, 0, -0.707), Vector3.new(-0.707, 0, -0.707)
}
local function wallStep()
Ctl.wallReady = false
if not CONFIG.wallhop or Ctl.grounded then return end
local origin = root.Position
local best, bestDist = nil, math.huge
for i = 1, #WALL_DIRS do
local hit = cast(origin, WALL_DIRS[i] * CONFIG.wallhopRange)
if hit and math.abs(hit.Normal.Y) < 0.35 and hit.Distance < bestDist and not isHazard(hit.Instance) then
bestDist = hit.Distance
best = hit
end
end
if not best then return end
Ctl.wallReady = true
if not CONFIG.wallhop or T < Ctl.wallCd then return end
local velocity = root.AssemblyLinearVelocity
local dir = inputDir()
local moving = dir.Magnitude > 0.05
local manual = wantsJump()
local automatic = false
if CONFIG.autoWallhop and moving then
local intoWall = dir:Dot(flat(best.Normal)) < -0.15
automatic = intoWall and velocity.Y < 8
if CONFIG.wallhopVetoS and UIS:IsKeyDown(Enum.KeyCode.S) and not manual then
automatic = false
end
end
if not manual and not automatic then return end
if not moving then
dir = flat(velocity)
if dir.Magnitude < 0.5 then
local cam = Workspace.CurrentCamera
dir = cam and flat(cam.CFrame.LookVector) or Vector3.new(0, 0, -1)
end
end
local normal = flat(best.Normal)
if normal.Magnitude < 0.05 then
normal = Vector3.new(0, 0, -1)
end
normal = normal.Unit
local upward = math.min(jumpVelocity() * 0.95, 54)
local outDir = -normal
if CONFIG.wallhopTopAim and T > Ctl.topCd then
local ledge = nil
local height = 4
while height <= CONFIG.wallhopHeights do
local reach = 2
while reach <= 5.5 do
local origin = best.Position + outDir * (-reach) + Vector3.new(0, height, 0)
local hit = cast(origin + Vector3.new(0, 2, 0), Vector3.new(0, -9, 0))
if hit and hit.Normal.Y > 0.5 and not isHazard(hit.Instance) and hit.Position.Y > root.Position.Y + 2 then
if not ledge or hit.Position.Y < ledge.pos.Y then
ledge = {pos = hit.Position, part = hit.Instance}
end
end
reach = reach + 1.5
end
height = height + 2.5
end
if ledge then
local delta = ledge.pos - root.Position
local dH = math.sqrt(delta.X * delta.X + delta.Z * delta.Z)
local g = Workspace.Gravity * CONFIG.gravityMult
local t = clamp(dH / math.max(walkSpeed(), 8), 0.25, CONFIG.maxFlight)
local vy = (delta.Y + 0.5 * g * t * t) / t
if vy > 4 and vy <= jumpVelocity() * 1.02 then
local dirH = flat(delta)
if dirH.Magnitude < 0.1 then
dirH = outDir
end
root.AssemblyLinearVelocity = dirH.Unit * (dH / t) + Vector3.new(0, vy, 0)
Ctl.aimTarget = ledge.pos
Ctl.aimPart = ledge.part
Ctl.aimSet = T
Ctl.aimUntil = T + clamp(t + 0.15, 0.3, CONFIG.aimHold)
Ctl.wallCd = T + CONFIG.wallhopCooldown
Ctl.topCd = T + 0.8
Ctl.jumpAt = -99
Stats.wallhops = Stats.wallhops + 1
pcall(function() hum:ChangeState(Enum.HumanoidStateType.Jumping) end)
return
end
end
end
local push = walkSpeed() * CONFIG.speedMult * 0.7 + 3
local tangent = dir - normal * dir:Dot(normal)
if tangent.Magnitude < 0.1 then
tangent = outDir
end
if tangent.Magnitude < 0.1 then
tangent = Vector3.new(-normal.Z, 0, normal.X)
end
tangent = tangent.Unit
if CONFIG.wallhopTargetNext then
local opposite = cast(root.Position, outDir * (CONFIG.wallhopRange * 3.2))
if opposite and math.abs(opposite.Normal.Y) < 0.35 and not isHazard(opposite.Instance) then
local span = opposite.Distance + 1.5
local spanTime = (2 * upward) / math.max(Workspace.Gravity * CONFIG.gravityMult, 1)
local need = span / math.max(spanTime, 0.25)
local cap = walkSpeed() * CONFIG.maxRunBoost * 1.4
if need <= cap then
tangent = outDir
push = math.max(push, math.min(need, cap))
end
end
end
root.AssemblyLinearVelocity = tangent * push + normal * CONFIG.wallhopGain + Vector3.new(0, upward, 0)
Ctl.wallCd = T + CONFIG.wallhopCooldown
Ctl.jumpAt = -99
Stats.wallhops = Stats.wallhops + 1
pcall(function() hum:ChangeState(Enum.HumanoidStateType.Jumping) end)
end
local function landingCone(dir, spread, step, maxDistance)
if not root or dir.Magnitude < 0.05 then return nil end
local base = dir.Unit
local best, bestScore = nil, -math.huge
local angle = -spread
while angle <= spread + 0.001 do
local rad = math.rad(angle)
local c, s = math.cos(rad), math.sin(rad)
local probe = Vector3.new(base.X * c - base.Z * s, 0, base.X * s + base.Z * c).Unit
local landing = landingSearch(probe, maxDistance)
if landing and landing.dist > 2 then
local score = landing.solid * 9 - landing.dist * 0.3 - math.abs(angle) * 0.55
if score > bestScore then
bestScore = score
landing.dir = probe
best = landing
end
end
angle = angle + step
end
return best
end
local function planJump()
if not (CONFIG.perfectTiming or CONFIG.runUp) or not Ctl.grounded then return nil end
local dir = inputDir()
if dir.Magnitude < 0.1 then
dir = flat(root.AssemblyLinearVelocity)
if dir.Magnitude < 0.5 then return nil end
end
dir = dir.Unit
local edge = nil
local probe = 1
while probe <= CONFIG.edgeProbe do
if not floorProbe(root.Position + dir * probe) then
edge = probe
break
end
probe = probe + 0.5
end
if not edge then return nil end
local landing = landingSearch(dir, math.max(walkSpeed() * CONFIG.maxFlight * 2, 26))
if not landing then
landing = landingCone(dir, 30, 10, math.max(walkSpeed() * CONFIG.maxFlight * 2.2, 30))
end
if not landing then return nil end
local gap = landing.dist - edge
if gap < 1.5 then return nil end
local available = math.max(flat(root.AssemblyLinearVelocity).Magnitude, walkSpeed() * 0.9)
local g = Workspace.Gravity * CONFIG.gravityMult
local t = clamp(math.sqrt(math.max(2 * math.max(landing.pos.Y - root.Position.Y, 2), 0) / g), 0.3, CONFIG.maxFlight)
local needed = gap / math.max(t, 0.25)
if needed <= available * 1.02 then return nil end
local cap = walkSpeed() * CONFIG.maxRunBoost
if needed > cap * 1.35 then
Ctl.blockedAt = T + 1.5
return nil
end
if needed > cap then
if not CONFIG.runUp then return nil end
needed = cap
end
return {dir = landing.dir or dir, landing = landing, edge = edge, needed = needed}
end
local function aimStep(dt)
if not CONFIG.planAim then
return
end
if not Ctl.aimTarget or T > Ctl.aimUntil or Ctl.grounded then
if Ctl.grounded then
Ctl.aimTarget = nil
Ctl.aimPart = nil
end
return
end
local vel = root.AssemblyLinearVelocity
local g = Workspace.Gravity * CONFIG.gravityMult
local target = Ctl.aimTarget
if Ctl.aimPart and not Ctl.aimPart.Anchored then
target = target + flat(Ctl.aimPart.AssemblyLinearVelocity) * math.max(T - Ctl.aimSet, 0)
end
local dy = math.max(root.Position.Y - target.Y, 0)
local t = (vel.Y + math.sqrt(vel.Y * vel.Y + 2 * g * dy)) / math.max(g, 1)
t = clamp(t, 0.1, 1.2)
local predicted = root.Position + Vector3.new(vel.X * t, vel.Y * t - 0.5 * g * t * t, vel.Z * t)
local miss = flat(target - predicted)
if miss.Magnitude < 0.7 then
return
end
local want = miss / t
local delta = want - flat(vel)
local limit = 60 * CONFIG.aimGain * dt
if delta.Magnitude > limit then
delta = delta.Unit * limit
end
root.AssemblyLinearVelocity = Vector3.new(vel.X + delta.X, vel.Y, vel.Z + delta.Z)
Stats.aims = Stats.aims + 1
end
local function autoEdgeHop()
if not CONFIG.autoEdgeHop or not Ctl.grounded or Ctl.plan then
return
end
if T < Ctl.hopCd then
return
end
if CONFIG.wallhopVetoS and UIS:IsKeyDown(Enum.KeyCode.S) then
return
end
local dir = inputDir()
local moving = dir.Magnitude > 0.05
if not moving then
dir = flat(root.AssemblyLinearVelocity)
if dir.Magnitude < 4.5 then
return
end
end
dir = dir.Unit
local edge = nil
local probe = 1
while probe <= CONFIG.edgeProbe do
if not floorProbe(root.Position + dir * probe) then
edge = probe
break
end
probe = probe + 0.5
end
if not edge then
return
end
local landing = landingCone(dir, 30, 10, math.max(walkSpeed() * CONFIG.maxFlight * 2.2, 30))
if not landing or landing.dist <= edge + 1 then
return
end
if landing.pos.Y < root.Position.Y - 3 and (landing.dist - edge) < 6 then
return
end
local available = math.max(flat(root.AssemblyLinearVelocity).Magnitude, walkSpeed() * 0.85)
local g = Workspace.Gravity * CONFIG.gravityMult
local t = clamp(math.sqrt(math.max(2 * math.max(landing.pos.Y - root.Position.Y, 2), 0) / g), 0.3, CONFIG.maxFlight)
local needed = (landing.dist - edge) / math.max(t, 0.25)
local cap = walkSpeed() * CONFIG.maxRunBoost
if needed > cap * 1.35 then
if moving then
Ctl.blockedAt = T + 1.2
end
return
end
if needed > cap then
if not CONFIG.runUp then
return
end
needed = cap
elseif needed < available * 0.6 then
needed = available * 0.85
end
Ctl.plan = {dir = landing.dir or dir, landing = landing, edge = edge, needed = needed}
Ctl.planUntil = T + 0.6
Ctl.hopCd = T + CONFIG.hopDebounce
Stats.hops = Stats.hops + 1
end
local function hazardScan()
if not root then
return
end
local pos = root.Position
local vel = flat(root.AssemblyLinearVelocity)
local closeDist, closeEta = nil, nil
for i = 1, #Hazard.list do
local part = Hazard.list[i]
if part.Parent then
local offset = flat(part.Position - pos)
local dist = offset.Magnitude
if dist <= CONFIG.sensorRange and dist > 0.01 then
if not closeDist or dist < closeDist then
closeDist = dist
end
local closing = offset.Unit:Dot(flat(part.AssemblyLinearVelocity) - vel)
if closing > 1.5 then
local eta = dist / closing
if eta < 3 and (not closeEta or eta < closeEta) then
closeEta = eta
end
end
end
end
end
Ctl.hazardDist = closeDist or 0
Ctl.hazardEta = closeEta or 0
end
local function hazardSidestep()
if not CONFIG.hazardSidestep or not Ctl.grounded or T < Ctl.sidestepCd then
return
end
local pos = root.Position
for i = 1, #Hazard.list do
local part = Hazard.list[i]
if part.Parent then
local offset = flat(part.Position - pos)
local dist = offset.Magnitude
if dist < CONFIG.sidestepRange and dist > 0.2 then
local closing = offset.Unit:Dot(flat(part.AssemblyLinearVelocity))
if closing > 2 then
Ctl.sidestepCd = T + CONFIG.sidestepCooldown
local side = Vector3.new(-offset.Z, 0, offset.X).Unit
if (math.floor(T * 7) % 2) == 0 then
side = -side
end
local push = (side * 0.75 + (-offset.Unit) * 0.65).Unit
local vel = root.AssemblyLinearVelocity
root.AssemblyLinearVelocity = Vector3.new(vel.X, vel.Y, vel.Z) + push * CONFIG.sidestepPower
Stats.dodges = Stats.dodges + 1
return
end
end
end
end
end
local function airControlStep(dt, dir)
if Ctl.grounded or dir.Magnitude < 0.05 then return end
local velocity = root.AssemblyLinearVelocity
local along = flat(velocity):Dot(dir)
local limit = walkSpeed() * CONFIG.speedMult
if along >= limit then return end
local add = math.min(limit - along, 26 * CONFIG.airControlGain * dt)
root.AssemblyLinearVelocity = velocity + dir * add
end
local function windCancel(dt)
if not CONFIG.windCancel or Ctl.grounded then return end
local ok, wind = pcall(function() return Workspace.GlobalWind end)
if not ok or not wind or wind.Magnitude < 4 then return end
root.AssemblyLinearVelocity = root.AssemblyLinearVelocity - wind * dt * 0.6
end
local function iceGrip()
if not CONFIG.iceGrip or not Ctl.grounded then return end
local floorHit = floorProbe(root.Position)
if not floorHit then return end
local part = floorHit.Instance
local slippery = false
if part.Material == Enum.Material.Ice or part.Material == Enum.Material.Glass then slippery = true end
local props = part.CustomPhysicalProperties
if props and props.Friction < 0.35 then slippery = true end
if not slippery then return end
if T < Ctl.gripCd then return end
Ctl.gripCd = T + 0.22
local dir = inputDir()
local velocity = root.AssemblyLinearVelocity
local current = flat(velocity)
if dir.Magnitude > 0.05 then
local target = dir * (walkSpeed() * CONFIG.speedMult)
micro(flat(target) - current)
else
micro(-current * 0.5)
end
Stats.grips = Stats.grips + 1
end
local function conveyorContact()
if not CONFIG.conveyorCancel or T < Ctl.conveyorCd then return end
local floorHit = floorProbe(root.Position)
local part = floorHit and floorHit.Instance or nil
if not part or not part.Anchored then return end
local push = part.AssemblyLinearVelocity
if push.Magnitude < 0.5 or flat(push).Magnitude < 0.5 then return end
Ctl.conveyorCd = T + 0.5
Ctl.lastConveyor = part
micro(-flat(push) * 0.85)
Stats.plats = Stats.plats + 1
end
local function platformStick()
if not CONFIG.platformStick or not Ctl.grounded then return end
local floorHit = floorProbe(root.Position)
local part = floorHit and floorHit.Instance or nil
if not part or part.Anchored then return end
local push = part.AssemblyLinearVelocity
if push.Magnitude < 0.4 then return end
local dir = inputDir()
local velocity = root.AssemblyLinearVelocity
if dir.Magnitude > 0.05 then
local drift = flat(push) - flat(velocity)
if drift.Magnitude > 0.6 then micro(drift * 0.5) end
else
local target = flat(push)
local drift = target - flat(velocity)
if drift.Magnitude > 0.4 then micro(drift * 0.6) end
end
end
local function touchGrace()
if not CONFIG.comboGrace then return end
local floorHit = floorProbe(root.Position)
if not floorHit or not isHazard(floorHit.Instance) then return end
if T < Ctl.graceCd then return end
Ctl.graceCd = T + 0.4
micro(Vector3.new(0, 6, 0))
Stats.graces = Stats.graces + 1
end
local function autopilot()
if not CONFIG.autopilot or not Ctl.grounded then return end
if inputDir().Magnitude > 0.05 then return end
local base = flat(Workspace.CurrentCamera.CFrame.LookVector)
local best, bestScore = nil, -1
for i = 0, 11 do
local angle = math.rad(i * 30 - 15)
local cos, sin = math.cos(angle), math.sin(angle)
local dir = Vector3.new(base.X * cos - base.Z * sin, 0, base.X * sin + base.Z * cos)
local landing = landingSearch(dir, 70)
if landing then
local score = landing.dist + landing.solid * 8
if score > bestScore then bestScore = score best = {dir = dir, landing = landing} end
end
end
if not best then return end
local target = best.dir * (walkSpeed() * CONFIG.speedMult)
local velocity = flat(root.AssemblyLinearVelocity)
micro(flat(target) - velocity)
pcall(function() hum:Move(best.dir, false) end)
if not floorProbe(root.Position + best.dir * CONFIG.edgeProbe) and best.landing.dist > 3 then
Ctl.plan = {dir = best.dir, landing = best.landing, edge = CONFIG.edgeProbe, needed = math.max(best.landing.dist / math.max(CONFIG.maxFlight, 0.4), walkSpeed())}
Ctl.planUntil = T + 0.5
end
end
local function damageGraceInit()
if not hum then return end
local last = hum.Health
local lastHit = -99
hum.HealthChanged:Connect(function(health)
if not CONFIG.enabled then
last = health
return
end
if health < last - 0.01 then
local damage = last - health
local lethal = health <= 0.01
local combo = (T - lastHit) < CONFIG.comboWindow
local fell = root and root.AssemblyLinearVelocity.Y < -45
local refund = false
if lethal and CONFIG.lethalSave then refund = true end
if combo and not lethal and CONFIG.comboGrace then refund = true end
if CONFIG.fallGuard and fell and damage >= last * 0.9 then refund = true end
if refund then
pcall(function() hum.Health = last end)
Stats.graces = Stats.graces + 1
else
last = health
end
lastHit = T
else
last = health
end
end)
end
local function watchedCheck()
Ctl.watched = false
if not root then return end
local position = root.Position
for _, player in ipairs(Players:GetPlayers()) do
if player ~= LP then
local other = player.Character
local otherRoot = other and other:FindFirstChild("HumanoidRootPart")
if otherRoot then
local offset = position - otherRoot.Position
local dist = offset.Magnitude
if dist < 16 then
Ctl.watched = true
return
end
if dist < 50 then
local look = Workspace.CurrentCamera and Workspace.CurrentCamera.CFrame.LookVector or Vector3.new()
local dir = offset.Unit
if dir:Dot(look) > 0.5 then
Ctl.watched = true
return
end
end
end
end
end
end
local function bind(charInstance)
char = charInstance
root = char:WaitForChild("HumanoidRootPart", 10)
hum = char:FindFirstChildOfClass("Humanoid")
head = char:FindFirstChild("Head")
Ctl.clipState = nil
if hum then
pcall(function()
hum:SetStateEnabled(Enum.HumanoidStateType.FallingDown, false)
hum:SetStateEnabled(Enum.HumanoidStateType.Ragdoll, false)
end)
damageGraceInit()
end
if UpdateHud then pcall(UpdateHud) end
end
local function engineStep(dt)
if not CONFIG.enabled or not root or not hum or hum.Health <= 0 then return end
Stats.frames = Stats.frames + 1
local wasGrounded = Ctl.grounded
Ctl.grounded = hum.FloorMaterial ~= Enum.Material.Air and hum.FloorMaterial ~= Enum.Material.Water
if Ctl.grounded and not wasGrounded then
Ctl.groundedAt = T
Ctl.plan = nil
if CONFIG.jumpBuffer and T < Ctl.buffered + CONFIG.bufferTime then
Ctl.buffered = 0
Ctl.jumpAt = T
end
if CONFIG.autoBhop and flat(root.AssemblyLinearVelocity).Magnitude > 4 then
Ctl.jumpAt = T
end
end
if wasGrounded and not Ctl.grounded then Ctl.leftAt = T end
watchedCheck()
if T >= Ctl.sensorAt then
Ctl.sensorAt = T + 0.5
sensorStep()
end
if CONFIG.noclip then
applyClip(true)
elseif Ctl.clipState == true then
applyClip(false)
end
if Ctl.touchLock and T >= Ctl.touchLock then
unshield()
end
if CONFIG.trussAssist and hum:GetState() == Enum.HumanoidStateType.Climbing and CONFIG.trussBoost > 1 then
local velocity = root.AssemblyLinearVelocity
root.AssemblyLinearVelocity = Vector3.new(velocity.X, CONFIG.trussBoost * 16, velocity.Z)
end
if CONFIG.stumbleRecovery then
local state = hum:GetState()
if state == Enum.HumanoidStateType.FallingDown or state == Enum.HumanoidStateType.Physics or state == Enum.HumanoidStateType.Ragdoll then
pcall(function() hum:ChangeState(Enum.HumanoidStateType.Running) end)
end
end
if Ctl.grounded then
autoEdgeHop()
if Ctl.plan then
local plan = Ctl.plan
local edgeNow = nil
local probe = 1
while probe <= CONFIG.edgeProbe + 2 do
if not floorProbe(root.Position + plan.dir * probe) then
edgeNow = probe
break
end
probe = probe + 0.5
end
local turn = inputDir()
if turn.Magnitude > 0.05 and turn:Dot(plan.dir) < 0.25 then
Ctl.plan = nil
elseif not edgeNow or edgeNow > CONFIG.edgeProbe + 1.5 then
Ctl.plan = nil
elseif edgeNow <= 0.8 or T > Ctl.planUntil then
local g = Workspace.Gravity * CONFIG.gravityMult
local speed = math.max(plan.needed, walkSpeed() * 0.8)
local dy = plan.landing.pos.Y - root.Position.Y
local t = clamp(plan.landing.dist / math.max(speed, 1), 0.3, CONFIG.maxFlight)
local vy = math.min((dy + 0.5 * g * t * t) / t, jumpVelocity())
root.AssemblyLinearVelocity = plan.dir * speed + Vector3.new(0, math.max(vy, 8), 0)
pcall(function()
hum.Jump = true
hum:ChangeState(Enum.HumanoidStateType.Jumping)
end)
Stats.timing = Stats.timing + 1
Ctl.aimTarget = plan.landing.pos
Ctl.aimPart = plan.landing.part
Ctl.aimSet = T
Ctl.aimUntil = T + clamp(t + 0.18, 0.32, CONFIG.aimHold)
Ctl.plan = nil
Ctl.lastJumpT = T
end
end
if wantsJump() and T > Ctl.lastJumpT + 0.08 then
Ctl.lastJumpT = T
Ctl.jumpAt = -99
local plan = Ctl.plan or planJump()
if plan and CONFIG.perfectTiming then
Ctl.buffered = T
Ctl.plan = plan
Ctl.planUntil = T + 0.55
else
Ctl.jumpAt = -99
Ctl.buffered = T
pcall(function()
hum.Jump = true
hum:ChangeState(Enum.HumanoidStateType.Jumping)
end)
Stats.jumps = Stats.jumps + 1
end
end
else
if Ctl.plan then Ctl.plan = nil end
wallStep()
if wantsJump() and T > Ctl.lastJumpT + 0.08 then
Ctl.lastJumpT = T
Ctl.buffered = T
Ctl.jumpAt = -99
if T - Ctl.leftAt < (CONFIG.coyote and CONFIG.coyoteTime or 0) then
pcall(function()
hum.Jump = true
hum:ChangeState(Enum.HumanoidStateType.Jumping)
end)
Stats.jumps = Stats.jumps + 1
end
end
end
touchGrace()
iceGrip()
conveyorContact()
platformStick()
if CONFIG.airControl and not Ctl.grounded then airControlStep(dt, inputDir()) end
windCancel(dt)
lipHop()
hazardScan()
hazardSidestep()
aimStep(dt)
if CONFIG.autopilot then autopilot() end
local moved = Ctl.lastPos and (root.Position - Ctl.lastPos).Magnitude or 1
if flat(root.AssemblyLinearVelocity).Magnitude > 3 and moved < 0.6 * dt then
Ctl.stuckAt = (Ctl.stuckAt or 0) + dt
else
Ctl.stuckAt = 0
end
Ctl.lastPos = root.Position
Ctl.lastSpeed = flat(root.AssemblyLinearVelocity).Magnitude
end
LP.CharacterAdded:Connect(function(instance)
task.wait(0.2)
pcall(bind, instance)
end)
LP.CharacterRemoving:Connect(function()
char, root, hum, head = nil, nil, nil, nil
end)
if LP.Character then
pcall(bind, LP.Character)
else
LP.CharacterAdded:Wait()
end
local playerGui = LP:WaitForChild("PlayerGui")
local gui = Instance.new("ScreenGui")
gui.Name = "ObbyAssister"
gui.ResetOnSpawn = false
gui.IgnoreGuiInset = true
gui.DisplayOrder = 500
gui.ZIndexBehavior = Enum.ZIndexBehavior.Sibling
gui.Parent = playerGui
local function mk(class, props, parent)
local instance = Instance.new(class)
for key, value in pairs(props) do
if key ~= "Parent" then instance[key] = value end
end
if parent then instance.Parent = parent end
return instance
end
local panel = mk("Frame", {
Name = "Panel",
Size = UDim2.new(0, 600, 0, 470),
Position = UDim2.new(0.5, 0, 0.5, 0),
AnchorPoint = Vector2.new(0.5, 0.5),
BackgroundColor3 = Theme.panel,
BorderSizePixel = 0,
Visible = true,
}, gui)
mk("UICorner", {CornerRadius = UDim.new(0, 10)}, panel)
mk("UIStroke", {Color = Theme.track, Thickness = 1}, panel)
local header = mk("Frame", {
Size = UDim2.new(1, 0, 0, 38),
BackgroundColor3 = Theme.bg,
BorderSizePixel = 0,
}, panel)
mk("UICorner", {CornerRadius = UDim.new(0, 10)}, header)
mk("Frame", {Size = UDim2.new(1, 0, 0, 12), Position = UDim2.new(0, 0, 1, -12), BackgroundColor3 = Theme.bg, BorderSizePixel = 0}, header)
mk("TextLabel", {
Text = "OBBY ASSISTER",
Font = Enum.Font.GothamBold,
TextSize = 15,
TextColor3 = Theme.text,
BackgroundTransparency = 1,
Size = UDim2.new(0, 160, 1, 0),
Position = UDim2.new(0, 12, 0, 0),
TextXAlignment = Enum.TextXAlignment.Left,
}, header)
local modeLabel = mk("TextLabel", {
Text = "MODE: UNSTOPPABLE",
Font = Enum.Font.Code,
TextSize = 12,
TextColor3 = Theme.accent,
BackgroundTransparency = 1,
Size = UDim2.new(0, 220, 1, 0),
Position = UDim2.new(0, 150, 0, 0),
TextXAlignment = Enum.TextXAlignment.Left,
}, header)
local masterButton = mk("TextButton", {
Text = "ASSIST ON",
Font = Enum.Font.GothamBold,
TextSize = 12,
TextColor3 = Theme.bg,
BackgroundColor3 = Theme.good,
BorderSizePixel = 0,
Size = UDim2.new(0, 96, 0, 24),
Position = UDim2.new(1, -212, 0.5, -12),
}, header)
mk("UICorner", {CornerRadius = UDim.new(0, 6)}, masterButton)
local minButton = mk("TextButton", {
Text = "_",
Font = Enum.Font.GothamBold,
TextSize = 16,
TextColor3 = Theme.text,
BackgroundColor3 = Theme.row,
BorderSizePixel = 0,
Size = UDim2.new(0, 30, 0, 24),
Position = UDim2.new(1, -108, 0.5, -12),
}, header)
mk("UICorner", {CornerRadius = UDim.new(0, 6)}, minButton)
local closeButton = mk("TextButton", {
Text = "X",
Font = Enum.Font.GothamBold,
TextSize = 13,
TextColor3 = Theme.bad,
BackgroundColor3 = Theme.row,
BorderSizePixel = 0,
Size = UDim2.new(0, 30, 0, 24),
Position = UDim2.new(1, -42, 0.5, -12),
}, header)
mk("UICorner", {CornerRadius = UDim.new(0, 6)}, closeButton)
local body = mk("Frame", {
Size = UDim2.new(1, 0, 1, -38),
Position = UDim2.new(0, 0, 0, 38),
BackgroundTransparency = 1,
}, panel)
local status = mk("Frame", {
Size = UDim2.new(1, -16, 0, 26),
Position = UDim2.new(0, 8, 0, 6),
BackgroundColor3 = Theme.bg,
BorderSizePixel = 0,
}, body)
mk("UICorner", {CornerRadius = UDim.new(0, 6)}, status)
local statusLabel = mk("TextLabel", {
Text = "",
Font = Enum.Font.Code,
TextSize = 12,
TextColor3 = Theme.dim,
BackgroundTransparency = 1,
Size = UDim2.new(1, -12, 1, 0),
Position = UDim2.new(0, 8, 0, 0),
TextXAlignment = Enum.TextXAlignment.Left,
}, status)
local leftColumn = mk("ScrollingFrame", {
Size = UDim2.new(0, 340, 1, -132),
Position = UDim2.new(0, 8, 0, 36),
BackgroundColor3 = Theme.bg,
BorderSizePixel = 0,
ScrollBarThickness = 4,
CanvasSize = UDim2.new(0, 0, 0, 0),
}, body)
mk("UICorner", {CornerRadius = UDim.new(0, 8)}, leftColumn)
local leftLayout = mk("UIListLayout", {Padding = UDim.new(0, 4), SortOrder = Enum.SortOrder.LayoutOrder}, leftColumn)
mk("UIPadding", {PaddingTop = UDim.new(0, 6), PaddingLeft = UDim.new(0, 6), PaddingRight = UDim.new(0, 6)}, leftColumn)
local rightColumn = mk("ScrollingFrame", {
Size = UDim2.new(0, 232, 1, -132),
Position = UDim2.new(1, -240, 0, 36),
BackgroundColor3 = Theme.bg,
BorderSizePixel = 0,
ScrollBarThickness = 4,
CanvasSize = UDim2.new(0, 0, 0, 0),
}, body)
mk("UICorner", {CornerRadius = UDim.new(0, 8)}, rightColumn)
local rightLayout = mk("UIListLayout", {Padding = UDim.new(0, 4), SortOrder = Enum.SortOrder.LayoutOrder}, rightColumn)
mk("UIPadding", {PaddingTop = UDim.new(0, 6), PaddingLeft = UDim.new(0, 6), PaddingRight = UDim.new(0, 6)}, rightColumn)
local footer = mk("Frame", {
Size = UDim2.new(1, -16, 0, 46),
Position = UDim2.new(0, 8, 1, -52),
BackgroundColor3 = Theme.bg,
BorderSizePixel = 0,
}, body)
mk("UICorner", {CornerRadius = UDim.new(0, 8)}, footer)
local order = 0
local function nextOrder()
order = order + 1
return order
end
local function sectionLabel(parent, text)
local label = mk("TextLabel", {
Text = text,
Font = Enum.Font.GothamBold,
TextSize = 11,
TextColor3 = Theme.accent,
BackgroundTransparency = 1,
Size = UDim2.new(1, 0, 0, 18),
TextXAlignment = Enum.TextXAlignment.Left,
LayoutOrder = nextOrder(),
Parent = parent,
})
return label
end
local rows = {}
local function makeToggleRow(parent, spec)
local row = mk("Frame", {
Size = UDim2.new(1, 0, 0, 26),
BackgroundColor3 = Theme.row,
BorderSizePixel = 0,
LayoutOrder = nextOrder(),
Parent = parent,
})
mk("UICorner", {CornerRadius = UDim.new(0, 6)}, row)
local button = mk("TextButton", {
Text = "ON",
Font = Enum.Font.Code,
TextSize = 12,
TextColor3 = Theme.bg,
BackgroundColor3 = Theme.good,
BorderSizePixel = 0,
Size = UDim2.new(0, 40, 0, 18),
Position = UDim2.new(0, 6, 0.5, -9),
Parent = row,
})
mk("UICorner", {CornerRadius = UDim.new(0, 5)}, button)
local label = mk("TextLabel", {
Text = spec.name,
Font = Enum.Font.Gotham,
TextSize = 12,
TextColor3 = Theme.text,
BackgroundTransparency = 1,
Size = UDim2.new(1, -54, 1, 0),
Position = UDim2.new(0, 52, 0, 0),
TextXAlignment = Enum.TextXAlignment.Left,
TextTruncate = Enum.TextTruncate.AtEnd,
Parent = row,
})
button.MouseButton1Click:Connect(function()
CONFIG[spec.key] = not CONFIG[spec.key]
CONFIG.preset = "CUSTOM"
Refresh()
Persist()
end)
local entry = {key = spec.key, kind = "toggle", button = button, label = label, row = row}
table.insert(rows, entry)
return entry
end
local function makeSliderRow(parent, spec)
local row = mk("Frame", {
Size = UDim2.new(1, 0, 0, 42),
BackgroundColor3 = Theme.row,
BorderSizePixel = 0,
LayoutOrder = nextOrder(),
Parent = parent,
})
mk("UICorner", {CornerRadius = UDim.new(0, 6)}, row)
local label = mk("TextLabel", {
Text = spec.label,
Font = Enum.Font.Gotham,
TextSize = 11,
TextColor3 = Theme.text,
BackgroundTransparency = 1,
Size = UDim2.new(1, -92, 0, 14),
Position = UDim2.new(0, 8, 0, 4),
TextXAlignment = Enum.TextXAlignment.Left,
Parent = row,
})
local value = mk("TextLabel", {
Text = "0",
Font = Enum.Font.Code,
TextSize = 11,
TextColor3 = Theme.accent,
BackgroundTransparency = 1,
Size = UDim2.new(0, 40, 0, 14),
Position = UDim2.new(1, -46, 0, 4),
TextXAlignment = Enum.TextXAlignment.Right,
Parent = row,
})
local minus = mk("TextButton", {
Text = "-",
Font = Enum.Font.GothamBold,
TextSize = 12,
TextColor3 = Theme.text,
BackgroundColor3 = Theme.rowAlt,
BorderSizePixel = 0,
Size = UDim2.new(0, 18, 0, 18),
Position = UDim2.new(1, -90, 0, 2),
Parent = row,
})
local plus = mk("TextButton", {
Text = "+",
Font = Enum.Font.GothamBold,
TextSize = 12,
TextColor3 = Theme.text,
BackgroundColor3 = Theme.rowAlt,
BorderSizePixel = 0,
Size = UDim2.new(0, 18, 0, 18),
Position = UDim2.new(1, -70, 0, 2),
Parent = row,
})
local track = mk("Frame", {
Size = UDim2.new(1, -16, 0, 8),
Position = UDim2.new(0, 8, 1, -18),
BackgroundColor3 = Theme.track,
BorderSizePixel = 0,
Parent = row,
})
mk("UICorner", {CornerRadius = UDim.new(1, 0)}, track)
local fill = mk("Frame", {
Size = UDim2.new(0, 0, 1, 0),
BackgroundColor3 = Theme.accent,
BorderSizePixel = 0,
Parent = track,
})
mk("UICorner", {CornerRadius = UDim.new(1, 0)}, fill)
local knob = mk("Frame", {
Size = UDim2.new(0, 14, 0, 14),
AnchorPoint = Vector2.new(0.5, 0.5),
Position = UDim2.new(0, 0, 0.5, 0),
BackgroundColor3 = Theme.text,
BorderSizePixel = 0,
Parent = track,
})
mk("UICorner", {CornerRadius = UDim.new(1, 0)}, knob)
local function setValue(raw)
local stepped = math.floor((raw - spec.min) / spec.step + 0.5) * spec.step + spec.min
CONFIG[spec.key] = math.floor(math.min(math.max(stepped, spec.min), spec.max) * 1000 + 0.5) / 1000
CONFIG.preset = "CUSTOM"
Refresh()
Persist()
end
local dragging = false
local function fromX(x)
local width = track.AbsoluteSize.X
if width <= 0 then return end
local alpha = clamp((x - track.AbsolutePosition.X) / width, 0, 1)
setValue(spec.min + alpha * (spec.max - spec.min))
end
track.InputBegan:Connect(function(input)
if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
dragging = true
fromX(input.Position.X)
end
end)
track.InputEnded:Connect(function(input)
if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
dragging = false
end
end)
UIS.InputChanged:Connect(function(input)
if dragging and (input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch) then
fromX(input.Position.X)
end
end)
minus.MouseButton1Click:Connect(function() setValue((CONFIG[spec.key] or spec.min) - spec.step) end)
plus.MouseButton1Click:Connect(function() setValue((CONFIG[spec.key] or spec.min) + spec.step) end)
local entry = {key = spec.key, kind = "slider", spec = spec, label = label, value = value, fill = fill, knob = knob, track = track, row = row}
table.insert(rows, entry)
return entry
end
local currentGroup = nil
for i = 1, #TOGGLES do
local spec = TOGGLES[i]
if spec.group ~= currentGroup then
currentGroup = spec.group
sectionLabel(leftColumn, spec.group)
end
makeToggleRow(leftColumn, spec)
end
local sliderGroup = nil
for i = 1, #SLIDERS do
local spec = SLIDERS[i]
if spec.group ~= sliderGroup then
sliderGroup = spec.group
sectionLabel(rightColumn, spec.group)
end
makeSliderRow(rightColumn, spec)
end
task.defer(function()
leftColumn.CanvasSize = UDim2.new(0, 0, 0, leftLayout.AbsoluteContentSize.Y + 10)
rightColumn.CanvasSize = UDim2.new(0, 0, 0, rightLayout.AbsoluteContentSize.Y + 10)
end)
local presetOrder = {"UNSTOPPABLE", "ALMOST_HUMAN", "SUBTLE", "SPEEDRUNNER", "GHOST"}
local function applyPreset(name)
local preset = PRESETS[name]
if not preset then return end
for key, value in pairs(preset) do
CONFIG[key] = value
end
CONFIG.preset = name
Refresh()
Persist()
end
local openButton
local buttonSpecs = {
{text = "PRESET >", action = function()
local index = table.find(presetOrder, CONFIG.preset) or 0
index = index % #presetOrder + 1
applyPreset(presetOrder[index])
end, color = Theme.accent},
{text = "RESET", action = function()
applyPreset("UNSTOPPABLE")
end, color = Theme.text},
{text = "SAVE", action = function()
Persist(true)
end, color = Theme.text},
{text = "LOAD", action = function()
Restore()
Refresh()
end, color = Theme.text},
{text = "COPY", action = function()
local parts = {}
for key, value in pairs(CONFIG) do
table.insert(parts, key .. "=" .. tostring(value))
end
local text = table.concat(parts, ",")
local ok = pcall(function() setclipboard(text) end)
if not ok then
ok = pcall(function()
local box = mk("TextBox", {Text = text, Size = UDim2.new(0, 10, 0, 10), Parent = panel})
box:CaptureFocus()
box:ReleaseFocus()
box:Destroy()
end)
end
print("[OBBY ASSIST] config " .. (ok and "copied to clipboard" or "printed") .. " :: " .. text)
end, color = Theme.text},
{text = "GHOST", action = function()
applyPreset("GHOST")
end, color = Theme.warn},
{text = "HIDE", action = function()
panel.Visible = false
openButton.Visible = true
end, color = Theme.bad},
}
for i = 1, #buttonSpecs do
local spec = buttonSpecs[i]
local button = mk("TextButton", {
Text = spec.text,
Font = Enum.Font.GothamBold,
TextSize = 11,
TextColor3 = spec.color,
BackgroundColor3 = Theme.row,
BorderSizePixel = 0,
Size = UDim2.new(0, 74, 0, 30),
Position = UDim2.new(0, 6 + (i - 1) * 78, 0.5, -15),
Parent = footer,
})
mk("UICorner", {CornerRadius = UDim.new(0, 6)}, button)
button.MouseButton1Click:Connect(function()
pcall(spec.action)
Refresh()
end)
end
openButton = mk("TextButton", {
Text = "OA",
Font = Enum.Font.GothamBold,
TextSize = 14,
TextColor3 = Theme.bg,
BackgroundColor3 = Theme.accent,
BorderSizePixel = 0,
Size = UDim2.new(0, 46, 0, 46),
Position = UDim2.new(0, 18, 0.72, 0),
Visible = false,
Parent = gui,
})
mk("UICorner", {CornerRadius = UDim.new(1, 0)}, openButton)
mk("UIStroke", {Color = Theme.bg, Thickness = 2}, openButton)
local hud = mk("Frame", {
Size = UDim2.new(0, 260, 0, 54),
Position = UDim2.new(0, 14, 0, 14),
BackgroundColor3 = Theme.bg,
BackgroundTransparency = 0.15,
BorderSizePixel = 0,
Parent = gui,
})
mk("UICorner", {CornerRadius = UDim.new(0, 8)}, hud)
mk("UIStroke", {Color = Theme.track, Thickness = 1}, hud)
local hudTitle = mk("TextLabel", {
Text = "OBBY ASSISTER",
Font = Enum.Font.GothamBold,
TextSize = 12,
TextColor3 = Theme.accent,
BackgroundTransparency = 1,
Size = UDim2.new(1, -12, 0, 16),
Position = UDim2.new(0, 8, 0, 4),
TextXAlignment = Enum.TextXAlignment.Left,
Parent = hud,
})
local hudLine1 = mk("TextLabel", {
Text = "",
Font = Enum.Font.Code,
TextSize = 11,
TextColor3 = Theme.text,
BackgroundTransparency = 1,
Size = UDim2.new(1, -12, 0, 14),
Position = UDim2.new(0, 8, 0, 20),
TextXAlignment = Enum.TextXAlignment.Left,
Parent = hud,
})
local hudLine2 = mk("TextLabel", {
Text = "",
Font = Enum.Font.Code,
TextSize = 11,
TextColor3 = Theme.dim,
BackgroundTransparency = 1,
Size = UDim2.new(1, -12, 0, 14),
Position = UDim2.new(0, 8, 0, 34),
TextXAlignment = Enum.TextXAlignment.Left,
Parent = hud,
})
local function draggable(frame)
local dragging = false
local offset = Vector2.new()
frame.InputBegan:Connect(function(input)
if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
if frame.AbsolutePosition and frame.AbsoluteSize then
dragging = true
offset = Vector2.new(input.Position.X - frame.AbsolutePosition.X * (1 - frame.AnchorPoint.X), input.Position.Y - frame.AbsolutePosition.Y * (1 - frame.AnchorPoint.Y))
end
end
end)
UIS.InputChanged:Connect(function(input)
if dragging and (input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch) then
frame.Position = UDim2.new(0, input.Position.X - offset.X, 0, input.Position.Y - offset.Y)
end
end)
frame.InputEnded:Connect(function(input)
if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
dragging = false
end
end)
end
draggable(header)
draggable(openButton)
draggable(hud)
local groups = {}
for i = 1, #TOGGLES do
local group = TOGGLES[i].group
if not table.find(groups, group) then table.insert(groups, group) end
end
local function activeCount()
local count, total = 0, 0
for i = 1, #TOGGLES do
local spec = TOGGLES[i]
if type(spec) == "table" then
total = total + 1
if CONFIG[spec.key] then
count = count + 1
end
end
end
return count, total
end
function Refresh()
for i = 1, #rows do
local entry = rows[i]
if type(entry) == "table" and entry.kind == "toggle" then
local isOn = CONFIG[entry.key] and true or false
if entry.button then
entry.button.Text = isOn and "ON" or "OFF"
entry.button.BackgroundColor3 = isOn and Theme.good or Theme.track
entry.button.TextColor3 = isOn and Theme.bg or Theme.dim
end
if entry.row then
entry.row.BackgroundColor3 = isOn and Theme.rowAlt or Theme.row
end
elseif type(entry) == "table" then
local spec = entry.spec
if type(spec) ~= "table" then
spec = {}
end
local minV = tonumber(spec.min) or 0
local maxV = tonumber(spec.max) or (minV + 1)
if maxV <= minV then
maxV = minV + 1
end
local stepV = tonumber(spec.step) or 0.05
if stepV <= 0 then
stepV = 0.05
end
local value = tonumber(CONFIG[entry.key]) or minV
local alpha = clamp((value - minV) / (maxV - minV), 0, 1)
if entry.value then
if stepV >= 1 then
entry.value.Text = string.format("%.0f", value)
else
entry.value.Text = string.format("%.2f", value)
end
end
if entry.fill then
entry.fill.Size = UDim2.new(alpha, 0, 1, 0)
end
if entry.knob then
entry.knob.Position = UDim2.new(alpha, 0, 0.5, 0)
end
end
end
local count, total = activeCount()
modeLabel.Text = "MODE: " .. tostring(CONFIG.preset)
local resolved = (Stats.timing or 0) + (Stats.wallhops or 0) + (Stats.hops or 0) + (Stats.lipHops or 0) + (Stats.aims or 0) + (Stats.dodges or 0)
local statusText
if (Ctl.flashAt or 0) > T then
statusText = ">> " .. tostring(Ctl.flash or "")
elseif (Ctl.blockedAt or 0) > T then
statusText = "UNJUMPABLE GAP - HOLD SHIFT FOR RUN UP OR FIND ANOTHER ROUTE"
else
statusText = string.format("ACTIVE %d/%d SOLVED %d HOP %d WALL %d AIM %d LIP %d DODGE %d GRIP %d GRACE %d ETA %s WATCHED %s",
count, total, resolved, Stats.hops or 0, Stats.wallhops or 0, Stats.aims or 0, Stats.lipHops or 0, Stats.dodges or 0, Stats.grips or 0, Stats.graces or 0,
(Ctl.hazardEta or 0) > 0 and string.format("%.2fs", Ctl.hazardEta) or "--",
Ctl.watched and "YES" or "no")
end
statusLabel.Text = statusText
masterButton.Text = CONFIG.enabled and "ASSIST ON" or "ASSIST OFF"
masterButton.BackgroundColor3 = CONFIG.enabled and Theme.good or Theme.bad
hud.Visible = CONFIG.hud
end
function UpdateHud()
if hudLine1 then
local count, total = activeCount()
local solved = (Stats.timing or 0) + (Stats.wallhops or 0) + (Stats.hops or 0) + (Stats.lipHops or 0) + (Stats.aims or 0) + (Stats.dodges or 0)
hudLine1.Text = string.format("%s %d/%d SOLVED %d", CONFIG.enabled and "ON" or "OFF", count, total, solved)
hudLine2.Text = string.format("hop %d wall %d aim %d lip %d dodge %d", Stats.hops or 0, Stats.wallhops or 0, Stats.aims or 0, Stats.lipHops or 0, Stats.dodges or 0)
hudTitle.Text = Ctl.wallReady and "OBBY ASSISTER - WALLHOP READY" or "OBBY ASSISTER"
end
end
function Persist(announce)
if not CONFIG.persist then return end
for key, value in pairs(CONFIG) do
if type(value) == "boolean" or type(value) == "number" or type(value) == "string" then
pcall(function() LP:SetAttribute("OA_" .. key, value) end)
end
end
if announce then
print("[OBBY ASSIST] settings saved")
end
end
function Restore()
for key, value in pairs(CONFIG) do
local stored = LP:GetAttribute("OA_" .. key)
if stored ~= nil then CONFIG[key] = stored end
end
end
Restore()
Refresh()
UpdateHud()
masterButton.MouseButton1Click:Connect(function()
CONFIG.enabled = not CONFIG.enabled
Refresh()
Persist()
if not CONFIG.enabled then
if hum then pcall(function() hum:Move(Vector3.new(), false) end) end
if Ctl.clipState == true then applyClip(false) end
unshield()
end
end)
minButton.MouseButton1Click:Connect(function()
body.Visible = not body.Visible
panel.Size = body.Visible and UDim2.new(0, 600, 0, 470) or UDim2.new(0, 600, 0, 38)
end)
closeButton.MouseButton1Click:Connect(function()
panel.Visible = false
openButton.Visible = true
end)
openButton.MouseButton1Click:Connect(function()
panel.Visible = true
openButton.Visible = false
end)
UIS.InputBegan:Connect(function(input, processed)
if input.KeyCode == Enum.KeyCode.Space or input.KeyCode == Enum.KeyCode.ButtonA then
Ctl.jumpAt = T
end
if processed then return end
if input.KeyCode == Enum.KeyCode[CONFIG.guiKey] then
panel.Visible = not panel.Visible
openButton.Visible = not panel.Visible
elseif input.KeyCode == Enum.KeyCode[CONFIG.quickKey] then
CONFIG.enabled = not CONFIG.enabled
Refresh()
Persist()
elseif input.KeyCode == Enum.KeyCode[CONFIG.powerKey] then
local powerOn = not CONFIG.autoEdgeHop
CONFIG.autoEdgeHop = powerOn
CONFIG.planAim = true
Ctl.flash = powerOn and "POWER ASSIST ON" or "POWER ASSIST OFF"
Ctl.flashAt = T + 2
Refresh()
Persist()
end
end)
local stepErrors = 0
local function onStepped(stepName, stepDelta)
T = os.clock()
local ok, err = pcall(engineStep, stepDelta)
if not ok and stepErrors < 4 then
stepErrors = stepErrors + 1
warn("[OBBY ASSIST] assist error " .. stepErrors .. "/4 :: " .. tostring(err))
end
if T - Ctl.lastHud > 0.2 then
Ctl.lastHud = T
pcall(UpdateHud)
pcall(Refresh)
end
end
RunService.Stepped:Connect(onStepped)
local function autosave()
while true do
task.wait(12)
if CONFIG.persist then
Persist()
end
end
end
task.spawn(autosave)
print("[OBBY ASSIST] loaded. " .. CONFIG.guiKey .. " toggles the panel, " .. CONFIG.quickKey .. " toggles assistance, " .. CONFIG.powerKey .. " toggles the power stack.")
print("[OBBY ASSIST] end of file. Nothing may follow this line. Options: " .. tostring(#TOGGLES + #SLIDERS))No comments yet for this script.



