simple autoplay bot only 4k
Key Required

simple autoplay bot only 4k

{MECHANICS} Monday Morning Misery [Beta]areyoumental110areyoumental110 13.2K views 855 executesUpdated Apr 25, 2025
5.0/ 5(2 votes)
20100% Positive
Lua Script•114 lines (4094 chars)
-- THIS DOES NOT WORK WITH XENO!
-- only support 4 key

-- DO NOT TOUCH ANYTHING while the bot is playing, dont even turn the sound down, no nothing! itll mess up the bot
-- lag plays a MAJOR role in this bot, if you lag even for like 5 frames, itll just stop working or something, idk just have a good device (mine sucks)
-- have your keybinds set to A, S, W, D

local keybinds = {0x41,0x53,0x57,0x44} -- (https://learn.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes)
local offset = 0 -- do not change, its fine at the moment

local localplr = game.Players.LocalPlayer
if getgenv().restartautoplayss ~= nil then
	getgenv().restartautoplayss()
end
local notes = {}
local hitnotes = {}
function docol(v)
	if v:IsA("Frame")then
		local cnum = v.Name
		v.ChildAdded:Connect(function(c)
			if c:IsA("ImageLabel") then
				table.insert(notes,{c,cnum})
			end
		end)
	end
end
local side = "Right"
function getside()
		for i,v in pairs(game.ReplicatedStorage.ComplexMatches:GetChildren()) do
			for i,v in pairs(v:GetChildren()) do
				if v.Name == localplr.Name then
					side = (v.PlayerType.Value == 1 and "Left") or (v.PlayerType.Value == 2 and "Right")
				end
			end
		end
		for i,v in pairs(game.ReplicatedStorage.Matches:GetChildren()) do
			--for i,v in pairs(v:GetChildren()) do
				if v.Participants.Value == nil then
					if (v.Owner.Value and v.Owner.Value.Name == localplr.Name) or (v.Opponent.Value and v.Opponent.Value.Name == localplr.Name) then
						local ptype = (v.Owner.Value and v.Owner.Value.Name == localplr.Name and v.Owner.PlayerType.Value) or (v.Opponent.Value and v.Opponent.Value.Name == localplr.Name and v.Opponent.PlayerType.Value)
						side = (ptype == 1 and "Left") or (ptype == 2 and "Right")
					end
				end
			--end
		end
		--side = (side == "Left" and "Right") or "Left"
end
getside()
local dup = {Left = 1,Down = 2,Up = 3,Right = 4}
function domn(v)
		hitnotes[v.Name] = v
end
function dag(v)
	getside()
	for i,v in pairs(v[side].Notes:GetChildren()) do
			docol(v)
	end
	coroutine.wrap(function()
		v[side]:WaitForChild("MainArrowContainer",math.huge)
		for i,v in pairs(v[side].MainArrowContainer:GetChildren()) do
			domn(v)
		end
	end)()
end
if localplr.PlayerGui.ScreenGui:FindFirstChild("ArrowGui",true) and not localplr.PlayerGui.ScreenGui:FindFirstChild("ArrowGui",true).Parent:FindFirstChild("Bop") then
	dag(localplr.PlayerGui.ScreenGui:FindFirstChild("ArrowGui",true))
end
local newgui = localplr.PlayerGui.ScreenGui:FindFirstChild("Bop",true).ChildAdded:Connect(function(child)
	if child.Name == "ArrowGui" then
		dag(child)
	end
end)
local toremove = {}
local alreadypressed = {}
local upscroll = false
local ors = game:GetService("RunService").RenderStepped:Connect(function()
	for i,v in pairs(keybinds) do
		keyrelease(v)
	end
	if localplr.PlayerGui.ScreenGui:FindFirstChild("ArrowGui",true) and localplr.PlayerGui.ScreenGui:FindFirstChild("ArrowGui",true)[side] and localplr.PlayerGui.ScreenGui:FindFirstChild("ArrowGui",true)[side]:FindFirstChild("MainArrowContainer") then
		upscroll = localplr.PlayerGui.ScreenGui:FindFirstChild("ArrowGui",true)[side].MainArrowContainer:GetChildren()[1].AbsolutePosition.Y < localplr.PlayerGui.ScreenGui.AbsoluteSize.Y/2
		for i,v in pairs(keybinds) do
			keyrelease(v)
		end
		local cnotes = notes
		for i,v in pairs(cnotes) do
			if typeof(v[1]) == "Instance" and v[1] and v[1].Parent ~= nil then
				local checkpos = nil
				if upscroll then
					checkpos = v[1].AbsolutePosition.Y < 0--math.abs(hitnotes[v[2]].AbsolutePosition.Y - v[1].AbsolutePosition.Y) < 100
				else
					checkpos = v[1].AbsolutePosition.Y > 431
				end
				if checkpos then
					local kb = keybinds[dup[v[2]]]--keybinds[(upscroll and 4 - v[2]) or v[2]]
					toremove[i] = true
					alreadypressed[v[1]] = true
					keypress(kb)
				elseif v[1] == nil or v[1].Parent == nil then
					toremove[i] = true
				end
			end
		end
		for i,v in pairs(toremove) do
			notes[i] = nil
			toremove[i] = nil
		end
		alreadypressed = {}
	end
end)
getgenv().restartautoplayss = function()
	ors:Disconnect()
	newgui:Disconnect()
end

Features & Information

no xeno support since xeno didnt do their keypress function correctly auto play only support 4 key cant do long notes lmao idk if it supports team matches

Community Comments (9)

itsvalhieritsvalhierJul 28, 2025

thanks you gamer god im finally found this

StewBradarStewBradarNov 7, 2025

try to make support long notes, this is currently best script rn because others are missing badly

StewBradarStewBradarJan 11, 2026

@Vesta you look kinda su*ious

Replying to @StewBradar
LuminumLuminumJan 11, 2026

@Candle I don't hide my sauce, don't feel like obfuscating my scripts (sauce --> source)

StewBradarStewBradarJan 11, 2026

@Vesta okay nvm you good script is peak

Replying to @StewBradar
LuminumLuminumJan 11, 2026

@Candle Thanks! Also my bad for advertising, thats probably going to dscourage others from using your script :\

Replying to @Luminum
StewBradarStewBradarJan 11, 2026

@Vesta i mean your script is only now who supports long notes and also multiple notes

Replying to @Luminum
StewBradarStewBradarJan 11, 2026

@Vesta can you add auto detect which side are you and how many keys there in song? that would be soo useful

Replying to @StewBradar
LuminumLuminumJan 14, 2026

@Candle ill try

More Scripts for {MECHANICS} Monday Morning Misery [Beta]