Literally FNF autoplayer
Key Required

Literally FNF autoplayer

Literally FNF!MilkzxMilkzx 3K views 3.5K executesUpdated Mar 1, 2026
5.0/ 5(1 votes)
10100% Positive
Lua Script•263 lines (8929 chars)
local CoreGui = game:GetService("CoreGui")
local Players = game:GetService("Players")
local RunService = game:GetService("RunService")
local VirtualInputManager = game:GetService("VirtualInputManager")
local UserInputService = game:GetService("UserInputService")

local player = Players.LocalPlayer
local playerGui = player:WaitForChild("PlayerGui")
local fnfScreen = playerGui:WaitForChild("FNF"):WaitForChild("Screen"):WaitForChild("UI"):WaitForChild("Arrows")
local incomingArrowsFolder = fnfScreen:WaitForChild("IncomingArrows")

local binds = {
    Left = Enum.KeyCode.A,
    Down = Enum.KeyCode.S,
    Up = Enum.KeyCode.K,
    Right = Enum.KeyCode.L
}

local hitNotes = setmetatable({}, {__mode = "k"})
local activeHolds = {}
local isOn = false
local HIT_THRESHOLD = 50
local RELEASE_DELAY_MS = 15 
local GUI_NAME = "FNF_Autoplayer_GUI"

local existingGui = CoreGui:FindFirstChild(GUI_NAME) or playerGui:FindFirstChild(GUI_NAME)
if existingGui then
    existingGui:Destroy()
end

local gui = Instance.new("ScreenGui")
gui.Name = GUI_NAME
gui.ResetOnSpawn = false

local success, _ = pcall(function() gui.Parent = CoreGui end)
if not success then gui.Parent = playerGui end

local mainFrame = Instance.new("Frame")
mainFrame.Size = UDim2.new(0, 220, 0, 150) 
mainFrame.Position = UDim2.new(0.5, -110, 0.8, -75)
mainFrame.BackgroundColor3 = Color3.fromRGB(25, 25, 25)
mainFrame.BorderSizePixel = 0
mainFrame.Active = true
mainFrame.Draggable = true
mainFrame.Parent = gui

local uiCorner = Instance.new("UICorner")
uiCorner.CornerRadius = UDim.new(0, 8)
uiCorner.Parent = mainFrame

local titleLabel = Instance.new("TextLabel")
titleLabel.Size = UDim2.new(1, 0, 0, 25)
titleLabel.BackgroundTransparency = 1
titleLabel.Text = "LFNF Autoplayer"
titleLabel.TextColor3 = Color3.fromRGB(255, 255, 255)
titleLabel.Font = Enum.Font.GothamBold
titleLabel.TextSize = 14
titleLabel.Parent = mainFrame

local toggleBtn = Instance.new("TextButton")
toggleBtn.Size = UDim2.new(0, 180, 0, 30)
toggleBtn.Position = UDim2.new(0.5, -90, 0, 30)
toggleBtn.BackgroundColor3 = Color3.fromRGB(200, 50, 50)
toggleBtn.Text = "Status: OFF"
toggleBtn.TextColor3 = Color3.fromRGB(255, 255, 255)
toggleBtn.Font = Enum.Font.GothamBold
toggleBtn.TextSize = 14
toggleBtn.Parent = mainFrame

local toggleCorner = Instance.new("UICorner")
toggleCorner.CornerRadius = UDim.new(0, 6)
toggleCorner.Parent = toggleBtn

local minusDistBtn = Instance.new("TextButton")
minusDistBtn.Size = UDim2.new(0, 40, 0, 30)
minusDistBtn.Position = UDim2.new(0.5, -90, 0, 70)
minusDistBtn.BackgroundColor3 = Color3.fromRGB(45, 45, 45)
minusDistBtn.Text = "-"
minusDistBtn.TextColor3 = Color3.fromRGB(255, 255, 255)
minusDistBtn.Font = Enum.Font.GothamBold
minusDistBtn.TextSize = 18
minusDistBtn.Parent = mainFrame

local minusDistCorner = Instance.new("UICorner")
minusDistCorner.CornerRadius = UDim.new(0, 6)
minusDistCorner.Parent = minusDistBtn

local thresholdDisplay = Instance.new("TextLabel")
thresholdDisplay.Size = UDim2.new(0, 90, 0, 30)
thresholdDisplay.Position = UDim2.new(0.5, -45, 0, 70)
thresholdDisplay.BackgroundTransparency = 1
thresholdDisplay.Text = "Dist: " .. HIT_THRESHOLD
thresholdDisplay.TextColor3 = Color3.fromRGB(200, 200, 200)
thresholdDisplay.Font = Enum.Font.Gotham
thresholdDisplay.TextSize = 14
thresholdDisplay.Parent = mainFrame

local plusDistBtn = Instance.new("TextButton")
plusDistBtn.Size = UDim2.new(0, 40, 0, 30)
plusDistBtn.Position = UDim2.new(0.5, 50, 0, 70)
plusDistBtn.BackgroundColor3 = Color3.fromRGB(45, 45, 45)
plusDistBtn.Text = "+"
plusDistBtn.TextColor3 = Color3.fromRGB(255, 255, 255)
plusDistBtn.Font = Enum.Font.GothamBold
plusDistBtn.TextSize = 18
plusDistBtn.Parent = mainFrame

local plusDistCorner = Instance.new("UICorner")
plusDistCorner.CornerRadius = UDim.new(0, 6)
plusDistCorner.Parent = plusDistBtn

local minusMsBtn = Instance.new("TextButton")
minusMsBtn.Size = UDim2.new(0, 40, 0, 30)
minusMsBtn.Position = UDim2.new(0.5, -90, 0, 110)
minusMsBtn.BackgroundColor3 = Color3.fromRGB(45, 45, 45)
minusMsBtn.Text = "-"
minusMsBtn.TextColor3 = Color3.fromRGB(255, 255, 255)
minusMsBtn.Font = Enum.Font.GothamBold
minusMsBtn.TextSize = 18
minusMsBtn.Parent = mainFrame

local minusMsCorner = Instance.new("UICorner")
minusMsCorner.CornerRadius = UDim.new(0, 6)
minusMsCorner.Parent = minusMsBtn

local msDisplay = Instance.new("TextLabel")
msDisplay.Size = UDim2.new(0, 90, 0, 30)
msDisplay.Position = UDim2.new(0.5, -45, 0, 110)
msDisplay.BackgroundTransparency = 1
msDisplay.Text = "MS: " .. RELEASE_DELAY_MS
msDisplay.TextColor3 = Color3.fromRGB(200, 200, 200)
msDisplay.Font = Enum.Font.Gotham
msDisplay.TextSize = 14
msDisplay.Parent = mainFrame

local plusMsBtn = Instance.new("TextButton")
plusMsBtn.Size = UDim2.new(0, 40, 0, 30)
plusMsBtn.Position = UDim2.new(0.5, 50, 0, 110)
plusMsBtn.BackgroundColor3 = Color3.fromRGB(45, 45, 45)
plusMsBtn.Text = "+"
plusMsBtn.TextColor3 = Color3.fromRGB(255, 255, 255)
plusMsBtn.Font = Enum.Font.GothamBold
plusMsBtn.TextSize = 18
plusMsBtn.Parent = mainFrame

local plusMsCorner = Instance.new("UICorner")
plusMsCorner.CornerRadius = UDim.new(0, 6)
plusMsCorner.Parent = plusMsBtn

toggleBtn.MouseButton1Click:Connect(function()
    isOn = not isOn
    if isOn then
        toggleBtn.BackgroundColor3 = Color3.fromRGB(50, 200, 50)
        toggleBtn.Text = "Status: ON"
    else
        toggleBtn.BackgroundColor3 = Color3.fromRGB(200, 50, 50)
        toggleBtn.Text = "Status: OFF"
        for keycode, _ in pairs(activeHolds) do
            VirtualInputManager:SendKeyEvent(false, keycode, false, game)
        end
        table.clear(activeHolds)
    end
end)

local function getIncrement()
    if UserInputService:IsKeyDown(Enum.KeyCode.LeftControl) or UserInputService:IsKeyDown(Enum.KeyCode.RightControl) then
        return 10
    end
    return 1
end

minusDistBtn.MouseButton1Click:Connect(function()
    HIT_THRESHOLD = math.max(1, HIT_THRESHOLD - getIncrement())
    thresholdDisplay.Text = "Dist: " .. HIT_THRESHOLD
end)

plusDistBtn.MouseButton1Click:Connect(function()
    HIT_THRESHOLD = HIT_THRESHOLD + getIncrement()
    thresholdDisplay.Text = "Dist: " .. HIT_THRESHOLD
end)

minusMsBtn.MouseButton1Click:Connect(function()
    RELEASE_DELAY_MS = RELEASE_DELAY_MS - getIncrement()
    msDisplay.Text = "MS: " .. RELEASE_DELAY_MS
end)

plusMsBtn.MouseButton1Click:Connect(function()
    RELEASE_DELAY_MS = RELEASE_DELAY_MS + getIncrement()
    msDisplay.Text = "MS: " .. RELEASE_DELAY_MS
end)

local function getSusFrame(note)
    local frame = note:FindFirstChild("Frame")
    if frame then
        return frame:FindFirstChild("Sus") or frame:FindFirstChild("sus")
    end
    return nil
end

RunService.RenderStepped:Connect(function()
    if not isOn then return end

    for keycode, note in pairs(activeHolds) do
        local releaseKey = false
        
        if not note or not note.Parent then
            releaseKey = true
        else
            local sus = getSusFrame(note)
            if not sus or sus.AbsoluteSize.Y <= 1 then
                releaseKey = true
            end
        end

        if releaseKey then
            VirtualInputManager:SendKeyEvent(false, keycode, false, game)
            activeHolds[keycode] = nil
        end
    end

    for directionName, keycode in pairs(binds) do
        local receptor = fnfScreen:FindFirstChild(directionName)
        local incomingDirFolder = incomingArrowsFolder:FindFirstChild(directionName)

        if receptor and incomingDirFolder then
            local receptorPos = receptor.AbsolutePosition
            local bestNote = nil
            local minDistance = HIT_THRESHOLD

            for _, note in ipairs(incomingDirFolder:GetChildren()) do
                if note:IsA("GuiObject") and note.Visible and not hitNotes[note] then
                    local notePos = note.AbsolutePosition
                    local distance = (notePos - receptorPos).Magnitude

                    if distance <= minDistance then
                        minDistance = distance
                        bestNote = note
                    end
                end
            end

            if bestNote then
                hitNotes[bestNote] = true
                
                VirtualInputManager:SendKeyEvent(false, keycode, false, game)
                VirtualInputManager:SendKeyEvent(true, keycode, false, game)
                
                local sus = getSusFrame(bestNote)
                
                if sus and sus.AbsoluteSize.Y > 1 then
                    activeHolds[keycode] = bestNote
                else
                    
                    task.delay(RELEASE_DELAY_MS / 1000, function()
                        if activeHolds[keycode] == nil then
                            VirtualInputManager:SendKeyEvent(false, keycode, false, game)
                        end
                    end)
                end
            end
        end
    end
end)

Features & Information

Just a basic autoplayer, open source, don't care, made it cause i searched and didn't find any so i had to make one any issues tell me or fix it yourself since it's open source lol also use ASKL as keybinds or change them in the script Also don't play expurgation or any songs with death notes cause i was too lazy to make a death note detection it works perfectly with notespeed set to 3.5, Dist 50 and MS 15, i haven't tested any other way than that. MS is basically how long it'll stay holding down the note (the lower the better for jacks so it doesn't miss) and Dist is just when it'll press, anything other lower or too high than 50 will get you misses
#autoplayer#LFNF#bot

Community Comments (6)

voidhatesvoidhatesMar 2, 2026

how does it work omg

Replying to @voidhates
MilkzxMilkzxMar 4, 2026

@voidhates you just execute it then enable it and play a song, how else would it work?

Replying to @Milkzx
voidhatesvoidhatesMar 4, 2026

@Milkzx idk not sure

I'm on mobile So. Is this only for PC?

Replying to @wsemajwliliams692
MilkzxMilkzxMar 8, 2026(edited)

@wsemajwliliams692 Yeah, probably, but you can try if you want to. It needs ASKL keybinds to work, if u cannot set them somehow it prob wouldn't work, so changing the script to WASD should work the best.

aydenog14aydenog14Jul 29, 2026

how do I do this