Run it
Copy the script and paste it into your executor.
.PlaceId ~=
()
players = :()
replicatedstorage = :()
runservice = :()
userinputservice = :()
lighting = :()
collectionservice = :()
httpservice = :()
tweenservice = :()
marketplace = :()
statsservice = :()
virtualuser = :()
teleportservice = :()
localplayer = players.LocalPlayer
playergui = localplayer:()
gamedata = replicatedstorage:(, )
gamedata
()
_, name ({ , })
old = playergui:(name)
old old:()
palette = {
background = .(, , ),
side = .(, , ),
surface = .(, , ),
card = .(, , ),
raised = .(, , ),
accent = .(, , ),
accentmid = .(, , ),
accentdark = .(, , ),
border = .(, , ),
text = .(, , ),
muted = .(, , ),
dim = .(, , ),
lilac = .(, , ),
success = .(, , ),
danger = .(, , ),
gold = .(, , ),
portal = .(, , ),
jump = .(, , ),
glue = .(, , ),
camera = .(, , )
}
alive =
connections, cleanups = {}, {}
started_at = .()
S = {
selected = , spectating = , return_cframe = ,
minimized = , afk_pulses = , last_pulse = .(), fling_active =
}
settings = {
esp = , labels = , distance = , credit_esp = , teleporter_esp = ,
fullbright = , speed = , jump = , noclip = , infinite_jump = ,
auto_seek = , auto_credits = , auto_evade = ,
pull_credits = , pull_lobby = , it_no_cooldown = , it_keep_active = ,
early_it = , jump_pad_esp = , seeker_radius_esp = , closest_credit_esp = ,
camera_esp = , glue_esp = , seeker_warning_distance = ,
auto_buy = , auto_farm = , anti_afk = , auto_server_hop =
}
initial_humanoid = localplayer.Character localplayer.Character:()
move = {
speed = .(((initial_humanoid initial_humanoid.WalkSpeed ) * ) * + ) / ,
jump = .(((initial_humanoid initial_humanoid.JumpPower ) * ) * + ) / ,
subtle_speed = ,
subtle_jump =
}
V = { overlays = {}, credits = {}, tele = {}, hz = { jump = {}, glue = {}, camera = {} } }
M = { collisions = {}, baselines = ({}, { __mode = }) }
F = {
pulled_credits = {}, loop_origin = ,
credit_attempts = , pull_credit_attempts = , lobby_targets = , pull_ticks = ,
lobby_cursor = , lobby_target = , lobby_started = , last_touch = , credit_inflight = ,
verified_gains = , credit_last = ,
safe_positions = {}, last_safe = , last_escape = , last_notice =
}
A = {
handler = , set_original = , mark_original = , set_hook = , mark_hook = ,
active = , active_known = , last_clear = , intercepts = , clears = , err = ,
attempts = , name = , last_result = , last_attempt = ,
sprint_first = , last_character = ,
practice_end = , practice_camera = , objects = {}
}
recent_credits = ({}, { __mode = })
storage = { path = , revision = , loaded = }
storage.state = .. storage.path
defaults = {}
key, value (settings) defaults[key] = value
storage.defaults = defaults
()
(readfile) == (writefile) == (makefolder) ==
()
()
_, directory ({ , })
(isfolder) ~= (directory)
ok = (makefolder, directory)
ok (isfolder) == (directory)
(saved)
(saved) ~= saved.schema ~= (saved.options) ~=
key, original (defaults)
value = saved.options[key]
(value) == (original)
settings[key] = key == .(value, , ) value
(saved.speed_value) == move.speed = .(saved.speed_value, , )
(saved.jump_value) == move.jump = .(saved.jump_value, , )
(saved.subtle_speed) == move.subtle_speed = saved.subtle_speed
(saved.subtle_jump) == move.subtle_jump = saved.subtle_jump
()
()
storage.state =
ok, content = (readfile, storage.path)
ok
storage.state =
decoded, data = (httpservice.JSONDecode, httpservice, content)
decoded (data)
storage.loaded =
storage.state = .. storage.path
storage.state =
storage.()
()
storage.state =
storage.label storage.label.Parent storage.label.Text = storage.state
options = {}
key (defaults) options[key] = settings[key]
encoded, result = (httpservice.JSONEncode, httpservice, {
schema = ,
options = options,
speed_value = move.speed,
jump_value = move.jump,
subtle_speed = move.subtle_speed,
subtle_jump = move.subtle_jump
})
encoded
storage.state =
ok = (writefile, storage.path, result)
storage.state = ok ( .. storage.path)
storage.label storage.label.Parent storage.label.Text = storage.state
ok
storage.()
storage.revision +=
revision = storage.revision
.(, ()
alive revision == storage.revision storage.()
)
()
settings.auto_buy =
original_lighting = {
Brightness = lighting.Brightness,
ClockTime = lighting.ClockTime,
FogEnd = lighting.FogEnd,
GlobalShadows = lighting.GlobalShadows,
Ambient = lighting.Ambient,
OutdoorAmbient = lighting.OutdoorAmbient
}
(signal, callback)
connection = signal:(callback)
.(connections, connection)
connection
(interval, callback)
acc =
(runservice.Heartbeat, (dt)
alive
acc += dt
acc >= interval
elapsed = acc
acc =
(elapsed)
)
(class, props, parent)
obj = .(class)
property, value (props {})
obj[property] = value
obj.Parent = parent
obj
(parent, radius)
(, { CornerRadius = .(, radius ) }, parent)
(parent, color, transparency)
(, {
Color = color palette.border,
Thickness = ,
Transparency = transparency ,
ApplyStrokeMode = .ApplyStrokeMode.Border
}, parent)
(parent, content, size, color, props)
options = {
BackgroundTransparency = ,
Text = content,
Font = .Font.Gotham,
TextSize = size ,
TextColor3 = color palette.text,
TextXAlignment = .TextXAlignment.Left,
TextYAlignment = .TextYAlignment.Center
}
key, value (props {})
options[key] = value
(, options, parent)
(parent, content, pos, size, callback, accent)
control = (, {
Position = pos,
Size = size,
BackgroundColor3 = accent palette.accentdark palette.raised,
BorderSizePixel = ,
Text = content,
TextSize = ,
Font = .Font.GothamMedium,
TextColor3 = palette.text,
AutoButtonColor =
}, parent)
(control, )
(control, accent palette.accent palette.border)
(control.MouseButton1Click, callback)
control
(parent)
n = (parent:() ) +
parent:(, n)
n
renderers = {}
(key, fn)
renderers[key] = renderers[key] {}
.(renderers[key], fn)
(key)
_, fn (renderers[key] {}) ()
ui = {}
logs = {}
(message)
alive
.(logs, .() .. .. message)
#logs > .(logs, )
ui.message ui.message.Text = message
ui.refresh_log ui.()
(player, field)
data = player player:()
entry = data data:(field)
entry entry.Value
(player)
(player, ) ==
(player)
(player, ) ==
it = gamedata:()
obj = it it:()
obj obj.Value == player
()
it = gamedata:()
obj = it it:()
obj obj.Value obj.Value:() obj.Value
_, player (players:())
(player, ) == player
(player)
character = player player.Character
character
root = character:()
humanoid = character:()
root humanoid humanoid.Health >
root, humanoid
(player)
(player) ((player) )
(player)
(player) palette.danger ((player) palette.accent palette.muted)
()
mine = (localplayer)
mine
closest, distance
_, player (players:())
player ~= localplayer (player) (player)
root = (player)
root
d = (root.Position - mine.Position).Magnitude
distance d < distance closest, distance = player, d
closest
(skip_recent)
container = :()
mine = (localplayer)
container mine
chosen, best
now = .()
_, part (container:())
part.Name == part:() part.Parent
collected = part:()
( collected collected.Value) ( skip_recent now - (recent_credits[part] -) > )
distance = (mine.Position - part.Position).Magnitude
best distance < best chosen, best = part, distance
chosen
()
options = {}
_, player (players:())
player ~= localplayer (player) (player) (player)
.(options, player)
#options ==
.(options, (a, b) a.UserId < b.UserId )
F.lobby_cursor = F.lobby_cursor % #options +
options[F.lobby_cursor]
(object)
object:() object
object:() object:(, )
()
S.spectating =
_, humanoid = (localplayer)
.CurrentCamera humanoid
.CurrentCamera.CameraSubject = humanoid
(player)
player ();
myroot = (localplayer)
targetroot = (player)
myroot targetroot ();
(player) (localplayer) ();
S.return_cframe = myroot.CFrame
myroot.AssemblyLinearVelocity = .zero
myroot.CFrame = targetroot.CFrame * .(, , )
( .. player.Name .. )
gui = (, {
Name = ,
ResetOnSpawn = ,
IgnoreGuiInset = ,
ZIndexBehavior = .ZIndexBehavior.Sibling,
DisplayOrder =
}, playergui)
ui.seeker_warning = (gui, , , palette.text, {
Name = ,
AnchorPoint = .(, ),
Position = .(, -, , ),
Size = .(, ),
TextXAlignment = .TextXAlignment.Right,
TextStrokeTransparency = ,
TextStrokeColor3 = .(, , ),
Font = .Font.GothamBold,
ZIndex = ,
Visible =
})
ui.closest_line = (, {
Name = ,
BackgroundColor3 = palette.gold,
BorderSizePixel = ,
Size = .(, ),
AnchorPoint = .(, ),
Visible = ,
ZIndex =
}, gui)
ui.closest_label = (gui, , , palette.gold, {
Name = ,
Size = .(, ),
TextStrokeTransparency = ,
TextStrokeColor3 = .(, , ),
Font = .Font.GothamBold,
TextXAlignment = .TextXAlignment.Center,
ZIndex = ,
Visible =
})
early_gui = (, {
Name = ,
ResetOnSpawn = ,
IgnoreGuiInset = ,
DisplayOrder = ,
ZIndexBehavior = .ZIndexBehavior.Global
}, playergui)
early_banner = (, {
AnchorPoint = .(, ),
Position = .(, , , ),
Size = .(, ),
BackgroundColor3 = palette.background,
BackgroundTransparency = ,
Visible = ,
BorderSizePixel = ,
ZIndex =
}, early_gui)
(early_banner, )
(early_banner, palette.accent)
early_text = (early_banner, , , palette.gold, {
Size = .(, ),
Font = .Font.GothamBold,
TextXAlignment = .TextXAlignment.Center,
ZIndex =
})
(entry)
_, key ({ , , })
entry[key] entry[key]:()
(store)
key, entry (store)
(entry)
store[key] =
(store, key, part, o)
entry = store[key]
entry (entry.part ~= part entry.box entry.box.Parent entry.billboard entry.billboard.Parent)
(entry)
entry =
entry
entry = { part = part }
o.highlight
entry.highlight = (, {
Name = ,
Adornee = part,
FillColor = o.color,
OutlineColor = o.color,
FillTransparency = o.fill ,
OutlineTransparency = ,
DepthMode = .HighlightDepthMode.AlwaysOnTop
}, part)
pad = o.pad
entry.box = (, {
Name = ,
Adornee = part,
AlwaysOnTop = ,
Size = part.Size + .(pad, pad, pad),
= o.color,
Transparency = o.box_t ,
ZIndex =
}, part)
entry.billboard = (, {
Name = ,
Adornee = part,
AlwaysOnTop = ,
Size = .(o.width , o.height ),
StudsOffsetWorldSpace = .(, .(, part.Size.Y * + ), ),
MaxDistance = ,
LightInfluence =
}, gui)
entry.label = (entry.billboard, , o.text_size , o.color, {
Size = .(, ),
Font = .Font.GothamBold,
TextXAlignment = .TextXAlignment.Center,
TextWrapped = ,
TextStrokeTransparency = ,
TextStrokeColor3 = .(, , )
})
store[key] = entry
entry.label.Text = o.caption
(store, visible)
key, entry (store)
visible[key] entry.part entry.part:()
(entry)
store[key] =
(from_root, part)
from_root (.((from_root.Position - part.Position).Magnitude + ) .. )
V.(player)
entry = V.overlays[player]
entry
(entry)
V.overlays[player] =
V.()
player (V.overlays) V.(player)
V.()
V.sphere V.sphere:(); V.sphere =
ui.seeker_warning.Visible =
V.()
ui.closest_line.Visible =
ui.closest_label.Visible =
V.()
property, value (original_lighting)
lighting[property] = value
V.()
valid = {}
mine = (localplayer)
_, player (players:())
player ~= localplayer
valid[player] =
character = player.Character
root = (player)
settings.esp character root
entry = V.overlays[player]
entry entry.character ~= character entry.highlight entry.highlight.Parent
V.(player)
entry = { character = character }
entry.highlight = (, {
Name = ,
Adornee = character,
FillTransparency = ,
OutlineTransparency = ,
DepthMode = .HighlightDepthMode.AlwaysOnTop
}, character)
V.overlays[player] = entry
color = (player)
entry.highlight.FillColor = color
entry.highlight.OutlineColor = color
entry.box entry.box.Parent entry.box.Adornee ~= root
entry.box entry.box:()
entry.box = (, {
Name = ,
Adornee = root,
AlwaysOnTop = ,
Size = .(, , ),
Transparency = ,
ZIndex =
}, root)
entry.box.Color3 = color
head = character:() root
settings.labels
entry.billboard entry.billboard.Adornee ~= head
entry.billboard entry.billboard:()
entry.billboard = (, {
Name = ,
Adornee = head,
AlwaysOnTop = ,
Size = .(, ),
StudsOffsetWorldSpace = .(, , ),
MaxDistance =
}, head)
(entry.billboard, , , color, {
Size = .(, ),
Font = .Font.GothamBold,
TextXAlignment = .TextXAlignment.Center,
TextWrapped = ,
TextStrokeTransparency = ,
TextStrokeColor3 = .(, , )
})
display = entry.billboard:()
display
suffix =
settings.distance mine
suffix = .. .((mine.Position - root.Position).Magnitude) ..
display.Text = player.DisplayName .. .. (player) .. suffix
display.TextColor3 = color
entry.billboard
entry.billboard:()
entry.billboard =
V.(player)
player (V.overlays)
valid[player] V.(player)
V.()
settings.credit_esp
container = :()
visible = {}
mine = (localplayer)
container
_, part (container:())
part.Name == part:() part.Parent
collected = part:()
collected collected.Value
visible[part] =
d = (mine, part)
(V.credits, part, part, {
color = palette.gold, caption = .. (d ( .. d) ),
highlight = , fill = , box_t = , pad = ,
text_size = , width = , height =
})
(V.credits, visible)
V.()
settings.teleporter_esp
registry = gamedata:()
visible = {}
mine = (localplayer)
registry
_, object (registry:())
pad = object:() object.Value
pad pad:() pad:()
linked = pad:()
destination = linked linked:() linked.Value
name = destination destination:() destination:() destination.Name
d = (mine, pad)
visible[pad] =
(V.tele, pad, pad, {
color = palette.portal, caption = .. name .. (d ( .. d) ),
highlight = , box_t =
})
(V.tele, visible)
V.()
root = (localplayer)
settings.jump_pad_esp
visible = {}
_, object (collectionservice:())
part = (object)
part part:()
visible[object] =
d = (root, part)
(V.hz.jump, object, part, { color = palette.jump, caption = .. (d ( .. d) ) })
(V.hz.jump, visible)
objects = :()
glue_visible, camera_visible = {}, {}
objects (settings.glue_esp settings.camera_esp)
_, object (objects:())
name = .(object.Name)
part = (object)
part part:()
d = (root, part)
settings.glue_esp (name == name == name == name == name == )
glue_visible[object] =
(V.hz.glue, object, part, { color = palette.glue, caption = .. (d ( .. d) ) })
settings.camera_esp name:(, , ) name ~=
camera_visible[object] =
(V.hz.camera, object, part, { color = palette.camera, caption = .. (d ( .. d) ) })
settings.glue_esp (V.hz.glue, glue_visible)
settings.camera_esp (V.hz.camera, camera_visible)
V.()
settings.seeker_radius_esp (localplayer)
V.()
seeker = ()
seeker_root = seeker (seeker)
root = (localplayer)
root seeker_root
V.()
V.sphere V.sphere.Parent V.sphere.Adornee ~= seeker_root
V.sphere V.sphere:()
V.sphere = (, {
Name = ,
Adornee = seeker_root,
AlwaysOnTop = ,
= palette.danger,
Transparency = ,
Radius = settings.seeker_warning_distance,
ZIndex =
}, seeker_root)
V.sphere.Radius = settings.seeker_warning_distance
dist = .((seeker_root.Position - root.Position).Magnitude + )
danger = dist <= settings.seeker_warning_distance
ui.seeker_warning.Visible =
ui.seeker_warning.Text = (danger ) .. dist ..
ui.seeker_warning.TextColor3 = danger palette.danger palette.jump
V.()
settings.closest_credit_esp V.();
camera = .CurrentCamera
root = (localplayer)
credit = ()
camera root credit V.();
point, onscreen = camera:(credit.Position)
onscreen point.Z <= V.();
target = .(point.X, point.Y)
origin = .(camera.ViewportSize.X * , camera.ViewportSize.Y * )
delta = target - origin
length = delta.Magnitude
length < V.();
ui.closest_line.Size = .(length, )
ui.closest_line.Position = .((origin.X + target.X) / , (origin.Y + target.Y) / )
ui.closest_line.Rotation = .(.(delta.Y, delta.X))
ui.closest_line.Visible =
ui.closest_label.Position = .(
.(target.X - , , .(, camera.ViewportSize.X - )),
.(target.Y - , , .(, camera.ViewportSize.Y - ))
)
ui.closest_label.Text = .. .((root.Position - credit.Position).Magnitude + ) ..
ui.closest_label.Visible =
.(cleanups, ()
V.()
(V.credits)
(V.tele)
_, store (V.hz) (store)
V.()
V.()
settings.fullbright V.()
)
M.()
part, value (M.collisions)
part part.Parent part.CanCollide = value
M.collisions[part] =
M.(kind)
humanoid, baseline (M.baselines)
humanoid.Parent
kind == baseline.speed
humanoid.WalkSpeed = baseline.speed
baseline.speed =
kind == baseline.jump
humanoid.JumpPower = baseline.jump.power
humanoid.JumpHeight = baseline.jump.height
baseline.jump =
M.()
sprinting = .() < A.practice_end
(settings.speed settings.jump sprinting A.sprint_applied)
_, humanoid = (localplayer)
humanoid
baseline = M.baselines[humanoid]
baseline
baseline = {}
M.baselines[humanoid] = baseline
(settings.speed sprinting) baseline.speed
baseline.speed = humanoid.WalkSpeed
settings.jump baseline.jump
baseline.jump = { power = humanoid.JumpPower, height = humanoid.JumpHeight }
settings.speed sprinting
target = baseline.speed
settings.speed
target = move.subtle_speed .(baseline.speed * * + ) / move.speed
sprinting target = .(target, )
humanoid.WalkSpeed ~= target humanoid.WalkSpeed = target
sprinting
A.sprint_applied =
A.sprint_applied
A.sprint_applied =
settings.speed M.()
settings.jump
target_jump = move.subtle_jump .(baseline.jump.power * * + ) / move.jump
humanoid.UseJumpPower
humanoid.JumpPower ~= target_jump humanoid.JumpPower = target_jump
original = .(baseline.jump.power, )
target_height = baseline.jump.height * (target_jump / original) ^
.(humanoid.JumpHeight - target_height) > humanoid.JumpHeight = target_height
(runservice.Heartbeat, ()
alive M.()
)
(userinputservice.JumpRequest, ()
settings.infinite_jump
_, humanoid = (localplayer)
humanoid humanoid:(.HumanoidStateType.Jumping)
)
(runservice.Stepped, ()
alive settings.noclip
character = localplayer.Character
character
_, part (character:())
part:() part.CanCollide
M.collisions[part] == M.collisions[part] =
part.CanCollide =
)
.(cleanups, ()
M.()
M.()
M.()
()
)
F.(part, automated)
root = (localplayer)
root part part.Parent
automated
S.return_cframe = root.CFrame
F.loop_origin
F.loop_origin = root.CFrame
S.return_cframe = F.loop_origin
recent_credits[part] = .()
root.AssemblyLinearVelocity = .zero
root.CFrame = part.CFrame + .(, , )
F.()
part, original (F.pulled_credits)
part.Parent (() part.CFrame = original )
F.pulled_credits[part] =
F.(target)
mine = (localplayer)
theirs = (target)
mine theirs target == localplayer
destination = mine.CFrame * .(, , )
ok = (()
target.Character:(destination)
theirs.CFrame = destination
)
now = .()
ok () == now - F.last_touch >=
F.last_touch = now
(()
(mine, theirs, )
(mine, theirs, )
)
ok F.pull_ticks +=
ok
F.()
F.credit_inflight
part = ()
root = (localplayer)
part root F.pulled_credits[part]
original = part.CFrame
F.pulled_credits[part] = original
recent_credits[part] = .() +
F.credit_inflight =
data = localplayer:()
balance = data data:()
start_balance = balance balance.Value
.(()
started = .()
alive settings.pull_credits part.Parent F.pulled_credits[part] == original .() - started <
current = (localplayer)
collected = part:()
current (collected collected.Value)
(() part.CFrame = .(current.Position) * original.Rotation )
.()
F.pulled_credits[part] == original
part.Parent (() part.CFrame = original )
F.pulled_credits[part] =
.()
F.credit_inflight =
)
F.()
root = (localplayer)
root
now = .()
target = F.lobby_target
target_root = (target)
target target.Parent ~= players (target) (target) target_root now - F.lobby_started >=
target = ()
F.lobby_target = target
F.lobby_started = now
(target) F.lobby_targets +=
target
F.(target)
F.()
running = gamedata:()
seeking = gamedata:()
settings.auto_evade (localplayer) (localplayer) running running.Value
.(F.safe_positions)
mine = (localplayer)
seeker = ()
seeker_root = (seeker)
mine seeker_root seeker == localplayer
now = .()
distance = (mine.Position - seeker_root.Position).Magnitude
distance > now - F.last_safe >
last = F.safe_positions[#F.safe_positions]
last (last.cf.Position - mine.Position).Magnitude >
.(F.safe_positions, { cf = mine.CFrame, t = now })
#F.safe_positions > .(F.safe_positions, )
F.last_safe = now
seeking seeking.Value distance > now - F.last_escape <
destination
best =
_, spot (F.safe_positions)
d = (spot.cf.Position - seeker_root.Position).Magnitude
now - spot.t < d > best (spot.cf.Position - mine.Position).Magnitude >
best, destination = d, spot.cf
_, player (players:())
player ~= localplayer player ~= seeker (player) (player)
other = (player)
other
d = (other.Position - seeker_root.Position).Magnitude
d > best (other.Position - mine.Position).Magnitude >
best, destination = d, other.CFrame * .(, , )
destination
F.last_escape = now
mine.AssemblyLinearVelocity = .zero
mine.CFrame = destination
()
now - F.last_notice >
F.last_notice = now
()
.(cleanups, F.restore_pulled)
A.()
handler = A.handler
handler
handler.SetCooldown == A.set_hook handler.SetCooldown = A.set_original
handler.MarkAbilityAsActive == A.mark_hook handler.MarkAbilityAsActive = A.mark_original
A.handler, A.set_original, A.mark_original, A.set_hook, A.mark_hook = , , , ,
A.active, A.active_known = ,
A.()
A.handler A.handler.SetCooldown == A.set_hook
scripts = localplayer:()
modules = scripts scripts:()
module_script = modules modules:()
module_script A.last_result = ;
ok, module = (, module_script)
ok (module) ~= (module.SetCooldown) ~=
A.last_result =
A.handler A.handler ~= module A.()
A.handler == module
module.SetCooldown == A.set_hook
A.()
A.handler = module
A.set_original = module.SetCooldown
A.mark_original = module.MarkAbilityAsActive
A.set_hook = (self, duration, ...)
alive settings.it_no_cooldown (localplayer) (duration) ==
duration > A.intercepts +=
duration =
A.(self, duration, ...)
module.SetCooldown = A.set_hook
(A.mark_original) ==
A.mark_hook = (self, active, ...)
result = A.(self, active, ...)
alive
A.active_known =
A.active = active ==
result
module.MarkAbilityAsActive = A.mark_hook
A.()
running = gamedata:()
seeking = gamedata:()
character = localplayer.Character
root, humanoid = (localplayer)
running running.Value seeking seeking.Value (localplayer)
root ~= humanoid ~= character character:() ==
A.()
data = localplayer:()
equipped = data data:()
wanted = equipped (equipped.Value)
wanted wanted ==
main = playergui:()
shop = main main:()
shop
_, child (shop:())
child.Name ==
character = child:()
character (character.Value) == wanted
ability = child:()
ability ability:() ability.Value
A.()
A.() A.last_result = ;
main = playergui:()
frame = main main:()
control = frame frame:()
control A.last_result = ;
(firesignal) ==
ok = (firesignal, control.MouseButton1Click)
ok
A.last_result =
A.attempts +=
ok = (()
virtual_input = :()
virtual_input:(, .KeyCode.One, , )
virtual_input:(, .KeyCode.One, , )
)
ok
A.last_result =
A.attempts +=
A.last_result =
A.()
A.() A.handler A.()
now = .()
now - A.last_clear <
ok, err = (A.set_original, A.handler, )
ok
A.last_clear = now
A.clears +=
A.err =
A.err = (err)
ok
(obj)
.(A.objects, obj)
obj
A.()
(localplayer) ();
A.practice_end = .() +
A.last_result =
()
A.()
root = (localplayer)
root
ground = :(root.Position, .(, -, ))
point = ground ground.Position root.Position - .(, , )
glue = ((, {
Name = ,
Anchored = , CanCollide = , CanTouch = ,
Material = .Material.Neon,
Color = .(, , ),
Transparency = ,
Shape = .PartType.Ball,
Size = .(, , ),
= .(point + .(, , ))
}, ))
.(, () glue.Parent glue:() )
A.last_result =
()
A.()
camera = .CurrentCamera
root = (localplayer)
camera root
A.practice_camera
camera.CameraType = A.practice_camera.kind
camera.CameraSubject = A.practice_camera.subject
camera.CFrame = A.practice_camera.cf
A.practice_camera =
A.last_result =
()
A.practice_camera = { kind = camera.CameraType, subject = camera.CameraSubject, cf = camera.CFrame }
camera.CameraType = .CameraType.Scriptable
camera.CFrame = .(root.Position + root.CFrame.LookVector * + .(, , ), root.Position)
A.last_result =
()
A.()
root = (localplayer)
root
ring = ((, {
Name = ,
Anchored = , CanCollide = , CanTouch = ,
Shape = .PartType.Ball,
Size = .(, , ),
= .(root.Position - .(, , )),
Material = .Material.Neon,
Color = palette.accent,
Transparency =
}, ))
tweenservice:(ring, TweenInfo.(), { Size = .(, , ), Transparency = }):()
.(, () ring.Parent ring:() )
A.last_result =
()
.(cleanups, ()
A.()
A.practice_camera .CurrentCamera
camera = .CurrentCamera
camera.CameraType = A.practice_camera.kind
camera.CameraSubject = A.practice_camera.subject
camera.CFrame = A.practice_camera.cf
A.practice_camera =
_, item (A.objects)
item.Parent item:()
)
()
alive settings.anti_afk
ok = (()
virtualuser:()
virtualuser:(.(, ))
)
ok
S.afk_pulses +=
S.last_pulse = .()
ok
(localplayer.Idled, () () )
(, ()
settings.anti_afk .() - S.last_pulse >= ()
)
viewport = .CurrentCamera .CurrentCamera.ViewportSize .(, )
win_w = .(viewport.X - , , )
win_h = .(viewport.Y - , , )
HEADER, SIDEBAR = ,
window = (, {
Name = ,
AnchorPoint = .(, ),
Position = .(, ),
Size = .(win_w, win_h),
BackgroundColor3 = palette.background,
BorderSizePixel = ,
Active = ,
ClipsDescendants =
}, gui)
(window, )
(window, palette.border)
(, { MinSize = .(, HEADER), MaxSize = .(, ) }, window)
header = (, {
Name = ,
Size = .(, , , HEADER),
BackgroundColor3 = palette.side,
BorderSizePixel = ,
Active =
}, window)
(, {
Position = .(, , , -), Size = .(, , , ),
BackgroundColor3 = palette.border, BorderSizePixel =
}, header)
moon = (, {
Position = .(, ), Size = .(, ),
BackgroundColor3 = palette.lilac, BorderSizePixel =
}, header)
(moon, )
moon_cut = (, {
Position = .(, -), Size = .(, ),
BackgroundColor3 = palette.side, BorderSizePixel =
}, moon)
(moon_cut, )
(header, , , palette.text, {
Position = .(, ), Size = .(, HEADER), Font = .Font.GothamBold
})
(header, , , palette.dim, {
Position = .(, ), Size = .(, HEADER)
})
controls = (, {
AnchorPoint = .(, ),
Position = .(, -, , ),
Size = .(, ),
AutomaticSize = .AutomaticSize.X,
BackgroundTransparency =
}, header)
(, {
FillDirection = .FillDirection.Horizontal,
HorizontalAlignment = .HorizontalAlignment.Right,
VerticalAlignment = .VerticalAlignment.Center,
SortOrder = .SortOrder.LayoutOrder,
Padding = .(, )
}, controls)
ui.stats = (controls, , , palette.muted, {
Size = .(, ), TextXAlignment = .TextXAlignment.Right,
Font = .Font.GothamMedium, LayoutOrder =
})
ui.afk = (, {
Size = .(, ), LayoutOrder = , BorderSizePixel = ,
Font = .Font.GothamBold, TextSize = , Text = , AutoButtonColor = ,
BackgroundColor3 = palette.raised
}, controls)
(ui.afk, )
afk_stroke = (ui.afk, palette.success, )
()
on = settings.anti_afk
ui.afk.Text = on
ui.afk.TextColor3 = on palette.success palette.muted
ui.afk.BackgroundColor3 = on .(, , ) palette.raised
afk_stroke.Color = on palette.success palette.border
(, render_afk_badge)
()
(ui.afk.MouseButton1Click, ()
settings.anti_afk = settings.anti_afk
()
storage.()
( .. (settings.anti_afk ))
)
log_button = (controls, , .(), .(, ), ()
ui.log_panel.Visible = ui.log_panel.Visible
ui.log_panel.Visible ui.results.Visible = ; ui.()
)
log_button.LayoutOrder =
min_button = (controls, , .(), .(, ), () )
min_button.LayoutOrder =
min_button.TextSize =
close_button = (controls, , .(), .(, ), () )
close_button.LayoutOrder =
close_button.TextColor3 = palette.danger
sidebar = (, {
Name = , Position = .(, HEADER),
Size = .(, SIDEBAR, , -HEADER),
BackgroundColor3 = palette.side, BorderSizePixel =
}, window)
(, {
Position = .(, -, , ), Size = .(, , , ),
BackgroundColor3 = palette.border, BorderSizePixel =
}, sidebar)
ui.search = (, {
Position = .(, ), Size = .(, -, , ),
BackgroundColor3 = palette.background, BorderSizePixel = ,
PlaceholderText = , PlaceholderColor3 = palette.dim,
ClearTextOnFocus = , Text = , Font = .Font.Gotham, TextSize = ,
TextColor3 = palette.text, TextXAlignment = .TextXAlignment.Left
}, sidebar)
(ui.search, )
(ui.search)
(, { PaddingLeft = .(, ), PaddingRight = .(, ) }, ui.search)
search_icon = (, {
Position = .(, -, , ), Size = .(, ),
BackgroundColor3 = palette.accentdark, BorderSizePixel = , Text = , AutoButtonColor =
}, sidebar)
(search_icon, )
lens = (, {
Position = .(, ), Size = .(, ), BackgroundTransparency =
}, search_icon)
(lens, )
(, {
Color = palette.lilac, Thickness = , ApplyStrokeMode = .ApplyStrokeMode.Border
}, lens)
(, {
Position = .(, ), Size = .(, ), Rotation = ,
BackgroundColor3 = palette.lilac, BorderSizePixel =
}, search_icon)
(search_icon.MouseButton1Click, () ui.search:() )
nav = (, {
Name = , Position = .(, ), Size = .(, -, , -),
CanvasSize = .(), AutomaticCanvasSize = .AutomaticSize.Y,
BackgroundTransparency = , BorderSizePixel = ,
ScrollBarThickness = , ScrollBarImageColor3 = palette.accent
}, sidebar)
(, { Padding = .(, ), SortOrder = .SortOrder.LayoutOrder }, nav)
(sidebar, , , palette.dim, {
Position = .(, , , -), Size = .(, -, , ), Font = .Font.GothamMedium
})
content = (, {
Name = , Position = .(SIDEBAR, HEADER),
Size = .(, -SIDEBAR, , -HEADER),
BackgroundColor3 = palette.surface, BorderSizePixel =
}, window)
ui.title = (content, , , palette.text, {
Position = .(, ), Size = .(, -, , ), Font = .Font.GothamBold
})
ui.subtitle = (content, , , palette.muted, {
Position = .(, ), Size = .(, -, , ), TextTruncate = .TextTruncate.AtEnd
})
ui.tag = (content, , , palette.accent, {
AnchorPoint = .(, ), Position = .(, -, , ), Size = .(, -, , ),
TextXAlignment = .TextXAlignment.Right, Font = .Font.GothamBold
})
ui.status = (content, , , palette.muted, {
AnchorPoint = .(, ), Position = .(, -, , ), Size = .(, -, , ),
TextXAlignment = .TextXAlignment.Right, TextTruncate = .TextTruncate.AtEnd
})
(, {
Position = .(, ), Size = .(, -, , ),
BackgroundColor3 = palette.border, BorderSizePixel =
}, content)
(, {
Position = .(, , , -), Size = .(, -, , ),
BackgroundColor3 = palette.border, BorderSizePixel =
}, content)
ui.message = (content, , , palette.muted, {
Position = .(, , , -), Size = .(, -, , ), TextTruncate = .TextTruncate.AtEnd
})
(content, , , palette.dim, {
AnchorPoint = .(, ), Position = .(, -, , -), Size = .(, ),
TextXAlignment = .TextXAlignment.Right
})
tab_defs = {
{ , { { , }, { , }, { , } } },
{ , { { , }, { , }, { , }, { , }, { , } } },
{ , { { , }, { , } } }
}
page_titles = {
home = { , },
players = { , },
autofarm = { , },
visuals = { , },
movement = { , },
farming = { , },
abilities = { , },
shop = { , },
tests = { , },
config = { , }
}
pages, tabs = {}, {}
current_page =
(name)
current_page = name
info_ = page_titles[name]
ui.title.Text = info_[]
ui.subtitle.Text = info_[]
ui.tag.Text = .(info_[])
ui.results.Visible =
ui.log_panel.Visible =
page_name, frame (pages)
frame.Visible = S.minimized page_name == name
tab_name, control (tabs)
selected_tab = tab_name == name
control.BackgroundTransparency = selected_tab
control.TextColor3 = selected_tab palette.lilac palette.muted
control.Diamond.BackgroundColor3 = selected_tab palette.accent palette.dim
page_order = {}
_, group (tab_defs)
label = (nav, group[], , palette.dim, {
Size = .(, , , ), Font = .Font.GothamBold, LayoutOrder = (nav)
})
(, { PaddingLeft = .(, ), PaddingTop = .(, ) }, label)
_, def (group[])
.(page_order, def[])
tab = (, {
Size = .(, -, , ), BackgroundColor3 = palette.accentdark, BackgroundTransparency = ,
BorderSizePixel = , Text = def[], TextSize = , Font = .Font.GothamMedium,
TextColor3 = palette.muted, TextXAlignment = .TextXAlignment.Left,
AutoButtonColor = , LayoutOrder = (nav)
}, nav)
(tab, )
(, { PaddingLeft = .(, ) }, tab)
(, {
Name = , Position = .(-, 0), Size = UDim2.fromOffset(5, 5),
Rotation = 45, BackgroundColor3 = palette.dim, BorderSizePixel = 0
}, tab)
tabs[def[1]] = tab
bind(tab.MouseButton1Click, function() show_page(def[1]) end)
end
end
for _, name in ipairs(page_order) do
local page = new('ScrollingFrame', {
Name = name, Position = UDim2.fromOffset(10, 56), Size = UDim2.new(1, -20, 1, -86),
CanvasSize = UDim2.new(), AutomaticCanvasSize = Enum.AutomaticSize.Y,
BackgroundTransparency = 1, BorderSizePixel = 0,
ScrollBarThickness = 3, ScrollBarImageColor3 = palette.accent, Visible = false
}, content)
new('UIListLayout', { Padding = UDim.new(0, 5), SortOrder = Enum.SortOrder.LayoutOrder }, page)
new('UIPadding', { PaddingRight = UDim.new(0, 7), PaddingBottom = UDim.new(0, 4) }, page)
pages[name] = page
end
ui.results = new('ScrollingFrame', {
Position = UDim2.fromOffset(10, 56), Size = UDim2.new(1, -20, 1, -86),
CanvasSize = UDim2.new(), AutomaticCanvasSize = Enum.AutomaticSize.Y,
BackgroundColor3 = palette.background, BorderSizePixel = 0,
ScrollBarThickness = 3, ScrollBarImageColor3 = palette.accent, Visible = false, ZIndex = 40
}, content)
round(ui.results, 6)
stroke(ui.results)
new('UIListLayout', { Padding = UDim.new(0, 4), SortOrder = Enum.SortOrder.LayoutOrder }, ui.results)
new('UIPadding', {
PaddingTop = UDim.new(0, 6), PaddingBottom = UDim.new(0, 6),
PaddingLeft = UDim.new(0, 6), PaddingRight = UDim.new(0, 8)
}, ui.results)
ui.log_panel = new('ScrollingFrame', {
Position = UDim2.fromOffset(10, 56), Size = UDim2.new(1, -20, 1, -86),
CanvasSize = UDim2.new(), AutomaticCanvasSize = Enum.AutomaticSize.Y,
BackgroundColor3 = palette.background, BorderSizePixel = 0,
ScrollBarThickness = 3, ScrollBarImageColor3 = palette.accent, Visible = false, ZIndex = 45
}, content)
round(ui.log_panel, 6)
stroke(ui.log_panel)
new('UIPadding', {
PaddingTop = UDim.new(0, 8), PaddingBottom = UDim.new(0, 8),
PaddingLeft = UDim.new(0, 10), PaddingRight = UDim.new(0, 10)
}, ui.log_panel)
local log_label = text(ui.log_panel, '', 10, palette.muted, {
Size = UDim2.new(1, 0, 0, 0), AutomaticSize = Enum.AutomaticSize.Y,
TextWrapped = true, TextYAlignment = Enum.TextYAlignment.Top
})
function ui.refresh_log()
if not ui.log_panel.Visible then return end
local lines = {}
for i = #logs, 1, -1 do table.insert(lines, logs[i]) end
log_label.Text = #lines > 0 and table.concat(lines, '\n') or 'No activity yet.'
end
local search_index = {}
local function heading(pagename, content_text)
local page = pages[pagename]
return text(page, content_text, 10, palette.accent, {
Size = UDim2.new(1, 0, 0, 18), Font = Enum.Font.GothamBold,
TextYAlignment = Enum.TextYAlignment.Bottom, LayoutOrder = nextorder(page)
})
end
local function info(pagename, content_text, color, size)
local page = pages[pagename]
return text(page, content_text, size or 10, color or palette.muted, {
Size = UDim2.new(1, 0, 0, 0), AutomaticSize = Enum.AutomaticSize.Y,
TextWrapped = true, TextYAlignment = Enum.TextYAlignment.Top, LayoutOrder = nextorder(page)
})
end
local function make_card(pagename, border_color)
local page = pages[pagename]
local card = new('Frame', {
Size = UDim2.new(1, 0, 0, 0), AutomaticSize = Enum.AutomaticSize.Y,
BackgroundColor3 = palette.card, BorderSizePixel = 0, LayoutOrder = nextorder(page)
}, page)
round(card, 6)
stroke(card, border_color)
new('UIPadding', {
PaddingTop = UDim.new(0, 8), PaddingBottom = UDim.new(0, 8),
PaddingLeft = UDim.new(0, 10), PaddingRight = UDim.new(0, 10)
}, card)
new('UIListLayout', { Padding = UDim.new(0, 3), SortOrder = Enum.SortOrder.LayoutOrder }, card)
return card
end
local function status_card(pagename, color)
local card = make_card(pagename)
return text(card, '', 11, color or palette.text, {
Size = UDim2.new(1, 0, 0, 0), AutomaticSize = Enum.AutomaticSize.Y,
TextWrapped = true, TextYAlignment = Enum.TextYAlignment.Top
})
end
local function warn_card(pagename, title, body)
local card = make_card(pagename, palette.danger)
text(card, title, 10, palette.danger, { Size = UDim2.new(1, 0, 0, 14), Font = Enum.Font.GothamBold, LayoutOrder = 1 })
return text(card, body, 10, palette.muted, {
Size = UDim2.new(1, 0, 0, 0), AutomaticSize = Enum.AutomaticSize.Y,
TextWrapped = true, TextYAlignment = Enum.TextYAlignment.Top, LayoutOrder = 2
})
end
local function make_row(pagename, title, desc, reserve)
local page = pages[pagename]
local row = new('Frame', {
Size = UDim2.new(1, 0, 0, 38), BackgroundColor3 = palette.card,
BorderSizePixel = 0, LayoutOrder = nextorder(page)
}, page)
round(row, 6)
stroke(row)
text(row, title, 12, palette.text, {
Position = UDim2.fromOffset(10, 3), Size = UDim2.new(1, -(reserve + 14), 0, 17),
Font = Enum.Font.GothamMedium, TextTruncate = Enum.TextTruncate.AtEnd
})
text(row, desc, 10, palette.muted, {
Position = UDim2.fromOffset(10, 20), Size = UDim2.new(1, -(reserve + 14), 0, 14),
TextTruncate = Enum.TextTruncate.AtEnd
})
table.insert(search_index, { page = pagename, title = title, desc = desc, row = row })
return row
end
local function add_switch(row, key, callback, title)
local track = new('TextButton', {
AnchorPoint = Vector2.new(1, 0.5), Position = UDim2.new(1, -10, 0.5, 0),
Size = UDim2.fromOffset(34, 18), Text = '', AutoButtonColor = false,
BorderSizePixel = 0, BackgroundColor3 = palette.raised
}, row)
round(track, 9)
local knob = new('Frame', {
Size = UDim2.fromOffset(12, 12), Position = UDim2.fromOffset(3, 3),
BorderSizePixel = 0, BackgroundColor3 = palette.muted
}, track)
round(knob, 6)
local function render()
local on = settings[key] == true
track.BackgroundColor3 = on and palette.accentmid or palette.raised
tweenservice:Create(knob, TweenInfo.new(0.12), {
Position = on and UDim2.fromOffset(19, 3) or UDim2.fromOffset(3, 3),
BackgroundColor3 = on and palette.text or palette.muted
}):Play()
end
register_render(key, render)
render()
bind(track.MouseButton1Click, function()
settings[key] = not settings[key]
if callback then callback(settings[key]) end
update_toggle(key)
storage.schedule()
notify(title .. ': ' .. (settings[key] and 'enabled' or 'disabled'))
end)
end
local function add_input(row, right, value, min_value, max_value, apply)
local box = new('TextBox', {
AnchorPoint = Vector2.new(1, 0.5), Position = UDim2.new(1, -right, 0.5, 0),
Size = UDim2.fromOffset(52, 22), BackgroundColor3 = palette.background, BorderSizePixel = 0,
Font = Enum.Font.Gotham, TextSize = 11, TextColor3 = palette.text,
Text = tostring(value), ClearTextOnFocus = false
}, row)
round(box, 5)
stroke(box)
box:SetAttribute('last', value)
bind(box.FocusLost, function()
local number = tonumber(box.Text)
if not number then
box.Text = tostring(box:GetAttribute('last'))
return
end
number = math.floor(math.clamp(number, min_value, max_value) * 10 + 0.5) / 10
box.Text = tostring(number)
box:SetAttribute('last', number)
apply(number)
end)
return box
end
local function toggle(pagename, title, desc, key, callback, input)
local row = make_row(pagename, title, desc, input and 120 or 56)
if input then add_input(row, 54, input.value, input.min, input.max, input.apply) end
add_switch(row, key, callback, title)
return row
end
local function input_row(pagename, title, desc, value, min_value, max_value, apply)
local row = make_row(pagename, title, desc, 70)
return add_input(row, 10, value, min_value, max_value, apply)
end
local function buttons(pagename, defs)
local page = pages[pagename]
local holder = new('Frame', {
Size = UDim2.new(1, 0, 0, 28), BackgroundTransparency = 1, LayoutOrder = nextorder(page)
}, page)
new('UIListLayout', {
FillDirection = Enum.FillDirection.Horizontal, Padding = UDim.new(0, 6), SortOrder = Enum.SortOrder.LayoutOrder
}, holder)
local n = #defs
local made = {}
for i, def in ipairs(defs) do
local control = button(holder, def[1], UDim2.new(), UDim2.new(1 / n, -6 * (n - 1) / n, 1, 0), def[2], def[3])
control.LayoutOrder = i
table.insert(search_index, { page = pagename, title = def[1], desc = 'Action', row = holder })
made[i] = control
end
return made
end
local on = {}
function on.esp(enabled) if not enabled then V.clear_players() end end
function on.credit_esp(enabled) if not enabled then clear_store(V.credits) end end
function on.teleporter_esp(enabled) if not enabled then clear_store(V.tele) end end
function on.jump_pad_esp(enabled) if not enabled then clear_store(V.hz.jump) end end
function on.glue_esp(enabled) if not enabled then clear_store(V.hz.glue) end end
function on.camera_esp(enabled) if not enabled then clear_store(V.hz.camera) end end
function on.seeker_radius_esp(enabled) if not enabled then V.clear_seeker_radius() end end
function on.closest_credit_esp(enabled) if not enabled then V.clear_closest_line() end end
function on.fullbright(enabled) if not enabled then V.restore_lighting() end end
function on.speed(enabled) if not enabled then M.restore('speed') end end
function on.jump(enabled) if not enabled then M.restore('jump') end end
function on.noclip(enabled) if not enabled then M.reset_collisions() end end
function on.auto_credits(enabled)
F.loop_origin = nil
if enabled then
settings.pull_credits = false
update_toggle('pull_credits')
F.restore_pulled()
F.credit_attempts = 0
end
end
function on.pull_credits(enabled)
if enabled then
settings.auto_credits = false
update_toggle('auto_credits')
else
F.restore_pulled()
end
end
function on.pull_lobby(enabled)
F.lobby_target = nil
F.lobby_started = 0
if enabled then
settings.auto_seek = false
update_toggle('auto_seek')
notify('Pulling lobby players. Client-only: tags and rewards are not confirmed.')
end
end
function on.auto_seek(enabled)
if enabled then
settings.pull_lobby = false
update_toggle('pull_lobby')
end
end
function on.it_no_cooldown(enabled)
if enabled then
A.bridge()
A.clear_cooldown()
elseif not settings.it_keep_active then
A.clear_hooks()
end
end
function on.it_keep_active(enabled)
if enabled then
A.bridge()
A.sprint_first = nil
A.last_attempt = 0
elseif not settings.it_no_cooldown then
A.clear_hooks()
end
end
do
heading('home', 'QUICK ACCESS')
local grid = new('Frame', {
Size = UDim2.new(1, 0, 0, 0), AutomaticSize = Enum.AutomaticSize.Y,
BackgroundTransparency = 1, LayoutOrder = nextorder(pages.home)
}, pages.home)
new('UIGridLayout', {
CellSize = UDim2.new(1 / 3, -4, 0, 28), CellPadding = UDim2.fromOffset(6, 6),
SortOrder = Enum.SortOrder.LayoutOrder
}, grid)
local cards = {
{ 'ESP', 'visuals' }, { 'Players', 'players' }, { 'Movement', 'movement' },
{ 'Auto Farm', 'autofarm' }, { 'Abilities', 'abilities' }, { 'Shop', 'shop' },
{ 'Farming', 'farming' }, { 'Config', 'config' }, { 'Search Everything', 'search' }
}
for i, def in ipairs(cards) do
local card = new('TextButton', {
BackgroundColor3 = palette.card, BorderSizePixel = 0, Text = '', AutoButtonColor = true, LayoutOrder = i
}, grid)
round(card, 5)
stroke(card)
new('Frame', {
Position = UDim2.fromOffset(10, 12), Size = UDim2.fromOffset(5, 5), Rotation = 45,
BackgroundColor3 = palette.accent, BorderSizePixel = 0
}, card)
text(card, def[1], 11, palette.text, {
Position = UDim2.fromOffset(24, 0), Size = UDim2.new(1, -24, 1, 0), Font = Enum.Font.GothamMedium
})
if def[2] ~= 'search' then
text(card, 'OPEN >', 9, palette.lilac, {
AnchorPoint = Vector2.new(1, 0), Position = UDim2.new(1, -8, 0, 0), Size = UDim2.fromOffset(40, 28),
TextXAlignment = Enum.TextXAlignment.Right
})
end
bind(card.MouseButton1Click, function()
if def[2] == 'search' then ui.search:CaptureFocus() else show_page(def[2]) end
end)
end
heading('home', 'STATUS')
ui.home_status = status_card('home')
heading('home', 'SEEKER CHANCE')
ui.home_chance = status_card('home')
heading('home', 'QUICK TOGGLES')
toggle('home', 'Player ESP', 'Highlight players through walls', 'esp', on.esp)
toggle('home', 'Credit ESP', 'Highlight uncollected credits', 'credit_esp', on.credit_esp)
toggle('home', 'Anti-AFK', 'Keeps you from being idle-kicked', 'anti_afk')
end
do
local page = pages.players
ui.roster = text(page, 'PLAYERS', 10, palette.accent, {
Size = UDim2.new(1, 0, 0, 18), Font = Enum.Font.GothamBold,
TextYAlignment = Enum.TextYAlignment.Bottom, LayoutOrder = nextorder(page)
})
local filter = new('TextBox', {
Size = UDim2.new(1, 0, 0, 26), BackgroundColor3 = palette.background, BorderSizePixel = 0,
PlaceholderText = 'Filter player or display name...', PlaceholderColor3 = palette.dim,
ClearTextOnFocus = false, Text = '', Font = Enum.Font.Gotham, TextSize = 11,
TextColor3 = palette.text, TextXAlignment = Enum.TextXAlignment.Left, LayoutOrder = nextorder(page)
}, page)
round(filter, 5)
stroke(filter)
new('UIPadding', { PaddingLeft = UDim.new(0, 9), PaddingRight = UDim.new(0, 6) }, filter)
local list = new('ScrollingFrame', {
Size = UDim2.new(1, 0, 0, 124), BackgroundColor3 = palette.background, BorderSizePixel = 0,
ScrollBarThickness = 3, ScrollBarImageColor3 = palette.accent,
CanvasSize = UDim2.new(), AutomaticCanvasSize = Enum.AutomaticSize.Y, LayoutOrder = nextorder(page)
}, page)
round(list, 6)
stroke(list)
new('UIListLayout', { Padding = UDim.new(0, 3), SortOrder = Enum.SortOrder.LayoutOrder }, list)
new('UIPadding', {
PaddingTop = UDim.new(0, 4), PaddingBottom = UDim.new(0, 4),
PaddingLeft = UDim.new(0, 4), PaddingRight = UDim.new(0, 6)
}, list)
ui.selected_label = text(page, 'Selected: nobody', 11, palette.text, {
Size = UDim2.new(1, 0, 0, 18), TextTruncate = Enum.TextTruncate.AtEnd, LayoutOrder = nextorder(page)
})
local rows = {}
local function priority(player)
if isit(player) then return 0 end
if ingame(player) then return 1 end
return 2
end
local function sorted_roster()
local roster = players:GetPlayers()
table.sort(roster, function(a, b)
local ap, bp = priority(a), priority(b)
if ap ~= bp then return ap < bp end
return string.lower(a.Name) < string.lower(b.Name)
end)
return roster
end
function ui.refresh_players()
for _, child in ipairs(list:GetChildren()) do
if child:IsA('TextButton') then child:Destroy() end
end
table.clear(rows)
local query = string.lower(filter.Text)
for index, player in ipairs(sorted_roster()) do
if query == '' or string.find(string.lower(player.Name), query, 1, true) or string.find(string.lower(player.DisplayName), query, 1, true) then
local control = new('TextButton', {
Size = UDim2.new(1, 0, 0, 24), BackgroundColor3 = palette.raised, BorderSizePixel = 0,
Text = player.DisplayName, TextSize = 10, TextColor3 = palette.text,
TextTruncate = Enum.TextTruncate.AtEnd, TextXAlignment = Enum.TextXAlignment.Left,
Font = Enum.Font.GothamMedium, LayoutOrder = index
}, list)
round(control, 5)
new('UIPadding', { PaddingLeft = UDim.new(0, 8), PaddingRight = UDim.new(0, 6) }, control)
rows[player] = control
bind(control.MouseButton1Click, function()
S.selected = player
notify('Target set to ' .. player.Name .. '.')
end)
end
end
if S.selected and S.selected.Parent ~= players then S.selected = nil end
end
function ui.update_rows()
local myroot = getroot(localplayer)
local ordered = sorted_roster()
local counts = { 0, 0, 0 }
for index, player in ipairs(ordered) do
local p = priority(player)
counts[p + 1] += 1
local row = rows[player]
if row and row.LayoutOrder ~= index then row.LayoutOrder = index end
end
ui.roster.Text = string.format('PLAYERS / IT %d - HIDERS %d - LOBBY %d', counts[1], counts[2], counts[3])
for player, control in pairs(rows) do
if control.Parent and player.Parent == players then
local root = getroot(player)
local distance = myroot and root and math.floor((myroot.Position - root.Position).Magnitude + 0.5)
control.Text = player.DisplayName .. (player == localplayer and ' (YOU)' or '') .. ' | ' .. role_of(player) .. (distance and (' | ' .. distance .. ' studs') or '')
control.TextColor3 = isit(player) and palette.danger or (ingame(player) and palette.text or palette.dim)
control.BackgroundColor3 = player == S.selected and palette.accentdark or palette.raised
end
end
if S.selected and S.selected.Parent == players then
ui.selected_label.Text = 'Selected: ' .. S.selected.DisplayName .. ' (@' .. S.selected.Name .. ')'
else
ui.selected_label.Text = 'Selected: nobody'
end
end
bind(filter:GetPropertyChangedSignal('Text'), ui.refresh_players)
bind(players.PlayerAdded, ui.refresh_players)
bind(players.PlayerRemoving, function(player)
if S.selected == player then S.selected = nil end
task.defer(function() if alive then ui.refresh_players() end end)
end)
buttons('players', {
{ 'TELEPORT TO PLAYER', function() teleport(S.selected) end, true },
{ 'NEAREST HIDER', function()
if not isit(localplayer) then notify('Nearest hider teleport requires being It.'); return end
teleport(nearest_hider())
end }
})
buttons('players', {
{ 'SPECTATE / STOP', function()
if S.spectating then restore_camera(); notify('Spectating stopped.'); return end
local _, humanoid = getroot(S.selected)
if not humanoid then notify('Choose a living player to spectate.'); return end
S.spectating = S.selected
if workspace.CurrentCamera then workspace.CurrentCamera.CameraSubject = humanoid end
notify('Spectating ' .. S.selected.Name .. '.')
end }
})
toggle('players', 'Auto evade It', 'Escape to a known safe spot before It reaches you', 'auto_evade', function(enabled)
if not enabled then table.clear(F.safe_positions) end
end)
heading('players', 'PLAYER FLING')
info('players', 'Spin into one player or all except It. Auto Farm movement pauses during fling and resumes afterward; server-side results are not guaranteed.', palette.muted, 10)
local fling = {
active = false, token = 0, power = 1300, attempts = 0, skipped = 0,
last = 'none', mode = 'idle', original = nil, spinner = nil,
attachment = nil, last_root = nil, last_humanoid = nil
}
input_row('players', 'Spin strength', 'Classic fling rotation (300-3000)', fling.power, 300, 3000, function(value)
fling.power = math.floor(value)
end)
local fling_status = status_card('players')
local function restore_fling()
if fling.spinner then pcall(function() fling.spinner:Destroy() end) end
if fling.attachment then pcall(function() fling.attachment:Destroy() end) end
fling.spinner, fling.attachment = nil, nil
local original, root, humanoid = fling.original, fling.last_root, fling.last_humanoid
fling.original, fling.last_root, fling.last_humanoid = nil, nil, nil
if root and root.Parent then
pcall(function()
root.AssemblyLinearVelocity = Vector3.zero
root.AssemblyAngularVelocity = Vector3.zero
if original and root == getroot(localplayer) then root.CFrame = original.cf end
end)
end
if humanoid and humanoid.Parent and original then
pcall(function()
humanoid.PlatformStand = original.stand
humanoid.AutoRotate = original.rotate
if not original.stand then humanoid:ChangeState(Enum.HumanoidStateType.GettingUp) end
end)
end
end
local function stop_fling()
fling.token += 1
fling.active = false
fling.mode = 'stopped'
restore_fling()
S.fling_active = false
end
local function eligible_fling_target(player)
return player and player ~= localplayer and player.Parent == players
and not isit(player) and getroot(player) ~= nil
end
local function spin_at(player, token)
local myroot, humanoid = getroot(localplayer)
if not myroot or not humanoid or not eligible_fling_target(player) then return false end
fling.original = { cf = myroot.CFrame, stand = humanoid.PlatformStand, rotate = humanoid.AutoRotate }
fling.last_root, fling.last_humanoid = myroot, humanoid
local installed = pcall(function()
humanoid.PlatformStand = true
humanoid.AutoRotate = false
local attachment = Instance.new('Attachment')
attachment.Name = 'LunaFlingSpin'
attachment.Parent = myroot
fling.attachment = attachment
local motor = Instance.new('AngularVelocity')
motor.Name = 'LunaFlingMotor'
motor.Attachment0 = attachment
motor.RelativeTo = Enum.ActuatorRelativeTo.World
motor.MaxTorque = 1000000000
motor.AngularVelocity = Vector3.new(fling.power, fling.power, fling.power)
motor.Parent = myroot
fling.spinner = motor
end)
if not installed then restore_fling(); return false end
local began = os.clock()
local direction = 1
while alive and fling.active and token == fling.token and eligible_fling_target(player)
and os.clock() - began < 1.15 do
local targetroot = getroot(player)
if not targetroot or not myroot.Parent or getroot(localplayer) ~= myroot then break end
direction = -direction
local angle = math.random() * math.pi * 2
local radius = 0.45 + math.random() * 1.45
local wobble = (math.random() - 0.5) * 3.2
local offset = Vector3.new(math.cos(angle) * radius, wobble, math.sin(angle) * radius)
pcall(function()
myroot.CFrame = CFrame.new(targetroot.Position + offset)
myroot.AssemblyAngularVelocity = Vector3.new(
fling.power * direction, fling.power * (math.random(0, 1) == 1 and 1 or -1), fling.power * -direction)
myroot.AssemblyLinearVelocity = Vector3.new(
math.random(-90, 90), math.random(-145, 145), math.random(-90, 90))
if fling.spinner then
fling.spinner.AngularVelocity = myroot.AssemblyAngularVelocity
end
end)
task.wait(0.035)
end
if token == fling.token then restore_fling() end
return true
end
local function start_fling(mode)
if fling.active then notify('A fling is already running. Use STOP FLING first.'); return end
local targets = {}
if mode == 'selected' then
if not eligible_fling_target(S.selected) then
notify('Select a living player other than It first.')
return
end
table.insert(targets, S.selected)
else
for _, player in ipairs(players:GetPlayers()) do
if eligible_fling_target(player) then table.insert(targets, player) end
end
end
if #targets == 0 then notify('No eligible players: It and you are excluded.'); return end
table.sort(targets, function(a, b) return a.UserId < b.UserId end)
fling.token += 1
local token = fling.token
fling.active, fling.mode = true, mode
fling.attempts, fling.skipped = 0, 0
S.fling_active = true
task.spawn(function()
for _, player in ipairs(targets) do
if not alive or not fling.active or token ~= fling.token then break end
if eligible_fling_target(player) then
fling.last = player.DisplayName
local ok, result = pcall(spin_at, player, token)
if token ~= fling.token then break end
if not ok then restore_fling() end
if ok and result then fling.attempts += 1 else fling.skipped += 1 end
task.wait(0.16)
else
fling.skipped += 1
end
end
if token == fling.token then
fling.active, fling.mode = false, 'finished'
restore_fling()
S.fling_active = false
notify('Spin fling finished: ' .. fling.attempts .. ' attempts. Auto Farm resumed if enabled.')
end
end)
end
buttons('players', {
{ 'FLING SELECTED', function() start_fling('selected') end, true },
{ 'FLING ALL EXCEPT IT', function() start_fling('all') end }
})
buttons('players', {
{ 'STOP FLING', function() stop_fling(); notify('Fling stopped and character restored.') end }
})
every(0.3, function()
fling_status.Text = 'Status: ' .. fling.mode .. ' | Running: ' .. (fling.active and 'YES' or 'NO')
.. '\nAttempts: ' .. fling.attempts .. ' | Skipped: ' .. fling.skipped
.. '\nLast target: ' .. fling.last .. ' | Spin: ' .. fling.power
.. '\nAuto Farm: ' .. (S.fling_active and 'movement paused for fling' or (settings.auto_farm and 'running' or 'off'))
end)
table.insert(cleanups, stop_fling)
end
do
toggle('visuals', 'Player ESP', 'Highlight players through walls; It is red', 'esp', on.esp)
toggle('visuals', 'Name labels', 'Show name and role above characters', 'labels')
toggle('visuals', 'Distance on labels', 'Distance from your character in studs', 'distance')
toggle('visuals', 'Credit ESP', 'Highlight uncollected credit pickups', 'credit_esp', on.credit_esp)
toggle('visuals', 'Closest credit line', 'On-screen line to the nearest coin', 'closest_credit_esp', on.closest_credit_esp)
toggle('visuals', 'Fullbright', 'Bright environment, no fog (local)', 'fullbright', on.fullbright)
toggle('visuals', 'Early It indicator', 'Show the next It above the selection UI', 'early_it')
toggle('visuals', 'Teleporter ESP', 'Map teleporter pads and destinations', 'teleporter_esp', on.teleporter_esp)
toggle('visuals', 'Jump pad ESP', 'Mark jump pads with green boxes', 'jump_pad_esp', on.jump_pad_esp)
toggle('visuals', 'Seeker radius', 'Range ring and live seeker distance', 'seeker_radius_esp', on.seeker_radius_esp)
toggle('visuals', 'Glue ESP', 'Highlight placed glue hazards', 'glue_esp', on.glue_esp)
toggle('visuals', 'Camera ESP (experimental)', 'Mark likely seeker cameras', 'camera_esp', on.camera_esp)
input_row('visuals', 'Seeker warning distance', 'Studs before the warning turns red (10-150)', settings.seeker_warning_distance, 10, 150, function(value)
settings.seeker_warning_distance = math.floor(value + 0.5)
storage.schedule()
notify('Seeker warning distance: ' .. settings.seeker_warning_distance .. ' studs.')
end)
info('visuals', 'RED = IT PURPLE = HIDER GREY = LOBBY CYAN = TELEPORTER', palette.dim, 9)
end
do
toggle('movement', 'Walk speed', 'Subtle +6% by default; type a value to override', 'speed', on.speed, {
value = move.speed, min = 0, max = 150,
apply = function(value)
move.subtle_speed = false
move.speed = value
if not settings.speed then settings.speed = true; update_toggle('speed') end
storage.schedule()
notify('Walk speed set to ' .. value .. '.')
end
})
toggle('movement', 'Jump power', 'Subtle +6% by default; type a value to override', 'jump', on.jump, {
value = move.jump, min = 0, max = 200,
apply = function(value)
move.subtle_jump = false
move.jump = value
if not settings.jump then settings.jump = true; update_toggle('jump') end
storage.schedule()
notify('Jump power set to ' .. value .. '.')
end
})
toggle('movement', 'Noclip', 'Pass through collidable map parts locally', 'noclip', on.noclip)
toggle('movement', 'Infinite jump', 'Jump again while airborne', 'infinite_jump')
toggle('movement', 'Auto seek teleport', 'As It, teleport to the nearest hider every 2s', 'auto_seek', on.auto_seek)
buttons('movement', {
{ 'TP TO NEAREST CREDIT', function()
local part = find_nearest_credit(false)
if part and F.teleport_credit(part, false) then notify('Teleported to nearby credit.')
else notify('No available credits found.') end
end, true },
{ 'RETURN TO OLD SPOT', function()
local root = getroot(localplayer)
if root and S.return_cframe then
settings.auto_credits = false
F.loop_origin = nil
update_toggle('auto_credits')
local destination = S.return_cframe
S.return_cframe = root.CFrame
root.AssemblyLinearVelocity = Vector3.zero
root.CFrame = destination
notify('Returned to previous position.')
else
notify('No previous position saved.')
end
end }
})
end
do
heading('farming', 'AUTOMATED COLLECTION')
toggle('farming', 'Loop credit teleport', 'Visits available credits every 0.7 seconds', 'auto_credits', on.auto_credits)
toggle('farming', 'Loop pull lobby players', 'Overlaps lobby players with your character', 'pull_lobby', on.pull_lobby)
warn_card('farming', 'WARNING: VERY OBVIOUS CHEATING',
'Loop pull moves other players over your character locally and can look very obvious. Server-side tags and credit rewards are not guaranteed.')
ui.farm_status = info('farming', 'Credit teleports: 0 | Lobby targets: 0 | Pull ticks: 0', palette.muted, 10)
ui.lobby_debug = info('farming', 'Lobby diagnostic: pending', palette.dim, 10)
buttons('farming', { { 'DESTRUCT LUNA.DEV', function() ui.shutdown() end } })
end
do
local auto = {
phase = 'idle', empty = 0, passes = 0, pulls = 0, scans = 0, last_target = 'none',
shelter = nil, shelter_origin = nil, map = nil, target = nil, target_since = 0,
time_left = nil, time_valid = false, round_started = false, release_all = false,
hop_attempt = false, hop_last = 0, hop_status = 'Monitoring population',
seed = nil, seed_userid = nil, seed_captured = false, sweep_index = 0,
lobby_index = 0,
round_resets = 0, last_round_reset = 'Startup',
seen_running = nil, seen_selecting = nil, seen_it = nil, seen_role = nil,
shelter_character = nil, shelter_recovery_at = 0,
seed_replacements = 0, seed_last_left = 'none', seed_replacement_after = 0
}
toggle('autofarm', 'Hop from dead servers', 'Only you in server: seek a busier server and reinject (executor queue required)', 'auto_server_hop')
toggle('autofarm', 'Smart AFK farming', 'One initial hider, then LOBBY ONLY; hiders in final 30s', 'auto_farm', function(enabled)
if enabled then
for _, key in ipairs({ 'auto_credits', 'pull_lobby', 'auto_seek', 'pull_credits' }) do
if settings[key] then
settings[key] = false
if on[key] then on[key](false) end
end
update_toggle(key)
end
auto.empty = 0
auto.phase = 'checking new round'
auto.map = nil
auto.shelter_character = nil
auto.seed = nil
auto.seed_userid = nil
auto.seed_captured = false
auto.seed_replacements, auto.seed_last_left, auto.seed_replacement_after = 0, 'none', 0
auto.time_valid = false
auto.release_all = false
else
auto.phase, auto.empty, auto.target = 'idle', 0, nil
auto.seed = nil
auto.seed_userid = nil
auto.release_all = false
ui.clear_shelter(true)
end
end)
info('autofarm', 'Credits > eight checks > ONE hider if lobby empty > LOBBY ONLY until final 30s', palette.muted, 10)
info('autofarm', 'Server hops need a supported teleport-queue API. Restarting and round capture still depend on the executor and server.', palette.dim, 10)
ui.auto_state = status_card('autofarm')
warn_card('autofarm', 'NOTICE: HIGHLY VISIBLE / EXPERIMENTAL',
'Client-side player pulling does not guarantee tags or credit rewards. The out-of-map resting platform is local and the server may move you back. Auto farming can be reported by other players.')
function ui.clear_shelter(restore)
if auto.shelter then auto.shelter:Destroy(); auto.shelter = nil end
if restore and auto.shelter_origin then
local root = getroot(localplayer)
if root then root.CFrame = auto.shelter_origin end
end
auto.shelter_origin = nil
auto.shelter_character = nil
auto.shelter_recovery_at = 0
end
local function reset_round(reason)
if not settings.auto_farm then return end
auto.round_resets += 1
auto.last_round_reset = reason
auto.empty = 0
auto.map = nil
auto.target, auto.target_since = nil, 0
auto.seed, auto.seed_userid, auto.seed_captured = nil, nil, false
auto.seed_replacements, auto.seed_last_left, auto.seed_replacement_after = 0, 'none', 0
auto.sweep_index, auto.lobby_index = 0, 0
auto.time_left, auto.time_valid, auto.release_all = nil, false, false
auto.phase = 'Round reset (' .. reason .. '): waiting for next role'
ui.clear_shelter(false)
end
local function on_seed_departure(player)
if not settings.auto_farm or not player or auto.seed_userid ~= player.UserId then return end
auto.seed_replacements += 1
auto.seed_last_left = player.DisplayName
auto.seed, auto.seed_userid, auto.seed_captured = nil, nil, false
auto.seed_replacement_after = os.clock() + 0.75
auto.target, auto.target_since = nil, 0
auto.phase = 'Captured target left: checking lobby or one new hider'
notify('Auto Farm: ' .. player.DisplayName .. ' left; replacing only if the lobby is empty.')
end
bind(players.PlayerRemoving, on_seed_departure)
local function is_round_ready()
local running = gamedata:FindFirstChild('GameRunning')
local selecting = gamedata:FindFirstChild('SelectingIt')
if not running or not running.Value then return false, 'waiting for next round' end
if selecting and selecting.Value then return false, 'waiting for It selection' end
if not isit(localplayer) and not ingame(localplayer) then
return false, 'waiting for role assignment'
end
return true
end
local function monitor_round()
local running = gamedata:FindFirstChild('GameRunning')
local selecting = gamedata:FindFirstChild('SelectingIt')
local now_running = running and running.Value == true or false
local now_selecting = selecting and selecting.Value == true or false
local it = getit()
local now_it = it and it.UserId or 0
local now_role = isit(localplayer) and 'IT' or (ingame(localplayer) and 'HIDER' or 'LOBBY')
if auto.seen_running ~= nil then
if auto.seen_running ~= now_running then
reset_round(now_running and 'round started' or 'round ended')
elseif auto.seen_selecting ~= now_selecting then
reset_round(now_selecting and 'It selection started' or 'It selection finished')
elseif auto.seen_it ~= now_it and now_it ~= 0 then
reset_round('new It chosen')
elseif auto.seen_role ~= now_role and now_running then
reset_round('your role changed to ' .. now_role)
end
end
auto.seen_running, auto.seen_selecting = now_running, now_selecting
auto.seen_it, auto.seen_role = now_it, now_role
end
for _, name in ipairs({ 'GameRunning', 'SelectingIt' }) do
local signal = gamedata:FindFirstChild(name)
if signal and signal:IsA('ValueBase') then
bind(signal:GetPropertyChangedSignal('Value'), monitor_round)
end
end
local it_data = gamedata:FindFirstChild('It')
local it_object = it_data and it_data:FindFirstChild('PlayerObject')
if it_object and it_object:IsA('ObjectValue') then
bind(it_object:GetPropertyChangedSignal('Value'), monitor_round)
end
bind(localplayer.CharacterAdded, function()
reset_round('character respawned')
end)
monitor_round()
every(0.5, monitor_round)
local function outside_map()
local root = getroot(localplayer)
local map = workspace:FindFirstChild('Map')
if not root or not map then return false end
local center, extents
if map:IsA('Model') then
center, extents = map:GetBoundingBox()
elseif map:IsA('BasePart') then
center, extents = map.CFrame, map.Size
else
return false
end
if extents.X > 20000 or extents.Z > 20000 then return false end
if not auto.shelter_origin then auto.shelter_origin = root.CFrame end
local position = Vector3.new(center.Position.X + extents.X * 0.5 + 115, center.Position.Y + math.max(20, extents.Y * 0.35), center.Position.Z)
if not auto.shelter or not auto.shelter.Parent then
auto.shelter = new('Part', {
Name = 'luna_shelter',
Anchored = true, CastShadow = false, CanCollide = true, CanTouch = false,
Size = Vector3.new(18, 1, 18), CFrame = CFrame.new(position),
Material = Enum.Material.SmoothPlastic, Color = palette.accentdark, Transparency = 0.5
}, workspace)
end
root.AssemblyLinearVelocity = Vector3.zero
root.CFrame = auto.shelter.CFrame + Vector3.new(0, 4, 0)
auto.shelter_character = localplayer.Character
auto.shelter_recovery_at = os.clock() + 3
return true
end
local function credit_count()
local objects = workspace:FindFirstChild('GameObjects')
if not objects then return nil end
local count = 0
for _, part in ipairs(objects:GetChildren()) do
if part:IsA('BasePart') and part.Name == 'Credit' then
local collected = part:FindFirstChild('Collected')
if not collected or not collected.Value then count += 1 end
end
end
return count
end
local function round_seconds()
local timer = replicatedstorage:FindFirstChild('Timer')
local remaining = timer and timer:FindFirstChild('Time')
local visible = timer and timer:FindFirstChild('TimeVisible')
if not remaining or not remaining:IsA('ValueBase') then return nil end
if visible and visible:IsA('BoolValue') and not visible.Value then return nil end
local value = tonumber(remaining.Value)
if not value or value < 0 or value > 86400 then return nil end
return value
end
local function active_hiders()
local result = {}
for _, player in ipairs(players:GetPlayers()) do
if player ~= localplayer and player.Parent == players and not isit(player) and ingame(player) and getroot(player) then
table.insert(result, player)
end
end
table.sort(result, function(a, b) return a.UserId < b.UserId end)
return result
end
local function sweep_target()
local candidates = active_hiders()
if #candidates == 0 then return nil end
auto.sweep_index = auto.sweep_index % #candidates + 1
return candidates[auto.sweep_index]
end
local function lobby_target()
local candidates = {}
for _, player in ipairs(players:GetPlayers()) do
if player ~= localplayer and player.Parent == players and not isit(player)
and not ingame(player) and getroot(player) then
table.insert(candidates, player)
end
end
if #candidates == 0 then return nil end
table.sort(candidates, function(a, b) return a.UserId < b.UserId end)
auto.lobby_index = auto.lobby_index % #candidates + 1
return candidates[auto.lobby_index]
end
local function queue_loader()
local q = (type(queue_on_teleport) == 'function' and queue_on_teleport)
or (type(queueonteleport) == 'function' and queueonteleport)
or (type(syn) == 'table' and type(syn.queue_on_teleport) == 'function' and syn.queue_on_teleport)
or (type(fluxus) == 'table' and type(fluxus.queue_on_teleport) == 'function' and fluxus.queue_on_teleport)
if type(q) ~= 'function' then
auto.hop_status = 'Executor has no teleport-queue API'
return false
end
local local_path = 'luna.dev/scripts/hide_and_seek_extreme_v22.lua'
local hosted_url = 'https://lunadev.fixseroalt.workers.dev/release/game-scripts/hide_and_seek_extreme.lua'
local loader
if type(readfile) == 'function' then
local ok, content = pcall(readfile, local_path)
if ok and type(content) == 'string' and content:find("luna.dev v22 loaded", 1, true) then
loader = 'local s = readfile("luna.dev/scripts/hide_and_seek_extreme_v22.lua"); local f = loadstring(s); if f then f() end'
end
end
if not loader then
local ok, content = pcall(function() return game:HttpGet(hosted_url) end)
if ok and type(content) == 'string' and content:find("luna.dev v22 loaded", 1, true) then
loader = 'local f = loadstring(game:HttpGet("https://lunadev.fixseroalt.workers.dev/release/game-scripts/hide_and_seek_extreme.lua")); if f then f() end'
end
end
if not loader then
auto.hop_status = 'Save v22 as ' .. local_path .. ' to enable reinjection'
return false
end
local ok = pcall(q, loader)
if not ok then auto.hop_status = 'Teleport reinjection could not be queued' end
return ok
end
local function fetch_public_servers(cursor)
local url = 'https://games.roblox.com/v1/games/' .. tostring(game.PlaceId) .. '/servers/Public?sortOrder=Desc&limit=100'
if cursor and cursor ~= '' then url = url .. '&cursor=' .. httpservice:UrlEncode(cursor) end
local provider = (type(request) == 'function' and request)
or (type(http_request) == 'function' and http_request)
or (type(syn) == 'table' and type(syn.request) == 'function' and syn.request)
local ok, body
if provider then
ok, body = pcall(function()
local result = provider({ Url = url, Method = 'GET' })
if not result or result.StatusCode and result.StatusCode ~= 200 then error('server list request failed') end
return result.Body
end)
else
ok, body = pcall(function() return game:HttpGet(url) end)
end
if not ok or type(body) ~= 'string' then return nil end
local decoded, result = pcall(httpservice.JSONDecode, httpservice, body)
return decoded and type(result) == 'table' and result or nil
end
local function hop_to_busier_server()
if auto.hop_attempt or not alive or S.fling_active or not settings.auto_server_hop or not settings.auto_farm then return end
if #players:GetPlayers() >= 2 or os.clock() - started_at < 5 then return end
if auto.hop_last > 0 and os.clock() - auto.hop_last < 35 then return end
auto.hop_attempt = true
auto.hop_last = os.clock()
auto.hop_status = 'Looking for a populated server...'
task.spawn(function()
local best, largest = nil, 1
local cursor = nil
for _ = 1, 2 do
if not alive or not settings.auto_farm or #players:GetPlayers() >= 2 then break end
local response = fetch_public_servers(cursor)
if not response or type(response.data) ~= 'table' then
auto.hop_status = 'Server list unavailable; will retry'
break
end
for _, server in ipairs(response.data) do
if type(server) == 'table' and type(server.id) == 'string'
and server.id ~= game.JobId and type(server.playing) == 'number'
and type(server.maxPlayers) == 'number'
and server.playing >= 2 and server.playing < server.maxPlayers
and server.playing > largest then
best, largest = server.id, server.playing
end
end
if best then break end
cursor = response.nextPageCursor
if not cursor then break end
end
if best and alive and settings.auto_farm and #players:GetPlayers() < 2 then
if not queue_loader() then
if auto.hop_status == 'Looking for a populated server...' then
auto.hop_status = 'Autoexec not ready; staying in current server'
end
else
storage.save()
auto.hop_status = 'Joining server with ' .. largest .. ' players'
local ok, err = pcall(function()
teleportservice:TeleportToPlaceInstance(game.PlaceId, best, localplayer)
end)
if not ok then
auto.hop_status = 'Teleport failed: ' .. tostring(err)
end
end
elseif auto.hop_status == 'Looking for a populated server...' then
auto.hop_status = 'No suitable public server found; retrying'
end
auto.hop_attempt = false
end)
end
every(2, hop_to_busier_server)
every(0.8, function()
if not settings.auto_farm then return end
if S.fling_active then auto.phase = 'Paused for player fling'; return end
local ready, reason = is_round_ready()
if not ready then
auto.empty = 0
auto.phase = reason
if auto.shelter then ui.clear_shelter(false) end
return
end
local map = workspace:FindFirstChild('Map')
if map ~= auto.map then
auto.map, auto.empty, auto.target, auto.phase = map, 0, nil, 'checking'
auto.seed, auto.seed_userid, auto.seed_captured = nil, nil, false
auto.seed_replacements, auto.seed_last_left, auto.seed_replacement_after = 0, 'none', 0
auto.time_valid, auto.release_all = false, false
ui.clear_shelter(true)
end
local count = credit_count()
auto.scans += 1
if count == nil then
auto.empty = 0
auto.phase = 'waiting for GameObjects'
elseif count > 0 then
auto.empty = 0
auto.phase = 'credits (' .. count .. ' available)'
ui.clear_shelter(true)
local part = find_nearest_credit(true)
if part and F.teleport_credit(part, true) then auto.passes += 1 end
else
auto.empty = math.min(8, auto.empty + 1)
auto.phase = auto.empty < 8 and ('confirming no credits (' .. auto.empty .. '/8)') or 'no credits confirmed'
end
end)
every(0.06, function()
if not settings.auto_farm or auto.empty < 8 or S.fling_active then return end
local ready, reason = is_round_ready()
if not ready then
auto.phase = reason
if auto.shelter then ui.clear_shelter(false) end
return
end
local running = gamedata:FindFirstChild('GameRunning')
local seeking = gamedata:FindFirstChild('ItSeeking')
if not running or not running.Value then
auto.phase = 'waiting for a round'
auto.seed, auto.seed_userid, auto.target = nil, nil, nil
auto.time_valid, auto.release_all = false, false
elseif isit(localplayer) and seeking and seeking.Value then
ui.clear_shelter(false)
local now = os.clock()
local remaining = round_seconds()
auto.time_left = remaining
if remaining and remaining > 0 then auto.time_valid = true end
auto.release_all = auto.time_valid and remaining ~= nil and remaining <= 30
if auto.release_all then
auto.phase = 'FINAL 30 SECONDS: remaining hiders eligible'
if not auto.target or auto.target.Parent ~= players or not ingame(auto.target)
or now - auto.target_since >= 0.75 then
auto.target = sweep_target()
auto.target_since = now
end
else
if auto.seed_userid and auto.seed and auto.seed.Parent ~= players then
on_seed_departure(auto.seed)
end
if auto.seed_userid == nil and os.clock() >= auto.seed_replacement_after then
local lobby_available = false
for _, player in ipairs(players:GetPlayers()) do
if player ~= localplayer and player.Parent == players
and not isit(player) and not ingame(player) and getroot(player) then
lobby_available = true
break
end
end
if not lobby_available then
local hiders = active_hiders()
if #hiders > 0 then
auto.seed = hiders[1]
auto.seed_userid = auto.seed.UserId
auto.seed_captured = false
end
end
end
local seed = auto.seed
if seed and seed.Parent == players and seed.UserId == auto.seed_userid
and not ingame(seed) then
auto.seed_captured = true
end
if not auto.seed_captured and seed and ingame(seed) and getroot(seed) then
auto.target = seed
auto.phase = 'FIRST hider only: ' .. seed.DisplayName
else
auto.target = lobby_target()
auto.phase = auto.target and 'LOBBY ONLY: remaining hiders protected'
or 'Waiting for a lobby target; other hiders protected'
end
if not remaining then
auto.phase = auto.phase .. ' (round timer unavailable)'
end
end
if auto.target then
local eligible = auto.release_all and ingame(auto.target)
or (not auto.release_all and
((auto.seed_userid ~= nil and not auto.seed_captured
and auto.target.UserId == auto.seed_userid and ingame(auto.target))
or (not ingame(auto.target))))
if eligible and F.pull_player(auto.target) then
auto.pulls += 1
auto.last_target = auto.target.DisplayName
end
end
elseif ingame(localplayer) and not isit(localplayer) then
local character = localplayer.Character
if auto.shelter_character ~= character then
ui.clear_shelter(false)
end
if not auto.shelter or not auto.shelter.Parent then
auto.phase = outside_map() and 'hider: local out-of-map shelter' or 'hider: shelter unavailable'
else
auto.phase = 'hider: local out-of-map shelter'
if os.clock() >= auto.shelter_recovery_at then
auto.shelter_recovery_at = os.clock() + 3
local root = getroot(localplayer)
if root and (root.Position - auto.shelter.Position).Magnitude > 14 then
root.AssemblyLinearVelocity = Vector3.zero
root.CFrame = auto.shelter.CFrame + Vector3.new(0, 4, 0)
auto.phase = 'hider: shelter position recovered'
end
end
end
else
auto.phase = 'waiting for It to start seeking'
auto.seed = nil
auto.seed_userid = nil
auto.time_valid, auto.release_all = false, false
end
end)
every(0.3, function()
ui.auto_state.Text = string.format('Status: %s\nRound: %s | Players: %d | Sweep: %s\nScans: %d | Empty: %d/8 | Credit TPs: %d\nPull updates: %d | Last: %s\nTarget departures: %d | Last left: %s\nRound resets: %d (%s)\nServer: %s',
(S.fling_active and settings.auto_farm) and 'Paused for player fling' or auto.phase, auto.time_left and (math.floor(auto.time_left) .. 's') or 'unavailable',
#players:GetPlayers(), auto.release_all and 'FINAL 30s' or 'LOBBY ONLY',
auto.scans, auto.empty, auto.passes, auto.pulls, auto.last_target,
auto.seed_replacements, auto.seed_last_left,
auto.round_resets, auto.last_round_reset, auto.hop_status)
end)
table.insert(cleanups, function() ui.clear_shelter(false) end)
end
do
heading('abilities', 'IT ABILITIES')
toggle('abilities', 'No local cooldown', 'Clears the client timer; server cooldown may remain', 'it_no_cooldown', on.it_no_cooldown)
toggle('abilities', 'Keep ability active', 'Re-uses your It ability while seeking', 'it_keep_active', on.it_keep_active)
ui.ability_status = status_card('abilities')
buttons('abilities', {
{ 'ACTIVATE ABILITY', function()
if settings.it_no_cooldown then A.clear_cooldown() end
A.press()
notify('Ability input: ' .. A.last_result .. '. Server activation is not confirmed.')
end, true },
{ 'RESET CLIENT TIMER', function()
if not A.can_use() then notify('Reset needs your seeker character during the seeking phase.')
elseif A.clear_cooldown() then notify('Client timer cleared. Server cooldowns may still apply.')
else notify('Client timer clear failed; check game state or the ability UI.') end
end }
})
warn_card('abilities', 'EXPERIMENTAL / CLIENT SIDE',
'Clears the AbilityHandler timer locally. Server-side cooldowns and durations remain enforced, and Sprint is never spam-toggled.')
heading('abilities', 'PRACTICE AS A HIDER')
info('abilities', 'Local previews. They run without being It and never activate server abilities.', palette.muted, 10)
buttons('abilities', {
{ 'PRACTICE SPRINT', A.practice_sprint, true },
{ 'PRACTICE GLUE', A.practice_glue }
})
buttons('abilities', {
{ 'PRACTICE CAMERA / EXIT', A.practice_camera_toggle },
{ 'PRACTICE SMASH', A.practice_smash }
})
every(0.2, function()
if settings.it_no_cooldown then
A.bridge()
A.clear_cooldown()
end
end)
every(1, function()
local character = localplayer.Character
if character ~= A.last_character then
A.last_character = character
A.sprint_first = nil
A.active, A.active_known = false, false
end
if settings.it_no_cooldown or settings.it_keep_active then A.bridge() end
if settings.it_no_cooldown then A.clear_cooldown() end
if settings.it_keep_active and A.can_use() then
A.name = A.equipped_name()
local is_sprint = string.lower(A.name) == 'sprint'
local should_press = not A.active
if is_sprint and not A.active_known and A.sprint_first == character then should_press = false end
if should_press and os.clock() - A.last_attempt > (is_sprint and 4 or 2.3) then
A.last_attempt = os.clock()
if is_sprint then A.sprint_first = character end
A.press()
end
elseif not A.can_use() then
A.name = 'Unknown'
end
end)
end
do
local purchase = {
auto = false, running = false, queued = false, cancelled = false,
bought = 0, spent = 0, failed = 0, scanned = 0, unconfirmed = 0,
status = 'Ready. Purchases can deduct credits without awarding an item.', last_balance = nil
}
heading('shop', 'CREDIT AUTO BUYER')
info('shop', 'Characters > Taunts > Pets, cheapest first. In-game credits only.', palette.accent, 10)
local balance_label = info('shop', 'Balance: checking...', palette.text, 11)
local scan_label = info('shop', 'Shop: not scanned', palette.muted, 10)
local status_label = info('shop', purchase.status, palette.text, 10)
local stats_label = info('shop', '', palette.muted, 10)
local warning_label = warn_card('shop', 'CREDIT PURCHASE WARNING',
'Purchases may deduct credits without granting items. Auto Buy starts OFF. Both purchase buttons need a second click to confirm.')
local pending_action, pending_expires = nil, 0
local function acknowledge(action)
if pending_action == action and os.clock() < pending_expires then
pending_action = nil
warning_label.Text = 'Spending acknowledged. Inventory is checked after each purchase.'
return true
end
pending_action = action
pending_expires = os.clock() + 10
warning_label.Text = 'CAUTION: credits may be deducted without the item appearing. Click the same option again within 10 seconds to proceed.'
notify('Purchase warning: click again within 10 seconds to confirm.')
return false
end
local auto_button
local function update_display()
if not alive then return end
local data = localplayer:FindFirstChild('PlayerData')
local credit = data and data:FindFirstChild('Credits')
balance_label.Text = 'Balance: ' .. (credit and tostring(credit.Value) or 'unavailable') .. ' credits'
scan_label.Text = 'Found ' .. purchase.scanned .. ' credit-priced shop items'
status_label.Text = purchase.status
stats_label.Text = 'Confirmed: ' .. purchase.bought .. ' | Spent: ' .. purchase.spent .. ' | Unconfirmed: ' .. purchase.unconfirmed .. ' | Failed: ' .. purchase.failed
if auto_button then
auto_button.Text = 'AUTO BUY: ' .. (purchase.auto and 'ON' or 'OFF')
auto_button.BackgroundColor3 = purchase.auto and palette.accentdark or palette.raised
end
end
local function scan_shop()
local maingui = playergui:FindFirstChild('MainGui')
local shopframe = maingui and maingui:FindFirstChild('ShopFrame')
local results, seen = {}, {}
if not shopframe then return results, false end
local kinds = {
CharacterCredits = { 'Character', 'Characters', 'CharacterName', 1 },
TauntCredits = { 'Taunt', 'Taunts', 'TauntName', 2 },
PetCredits = { 'Pet', 'Pets', 'PetName', 3 }
}
local has_scroller = false
for _, main_name in ipairs({ 'MainFrame', 'XBoxMainFrame' }) do
local main = shopframe:FindFirstChild(main_name)
local scrolling = main and main:FindFirstChild('ScrollingFrame')
if scrolling then
has_scroller = true
for _, element in ipairs(scrolling:GetDescendants()) do
local data = element:FindFirstChild('Data')
if data then
local entry_type = data:FindFirstChild('Type')
local kind = entry_type and kinds[entry_type.Value]
if kind then
local name_obj = data:FindFirstChild(kind[3])
local price_obj = data:FindFirstChild('Prize')
local name = name_obj and tostring(name_obj.Value) or ''
local price = price_obj and tonumber(price_obj.Value)
local key = kind[1] .. ':' .. name
if name ~= '' and price and price >= 0 and price < 1000000000 and not seen[key] then
seen[key] = true
table.insert(results, { category = kind[1], bag = kind[2], name = name, price = price, priority = kind[4] })
end
end
end
end
end
end
table.sort(results, function(a, b)
if a.priority ~= b.priority then return a.priority < b.priority end
if a.price ~= b.price then return a.price < b.price end
return a.name < b.name
end)
return results, has_scroller
end
local function start_purchase()
if not alive or purchase.running then return end
purchase.running = true
purchase.cancelled = false
task.spawn(function()
local items, has_shop = scan_shop()
purchase.scanned = #items
local data = localplayer:FindFirstChild('PlayerData')
local credit = data and data:FindFirstChild('Credits')
local inventory = localplayer:FindFirstChild('Inventory')
local remotes = replicatedstorage:FindFirstChild('Remotes')
local remote = remotes and remotes:FindFirstChild('PurchaseItem')
if not has_shop or not credit or not inventory or not remote or not remote:IsA('RemoteFunction') then
purchase.status = 'Shop, inventory, credits or purchase remote not ready.'
purchase.running = false
update_display()
return
end
local successful, pending = 0, 0
for _, item in ipairs(items) do
if not alive or purchase.cancelled then break end
local bag = inventory:FindFirstChild(item.bag)
if bag and not bag:FindFirstChild(item.name) then
local balance = tonumber(credit.Value)
if balance and balance >= item.price then
purchase.status = 'Buying ' .. item.category .. ': ' .. item.name .. ' (' .. item.price .. ' Cr)'
update_display()
local before = balance
local ok, result = pcall(function() return remote:InvokeServer(item.name, item.category) end)
if not alive then break end
if ok and result then
local expiration = os.clock() + 3
while alive and not purchase.cancelled and not bag:FindFirstChild(item.name) and os.clock() < expiration do
task.wait(0.1)
end
if bag:FindFirstChild(item.name) then
purchase.bought += 1
successful += 1
purchase.spent += math.max(0, before - (tonumber(credit.Value) or before))
else
pending += 1
purchase.status = 'Server accepted ' .. item.name .. '; inventory not yet confirmed'
end
else
purchase.failed += 1
purchase.status = 'Purchase declined: ' .. item.name
end
local charged = math.max(0, before - (tonumber(credit.Value) or before))
if charged > 0 and not bag:FindFirstChild(item.name) then
purchase.unconfirmed += 1
purchase.spent += charged
purchase.auto = false
settings.auto_buy = false
purchase.cancelled = true
purchase.status = 'WARNING: spent ' .. charged .. ' credits on ' .. item.name .. ' but ownership was not confirmed. Purchases stopped.'
warning_label.Text = 'WARNING: credits were deducted but ownership is not confirmed. Buying stopped to prevent further losses.'
storage.schedule()
update_display()
break
end
update_display()
task.wait(0.25)
end
end
end
purchase.running = false
if alive then
if purchase.cancelled then
purchase.status = purchase.unconfirmed > 0 and purchase.status or 'Purchase run stopped.'
else
purchase.status = 'Finished: ' .. successful .. ' confirmed, ' .. pending .. ' pending. Other items may be unaffordable or rejected.'
end
update_display()
if purchase.auto and purchase.queued and not purchase.cancelled then
purchase.queued = false
task.delay(0.5, function()
if alive and purchase.auto and not purchase.running then start_purchase() end
end)
else
purchase.queued = false
end
end
end)
end
local made = buttons('shop', {
{ 'BUY AFFORDABLE NOW', function()
if not acknowledge('buy') then return end
if purchase.running then notify('A purchase run is already active.')
else purchase.queued = false; start_purchase() end
end, true },
{ 'AUTO BUY: OFF', function()
if not purchase.auto and not acknowledge('auto') then return end
purchase.auto = not purchase.auto
settings.auto_buy = purchase.auto
storage.schedule()
if purchase.auto then
purchase.cancelled = false
if purchase.running then purchase.queued = true else start_purchase() end
else
purchase.queued = false
if purchase.running then
purchase.cancelled = true
purchase.status = 'Auto buy disabled; finishing current request.'
end
end
update_display()
end }
})
auto_button = made[2]
buttons('shop', {
{ 'STOP PURCHASES', function()
purchase.auto = false
settings.auto_buy = false
storage.schedule()
purchase.queued = false
purchase.cancelled = true
purchase.status = 'Stopping after the current server request...'
update_display()
end }
})
info('shop', 'Skips gamepasses, developer products and owned items. Auto buy re-checks whenever you earn credits.', palette.dim, 9)
update_display()
task.spawn(function()
local data = localplayer:WaitForChild('PlayerData', 12)
local credit = data and data:WaitForChild('Credits', 12)
if not alive or not credit then return end
purchase.last_balance = tonumber(credit.Value)
bind(credit:GetPropertyChangedSignal('Value'), function()
if not alive then return end
local current = tonumber(credit.Value)
local increased = current and purchase.last_balance and current > purchase.last_balance
purchase.last_balance = current
update_display()
if purchase.auto and increased then
if purchase.running then
purchase.queued = true
else
task.delay(0.35, function()
if alive and purchase.auto and not purchase.running then start_purchase() end
end)
end
end
end)
update_display()
end)
end
do
heading('tests', 'SEEKER CHANCE MONITOR')
local chance_status = status_card('tests')
info('tests', 'This is the client-calculated display chance, not verified server odds. A local multiplier can make the UI show 83% without changing who the server chooses.', palette.muted, 10)
local preview = { value = 2, active = false, original = nil, instance = nil }
local function multiplier_object()
local data = localplayer:FindFirstChild('PlayerData')
local obj = data and data:FindFirstChild('ItWeightMultiplier')
if obj and obj:IsA('ValueBase') and type(obj.Value) == 'number' then return obj end
return nil
end
local function reset_preview()
if preview.active and preview.instance and preview.instance.Parent and preview.original ~= nil then
pcall(function() preview.instance.Value = preview.original end)
end
preview.active, preview.original, preview.instance = false, nil, nil
end
info('tests', 'EXPERIMENTAL: The value below only changes the local client copy. It can change the game UI percentage without changing your server-controlled chance.', palette.danger, 10)
input_row('tests', 'Client multiplier preview', '0.1–20x; not a server-side boost', 2, 0.1, 20, function(value)
preview.value = value
end)
buttons('tests', {
{ 'APPLY LOCAL TEST', function()
local obj = multiplier_object()
if not obj then notify('ItWeightMultiplier is not available on your client.'); return end
if preview.active and preview.instance ~= obj then reset_preview() end
if not preview.active then
preview.original = obj.Value
preview.instance = obj
end
local ok = pcall(function() obj.Value = preview.value end)
if ok then
preview.active = true
notify('Client UI preview: x' .. tostring(preview.value) .. '. Server chance is unchanged unless the server explicitly accepts it.')
else
notify('Experimental local multiplier could not be changed.')
end
end },
{ 'RESET LOCAL TEST', function()
reset_preview()
notify('Restored the pre-test client multiplier.')
end }
})
every(0.6, function()
if preview.active and (not preview.instance or not preview.instance.Parent) then
preview.active, preview.original, preview.instance = false, nil, nil
end
local data = localplayer:FindFirstChild('PlayerData')
local weight_obj = data and data:FindFirstChild('ItWeight')
local multi_obj = multiplier_object()
local afk_obj = data and data:FindFirstChild('AFK')
local weight = weight_obj and tonumber(weight_obj.Value)
local multiplier = multi_obj and tonumber(multi_obj.Value)
local afk_known = afk_obj and afk_obj:IsA('BoolValue')
local is_afk = afk_known and afk_obj.Value or false
local eligible, combined, missing = 0, 0, 0
for _, player in ipairs(players:GetPlayers()) do
local pdata = player:FindFirstChild('PlayerData')
local pw = pdata and pdata:FindFirstChild('ItWeight')
local pm = pdata and pdata:FindFirstChild('ItWeightMultiplier')
local pa = pdata and pdata:FindFirstChild('AFK')
local wn, mn = pw and tonumber(pw.Value), pm and tonumber(pm.Value)
if not wn or not mn or not pa or not pa:IsA('BoolValue') then
missing += 1
elseif not pa.Value then
eligible += 1
combined += math.max(0, wn * mn)
end
end
local estimate
if missing > 0 or weight == nil or multiplier == nil or not afk_known then
estimate = 'Loading selection data'
elseif is_afk then
estimate = '0.00% (game AFK flag is ON)'
elseif combined <= 0 then
estimate = 'Unavailable (zero total weight)'
else
estimate = string.format('%.2f%%', math.clamp(weight * multiplier / combined * 100, 0, 100))
end
local state = not afk_known and 'UNKNOWN' or (is_afk and 'AFK: INELIGIBLE' or 'ELIGIBLE')
local weight_text = weight and string.format('%.2f', weight) or '?'
local multiplier_text = multiplier and string.format('%.2fx', multiplier) or '?'
local preview_text = preview.active and ('ON (local x' .. tostring(preview.value) .. ')') or 'OFF'
local msg = 'CLIENT DISPLAY estimate: ' .. estimate .. ' | SERVER chance: UNKNOWN\n'
.. 'Game AFK flag: ' .. state .. ' | ItWeight: ' .. weight_text .. ' | Multiplier: ' .. multiplier_text .. '\n'
.. 'Candidates: ' .. tostring(eligible) .. ' | Missing player data: ' .. tostring(missing) .. '\n'
.. 'Experimental preview: ' .. preview_text .. ' | A missed selection does not prove the odds'
chance_status.Text = msg
if ui.home_chance then ui.home_chance.Text = msg end
end)
table.insert(cleanups, reset_preview)
end
do
heading('tests', 'LOCAL EXPERIMENTS')
toggle('tests', 'Pull credits to me', 'Holds one coin at you for 1.15s (local test)', 'pull_credits', on.pull_credits)
warn_card('tests', 'CLIENT-ONLY TEST: NOT CONFIRMED REWARDS',
'Credit pickups may disappear locally without awarding coins. Server-authoritative rewards and gamepasses cannot be granted by moving client-side copies.')
local owned_label = info('tests', 'Triple Coin Value (pass 592144): not checked', palette.muted, 10)
ui.test_stats = info('tests', 'Coin pull attempts: 0 | Credits: +0', palette.muted, 10)
local running_equip = false
local function discover_gamepass_items()
local main = playergui:FindFirstChild('MainGui')
local shop = main and main:FindFirstChild('ShopFrame')
if not shop then return {} end
local items, recorded = {}, {}
local remote_for = { CharacterGamepass = 'EquipCharacter', TauntGamepass = 'EquipTaunt', PetGamepass = 'EquipPet' }
local name_for = { CharacterGamepass = 'CharacterName', TauntGamepass = 'TauntName', PetGamepass = 'PetName' }
for _, section in ipairs({ 'MainFrame', 'XBoxMainFrame' }) do
local frame = shop:FindFirstChild(section)
local scroller = frame and frame:FindFirstChild('ScrollingFrame')
if scroller then
for _, item in ipairs(scroller:GetDescendants()) do
local data = item:FindFirstChild('Data')
local type_value = data and data:FindFirstChild('Type')
local kind = type_value and type(type_value.Value) == 'string' and type_value.Value
if kind and remote_for[kind] then
local name_value = data:FindFirstChild(name_for[kind])
if name_value and name_value.Value ~= '' then
local id = remote_for[kind] .. ':' .. tostring(name_value.Value)
if not recorded[id] then
recorded[id] = true
table.insert(items, { name = name_value.Value, remote = remote_for[kind] })
end
end
end
end
end
end
return items
end
buttons('tests', {
{ 'CHECK 3X OWNERSHIP', function()
notify('Checking gamepass ownership...')
task.spawn(function()
local ok, result = pcall(function() return marketplace:UserOwnsGamePassAsync(localplayer.UserId, 592144) end)
if not alive then return end
owned_label.Text = 'Triple Coin Value: ' .. (ok and (result and 'OWNED' or 'NOT OWNED') or 'check unavailable')
notify(ok and 'Gamepass ownership check complete.' or 'Could not check gamepass ownership.')
end)
end },
{ 'TRY GAMEPASS EQUIPS', function()
if running_equip then notify('An equip test is already running.'); return end
local items = discover_gamepass_items()
if #items == 0 then notify('No gamepass entries found in the shop UI.'); return end
local remotes = replicatedstorage:FindFirstChild('Remotes')
if not remotes then notify('Game equip remotes are unavailable.'); return end
running_equip = true
notify('Sending normal equip requests. Non-owned gamepasses are not granted.')
task.spawn(function()
local attempted = 0
for i, entry in ipairs(items) do
if not alive or i > 16 then break end
local remote = remotes:FindFirstChild(entry.remote)
if remote and remote:IsA('RemoteEvent') then
if pcall(function() remote:FireServer(entry.name) end) then attempted += 1 end
end
task.wait(0.4)
end
running_equip = false
if alive then notify('Sent ' .. attempted .. ' equip requests. Ownership is server-controlled.') end
end)
end }
})
end
do
heading('config', 'SAVED PREFERENCES')
storage.label = info('config', storage.state, palette.muted, 10)
buttons('config', {
{ 'SAVE SETTINGS NOW', function()
if storage.save() then notify('Saved all luna.dev settings.')
else notify('Could not save: executor file access may be unavailable.') end
end, true },
{ 'RESET TO DEFAULTS', function()
for key, value in pairs(storage.defaults) do
if settings[key] ~= value then
settings[key] = value
if on[key] then on[key](value) end
end
update_toggle(key)
end
move.subtle_speed, move.subtle_jump = true, true
storage.schedule()
notify('Settings reset to defaults.')
end }
})
heading('config', 'SYSTEM')
toggle('config', 'Anti-AFK', 'Sends a harmless input when you go idle', 'anti_afk')
ui.config_afk = info('config', 'Anti-AFK pulses sent: 0', palette.muted, 10)
info('config', 'Auto-save covers every switch, the warning distance and the movement values. Right Shift hides or shows the menu.', palette.dim, 10)
info('config', 'Storage: ' .. storage.path, palette.dim, 9)
end
local selecting_it = gamedata:FindFirstChild('SelectingIt')
local it_record = gamedata:FindFirstChild('It')
local it_object = it_record and it_record:FindFirstChild('PlayerObject')
local last_seen_it = it_object and it_object.Value
local early_candidate
local function refresh_early_it()
if not settings.early_it or not selecting_it or not selecting_it.Value then
early_banner.Visible = false
return
end
early_banner.Visible = true
if early_candidate and early_candidate.Parent == players then
early_text.Text = 'NEXT IT: ' .. early_candidate.DisplayName .. ' (@' .. early_candidate.Name .. ')'
early_text.TextColor3 = palette.gold
else
early_text.Text = 'SELECTING IT | Awaiting server choice'
early_text.TextColor3 = palette.muted
end
end
if selecting_it then
bind(selecting_it:GetPropertyChangedSignal('Value'), function()
early_candidate = nil
if selecting_it.Value and it_object and it_object.Value and it_object.Value ~= last_seen_it then
early_candidate = it_object.Value
end
refresh_early_it()
end)
end
if it_object then
bind(it_object:GetPropertyChangedSignal('Value'), function()
if selecting_it and selecting_it.Value and it_object.Value and it_object.Value:IsA('Player') then
early_candidate = it_object.Value
end
last_seen_it = it_object.Value
refresh_early_it()
end)
end
local function watch_it_flag(player)
task.spawn(function()
local data = player:FindFirstChild('PlayerData') or player:WaitForChild('PlayerData', 10)
local it_flag = data and (data:FindFirstChild('It') or data:WaitForChild('It', 10))
if not alive or player.Parent ~= players or not it_flag then return end
bind(it_flag:GetPropertyChangedSignal('Value'), function()
if selecting_it and selecting_it.Value and it_flag.Value == true then
early_candidate = player
refresh_early_it()
end
end)
end)
end
for _, player in ipairs(players:GetPlayers()) do watch_it_flag(player) end
bind(players.PlayerAdded, watch_it_flag)
do
local function reveal(entry)
show_page(entry.page)
task.delay(0.05, function()
local page = pages[entry.page]
if not alive or not page or not entry.row.Parent then return end
page.CanvasPosition = Vector2.new(0, math.max(0, entry.row.AbsolutePosition.Y - page.AbsolutePosition.Y + page.CanvasPosition.Y - 4))
end)
end
local function update_results()
local query = string.lower(ui.search.Text):match('^%s*(.-)%s*$')
for _, child in ipairs(ui.results:GetChildren()) do
if child:IsA('GuiObject') then child:Destroy() end
end
if query == '' or S.minimized then
ui.results.Visible = false
return
end
ui.log_panel.Visible = false
ui.results.Visible = true
local hits = 0
for _, entry in ipairs(search_index) do
if hits >= 25 then break end
if string.find(string.lower(entry.title), query, 1, true) or string.find(string.lower(entry.desc), query, 1, true) then
hits += 1
local item = new('TextButton', {
Size = UDim2.new(1, 0, 0, 26), BackgroundColor3 = palette.card, BorderSizePixel = 0,
Text = string.upper(entry.page) .. ' / ' .. entry.title, TextColor3 = palette.text,
TextSize = 10, TextTruncate = Enum.TextTruncate.AtEnd, TextXAlignment = Enum.TextXAlignment.Left,
Font = Enum.Font.GothamMedium, ZIndex = 41, LayoutOrder = hits
}, ui.results)
round(item, 5)
new('UIPadding', { PaddingLeft = UDim.new(0, 8) }, item)
bind(item.MouseButton1Click, function()
ui.search.Text = ''
reveal(entry)
end)
end
end
if hits == 0 then
text(ui.results, 'No feature matches "' .. ui.search.Text .. '".', 11, palette.muted, {
Size = UDim2.new(1, 0, 0, 26), ZIndex = 41
})
end
end
bind(ui.search:GetPropertyChangedSignal('Text'), update_results)
end
function ui.shutdown()
if not alive then return end
storage.revision += 1
storage.save()
alive = false
for _, connection in ipairs(connections) do connection:Disconnect() end
for _, fn in ipairs(cleanups) do pcall(fn) end
early_gui:Destroy()
gui:Destroy()
end
bind(close_button.MouseButton1Click, ui.shutdown)
bind(min_button.MouseButton1Click, function()
S.minimized = not S.minimized
window.Size = S.minimized and UDim2.fromOffset(win_w, HEADER) or UDim2.fromOffset(win_w, win_h)
sidebar.Visible = not S.minimized
content.Visible = not S.minimized
min_button.Text = S.minimized and '+' or '-'
ui.results.Visible = false
ui.log_panel.Visible = false
show_page(current_page)
end)
local dragging, drag_origin, window_origin = false, nil, nil
bind(header.InputBegan, function(input)
if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
dragging = true
drag_origin = input.Position
window_origin = window.Position
end
end)
bind(userinputservice.InputChanged, function(input)
if dragging and (input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch) then
local delta = input.Position - drag_origin
window.Position = UDim2.new(window_origin.X.Scale, window_origin.X.Offset + delta.X, window_origin.Y.Scale, window_origin.Y.Offset + delta.Y)
end
end)
local resizing, resize_start, resize_w, resize_h = false, nil, 0, 0
local resize_handle = new('TextButton', {
Name = 'ResizeHandle', Position = UDim2.new(1, -18, 1, -18), Size = UDim2.fromOffset(16, 16),
Text = '', BackgroundTransparency = 1, BorderSizePixel = 0, ZIndex = 180
}, window)
for _, offset in ipairs({ 5, 9, 13 }) do
new('Frame', {
Size = UDim2.fromOffset(offset, 1), Position = UDim2.fromOffset(15 - offset, offset + 1),
Rotation = -45, BackgroundColor3 = palette.accent, BorderSizePixel = 0, ZIndex = 180
}, resize_handle)
end
bind(resize_handle.InputBegan, function(input)
if S.minimized then return end
if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
resizing = true
resize_start = input.Position
resize_w, resize_h = win_w, win_h
end
end)
bind(userinputservice.InputChanged, function(input)
if resizing and (input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch) then
local delta = input.Position - resize_start
win_w = math.clamp(resize_w + delta.X * 2, 500, 980)
win_h = math.clamp(resize_h + delta.Y * 2, 300, 780)
window.Size = UDim2.fromOffset(win_w, win_h)
end
end)
bind(userinputservice.InputEnded, function(input)
if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
dragging = false
resizing = false
end
end)
bind(userinputservice.InputBegan, function(input, processed)
if not processed and input.KeyCode == Enum.KeyCode.RightShift then
window.Visible = not window.Visible
end
end)
bind(gui.AncestryChanged, function(_, parent)
if not parent then ui.shutdown() end
end)
do
local frames, frame_time = 0, 0
local function ping()
local ok, value = pcall(function() return statsservice.Network.ServerStatsItem['Data Ping']:GetValue() end)
return ok and math.floor(value + 0.5) or nil
end
bind(runservice.Heartbeat, function(dt)
frames += 1
frame_time += dt
if frame_time >= 0.5 then
local fps = math.floor(frames / frame_time + 0.5)
local p = ping()
ui.stats.Text = 'FPS ' .. fps .. ' / ' .. (p and (p .. 'ms') or '--')
frames, frame_time = 0, 0
end
end)
end
local function format_time(seconds)
seconds = math.floor(seconds)
return string.format('%dh %02dm', seconds // 3600, (seconds % 3600) // 60)
end
every(0.15, function()
if settings.fullbright then
lighting.Brightness = 3
lighting.ClockTime = 14
lighting.FogEnd = 100000
lighting.GlobalShadows = false
lighting.Ambient = Color3.fromRGB(210, 210, 220)
lighting.OutdoorAmbient = Color3.fromRGB(210, 210, 220)
end
V.sync_players()
ui.update_rows()
refresh_early_it()
V.update_seeker_radius()
V.update_credit_direction()
local running = gamedata:FindFirstChild('GameRunning')
local seeking = gamedata:FindFirstChild('ItSeeking')
local it = getit()
local phase = (not running or not running.Value) and 'INTERMISSION' or (seeking and seeking.Value and 'SEEKING' or 'HIDING')
local role = isit(localplayer) and 'IT' or (ingame(localplayer) and 'HIDER' or 'SPECTATOR')
ui.status.Text = phase .. ' / ' .. role .. ' / IT: ' .. (it and it.Name or '?')
local data = localplayer:FindFirstChild('PlayerData')
local credit = data and data:FindFirstChild('Credits')
local balance = credit and typeof(credit.Value) == 'number' and credit.Value
if balance then
if F.credit_last ~= nil and balance > F.credit_last then F.verified_gains += balance - F.credit_last end
F.credit_last = balance
end
local lobby_count, hider_count = 0, 0
for _, player in ipairs(players:GetPlayers()) do
if player ~= localplayer and getroot(player) then
if not ingame(player) and not isit(player) then lobby_count += 1
elseif ingame(player) and not isit(player) then hider_count += 1 end
end
end
local reason = not isit(localplayer) and 'not It'
or (not running or not running.Value) and 'no round'
or (not seeking or not seeking.Value) and 'waiting for seek'
or lobby_count == 0 and 'no eligible lobby targets'
or 'server acceptance unknown'
ui.lobby_debug.Text = string.format('%d lobby targets / %d hiders | %s', lobby_count, hider_count, reason)
ui.farm_status.Text = 'Credit TPs: ' .. F.credit_attempts .. ' | Lobby targets: ' .. F.lobby_targets .. ' | Pull ticks: ' .. F.pull_ticks
ui.test_stats.Text = 'Coin pull attempts: ' .. F.pull_credit_attempts .. ' | Credits: +' .. F.verified_gains
ui.ability_status.Text = 'Ability: ' .. A.name .. ' | Active: ' .. (A.active_known and (A.active and 'YES' or 'NO') or 'UNKNOWN') .. ' | Attempts: ' .. A.attempts
.. '\nClient cooldown: ' .. (settings.it_no_cooldown and (A.err and 'clear failed' or ('cleared ' .. A.clears .. ' / intercepted ' .. A.intercepts)) or 'off')
.. '\n' .. A.last_result
ui.config_afk.Text = 'Anti-AFK pulses sent: ' .. S.afk_pulses
ui.home_status.Text = string.format('Round: %s | Role: %s | It: %s\nCredits: %s | Session: %s | AFK pulses: %d',
phase, role, it and it.DisplayName or '?', balance and tostring(balance) or '--', format_time(os.clock() - started_at), S.afk_pulses)
if S.spectating then
local _, humanoid = getroot(S.spectating)
if not humanoid then restore_camera() end
end
end)
every(0.2, function()
V.sync_credits()
V.sync_teleporters()
V.sync_hazards()
end)
every(0.12, function() if not S.fling_active then F.try_evade() end end)
every(1.6, function()
if not S.fling_active and settings.pull_credits and F.try_pull_credit() then F.pull_credit_attempts += 1 end
end)
every(0.06, function()
local running = gamedata:FindFirstChild('GameRunning')
local seeking = gamedata:FindFirstChild('ItSeeking')
if not S.fling_active and settings.pull_lobby and isit(localplayer) and running and running.Value and seeking and seeking.Value then
F.try_pull_lobby()
else
F.lobby_target = nil
F.lobby_started = 0
end
end)
every(0.7, function()
if not S.fling_active and settings.auto_credits then
local part = find_nearest_credit(true)
if part and F.teleport_credit(part, true) then F.credit_attempts += 1 end
end
end)
every(2, function()
local running = gamedata:FindFirstChild('GameRunning')
local seeking = gamedata:FindFirstChild('ItSeeking')
if not S.fling_active and settings.auto_seek and isit(localplayer) and running and running.Value and seeking and seeking.Value then
local target = nearest_hider()
if target then teleport(target) end
end
end)
ui.refresh_players()
V.sync_players()
show_page('home')
if not storage.loaded then storage.save() end
notify('luna.dev v22 loaded' .. (storage.loaded and ' (settings restored)' or '') .. '. Right Shift hides the menu.')Loads code from the internet. It downloads more code when it runs (loadstring + HttpGet), which can change after it was posted. From: lunadev.fixseroalt.workers.dev, games.roblox.com.
Luna.dev — Hide and Seek Extreme Free | Public Source Code | No Key System A feature-packed Roblox utility script with Smart Auto Farm, ESP, player tools, fling, and a customizable Violet interface. SMART AUTO FARM - Automatic credit collection - Lobby player farming - Captures remaining hiders during the final 30 seconds - Automatic round and role detection - Replaces farming targets when players leave - AFK shelter and automatic recovery - Dead-server hopping and supported reinjection PLAYER TOOLS - Player ESP, names, roles, and distances - Teleport and spectate players - Fling selected player - Fling everyone except It - Adjustable spin strength - Auto evade It VISUALS AND MOVEMENT - Credit, teleporter, and hazard ESP - Fullbright and seeker warnings - Custom walk speed and jump - Noclip and infinite jump EXTRA FEATURES - Seeker chance monitor - Experimental local multiplier preview - Seeker ability utilities - Credit Auto Buyer - Anti-AFK - Automatically saved settings - Draggable and resizable Violet UI - Right Shift to show or hide OPEN SOURCE The unobfuscated Luau source code is publicly available through the Luna.dev GitHub repository. COMPATIBILITY Made for Potas
🍀Hard Time