local ReplicatedStorage = game:GetService("ReplicatedStorage") local TaskDelay = task.delay local Random = Random.new(os.clock() + math.random(1, 10000)) local RhythmModule = require( ReplicatedStorage.Modules.Charts.RhythmModule ) local CreateWaves = getupvalue(RhythmModule.BeginBeatmap, 55) local TimeWindow = getupvalue(CreateWaves, 13) local Setup = RhythmModule.Setup local OnInputBegan = getupvalue(Setup, 29) local OnInputEnded = getupvalue(Setup, 30) local EnumInput = Enum.UserInputType local EnumKey = Enum.KeyCode local FakeInput = table.freeze({ UserInputType = EnumInput.MouseButton1 }) local FakeInput2 = table.freeze({ UserInputType = EnumInput.MouseButton2 }) local FakeSpace = table.freeze({ UserInputType = EnumInput.Keyboard, KeyCode = EnumKey.Space }) local ClickWaitingForRelease = false local Assist = false local function EndInput(input) OnInputEnded(input) end local function DelayedRelease(input, delayTime) TaskDelay(delayTime, EndInput, input) end local function Space() OnInputBegan(FakeSpace, false) TaskDelay( Random:NextNumber(0.003, 0.004), EndInput, FakeSpace ) end local function Click() if ClickWaitingForRelease then Space() return end ClickWaitingForRelease = true OnInputBegan(FakeInput, false) TaskDelay( Random:NextNumber(0.003, 0.004), function() ClickWaitingForRelease = false EndInput(FakeInput) end ) end local function Hold(length) OnInputBegan(FakeInput2, false) TaskDelay( length, EndInput, FakeInput2 ) end ReplicatedStorage.Bindables.Rhythm.ModifierApplied.Event:Connect(function(mod) Assist = mod == "Assist" end) local old old = hookfunction( TimeWindow, newcclosure(function(dif, _, delayTime, noteData, ...) if noteData then local multiplier = Assist and 1.75 or 1 local perfectTiming = ( 0.063 - math.clamp(dif, 0, 10) * 0.00135 ) * multiplier -- Gaussian-ish random (-1 to 1, centered around 0) local randomFactor = ( Random:NextNumber() + Random:NextNumber() + Random:NextNumber() ) / 3 randomFactor = (randomFactor - 0.5) * 2 local offset = randomFactor * perfectTiming local wave = noteData.Wave if wave == "Hold" then TaskDelay( delayTime + offset, function() Hold(noteData.HoldLength) end ) elseif wave ~= "Dodge" and wave ~= "Trace" then TaskDelay(delayTime + offset, Click) end end return old(dif, _, delayTime, noteData, ...) end) )