ScriptRoblox/Library/JustHub (1).lua

630 lines
34 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

local TweenService = game:GetService("TweenService")
local UserInputService = game:GetService("UserInputService")
local RunService = game:GetService("RunService")
local HttpService = game:GetService("HttpService")
local Players = game:GetService("Players")
local StarterGui = game:GetService("StarterGui")
local JustHub = {}
JustHub.Themes = {
Darker = {
["Color Hub 1"] = ColorSequence.new({ColorSequenceKeypoint.new(0, Color3.fromRGB(25,25,25)), ColorSequenceKeypoint.new(0.5, Color3.fromRGB(32,32,32)), ColorSequenceKeypoint.new(1, Color3.fromRGB(25,25,25))}),
["Color Hub 2"] = Color3.fromRGB(30,30,30),
["Color Stroke"] = Color3.fromRGB(40,40,40),
["Color Theme"] = Color3.fromRGB(88,101,242),
["Color Text"] = Color3.fromRGB(243,243,243),
["Color Dark Text"] = Color3.fromRGB(180,180,180)
},
Dark = {
["Color Hub 1"] = ColorSequence.new({ColorSequenceKeypoint.new(0, Color3.fromRGB(40,40,40)), ColorSequenceKeypoint.new(0.5, Color3.fromRGB(47,47,47)), ColorSequenceKeypoint.new(1, Color3.fromRGB(40,40,40))}),
["Color Hub 2"] = Color3.fromRGB(45,45,45),
["Color Stroke"] = Color3.fromRGB(65,65,65),
["Color Theme"] = Color3.fromRGB(65,150,255),
["Color Text"] = Color3.fromRGB(245,245,245),
["Color Dark Text"] = Color3.fromRGB(190,190,190)
},
Purple = {
["Color Hub 1"] = ColorSequence.new({ColorSequenceKeypoint.new(0, Color3.fromRGB(28,25,30)), ColorSequenceKeypoint.new(0.5, Color3.fromRGB(32,32,32)), ColorSequenceKeypoint.new(1, Color3.fromRGB(28,25,30))}),
["Color Hub 2"] = Color3.fromRGB(30,30,30),
["Color Stroke"] = Color3.fromRGB(40,40,40),
["Color Theme"] = Color3.fromRGB(150,0,255),
["Color Text"] = Color3.fromRGB(240,240,240),
["Color Dark Text"] = Color3.fromRGB(180,180,180)
},
Light = {
["Color Hub 1"] = ColorSequence.new({ColorSequenceKeypoint.new(0, Color3.fromRGB(230,230,230)), ColorSequenceKeypoint.new(0.5, Color3.fromRGB(245,245,245)), ColorSequenceKeypoint.new(1, Color3.fromRGB(230,230,230))}),
["Color Hub 2"] = Color3.fromRGB(240,240,240),
["Color Stroke"] = Color3.fromRGB(200,200,200),
["Color Theme"] = Color3.fromRGB(0,120,255),
["Color Text"] = Color3.fromRGB(30,30,30),
["Color Dark Text"] = Color3.fromRGB(80,80,80)
},
Neon = {
["Color Hub 1"] = ColorSequence.new({ColorSequenceKeypoint.new(0, Color3.fromRGB(10,10,10)), ColorSequenceKeypoint.new(0.5, Color3.fromRGB(0,200,200)), ColorSequenceKeypoint.new(1, Color3.fromRGB(10,10,10))}),
["Color Hub 2"] = Color3.fromRGB(15,15,15),
["Color Stroke"] = Color3.fromRGB(0,255,255),
["Color Theme"] = Color3.fromRGB(0,255,0),
["Color Text"] = Color3.fromRGB(255,255,255),
["Color Dark Text"] = Color3.fromRGB(200,200,200)
},
Forest = {
["Color Hub 1"] = ColorSequence.new({ColorSequenceKeypoint.new(0, Color3.fromRGB(0,50,0)), ColorSequenceKeypoint.new(0.5, Color3.fromRGB(0,80,0)), ColorSequenceKeypoint.new(1, Color3.fromRGB(0,50,0))}),
["Color Hub 2"] = Color3.fromRGB(0,60,0),
["Color Stroke"] = Color3.fromRGB(0,80,0),
["Color Theme"] = Color3.fromRGB(0,120,0),
["Color Text"] = Color3.fromRGB(220,220,220),
["Color Dark Text"] = Color3.fromRGB(160,160,160)
},
Aqua = {
["Color Hub 1"] = ColorSequence.new({ColorSequenceKeypoint.new(0, Color3.fromRGB(0,100,100)), ColorSequenceKeypoint.new(0.5, Color3.fromRGB(0,150,150)), ColorSequenceKeypoint.new(1, Color3.fromRGB(0,100,100))}),
["Color Hub 2"] = Color3.fromRGB(0,110,110),
["Color Stroke"] = Color3.fromRGB(0,180,180),
["Color Theme"] = Color3.fromRGB(0,220,220),
["Color Text"] = Color3.fromRGB(255,255,255),
["Color Dark Text"] = Color3.fromRGB(200,200,200)
}
}
JustHub.Info = {Version = "1.1.0"}
JustHub.Save = {UISize = {550,380}, TabSize = 160, Theme = "Darker"}
JustHub.ConfigData = {}
JustHub.ControlRegistry = {}
local function createInstance(className, properties, parent)
local inst = Instance.new(className)
if properties then
for k, v in pairs(properties) do
inst[k] = v
end
end
if parent then
inst.Parent = parent
end
return inst
end
local function tweenProperty(object, propertyTable, duration)
local ti = TweenInfo.new(duration, Enum.EasingStyle.Quad, Enum.EasingDirection.Out)
local tw = TweenService:Create(object, ti, propertyTable)
tw:Play()
return tw
end
local function getCurrentTheme(themeChoice)
if type(themeChoice) == "table" then
return themeChoice
else
return JustHub.Themes[themeChoice or JustHub.Save.Theme]
end
end
local function clampPosition(pos, screenSize)
local x = math.clamp(pos.X.Offset, 0, screenSize.X)
local y = math.clamp(pos.Y.Offset, 0, screenSize.Y)
return UDim2.new(pos.X.Scale, x, pos.Y.Scale, y)
end
local function addBorder(obj, color, thickness)
return createInstance("UIStroke", {Color = color, Thickness = thickness}, obj)
end
function JustHub:RegisterControl(key, updateFunction)
JustHub.ControlRegistry[key] = updateFunction
end
function JustHub:ApplyConfig(config)
for key, savedValue in pairs(config) do
if JustHub.ControlRegistry[key] then
JustHub.ControlRegistry[key](savedValue)
end
end
end
local SectionMethods = {}
function SectionMethods:addMenu(menuName)
menuName = menuName or "Menu"
local menuFrame = createInstance("Frame", {Name = menuName, Size = UDim2.new(1,0,0,40), BackgroundColor3 = getCurrentTheme(JustHub.Save.Theme)["Color Stroke"], BackgroundTransparency = 0.3}, self.Content)
createInstance("UICorner", {CornerRadius = UDim.new(0,6)}, menuFrame)
createInstance("TextLabel", {Name = "MenuLabel", Text = menuName, Size = UDim2.new(1,0,1,0), BackgroundTransparency = 1, TextColor3 = getCurrentTheme(JustHub.Save.Theme)["Color Text"], Font = Enum.Font.GothamBold, TextSize = 16}, menuFrame)
return menuFrame
end
function SectionMethods:addToggle(options)
options = options or {}
local toggleTitle = options.Name or "Toggle"
local default = options.Default or false
local callback = options.Callback or function(state) end
local toggleFrame = createInstance("Frame", {Name = toggleTitle.."Toggle", Size = UDim2.new(1,0,0,20), BackgroundColor3 = Color3.fromRGB(40,40,40)}, self.Content)
createInstance("UICorner", {CornerRadius = UDim.new(0,20)}, toggleFrame)
addBorder(toggleFrame, getCurrentTheme(JustHub.Save.Theme)["Color Stroke"], 1)
local label = createInstance("TextLabel", {Size = UDim2.new(0.7,0,1,0), Position = UDim2.new(0,0,0,0), BackgroundTransparency = 1, Text = toggleTitle, TextColor3 = getCurrentTheme(JustHub.Save.Theme)["Color Text"], Font = Enum.Font.Gotham, TextSize = 12, TextXAlignment = Enum.TextXAlignment.Left}, toggleFrame)
local separator = createInstance("Frame", {Size = UDim2.new(0,2,1,0), Position = UDim2.new(0.7,0,0,0), BackgroundColor3 = Color3.fromRGB(255,255,255)}, toggleFrame)
createInstance("UICorner", {CornerRadius = UDim.new(0,1)}, separator)
local toggleContainer = createInstance("Frame", {Size = UDim2.new(0.3,0,1,0), Position = UDim2.new(0.7,0,0,0), BackgroundTransparency = 1}, toggleFrame)
local toggleSwitch = createInstance("Frame", {Size = UDim2.new(0,35,0,15), Position = UDim2.new(1,-35,0.5,-7.5), BackgroundColor3 = default and Color3.fromRGB(0,200,0) or Color3.fromRGB(100,100,100), BorderSizePixel = 0}, toggleContainer)
toggleSwitch.Active = true
toggleSwitch.Selectable = true
createInstance("UICorner", {CornerRadius = UDim.new(0,15)}, toggleSwitch)
local toggleCircle = createInstance("Frame", {Size = UDim2.new(0,13,0,13), Position = default and UDim2.new(0,20,0.5,-6.5) or UDim2.new(0,2,0.5,-6.5), BackgroundColor3 = Color3.new(1,1,1), BorderSizePixel = 0}, toggleSwitch)
createInstance("UICorner", {CornerRadius = UDim.new(1,0)}, toggleCircle)
local state = default
if default then callback(true) else callback(false) end
JustHub.ConfigData[toggleTitle] = state
JustHub:RegisterControl(toggleTitle, function(savedValue)
state = savedValue
if state then
toggleCircle.Position = UDim2.new(0,20,0.5,-6.5)
toggleSwitch.BackgroundColor3 = Color3.fromRGB(0,200,0)
label.TextColor3 = Color3.fromRGB(0,255,0)
else
toggleCircle.Position = UDim2.new(0,2,0.5,-6.5)
toggleSwitch.BackgroundColor3 = Color3.fromRGB(100,100,100)
label.TextColor3 = Color3.fromRGB(255,255,255)
end
end)
toggleSwitch.InputBegan:Connect(function(input)
if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
if not state then
tweenProperty(toggleCircle, {Position = UDim2.new(0,20,0.5,-6.5)}, 0.3)
tweenProperty(toggleSwitch, {BackgroundColor3 = Color3.fromRGB(0,200,0)}, 0.3)
tweenProperty(label, {TextColor3 = Color3.fromRGB(0,255,0)}, 0.3)
else
tweenProperty(toggleCircle, {Position = UDim2.new(0,2,0.5,-6.5)}, 0.3)
tweenProperty(toggleSwitch, {BackgroundColor3 = Color3.fromRGB(100,100,100)}, 0.3)
tweenProperty(label, {TextColor3 = Color3.fromRGB(255,255,255)}, 0.3)
end
state = not state
JustHub.ConfigData[toggleTitle] = state
callback(state)
end
end)
return toggleFrame
end
function SectionMethods:addSlider(options)
options = options or {}
local sliderName = options.Name or "Slider"
local min = options.Min or 0
local max = options.Max or 100
local default = options.Default or min
if JustHub.ConfigData[sliderName] ~= nil then
default = JustHub.ConfigData[sliderName]
else
JustHub.ConfigData[sliderName] = default
end
local callback = options.Callback or function(value) end
local sliderFrame = createInstance("Frame", {Name = sliderName.."Slider", Size = UDim2.new(1,0,0,25), BackgroundTransparency = 1}, self.Content)
addBorder(sliderFrame, getCurrentTheme(JustHub.Save.Theme)["Color Stroke"], 1)
local label = createInstance("TextLabel", {Name = "Label", Text = sliderName, Size = UDim2.new(0.7,0,1,0), Position = UDim2.new(0,0,0,0), BackgroundTransparency = 1, TextColor3 = getCurrentTheme(JustHub.Save.Theme)["Color Text"], Font = Enum.Font.Gotham, TextSize = 10}, sliderFrame)
local separator = createInstance("Frame", {Size = UDim2.new(0,2,1,0), Position = UDim2.new(0.7,0,0,0), BackgroundColor3 = Color3.fromRGB(255,255,255)}, sliderFrame)
createInstance("UICorner", {CornerRadius = UDim.new(0,1)}, separator)
local sliderContainer = createInstance("Frame", {Name = "SliderContainer", Size = UDim2.new(0.3,0,1,0), Position = UDim2.new(0.7,0,0,0), BackgroundTransparency = 1}, sliderFrame)
local sliderBar = createInstance("Frame", {Name = "SliderBar", Size = UDim2.new(1,-20,0,4), Position = UDim2.new(0,10,0.5,-2), BackgroundColor3 = getCurrentTheme(JustHub.Save.Theme)["Color Stroke"]}, sliderContainer)
createInstance("UICorner", {CornerRadius = UDim.new(0,4)}, sliderBar)
local sliderHandle = createInstance("Frame", {Name = "SliderHandle", Size = UDim2.new(0,12,0,12), BackgroundColor3 = getCurrentTheme(JustHub.Save.Theme)["Color Theme"], Position = UDim2.new((default - min)/(max - min), -6, 0.5,-6)}, sliderBar)
createInstance("UICorner", {CornerRadius = UDim.new(0,4)}, sliderHandle)
local dragging = false
sliderHandle.InputBegan:Connect(function(input)
if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then dragging = true end
end)
sliderHandle.InputEnded:Connect(function(input)
if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then dragging = false end
end)
UserInputService.InputChanged:Connect(function(input)
if dragging and (input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch) then
local barAbsPos = sliderBar.AbsolutePosition.X
local barWidth = sliderBar.AbsoluteSize.X
local relativePos = math.clamp((input.Position.X - barAbsPos) / barWidth, 0, 1)
sliderHandle.Position = UDim2.new(relativePos, -6, sliderHandle.Position.Y.Scale, sliderHandle.Position.Y.Offset)
local value = min + relativePos*(max - min)
JustHub.ConfigData[sliderName] = value
callback(value)
end
end)
JustHub:RegisterControl(sliderName, function(savedValue)
local newRel = (savedValue - min)/(max - min)
sliderHandle.Position = UDim2.new(newRel, -6, 0.5, -6)
end)
return sliderFrame
end
function SectionMethods:addTextBox(options)
options = options or {}
local textBoxName = options.Name or "TextBox"
local defaultText = options.Default or ""
local callback = options.Callback or function(text) end
local textBoxFrame = createInstance("Frame", {Name = textBoxName.."TextBox", Size = UDim2.new(1,0,0,20), BackgroundTransparency = 1}, self.Content)
addBorder(textBoxFrame, getCurrentTheme(JustHub.Save.Theme)["Color Stroke"], 1)
local label = createInstance("TextLabel", {Name = "Label", Text = textBoxName, Size = UDim2.new(0.7,0,1,0), Position = UDim2.new(0,0,0,0), BackgroundTransparency = 1, TextColor3 = getCurrentTheme(JustHub.Save.Theme)["Color Text"], Font = Enum.Font.Gotham, TextSize = 10}, textBoxFrame)
local textbox = createInstance("TextBox", {Name = "Input", Text = defaultText, Size = UDim2.new(0.3,0,1,0), Position = UDim2.new(0.7,0,0,0), BackgroundColor3 = getCurrentTheme(JustHub.Save.Theme)["Color Stroke"], TextColor3 = getCurrentTheme(JustHub.Save.Theme)["Color Text"], Font = Enum.Font.Gotham, TextSize = 10}, textBoxFrame)
textbox.FocusLost:Connect(function(enterPressed)
JustHub.ConfigData[textBoxName] = textbox.Text
callback(textbox.Text)
end)
JustHub:RegisterControl(textBoxName, function(savedText)
textbox.Text = savedText
end)
return textBoxFrame
end
function SectionMethods:addDropdown(options)
options = options or {}
local dropdownTitle = options.Name or "Dropdown"
local default = options.Default or ""
local items = options.Items or {}
local callback = options.Callback or function(value) end
local closedHeight = 20
local openHeight = closedHeight + (#items * 20 + ((#items-1) * 2))
local dropdownFrame = createInstance("Frame", {Name = dropdownTitle.."Dropdown", BackgroundTransparency = 1}, self.Content)
dropdownFrame.Size = UDim2.new(1,0,0,closedHeight)
addBorder(dropdownFrame, getCurrentTheme(JustHub.Save.Theme)["Color Stroke"], 1)
local label = createInstance("TextLabel", {Name = "Label", Text = dropdownTitle, Size = UDim2.new(0.7,0,0,closedHeight), Position = UDim2.new(0,0,0,0), BackgroundTransparency = 1, TextColor3 = getCurrentTheme(JustHub.Save.Theme)["Color Text"], Font = Enum.Font.Gotham, TextSize = 10}, dropdownFrame)
local dropdownButton = createInstance("TextButton", {Name = "DropdownButton", Text = (default ~= "" and (default .. "") or "Select ▼"), Size = UDim2.new(0.3,0,0,closedHeight), Position = UDim2.new(0.7,0,0,0), BackgroundColor3 = getCurrentTheme(JustHub.Save.Theme)["Color Stroke"], Font = Enum.Font.GothamBold, TextSize = 10}, dropdownFrame)
local listFrame = createInstance("Frame", {Name = "DropdownList", BackgroundColor3 = getCurrentTheme(JustHub.Save.Theme)["Color Hub 2"], Visible = false, Position = UDim2.new(0,0,0,closedHeight)}, dropdownFrame)
listFrame.Size = UDim2.new(1,0,0,#items*20 + ((#items-1)*2))
createInstance("UIListLayout", {Padding = UDim.new(0,2), SortOrder = Enum.SortOrder.LayoutOrder}, listFrame)
local dropdownToggle = false
dropdownButton.MouseButton1Click:Connect(function()
if dropdownToggle then
tweenProperty(dropdownFrame, {Size = UDim2.new(1,0,0,closedHeight)}, 0.15)
tweenProperty(dropdownButton, {TextColor3 = getCurrentTheme(JustHub.Save.Theme)["Color Text"]}, 0.15)
wait(0.15)
listFrame.Visible = false
else
listFrame.Visible = true
tweenProperty(dropdownFrame, {Size = UDim2.new(1,0,0,openHeight)}, 0.15)
tweenProperty(dropdownButton, {TextColor3 = Color3.fromRGB(0,255,0)}, 0.15)
end
dropdownToggle = not dropdownToggle
end)
for _, option in ipairs(items) do
local btn = createInstance("TextButton", {Size = UDim2.new(1,0,0,20), Text = option, TextColor3 = Color3.fromRGB(255,255,255), BackgroundTransparency = 1, Font = Enum.Font.Gotham, TextSize = 10}, listFrame)
btn.MouseButton1Click:Connect(function()
label.Text = dropdownTitle .. " - " .. option
JustHub.ConfigData[dropdownTitle] = option
pcall(callback, option)
tweenProperty(dropdownFrame, {Size = UDim2.new(1,0,0,closedHeight)}, 0.15)
dropdownToggle = false
wait(0.15)
listFrame.Visible = false
end)
end
JustHub.ConfigData[dropdownTitle] = default
JustHub:RegisterControl(dropdownTitle, function(savedValue)
label.Text = dropdownTitle .. " - " .. savedValue
end)
local updatedropfunc = {}
function updatedropfunc:Clear()
for i, v in pairs(listFrame:GetChildren()) do
if v:IsA("TextButton") then
v:Destroy()
dropdownToggle = false
label.Text = dropdownTitle
tweenProperty(dropdownFrame, {Size = UDim2.new(1,0,0,closedHeight)}, 0.15)
end
end
end
function updatedropfunc:Refresh(newlist)
newlist = newlist or {}
for i, v in pairs(newlist) do
local btn = createInstance("TextButton", {Size = UDim2.new(1,0,0,25), Text = v, TextColor3 = Color3.fromRGB(255,255,255), BackgroundTransparency = 1, Font = Enum.Font.SourceSansSemibold, TextSize = 12}, listFrame)
btn.MouseButton1Click:Connect(function()
dropdownToggle = false
label.Text = dropdownTitle .. " - " .. v
pcall(callback, v)
tweenProperty(dropdownFrame, {Size = UDim2.new(1,0,0,closedHeight)}, 0.15)
end)
end
end
return updatedropfunc
end
function SectionMethods:addButton(options)
options = options or {}
local labelText = options.Name or "Button"
local buttonText = options.ButtonText or "Click"
local callback = options.Callback or function() end
local container = createInstance("Frame", {Name = labelText.."ButtonControl", Size = UDim2.new(1,0,0,30), BackgroundTransparency = 1}, self.Content)
addBorder(container, getCurrentTheme(JustHub.Save.Theme)["Color Stroke"], 1)
local label = createInstance("TextLabel", {Name = "Label", Text = labelText, Size = UDim2.new(0.7,0,1,0), Position = UDim2.new(0,0,0,0), BackgroundTransparency = 1, TextColor3 = getCurrentTheme(JustHub.Save.Theme)["Color Text"], Font = Enum.Font.Gotham, TextSize = 10, TextXAlignment = Enum.TextXAlignment.Left}, container)
local button = createInstance("TextButton", {Name = "ActionButton", Text = buttonText, Size = UDim2.new(0.3,0,0.8,0), Position = UDim2.new(0.7,0,0.1,0), BackgroundColor3 = getCurrentTheme(JustHub.Save.Theme)["Color Theme"], TextColor3 = getCurrentTheme(JustHub.Save.Theme)["Color Text"], Font = Enum.Font.GothamBold, TextSize = 10}, container)
createInstance("UICorner", {CornerRadius = UDim.new(0,6)}, button)
button.MouseButton1Click:Connect(function() pcall(callback) end)
return container
end
function JustHub:addSection(sectionName, sectionHeight)
sectionName = sectionName or "Section"
sectionHeight = sectionHeight or 100
local sectionFrame = createInstance("Frame", {Name = sectionName, Size = UDim2.new(1,0,0,sectionHeight), BackgroundColor3 = getCurrentTheme(JustHub.Save.Theme)["Color Hub 2"], BackgroundTransparency = 0.2}, nil)
createInstance("UICorner", {CornerRadius = UDim.new(0,8)}, sectionFrame)
local sectionTitle = createInstance("TextLabel", {Name = "SectionTitle", Text = sectionName, Size = UDim2.new(1,0,0,30), BackgroundTransparency = 1, TextColor3 = getCurrentTheme(JustHub.Save.Theme)["Color Text"], Font = Enum.Font.GothamBold, TextSize = 16, TextXAlignment = Enum.TextXAlignment.Left}, sectionFrame)
local sectionContent = createInstance("Frame", {Name = "SectionContent", Size = UDim2.new(1,0,1,-30), Position = UDim2.new(0,0,0,30), BackgroundTransparency = 1}, sectionFrame)
createInstance("UIListLayout", {FillDirection = Enum.FillDirection.Vertical, Padding = UDim.new(0,5), SortOrder = Enum.SortOrder.LayoutOrder}, sectionContent)
local sectionObj = {Frame = sectionFrame, Title = sectionTitle, Content = sectionContent}
setmetatable(sectionObj, {__index = SectionMethods})
return sectionObj
end
function JustHub:CreateWindow(options)
options = options or {}
local windowName = options.Name or "JustHub Window"
local currentTheme = getCurrentTheme(options.Theme)
local windowGUID = HttpService:GenerateGUID(false)
local finalTitle = windowName .. " [" .. windowGUID .. "]"
local player = Players.LocalPlayer
local playerGui = player:WaitForChild("PlayerGui")
local screenGui = createInstance("ScreenGui", {Name = "JustHub", ResetOnSpawn = false}, playerGui)
self.ScreenGui = screenGui
local uiWidth = JustHub.Save.UISize[1]
local uiHeight = JustHub.Save.UISize[2]
local mainFrame = createInstance("Frame", {Name = "MainFrame", AnchorPoint = Vector2.new(0.5,0.5), Position = UDim2.new(0.5,0,-0.5,0), Size = UDim2.new(0,uiWidth,0,uiHeight), BackgroundColor3 = currentTheme["Color Hub 2"]}, screenGui)
createInstance("UICorner", {CornerRadius = UDim.new(0,12)}, mainFrame)
addBorder(mainFrame, currentTheme["Color Stroke"], 2)
createInstance("UIGradient", {Color = currentTheme["Color Hub 1"]}, mainFrame)
local topBar = createInstance("Frame", {Name = "TopBar", Size = UDim2.new(1,0,0,60), BackgroundColor3 = currentTheme["Color Hub 2"]}, mainFrame)
createInstance("UICorner", {CornerRadius = UDim.new(0,12)}, topBar)
local titleLabel = createInstance("TextLabel", {Name = "TitleLabel", Size = UDim2.new(1,-180,1,0), Position = UDim2.new(0,10,0,0), BackgroundTransparency = 1, Text = finalTitle, TextColor3 = currentTheme["Color Text"], Font = Enum.Font.GothamBold, TextSize = 18, TextXAlignment = Enum.TextXAlignment.Left}, topBar)
local welcomeLabel = createInstance("TextLabel", {Name = "WelcomeLabel", Size = UDim2.new(0,150,0,20), AnchorPoint = Vector2.new(0,1), Position = UDim2.new(0,10,1,-30), BackgroundTransparency = 1, Text = "Welcome, " .. player.Name, TextColor3 = currentTheme["Color Text"], Font = Enum.Font.GothamBold, TextSize = 16, TextXAlignment = Enum.TextXAlignment.Left}, mainFrame)
local function createControlButton(name, symbol, pos)
local btn = createInstance("TextButton", {Name = name, Text = symbol, Size = UDim2.new(0,40,0,40), Position = pos, BackgroundTransparency = 1, TextColor3 = currentTheme["Color Theme"], Font = Enum.Font.GothamBold, TextSize = 24}, topBar)
return btn
end
local hideButton = createControlButton("HideButton", "", UDim2.new(1,-110,0,10))
local maxButton = createControlButton("MaxButton", "", UDim2.new(1,-70,0,10))
local closeButton = createControlButton("CloseButton", "X", UDim2.new(1,-30,0,10))
local sidebarWidth = JustHub.Save.TabSize
local sidebar = createInstance("Frame", {Name = "Sidebar", Size = UDim2.new(0,sidebarWidth,1,-60), Position = UDim2.new(0,0,0,60), BackgroundColor3 = currentTheme["Color Hub 2"]}, mainFrame)
createInstance("UICorner", {CornerRadius = UDim.new(0,10)}, sidebar)
createInstance("UIListLayout", {FillDirection = Enum.FillDirection.Vertical, Padding = UDim.new(0,10), HorizontalAlignment = Enum.HorizontalAlignment.Center, VerticalAlignment = Enum.VerticalAlignment.Top}, sidebar)
local contentContainer = createInstance("Frame", {Name = "ContentContainer", Size = UDim2.new(1,-sidebarWidth,1,-60), Position = UDim2.new(0,sidebarWidth,0,60), BackgroundColor3 = currentTheme["Color Hub 2"]}, mainFrame)
createInstance("UICorner", {CornerRadius = UDim.new(0,10)}, contentContainer)
local scrollingFrame = createInstance("ScrollingFrame", {Size = UDim2.new(1,0,1,0), BackgroundTransparency = 1, ScrollBarThickness = 8, BorderSizePixel = 0}, contentContainer)
createInstance("UIListLayout", {SortOrder = Enum.SortOrder.LayoutOrder, Padding = UDim.new(0,10)}, scrollingFrame)
local fpsLabel = createInstance("TextLabel", {Name = "FPSLabel", Size = UDim2.new(0,100,0,20), AnchorPoint = Vector2.new(1,1), Position = UDim2.new(1,-10,1,-10), BackgroundTransparency = 1, TextColor3 = currentTheme["Color Text"], Font = Enum.Font.Gotham, TextSize = 14, Text = "FPS: Calculating..."}, mainFrame)
RunService.Heartbeat:Connect(function(delta)
local fps = math.floor(1/delta)
fpsLabel.Text = "FPS: " .. fps
end)
local originalSize = mainFrame.Size
local originalPosition = mainFrame.Position
local minimized = false
local maximized = false
hideButton.MouseButton1Click:Connect(function()
if not minimized then
tweenProperty(mainFrame, {Size = UDim2.new(originalSize.X.Scale, originalSize.X.Offset, 0, 60)}, 0.3)
welcomeLabel.Visible = false
sidebar.Visible = false
contentContainer.Visible = false
fpsLabel.Visible = false
minimized = true
else
tweenProperty(mainFrame, {Size = originalSize}, 0.3)
wait(0.3)
welcomeLabel.Visible = true
sidebar.Visible = true
contentContainer.Visible = true
fpsLabel.Visible = true
minimized = false
end
end)
maxButton.MouseButton1Click:Connect(function()
if not maximized then
tweenProperty(mainFrame, {Size = UDim2.new(1,0,1,0), Position = UDim2.new(0.5,0,0.5,0)}, 0.3)
maximized = true
else
tweenProperty(mainFrame, {Size = originalSize, Position = originalPosition}, 0.3)
maximized = false
end
end)
closeButton.MouseButton1Click:Connect(function()
local tweenInfoOut = TweenInfo.new(0.5, Enum.EasingStyle.Back, Enum.EasingDirection.In)
local tweenOut = TweenService:Create(mainFrame, tweenInfoOut, {Position = UDim2.new(0.5,0,-0.5,0)})
tweenOut:Play()
tweenOut.Completed:Connect(function()
mainFrame.Visible = false
local player = Players.LocalPlayer
local playerGui = player:WaitForChild("PlayerGui")
local showScreenGui = Instance.new("ScreenGui")
showScreenGui.Name = "ShowUI"
showScreenGui.ResetOnSpawn = false
showScreenGui.Parent = playerGui
local showButton = Instance.new("TextButton")
showButton.Name = "ShowUIButton"
showButton.Size = UDim2.new(0,150,0,50)
showButton.Position = UDim2.new(0.5, -75, 0, 0)
showButton.BackgroundColor3 = currentTheme["Color Hub 2"]
showButton.Text = "Show UI"
showButton.TextColor3 = currentTheme["Color Text"]
showButton.Font = Enum.Font.GothamBold
showButton.TextSize = 20
createInstance("UICorner", {CornerRadius = UDim.new(0,25)}, showButton)
createInstance("UIStroke", {Color = currentTheme["Color Theme"], Thickness = 2}, showButton)
showButton.Parent = showScreenGui
showButton.MouseButton1Click:Connect(function()
mainFrame.Visible = true
tweenProperty(mainFrame, {Position = UDim2.new(0.5,0,0.5,0)}, 0.5)
showScreenGui:Destroy()
end)
end)
end)
mainFrame.Active = true
local dragging = false
local dragStart, startPos
mainFrame.InputBegan:Connect(function(input)
if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
dragging = true
dragStart = input.Position
startPos = mainFrame.Position
end
end)
mainFrame.InputChanged:Connect(function(input)
if dragging and (input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch) then
local delta = input.Position - dragStart
local newPos = UDim2.new(startPos.X.Scale, startPos.X.Offset + delta.X, startPos.Y.Scale, startPos.Y.Offset + delta.Y)
newPos = clampPosition(newPos, Vector2.new(screenGui.AbsoluteSize.X, screenGui.AbsoluteSize.Y))
mainFrame.Position = newPos
end
end)
UserInputService.InputEnded:Connect(function(input)
if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
dragging = false
end
end)
print("JustHub Window dibuat.")
local windowObject = {ScreenGui = screenGui, MainFrame = mainFrame, TopBar = topBar, Sidebar = sidebar, ContentContainer = contentContainer, Tabs = {}}
function windowObject:addTab(tabName)
tabName = tabName or "Tab"
local tabButton = createInstance("TextButton", {Name = tabName.."Button", Text = tabName, Size = UDim2.new(1,0,0,30), BackgroundColor3 = currentTheme["Color Stroke"], TextColor3 = currentTheme["Color Text"], Font = Enum.Font.GothamBold, TextSize = 16}, sidebar)
createInstance("UICorner", {CornerRadius = UDim.new(0,15)}, tabButton)
createInstance("UIStroke", {Color = currentTheme["Color Theme"], Thickness = 1}, tabButton)
local tabContent = createInstance("Frame", {Name = tabName.."Content", Size = UDim2.new(1,0,1,0), BackgroundTransparency = 1, Visible = false}, scrollingFrame)
local tabObject = {Name = tabName, Button = tabButton, Content = tabContent, Sections = {}}
table.insert(windowObject.Tabs, tabObject)
tabButton.MouseButton1Click:Connect(function()
for _, t in ipairs(windowObject.Tabs) do t.Content.Visible = false end
tabObject.Content.Visible = true
end)
if #windowObject.Tabs == 1 then tabObject.Content.Visible = true end
function tabObject:addSection(sectionName, sectionHeight)
sectionName = sectionName or "Section"
sectionHeight = sectionHeight or 100
local sectionFrame = createInstance("Frame", {Name = sectionName, Size = UDim2.new(1,0,0,sectionHeight), BackgroundColor3 = currentTheme["Color Hub 2"], BackgroundTransparency = 0.2}, tabObject.Content)
createInstance("UICorner", {CornerRadius = UDim.new(0,8)}, sectionFrame)
local sectionTitle = createInstance("TextLabel", {Name = "SectionTitle", Text = sectionName, Size = UDim2.new(1,0,0,30), BackgroundTransparency = 1, TextColor3 = currentTheme["Color Text"], Font = Enum.Font.GothamBold, TextSize = 16, TextXAlignment = Enum.TextXAlignment.Left}, sectionFrame)
local sectionContent = createInstance("Frame", {Name = "SectionContent", Size = UDim2.new(1,0,1,-30), Position = UDim2.new(0,0,0,30), BackgroundTransparency = 1}, sectionFrame)
createInstance("UIListLayout", {FillDirection = Enum.FillDirection.Vertical, Padding = UDim.new(0,5), SortOrder = Enum.SortOrder.LayoutOrder}, sectionContent)
local sectionObj = {Frame = sectionFrame, Title = sectionTitle, Content = sectionContent}
table.insert(tabObject.Sections, sectionObj)
setmetatable(sectionObj, {__index = SectionMethods})
return sectionObj
end
return tabObject
end
return windowObject
end
function JustHub:ShowLoadingScreen(duration, callback)
duration = duration or 5
callback = callback or function() end
local player = Players.LocalPlayer
local playerGui = player:WaitForChild("PlayerGui")
local loadingGui = createInstance("ScreenGui", {Name = "LoadingScreen", ResetOnSpawn = false, IgnoreGuiInset = true}, playerGui)
local background = createInstance("Frame", {Size = UDim2.new(1,0,1,0), Position = UDim2.new(0,0,0,0), BackgroundColor3 = Color3.new(0,0,0), BackgroundTransparency = 0.5, BorderSizePixel = 0}, loadingGui)
local titleLabel = createInstance("TextLabel", {Text = "JustHub Library", Font = Enum.Font.SourceSansSemibold, TextSize = 20, TextColor3 = getCurrentTheme(JustHub.Save.Theme)["Color Text"], BackgroundTransparency = 1, Size = UDim2.new(0,200,0,50), AnchorPoint = Vector2.new(0.5,0.5), Position = UDim2.new(0.5,0,0.5,-50)}, loadingGui)
local welcomeLabel = createInstance("TextLabel", {Text = "Welcome, " .. player.Name, Font = Enum.Font.SourceSansSemibold, TextSize = 16, TextColor3 = getCurrentTheme(JustHub.Save.Theme)["Color Text"], BackgroundTransparency = 1, Size = UDim2.new(0,200,0,30), AnchorPoint = Vector2.new(0.5,0), Position = UDim2.new(0.5,0,0.5,10)}, loadingGui)
local progressBarContainer = createInstance("Frame", {Size = UDim2.new(0.5,0,0,20), Position = UDim2.new(0.5,0,0.5,50), AnchorPoint = Vector2.new(0.5,0.5), BackgroundColor3 = getCurrentTheme(JustHub.Save.Theme)["Color Stroke"], BackgroundTransparency = 0.5, BorderSizePixel = 0}, loadingGui)
createInstance("UICorner", {CornerRadius = UDim.new(0,4)}, progressBarContainer)
local progressBarFill = createInstance("Frame", {Size = UDim2.new(0,0,1,0), BackgroundColor3 = getCurrentTheme(JustHub.Save.Theme)["Color Theme"], BorderSizePixel = 0}, progressBarContainer)
createInstance("UICorner", {CornerRadius = UDim.new(0,4)}, progressBarFill)
local tweenInfo = TweenInfo.new(duration, Enum.EasingStyle.Quad, Enum.EasingDirection.Out)
local progressTween = TweenService:Create(progressBarFill, tweenInfo, {Size = UDim2.new(1,0,1,0)})
progressTween:Play()
spawn(function()
while progressTween.PlaybackState == Enum.PlaybackState.Playing do
tweenProperty(titleLabel, {TextTransparency = 0.5}, 0.5)
wait(0.5)
tweenProperty(titleLabel, {TextTransparency = 0}, 0.5)
wait(0.5)
end
end)
progressTween.Completed:Connect(function()
wait(0.5)
loadingGui:Destroy()
callback()
end)
end
function JustHub:InitializeUI(options)
self:ShowLoadingScreen(5, function()
local window = self:CreateWindow(options)
self.Window = window
print("Window dibuat setelah loading screen.")
end)
end
function JustHub:SaveConfig(fileName)
fileName = fileName or "JustHub_Config.json"
if writefile then
local json = HttpService:JSONEncode(JustHub.ConfigData)
writefile(fileName, json)
StarterGui:SetCore("SendNotification", {Title = "Save Config", Text = "Config berhasil disimpan ke " .. fileName, Duration = 5})
else
warn("Saving config is not supported in this environment.")
end
end
function JustHub:LoadConfig(fileName)
fileName = fileName or "JustHub_Config.json"
if readfile then
local data = readfile(fileName)
local config = HttpService:JSONDecode(data)
JustHub.ConfigData = config
JustHub:ApplyConfig(config)
StarterGui:SetCore("SendNotification", {Title = "Load Config", Text = "Config berhasil dimuat dari " .. fileName, Duration = 5})
return config
else
warn("Loading config is not supported in this environment.")
return {}
end
end
function JustHub:UpdateTheme(newTheme)
JustHub.Save.Theme = newTheme
local theme = getCurrentTheme(newTheme)
if self.Window then
local mainFrame = self.Window.MainFrame
mainFrame.BackgroundColor3 = theme["Color Hub 2"]
local topBar = self.Window.TopBar
topBar.BackgroundColor3 = theme["Color Hub 2"]
local titleLabel = topBar:FindFirstChild("TitleLabel")
if titleLabel then titleLabel.TextColor3 = theme["Color Text"] end
local sidebar = self.Window.Sidebar
sidebar.BackgroundColor3 = theme["Color Hub 2"]
local contentContainer = self.Window.ContentContainer
contentContainer.BackgroundColor3 = theme["Color Hub 2"]
for _, tab in ipairs(self.Window.Tabs) do
if tab.Button then
tab.Button.BackgroundColor3 = theme["Color Stroke"]
tab.Button.TextColor3 = theme["Color Text"]
end
end
local fpsLabel = mainFrame:FindFirstChild("FPSLabel", true)
if fpsLabel then
fpsLabel.TextColor3 = theme["Color Text"]
end
end
end
function JustHub:SetTheme(newTheme)
self:UpdateTheme(newTheme)
end
function JustHub:ToggleUIVisibility()
if self.ScreenGui and self.ScreenGui.Parent then
self.ScreenGui.Enabled = not self.ScreenGui.Enabled
end
end
UserInputService.InputBegan:Connect(function(input, gameProcessed)
if not gameProcessed and input.KeyCode and input.KeyCode == Enum.KeyCode.RightShift then
JustHub:ToggleUIVisibility()
end
end)
function JustHub:Notify(options)
options = options or {}
local title = options.Title or ""
local text = options.Message or ""
local duration = options.Duration or 5
local success, errorMessage = pcall(function()
StarterGui:SetCore("SendNotification", {Title = title, Text = text, Duration = duration})
end)
if not success then
warn("Gagal mengirim notifikasi: " .. errorMessage)
end
end
return JustHub