Professional Documents
Culture Documents
Friday
Friday
shared.__urlcache = shared.__urlcache or {}
local function urlLoad(url)
local success, result
if shared.__urlcache[url] then
success, result = true, shared.__urlcache[url]
else
success, result = pcall(game.HttpGet, game, url)
end
shared.__urlcache[url] = result
return unpack(results, 2)
end
local UI = urlLoad("https://raw.githubusercontent.com/wally-rblx/LinoriaLib/main/
Library.lua")
local themeManager =
urlLoad("https://raw.githubusercontent.com/wally-rblx/LinoriaLib/main/addons/
ThemeManager.lua")
while true do
for _, obj in next, getgc(true) do
if type(obj) == 'table' then
if rawget(obj, 'GameUI') then
framework = obj;
elseif type(rawget(obj, 'Server')) == 'table' then
network = obj;
end
end
counter = counter + 1
if counter > 6 then
fail(string.format('Failed to load game dependencies. Details: %s, %s, %s',
type(framework), typeof(scrollHandler), type(network)))
end
wait(1)
end
-- firesignal implementation
-- hitchance rolling
local fireSignal, rollChance do
-- updated for script-ware or whatever
-- attempted to update for krnl
function rollChance()
-- if (//library.flags.autoPlayerMode == 'Manual') then
if Options.AutoplayerMode.Value == 'Manual' then
if (Options.SickBind:GetState()) then return 'Sick' end
if (Options.GoodBind:GetState()) then return 'Good' end
if (Options.OkayBind:GetState()) then return 'Ok' end
if (Options.BadBind:GetState()) then return 'Bad' end
local chances = {
{ 'Sick', Options.SickChance.Value },
{ 'Good', Options.GoodChance.Value },
{ 'Ok', Options.OkChance.Value },
{ 'Bad', Options.BadChance.Value },
{ 'Miss' , Options.MissChance.Value },
}
table.sort(chances, function(a, b)
return a[2] > b[2]
end)
local sum = 0;
for i = 1, #chances do
sum += chances[i][2]
end
if sum == 0 then
return chances[random:NextInteger(1, #chances)][1]
end
for i = 1, #chances do
weight = weight + chances[i][2]
return 'Sick'
end
end
-- autoplayer
local chanceValues do
chanceValues = {
Sick = 96,
Good = 92,
Ok = 87,
Bad = 75,
}
local keyCodeMap = {}
for _, enum in next, Enum.KeyCode:GetEnumItems() do
keyCodeMap[enum.Value] = enum
end
if shared._unload then
pcall(shared._unload)
end
function shared._unload()
if shared._id then
pcall(runService.UnbindFromRenderStep, runService, shared._id)
end
UI:Unload()
for i = 1, #shared.threads do
coroutine.close(shared.threads[i])
end
for i = 1, #shared.callbacks do
task.spawn(shared.callbacks[i])
end
end
shared.threads = {}
shared.callbacks = {}
shared._id = httpService:GenerateGUID(false)
local hitboxOffset = 0
do
local settings = framework.Settings;
local offset = type(settings) == 'table' and
settings.HitboxOffset;
local value = type(offset) == 'table' and offset.Value;
pressKey(keyCode, true)
pressKey(keyCode, false)
arrow.Marked = nil;
end)
end
end
end
end)
end
local ActivateUnlockables do
-- Note: I know you can do this with UserId but it only works if you run it
before opening the notes menu
-- My script should work no matter the order of which you run things :)
return loadStyle(...)
end
table.insert(shared.callbacks, function()
assert(pcall(setupvalue, obj, i, loadStyle))
end)
end
end
end
end
end
end
function ActivateUnlockables()
local idx = table.find(framework.SongsWhitelist, client.UserId)
if idx then return end
-- UpdateScore hook
do
while type(roundManager) ~= 'table' do
task.wait()
roundManager = network.Server.RoundManager
end
table.insert(shared.callbacks, function()
roundManager.UpdateScore = oldUpdateScore
end)
end
while true do
task.wait()
if Toggles.AutoClaimRings and Toggles.AutoClaimRings.Value then
local character = client.Character
local rootPart = character and
character:findFirstChild('HumanoidRootPart')
firetouchinterest(ring, rootPart, 0)
firetouchinterest(ring, rootPart, 1)
end
end
end
end
end)
table.insert(shared.callbacks, function()
pcall(task.cancel, thread)
end)
end
local SaveManager = {} do
SaveManager.Ignore = {}
SaveManager.Parser = {
Toggle = {
Save = function(idx, object)
return { type = 'Toggle', idx = idx, value = object.Value }
end,
Load = function(idx, data)
if Toggles[idx] then
Toggles[idx]:SetValue(data.value)
end
end,
},
Slider = {
Save = function(idx, object)
return { type = 'Slider', idx = idx, value = tostring(object.Value)
}
end,
Load = function(idx, data)
if Options[idx] then
Options[idx]:SetValue(data.value)
end
end,
},
Dropdown = {
Save = function(idx, object)
return { type = 'Dropdown', idx = idx, value = object.Value, mutli
= object.Multi }
end,
Load = function(idx, data)
if Options[idx] then
Options[idx]:SetValue(data.value)
end
end,
},
ColorPicker = {
Save = function(idx, object)
return { type = 'ColorPicker', idx = idx, value =
object.Value:ToHex() }
end,
Load = function(idx, data)
if Options[idx] then
Options[idx]:SetValueRGB(Color3.fromHex(data.value))
end
end,
},
KeyPicker = {
Save = function(idx, object)
return { type = 'KeyPicker', idx = idx, mode = object.Mode, key =
object.Value }
end,
Load = function(idx, data)
if Options[idx] then
Options[idx]:SetValue({ data.key, data.mode })
end
end,
}
}
function SaveManager:Save(name)
local fullPath = 'funky_friday_autoplayer/configs/' .. name .. '.json'
local data = {
version = 2,
objects = {}
}
writefile(fullPath, encoded)
return true
end
function SaveManager:Load(name)
local file = 'funky_friday_autoplayer/configs/' .. name .. '.json'
if not isfile(file) then return false, 'invalid file' end
return true
end
function SaveManager.Refresh()
local list = listfiles('funky_friday_autoplayer/configs')
local out = {}
for i = 1, #list do
local file = list[i]
if file:sub(-5) == '.json' then
-- i hate this but it has to be done ...
return out
end
function SaveManager:Delete(name)
local file = 'funky_friday_autoplayer/configs/' .. name .. '.json'
if not isfile(file) then return false, string.format('Config %q does not
exist', name) end
return true
end
function SaveManager:SetIgnoreIndexes(list)
for i = 1, #list do
table.insert(self.Ignore, list[i])
end
end
function SaveManager.Check()
local list = listfiles('funky_friday_autoplayer/configs')
Center = true,
Size = UDim2.fromOffset(550, 627),
})
local Tabs = {}
local Groups = {}
Tabs.Main = Window:AddTab('Main')
Tabs.Miscellaneous = Window:AddTab('Miscellaneous')
Groups.Autoplayer = Tabs.Main:AddLeftGroupbox('Autoplayer')
Groups.Autoplayer:AddToggle('Autoplayer', { Text =
'Autoplayer' }):AddKeyPicker('AutoplayerBind', { Default = 'End', NoUI = true,
SyncToggleState = true })
Groups.Autoplayer:AddDropdown('PressMode', {
Text = 'Input mode',
Compact = true,
Default = 'firesignal',
Values = { 'firesignal', 'virtual input' },
Tooltip = 'Input method used to press arrows.\n* firesignal: calls input
functions directly.\n* virtual input: emulates key presses. use if "firesignal"
does not work.',
})
Groups.HitTiming:AddLabel('Manual delay')
Groups.HitTiming:AddSlider('ReleaseDelay', { Text = 'Note delay', Min = 0,
Max = 500, Default = 20, Rounding = 0, Compact = true, Suffix = 'ms' })
Groups.HitTiming:AddSlider('HeldDelay', { Text = 'Held note delay', Min =
-20, Max = 100, Default = 0, Rounding = 0, Compact = true, Suffix = 'ms' })
Groups.HitTiming:AddLabel('Random delay')
Groups.HitTiming:AddSlider('NoteDelayMin', { Text = 'Min note delay', Min =
0, Max = 100, Default = 0, Rounding = 0, Compact = true, Suffix = 'ms' })
Groups.HitTiming:AddSlider('NoteDelayMax', { Text = 'Max note delay', Min =
0, Max = 500, Default = 20, Rounding = 0, Compact = true, Suffix = 'ms' })
Groups.Misc = Tabs.Main:AddRightGroupbox('Misc')
Groups.Misc:AddButton('Unlock developer notes', ActivateUnlockables)
Groups.Misc:AddToggle('AutoClaimRings', { Text = 'Auto claim rings' })
Groups.Keybinds = Tabs.Main:AddRightGroupbox('Keybinds')
Groups.Keybinds:AddLabel('Sick'):AddKeyPicker('SickBind', { Default = 'One',
NoUI = true })
Groups.Keybinds:AddLabel('Good'):AddKeyPicker('GoodBind', { Default = 'Two',
NoUI = true })
Groups.Keybinds:AddLabel('Ok'):AddKeyPicker('OkayBind', { Default = 'Three',
NoUI = true })
Groups.Keybinds:AddLabel('Bad'):AddKeyPicker('BadBind', { Default = 'Four',
NoUI = true })
Groups.Configs = Tabs.Miscellaneous:AddRightGroupbox('Configs')
Groups.Credits = Tabs.Miscellaneous:AddRightGroupbox('Credits')
Groups.Credits:AddLabel('<font color="#3da5ff">wally</font> - script')
Groups.Credits:AddLabel('<font color="#de6cff">Sezei</font> - contributor')
Groups.Credits:AddLabel('Inori - ui library')
Groups.Credits:AddLabel('Jan - old ui library')
Groups.Misc = Tabs.Miscellaneous:AddRightGroupbox('Miscellaneous')
Groups.Misc:AddLabel(metadata.message or 'no message found!', true)
Groups.Misc:AddDivider()
Groups.Misc:AddButton('Unload script', function() pcall(shared._unload) end)
Groups.Misc:AddButton('Copy discord', function()
if pcall(setclipboard, "https://wally.cool/discord") then
UI:Notify('Successfully copied discord link to your clipboard!', 5)
end
end)
UI.ToggleKeybind = Options.MenuToggle
Groups.Configs:AddDivider()
Groups.Configs:AddButton('Load', function()
local name = Options.ConfigList.Value
local success, err = SaveManager:Load(name)
if not success then
return UI:Notify(tostring(err), 5)
end
task.defer(SaveManager.Refresh)
task.defer(SaveManager.Check)
else
Groups.Configs:AddLabel('Your exploit is missing file functions so you are
unable to use configs.', true)
--UI:Notify('Failed to create configs tab due to your exploit missing certain
file functions.', 2)
end
-- Themes
do
local latestThemeIndex = 0
for i, theme in next, themeManager.BuiltInThemes do
if theme[1] > latestThemeIndex then
latestThemeIndex = theme[1]
end
end
latestThemeIndex = latestThemeIndex + 1
themeManager:SetLibrary(UI)
themeManager:SetFolder('funky_friday_autoplayer')
themeManager:ApplyToGroupbox(Tabs.Miscellaneous:AddLeftGroupbox('Themes'))
SaveManager:SetIgnoreIndexes({
"BackgroundColor", "MainColor", "AccentColor", "OutlineColor", "FontColor",
-- themes
"ThemeManager_ThemeList", 'ThemeManager_CustomThemeList',
'ThemeManager_CustomThemeName', -- themes
})
end