-- 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)) ]])