--made by wortexios
--im not affiliated with velocity
local TweenService = game:GetService("TweenService")
local UserInputService = game:GetService("UserInputService")
local Players = game:GetService("Players")
local isMobile = UserInputService.TouchEnabled and not UserInputService.KeyboardEnabled
local funScripts = {
{ Name = "Infinite Yield FE.lua",
src = [[loadstring(game:HttpGet("https://raw.githubusercontent.com/EdgeIY/infiniteyield/master/source"))()]] },
{ Name = "Sirius.lua",
src = [[loadstring(game:HttpGet('https://sirius.menu/sirius'))()]] },
}
local favScripts = {
{ Name = "Dark Dex.lua",
src = [[loadstring(game:HttpGet("https://raw.githubusercontent.com/infyiff/backup/main/dex.lua"))()]] },
{ Name = "Hydroxide.lua",
src = [[
local owner = "Upbolt"
local branch = "revision"
local function webImport(file)
return loadstring(game:HttpGetAsync(
("https://raw.githubusercontent.com/%s/Hydroxide/%s/%s.lua"):format(owner, branch, file)
), file..".lua")()
end
webImport("init")
webImport("ui/main")
]] },
}
local FOLDER = "Sodium"
local TABS_FOLDER = "Sodium/Tabs"
local LOGS_FOLDER = "Sodium/SavedLogs"
if not isfolder(FOLDER) then makefolder(FOLDER) end
if not isfolder(TABS_FOLDER) then makefolder(TABS_FOLDER) end
if not isfolder(LOGS_FOLDER) then makefolder(LOGS_FOLDER) end
local function saveTabToDisk(name, code)
local safeName = name:gsub("[/\\:*?\"<>|]", "_")
writefile(TABS_FOLDER .. "/" .. safeName, code or "")
end
local function loadTabFromDisk(name)
local safeName = name:gsub("[/\\:*?\"<>|]", "_")
local path = TABS_FOLDER .. "/" .. safeName
if isfile(path) then return readfile(path) end
return nil
end
local W = isMobile and 620 or 920
local H = isMobile and 420 or 620
local FS = isMobile and 11 or 13
local ScreenGui = Instance.new("ScreenGui")
ScreenGui.ZIndexBehavior = Enum.ZIndexBehavior.Sibling
ScreenGui.Parent = gethui()
local Frame = Instance.new("CanvasGroup")
Frame.AnchorPoint = Vector2.new(0.5, 0.5)
Frame.Name = "Frame"
Frame.Position = UDim2.new(0.5, 0, 0.5, 0)
Frame.Size = UDim2.fromOffset(W, H)
Frame.BorderSizePixel = 0
Frame.BackgroundColor3 = Color3.fromRGB(8, 8, 8)
Frame.Parent = ScreenGui
local UIShadow = Instance.new("UIShadow")
UIShadow.Offset = UDim2.fromOffset(2, 2)
UIShadow.Transparency = 0.28
UIShadow.BlurRadius = UDim.new(0, 3)
UIShadow.Parent = Frame
local TOPBAR_H = isMobile and 28 or 35
local TopBar = Instance.new("Frame")
TopBar.AnchorPoint = Vector2.new(0.5, 0)
TopBar.Name = "TopBar"
TopBar.Position = UDim2.new(0.5, 0, 0, 0)
TopBar.Size = UDim2.fromOffset(W, TOPBAR_H)
TopBar.BorderSizePixel = 0
TopBar.BackgroundColor3 = Color3.fromRGB(8, 8, 8)
TopBar.Parent = Frame
local TopBarStroke = Instance.new("UIStroke")
TopBarStroke.Color = Color3.fromRGB(25, 25, 25)
TopBarStroke.Parent = TopBar
local VeloLogo = Instance.new("ImageLabel")
VeloLogo.Name = "VeloLogo"
VeloLogo.AnchorPoint = Vector2.new(0, 0.5)
VeloLogo.Image = "rbxassetid://111116614471209"
VeloLogo.BackgroundTransparency = 1
VeloLogo.Position = UDim2.new(0.008, 0, 0.5, 0)
VeloLogo.Size = UDim2.fromOffset(isMobile and 18 or 24, isMobile and 18 or 24)
VeloLogo.ImageColor3 = Color3.fromRGB(179, 179, 179)
VeloLogo.Parent = TopBar
local VersionLabel = Instance.new("TextLabel")
VersionLabel.TextWrapped = true
VersionLabel.TextColor3 = Color3.fromRGB(127, 127, 127)
VersionLabel.Text = "Sodium 1.2.9b"
VersionLabel.Name = "Version"
VersionLabel.Size = UDim2.fromOffset(160, 16)
VersionLabel.AnchorPoint = Vector2.new(0.5, 0.5)
VersionLabel.Position = UDim2.new(0.5, 0, 0.5, 0)
VersionLabel.BackgroundTransparency = 1
VersionLabel.Font = Enum.Font.SourceSansSemibold
VersionLabel.TextSize = FS
VersionLabel.Parent = TopBar
local ButtonsContainer = Instance.new("Frame")
ButtonsContainer.AnchorPoint = Vector2.new(1, 0)
ButtonsContainer.BackgroundTransparency = 1
ButtonsContainer.Position = UDim2.new(1, 0, 0, 0)
ButtonsContainer.Name = "ButtonsContainer"
ButtonsContainer.Size = UDim2.fromOffset(135, TOPBAR_H)
ButtonsContainer.Parent = TopBar
local BCLayout = Instance.new("UIListLayout")
BCLayout.FillDirection = Enum.FillDirection.Horizontal
BCLayout.HorizontalAlignment = Enum.HorizontalAlignment.Right
BCLayout.SortOrder = Enum.SortOrder.LayoutOrder
BCLayout.Parent = ButtonsContainer
local function makeWinBtn(name, imgId, order)
local btn = Instance.new("ImageButton")
btn.Name = name
btn.AutoButtonColor = false
btn.AnchorPoint = Vector2.new(1, 0)
btn.BackgroundTransparency = 1
btn.Size = UDim2.fromOffset(45, TOPBAR_H)
btn.BorderSizePixel = 0
btn.BackgroundColor3 = (name == "Exit") and Color3.fromRGB(232, 17, 35) or Color3.fromRGB(57, 57, 57)
btn.LayoutOrder = order
btn.Parent = ButtonsContainer
local ico = Instance.new("ImageLabel")
ico.ScaleType = Enum.ScaleType.Fit
ico.Name = "ico"
ico.AnchorPoint = Vector2.new(0.5, 0.5)
ico.Image = imgId
ico.BackgroundTransparency = 1
ico.Position = UDim2.new(0.5, 0, 0.5, 0)
ico.Size = UDim2.fromOffset(19, 19)
ico.Parent = btn
return btn
end
local Exit = makeWinBtn("Exit", "rbxassetid://104385908921328", 1)
local Maximize = makeWinBtn("Maximize", "rbxassetid://110549229595156", 2)
local Minimize = makeWinBtn("Minimize", "rbxassetid://88396938293530", 3)
for _, btn in ipairs({Exit, Maximize, Minimize}) do
btn.MouseEnter:Connect(function() btn.BackgroundTransparency = 0 end)
btn.MouseLeave:Connect(function() btn.BackgroundTransparency = 1 end)
end
local isMinimized = false
local isMaximized = false
local savedSize = Frame.Size
local savedPos = Frame.Position
local minimizedBar = Instance.new("Frame")
minimizedBar.Name = "MinimizedBar"
minimizedBar.AnchorPoint = Vector2.new(0.5, 1)
minimizedBar.Position = UDim2.new(0.5, 0, 1, -8)
minimizedBar.Size = UDim2.fromOffset(W, 4)
minimizedBar.BackgroundColor3 = Color3.fromRGB(92, 93, 94)
minimizedBar.BorderSizePixel = 0
minimizedBar.Visible = false
minimizedBar.ZIndex = 20
minimizedBar.Parent = TopBar
local MinBarCorner = Instance.new("UICorner")
MinBarCorner.CornerRadius = UDim.new(0, 2)
MinBarCorner.Parent = minimizedBar
Exit.MouseButton1Click:Connect(function()
for _, v in ipairs(listfiles(TABS_FOLDER)) do
local name = v:match("[^/\\]+$")
if name then
local code = curSel and curSel.Name == name and curSel.CodeBox.Text or readfile(v)
writefile(TABS_FOLDER .. "/" .. name, code)
end
end
ScreenGui:Destroy()
end)
Minimize.MouseButton1Click:Connect(function()
isMinimized = not isMinimized
if isMinimized then
Frame.Size = UDim2.fromOffset(W, TOPBAR_H)
minimizedBar.Visible = true
Minimize.ico.Image = "rbxassetid://88396938293530"
else
Frame.Size = isMaximized and UDim2.fromScale(1, 1) or savedSize
minimizedBar.Visible = false
end
end)
Maximize.MouseButton1Click:Connect(function()
if isMinimized then return end
isMaximized = not isMaximized
if isMaximized then
savedSize = Frame.Size
savedPos = Frame.Position
Frame.Size = UDim2.fromScale(1, 1)
Frame.Position = UDim2.fromOffset(0, 0)
Frame.AnchorPoint = Vector2.new(0, 0)
else
Frame.AnchorPoint = Vector2.new(0.5, 0.5)
Frame.Size = savedSize
Frame.Position = savedPos
end
end)
local EXPL_W = isMobile and 200 or 310
local SearchExplorer = Instance.new("Frame")
SearchExplorer.AnchorPoint = Vector2.new(0.5, 0)
SearchExplorer.Name = "SearchExplorer"
SearchExplorer.Position = UDim2.new(0.168, -1, 0.056, 0)
SearchExplorer.Size = UDim2.fromOffset(EXPL_W, isMobile and 30 or 41)
SearchExplorer.BorderSizePixel = 0
SearchExplorer.BackgroundColor3 = Color3.fromRGB(8, 8, 8)
SearchExplorer.Parent = Frame
local SEStroke = Instance.new("UIStroke")
SEStroke.Color = Color3.fromRGB(25, 25, 25)
SEStroke.Parent = SearchExplorer
local SearchIco = Instance.new("ImageLabel")
SearchIco.Name = "SearchIco"
SearchIco.AnchorPoint = Vector2.new(0, 0.5)
SearchIco.Image = "rbxassetid://122086195900803"
SearchIco.BackgroundTransparency = 1
SearchIco.Position = UDim2.new(0.021, 0, 0.5, 0)
SearchIco.Size = UDim2.fromOffset(isMobile and 16 or 24, isMobile and 16 or 24)
SearchIco.Parent = SearchExplorer
local SearchInp = Instance.new("TextBox")
SearchInp.AnchorPoint = Vector2.new(0, 0.5)
SearchInp.PlaceholderColor3 = Color3.fromRGB(72, 72, 72)
SearchInp.TextColor3 = Color3.fromRGB(180, 180, 180)
SearchInp.PlaceholderText = "Search scripts..."
SearchInp.TextSize = FS
SearchInp.Size = UDim2.fromOffset(EXPL_W - 50, 16)
SearchInp.Text = ""
SearchInp.Position = UDim2.new(0.126, 0, 0.5, 0)
SearchInp.CursorPosition = -1
SearchInp.BackgroundTransparency = 1
SearchInp.TextXAlignment = Enum.TextXAlignment.Left
SearchInp.ClearTextOnFocus = false
SearchInp.Font = Enum.Font.SourceSans
SearchInp.Parent = SearchExplorer
local Explorer = Instance.new("Frame")
Explorer.AnchorPoint = Vector2.new(0.5, 1)
Explorer.Name = "Explorer"
Explorer.Position = UDim2.new(0.168, -1, 1, 1)
Explorer.Size = UDim2.fromOffset(EXPL_W, H - TOPBAR_H - (isMobile and 30 or 41) - 1)
Explorer.BorderSizePixel = 0
Explorer.BackgroundColor3 = Color3.fromRGB(8, 8, 8)
Explorer.Parent = Frame
local ExplStroke = Instance.new("UIStroke")
ExplStroke.Color = Color3.fromRGB(25, 25, 25)
ExplStroke.Parent = Explorer
local ExplLayout = Instance.new("UIListLayout")
ExplLayout.SortOrder = Enum.SortOrder.LayoutOrder
ExplLayout.Parent = Explorer
local OUT_H = isMobile and 90 or 129
local Output = Instance.new("Frame")
Output.AnchorPoint = Vector2.new(0.5, 1)
Output.Name = "Output"
Output.Position = UDim2.new(0.6677, 0, 1, 0)
Output.Size = UDim2.fromOffset(W - EXPL_W, OUT_H)
Output.BorderSizePixel = 0
Output.BackgroundColor3 = Color3.fromRGB(8, 8, 8)
Output.Parent = Frame
local OutStroke = Instance.new("UIStroke")
OutStroke.Color = Color3.fromRGB(25, 25, 25)
OutStroke.Parent = Output
local OutTop = Instance.new("Frame")
OutTop.Name = "Top"
OutTop.BackgroundTransparency = 1
OutTop.Position = UDim2.new(0, 0, 0.05, 0)
OutTop.Size = UDim2.fromOffset(W - EXPL_W - 10, 26)
OutTop.Parent = Output
local OutHeader = Instance.new("TextLabel")
OutHeader.TextWrapped = true
OutHeader.Name = "header"
OutHeader.TextColor3 = Color3.fromRGB(180, 180, 180)
OutHeader.Text = "Output"
OutHeader.Size = UDim2.fromOffset(123, 18)
OutHeader.Position = UDim2.new(0.02, 0, 0.5, 0)
OutHeader.AnchorPoint = Vector2.new(0, 0.5)
OutHeader.BackgroundTransparency = 1
OutHeader.TextXAlignment = Enum.TextXAlignment.Left
OutHeader.Font = Enum.Font.SourceSansSemibold
OutHeader.TextSize = FS + 1
OutHeader.Parent = OutTop
local OutButtons = Instance.new("Frame")
OutButtons.AnchorPoint = Vector2.new(1, 0)
OutButtons.BackgroundTransparency = 1
OutButtons.Position = UDim2.new(0.98, 0, 0, 0)
OutButtons.Name = "Buttons"
OutButtons.Size = UDim2.fromOffset(247, 26)
OutButtons.Parent = OutTop
local OBLayout = Instance.new("UIListLayout")
OBLayout.VerticalAlignment = Enum.VerticalAlignment.Center
OBLayout.FillDirection = Enum.FillDirection.Horizontal
OBLayout.HorizontalAlignment = Enum.HorizontalAlignment.Right
OBLayout.Padding = UDim.new(0, 10)
OBLayout.SortOrder = Enum.SortOrder.LayoutOrder
OBLayout.Parent = OutButtons
local function makeOutBtn(name, imgId, order)
local btn = Instance.new("ImageButton")
btn.ImageColor3 = Color3.fromRGB(124, 124, 124)
btn.Image = imgId
btn.BackgroundTransparency = 1
btn.Name = name
btn.Size = UDim2.fromOffset(20, 20)
btn.LayoutOrder = order
btn.Parent = OutButtons
return btn
end
local ClearOut = makeOutBtn("Clear", "rbxassetid://100367491115342", 4)
local CopyOut = makeOutBtn("Copy", "rbxassetid://86878545872893", 3)
local SaveOut = makeOutBtn("Save", "rbxassetid://87857444303979", 2)
local SettingsOut = makeOutBtn("Settings", "rbxassetid://111467744253591", 1)
local ContainerOut = Instance.new("ScrollingFrame")
ContainerOut.Active = true
ContainerOut.AnchorPoint = Vector2.new(0.5, 1)
ContainerOut.BorderSizePixel = 0
ContainerOut.Size = UDim2.fromOffset(W - EXPL_W - 20, OUT_H - 36)
ContainerOut.ScrollBarImageColor3 = Color3.fromRGB(57, 57, 57)
ContainerOut.ScrollBarThickness = 8
ContainerOut.CanvasSize = UDim2.fromOffset(0, 0)
ContainerOut.AutomaticCanvasSize = Enum.AutomaticSize.Y
ContainerOut.Name = "Container"
ContainerOut.BackgroundTransparency = 1
ContainerOut.Position = UDim2.new(0.5095, 0, 1, 0)
ContainerOut.Parent = Output
local COLayout = Instance.new("UIListLayout")
COLayout.SortOrder = Enum.SortOrder.LayoutOrder
COLayout.Parent = ContainerOut
local MAIN_BTN_H = isMobile and 30 or 39
local MainButtons = Instance.new("Frame")
MainButtons.AnchorPoint = Vector2.new(0.5, 1)
MainButtons.Name = "MainButtons"
MainButtons.Position = UDim2.new(0.6677, 0, 0.792, 0)
MainButtons.Size = UDim2.fromOffset(W - EXPL_W, MAIN_BTN_H)
MainButtons.BorderSizePixel = 0
MainButtons.BackgroundColor3 = Color3.fromRGB(8, 8, 8)
MainButtons.Parent = Frame
local MBStroke = Instance.new("UIStroke")
MBStroke.Color = Color3.fromRGB(25, 25, 25)
MBStroke.Parent = MainButtons
local LeftSide = Instance.new("Frame")
LeftSide.BackgroundTransparency = 1
LeftSide.Name = "LeftSideContainer"
LeftSide.Size = UDim2.fromOffset(isMobile and 330 or 452, MAIN_BTN_H)
LeftSide.Parent = MainButtons
local LSLayout = Instance.new("UIListLayout")
LSLayout.FillDirection = Enum.FillDirection.Horizontal
LSLayout.SortOrder = Enum.SortOrder.LayoutOrder
LSLayout.Parent = LeftSide
local function makeEditorBtn(name, imgId, labelText, w, order, parent)
local btn = Instance.new("ImageButton")
btn.BackgroundTransparency = 1
btn.Name = name
btn.Size = UDim2.fromOffset(w, MAIN_BTN_H)
btn.LayoutOrder = order
btn.Parent = parent
local ico = Instance.new("ImageLabel")
ico.ImageColor3 = Color3.fromRGB(124, 124, 124)
ico.Name = "Ico"
ico.AnchorPoint = Vector2.new(0, 0.5)
ico.Image = imgId
ico.BackgroundTransparency = 1
ico.Position = UDim2.new(0.14, 0, 0.5, 0)
ico.Size = UDim2.fromOffset(17, 17)
ico.Parent = btn
local lbl = Instance.new("TextLabel")
lbl.TextWrapped = true
lbl.Name = "Title"
lbl.TextColor3 = Color3.fromRGB(127, 127, 127)
lbl.Text = labelText
lbl.Size = UDim2.fromOffset(name == "Execute" and 57 or 51, 20)
lbl.Position = UDim2.new(name == "Execute" and 0.362 or 0.437, 0, 0.5, 0)
lbl.AnchorPoint = Vector2.new(0, 0.5)
lbl.BackgroundTransparency = 1
lbl.TextXAlignment = Enum.TextXAlignment.Left
lbl.Font = Enum.Font.SourceSansSemibold
lbl.TextSize = FS
lbl.TextScaled = true
lbl.Parent = btn
return btn
end
local Execute = makeEditorBtn("Execute", "rbxassetid://108000317098010", "Execute", isMobile and 75 or 95, 1, LeftSide)
local Clear = makeEditorBtn("Clear", "rbxassetid://118287937709636", "Clear", isMobile and 60 or 80, 2, LeftSide)
local Open = makeEditorBtn("Open", "rbxassetid://95730417142188", "Open", isMobile and 60 or 80, 3, LeftSide)
local Save = makeEditorBtn("Save", "rbxassetid://87857444303979", "Save", isMobile and 60 or 80, 4, LeftSide)
local Inject = makeEditorBtn("Inject", "rbxassetid://126199288541761", "Inject", isMobile and 60 or 80, 1, MainButtons)
Inject.AnchorPoint = Vector2.new(1, 0)
Inject.Position = UDim2.new(0.98, 0, 0, 0)
Inject.LayoutOrder = 0
local TAB_H = isMobile and 30 or 39
local TabsContainer = Instance.new("Frame")
TabsContainer.AnchorPoint = Vector2.new(1, 0)
TabsContainer.BackgroundTransparency = 1
TabsContainer.Position = UDim2.new(1, 0, 0.059, 0)
TabsContainer.Name = "TabsContainer"
TabsContainer.Size = UDim2.fromOffset(W - EXPL_W, TAB_H)
TabsContainer.Parent = Frame
local TabScrollFrame = Instance.new("ScrollingFrame")
TabScrollFrame.Active = true
TabScrollFrame.BorderSizePixel = 0
TabScrollFrame.CanvasSize = UDim2.fromOffset(0, 0)
TabScrollFrame.AutomaticCanvasSize = Enum.AutomaticSize.X
TabScrollFrame.ScrollBarImageColor3 = Color3.fromRGB(57, 57, 57)
TabScrollFrame.ScrollBarThickness = 8
TabScrollFrame.Name = "Container"
TabScrollFrame.BackgroundTransparency = 1
TabScrollFrame.Size = UDim2.fromOffset(W - EXPL_W - 37, TAB_H)
TabScrollFrame.ClipsDescendants = true
TabScrollFrame.Parent = TabsContainer
local TSFLayout = Instance.new("UIListLayout")
TSFLayout.FillDirection = Enum.FillDirection.Horizontal
TSFLayout.SortOrder = Enum.SortOrder.LayoutOrder
TSFLayout.Parent = TabScrollFrame
local NewTab = Instance.new("ImageButton")
NewTab.ImageColor3 = Color3.fromRGB(96, 97, 99)
NewTab.Name = "NewTab"
NewTab.AnchorPoint = Vector2.new(0.5, 0.5)
NewTab.Image = "rbxassetid://137135197793108"
NewTab.BackgroundTransparency = 1
NewTab.Position = UDim2.new(0.962, 0, 0.5, 0)
NewTab.Size = UDim2.fromOffset(23, 23)
NewTab.Parent = TabsContainer
local EDITOR_H = H - TOPBAR_H - TAB_H - MAIN_BTN_H - OUT_H
local EditorFrame = Instance.new("Frame")
EditorFrame.AnchorPoint = Vector2.new(1, 1)
EditorFrame.Name = "EditorFrame"
EditorFrame.Position = UDim2.new(1, 0, 0.728, 0)
EditorFrame.Size = UDim2.fromOffset(W - EXPL_W, EDITOR_H)
EditorFrame.BorderSizePixel = 0
EditorFrame.BackgroundColor3 = Color3.fromRGB(10, 10, 10)
EditorFrame.Parent = Frame
local OpenFile = Instance.new("Frame")
OpenFile.AnchorPoint = Vector2.new(0.5, 0.5)
OpenFile.Name = "OpenFile"
OpenFile.Position = UDim2.new(0.5, 0, 0.5, 0)
OpenFile.Size = UDim2.fromOffset(392, 120)
OpenFile.ZIndex = 15
OpenFile.BorderSizePixel = 0
OpenFile.BackgroundColor3 = Color3.fromRGB(8, 8, 8)
OpenFile.Visible = false
OpenFile.Parent = ScreenGui
local OFStroke = Instance.new("UIStroke")
OFStroke.Color = Color3.fromRGB(25, 25, 25)
OFStroke.Parent = OpenFile
local OFShadow = Instance.new("UIShadow")
OFShadow.Offset = UDim2.fromOffset(2, 2)
OFShadow.Transparency = 0.28
OFShadow.BlurRadius = UDim.new(0, 3)
OFShadow.Parent = OpenFile
local OFHatch = Instance.new("TextLabel")
OFHatch.TextWrapped = true
OFHatch.TextColor3 = Color3.fromRGB(127, 127, 127)
OFHatch.Text = "Enter File Path"
OFHatch.Size = UDim2.fromOffset(141, 23)
OFHatch.AnchorPoint = Vector2.new(0.5, 0.5)
OFHatch.Position = UDim2.new(0.5, 0, 0.217, 0)
OFHatch.BackgroundTransparency = 1
OFHatch.Font = Enum.Font.SourceSans
OFHatch.TextSize = 14
OFHatch.TextScaled = true
OFHatch.Parent = OpenFile
local OFInpBox = Instance.new("Frame")
OFInpBox.AnchorPoint = Vector2.new(0.5, 0.5)
OFInpBox.Name = "inpbox"
OFInpBox.Position = UDim2.new(0.5, 0, 0.65, 0)
OFInpBox.Size = UDim2.fromOffset(306, 36)
OFInpBox.BackgroundColor3 = Color3.fromRGB(10, 10, 10)
OFInpBox.Parent = OpenFile
local OFIStroke = Instance.new("UIStroke")
OFIStroke.Color = Color3.fromRGB(25, 25, 25)
OFIStroke.Parent = OFInpBox
local OFPrefix = Instance.new("TextLabel")
OFPrefix.TextWrapped = true
OFPrefix.TextColor3 = Color3.fromRGB(127, 127, 127)
OFPrefix.Text = "Workspace/"
OFPrefix.Size = UDim2.fromOffset(81, 20)
OFPrefix.Position = UDim2.new(0.186, 0, 0.5, 0)
OFPrefix.AnchorPoint = Vector2.new(0.5, 0.5)
OFPrefix.BackgroundTransparency = 1
OFPrefix.TextXAlignment = Enum.TextXAlignment.Left
OFPrefix.TextScaled = true
OFPrefix.Font = Enum.Font.SourceSans
OFPrefix.Parent = OFInpBox
local FileInput = Instance.new("TextBox")
FileInput.AnchorPoint = Vector2.new(0.5, 0.5)
FileInput.PlaceholderColor3 = Color3.fromRGB(127, 127, 127)
FileInput.PlaceholderText = "..."
FileInput.TextSize = 14
FileInput.Size = UDim2.fromOffset(194, 20)
FileInput.TextColor3 = Color3.fromRGB(208, 208, 208)
FileInput.Text = ""
FileInput.Name = "FileInput"
FileInput.Position = UDim2.new(0.636, 0, 0.5, 0)
FileInput.BackgroundTransparency = 1
FileInput.TextXAlignment = Enum.TextXAlignment.Left
FileInput.ClearTextOnFocus = false
FileInput.TextScaled = true
FileInput.Font = Enum.Font.SourceSans
FileInput.Parent = OFInpBox
do
local dragging, dragStart, startPos
TopBar.InputBegan:Connect(function(input)
if input.UserInputType == Enum.UserInputType.MouseButton1
or input.UserInputType == Enum.UserInputType.Touch then
dragging = true
dragStart = input.Position
startPos = Frame.Position
input.Changed:Connect(function()
if input.UserInputState == Enum.UserInputState.End then dragging = false end
end)
end
end)
TopBar.InputChanged:Connect(function(input)
if dragging and (input.UserInputType == Enum.UserInputType.MouseMovement
or input.UserInputType == Enum.UserInputType.Touch) then
local d = input.Position - dragStart
Frame.Position = UDim2.new(startPos.X.Scale, startPos.X.Offset + d.X,
startPos.Y.Scale, startPos.Y.Offset + d.Y)
end
end)
end
for _, btn in ipairs({Execute, Clear, Open, Save, Inject}) do
local isExec = btn.Name == "Execute"
btn.MouseEnter:Connect(function()
btn.Title.TextColor3 = Color3.fromRGB(203, 203, 203)
btn.Ico.ImageColor3 = Color3.fromRGB(203, 203, 203)
btn.Title:TweenPosition(
isExec and UDim2.new(0.362,0,0.42,0) or UDim2.new(0.437,0,0.42,0),
Enum.EasingDirection.Out, Enum.EasingStyle.Sine, 0.1, true)
btn.Ico:TweenPosition(UDim2.new(0.14,0,0.42,0),
Enum.EasingDirection.Out, Enum.EasingStyle.Sine, 0.1, true)
end)
btn.MouseLeave:Connect(function()
btn.Title.TextColor3 = Color3.fromRGB(127, 127, 127)
btn.Ico.ImageColor3 = Color3.fromRGB(124, 124, 124)
btn.Title:TweenPosition(
isExec and UDim2.new(0.362,0,0.5,0) or UDim2.new(0.437,0,0.5,0),
Enum.EasingDirection.Out, Enum.EasingStyle.Sine, 0.1, true)
btn.Ico:TweenPosition(UDim2.new(0.14,0,0.5,0),
Enum.EasingDirection.Out, Enum.EasingStyle.Sine, 0.1, true)
end)
end
for _, btn in ipairs({ClearOut, CopyOut, SaveOut, SettingsOut, NewTab}) do
btn.MouseEnter:Connect(function() btn.ImageColor3 = Color3.fromRGB(203, 203, 203) end)
btn.MouseLeave:Connect(function() btn.ImageColor3 = Color3.fromRGB(124, 124, 124) end)
end
local logOrder = 0
local function AddLog(txt)
logOrder += 1
local ts = os.date("!%H:%M:%S")
local lbl = Instance.new("TextLabel")
lbl.RichText = true
lbl.Name = "Log"
lbl.TextColor3 = Color3.fromRGB(255, 255, 255)
lbl.Text = ('[%s] - %s'):format(ts, txt)
lbl.Size = UDim2.fromOffset(W - EXPL_W - 30, 17)
lbl.BorderSizePixel = 0
lbl.TextSize = FS
lbl.BackgroundTransparency = 1
lbl.TextXAlignment = Enum.TextXAlignment.Left
lbl.TextWrapped = true
lbl.Font = Enum.Font.Code
lbl.TextScaled = true
lbl.LayoutOrder = logOrder
lbl.Parent = ContainerOut
task.defer(function()
ContainerOut.CanvasPosition = Vector2.new(0, math.huge)
end)
end
local keywords = {
["local"]=true,["function"]=true,["end"]=true,["if"]=true,["then"]=true,
["else"]=true,["elseif"]=true,["return"]=true,["for"]=true,["while"]=true,
["do"]=true,["repeat"]=true,["until"]=true,["true"]=true,["false"]=true,
["nil"]=true,["and"]=true,["or"]=true,["not"]=true,["break"]=true,
["in"]=true,["continue"]=true,
}
local hlColors = {
keyword="#d62279", string="#54e89c", comment="#666666",
number="#d6ac22", default="#c2c2c2",
}
local typeColors = {
["function"]="#b688f2",["table"]="#b688f2",["userdata"]="#2b91af",
["number"]="#d6ac22",["string"]="#54e89c",["boolean"]="#d62279",["nil"]="#d62279",
}
local function esc(s)
return s:gsub("&","&"):gsub("<","<"):gsub(">",">")
end
local function wordColor(w)
local ok, val = pcall(function() return getfenv()[w] end)
if ok and val ~= nil then return typeColors[typeof(val)] end
end
local function highlightLine(line)
local cs = line:find("%-%-")
local code, cmt = line, nil
if cs then code = line:sub(1,cs-1); cmt = line:sub(cs) end
local out = {}
local i, len = 1, #code
while i <= len do
local c = code:sub(i,i)
if c == '"' or c == "'" then
local q, j = c, i+1
while j <= len and code:sub(j,j) ~= q do
if code:sub(j,j) == "\\" then j += 1 end
j += 1
end
out[#out+1] = ('%s'):format(hlColors.string, esc(code:sub(i,math.min(j,len))))
i = j+1; continue
end
local word, sep = code:match("^([%w_]*)([^%w_]?)", i)
if word ~= "" then
local col = keywords[word] and hlColors.keyword
or (tonumber(word) and hlColors.number)
or wordColor(word)
or hlColors.default
out[#out+1] = ('%s'):format(col, esc(word))
i += #word
end
if sep ~= "" then out[#out+1] = esc(sep); i += 1
elseif word == "" then i += 1 end
end
if cmt then
out[#out+1] = ('%s'):format(hlColors.comment, esc(cmt))
end
return table.concat(out)
end
local curSel = nil
local function makeCodebox(sectName, src)
for _, v in ipairs(EditorFrame:GetChildren()) do v.Visible = false end
local Container = Instance.new("ScrollingFrame")
Container.Active = true
Container.AnchorPoint = Vector2.new(0, 1)
Container.BorderSizePixel = 0
Container.CanvasSize = UDim2.fromOffset(0, 0)
Container.ScrollBarImageColor3 = Color3.fromRGB(57, 57, 57)
Container.ScrollBarThickness = 14
Container.Name = sectName
Container.Size = UDim2.fromOffset(W - EXPL_W, EDITOR_H)
Container.Position = UDim2.new(0, 0, 1, 0)
Container.BackgroundTransparency = 1
Container.Parent = EditorFrame
local Cursor = Instance.new("Frame")
Cursor.Size = UDim2.fromOffset(2, 16)
Cursor.BackgroundColor3 = Color3.fromRGB(255, 255, 255)
Cursor.BorderSizePixel = 0
Cursor.ZIndex = 5
Cursor.Visible = false
Cursor.Parent = Container
TweenService:Create(Cursor, TweenInfo.new(0.5, Enum.EasingStyle.Sine, Enum.EasingDirection.In, -1, true, 0.01), {BackgroundTransparency=1}):Play()
local LineCount = Instance.new("TextLabel")
LineCount.Font = Enum.Font.Code
LineCount.TextColor3 = Color3.fromRGB(255, 255, 255)
LineCount.Text = "1"
LineCount.Name = "LineCount"
LineCount.Size = UDim2.fromOffset(26, 16)
LineCount.Position = UDim2.new(0.012, 0, 0, 0)
LineCount.BackgroundTransparency = 1
LineCount.RichText = true
LineCount.TextYAlignment = Enum.TextYAlignment.Top
LineCount.TextSize = 16
LineCount.Parent = Container
local CodeBox = Instance.new("TextBox")
CodeBox.MultiLine = true
CodeBox.CursorPosition = -1
CodeBox.ZIndex = 3
CodeBox.TextSize = 16
CodeBox.Size = UDim2.fromOffset(W - EXPL_W - 60, 16)
CodeBox.TextColor3 = Color3.fromRGB(255, 255, 255)
CodeBox.TextTransparency = 1
CodeBox.Text = src or ""
CodeBox.Name = "CodeBox"
CodeBox.Font = Enum.Font.Code
CodeBox.Position = UDim2.new(0.0895, 0, 0, 0)
CodeBox.BackgroundTransparency = 1
CodeBox.TextXAlignment = Enum.TextXAlignment.Left
CodeBox.TextWrapped = false
CodeBox.ClearTextOnFocus = false
CodeBox.TextYAlignment = Enum.TextYAlignment.Top
CodeBox.Parent = Container
local HighlightLabel = Instance.new("TextLabel")
HighlightLabel.ZIndex = 2
HighlightLabel.TextSize = 16
HighlightLabel.Size = UDim2.fromOffset(W - EXPL_W - 60, 16)
HighlightLabel.RichText = true
HighlightLabel.TextColor3 = Color3.fromRGB(255, 255, 255)
HighlightLabel.Text = ""
HighlightLabel.Name = "HighlightLabel"
HighlightLabel.Font = Enum.Font.Code
HighlightLabel.Position = CodeBox.Position
HighlightLabel.BackgroundTransparency = 1
HighlightLabel.TextXAlignment = Enum.TextXAlignment.Left
HighlightLabel.TextYAlignment = Enum.TextYAlignment.Top
HighlightLabel.TextWrapped = false
HighlightLabel.Parent = Container
local Measurer = Instance.new("TextLabel")
Measurer.Name = "Measurer"
Measurer.Visible = false
Measurer.AutomaticSize = Enum.AutomaticSize.X
Measurer.Size = UDim2.fromOffset(0, 16)
Measurer.TextSize = CodeBox.TextSize
Measurer.Font = CodeBox.Font
Measurer.Text = ""
Measurer.Parent = Container
local LineOutline = Instance.new("Frame")
LineOutline.Active = true
LineOutline.Name = "LineOutline"
LineOutline.BackgroundTransparency = 1
LineOutline.Position = UDim2.new(0.0895, 0, 0, 0)
LineOutline.Size = UDim2.fromOffset(W - EXPL_W - 60, 18)
LineOutline.Selectable = true
LineOutline.ZIndex = 1
LineOutline.Parent = Container
local LOStroke = Instance.new("UIStroke")
LOStroke.Color = Color3.fromRGB(40, 40, 40)
LOStroke.Thickness = 2
LOStroke.Parent = LineOutline
local function getLineNumber(text, cur)
if cur <= 0 then return 1 end
local _, n = text:sub(1, cur-1):gsub("\n","\n")
return n+1
end
local function getCurrentLineAndCol(text, cur)
if cur <= 0 then return 1, "" end
local before = text:sub(1, cur-1)
local lineStart, lineNum = 1, 1
for p in before:gmatch("()\n") do lineNum += 1; lineStart = p+1 end
return lineNum, before:sub(lineStart)
end
local function updateCursor()
local cur = CodeBox.CursorPosition
if cur == -1 then Cursor.Visible = false; return end
local lineNum, col = getCurrentLineAndCol(CodeBox.Text, cur)
Measurer.Text = col
Cursor.Position = UDim2.new(CodeBox.Position.X.Scale,
CodeBox.Position.X.Offset + Measurer.TextBounds.X,
0, (lineNum-1)*16)
Cursor.Visible = true
end
local function refresh()
local lines = {}
for line in (CodeBox.Text.."\n"):gmatch("(.-)\n") do
lines[#lines+1] = highlightLine(line)
end
HighlightLabel.Text = table.concat(lines, "\n")
end
local function updateSize()
local _, n = CodeBox.Text:gsub("\n","\n")
local h = (n+1)*16
CodeBox.Size = UDim2.fromOffset(CodeBox.Size.X.Offset, h)
HighlightLabel.Size = UDim2.fromOffset(HighlightLabel.Size.X.Offset, h)
LineCount.Size = UDim2.fromOffset(LineCount.Size.X.Offset, h)
Container.CanvasSize = UDim2.fromOffset(0, h)
end
local function updateLineCount()
local _, total = CodeBox.Text:gsub("\n","\n")
total += 1
local active = getLineNumber(CodeBox.Text, CodeBox.CursorPosition)
local nums = {}
for n = 1, total do
nums[n] = ('%d'):format(
n == active and "rgb(198,198,198)" or "rgb(133,133,133)", n)
end
LineCount.Text = table.concat(nums, "\n")
end
local function updateLineOutline()
local cur = CodeBox.CursorPosition
if cur == -1 then return end
local ln = getLineNumber(CodeBox.Text, cur)
LineOutline.Position = UDim2.new(LineOutline.Position.X.Scale,
LineOutline.Position.X.Offset, 0, (ln-1)*16-1)
end
local function autosave()
saveTabToDisk(sectName, CodeBox.Text)
end
CodeBox.Focused:Connect(function() Cursor.Visible = true; updateCursor() end)
CodeBox.FocusLost:Connect(function() Cursor.Visible = false; autosave() end)
CodeBox:GetPropertyChangedSignal("CursorPosition"):Connect(function()
updateCursor(); updateLineOutline(); updateLineCount()
end)
CodeBox:GetPropertyChangedSignal("Text"):Connect(function()
refresh(); updateCursor(); updateLineCount(); updateSize(); updateLineOutline()
end)
refresh(); updateLineCount(); updateSize(); updateLineOutline()
end
local lastTab = 0
local function makeTab(tabName, src)
for _, v in ipairs(TabScrollFrame:GetChildren()) do
if v:IsA("ImageButton") then
if v:FindFirstChild("Toggled") then v.Toggled.Visible = false end
v.BackgroundTransparency = 1
end
end
if EditorFrame:FindFirstChild(tabName) then
for _, v in ipairs(EditorFrame:GetChildren()) do v.Visible = false end
EditorFrame[tabName].Visible = true
curSel = EditorFrame[tabName]
for _, v in ipairs(TabScrollFrame:GetChildren()) do
if v:IsA("ImageButton") and v.Name == tabName then
if v:FindFirstChild("Toggled") then v.Toggled.Visible = true end
v.BackgroundTransparency = 0
end
end
return
end
local TabBtn = Instance.new("ImageButton")
TabBtn.Name = tabName
TabBtn.Size = UDim2.fromOffset(144, TAB_H + 2)
TabBtn.BackgroundColor3 = Color3.fromRGB(10, 10, 10)
TabBtn.BackgroundTransparency = 0
TabBtn.Parent = TabScrollFrame
local Toggled = Instance.new("Frame")
Toggled.Name = "Toggled"
Toggled.Size = UDim2.fromOffset(144, 2)
Toggled.BackgroundColor3 = Color3.fromRGB(92, 93, 94)
Toggled.Visible = true
Toggled.Parent = TabBtn
local TabIco = Instance.new("ImageLabel")
TabIco.ImageColor3 = Color3.fromRGB(169, 169, 169)
TabIco.ScaleType = Enum.ScaleType.Fit
TabIco.Name = "ico"
TabIco.AnchorPoint = Vector2.new(0.5, 0.5)
TabIco.Image = "rbxassetid://103251760765538"
TabIco.BackgroundTransparency = 1
TabIco.Position = UDim2.new(0.14, 0, 0.5, 0)
TabIco.Size = UDim2.fromOffset(13, 16)
TabIco.Parent = TabBtn
local CloseBtn = Instance.new("ImageButton")
CloseBtn.ImageColor3 = Color3.fromRGB(55, 55, 55)
CloseBtn.ScaleType = Enum.ScaleType.Fit
CloseBtn.Active = false
CloseBtn.Name = "CloseBtn"
CloseBtn.Size = UDim2.fromOffset(12, 12)
CloseBtn.AnchorPoint = Vector2.new(0.5, 0.5)
CloseBtn.Image = "rbxassetid://79010788760505"
CloseBtn.BackgroundTransparency = 1
CloseBtn.Position = UDim2.new(0.868, 0, 0.5, 0)
CloseBtn.Selectable = false
CloseBtn.Parent = TabBtn
local Title = Instance.new("TextLabel")
Title.TextWrapped = true
Title.Name = "Title"
Title.TextColor3 = Color3.fromRGB(208, 208, 208)
Title.Text = tabName
Title.Size = UDim2.fromOffset(76, 15)
Title.Position = UDim2.new(0.23, 0, 0.5, 0)
Title.AnchorPoint = Vector2.new(0, 0.5)
Title.BackgroundTransparency = 1
Title.TextXAlignment = Enum.TextXAlignment.Left
Title.TextScaled = true
Title.Font = Enum.Font.SourceSans
Title.TextTruncate = Enum.TextTruncate.AtEnd
Title.Parent = TabBtn
local diskSrc = loadTabFromDisk(tabName)
makeCodebox(tabName, diskSrc or src)
curSel = EditorFrame[tabName]
saveTabToDisk(tabName, diskSrc or src or "")
local lastClick = 0
TabBtn.MouseButton1Down:Connect(function()
local now = tick()
if now - lastClick < 0.35 then
if curSel ~= EditorFrame:FindFirstChild(TabBtn.Name) then lastClick = now; return end
local renameBox = Instance.new("TextBox")
renameBox.BackgroundColor3 = Color3.fromRGB(20, 20, 20)
renameBox.BorderSizePixel = 0
renameBox.Size = UDim2.fromOffset(76, 15)
renameBox.Position = Title.Position
renameBox.AnchorPoint = Title.AnchorPoint
renameBox.Text = Title.Text
renameBox.TextColor3 = Color3.fromRGB(255, 255, 255)
renameBox.TextSize = 13
renameBox.Font = Enum.Font.SourceSans
renameBox.ClearTextOnFocus = false
renameBox.ZIndex = 6
renameBox.Parent = TabBtn
renameBox:CaptureFocus()
renameBox.FocusLost:Connect(function()
local trimmed = renameBox.Text:match("^%s*(.-)%s*$")
if trimmed ~= "" then
if not trimmed:match("%.lua$") then trimmed ..= ".lua" end
local cb = EditorFrame:FindFirstChild(TabBtn.Name)
local oldName = TabBtn.Name
if cb then
local code = cb:FindFirstChild("CodeBox") and cb.CodeBox.Text or ""
saveTabToDisk(trimmed, code)
local oldSafe = oldName:gsub("[/\\:*?\"<>|]", "_")
local oldPath = TABS_FOLDER .. "/" .. oldSafe
if isfile(oldPath) then delfile(oldPath) end
cb.Name = trimmed
end
TabBtn.Name = trimmed
Title.Text = trimmed
AddLog('Renamed to "' .. trimmed .. '".')
end
renameBox:Destroy()
end)
end
lastClick = now
end)
TabBtn.MouseButton1Click:Connect(function()
for _, v in ipairs(EditorFrame:GetChildren()) do v.Visible = false end
for _, v in ipairs(TabScrollFrame:GetChildren()) do
if v:IsA("ImageButton") then
if v:FindFirstChild("Toggled") then v.Toggled.Visible = false end
v.BackgroundTransparency = 1
end
end
local target = EditorFrame:FindFirstChild(TabBtn.Name)
if target then target.Visible = true; curSel = target end
Toggled.Visible = true
TabBtn.BackgroundTransparency = 0
end)
CloseBtn.MouseButton1Click:Connect(function()
local cb = EditorFrame:FindFirstChild(TabBtn.Name)
if cb then
local code = cb:FindFirstChild("CodeBox") and cb.CodeBox.Text or ""
saveTabToDisk(TabBtn.Name, code)
cb:Destroy()
end
TabBtn:Destroy()
local remaining = {}
for _, v in ipairs(TabScrollFrame:GetChildren()) do
if v:IsA("ImageButton") then remaining[#remaining+1] = v end
end
if #remaining > 0 then
local first = remaining[1]
for _, v in ipairs(EditorFrame:GetChildren()) do v.Visible = false end
for _, v in ipairs(TabScrollFrame:GetChildren()) do
if v:IsA("ImageButton") then
if v:FindFirstChild("Toggled") then v.Toggled.Visible = false end
v.BackgroundTransparency = 1
end
end
local target = EditorFrame:FindFirstChild(first.Name)
if target then target.Visible = true; curSel = target end
if first:FindFirstChild("Toggled") then first.Toggled.Visible = true end
first.BackgroundTransparency = 0
else
curSel = nil
end
end)
CloseBtn.MouseEnter:Connect(function() CloseBtn.ImageColor3 = Color3.fromRGB(203, 203, 203) end)
CloseBtn.MouseLeave:Connect(function() CloseBtn.ImageColor3 = Color3.fromRGB(55, 55, 55) end)
end
NewTab.MouseButton1Click:Connect(function()
lastTab += 1
makeTab("New Tab " .. tostring(lastTab) .. ".lua")
end)
local ExplorerFuncs = {}
function ExplorerFuncs:AddHeader(sectName, order)
local el = Instance.new("Frame")
el.BackgroundTransparency = 1
el.Name = sectName
el.Size = UDim2.fromOffset(EXPL_W - 1, 45)
el.LayoutOrder = order
el.Parent = Explorer
local lbl = Instance.new("TextLabel")
lbl.TextWrapped = true
lbl.TextColor3 = Color3.fromRGB(127, 127, 127)
lbl.Text = sectName
lbl.Size = UDim2.fromOffset(EXPL_W - 50, 12)
lbl.Position = UDim2.new(0.061, 0, 0.5, 0)
lbl.AnchorPoint = Vector2.new(0, 0.5)
lbl.BackgroundTransparency = 1
lbl.TextXAlignment = Enum.TextXAlignment.Left
lbl.TextScaled = true
lbl.Font = Enum.Font.SourceSansSemibold
lbl.Parent = el
end
function ExplorerFuncs:AddScript(scriptName, imgId, src, order)
local el = Instance.new("Frame")
el.BackgroundTransparency = 1
el.Name = scriptName
el.Size = UDim2.fromOffset(EXPL_W - 1, 40)
el.LayoutOrder = order
el.Parent = Explorer
local Btn = Instance.new("ImageButton")
Btn.AutoButtonColor = false
Btn.AnchorPoint = Vector2.new(0.5, 0.5)
Btn.BackgroundTransparency = 1
Btn.Position = UDim2.new(0.511, 0, 0.5, 0)
Btn.Size = UDim2.fromOffset(EXPL_W - 35, 34)
Btn.BackgroundColor3 = Color3.fromRGB(21, 21, 21)
Btn.Parent = el
local BtnCorner = Instance.new("UICorner")
BtnCorner.CornerRadius = UDim.new(0, 6)
BtnCorner.Parent = Btn
local ico = Instance.new("ImageLabel")
ico.AnchorPoint = Vector2.new(0.5, 0.5)
ico.Image = imgId
ico.BackgroundTransparency = 1
ico.Position = UDim2.new(0.07, 0, 0.5, 0)
ico.Size = UDim2.fromOffset(23, 23)
ico.Parent = Btn
local lbl = Instance.new("TextLabel")
lbl.TextWrapped = true
lbl.TextColor3 = Color3.fromRGB(198, 198, 198)
lbl.Text = scriptName
lbl.Size = UDim2.fromOffset(EXPL_W - 80, 14)
lbl.Position = UDim2.new(0.141, 0, 0.5, 0)
lbl.AnchorPoint = Vector2.new(0, 0.5)
lbl.BackgroundTransparency = 1
lbl.TextXAlignment = Enum.TextXAlignment.Left
lbl.TextScaled = true
lbl.Font = Enum.Font.SourceSans
lbl.Parent = Btn
Btn.MouseEnter:Connect(function() Btn.BackgroundTransparency = 0 end)
Btn.MouseLeave:Connect(function() Btn.BackgroundTransparency = 1 end)
Btn.MouseButton1Down:Connect(function() makeTab(scriptName, src) end)
end
local function BuildExplorer()
for _, v in ipairs(Explorer:GetChildren()) do
if not v:IsA("UIListLayout") then v:Destroy() end
end
local order = 1
ExplorerFuncs:AddHeader("FAVOURITES", order); order += 1
for _, v in ipairs(favScripts) do
ExplorerFuncs:AddScript(v.Name, "rbxassetid://129006243080309", v.src, order)
order += 1
end
ExplorerFuncs:AddHeader("FUN SCRIPTS", order); order += 1
for _, v in ipairs(funScripts) do
ExplorerFuncs:AddScript(v.Name, "rbxassetid://75018660065307", v.src, order)
order += 1
end
end
BuildExplorer()
SearchInp:GetPropertyChangedSignal("Text"):Connect(function()
local txt = SearchInp.Text:lower()
if txt == "" then BuildExplorer(); return end
for _, v in ipairs(Explorer:GetChildren()) do
if v:IsA("UIListLayout") then continue end
if v:FindFirstChildOfClass("TextLabel") then
local isHeader = v:FindFirstChildOfClass("ImageButton") == nil
v.Visible = isHeader or v.Name:lower():find(txt, 1, true) ~= nil
end
end
end)
Execute.MouseButton1Click:Connect(function()
if not curSel then AddLog("No tab open."); return end
local code = curSel.CodeBox.Text
if code:match("^%s*$") then AddLog("Nothing to execute."); return end
AddLog("Executing " .. curSel.Name .. "...")
local chunk, synErr = loadstring(code)
if not chunk then AddLog("Syntax error: " .. tostring(synErr)); return end
local ok, runErr = pcall(chunk)
if ok then AddLog("Executed successfully.")
else AddLog("Runtime error: " .. tostring(runErr)) end
end)
Clear.MouseButton1Click:Connect(function()
if curSel then curSel.CodeBox.Text = ""; saveTabToDisk(curSel.Name, "") end
end)
ClearOut.MouseButton1Click:Connect(function()
for _, v in ipairs(ContainerOut:GetChildren()) do
if v:IsA("TextLabel") then v:Destroy() end
end
logOrder = 0
end)
CopyOut.MouseButton1Click:Connect(function()
if not setclipboard then AddLog("setclipboard not available."); return end
local lines = {}
for _, v in ipairs(ContainerOut:GetChildren()) do
if v:IsA("TextLabel") then lines[#lines+1] = v.Text end
end
setclipboard(table.concat(lines, "\n"))
AddLog("Copied output to clipboard.")
end)
SaveOut.MouseButton1Click:Connect(function()
local lines = {}
for _, v in ipairs(ContainerOut:GetChildren()) do
if v:IsA("TextLabel") then lines[#lines+1] = v.Text end
end
local fileName = tostring(os.time()) .. ".txt"
writefile(LOGS_FOLDER .. "/" .. fileName, table.concat(lines, "\n"))
AddLog("Saved log to " .. fileName)
end)
Inject.MouseButton1Click:Connect(function()
AddLog("Already injected!")
end)
Open.MouseButton1Click:Connect(function()
OpenFile.Visible = true
FileInput.Text = ""
local con
con = FileInput.FocusLost:Connect(function(enterPressed)
if enterPressed then
OpenFile.Visible = false
local path = FileInput.Text:match("^%s*(.-)%s*$")
if isfile(path) then
local name = path:match("[^/\\]+$") or path
makeTab(name, readfile(path))
AddLog("Opened " .. name)
else
AddLog("File not found: " .. path)
end
con:Disconnect()
end
end)
end)
Save.MouseButton1Click:Connect(function()
if not curSel then AddLog("No tab open."); return end
local name = curSel.Name
if not name:match("%.lua$") then name ..= ".lua" end
local code = curSel.CodeBox.Text
writefile(name, code)
saveTabToDisk(curSel.Name, code)
AddLog("Saved to " .. name)
end)
lastTab = 1
makeTab("New Tab 1.lua")
AddLog("Welcome to Sodium, " .. Players.LocalPlayer.DisplayName)
AddLog("Supported Version: all versions lad")