Skip to content
RoRoScripts
Bot FR preview
Unknown

Bot FR

Script
Funky Fridaydalinswasdithxng27
Views
1.6K
Likes
3
Dislikes
0
Added
Script
--[[
    WARNING: Heads up! This script has not been verified by ScriptBlox. Use at your own risk!
]]
-- Made by 0_Void (Master Ultra-Precision Engine - Rate-Compensated 120ms Tap Edition)
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 t.F(...)
            end
            setfenv(closure, t)
            return closure
        end
    end

    local RunService = game:GetService("RunService")
    local Players = game:GetService("Players")
    local LocalPlayer = Players.LocalPlayer
    local newgame, gamehandler

    local totalNotesHit = 0
    local hasHitFirstNote = false

    -- Apply text specifically to target elements
    local function applyBotplayText(target, text)
        if not target then return end

        if target:IsA("TextLabel") or target:IsA("TextButton") then
            if target.Text ~= text then
                target.Text = text
            end
        else
            for _, child in pairs(target:GetDescendants()) do
                if child:IsA("TextLabel") or child:IsA("TextButton") then
                    if child.Text ~= text then
                        child.Text = text
                    end
                end
            end
        end
    end

    -- Helper to check if player is on Left Side
    local function isLeftSide(playerSide)
        return playerSide == 1 or playerSide == "Player1" or playerSide == "Left"
    end

    -- Enforce InfoBar and MS judgment text based on the exact player side
    local function enforceSideInfoBar(playerSide)
        if not hasHitFirstNote then return end

        local playerGui = LocalPlayer:FindFirstChildOfClass("PlayerGui")
        if not playerGui then return end

        local window = playerGui:FindFirstChild("Window")
        local gameHud = window and window:FindFirstChild("Game")
        local hud = gameHud and gameHud:FindFirstChild("HUD")

        if hud then
            local displayText = "Bot Is Playing The Song Automatically Just Watch"
            local msText = "0.00 ms (Bot)"
            local onLeft = isLeftSide(playerSide)

            if onLeft then
                -- Left Side InfoBar
                local infoBarLeft = hud:FindFirstChild("InfoBar")
                if infoBarLeft then
                    applyBotplayText(infoBarLeft, displayText)
                end

                -- Left Side MS Indicator
                local indicatorLeft = hud:FindFirstChild("Indicator")
                if indicatorLeft then
                    local msLeft = indicatorLeft:FindFirstChild("MS") or indicatorLeft
                    applyBotplayText(msLeft, msText)
                end
            else
                -- Right Side InfoBar (Child 4)
                local hudChildren = hud:GetChildren()
                if hudChildren and hudChildren[4] then
                    applyBotplayText(hudChildren[4], displayText)
                end

                -- Right Side MS Indicator (Child 5)
                if hudChildren and hudChildren[5] then
                    local indicatorRight = hudChildren[5]
                    local msRight = indicatorRight:FindFirstChild("MS") or indicatorRight
                    applyBotplayText(msRight, msText)
                end
            end
        end
    end

    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

    local function ongamestarted()
        local gameid, game = next(gamehandler.Games)
        repeat task.wait() until gamehandler.Field and gamehandler.Field.Game and gamehandler.Field.Game.TimePosition
        
        local field = gamehandler.Field
        local playerSide = field.Team
        
        -- Reset counters and state on new game
        totalNotesHit = 0
        hasHitFirstNote = false

        -- Frame-by-frame enforcement loop for HUD and Judgment MS indicator
        local renderConnection
        renderConnection = RunService.RenderStepped:Connect(function()
            if not gamehandler.Field or not gamehandler.Field.Game then
                if renderConnection then renderConnection:Disconnect() end
                hasHitFirstNote = false -- Reset on game exit
                return
            end
            pcall(function()
                enforceSideInfoBar(playerSide)
            end)
        end)

        -- =========================================================================
        -- MASTER TIMING & OWNER-SIDE ENGINE CONFIGURATION
        -- =========================================================================
        local TAP_DURATION = 0.1 -- Fixed 120ms tap duration

        -- 9-Key Lane State Machine (Owner side tracking)
        local laneState = {}
        for i = 1, 9 do
            laneState[i] = { isHolding = false, releaseSongTime = 0 }
        end

        -- Ignored Note Types / Names
        local ignoredNames = {
            ["mechanic"] = true,
            ["death"]    = true,
            ["poison"]   = true,
            ["pea note"] = true
        }

        -- Pre-Process & Sort Song Notes ONLY for LocalPlayer's Side
        local processedNotes = {}
        for _, v in pairs(game.Notes) do
            if (v.Field == playerSide or v.Field == "All") and v.Time then
                local noteData = game.NoteConfigs and game.NoteConfigs.NoteData[tostring(v.Type)]
                local noteName = noteData and (noteData.Name or noteData.Type) or tostring(v.Type or "Default")
                local noteTypeStr = noteData and tostring(noteData.Type) or tostring(v.Type or "")

                local lowerName = string.lower(tostring(noteName))
                local lowerType = string.lower(tostring(noteTypeStr))
                
                if not ignoredNames[lowerName] and not ignoredNames[lowerType] then
                    local dir = tonumber(v.Direction)
                    if dir and dir >= 1 and dir <= 9 then
                        table.insert(processedNotes, {
                            Time = v.Time,
                            Length = v.Length or 0,
                            Direction = dir
                        })
                    end
                end
            end
        end

        table.sort(processedNotes, function(a, b)
            if a.Time == b.Time then
                return a.Direction < b.Direction
            end
            return a.Time < b.Time
        end)

        print("--- [AutoPlayer] Engine Running (" .. #processedNotes .. " Local Notes Loaded) ---")

        local noteIndex = 1
        local totalNotes = #processedNotes
        local activeConnection

        -- Precise Time Engine Tracking
        local lastTimePos = field.Game.TimePosition
        local lastClock = os.clock()

        activeConnection = RunService.RenderStepped:Connect(function(deltaTime)
            if not gamehandler.Field or not gamehandler.Field.Game or not field.HitLane then
                if activeConnection then activeConnection:Disconnect() end
                hasHitFirstNote = false
                return
            end

            local gameObj = field.Game
            local rawTimePos = gameObj.TimePosition
            local rate = gameObj.AdjustedPlayback or gameObj.PlaybackSpeed or 1
            if rate <= 0 then rate = 1 end
            local wallTime = os.clock()

            -- High-precision audio timeline resynchronization
            if rawTimePos ~= lastTimePos then
                lastTimePos = rawTimePos
                lastClock = wallTime
            end

            -- Extrapolate exact time position down to sub-milliseconds
            local currentSongTime = lastTimePos + ((wallTime - lastClock) * rate)

            -- 1. Precision Owner-Side Song-Time Release Management
            for i = 1, 9 do
                local state = laneState[i]
                if state.isHolding and currentSongTime >= state.releaseSongTime then
                    state.isHolding = false
                    local exactReleaseTime = wallTime + ((state.releaseSongTime - currentSongTime) / rate)
                    field:HitLane(i, false, exactReleaseTime)
                end
            end

            -- 2. Exact 0ms Hit Evaluation Engine for Owner Side Only
            local frameEndTime = currentSongTime + (deltaTime * rate)

            while noteIndex <= totalNotes do
                local note = processedNotes[noteIndex]
                local noteTime = note.Time

                if currentSongTime >= noteTime or (noteTime <= frameEndTime) then
                    local direction = note.Direction
                    local state = laneState[direction]

                    local exactHitTime = wallTime + ((noteTime - currentSongTime) / rate)

                    if state.isHolding then
                        field:HitLane(direction, false, exactHitTime)
                        state.isHolding = false
                    end

                    -- Trigger hit on LocalPlayer's field only
                    field:HitLane(direction, true, exactHitTime)
                    
                    -- Trigger post-first-hit flag & increment hit counter
                    hasHitFirstNote = true
                    totalNotesHit = totalNotesHit + 1

                    local noteLength = note.Length or 0
                    state.isHolding = true
                    
                    -- Calculate song release time compensated for rate speed shifts
                    if noteLength > 0 then
                        state.releaseSongTime = noteTime + noteLength
                    else
                        state.releaseSongTime = noteTime + (TAP_DURATION * rate)
                    end

                    noteIndex = noteIndex + 1
                else
                    break
                end
            end
        end)
    end

    if isfunctionhooked and isfunctionhooked(newgame) then restorefunction(newgame) end
    if newgame then
        local old
        old = hookfunction(newgame, newlclosure(function(...)
            old(...)
            task.spawn(ongamestarted)
            return
        end))
    end
]])

Features

  • No guis
  • support only high UNC executor
  • All support Note mechanics
  • Sv chart support
  • Very Very accurate hit (8.98 - 0.00) ms
  • This is Best one Try it!!!