Quick actions

cmd+k|ctrl+k

Navigation

Languages

fnf but both side

Snippet info

Language

Lua

Visibility

public

Author

dinoturto

Created

2021-09-29T14:49:53.600757Z

Updated

2023-06-06T01:28:04.074798Z

local function wait(time)
    return task.wait(time)
end

local chr = owner.Character
local root = chr.HumanoidRootPart

local bopeebo = game:service'HttpService':GetAsync('https://raw.githubusercontent.com/FunkinCrew/Funkin/master/assets/preload/data/milf/milf-hard.json')
--[[local madness = game:service'HttpService':GetAsync('https://raw.githubusercontent.com/KadeDev/trickster/master/assets/preload/data/madness/madness-hard.json')
local hellclown = game:service'HttpService':GetAsync('https://raw.githubusercontent.com/KadeDev/trickster/master/assets/preload/data/hellclown/hellclown-hard.json')
local expurgation = game:service'HttpService':GetAsync('https://raw.githubusercontent.com/KadeDev/trickster/master/assets/preload/data/expurgation/expurgation-hard.json')
local bopeebobside = game:service'HttpService':GetAsync('https://cdn.glitch.com/5840d45c-410b-46a8-85f5-60fd817bb73b%2Fbopeebo-hard.json?v=1631756913771')
local sussusmoogus = game:service'HttpService':GetAsync('https://raw.githubusercontent.com/Clowfoe/ImpostorWeek2/main/assets/preload/data/sussus-moogus/sussus-moogus-hard.json')
local lightsdown = game:service'HttpService':GetAsync('https://raw.githubusercontent.com/Clowfoe/ImpostorWeek2/main/assets/preload/data/lights-down/lights-down-hard.json')
local ghost = game:service'HttpService':GetAsync('https://raw.githubusercontent.com/ItzFireable/VsCamellia/master/assets/preload/data/ghost/ghost-hard.json')
local bushwhack = game:service'HttpService':GetAsync('https://raw.githubusercontent.com/KadeDev/Vs-Zardy/main/assets/preload/data/bushwhack/bushwhack.json')
local ectospasm = game:service'HttpService':GetAsync('https://raw.githubusercontent.com/ArcyDev/Vs-Retrospecter/master/assets/preload/data/ectospasm/ectospasm-truehell.json')
local endless = game:service'HttpService':GetAsync('https://raw.githubusercontent.com/CryBitDev/Sonic.exe-source/master/assets/preload/data/endless/endless-hard.json')
local execution = game:service'HttpService':GetAsync('https://raw.githubusercontent.com/CryBitDev/Sonic.exe-source/master/assets/preload/data/execution/execution-hard.json')
local run = game:service'HttpService':GetAsync('https://raw.githubusercontent.com/wildythomas/mmmbob/main/assets/preload/data/run/run-hard.json')]]

local chartraw = bopeebo
local scrollSpeed = 4

local chartDecode = game:service'HttpService':JSONDecode(chartraw)

function getNotes(chart)
    local notes = {}
    
    for i,s in pairs(chart.notes) do
        for i,v in pairs(s.sectionNotes) do
            table.insert(notes, {v[1], v[2], v[3], s.mustHitSection})
        end
    end
    
    return notes
end

noteData = getNotes(chartDecode.song)

local fardNote = {__index = {}}

function createNote(size, position, parent, color)
    local noteT = {}
    setmetatable(noteT,fardNote)
    local note = Instance.new('Part')
    note.Size = size
    note.Color = color
    note.Material = 'SmoothPlastic'
    note.Massless = true
    note.Anchored = false
    note.CastShadow = false
    note.CanCollide = false
    note.TopSurface = 'Smooth'
    note.Parent = script
    
    local noteweld = Instance.new('Weld')
    noteweld.Part0 = parent
    noteweld.Part1 = note
    noteweld.C0 = position
    noteweld.Parent = parent
    
    noteT.Note = note
    noteT.NoteWeld = noteweld
    
	return(noteT)
end

local left1 = createNote(Vector3.new(1.875,.5,2), CFrame.new(8,4.5,0), root, Color3.fromRGB(135,163,173))

local down1 = createNote(Vector3.new(1.875,.5,2), CFrame.new(6,4.5,0), root, Color3.fromRGB(135,163,173))

local up1 = createNote(Vector3.new(1.875,.5,2), CFrame.new(4,4.5,0), root, Color3.fromRGB(135,163,173))

local right1 = createNote(Vector3.new(1.875,.5,2), CFrame.new(2,4.5,0), root, Color3.fromRGB(135,163,173))

local left2 = createNote(Vector3.new(1.875,.5,2), CFrame.new(-2,4.5,0), root, Color3.fromRGB(135,163,173))

local down2 = createNote(Vector3.new(1.875,.5,2), CFrame.new(-4,4.5,0), root, Color3.fromRGB(135,163,173))

local up2 = createNote(Vector3.new(1.875,.5,2), CFrame.new(-6,4.5,0), root, Color3.fromRGB(135,163,173))

local right2 = createNote(Vector3.new(1.875,.5,2), CFrame.new(-8,4.5,0), root, Color3.fromRGB(135,163,173))

local leftSize = left1.Note.Size
local downSize = down1.Note.Size
local upSize = up1.Note.Size
local rightSize = right1.Note.Size

local song = Instance.new('Sound')
song.Name = 'fnfSong'
song.Volume = 1.75

if chartraw == bopeebo then
    song.SoundId = 'rbxassetid://6804523388'
elseif chartraw == madness then
    song.SoundId = 'rbxassetid://6541168042'
elseif chartraw == bopeebobside then
    song.SoundId = 'rbxassetid://6210494706'
elseif chartraw == sussusmoogus then
    song.SoundId = 'rbxassetid://6855406669'
elseif chartraw == lightsdown then
    song.SoundId = 'rbxassetid://7358286120'
elseif chartraw == ghost then
    song.SoundId = 'rbxassetid://1074484884'
elseif chartraw == expurgation then
    song.SoundId = 'rbxassetid://6918324166'
elseif chartraw == bushwhack then
    song.SoundId = 'rbxassetid://7360389205'
elseif chartraw == ectospasm then
    song.SoundId = 'rbxassetid://7397166811'
elseif chartraw == endless then
    song.SoundId = 'rbxassetid://7313871314'
elseif chartraw == hellclown then
    song.SoundId = 'rbxassetid://6918304049'
elseif chartraw == execution then
    song.SoundId = 'rbxassetid://7315074632'
elseif chartraw == run then
    song.SoundId = 'rbxassetid://6812642602'
end

local timegui = Instance.new("BillboardGui")
timegui.Adornee = root
timegui.Name = "timepassed"
timegui.Size = UDim2.new(1.5,0,1.25,0)
timegui.StudsOffset = Vector3.new(-1.5,3,0)
timegui.Parent = root

local timeg = Instance.new("Frame")
timeg.Size = UDim2.new(3,0,.5,0)
timeg.BackgroundColor3 = Color3.fromRGB(135,163,173)
timeg.BorderSizePixel = .2
timeg.BorderColor3 = Color3.fromRGB(38,118,77)
timeg.Parent = timegui

local timepassedg = Instance.new("Frame")
timepassedg.Size = UDim2.new(song.TimePosition / song.TimeLength,0,1,0)
timepassedg.BackgroundColor3 = Color3.fromRGB(18,250,5)
timeg.BorderSizePixel = .2
timepassedg.BorderColor3 = Color3.fromRGB(38,118,77)
timepassedg.Parent = timeg

song.Parent = root

local songPreload = song:Clone()
songPreload.SoundId = song.SoundId
songPreload.Volume = 0.01
songPreload.Parent = root

function noteHit(part, hold)
    local ogSize = Vector3.new()
    part.Note.Material = 'Neon'
    if part == left1 or part == left2 then
        part.Note.Color = Color3.fromRGB(214,95,173)
        ogSize = leftSize
    elseif part == down1 or part == down2 then
        part.Note.Color = Color3.fromRGB(0,255,255)
        ogSize = downSize
    elseif part == up1 or part == up2 then
        part.Note.Color = Color3.fromRGB(18,250,5)
        ogSize = upSize
    elseif part == right1 or part == right2 then
        part.Note.Color = Color3.fromRGB(249,57,63)
        ogSize = rightSize
    end
    task.spawn(function()
        if hold > 0 then
            part.Note.Size = part.Note.Size * 1.1
            sizing = true
            wait(hold - .075)
            sizing = false
            part.Note.Size = ogSize
            part.Note.Material = 'SmoothPlastic'
            part.Note.Color = Color3.fromRGB(135,163,173)
        else
            part.Note.Size = part.Note.Size * 1.1
            wait(.075)
            part.Note.Size = ogSize
            part.Note.Material = 'SmoothPlastic'
            part.Note.Color = Color3.fromRGB(135,163,173)
        end
    end)
end

function noteDetect(noteType, holdLength, hitSection)
    if hitSection == true then
        if noteType == 0 then
            noteHit(left2, holdLength)
        elseif noteType == 1 then
            noteHit(down2, holdLength)
        elseif noteType == 2 then
            noteHit(up2, holdLength)
        elseif noteType == 3 then
            noteHit(right2, holdLength)
        elseif noteType == 4 then
            noteHit(left1, holdLength)
        elseif noteType == 5 then
            noteHit(down1, holdLength)
        elseif noteType == 6 then
            noteHit(up1, holdLength)
        elseif noteType == 7 then
            noteHit(right1, holdLength)
        end
    elseif hitSection == false then
        if noteType == 0 then
            noteHit(left1, holdLength)
        elseif noteType == 1 then
            noteHit(down1, holdLength)
        elseif noteType == 2 then
            noteHit(up1, holdLength)
        elseif noteType == 3 then
            noteHit(right1, holdLength)
        elseif noteType == 4 then
            noteHit(left2, holdLength)
        elseif noteType == 5 then
            noteHit(down2, holdLength)
        elseif noteType == 6 then
            noteHit(up2, holdLength)
        elseif noteType == 7 then
            noteHit(right2, holdLength)
        end
    end
end

function noteFall(noteType, holdLength, hitSection, offset)
    local fallNote = createNote(Vector3.new(1.875,.5,2), CFrame.new(0,5,0), root, Color3.fromRGB(0,0,0))
    if hitSection == true then
        if noteType == 0 then
            fallNote.NoteWeld.Part0 = left2.Note
            fallNote.NoteWeld.Parent = left2.Note
            fallNote.Note.Color = Color3.fromRGB(194,75,153)
            fallNote.NoteWeld.C0 = CFrame.new(0,11 - offset,0)
        elseif noteType == 1 then
            fallNote.NoteWeld.Part0 = down2.Note
            fallNote.NoteWeld.Parent = down2.Note
            fallNote.Note.Color = Color3.fromRGB(0,255,255)
            fallNote.NoteWeld.C0 = CFrame.new(0,11 - offset,0)
        elseif noteType == 2 then
            fallNote.NoteWeld.Part0 = up2.Note
            fallNote.NoteWeld.Parent = up2.Note
            fallNote.Note.Color = Color3.fromRGB(18,250,5)
            fallNote.NoteWeld.C0 = CFrame.new(0,11 - offset,0)
        elseif noteType == 3 then
            fallNote.NoteWeld.Part0 = right2.Note
            fallNote.NoteWeld.Parent = right2.Note
            fallNote.Note.Color = Color3.fromRGB(249,57,63)
            fallNote.NoteWeld.C0 = CFrame.new(0,11 - offset,0)
        elseif noteType == 4 then
            fallNote.NoteWeld.Part0 = left1.Note
            fallNote.NoteWeld.Parent = left1.Note
            fallNote.Note.Color = Color3.fromRGB(194,75,153)
            fallNote.NoteWeld.C0 = CFrame.new(0,11 - offset,0)
        elseif noteType == 5 then
            fallNote.NoteWeld.Part0 = down1.Note
            fallNote.NoteWeld.Parent = down1.Note
            fallNote.Note.Color = Color3.fromRGB(0,255,255)
            fallNote.NoteWeld.C0 = CFrame.new(0,11 - offset,0)
        elseif noteType == 6 then
            fallNote.NoteWeld.Part0 = up1.Note
            fallNote.NoteWeld.Parent = up1.Note
            fallNote.Note.Color = Color3.fromRGB(18,250,5)
            fallNote.NoteWeld.C0 = CFrame.new(0,11 - offset,0)
        elseif noteType == 7 then
            fallNote.NoteWeld.Part0 = right1.Note
            fallNote.NoteWeld.Parent = right1.Note
            fallNote.Note.Color = Color3.fromRGB(249,57,63)
            fallNote.NoteWeld.C0 = CFrame.new(0,11 - offset,0)
        end
    elseif hitSection == false then
        if noteType == 0 then
            fallNote.NoteWeld.Part0 = left1.Note
            fallNote.NoteWeld.Parent = left1.Note
            fallNote.Note.Color = Color3.fromRGB(194,75,153)
            fallNote.NoteWeld.C0 = CFrame.new(0,11 - offset,0)
        elseif noteType == 1 then
            fallNote.NoteWeld.Part0 = down1.Note
            fallNote.NoteWeld.Parent = down1.Note
            fallNote.Note.Color = Color3.fromRGB(0,255,255)
            fallNote.NoteWeld.C0 = CFrame.new(0,11 - offset,0)
        elseif noteType == 2 then
            fallNote.NoteWeld.Part0 = up1.Note
            fallNote.NoteWeld.Parent = up1.Note
            fallNote.Note.Color = Color3.fromRGB(18,250,5)
            fallNote.NoteWeld.C0 = CFrame.new(0,11 - offset,0)
        elseif noteType == 3 then
            fallNote.NoteWeld.Part0 = right1.Note
            fallNote.NoteWeld.Parent = right1.Note
            fallNote.Note.Color = Color3.fromRGB(249,57,63)
            fallNote.NoteWeld.C0 = CFrame.new(0,11 - offset,0)
        elseif noteType == 4 then
            fallNote.NoteWeld.Part0 = left2.Note
            fallNote.NoteWeld.Parent = left2.Note
            fallNote.Note.Color = Color3.fromRGB(194,75,153)
            fallNote.NoteWeld.C0 = CFrame.new(0,11 - offset,0)
        elseif noteType == 5 then
            fallNote.NoteWeld.Part0 = down2.Note
            fallNote.NoteWeld.Parent = down2.Note
            fallNote.Note.Color = Color3.fromRGB(0,255,255)
            fallNote.NoteWeld.C0 = CFrame.new(0,11 - offset,0)
        elseif noteType == 6 then
            fallNote.NoteWeld.Part0 = up2.Note
            fallNote.NoteWeld.Parent = up2.Note
            fallNote.Note.Color = Color3.fromRGB(18,250,5)
            fallNote.NoteWeld.C0 = CFrame.new(0,11 - offset,0)
        elseif noteType == 7 then
            fallNote.NoteWeld.Part0 = right2.Note
            fallNote.NoteWeld.Parent = right2.Note
            fallNote.Note.Color = Color3.fromRGB(249,57,63)
            fallNote.NoteWeld.C0 = CFrame.new(0,11 - offset,0)
        end
    end
    task.spawn(function()
        local delta = 0
        while fallNote ~= nil do
            fallNote.NoteWeld.C0 = fallNote.NoteWeld.C0 - Vector3.new(0,scrollSpeed * (delta * 11),0)
            if fallNote.NoteWeld.C0.Y <= 0 then
                fallNote.Note:Destroy()
                break
            end
            delta = wait(.01)
        end
    end)
end

function note()
    task.spawn(function()
        for _,v in pairs(noteData) do
            task.spawn(function()
                wait((v[1]*0.001))
				local mustHit = v[4]
				if v[2] == 0 or v[2] == 1 or v[2] == 2 or v[2] == 3 or v[2] == 4 or v[2] == 5 or v[2] == 6 or v[2] == 7 then
				    noteDetect(v[2], v[3]*0.001, mustHit)
				end
            end)
        end
    end)
end

function runSong()
    songPreload:Play()
    task.spawn(function()
        for _,v in pairs(noteData) do
            task.spawn(function()
                local timeToWait = (v[1]*0.001) - (1 / scrollSpeed)
                local ti = wait(timeToWait)
				local mustHit = v[4]
				if v[2] == 0 or v[2] == 1 or v[2] == 2 or v[2] == 3 or v[2] == 4 or v[2] == 5 or v[2] == 6 or v[2] == 7 then
				    noteFall(v[2], v[3]*0.001, mustHit, ti - timeToWait)
				end
            end)
        end
    end)
    songPreload:Stop()
    songPreload:Destroy()
    song:Play()
    note()
end

runSong()

game:service("RunService").Heartbeat:Connect(function()
    timepassedg.Size = UDim2.new(song.TimePosition / song.TimeLength,0,1,0)
end)
INFO