
Keyless VerifiedUniversal
-- Made by 0_Void (Zero-Lag Engine + Funky Friday Deep-Scan Hazard Detection)
-- SUPPORT: NOTETYPE 0-17 + NIL/NORMAL NOTES + ADVANCED HAZARD/MINE FILTERING
run_on_actor(game:GetService("Players").LocalPlayer.PlayerScripts.ClientActor, [[
if not newlclosure then
getgenv().newlclosure = function(func)
local env = getfenv(func)
local t = {F = func}
setrawmetatable(t, {index = env, newindex = env})
local closure = function(...)
return F(...)
end
setfenv(closure, t)
return closure
end
end
local RunService = game:GetService("RunService")
local UserInputService = game:GetService("UserInputService")
local Players = game:GetService("Players")
local LocalPlayer = Players.LocalPlayer
-- ==========================================
-- ACCURACY-TUNED TIMING & DYNAMIC BUFFERS
-- ==========================================
local TAP_HOLD_MS = 90 -- Shorter, crisp tap duration
local BASE_DELAY_MS = -9.5 -- Best Tuned Base Delay (-9.5ms Offset)
local HARDWARE_BIAS_MS = 0.0 -- Hardware Bias set to 0.0ms
local BASE_RELEASE_PAD_MS = 10 -- Minimal tail pad for long notes
local GUI_UPDATE_RATE = 0.033 -- GUI update rate (~30 FPS)
local TOGGLE_KEY = Enum.KeyCode.RightControl
-- ==========================================
local autoPlayerEnabled = true
local keyHitCounts = {}
local keyCounterLabels = {}
local keyFrames = {}
local counterContainerFrame = nil
local renderConnection = nil
local inputConnection = nil
local COLOR_ACTIVE = Color3.fromRGB(0, 255, 150)
local COLOR_INACTIVE = Color3.fromRGB(25, 25, 35)
-- Comprehensive Hazard & Mine Keyword List for Funky Friday
local HAZARD_KEYWORDS = {
"hazard", "death", "danger", "mine", "hurt",
"warning", "poison", "bomb", "kill", "nightmare",
"run", "forced", "skin", "caution", "avoid", "trap"
}
local function createStatusGUI()
local playerGui = LocalPlayer:FindFirstChildOfClass("PlayerGui") or LocalPlayer:WaitForChild("PlayerGui", 5)
if not playerGui then return nil end
local existing = playerGui:FindFirstChild("AutoPlayerStatus")
if existing then existing:Destroy() end
local screenGui = Instance.new("ScreenGui")
screenGui.Name = "AutoPlayerStatus"
screenGui.ResetOnSpawn = false
screenGui.DisplayOrder = 999999999
screenGui.ZIndexBehavior = Enum.ZIndexBehavior.Global
screenGui.Parent = playerGui
local frame = Instance.new("Frame")
frame.Size = UDim2.new(0, 240, 0, 160)
frame.Position = UDim2.new(0.02, 0, 0.3, 0)
frame.BackgroundColor3 = Color3.fromRGB(15, 15, 20)
frame.BorderSizePixel = 0
frame.Active = true
frame.Draggable = true
frame.ZIndex = 10
frame.Parent = screenGui
local corner = Instance.new("UICorner")
corner.CornerRadius = UDim.new(0, 8)
corner.Parent = frame
local title = Instance.new("TextLabel")
title.Size = UDim2.new(1, -10, 0, 25)
title.Position = UDim2.new(0, 10, 0, 0)
title.BackgroundTransparency = 1
title.Text = "ENGINE STATUS (DEEP-SCAN ACTIVE)"
title.TextColor3 = Color3.fromRGB(0, 255, 170)
title.TextXAlignment = Enum.TextXAlignment.Left
title.Font = Enum.Font.SourceSansBold
title.TextSize = 13
title.ZIndex = 11
title.Parent = frame
local statusText = Instance.new("TextLabel")
statusText.Size = UDim2.new(1, -20, 0, 45)
statusText.Position = UDim2.new(0, 10, 0, 25)
statusText.BackgroundTransparency = 1
statusText.Text = "Status: Idle\nFPS: --\nEvents: 0 / 0"
statusText.TextColor3 = Color3.fromRGB(220, 220, 220)
statusText.TextXAlignment = Enum.TextXAlignment.Left
statusText.TextYAlignment = Enum.TextYAlignment.Top
statusText.Font = Enum.Font.Code
statusText.TextSize = 11
statusText.ZIndex = 11
statusText.Parent = frame
counterContainerFrame = Instance.new("Frame")
counterContainerFrame.Size = UDim2.new(1, -20, 0, 42)
counterContainerFrame.Position = UDim2.new(0, 10, 0, 72)
counterContainerFrame.BackgroundTransparency = 1
counterContainerFrame.ZIndex = 11
counterContainerFrame.Parent = frame
local toggleBtn = Instance.new("TextButton")
toggleBtn.Size = UDim2.new(1, -20, 0, 28)
toggleBtn.Position = UDim2.new(0, 10, 0, 122)
toggleBtn.BackgroundColor3 = Color3.fromRGB(0, 180, 100)
toggleBtn.BorderSizePixel = 0
toggleBtn.Font = Enum.Font.SourceSansBold
toggleBtn.Text = "AUTOPLAY: ON [RCtrl]"
toggleBtn.TextColor3 = Color3.fromRGB(255, 255, 255)
toggleBtn.TextSize = 12
toggleBtn.ZIndex = 11
toggleBtn.Parent = frame
local btnCorner = Instance.new("UICorner")
btnCorner.CornerRadius = UDim.new(0, 5)
btnCorner.Parent = toggleBtn
local function updateToggleState()
if autoPlayerEnabled then
toggleBtn.Text = "AUTOPLAY: ON [RCtrl]"
toggleBtn.BackgroundColor3 = Color3.fromRGB(0, 180, 100)
else
toggleBtn.Text = "AUTOPLAY: OFF [RCtrl]"
toggleBtn.BackgroundColor3 = Color3.fromRGB(180, 50, 50)
end
end
toggleBtn.MouseButton1Click:Connect(function()
autoPlayerEnabled = not autoPlayerEnabled
updateToggleState()
end)
if inputConnection then inputConnection:Disconnect() end
inputConnection = UserInputService.InputBegan:Connect(function(input, gpe)
if not gpe and input.KeyCode == TOGGLE_KEY then
autoPlayerEnabled = not autoPlayerEnabled
updateToggleState()
end
end)
return statusText
end
local statusUI = createStatusGUI()
local function setupKeyCounterUI(keyCount)
if not counterContainerFrame then return end
counterContainerFrame:ClearAllChildren()
keyCounterLabels = {}
keyHitCounts = {}
keyFrames = {}
local spacing = 3
local totalAvailableWidth = 220
local itemWidth = math.floor((totalAvailableWidth - ((keyCount - 1) * spacing)) / keyCount)
local itemHeight = 40
for lane = 1, keyCount do
keyHitCounts[lane] = 0
local keyFrame = Instance.new("Frame")
keyFrame.Size = UDim2.new(0, itemWidth, 0, itemHeight)
keyFrame.Position = UDim2.new(0, (lane - 1) * (itemWidth + spacing), 0, 0)
keyFrame.BackgroundColor3 = COLOR_INACTIVE
keyFrame.BorderSizePixel = 0
keyFrame.ZIndex = 12
keyFrame.Parent = counterContainerFrame
local keyCorner = Instance.new("UICorner")
keyCorner.CornerRadius = UDim.new(0, 4)
keyCorner.Parent = keyFrame
local keyTitle = Instance.new("TextLabel")
keyTitle.Size = UDim2.new(1, 0, 0, 12)
keyTitle.Position = UDim2.new(0, 0, 0, 2)
keyTitle.BackgroundTransparency = 1
keyTitle.Text = "K" .. lane
keyTitle.TextColor3 = Color3.fromRGB(0, 255, 170)
keyTitle.Font = Enum.Font.SourceSansBold
keyTitle.TextSize = 10
keyTitle.ZIndex = 13
keyTitle.Parent = keyFrame
local countLabel = Instance.new("TextLabel")
countLabel.Size = UDim2.new(1, 0, 1, -14)
countLabel.Position = UDim2.new(0, 0, 0, 12)
countLabel.BackgroundTransparency = 1
countLabel.Text = "0"
countLabel.TextColor3 = Color3.fromRGB(255, 255, 255)
countLabel.Font = Enum.Font.Code
countLabel.TextSize = 11
countLabel.ZIndex = 13
countLabel.Parent = keyFrame
keyCounterLabels[lane] = countLabel
keyFrames[lane] = keyFrame
end
end
local function setUI(text)
if statusUI then
statusUI.Text = text
end
end
-- =======================================================
-- DEEP-SCAN HAZARD FILTER FOR FUNKY FRIDAY
-- =======================================================
local function isSafeNote(noteObject, noteConfig)
if not noteObject then return false end
-- 1. Direct Flag Checks (ตรวจหา Property ที่ระบุว่าเป็นความเสียหายหรือระเบิดโดยตรง)
if noteObject.IsMine or noteObject.IsHazard or noteObject.Damage or noteObject.Hurt or noteObject.Ignore then
return false
end
-- 2. Note Type Range Validation (ถ้าเป็นตัวเลข ต้องไม่อยู่ในกลุ่มเกิน 17)
local noteType = noteObject.Type
if noteType ~= nil then
local numType = tonumber(noteType)
if numType and (numType < 0 or numType > 17) then
return false
end
end
-- 3. Deep String Property Scanning (สแกนหาคำต้องห้ามในทุก Field ของ Object โน้ต)
for key, val in pairs(noteObject) do
if type(val) == "string" then
local valLower = val:lower()
for i = 1, #HAZARD_KEYWORDS do
if valLower:find(HAZARD_KEYWORDS[i], 1, true) then
return false
end
end
end
end
-- 4. Funky Friday Config Table Deep Inspection
if noteConfig and type(noteConfig) == "table" then
if noteConfig.IsMine or noteConfig.IsHazard or noteConfig.Damage or noteConfig.Hurt then
return false
end
for key, propVal in pairs(noteConfig) do
if type(propVal) == "string" then
local valLower = propVal:lower()
for i = 1, #HAZARD_KEYWORDS do
if valLower:find(HAZARD_KEYWORDS[i], 1, true) then
return false
end
end
elseif type(propVal) == "boolean" and propVal == true then
local keyLower = tostring(key):lower()
for i = 1, #HAZARD_KEYWORDS do
if keyLower:find(HAZARD_KEYWORDS[i], 1, true) then
return false
end
end
end
end
end
return true
end
local newgame, gamehandler
for _, v in pairs(getgc(true)) do
if type(v) == "table" and rawget(v, "Games") and rawget(v, "NewGame") then
newgame = v.StartGame
gamehandler = v
break
end
end
if not gamehandler then
warn("[AutoPlayer] GameHandler not found in GC!")
return
end
local function ongamestarted()
if renderConnection then
renderConnection:Disconnect()
renderConnection = nil
end
setUI("Status: Syncing...\nFPS: Measuring\nEvents: Loading...")
local gameid, game = next(gamehandler.Games)
local timeout = 0
repeat
task.wait(0.05)
timeout = timeout + 0.05
until (gamehandler.Field and gamehandler.Field.Game and gamehandler.Field.Game.TimePosition) or timeout > 10
if not gamehandler.Field or not gamehandler.Field.Game then
setUI("Status: Failed to Hook Game")
return
end
local field = gamehandler.Field
local side = field.Team
local rate = field.Game.AdjustedPlayback or 1
if rate <= 0 then rate = 1 end
local offsetSec = (BASE_DELAY_MS + HARDWARE_BIAS_MS) / 1000
local releasePadSec = (BASE_RELEASE_PAD_MS / rate) / 1000
local tapHoldSec = (TAP_HOLD_MS / math.max(1, rate)) / 1000
local noteConfigs = game.NoteConfigs and game.NoteConfigs.NoteData
local maxDirection = 4
for _, v in pairs(game.Notes) do
if v.Direction then
local dNum = tonumber(v.Direction)
if dNum and dNum > maxDirection then
maxDirection = dNum
end
end
end
setupKeyCounterUI(maxDirection)
local events = {}
local eventCount = 0
for _, v in pairs(game.Notes) do
local noteConfig = noteConfigs and (noteConfigs[tostring(v.Type)] or noteConfigs[v.Type])
-- Deep-Scan Validation Check
if isSafeNote(v, noteConfig) and (v.Field == side or v.Field == "All") then
local dir = v.Direction
local pressTime = v.Time + offsetSec
local holdDuration = (v.Length and v.Length > 0) and (v.Length + releasePadSec) or tapHoldSec
local releaseTime = pressTime + holdDuration
eventCount = eventCount + 1
events[eventCount] = { time = pressTime, dir = dir, state = true }
eventCount = eventCount + 1
events[eventCount] = { time = releaseTime, dir = dir, state = false }
end
end
table.sort(events, function(a, b)
if math.abs(a.time - b.time) < 0.00001 then
return not a.state and b.state
end
return a.time < b.time
end)
local activeHolds = {}
local eventIndex = 1
local lastTimePosition = field.Game.TimePosition or 0
local lastClock = os.clock()
local lastFrameClock = os.clock()
local lastGuiUpdate = 0
renderConnection = RunService.RenderStepped:Connect(function()
if not gamehandler.Field or not field.Game then
setUI("Status: Game Ended\nFPS: --\nEvents: Done")
if renderConnection then renderConnection:Disconnect() end
return
end
local nowClock = os.clock()
local frameDelta = nowClock - lastFrameClock
lastFrameClock = nowClock
local rawTime = field.Game.TimePosition or 0
if rawTime ~= lastTimePosition then
lastTimePosition = rawTime
lastClock = nowClock
end
local preciseTime = rawTime + ((nowClock - lastClock) * rate)
while eventIndex <= eventCount do
local ev = events[eventIndex]
if preciseTime < ev.time then break end
local dir = ev.dir
if autoPlayerEnabled then
if ev.state then
activeHolds[dir] = (activeHolds[dir] or 0) + 1
field:HitLane(dir, true, nowClock)
if keyHitCounts[dir] then
local newCount = keyHitCounts[dir] + 1
keyHitCounts[dir] = newCount
if keyCounterLabels[dir] then
keyCounterLabels[dir].Text = tostring(newCount)
end
end
if keyFrames[dir] then
keyFrames[dir].BackgroundColor3 = COLOR_ACTIVE
end
else
local count = (activeHolds[dir] or 1) - 1
activeHolds[dir] = count
if count <= 0 then
activeHolds[dir] = 0
field:HitLane(dir, false, nowClock)
if keyFrames[dir] then
keyFrames[dir].BackgroundColor3 = COLOR_INACTIVE
end
end
end
end
eventIndex = eventIndex + 1
end
if nowClock - lastGuiUpdate >= GUI_UPDATE_RATE then
lastGuiUpdate = nowClock
local currentFPS = frameDelta > 0 and math.floor(1 / frameDelta) or 0
local statusState = autoPlayerEnabled and string.format("Active (Rate %.2fx)", rate) or "PAUSED"
if eventIndex > eventCount then
setUI(string.format("Status: Complete\nFPS: %d\nEvents: %d / %d", currentFPS, eventCount, eventCount))
if renderConnection then renderConnection:Disconnect() end
else
setUI(string.format("Status: %s\nFPS: %d\nEvents: %d / %d", statusState, currentFPS, eventIndex - 1, eventCount))
end
end
end)
end
if isfunctionhooked and isfunctionhooked(newgame) then
restorefunction(newgame)
end
local old; old = hookfunction(newgame, newlclosure(function(...)
local res = old(...)
task.spawn(ongamestarted)
return res
end))
]])No comments yet for this script.
