--[[
Project : RUSHER - Autoplay (open source)
Place: https://www.roblox.com/games/106809703371658
Handles every note type: taps, holds (ln), catch (yellow), releases, and avoids bombs.
UI: Rayfield Gen2 (https://sirius.menu/gen2)
Requires an executor with getgc/filtergc + debug upvalue access (all modern ones).
]]
local Players = game:GetService("Players")
local RunService = game:GetService("RunService")
local genv = getgenv()
if genv.__pr_auto_conn then
pcall(function()
genv.__pr_auto_conn:Disconnect()
end)
genv.__pr_auto_conn = nil
end
if genv.__pr_auto_win then
pcall(function()
genv.__pr_auto_win:Unload()
end)
genv.__pr_auto_win = nil
end
local function findByClosureName(name)
if type(filtergc) == "function" then
return filtergc("function", { Name = name })
end
local found = {}
for _, f in getgc(true) do
if type(f) == "function" and debug.getinfo(f).name == name then
table.insert(found, f)
end
end
return found
end
local inputFn
for _, f in findByClosureName("input") do
if debug.getinfo(f).nups == 18 then
inputFn = f
end
end
local releaseFn
for _, f in findByClosureName("release") do
if debug.getinfo(f).nups == 9 then
releaseFn = f
break
end
end
assert(inputFn, "gameplay input closure not found (join the game first)")
assert(releaseFn, "gameplay release closure not found (join the game first)")
local env = getsenv(Players.LocalPlayer.PlayerGui.gameplay_script)
assert(type(env) == "table", "gameplay_script environment not found")
local function resetHeld()
-- u471 (idx 7) and u469 (idx 8) hold virtual press entries; playing()
-- re-derives the any-key-held flags from them every frame, so they must
-- be emptied when autoplay turns off or catch notes keep auto-hitting.
pcall(debug.setupvalue, inputFn, 7, {})
pcall(debug.setupvalue, inputFn, 8, {})
pcall(debug.setupvalue, inputFn, 9, false)
pcall(debug.setupvalue, inputFn, 11, false)
end
resetHeld()
local Rayfield = loadstring(game:HttpGet("https://sirius.menu/gen2"))()
local window = Rayfield:CreateWindow({
name = "Project : RUSHER",
subtitle = "Autoplay",
})
local tab = window:CreateTab({ name = "Main" })
local stats = { pressed = 0, released = 0, frames = 0 }
genv.__pr_auto_stats = stats
genv.__pr_auto_win = window
genv.__pr_auto_on = false
tab:CreateToggle({
name = "Autoplay",
description = "Plays all note types: tap, hold, catch, release",
value = false,
callback = function(value)
genv.__pr_auto_on = value
if value then
stats.pressed = 0
stats.released = 0
end
end,
})
local fakePress = { KeyCode = Enum.KeyCode.D, UserInputType = Enum.UserInputType.Keyboard }
local fakeRel = { KeyCode = Enum.KeyCode.F, UserInputType = Enum.UserInputType.Keyboard }
local LEAD = 0.005
local wasOn = false
local conn = RunService.Heartbeat:Connect(function()
if not genv.__pr_auto_on then
if wasOn then
wasOn = false
resetHeld()
end
return
end
wasOn = true
local t = debug.getupvalue(inputFn, 16)
local w = debug.getupvalue(inputFn, 15)
local paused = debug.getupvalue(inputFn, 2)
local failed = debug.getupvalue(inputFn, 12)
local retry = debug.getupvalue(inputFn, 1)
local studioAuto = debug.getupvalue(inputFn, 10)
local bombs = debug.getupvalue(inputFn, 13)
local taps = debug.getupvalue(inputFn, 14)
local rels = debug.getupvalue(releaseFn, 8)
debug.setupvalue(inputFn, 9, true)
debug.setupvalue(inputFn, 11, true)
if paused or failed or retry or studioAuto then
return
end
if type(taps) ~= "table" or #taps == 0 then
return
end
if type(t) ~= "number" or type(w) ~= "number" then
return
end
stats.frames = stats.frames + 1
local cfg = _G.CONFIGURATIONS
local off = cfg and (tonumber(cfg.offsetvisual) or 0) / 1000 or 0
local ci = env.currentrel
if ci and type(rels) == "table" then
local rel = rels[ci]
if rel and not rel.hitted and not rel.miss and type(rel.real_stime) == "number"
and t >= rel.real_stime + LEAD - off then
releaseFn(fakeRel, false)
stats.released = stats.released + 1
debug.setupvalue(inputFn, 9, true)
debug.setupvalue(inputFn, 11, true)
end
end
local ni = env.currentnote
if not ni or type(bombs) ~= "table" then
return
end
local tap = taps[ni]
if not tap or tap.hitted or tap.miss or type(tap.real_stime) ~= "number" then
return
end
local bi = env.currentbomb
if bi then
local bomb = bombs[bi]
if bomb and not bomb.hitted and type(bomb.real_stime) == "number" then
local routeBomb = true
if tap.real_stime - 1.5 * w <= bomb.real_stime then
routeBomb = false
end
if routeBomb then
return
end
end
end
if t >= tap.real_stime + LEAD - off then
inputFn(fakePress, false)
stats.pressed = stats.pressed + 1
debug.setupvalue(inputFn, 9, true)
debug.setupvalue(inputFn, 11, true)
end
end)
genv.__pr_auto_conn = conn
print("[autoplay] loaded | toggle in the menu")project rusher autoplay. uses ui. and keyless!
No comments yet. Be the first to comment!
1--[[
2 Project : RUSHER - Autoplay (open source)
3 Place: https://www.roblox.com/games/106809703371658
4 Handles every note type: taps, holds (ln), catch (yellow), releases, and avoids bombs.
5 UI: Rayfield Gen2 (https://sirius.menu/gen2)
6 Requires an executor with getgc/filtergc + debug upvalue access (all modern ones).
7]]
8
9local Players = game:GetService("Players")
10local RunService = game:GetService("RunService")
11
12local genv = getgenv()
13if genv.__pr_auto_conn then
14 pcall(function()
15 genv.__pr_auto_conn:Disconnect()
16 end)
17 genv.__pr_auto_conn = nil
18end
19if genv.__pr_auto_win then
20 pcall(function()
21 genv.__pr_auto_win:Unload()
22 end)
23 genv.__pr_auto_win = nil
24end
25
26local function findByClosureName(name)
27 if type(filtergc) == "function" then
28 return filtergc("function", { Name = name })
29 end
30 local found = {}
31 for _, f in getgc(true) do
32 if type(f) == "function" and debug.getinfo(f).name == name then
33 table.insert(found, f)
34 end
35 end
36 return found
37end
38
39local inputFn
40for _, f in findByClosureName("input") do
41 if debug.getinfo(f).nups == 18 then
42 inputFn = f
43 end
44end
45local releaseFn
46for _, f in findByClosureName("release") do
47 if debug.getinfo(f).nups == 9 then
48 releaseFn = f
49 break
50 end
51end
52assert(inputFn, "gameplay input closure not found (join the game first)")
53assert(releaseFn, "gameplay release closure not found (join the game first)")
54
55local env = getsenv(Players.LocalPlayer.PlayerGui.gameplay_script)
56assert(type(env) == "table", "gameplay_script environment not found")
57
58local function resetHeld()
59 -- u471 (idx 7) and u469 (idx 8) hold virtual press entries; playing()
60 -- re-derives the any-key-held flags from them every frame, so they must
61 -- be emptied when autoplay turns off or catch notes keep auto-hitting.
62 pcall(debug.setupvalue, inputFn, 7, {})
63 pcall(debug.setupvalue, inputFn, 8, {})
64 pcall(debug.setupvalue, inputFn, 9, false)
65 pcall(debug.setupvalue, inputFn, 11, false)
66end
67resetHeld()
68
69local Rayfield = loadstring(game:HttpGet("https://sirius.menu/gen2"))()
70local window = Rayfield:CreateWindow({
71 name = "Project : RUSHER",
72 subtitle = "Autoplay",
73})
74local tab = window:CreateTab({ name = "Main" })
75
76local stats = { pressed = 0, released = 0, frames = 0 }
77genv.__pr_auto_stats = stats
78genv.__pr_auto_win = window
79genv.__pr_auto_on = false
80
81tab:CreateToggle({
82 name = "Autoplay",
83 description = "Plays all note types: tap, hold, catch, release",
84 value = false,
85 callback = function(value)
86 genv.__pr_auto_on = value
87 if value then
88 stats.pressed = 0
89 stats.released = 0
90 end
91 end,
92})
93
94local fakePress = { KeyCode = Enum.KeyCode.D, UserInputType = Enum.UserInputType.Keyboard }
95local fakeRel = { KeyCode = Enum.KeyCode.F, UserInputType = Enum.UserInputType.Keyboard }
96local LEAD = 0.005
97local wasOn = false
98
99local conn = RunService.Heartbeat:Connect(function()
100 if not genv.__pr_auto_on then
101 if wasOn then
102 wasOn = false
103 resetHeld()
104 end
105 return
106 end
107 wasOn = true
108
109 local t = debug.getupvalue(inputFn, 16)
110 local w = debug.getupvalue(inputFn, 15)
111 local paused = debug.getupvalue(inputFn, 2)
112 local failed = debug.getupvalue(inputFn, 12)
113 local retry = debug.getupvalue(inputFn, 1)
114 local studioAuto = debug.getupvalue(inputFn, 10)
115 local bombs = debug.getupvalue(inputFn, 13)
116 local taps = debug.getupvalue(inputFn, 14)
117 local rels = debug.getupvalue(releaseFn, 8)
118
119 debug.setupvalue(inputFn, 9, true)
120 debug.setupvalue(inputFn, 11, true)
121
122 if paused or failed or retry or studioAuto then
123 return
124 end
125 if type(taps) ~= "table" or #taps == 0 then
126 return
127 end
128 if type(t) ~= "number" or type(w) ~= "number" then
129 return
130 end
131
132 stats.frames = stats.frames + 1
133
134 local cfg = _G.CONFIGURATIONS
135 local off = cfg and (tonumber(cfg.offsetvisual) or 0) / 1000 or 0
136
137 local ci = env.currentrel
138 if ci and type(rels) == "table" then
139 local rel = rels[ci]
140 if rel and not rel.hitted and not rel.miss and type(rel.real_stime) == "number"
141 and t >= rel.real_stime + LEAD - off then
142 releaseFn(fakeRel, false)
143 stats.released = stats.released + 1
144 debug.setupvalue(inputFn, 9, true)
145 debug.setupvalue(inputFn, 11, true)
146 end
147 end
148
149 local ni = env.currentnote
150 if not ni or type(bombs) ~= "table" then
151 return
152 end
153 local tap = taps[ni]
154 if not tap or tap.hitted or tap.miss or type(tap.real_stime) ~= "number" then
155 return
156 end
157
158 local bi = env.currentbomb
159 if bi then
160 local bomb = bombs[bi]
161 if bomb and not bomb.hitted and type(bomb.real_stime) == "number" then
162 local routeBomb = true
163 if tap.real_stime - 1.5 * w <= bomb.real_stime then
164 routeBomb = false
165 end
166 if routeBomb then
167 return
168 end
169 end
170 end
171
172 if t >= tap.real_stime + LEAD - off then
173 inputFn(fakePress, false)
174 stats.pressed = stats.pressed + 1
175 debug.setupvalue(inputFn, 9, true)
176 debug.setupvalue(inputFn, 11, true)
177 end
178end)
179
180genv.__pr_auto_conn = conn
181print("[autoplay] loaded | toggle in the menu")