local HIT_Y = 555
local FIRE_EARLY = 0
local DIRECTION = "down" -- locked
local HOLD_MIN_H = 70
--// DUEL ENGINE
local FORGE_TIME = true
local PRESS_LEAD = 0.02
local RING_X = 0.28
local APPROACH = 1.7
local JITTER_VAR = 0.012
--// CAMO
local CAMO_ON = true
local CAMO_N = 3
--// CLICK FARM
local FARM_ON = false
local FARM_RATE = 5
local FARM_MODE = "walk"
--// FLAGS
local DEBUG = true
local INPUT_MODE = "remote"
local ANTI_AFK = true
local ANTI_KICK = true
local HOLD_NOTES = true
local MAX_HOLD = 6
local SHIELD_ON = true
--// ZONES (lanes)
local ZONES = { D = { 0.5, 0.95 } }
local AUTO_LEARN = true
local ZONE_PAD = 0.08
--// DUEL asset → direction
local IMG_DIR = {
["126490284927469"] = "Up",
["100668880801499"] = "Down",
["81598601074836"] = "Left",
["100659830896052"] = "Right",
}
local KEY_FOR_DIR = {
Up = Enum.KeyCode.W, Down = Enum.KeyCode.S,
Left = Enum.KeyCode.A, Right = Enum.KeyCode.D,
}
local DIR_MAP = { W = "Up", S = "Down", A = "Left", D = "Right" }
--// LIBRARY
local Library
for _, url in ipairs({
"https://raw.githubusercontent.com/mstudio45/LinoriaLib/main/Library.lua",
"https://raw.githubusercontent.com/violin-suzutsuki/LinoriaLib/main/Library.lua",
}) do
local ok, lib = pcall(function() return loadstring(game:HttpGet(url))() end)
if ok and lib then Library = lib break end
end
assert(Library, "[aura] Linoria failed to load — both repos unreachable")
local okW, Window = pcall(function()
return Library:CreateWindow({ Title = "Aura // Highway", ToggleKey = Enum.KeyCode.RightShift, AutoShow = true })
end)
if not okW then Window = Library:CreateWindow("Aura // Highway", Enum.KeyCode.RightShift) end
--// SERVICES + STATE
local Replicated = game:GetService("ReplicatedStorage")
local Players = game:GetService("Players")
local RunService = game:GetService("RunService")
local UIS = game:GetService("UserInputService")
local VIM = game:GetService("VirtualInputManager")
local LP = Players.LocalPlayer
local gui = LP:WaitForChild("PlayerGui")
local highway = gui:WaitForChild("AuraLanes"):WaitForChild("Deck"):WaitForChild("Highway")
local enabled = true
local fired = {}
local prevY = {}
local count = 0
local farmWalking = false
--// REMOTES
local function getRemote(name)
local ok, ev = pcall(function() return Replicated.Events.Game[name] end)
return ok and ev or nil
end
local function serverNow()
local ok, t = pcall(function() return workspace:GetServerTimeNow() end)
return ok and t or os.time()
end
--// INPUT HELPERS
local function noteLetterOf(note)
local badge = note:FindFirstChild("KeyBadge", true)
local letter = badge and badge:FindFirstChild("Letter", true)
return letter and letter.Text or nil
end
local function keyCodeOf(name)
local ok, code = pcall(function() return Enum.KeyCode[name:upper()] end)
return ok and code or nil
end
local function keyTap(code)
pcall(function()
VIM:SendKeyEvent(true, code, false, game)
task.wait(0.03)
VIM:SendKeyEvent(false, code, false, game)
end)
end
local function setFarmWalk(on)
if farmWalking == on then return end
farmWalking = on
pcall(function()
VIM:SendKeyEvent(on, Enum.KeyCode.W, false, game)
end)
end
--// CAMO MISS ENGINE
local roundNotes = 0
local lastNoteSeen = 0
local missSlots = {}
local function sampleMissSlots(n)
local slots, prev = {}, 1
for i = 1, n do
local lo = (i == 1) and 2 or (prev + 8)
local hi = (i == 1) and 4 or (prev + 30)
prev = math.random(lo, hi)
slots[prev] = true
end
return slots
end
missSlots = sampleMissSlots(CAMO_N)
local function isCamoMiss()
roundNotes = roundNotes + 1
lastNoteSeen = os.clock()
return missSlots[roundNotes] == true
end
task.spawn(function()
while true do
task.wait(3)
if roundNotes > 0 and os.clock() - lastNoteSeen > 10 then
roundNotes = 0
missSlots = sampleMissSlots(CAMO_N)
if DEBUG then print("[aura] camo: new round, slots resampled") end
end
end
end)
--// HOLD ENGINE
local HOLDS = {}
local function startHold(key, note, code)
if not HOLD_NOTES then return end
local h = HOLDS[key]
if not h then
h = { notes = {}, startedAt = os.clock(), keyDown = false, code = code }
HOLDS[key] = h
if INPUT_MODE == "key" and code then
pcall(function() VIM:SendKeyEvent(true, code, false, game) end)
h.keyDown = true
end
if DEBUG then print("[aura] hold:", key) end
end
h.notes[note] = true
end
local function releaseAllHolds()
for key, h in pairs(HOLDS) do
if h.keyDown and h.code then
pcall(function() VIM:SendKeyEvent(false, h.code, false, game) end)
end
HOLDS[key] = nil
end
end
--// PRESS DELIVERY
local function firePress(dir, timestamp, isHold)
local duel = getRemote("AuraDuel")
if duel then
pcall(function() duel:FireServer("Press", dir, timestamp) end)
return
end
local code = KEY_FOR_DIR[dir]
if code then
if isHold then
pcall(function() VIM:SendKeyEvent(true, code, false, game) end)
else
keyTap(code)
end
end
end
local function pressNote(letter, isHold)
local dir = DIR_MAP[letter] or DIR_MAP[letter:upper()]
local duel = (INPUT_MODE == "remote") and getRemote("AuraDuel") or nil
if duel and dir then
pcall(function()
duel:FireServer("Press", dir, serverNow())
end)
return
end
local code = keyCodeOf(letter)
if code then
if isHold then
pcall(function() VIM:SendKeyEvent(true, code, false, game) end)
else
keyTap(code)
end
end
end
--// BUTTON COMPAT
local function addButtonCompat(group, idx, text, func)
local tries = {
function() return group:AddButton(idx, { Text = text, Func = func }) end,
function() return group:AddButton({ Text = text, Func = func }) end,
function() return group:AddButton(text, func) end,
}
for _, t in ipairs(tries) do
local ok, res = pcall(t)
if ok then return res end
end
return nil
end
--// ANTI-KICK
local oldNamecall
local function kickHook(self, ...)
local method = getnamecallmethod()
if ANTI_KICK and method == "Kick" and self == LP then
if DEBUG then print("[aura] anti-kick: blocked Kick:", ...) end
return nil
end
return oldNamecall(self, ...)
end
do
local wrap = newcclosure or function(f) return f end
local ok = pcall(function()
oldNamecall = hookmetamethod(game, "__namecall", wrap(kickHook))
end)
if not ok then
pcall(function()
local mt = getrawmetatable(game)
setreadonly(mt, false)
oldNamecall = hookfunction(mt.__namecall, wrap(kickHook))
end)
end
if oldNamecall then print("[aura] anti-kick hook armed") end
end
--// ANTI-AFK
LP.Idled:Connect(function()
if not ANTI_AFK then return end
pcall(function()
local vu = game:GetService("VirtualUser")
vu:CaptureController()
vu:ClickButton2(Vector2.new())
end)
pcall(function()
VIM:SendMouseMoveEvent(Vector2.new(math.random(100, 400), math.random(100, 400)))
end)
end)
task.spawn(function()
while true do
task.wait(60 + math.random(0, 30))
if ANTI_AFK then
pcall(function()
VIM:SendMouseMoveEvent(Vector2.new(math.random(100, 400), math.random(100, 400)))
end)
end
end
end)
--// TROLL SHIELD
local VICTIM_GUIS = { "TrollEffects", "TrollSplats", "BlindEffectGui" }
local shieldConns = {}
local function shieldSweep()
for _, name in ipairs(VICTIM_GUIS) do
local g = gui:FindFirstChild(name)
if g then
if name == "BlindEffectGui" then
g:Destroy()
else
g:ClearAllChildren()
end
end
end
local blur = game:GetService("Lighting"):FindFirstChild("BlindBlur")
if blur then blur.Size = 0 blur:Destroy() end
end
local function setShield(on)
for _, c in ipairs(shieldConns) do pcall(function() c:Disconnect() end) end
shieldConns = {}
SHIELD_ON = on
if not on then return end
table.insert(shieldConns, gui.ChildAdded:Connect(function(c)
if table.find(VICTIM_GUIS, c.Name) then task.defer(shieldSweep) end
end))
for _, name in ipairs(VICTIM_GUIS) do
local g = gui:FindFirstChild(name)
if g then
table.insert(shieldConns, g.ChildAdded:Connect(function() task.defer(shieldSweep) end))
end
end
task.spawn(function()
while SHIELD_ON do
shieldSweep()
task.wait(0.75)
end
end)
shieldSweep()
end
--// CLICK FARM
task.spawn(function()
while true do
if FARM_ON then
local Click = getRemote("Click")
if Click then pcall(function() Click:FireServer() end) end
task.wait(1 / FARM_RATE + math.random() * 0.03)
else
setFarmWalk(false)
task.wait(0.5)
end
end
end)
--// TOOLKIT — serializer
local function fmt(v, d)
d = d or 0
local t = typeof(v)
if t == "Instance" then return v:GetFullName() end
if t == "table" and d < 4 then
local parts = {}
if #v > 0 then
for i = 1, math.min(#v, 40) do parts[i] = fmt(v[i], d + 1) end
else
for k, val in pairs(v) do
table.insert(parts, tostring(k) .. "=" .. fmt(val, d + 1))
end
end
return "{" .. table.concat(parts, ", ") .. "}"
end
return tostring(v)
end
--// TOOLKIT — listen
_G.Listen = function(seconds)
local conns, n = {}, 0
for _, d in ipairs(Replicated.Events.Game:GetDescendants()) do
if d:IsA("RemoteEvent") then
n = n + 1
table.insert(conns, d.OnClientEvent:Connect(function(...)
print("[listen<] " .. d.Name .. " " .. fmt({ ... }))
end))
end
end
task.delay(seconds or 10, function()
for _, c in ipairs(conns) do pcall(function() c:Disconnect() end) end
print("[listen] off (" .. n .. " remotes)")
end)
print("[listen] armed on " .. n .. " Game remotes for " .. (seconds or 10) .. "s")
end
--// TOOLKIT — race prober
_G.ProbeRace = function(mode)
local Race = getRemote("Race")
if not Race then return print("[probe] Race missing") end
local conn
conn = Race.OnClientEvent:Connect(function(payload)
print("[probe<] Race: " .. fmt(payload))
end)
task.delay(5, function() if conn then conn:Disconnect() end end)
pcall(function() Race:FireServer({ Mode = tostring(mode) }) end)
print("[probe>] Race:FireServer({Mode='" .. tostring(mode) .. "'}) — listening 5s")
end
--// TOOLKIT — troll prober v3
local KIND_WORDS = {
["Trow Tomato"] = "Throw", ["Slip Them"] = "Slip",
["Drop Bomb"] = "Bomb", ["Blind Them"] = "Blind",
["KeySwap Them"] = "KeySwap", ["Freeze Them"] = "Freeze",
["Kill Them"] = "Kill", ["Drop Nuke"] = "Nuke",
}
_G.ProbeTroll = function(targetName, troll)
troll = troll or "Trow Tomato"
local Troll = getRemote("Troll")
local target = targetName and Players:FindFirstChild(targetName)
if not Troll or not target then
return print("[troll] need: _G.ProbeTroll('PlayerName', 'Trow Tomato')")
end
local expect = KIND_WORDS[troll] or "Throw"
local word = troll:match("(%a+)$")
local shapes = {
function(t) Troll:FireServer(t, troll) end,
function(t) Troll:FireServer(troll, t) end,
function(t) Troll:FireServer("Throw", troll, t) end,
function(t) Troll:FireServer(t, "Throw", word) end,
function(t) Troll:FireServer(t, "Throw", troll) end,
}
local hit = false
local conn = Troll.OnClientEvent:Connect(function(pl)
if type(pl) == "table" and (pl.Kind == expect
or (pl.Asset and pl.Asset:find(word, 1, true))
or pl.Target == target) then
hit = true
end
end)
for i, shape in ipairs(shapes) do
hit = false
pcall(shape, target)
local t0 = os.clock()
while not hit and os.clock() - t0 < 1.2 do task.wait(0.05) end
if hit then
print("[troll] shape #" .. i .. " confirmed for '" .. troll .. "'")
conn:Disconnect()
return i
end
end
conn:Disconnect()
print("[troll] no shape confirmed — run the namecall spy, click one troll, send me the line")
end
_G.TrollAll = function(troll, interval)
troll = troll or "Trow Tomato"
interval = interval or 1.5
local Troll = getRemote("Troll")
if not Troll then return print("[troll] no remote") end
task.spawn(function()
for _, p in ipairs(Players:GetPlayers()) do
if p ~= LP then
pcall(function() Troll:FireServer(p, troll) end)
task.wait(interval)
end
end
print("[troll] barrage done")
end)
end
--// TOOLKIT — equip prober
_G.ProbeEquip = function(sort, name)
local ev = getRemote(sort)
if not ev then return print("[equip] no remote named " .. tostring(sort)) end
local conn = ev.OnClientEvent:Connect(function(...)
print("[equip<] " .. sort .. " " .. fmt({ ... }))
end)
task.delay(6, function() conn:Disconnect() end)
pcall(function() ev:FireServer(name) end)
pcall(function() ev:FireServer("Equip", name) end)
pcall(function() ev:FireServer("Buy", name) end)
pcall(function() ev:FireServer({ Action = "Equip", Name = name }) end)
print("[equip>] fired 4 shapes for " .. sort .. " '" .. tostring(name) .. "' — watching 6s")
end
--// INTEL — chart sync logger
_G.ChartLog = function(seconds)
local duel = getRemote("AuraDuel")
if not duel then return print("[chart] AuraDuel missing") end
local conn = duel.OnClientEvent:Connect(function(...)
local args = { ... }
print("[chart<] broadcast, " .. #args .. " args:")
for i, a in ipairs(args) do
if type(a) == "table" and #a > 0 then
print(string.format("[chart] arg %d = array of %d:", i, #a))
for j, n in ipairs(a) do
if type(n) == "table" then
print(string.format("[chart] [%d] %s", j, fmt(n, 1)))
end
end
else
print(string.format("[chart] arg %d = %s", i, tostring(a)))
end
end
end)
task.delay(seconds or 30, function() conn:Disconnect() print("[chart] off") end)
print("[chart] listening — START A DUEL NOW")
end
--// INTEL — live note array from memory
_G.DumpNotes = function()
if not getreg or not getupvalues then
return print("[dump] executor lacks getreg/getupvalues — use _G.ChartLog instead")
end
local seen, found = {}, {}
for _, f in ipairs(getreg()) do
if type(f) == "function" then
local ok, upv = pcall(getupvalues, f)
if ok and type(upv) == "table" then
for _, v in pairs(upv) do
if type(v) == "table" and not seen[v]
and type(v[1]) == "table" and v[1].Time and v[1].Direction then
seen[v] = true
table.insert(found, v)
end
end
end
end
end
if #found == 0 then return print("[dump] no live chart found — run this DURING a duel") end
for ai, arr in ipairs(found) do
print(string.format("[dump] chart #%d — %d live notes", ai, #arr))
for i, n in ipairs(arr) do
print(string.format(" [%s] Dir=%s Time=%.3f Hold=%s Done=%s",
tostring(n.Index), tostring(n.Direction),
tonumber(n.Time) or -1, tostring(n.Hold), tostring(n.Done)))
end
end
end
--// INTEL — press log, both directions
_G.PressLog = function(seconds)
local duel = getRemote("AuraDuel")
if not duel then return print("[press] AuraDuel missing") end
duel.OnClientEvent:Connect(function(...)
print("[press<] " .. fmt({ ... }))
end)
local old
old = hookmetamethod(game, "__namecall", function(self, ...)
local m = getnamecallmethod()
if m == "FireServer" and self == duel then
print("[press>] FireServer(" .. fmt({ ... }) .. ")")
end
return old(self, ...)
end)
task.delay(seconds or 30, function() print("[press] off (hook stays, it's inert)") end)
print("[press] PLAY A FEW NOTES BY HAND NOW — mix perfects and misses")
end
--// INTEL — full UI tree
_G.DumpUI = function()
local function dump(inst, depth)
if depth > 6 then return end
local extra = ""
if inst:IsA("GuiObject") then
local p, s = inst.Position, inst.Size
extra = string.format(" pos=(%.3f,%.3f)+(%.0f,%.0f) size=(%.3f,%.3f)+(%.0f,%.0f)",
p.X.Scale, p.Y.Scale, p.X.Offset, p.Y.Offset,
s.X.Scale, s.Y.Scale, s.X.Offset, s.Y.Offset)
end
if inst:IsA("TextLabel") or inst:IsA("TextButton") then
extra = extra .. " text=" .. string.format("%q", tostring(inst.Text))
end
if inst:IsA("ImageLabel") or inst:IsA("ImageButton") then
extra = extra .. " img=" .. tostring(inst.Image)
end
print(string.rep(" ", depth) .. inst.Name .. " [" .. inst.ClassName .. "]" .. extra)
for _, c in ipairs(inst:GetChildren()) do dump(c, depth + 1) end
end
local lanes = gui:FindFirstChild("AuraLanes")
if lanes then print("== AURALANES ==") dump(lanes, 0) end
local dance = gui:FindFirstChild("AuraDance")
if dance then
print("== AURADANCE ==")
local track = dance:FindFirstChild("Root") and dance.Root:FindFirstChild("Track")
dump(track or dance, 0)
end
print("== done ==")
end
--// PANEL
local Main = Window:AddTab("Main")
local Left = Main:AddLeftGroupbox("Autofire")
local Farm = Main:AddLeftGroupbox("Click Farm")
local Right = Main:AddRightGroupbox("Status")
Left:AddToggle("AutoFire", { Text = "Autofire", Default = true,
Callback = function(v) enabled = v; releaseAllHolds() end })
Left:AddToggle("ForgeTime", { Text = "Forge timestamps (duel)", Default = FORGE_TIME,
Callback = function(v) FORGE_TIME = v end })
Left:AddToggle("CamoMiss", { Text = "Camo misses", Default = CAMO_ON,
Callback = function(v) CAMO_ON = v end })
Left:AddSlider("CamoCount", { Text = "Misses per song", Min = 1, Max = 5, Default = CAMO_N,
Round = 0, Rounding = 0, Decimals = 0,
Callback = function(v)
CAMO_N = math.floor(v + 0.5)
missSlots = sampleMissSlots(CAMO_N)
roundNotes = 0
end })
Left:AddToggle("HoldNotes", { Text = "Hold notes", Default = HOLD_NOTES,
Callback = function(v) HOLD_NOTES = v; if not v then releaseAllHolds() end end })
Left:AddToggle("AntiAfk", { Text = "Anti-AFK", Default = ANTI_AFK,
Callback = function(v) ANTI_AFK = v end })
Left:AddToggle("AntiKick", { Text = "Anti-Kick", Default = ANTI_KICK,
Callback = function(v) ANTI_KICK = v end })
Left:AddToggle("Shield", { Text = "Troll shield", Default = true,
Callback = function(v) setShield(v) end })
Left:AddSlider("FireEarly", { Text = "Fire early (lanes)", Min = 0, Max = 100, Default = FIRE_EARLY, Suffix = "px",
Round = 0, Rounding = 0, Decimals = 0,
Callback = function(v) FIRE_EARLY = math.floor(v + 0.5) end })
Left:AddDropdown("InputMode", { Text = "Input mode", Values = { "remote", "key" }, Default = INPUT_MODE,
Callback = function(v) INPUT_MODE = v end })
Left:AddToggle("Debug", { Text = "Debug prints", Default = DEBUG,
Callback = function(v) DEBUG = v end })
addButtonCompat(Left, "PrintZones", "Print learned zones", function()
for l, z in pairs(ZONES) do
print(string.format("[aura] zone %s: [%.3f, %.3f]", l, z[1], z[2]))
end
end)
Farm:AddToggle("FarmOn", { Text = "Farm clicks", Default = FARM_ON,
Callback = function(v)
FARM_ON = v
setFarmWalk(v and FARM_MODE == "walk")
print("[aura] farm " .. (v and "ON" or "OFF") .. " @ " .. FARM_RATE .. "/s " .. FARM_MODE)
end })
Farm:AddSlider("FarmRate", { Text = "Rate", Min = 1, Max = 30, Default = FARM_RATE, Suffix = "/s",
Round = 0, Rounding = 0, Decimals = 0,
Callback = function(v) FARM_RATE = math.floor(v + 0.5) end })
Farm:AddDropdown("FarmMode", { Text = "Mode", Values = { "walk", "static" }, Default = FARM_MODE,
Callback = function(v)
FARM_MODE = v
setFarmWalk(FARM_ON and v == "walk")
end })
local lastLabel, countLabel
pcall(function()
lastLabel = Right:AddLabel("waiting for notes...")
countLabel = Right:AddLabel("notes fired: 0")
end)
local function setLast(t) if lastLabel then pcall(function() lastLabel:SetText(t) end) end end
local function setCount(t) if countLabel then pcall(function() countLabel:SetText(t) end) end end
--// HOTKEY
UIS.InputBegan:Connect(function(input, gp)
if gp then return end
if input.KeyCode == Enum.KeyCode.RightControl then
enabled = not enabled
releaseAllHolds()
pcall(function() Toggles.AutoFire:SetValue(enabled) end)
print("[aura] autofire " .. (enabled and "ON" or "OFF"))
end
end)
--// SETTINGS TAB
pcall(function()
local base = "https://raw.githubusercontent.com/mstudio45/LinoriaLib/main/addons/"
local ThemeManager = loadstring(game:HttpGet(base .. "ThemeManager.lua"))()
local SaveManager = loadstring(game:HttpGet(base .. "SaveManager.lua"))()
local SettingsTab = Window:AddTab("Settings")
ThemeManager:SetLibrary(Library)
SaveManager:SetLibrary(Library)
SaveManager:IgnoreThemeSettings()
ThemeManager:SetFolder("AuraBattle")
SaveManager:SetFolder("AuraBattle/autofire")
SaveManager:BuildConfigSection(SettingsTab)
SaveManager:ApplyToTab(SettingsTab)
ThemeManager:ApplyToTab(SettingsTab)
end)
--// DUEL ENGINE
local function arrowDirection(arrow)
local glyph = arrow:FindFirstChild("Glyph")
local colour = glyph and glyph:FindFirstChild("Colour")
if colour then
local id = tostring(colour.Image):match("(%d+)$")
if id and IMG_DIR[id] then return IMG_DIR[id] end
end
return nil
end
local function duelStep()
local dance = gui:FindFirstChild("AuraDance")
local root = dance and dance:FindFirstChild("Root")
local track = root and root:FindFirstChild("Track")
if not track then return end
local now = serverNow()
for _, arrow in ipairs(track:GetChildren()) do
if arrow.Name:match("^Arrow%d+") and arrow:IsA("GuiObject") then
if not fired[arrow] then
local dir = arrowDirection(arrow)
if dir then
local xs = arrow.Position.X.Scale
local noteTime = now + (xs - RING_X) * APPROACH / 0.72
if now >= noteTime - PRESS_LEAD then
fired[arrow] = true
if CAMO_ON and isCamoMiss() then
setLast("camo miss @ note " .. roundNotes)
if DEBUG then print("[aura] camo miss (duel) note " .. roundNotes) end
else
local t = (FORGE_TIME and noteTime or now)
if JITTER_VAR > 0 then t = t + (math.random() - 0.5) * JITTER_VAR end
local idx = arrow.Name:match("^Arrow(%d+)")
local tail = HOLD_NOTES and idx and track:FindFirstChild("HoldTail" .. idx)
firePress(dir, t, tail ~= nil)
if tail then startHold(dir, arrow, KEY_FOR_DIR[dir]) end
count = count + 1
setLast("last: " .. dir .. (tail and " (hold)" or "") .. " dt="
.. string.format("%.0f", (now - noteTime) * 1000) .. "ms")
setCount("notes fired: " .. count)
if DEBUG then
print(string.format("[aura] duel %s%s dt=%dms", dir, tail and "+hold" or "",
(now - noteTime) * 1000))
end
end
end
end
elseif arrow.Position.X.Scale > RING_X + 0.3 then
fired[arrow] = nil
end
end
end
end
--// LANES ENGINE
local function learnZone(letter, xs)
if not AUTO_LEARN or not letter or ZONES[letter] then return end
ZONES[letter] = { xs - ZONE_PAD, xs + ZONE_PAD }
print(string.format("[aura] learned zone %s: [%.3f, %.3f]", letter, xs - ZONE_PAD, xs + ZONE_PAD))
end
local function lanesStep()
local threshold = (DIRECTION == "down") and (HIT_Y - FIRE_EARLY) or (HIT_Y + FIRE_EARLY)
for _, note in ipairs(highway:GetChildren()) do
if note.Name:match("^Note%d+") and note:IsA("GuiObject") then
local badge = note:FindFirstChild("KeyBadge", true)
local letter = badge and badge:FindFirstChild("Letter", true)
letter = letter and letter.Text or nil
if letter then
local xs = (note.AbsolutePosition.X - highway.AbsolutePosition.X + note.AbsoluteSize.X * 0.5)
/ math.max(highway.AbsoluteSize.X, 1)
local y = note.AbsolutePosition.Y - highway.AbsolutePosition.Y
learnZone(letter, xs)
local zone = ZONES[letter]
local inZone = zone and (xs >= zone[1] - 0.02 and xs <= zone[2] + 0.02)
local p = prevY[note]
prevY[note] = y
local crossed = p and (
(DIRECTION == "down" and p < threshold and y >= threshold) or
(DIRECTION == "up" and p > threshold and y <= threshold))
if crossed and inZone and not fired[note] then
fired[note] = true
if CAMO_ON and isCamoMiss() then
setLast("camo miss @ note " .. roundNotes)
if DEBUG then print("[aura] camo miss (lanes) note " .. roundNotes) end
else
local isHold = HOLD_NOTES and (note.AbsoluteSize.Y >= HOLD_MIN_H)
pressNote(letter, isHold)
if isHold then startHold(letter, note, keyCodeOf(letter)) end
count = count + 1
setLast("last: " .. letter .. (isHold and " (hold)" or "") .. " y=" .. y)
setCount("notes fired: " .. count)
if DEBUG then
print(string.format("[aura] lanes %s%s y=%d->%d", letter, isHold and "+hold" or "", p, y))
end
end
elseif fired[note] and (DIRECTION == "down") and (y < HIT_Y - 150) then
fired[note] = nil
elseif fired[note] and (DIRECTION == "up") and (y > HIT_Y + 150) then
fired[note] = nil
end
end
end
end
end
--// MAIN LOOP
RunService.RenderStepped:Connect(function()
if not enabled then return end
duelStep()
lanesStep()
if HOLD_NOTES then
local now = os.clock()
for key, h in pairs(HOLDS) do
for n in pairs(h.notes) do
if not n:IsDescendantOf(game) then
h.notes[n] = nil
end
end
local empty = true
for _ in pairs(h.notes) do empty = false break end
if empty or (now - h.startedAt > MAX_HOLD) then
if h.keyDown and h.code then
pcall(function() VIM:SendKeyEvent(false, h.code, false, game) end)
end
HOLDS[key] = nil
end
end
end
end)
task.spawn(function()
while true do
task.wait(2)
for k in pairs(prevY) do
if not k:IsDescendantOf(highway) then
prevY[k] = nil
fired[k] = nil
end
end
end
end)
setShield(true)Auto play auto bot anti afk anti kick working new unpatched #auto #bot #antiafk #anti #antikick #working #new #unpatched #notpatched #auto #bypass
No comments yet. Be the first to comment!
1local HIT_Y = 555
2local FIRE_EARLY = 0
3local DIRECTION = "down" -- locked
4local HOLD_MIN_H = 70
5
6--// DUEL ENGINE
7local FORGE_TIME = true
8local PRESS_LEAD = 0.02
9local RING_X = 0.28
10local APPROACH = 1.7
11local JITTER_VAR = 0.012
12
13--// CAMO
14local CAMO_ON = true
15local CAMO_N = 3
16
17--// CLICK FARM
18local FARM_ON = false
19local FARM_RATE = 5
20local FARM_MODE = "walk"
21
22--// FLAGS
23local DEBUG = true
24local INPUT_MODE = "remote"
25local ANTI_AFK = true
26local ANTI_KICK = true
27local HOLD_NOTES = true
28local MAX_HOLD = 6
29local SHIELD_ON = true
30
31--// ZONES (lanes)
32local ZONES = { D = { 0.5, 0.95 } }
33local AUTO_LEARN = true
34local ZONE_PAD = 0.08
35
36--// DUEL asset → direction
37local IMG_DIR = {
38 ["126490284927469"] = "Up",
39 ["100668880801499"] = "Down",
40 ["81598601074836"] = "Left",
41 ["100659830896052"] = "Right",
42}
43local KEY_FOR_DIR = {
44 Up = Enum.KeyCode.W, Down = Enum.KeyCode.S,
45 Left = Enum.KeyCode.A, Right = Enum.KeyCode.D,
46}
47local DIR_MAP = { W = "Up", S = "Down", A = "Left", D = "Right" }
48
49--// LIBRARY
50local Library
51for _, url in ipairs({
52 "https://raw.githubusercontent.com/mstudio45/LinoriaLib/main/Library.lua",
53 "https://raw.githubusercontent.com/violin-suzutsuki/LinoriaLib/main/Library.lua",
54}) do
55 local ok, lib = pcall(function() return loadstring(game:HttpGet(url))() end)
56 if ok and lib then Library = lib break end
57end
58assert(Library, "[aura] Linoria failed to load — both repos unreachable")
59
60local okW, Window = pcall(function()
61 return Library:CreateWindow({ Title = "Aura // Highway", ToggleKey = Enum.KeyCode.RightShift, AutoShow = true })
62end)
63if not okW then Window = Library:CreateWindow("Aura // Highway", Enum.KeyCode.RightShift) end
64
65--// SERVICES + STATE
66local Replicated = game:GetService("ReplicatedStorage")
67local Players = game:GetService("Players")
68local RunService = game:GetService("RunService")
69local UIS = game:GetService("UserInputService")
70local VIM = game:GetService("VirtualInputManager")
71local LP = Players.LocalPlayer
72local gui = LP:WaitForChild("PlayerGui")
73local highway = gui:WaitForChild("AuraLanes"):WaitForChild("Deck"):WaitForChild("Highway")
74
75local enabled = true
76local fired = {}
77local prevY = {}
78local count = 0
79local farmWalking = false
80
81--// REMOTES
82local function getRemote(name)
83 local ok, ev = pcall(function() return Replicated.Events.Game[name] end)
84 return ok and ev or nil
85end
86
87local function serverNow()
88 local ok, t = pcall(function() return workspace:GetServerTimeNow() end)
89 return ok and t or os.time()
90end
91
92--// INPUT HELPERS
93local function noteLetterOf(note)
94 local badge = note:FindFirstChild("KeyBadge", true)
95 local letter = badge and badge:FindFirstChild("Letter", true)
96 return letter and letter.Text or nil
97end
98
99local function keyCodeOf(name)
100 local ok, code = pcall(function() return Enum.KeyCode[name:upper()] end)
101 return ok and code or nil
102end
103
104local function keyTap(code)
105 pcall(function()
106 VIM:SendKeyEvent(true, code, false, game)
107 task.wait(0.03)
108 VIM:SendKeyEvent(false, code, false, game)
109 end)
110end
111
112local function setFarmWalk(on)
113 if farmWalking == on then return end
114 farmWalking = on
115 pcall(function()
116 VIM:SendKeyEvent(on, Enum.KeyCode.W, false, game)
117 end)
118end
119
120--// CAMO MISS ENGINE
121local roundNotes = 0
122local lastNoteSeen = 0
123local missSlots = {}
124
125local function sampleMissSlots(n)
126 local slots, prev = {}, 1
127 for i = 1, n do
128 local lo = (i == 1) and 2 or (prev + 8)
129 local hi = (i == 1) and 4 or (prev + 30)
130 prev = math.random(lo, hi)
131 slots[prev] = true
132 end
133 return slots
134end
135
136missSlots = sampleMissSlots(CAMO_N)
137
138local function isCamoMiss()
139 roundNotes = roundNotes + 1
140 lastNoteSeen = os.clock()
141 return missSlots[roundNotes] == true
142end
143
144task.spawn(function()
145 while true do
146 task.wait(3)
147 if roundNotes > 0 and os.clock() - lastNoteSeen > 10 then
148 roundNotes = 0
149 missSlots = sampleMissSlots(CAMO_N)
150 if DEBUG then print("[aura] camo: new round, slots resampled") end
151 end
152 end
153end)
154
155--// HOLD ENGINE
156local HOLDS = {}
157
158local function startHold(key, note, code)
159 if not HOLD_NOTES then return end
160 local h = HOLDS[key]
161 if not h then
162 h = { notes = {}, startedAt = os.clock(), keyDown = false, code = code }
163 HOLDS[key] = h
164 if INPUT_MODE == "key" and code then
165 pcall(function() VIM:SendKeyEvent(true, code, false, game) end)
166 h.keyDown = true
167 end
168 if DEBUG then print("[aura] hold:", key) end
169 end
170 h.notes[note] = true
171end
172
173local function releaseAllHolds()
174 for key, h in pairs(HOLDS) do
175 if h.keyDown and h.code then
176 pcall(function() VIM:SendKeyEvent(false, h.code, false, game) end)
177 end
178 HOLDS[key] = nil
179 end
180end
181
182--// PRESS DELIVERY
183local function firePress(dir, timestamp, isHold)
184 local duel = getRemote("AuraDuel")
185 if duel then
186 pcall(function() duel:FireServer("Press", dir, timestamp) end)
187 return
188 end
189 local code = KEY_FOR_DIR[dir]
190 if code then
191 if isHold then
192 pcall(function() VIM:SendKeyEvent(true, code, false, game) end)
193 else
194 keyTap(code)
195 end
196 end
197end
198
199local function pressNote(letter, isHold)
200 local dir = DIR_MAP[letter] or DIR_MAP[letter:upper()]
201 local duel = (INPUT_MODE == "remote") and getRemote("AuraDuel") or nil
202 if duel and dir then
203 pcall(function()
204 duel:FireServer("Press", dir, serverNow())
205 end)
206 return
207 end
208 local code = keyCodeOf(letter)
209 if code then
210 if isHold then
211 pcall(function() VIM:SendKeyEvent(true, code, false, game) end)
212 else
213 keyTap(code)
214 end
215 end
216end
217
218--// BUTTON COMPAT
219local function addButtonCompat(group, idx, text, func)
220 local tries = {
221 function() return group:AddButton(idx, { Text = text, Func = func }) end,
222 function() return group:AddButton({ Text = text, Func = func }) end,
223 function() return group:AddButton(text, func) end,
224 }
225 for _, t in ipairs(tries) do
226 local ok, res = pcall(t)
227 if ok then return res end
228 end
229 return nil
230end
231
232--// ANTI-KICK
233local oldNamecall
234local function kickHook(self, ...)
235 local method = getnamecallmethod()
236 if ANTI_KICK and method == "Kick" and self == LP then
237 if DEBUG then print("[aura] anti-kick: blocked Kick:", ...) end
238 return nil
239 end
240 return oldNamecall(self, ...)
241end
242
243do
244 local wrap = newcclosure or function(f) return f end
245 local ok = pcall(function()
246 oldNamecall = hookmetamethod(game, "__namecall", wrap(kickHook))
247 end)
248 if not ok then
249 pcall(function()
250 local mt = getrawmetatable(game)
251 setreadonly(mt, false)
252 oldNamecall = hookfunction(mt.__namecall, wrap(kickHook))
253 end)
254 end
255 if oldNamecall then print("[aura] anti-kick hook armed") end
256end
257
258--// ANTI-AFK
259LP.Idled:Connect(function()
260 if not ANTI_AFK then return end
261 pcall(function()
262 local vu = game:GetService("VirtualUser")
263 vu:CaptureController()
264 vu:ClickButton2(Vector2.new())
265 end)
266 pcall(function()
267 VIM:SendMouseMoveEvent(Vector2.new(math.random(100, 400), math.random(100, 400)))
268 end)
269end)
270
271task.spawn(function()
272 while true do
273 task.wait(60 + math.random(0, 30))
274 if ANTI_AFK then
275 pcall(function()
276 VIM:SendMouseMoveEvent(Vector2.new(math.random(100, 400), math.random(100, 400)))
277 end)
278 end
279 end
280end)
281
282--// TROLL SHIELD
283local VICTIM_GUIS = { "TrollEffects", "TrollSplats", "BlindEffectGui" }
284local shieldConns = {}
285
286local function shieldSweep()
287 for _, name in ipairs(VICTIM_GUIS) do
288 local g = gui:FindFirstChild(name)
289 if g then
290 if name == "BlindEffectGui" then
291 g:Destroy()
292 else
293 g:ClearAllChildren()
294 end
295 end
296 end
297 local blur = game:GetService("Lighting"):FindFirstChild("BlindBlur")
298 if blur then blur.Size = 0 blur:Destroy() end
299end
300
301local function setShield(on)
302 for _, c in ipairs(shieldConns) do pcall(function() c:Disconnect() end) end
303 shieldConns = {}
304 SHIELD_ON = on
305 if not on then return end
306 table.insert(shieldConns, gui.ChildAdded:Connect(function(c)
307 if table.find(VICTIM_GUIS, c.Name) then task.defer(shieldSweep) end
308 end))
309 for _, name in ipairs(VICTIM_GUIS) do
310 local g = gui:FindFirstChild(name)
311 if g then
312 table.insert(shieldConns, g.ChildAdded:Connect(function() task.defer(shieldSweep) end))
313 end
314 end
315 task.spawn(function()
316 while SHIELD_ON do
317 shieldSweep()
318 task.wait(0.75)
319 end
320 end)
321 shieldSweep()
322end
323
324--// CLICK FARM
325task.spawn(function()
326 while true do
327 if FARM_ON then
328 local Click = getRemote("Click")
329 if Click then pcall(function() Click:FireServer() end) end
330 task.wait(1 / FARM_RATE + math.random() * 0.03)
331 else
332 setFarmWalk(false)
333 task.wait(0.5)
334 end
335 end
336end)
337
338--// TOOLKIT — serializer
339local function fmt(v, d)
340 d = d or 0
341 local t = typeof(v)
342 if t == "Instance" then return v:GetFullName() end
343 if t == "table" and d < 4 then
344 local parts = {}
345 if #v > 0 then
346 for i = 1, math.min(#v, 40) do parts[i] = fmt(v[i], d + 1) end
347 else
348 for k, val in pairs(v) do
349 table.insert(parts, tostring(k) .. "=" .. fmt(val, d + 1))
350 end
351 end
352 return "{" .. table.concat(parts, ", ") .. "}"
353 end
354 return tostring(v)
355end
356
357--// TOOLKIT — listen
358_G.Listen = function(seconds)
359 local conns, n = {}, 0
360 for _, d in ipairs(Replicated.Events.Game:GetDescendants()) do
361 if d:IsA("RemoteEvent") then
362 n = n + 1
363 table.insert(conns, d.OnClientEvent:Connect(function(...)
364 print("[listen<] " .. d.Name .. " " .. fmt({ ... }))
365 end))
366 end
367 end
368 task.delay(seconds or 10, function()
369 for _, c in ipairs(conns) do pcall(function() c:Disconnect() end) end
370 print("[listen] off (" .. n .. " remotes)")
371 end)
372 print("[listen] armed on " .. n .. " Game remotes for " .. (seconds or 10) .. "s")
373end
374
375--// TOOLKIT — race prober
376_G.ProbeRace = function(mode)
377 local Race = getRemote("Race")
378 if not Race then return print("[probe] Race missing") end
379 local conn
380 conn = Race.OnClientEvent:Connect(function(payload)
381 print("[probe<] Race: " .. fmt(payload))
382 end)
383 task.delay(5, function() if conn then conn:Disconnect() end end)
384 pcall(function() Race:FireServer({ Mode = tostring(mode) }) end)
385 print("[probe>] Race:FireServer({Mode='" .. tostring(mode) .. "'}) — listening 5s")
386end
387
388--// TOOLKIT — troll prober v3
389local KIND_WORDS = {
390 ["Trow Tomato"] = "Throw", ["Slip Them"] = "Slip",
391 ["Drop Bomb"] = "Bomb", ["Blind Them"] = "Blind",
392 ["KeySwap Them"] = "KeySwap", ["Freeze Them"] = "Freeze",
393 ["Kill Them"] = "Kill", ["Drop Nuke"] = "Nuke",
394}
395
396_G.ProbeTroll = function(targetName, troll)
397 troll = troll or "Trow Tomato"
398 local Troll = getRemote("Troll")
399 local target = targetName and Players:FindFirstChild(targetName)
400 if not Troll or not target then
401 return print("[troll] need: _G.ProbeTroll('PlayerName', 'Trow Tomato')")
402 end
403 local expect = KIND_WORDS[troll] or "Throw"
404 local word = troll:match("(%a+)$")
405 local shapes = {
406 function(t) Troll:FireServer(t, troll) end,
407 function(t) Troll:FireServer(troll, t) end,
408 function(t) Troll:FireServer("Throw", troll, t) end,
409 function(t) Troll:FireServer(t, "Throw", word) end,
410 function(t) Troll:FireServer(t, "Throw", troll) end,
411 }
412 local hit = false
413 local conn = Troll.OnClientEvent:Connect(function(pl)
414 if type(pl) == "table" and (pl.Kind == expect
415 or (pl.Asset and pl.Asset:find(word, 1, true))
416 or pl.Target == target) then
417 hit = true
418 end
419 end)
420 for i, shape in ipairs(shapes) do
421 hit = false
422 pcall(shape, target)
423 local t0 = os.clock()
424 while not hit and os.clock() - t0 < 1.2 do task.wait(0.05) end
425 if hit then
426 print("[troll] shape #" .. i .. " confirmed for '" .. troll .. "'")
427 conn:Disconnect()
428 return i
429 end
430 end
431 conn:Disconnect()
432 print("[troll] no shape confirmed — run the namecall spy, click one troll, send me the line")
433end
434
435_G.TrollAll = function(troll, interval)
436 troll = troll or "Trow Tomato"
437 interval = interval or 1.5
438 local Troll = getRemote("Troll")
439 if not Troll then return print("[troll] no remote") end
440 task.spawn(function()
441 for _, p in ipairs(Players:GetPlayers()) do
442 if p ~= LP then
443 pcall(function() Troll:FireServer(p, troll) end)
444 task.wait(interval)
445 end
446 end
447 print("[troll] barrage done")
448 end)
449end
450
451--// TOOLKIT — equip prober
452_G.ProbeEquip = function(sort, name)
453 local ev = getRemote(sort)
454 if not ev then return print("[equip] no remote named " .. tostring(sort)) end
455 local conn = ev.OnClientEvent:Connect(function(...)
456 print("[equip<] " .. sort .. " " .. fmt({ ... }))
457 end)
458 task.delay(6, function() conn:Disconnect() end)
459 pcall(function() ev:FireServer(name) end)
460 pcall(function() ev:FireServer("Equip", name) end)
461 pcall(function() ev:FireServer("Buy", name) end)
462 pcall(function() ev:FireServer({ Action = "Equip", Name = name }) end)
463 print("[equip>] fired 4 shapes for " .. sort .. " '" .. tostring(name) .. "' — watching 6s")
464end
465
466--// INTEL — chart sync logger
467_G.ChartLog = function(seconds)
468 local duel = getRemote("AuraDuel")
469 if not duel then return print("[chart] AuraDuel missing") end
470 local conn = duel.OnClientEvent:Connect(function(...)
471 local args = { ... }
472 print("[chart<] broadcast, " .. #args .. " args:")
473 for i, a in ipairs(args) do
474 if type(a) == "table" and #a > 0 then
475 print(string.format("[chart] arg %d = array of %d:", i, #a))
476 for j, n in ipairs(a) do
477 if type(n) == "table" then
478 print(string.format("[chart] [%d] %s", j, fmt(n, 1)))
479 end
480 end
481 else
482 print(string.format("[chart] arg %d = %s", i, tostring(a)))
483 end
484 end
485 end)
486 task.delay(seconds or 30, function() conn:Disconnect() print("[chart] off") end)
487 print("[chart] listening — START A DUEL NOW")
488end
489
490--// INTEL — live note array from memory
491_G.DumpNotes = function()
492 if not getreg or not getupvalues then
493 return print("[dump] executor lacks getreg/getupvalues — use _G.ChartLog instead")
494 end
495 local seen, found = {}, {}
496 for _, f in ipairs(getreg()) do
497 if type(f) == "function" then
498 local ok, upv = pcall(getupvalues, f)
499 if ok and type(upv) == "table" then
500 for _, v in pairs(upv) do
501 if type(v) == "table" and not seen[v]
502 and type(v[1]) == "table" and v[1].Time and v[1].Direction then
503 seen[v] = true
504 table.insert(found, v)
505 end
506 end
507 end
508 end
509 end
510 if #found == 0 then return print("[dump] no live chart found — run this DURING a duel") end
511 for ai, arr in ipairs(found) do
512 print(string.format("[dump] chart #%d — %d live notes", ai, #arr))
513 for i, n in ipairs(arr) do
514 print(string.format(" [%s] Dir=%s Time=%.3f Hold=%s Done=%s",
515 tostring(n.Index), tostring(n.Direction),
516 tonumber(n.Time) or -1, tostring(n.Hold), tostring(n.Done)))
517 end
518 end
519end
520
521--// INTEL — press log, both directions
522_G.PressLog = function(seconds)
523 local duel = getRemote("AuraDuel")
524 if not duel then return print("[press] AuraDuel missing") end
525 duel.OnClientEvent:Connect(function(...)
526 print("[press<] " .. fmt({ ... }))
527 end)
528 local old
529 old = hookmetamethod(game, "__namecall", function(self, ...)
530 local m = getnamecallmethod()
531 if m == "FireServer" and self == duel then
532 print("[press>] FireServer(" .. fmt({ ... }) .. ")")
533 end
534 return old(self, ...)
535 end)
536 task.delay(seconds or 30, function() print("[press] off (hook stays, it's inert)") end)
537 print("[press] PLAY A FEW NOTES BY HAND NOW — mix perfects and misses")
538end
539
540--// INTEL — full UI tree
541_G.DumpUI = function()
542 local function dump(inst, depth)
543 if depth > 6 then return end
544 local extra = ""
545 if inst:IsA("GuiObject") then
546 local p, s = inst.Position, inst.Size
547 extra = string.format(" pos=(%.3f,%.3f)+(%.0f,%.0f) size=(%.3f,%.3f)+(%.0f,%.0f)",
548 p.X.Scale, p.Y.Scale, p.X.Offset, p.Y.Offset,
549 s.X.Scale, s.Y.Scale, s.X.Offset, s.Y.Offset)
550 end
551 if inst:IsA("TextLabel") or inst:IsA("TextButton") then
552 extra = extra .. " text=" .. string.format("%q", tostring(inst.Text))
553 end
554 if inst:IsA("ImageLabel") or inst:IsA("ImageButton") then
555 extra = extra .. " img=" .. tostring(inst.Image)
556 end
557 print(string.rep(" ", depth) .. inst.Name .. " [" .. inst.ClassName .. "]" .. extra)
558 for _, c in ipairs(inst:GetChildren()) do dump(c, depth + 1) end
559 end
560 local lanes = gui:FindFirstChild("AuraLanes")
561 if lanes then print("== AURALANES ==") dump(lanes, 0) end
562 local dance = gui:FindFirstChild("AuraDance")
563 if dance then
564 print("== AURADANCE ==")
565 local track = dance:FindFirstChild("Root") and dance.Root:FindFirstChild("Track")
566 dump(track or dance, 0)
567 end
568 print("== done ==")
569end
570
571--// PANEL
572local Main = Window:AddTab("Main")
573local Left = Main:AddLeftGroupbox("Autofire")
574local Farm = Main:AddLeftGroupbox("Click Farm")
575local Right = Main:AddRightGroupbox("Status")
576
577Left:AddToggle("AutoFire", { Text = "Autofire", Default = true,
578 Callback = function(v) enabled = v; releaseAllHolds() end })
579Left:AddToggle("ForgeTime", { Text = "Forge timestamps (duel)", Default = FORGE_TIME,
580 Callback = function(v) FORGE_TIME = v end })
581Left:AddToggle("CamoMiss", { Text = "Camo misses", Default = CAMO_ON,
582 Callback = function(v) CAMO_ON = v end })
583Left:AddSlider("CamoCount", { Text = "Misses per song", Min = 1, Max = 5, Default = CAMO_N,
584 Round = 0, Rounding = 0, Decimals = 0,
585 Callback = function(v)
586 CAMO_N = math.floor(v + 0.5)
587 missSlots = sampleMissSlots(CAMO_N)
588 roundNotes = 0
589 end })
590Left:AddToggle("HoldNotes", { Text = "Hold notes", Default = HOLD_NOTES,
591 Callback = function(v) HOLD_NOTES = v; if not v then releaseAllHolds() end end })
592Left:AddToggle("AntiAfk", { Text = "Anti-AFK", Default = ANTI_AFK,
593 Callback = function(v) ANTI_AFK = v end })
594Left:AddToggle("AntiKick", { Text = "Anti-Kick", Default = ANTI_KICK,
595 Callback = function(v) ANTI_KICK = v end })
596Left:AddToggle("Shield", { Text = "Troll shield", Default = true,
597 Callback = function(v) setShield(v) end })
598Left:AddSlider("FireEarly", { Text = "Fire early (lanes)", Min = 0, Max = 100, Default = FIRE_EARLY, Suffix = "px",
599 Round = 0, Rounding = 0, Decimals = 0,
600 Callback = function(v) FIRE_EARLY = math.floor(v + 0.5) end })
601Left:AddDropdown("InputMode", { Text = "Input mode", Values = { "remote", "key" }, Default = INPUT_MODE,
602 Callback = function(v) INPUT_MODE = v end })
603Left:AddToggle("Debug", { Text = "Debug prints", Default = DEBUG,
604 Callback = function(v) DEBUG = v end })
605addButtonCompat(Left, "PrintZones", "Print learned zones", function()
606 for l, z in pairs(ZONES) do
607 print(string.format("[aura] zone %s: [%.3f, %.3f]", l, z[1], z[2]))
608 end
609end)
610
611Farm:AddToggle("FarmOn", { Text = "Farm clicks", Default = FARM_ON,
612 Callback = function(v)
613 FARM_ON = v
614 setFarmWalk(v and FARM_MODE == "walk")
615 print("[aura] farm " .. (v and "ON" or "OFF") .. " @ " .. FARM_RATE .. "/s " .. FARM_MODE)
616 end })
617Farm:AddSlider("FarmRate", { Text = "Rate", Min = 1, Max = 30, Default = FARM_RATE, Suffix = "/s",
618 Round = 0, Rounding = 0, Decimals = 0,
619 Callback = function(v) FARM_RATE = math.floor(v + 0.5) end })
620Farm:AddDropdown("FarmMode", { Text = "Mode", Values = { "walk", "static" }, Default = FARM_MODE,
621 Callback = function(v)
622 FARM_MODE = v
623 setFarmWalk(FARM_ON and v == "walk")
624 end })
625
626local lastLabel, countLabel
627pcall(function()
628 lastLabel = Right:AddLabel("waiting for notes...")
629 countLabel = Right:AddLabel("notes fired: 0")
630end)
631local function setLast(t) if lastLabel then pcall(function() lastLabel:SetText(t) end) end end
632local function setCount(t) if countLabel then pcall(function() countLabel:SetText(t) end) end end
633
634--// HOTKEY
635UIS.InputBegan:Connect(function(input, gp)
636 if gp then return end
637 if input.KeyCode == Enum.KeyCode.RightControl then
638 enabled = not enabled
639 releaseAllHolds()
640 pcall(function() Toggles.AutoFire:SetValue(enabled) end)
641 print("[aura] autofire " .. (enabled and "ON" or "OFF"))
642 end
643end)
644
645--// SETTINGS TAB
646pcall(function()
647 local base = "https://raw.githubusercontent.com/mstudio45/LinoriaLib/main/addons/"
648 local ThemeManager = loadstring(game:HttpGet(base .. "ThemeManager.lua"))()
649 local SaveManager = loadstring(game:HttpGet(base .. "SaveManager.lua"))()
650 local SettingsTab = Window:AddTab("Settings")
651 ThemeManager:SetLibrary(Library)
652 SaveManager:SetLibrary(Library)
653 SaveManager:IgnoreThemeSettings()
654 ThemeManager:SetFolder("AuraBattle")
655 SaveManager:SetFolder("AuraBattle/autofire")
656 SaveManager:BuildConfigSection(SettingsTab)
657 SaveManager:ApplyToTab(SettingsTab)
658 ThemeManager:ApplyToTab(SettingsTab)
659end)
660
661--// DUEL ENGINE
662local function arrowDirection(arrow)
663 local glyph = arrow:FindFirstChild("Glyph")
664 local colour = glyph and glyph:FindFirstChild("Colour")
665 if colour then
666 local id = tostring(colour.Image):match("(%d+)$")
667 if id and IMG_DIR[id] then return IMG_DIR[id] end
668 end
669 return nil
670end
671
672local function duelStep()
673 local dance = gui:FindFirstChild("AuraDance")
674 local root = dance and dance:FindFirstChild("Root")
675 local track = root and root:FindFirstChild("Track")
676 if not track then return end
677 local now = serverNow()
678 for _, arrow in ipairs(track:GetChildren()) do
679 if arrow.Name:match("^Arrow%d+") and arrow:IsA("GuiObject") then
680 if not fired[arrow] then
681 local dir = arrowDirection(arrow)
682 if dir then
683 local xs = arrow.Position.X.Scale
684 local noteTime = now + (xs - RING_X) * APPROACH / 0.72
685 if now >= noteTime - PRESS_LEAD then
686 fired[arrow] = true
687 if CAMO_ON and isCamoMiss() then
688 setLast("camo miss @ note " .. roundNotes)
689 if DEBUG then print("[aura] camo miss (duel) note " .. roundNotes) end
690 else
691 local t = (FORGE_TIME and noteTime or now)
692 if JITTER_VAR > 0 then t = t + (math.random() - 0.5) * JITTER_VAR end
693 local idx = arrow.Name:match("^Arrow(%d+)")
694 local tail = HOLD_NOTES and idx and track:FindFirstChild("HoldTail" .. idx)
695 firePress(dir, t, tail ~= nil)
696 if tail then startHold(dir, arrow, KEY_FOR_DIR[dir]) end
697 count = count + 1
698 setLast("last: " .. dir .. (tail and " (hold)" or "") .. " dt="
699 .. string.format("%.0f", (now - noteTime) * 1000) .. "ms")
700 setCount("notes fired: " .. count)
701 if DEBUG then
702 print(string.format("[aura] duel %s%s dt=%dms", dir, tail and "+hold" or "",
703 (now - noteTime) * 1000))
704 end
705 end
706 end
707 end
708 elseif arrow.Position.X.Scale > RING_X + 0.3 then
709 fired[arrow] = nil
710 end
711 end
712 end
713end
714
715--// LANES ENGINE
716local function learnZone(letter, xs)
717 if not AUTO_LEARN or not letter or ZONES[letter] then return end
718 ZONES[letter] = { xs - ZONE_PAD, xs + ZONE_PAD }
719 print(string.format("[aura] learned zone %s: [%.3f, %.3f]", letter, xs - ZONE_PAD, xs + ZONE_PAD))
720end
721
722local function lanesStep()
723 local threshold = (DIRECTION == "down") and (HIT_Y - FIRE_EARLY) or (HIT_Y + FIRE_EARLY)
724 for _, note in ipairs(highway:GetChildren()) do
725 if note.Name:match("^Note%d+") and note:IsA("GuiObject") then
726 local badge = note:FindFirstChild("KeyBadge", true)
727 local letter = badge and badge:FindFirstChild("Letter", true)
728 letter = letter and letter.Text or nil
729 if letter then
730 local xs = (note.AbsolutePosition.X - highway.AbsolutePosition.X + note.AbsoluteSize.X * 0.5)
731 / math.max(highway.AbsoluteSize.X, 1)
732 local y = note.AbsolutePosition.Y - highway.AbsolutePosition.Y
733 learnZone(letter, xs)
734 local zone = ZONES[letter]
735 local inZone = zone and (xs >= zone[1] - 0.02 and xs <= zone[2] + 0.02)
736 local p = prevY[note]
737 prevY[note] = y
738 local crossed = p and (
739 (DIRECTION == "down" and p < threshold and y >= threshold) or
740 (DIRECTION == "up" and p > threshold and y <= threshold))
741 if crossed and inZone and not fired[note] then
742 fired[note] = true
743 if CAMO_ON and isCamoMiss() then
744 setLast("camo miss @ note " .. roundNotes)
745 if DEBUG then print("[aura] camo miss (lanes) note " .. roundNotes) end
746 else
747 local isHold = HOLD_NOTES and (note.AbsoluteSize.Y >= HOLD_MIN_H)
748 pressNote(letter, isHold)
749 if isHold then startHold(letter, note, keyCodeOf(letter)) end
750 count = count + 1
751 setLast("last: " .. letter .. (isHold and " (hold)" or "") .. " y=" .. y)
752 setCount("notes fired: " .. count)
753 if DEBUG then
754 print(string.format("[aura] lanes %s%s y=%d->%d", letter, isHold and "+hold" or "", p, y))
755 end
756 end
757 elseif fired[note] and (DIRECTION == "down") and (y < HIT_Y - 150) then
758 fired[note] = nil
759 elseif fired[note] and (DIRECTION == "up") and (y > HIT_Y + 150) then
760 fired[note] = nil
761 end
762 end
763 end
764 end
765end
766
767--// MAIN LOOP
768RunService.RenderStepped:Connect(function()
769 if not enabled then return end
770 duelStep()
771 lanesStep()
772
773 if HOLD_NOTES then
774 local now = os.clock()
775 for key, h in pairs(HOLDS) do
776 for n in pairs(h.notes) do
777 if not n:IsDescendantOf(game) then
778 h.notes[n] = nil
779 end
780 end
781 local empty = true
782 for _ in pairs(h.notes) do empty = false break end
783 if empty or (now - h.startedAt > MAX_HOLD) then
784 if h.keyDown and h.code then
785 pcall(function() VIM:SendKeyEvent(false, h.code, false, game) end)
786 end
787 HOLDS[key] = nil
788 end
789 end
790 end
791end)
792
793task.spawn(function()
794 while true do
795 task.wait(2)
796 for k in pairs(prevY) do
797 if not k:IsDescendantOf(highway) then
798 prevY[k] = nil
799 fired[k] = nil
800 end
801 end
802 end
803end)
804
805setShield(true)