-- Developed for my sempai:33333333333
local RunService = game:GetService("RunService")
local UserInputService = game:GetService("UserInputService")
local Players = game:GetService("Players")
local LocalPlayer = Players.LocalPlayer
local PlayerScripts = LocalPlayer:WaitForChild("PlayerScripts")
local Client = PlayerScripts:WaitForChild("Client")
local Gameplay = Client:WaitForChild("Gameplay")
local UI = Client:WaitForChild("UI")
local Note = require(Gameplay:WaitForChild("Note"))
local Input = require(Gameplay:WaitForChild("Input"))
local Hud = require(Gameplay:WaitForChild("Hud"))
local State = require(Client:WaitForChild("Core"):WaitForChild("State"))
local Results = require(UI:WaitForChild("Screens"):WaitForChild("Results"))
local Round = require(Gameplay:WaitForChild("Round"))
if _G.FunkyDuelsCleanup then
pcall(_G.FunkyDuelsCleanup)
end
local Config = {
Autoplay = true,
HitMode = "Perfect",
LegitJitter = 12,
AutoHold = true,
ServerReplication = true,
PreventMisses = true,
SpoofEnabled = true,
LiveHudSpoof = true,
ResultsSpoof = true,
Score = 1500000,
Misses = 0,
Accuracy = 100.0,
Sicks = 999,
Goods = 0,
Okays = 0,
Bads = 0,
Combo = 999,
MaxCombo = 999
}
local activeHolds = {}
local handledNotes = {}
local connections = {}
local originalMethods = {}
local rawTryHitNote = Note.TryHitNote
local rawGetResults = Note.GetResults
local rawApplyGhostMiss = Note.ApplyGhostMiss
local rawSetNoteResolvedCallback = Note.SetNoteResolvedCallback
local function sanitizeInt(val, defaultVal, maxVal)
local n = tonumber(val) or (defaultVal or 0)
if n ~= n or n == math.huge or n == -math.huge then
n = defaultVal or 0
end
return math.clamp(math.floor(n), 0, maxVal or 999999999)
end
local function sanitizeFloat(val, defaultVal, minVal, maxVal)
local n = tonumber(val) or (defaultVal or 0)
if n ~= n or n == math.huge or n == -math.huge then
n = defaultVal or 0
end
return math.clamp(n, minVal or 0, maxVal or 100)
end
local function getInputHandlers()
local upvals = debug.getupvalues(Input.Init)
local bindKb = upvals[8]
if bindKb then
local inner = debug.getupvalues(bindKb)
return inner[5], inner[6]
end
return nil, nil
end
local function getNoteContext()
local upvals = debug.getupvalues(rawTryHitNote)
return {
conductor = upvals[1],
timingOffset = upvals[2] or 0,
noteList = upvals[3],
roundContext = upvals[4],
match = upvals[5],
hitNote = upvals[7]
}
end
local function isLocalNote(note, context)
if not context or not context.SessionLocalSide then
return note.IsPlayer == true
end
return (note.IsPlayer == false) == (context.SessionLocalSide == "Left")
end
local showStats = debug.getupvalues(Results.Show)[1]
local origSetCount = debug.getupvalues(showStats)[2]
local u63 = debug.getupvalues(origSetCount)[1]
local function safeSetCount(frame, count)
if not frame or not frame:FindFirstChild("Index") then return end
local Index = frame.Index
for _, c in ipairs(frame:GetChildren()) do
if c ~= Index and not c:IsA("UIListLayout") then
c:Destroy()
end
end
Index.Visible = false
local num = sanitizeInt(count, 0, 999999999)
local str = string.format("%d", num)
for i = 1, #str do
local digit = tonumber(str:sub(i, i))
if digit and u63[digit + 1] and u63[digit + 1][1] then
local clone = Index:Clone()
clone.LayoutOrder = i
clone.Visible = true
clone.Image = u63[digit + 1][1].assetId
clone.Parent = frame
end
end
end
debug.setupvalue(showStats, 2, safeSetCount)
debug.setupvalue(Results.Show, 3, safeSetCount)
originalMethods.SetNoteResolvedCallback = rawSetNoteResolvedCallback
Note.SetNoteResolvedCallback = function(callback)
local wrappedCallback = function(target, count, isHit, dir, noteData)
if target == "player" and Config.SpoofEnabled and Config.ServerReplication then
if noteData then
noteData.ResolvedSongTimeMs = noteData.TimeMs
end
if Config.PreventMisses then
isHit = true
end
end
return callback(target, count, isHit, dir, noteData)
end
return rawSetNoteResolvedCallback(wrappedCallback)
end
originalMethods.ApplyGhostMiss = rawApplyGhostMiss
Note.ApplyGhostMiss = function(dir)
if Config.SpoofEnabled and Config.PreventMisses then
return false
end
return rawApplyGhostMiss(dir)
end
local function syncInternalStats()
if not Config.SpoofEnabled then return end
local upvals = debug.getupvalues(rawGetResults)
if not upvals or #upvals maxTime then
maxTime = n.TimeMs
end
end
if maxTime > 0 then
lastActiveNoteTime = maxTime
end
if not hasUnresolvedNotes and lastActiveNoteTime > 0 and liveSongTime >= lastActiveNoteTime + 2500 then
songEndWatchdogTriggered = true
task.defer(function()
if onSongEnded and not Results.IsVisible() and not roundContext.RoundOver then
pcall(onSongEnded)
end
end)
end
end
local function onHeartbeat()
if State.GetState() ~= "InGame" then
table.clear(activeHolds)
table.clear(handledNotes)
songEndWatchdogTriggered = false
lastActiveNoteTime = 0
return
end
local ctx = getNoteContext()
if not ctx.conductor or type(ctx.conductor.GetLiveSongTimeMs) ~= "function" or not ctx.noteList or not ctx.roundContext then return end
if ctx.roundContext.RoundOver or Note.IsPaused() then return end
syncInternalStats()
local hp, hr = getInputHandlers()
local liveSongTime = ctx.conductor.GetLiveSongTimeMs() + ctx.timingOffset
checkSongEndWatchdog(liveSongTime, ctx.noteList, ctx.roundContext)
if not Config.Autoplay then return end
if Config.AutoHold then
for dir, hold in pairs(activeHolds) do
if liveSongTime >= hold.endTime - 8 then
if hr then hr(dir) end
activeHolds[dir] = nil
end
end
end
for _, note in ipairs(ctx.noteList) do
if not note.Hit and not note.Missed and not handledNotes[note] then
if isLocalNote(note, ctx.roundContext) then
local jitter = 0
if Config.HitMode == "Legit" then
if not note._jitter then
note._jitter = math.random(-Config.LegitJitter, Config.LegitJitter)
end
jitter = note._jitter
end
local targetHitTime = note.TimeMs + jitter
if liveSongTime >= targetHitTime then
handledNotes[note] = true
if Config.ServerReplication then
note.ResolvedSongTimeMs = note.TimeMs
end
if hp then hp(note.Dir) end
if not note.Hit then rawTryHitNote(note.Dir) end
if note.HoldMs and note.HoldMs > 0 then
activeHolds[note.Dir] = {
dir = note.Dir,
endTime = note.TimeMs + note.HoldMs
}
else
task.delay(0.045 + math.random() * 0.015, function()
if hr and not activeHolds[note.Dir] then
hr(note.Dir)
end
end)
end
end
end
end
end
if #ctx.noteList == 0 and next(handledNotes) ~= nil then
table.clear(handledNotes)
end
end
table.insert(connections, RunService.Heartbeat:Connect(onHeartbeat))
local targetParent = (gethui and gethui()) or game:GetService("CoreGui"):FindFirstChild("RobloxGui") or LocalPlayer:WaitForChild("PlayerGui")
local gui = Instance.new("ScreenGui")
gui.Name = "FunkyDuels_Mod"
gui.ResetOnSpawn = false
gui.ZIndexBehavior = Enum.ZIndexBehavior.Sibling
local mainFrame = Instance.new("Frame")
mainFrame.Name = "MainFrame"
mainFrame.Size = UDim2.new(0, 300, 0, 380)
mainFrame.Position = UDim2.new(0.5, -150, 0.5, -190)
mainFrame.BackgroundColor3 = Color3.fromRGB(14, 12, 20)
mainFrame.BorderSizePixel = 0
mainFrame.Active = true
mainFrame.Draggable = true
mainFrame.ClipsDescendants = true
mainFrame.Parent = gui
local mainCorner = Instance.new("UICorner")
mainCorner.CornerRadius = UDim.new(0, 8)
mainCorner.Parent = mainFrame
local mainStroke = Instance.new("UIStroke")
mainStroke.Color = Color3.fromRGB(145, 65, 235)
mainStroke.Thickness = 1.2
mainStroke.Parent = mainFrame
local titleBar = Instance.new("Frame")
titleBar.Size = UDim2.new(1, 0, 0, 32)
titleBar.BackgroundColor3 = Color3.fromRGB(22, 18, 32)
titleBar.BorderSizePixel = 0
titleBar.Parent = mainFrame
local titleCorner = Instance.new("UICorner")
titleCorner.CornerRadius = UDim.new(0, 8)
titleCorner.Parent = titleBar
local titleFix = Instance.new("Frame")
titleFix.Size = UDim2.new(1, 0, 0, 8)
titleFix.Position = UDim2.new(0, 0, 1, -8)
titleFix.BackgroundColor3 = Color3.fromRGB(22, 18, 32)
titleFix.BorderSizePixel = 0
titleFix.Parent = titleBar
local titleText = Instance.new("TextLabel")
titleText.Size = UDim2.new(1, -64, 1, 0)
titleText.Position = UDim2.new(0, 10, 0, 0)
titleText.Text = "funky duels script"
titleText.Font = Enum.Font.GothamBold
titleText.TextSize = 12
titleText.TextColor3 = Color3.fromRGB(195, 130, 255)
titleText.TextXAlignment = Enum.TextXAlignment.Left
titleText.BackgroundTransparency = 1
titleText.Parent = titleBar
local minBtn = Instance.new("TextButton")
minBtn.Size = UDim2.new(0, 22, 0, 22)
minBtn.Position = UDim2.new(1, -50, 0.5, -11)
minBtn.Text = "-"
minBtn.Font = Enum.Font.GothamBold
minBtn.TextSize = 14
minBtn.TextColor3 = Color3.fromRGB(210, 190, 230)
minBtn.BackgroundColor3 = Color3.fromRGB(32, 26, 45)
minBtn.BorderSizePixel = 0
minBtn.AutoButtonColor = true
minBtn.Parent = titleBar
local minCorner = Instance.new("UICorner")
minCorner.CornerRadius = UDim.new(0, 4)
minCorner.Parent = minBtn
local closeBtn = Instance.new("TextButton")
closeBtn.Size = UDim2.new(0, 22, 0, 22)
closeBtn.Position = UDim2.new(1, -26, 0.5, -11)
closeBtn.Text = "X"
closeBtn.Font = Enum.Font.GothamBold
closeBtn.TextSize = 11
closeBtn.TextColor3 = Color3.fromRGB(255, 90, 90)
closeBtn.BackgroundColor3 = Color3.fromRGB(38, 20, 30)
closeBtn.BorderSizePixel = 0
closeBtn.AutoButtonColor = true
closeBtn.Parent = titleBar
local closeCorner = Instance.new("UICorner")
closeCorner.CornerRadius = UDim.new(0, 4)
closeCorner.Parent = closeBtn
local floatIcon = Instance.new("TextButton")
floatIcon.Name = "FloatingIcon"
floatIcon.Size = UDim2.new(0, 36, 0, 36)
floatIcon.Position = UDim2.new(0, 18, 0.5, -18)
floatIcon.BackgroundColor3 = Color3.fromRGB(14, 12, 20)
floatIcon.BorderSizePixel = 0
floatIcon.Text = "FD"
floatIcon.Font = Enum.Font.GothamBold
floatIcon.TextSize = 13
floatIcon.TextColor3 = Color3.fromRGB(195, 130, 255)
floatIcon.Active = true
floatIcon.Draggable = true
floatIcon.Visible = false
floatIcon.Parent = gui
local iconCorner = Instance.new("UICorner")
iconCorner.CornerRadius = UDim.new(0, 8)
iconCorner.Parent = floatIcon
local iconStroke = Instance.new("UIStroke")
iconStroke.Color = Color3.fromRGB(145, 65, 235)
iconStroke.Thickness = 1.2
iconStroke.Parent = floatIcon
local function showMain()
mainFrame.Visible = true
floatIcon.Visible = false
end
local function minimizeToIcon()
mainFrame.Visible = false
floatIcon.Visible = true
end
local function toggleGui()
if mainFrame.Visible then
minimizeToIcon()
else
showMain()
end
end
minBtn.MouseButton1Click:Connect(minimizeToIcon)
closeBtn.MouseButton1Click:Connect(minimizeToIcon)
floatIcon.MouseButton1Click:Connect(showMain)
table.insert(connections, UserInputService.InputBegan:Connect(function(input, gpe)
if not gpe and input.KeyCode == Enum.KeyCode.RightShift then
toggleGui()
end
end))
local content = Instance.new("ScrollingFrame")
content.Size = UDim2.new(1, -16, 1, -42)
content.Position = UDim2.new(0, 8, 0, 36)
content.BackgroundTransparency = 1
content.BorderSizePixel = 0
content.ScrollBarThickness = 3
content.ScrollBarImageColor3 = Color3.fromRGB(145, 65, 235)
content.CanvasSize = UDim2.new(0, 0, 0, 440)
content.Parent = mainFrame
local layout = Instance.new("UIListLayout")
layout.Padding = UDim.new(0, 5)
layout.SortOrder = Enum.SortOrder.LayoutOrder
layout.Parent = content
local function createSection(text)
local sec = Instance.new("TextLabel")
sec.Size = UDim2.new(1, 0, 0, 20)
sec.Text = string.upper(text)
sec.Font = Enum.Font.GothamBold
sec.TextSize = 10
sec.TextColor3 = Color3.fromRGB(160, 130, 195)
sec.TextXAlignment = Enum.TextXAlignment.Left
sec.BackgroundTransparency = 1
sec.Parent = content
end
local function createToggle(label, initialVal, callback)
local btn = Instance.new("TextButton")
btn.Size = UDim2.new(1, 0, 0, 26)
btn.BackgroundColor3 = Color3.fromRGB(24, 20, 34)
btn.BorderSizePixel = 0
btn.AutoButtonColor = false
btn.Text = ""
btn.Parent = content
local btnCorner = Instance.new("UICorner")
btnCorner.CornerRadius = UDim.new(0, 5)
btnCorner.Parent = btn
local txt = Instance.new("TextLabel")
txt.Size = UDim2.new(1, -50, 1, 0)
txt.Position = UDim2.new(0, 8, 0, 0)
txt.Text = label
txt.Font = Enum.Font.GothamMedium
txt.TextSize = 11
txt.TextColor3 = Color3.fromRGB(210, 220, 235)
txt.TextXAlignment = Enum.TextXAlignment.Left
txt.BackgroundTransparency = 1
txt.Parent = btn
local indicator = Instance.new("Frame")
indicator.Size = UDim2.new(0, 32, 0, 16)
indicator.Position = UDim2.new(1, -40, 0.5, -8)
indicator.BackgroundColor3 = initialVal and Color3.fromRGB(145, 65, 235) or Color3.fromRGB(45, 38, 55)
indicator.BorderSizePixel = 0
indicator.Parent = btn
local indCorner = Instance.new("UICorner")
indCorner.CornerRadius = UDim.new(1, 0)
indCorner.Parent = indicator
local dot = Instance.new("Frame")
dot.Size = UDim2.new(0, 12, 0, 12)
dot.Position = initialVal and UDim2.new(1, -14, 0.5, -6) or UDim2.new(0, 2, 0.5, -6)
dot.BackgroundColor3 = Color3.fromRGB(255, 255, 255)
dot.BorderSizePixel = 0
dot.Parent = indicator
local dotCorner = Instance.new("UICorner")
dotCorner.CornerRadius = UDim.new(1, 0)
dotCorner.Parent = dot
local state = initialVal
btn.MouseButton1Click:Connect(function()
state = not state
indicator.BackgroundColor3 = state and Color3.fromRGB(145, 65, 235) or Color3.fromRGB(45, 38, 55)
dot.Position = state and UDim2.new(1, -14, 0.5, -6) or UDim2.new(0, 2, 0.5, -6)
callback(state)
end)
return btn
end
local function createInput(label, defaultVal, callback)
local frame = Instance.new("Frame")
frame.Size = UDim2.new(1, 0, 0, 26)
frame.BackgroundColor3 = Color3.fromRGB(24, 20, 34)
frame.BorderSizePixel = 0
frame.Parent = content
local fCorner = Instance.new("UICorner")
fCorner.CornerRadius = UDim.new(0, 5)
fCorner.Parent = frame
local txt = Instance.new("TextLabel")
txt.Size = UDim2.new(0.52, 0, 1, 0)
txt.Position = UDim2.new(0, 8, 0, 0)
txt.Text = label
txt.Font = Enum.Font.GothamMedium
txt.TextSize = 11
txt.TextColor3 = Color3.fromRGB(190, 205, 225)
txt.TextXAlignment = Enum.TextXAlignment.Left
txt.BackgroundTransparency = 1
txt.Parent = frame
local box = Instance.new("TextBox")
box.Size = UDim2.new(0.44, -8, 0, 20)
box.Position = UDim2.new(0.54, 0, 0.5, -10)
box.BackgroundColor3 = Color3.fromRGB(13, 11, 18)
box.BorderSizePixel = 0
box.Text = tostring(defaultVal)
box.Font = Enum.Font.GothamBold
box.TextSize = 11
box.TextColor3 = Color3.fromRGB(210, 150, 255)
box.ClearTextOnFocus = false
box.Parent = frame
local bCorner = Instance.new("UICorner")
bCorner.CornerRadius = UDim.new(0, 4)
bCorner.Parent = box
box.FocusLost:Connect(function()
callback(box.Text)
end)
return box
end
createSection("--- NETWORK REPLICATION ---")
createToggle("Server Replicate SICKs (0ms)", Config.ServerReplication, function(val) Config.ServerReplication = val end)
createToggle("Network Suppress Misses", Config.PreventMisses, function(val) Config.PreventMisses = val end)
createSection("--- AUTOPLAY CONTROLS ---")
createToggle("Autoplay Active", Config.Autoplay, function(val) Config.Autoplay = val end)
createToggle("Hit Mode: Perfect (OFF = Legit)", Config.HitMode == "Perfect", function(val)
Config.HitMode = val and "Perfect" or "Legit"
end)
createToggle("Auto Release Holds", Config.AutoHold, function(val) Config.AutoHold = val end)
createSection("--- DATA SPOOFER ---")
createToggle("Enable Data Spoofing", Config.SpoofEnabled, function(val) Config.SpoofEnabled = val end)
createToggle("Live HUD Display Spoof", Config.LiveHudSpoof, function(val) Config.LiveHudSpoof = val end)
createToggle("Results Screen Spoof", Config.ResultsSpoof, function(val) Config.ResultsSpoof = val end)
local boxScore = createInput("Spoofed Score", Config.Score, function(val) Config.Score = sanitizeInt(val, 1500000) end)
local boxAcc = createInput("Spoofed Accuracy %", Config.Accuracy, function(val) Config.Accuracy = sanitizeFloat(val, 100, 0, 100) end)
local boxSicks = createInput("Spoofed Sicks", Config.Sicks, function(val) Config.Sicks = sanitizeInt(val, 999) end)
local boxGoods = createInput("Spoofed Goods", Config.Goods, function(val) Config.Goods = sanitizeInt(val, 0) end)
local boxOkays = createInput("Spoofed Okays", Config.Okays, function(val) Config.Okays = sanitizeInt(val, 0) end)
local boxBads = createInput("Spoofed Bads", Config.Bads, function(val) Config.Bads = sanitizeInt(val, 0) end)
local boxMisses = createInput("Spoofed Misses", Config.Misses, function(val) Config.Misses = sanitizeInt(val, 0) end)
local boxCombo = createInput("Spoofed Max Combo", Config.MaxCombo, function(val)
Config.MaxCombo = sanitizeInt(val, 999)
Config.Combo = Config.MaxCombo
end)
_G.FunkyDuelsCleanup = function()
for _, conn in ipairs(connections) do
pcall(function() conn:Disconnect() end)
end
table.clear(connections)
Note.TryHitNote = rawTryHitNote
Note.GetResults = rawGetResults
Note.ApplyGhostMiss = rawApplyGhostMiss
Note.SetNoteResolvedCallback = rawSetNoteResolvedCallback
if originalMethods.RenderStats then Hud.RenderStats = originalMethods.RenderStats end
if originalMethods.Show then Results.Show = originalMethods.Show end
pcall(function()
debug.setupvalue(showStats, 2, origSetCount)
debug.setupvalue(Results.Show, 3, origSetCount)
end)
if gui and gui.Parent then
gui:Destroy()
end
_G.FunkyDuelsCleanup = nil
print("[FunkyDuels] V5 Unloaded cleanly.")
end
gui.Parent = targetParent
print("all vibecoders are femboys:333")