ScriptRoblox/Library/testing.lua

392 lines
25 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 Stats = game:GetService("Stats")
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)
}
}
JustHub.Info = {Version = "1.1.0"}
JustHub.Save = {UISize = {550,380}, TabSize = 160, Theme = "Darker"}
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
function JustHub:CreateWindow(options)
options = options or {}
local windowName = options.Name or "JustHub Window"
local theme = getCurrentTheme(options.Theme)
local guid = HttpService:GenerateGUID(false)
local finalTitle = windowName .. " [" .. guid .. "]"
local player = Players.LocalPlayer
local playerGui = player:WaitForChild("PlayerGui")
local screenGui = createInstance("ScreenGui", {Name="JustHub", ResetOnSpawn=false}, playerGui)
local uiWidth, uiHeight = JustHub.Save.UISize[1], 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=theme["Color Hub 2"]}, screenGui)
createInstance("UICorner", {CornerRadius=UDim.new(0,12)}, mainFrame)
createInstance("UIStroke", {Color=theme["Color Stroke"], Thickness=2}, mainFrame)
createInstance("UIGradient", {Color=theme["Color Hub 1"]}, mainFrame)
local topBar = createInstance("Frame", {Name="TopBar", Size=UDim2.new(1,0,0,60), BackgroundColor3=theme["Color Hub 2"]}, mainFrame)
createInstance("UICorner", {CornerRadius=UDim.new(0,12)}, topBar)
local titleLabel = createInstance("TextLabel", {Name="TitleLabel", Size=UDim2.new(1,-120,1,0), Position=UDim2.new(0,10,0,0), BackgroundTransparency=1, Text=finalTitle, TextColor3=theme["Color Text"], Font=Enum.Font.GothamBold, TextSize=18, TextXAlignment=Enum.TextXAlignment.Left}, topBar)
local function createControlButton(name, txt, pos)
return createInstance("TextButton", {Name=name, Size=UDim2.new(0,40,0,40), Position=pos, BackgroundTransparency=1, Text=txt, TextColor3=theme["Color Theme"], Font=Enum.Font.GothamBold, TextSize=24}, topBar)
end
local hideButton = createControlButton("MinimizeButton", "", UDim2.new(1,-110,0,10))
local maxButton = createControlButton("MaximizeButton", "", UDim2.new(1,-70,0,10))
local closeButton = createControlButton("CloseButton", "", 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=theme["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=theme["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), Position=UDim2.new(1,-110,1,-30), BackgroundTransparency=1, TextColor3=theme["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 ti = TweenInfo.new(0.5, Enum.EasingStyle.Back, Enum.EasingDirection.Out)
local tw = TweenService:Create(mainFrame, ti, {Position=UDim2.new(0.5,0,0.5,0)})
tw:Play()
closeButton.MouseButton1Click:Connect(function()
local tio = TweenInfo.new(0.5, Enum.EasingStyle.Back, Enum.EasingDirection.In)
local two = TweenService:Create(mainFrame, tio, {Position=UDim2.new(0.5,0,-0.5,0)})
two:Play()
two.Completed:Connect(function() screenGui:Destroy() end)
end)
local dragging = false; local 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 = mainFrame.Position
end
end)
topBar.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,-10,0,30), BackgroundColor3=theme["Color Stroke"], TextColor3=theme["Color Text"], Font=Enum.Font.GothamBold, TextSize=16}, self.Sidebar)
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(self.Tabs, tabObject)
tabButton.MouseButton1Click:Connect(function()
for _, t in ipairs(self.Tabs) do t.Content.Visible = false end
tabObject.Content.Visible = true
end)
if #self.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,-20,0,sectionHeight), BackgroundColor3=theme["Color Hub 2"], BackgroundTransparency=0.2}, self.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=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}
table.insert(self.Sections, sectionObj)
function sectionObj:addMenu(menuName)
menuName = menuName or "Menu"
local menuFrame = createInstance("Frame", {Name=menuName, Size=UDim2.new(1,0,0,40), BackgroundColor3=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=theme["Color Text"], Font=Enum.Font.GothamBold, TextSize=16}, menuFrame)
return menuFrame
end
function sectionObj: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", {Size = UDim2.new(1, -10, 0, 20), BackgroundColor3 = Color3.fromRGB(40,40,40)}, self.Content)
createInstance("UICorner", {CornerRadius = UDim.new(0,20)}, toggleFrame)
local label = createInstance("TextLabel", {Size = UDim2.new(0.4, -5, 1, 0), Position = UDim2.new(0,5,0,0), BackgroundTransparency = 1, Text = toggleTitle, TextColor3 = theme["Color Text"], Font = Enum.Font.Gotham, TextSize = 12}, toggleFrame)
local toggleContainer = createInstance("Frame", {Size = UDim2.new(0.6, -5, 1, 0), Position = UDim2.new(0.4,5,0,0), BackgroundTransparency = 1}, toggleFrame)
local toggleSwitch = createInstance("Frame", {Size = UDim2.new(1,0,1,0), BackgroundColor3 = default and Color3.fromRGB(0,200,0) or Color3.fromRGB(100,100,100), BorderSizePixel = 0}, toggleContainer)
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 CheckToggle = default
if default then callback(true) else callback(false) end
toggleSwitch.MouseEnter:Connect(function()
tweenProperty(label, {TextTransparency = 0.5}, 0.15)
tweenProperty(toggleSwitch, {BackgroundColor3 = Color3.fromRGB(30,30,30)}, 0.15)
end)
toggleSwitch.MouseLeave:Connect(function()
tweenProperty(label, {TextTransparency = 0}, 0.15)
tweenProperty(toggleSwitch, {BackgroundColor3 = CheckToggle and Color3.fromRGB(0,200,0) or Color3.fromRGB(100,100,100)}, 0.15)
end)
toggleSwitch.MouseButton1Click:Connect(function()
if not CheckToggle 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
CheckToggle = not CheckToggle
callback(CheckToggle)
end)
return toggleFrame
end
function sectionObj: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
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)
local label = createInstance("TextLabel", {Name = "Label", Text = sliderName, Size = UDim2.new(0.4,0,1,0), Position = UDim2.new(0,0,0,0), BackgroundTransparency = 1, TextColor3 = theme["Color Text"], Font = Enum.Font.Gotham, TextSize = 8}, sliderFrame)
local sliderContainer = createInstance("Frame", {Name = "SliderContainer", Size = UDim2.new(0.6,0,1,0), Position = UDim2.new(0.4,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 = 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 = 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)
pcall(callback, value)
end
end)
return sliderFrame
end
function sectionObj: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)
local label = createInstance("TextLabel", {Name = "Label", Text = textBoxName, Size = UDim2.new(0.4,0,1,0), Position = UDim2.new(0,0,0,0), BackgroundTransparency = 1, TextColor3 = theme["Color Text"], Font = Enum.Font.Gotham, TextSize = 8}, textBoxFrame)
local textbox = createInstance("TextBox", {Name = "Input", Text = defaultText, Size = UDim2.new(0.6,0,1,0), Position = UDim2.new(0.4,0,0,0), BackgroundColor3 = theme["Color Stroke"], TextColor3 = theme["Color Text"], Font = Enum.Font.Gotham, TextSize = 8}, textBoxFrame)
textbox.FocusLost:Connect(function(enterPressed)
pcall(callback, textbox.Text)
end)
return textBoxFrame
end
function sectionObj:addDropdown(options)
options = options or {}
local dropdownTile = options.Name or "Dropdown"
local default = options.Default or ""
local list = options.Items or {}
local callback = options.Callback or function(selected) end
local row = createInstance("Frame", {Size = UDim2.new(1, -10, 0, 20), BackgroundColor3 = theme["Color Stroke"]}, self.Content)
createInstance("UICorner", {CornerRadius = UDim.new(0,20)}, row)
local label = createInstance("TextLabel", {Size = UDim2.new(0.4, -5, 1, 0), Position = UDim2.new(0,5,0,0), BackgroundTransparency = 1, Text = dropdownTile, TextColor3 = theme["Color Text"], Font = Enum.Font.Gotham, TextSize = 12}, row)
local dropdownButton = createInstance("TextButton", {Size = UDim2.new(0.6, -5, 1, 0), Position = UDim2.new(0.4,5,0,0), Text = (default ~= "" and (default .. "") or "Select ▼"), BackgroundColor3 = theme["Color Theme"], Font = Enum.Font.GothamBold, TextSize = 12}, row)
local scrollDown = createInstance("Frame", {Size = UDim2.new(1, -10, 0, 0), BackgroundColor3 = Color3.fromRGB(40,40,40), BorderSizePixel = 0, ClipsDescendants = true}, self.Content)
local listLayout = createInstance("UIListLayout", {Padding = UDim.new(0,3), HorizontalAlignment = Enum.HorizontalAlignment.Center, SortOrder = Enum.SortOrder.LayoutOrder}, scrollDown)
local dropdown_toggle = false
dropdownButton.MouseButton1Click:Connect(function()
if dropdown_toggle then
tweenProperty(scrollDown, {Size = UDim2.new(1, -10, 0, 0)}, 0.15)
tweenProperty(dropdownButton, {TextColor3 = theme["Color Text"]}, 0.15)
else
local targetHeight = listLayout.AbsoluteContentSize.Y + 5
tweenProperty(scrollDown, {Size = UDim2.new(1, -10, 0, targetHeight)}, 0.15)
tweenProperty(dropdownButton, {TextColor3 = Color3.fromRGB(0,255,0)}, 0.15)
end
dropdown_toggle = not dropdown_toggle
end)
for _, option in ipairs(list) 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 = 12}, scrollDown)
btn.MouseButton1Click:Connect(function()
label.Text = dropdownTile .. " - " .. option
pcall(callback, option)
tweenProperty(scrollDown, {Size = UDim2.new(1, -10, 0, 0)}, 0.15)
dropdown_toggle = false
end)
end
return row
end
function sectionObj: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", {Size = UDim2.new(1,0,0,30), BackgroundTransparency = 1}, self.Content)
local label = createInstance("TextLabel", {Text = labelText, Size = UDim2.new(0.4,0,1,0), Position = UDim2.new(0,0,0,0), BackgroundTransparency = 1, TextColor3 = theme["Color Text"], Font = Enum.Font.Gotham, TextSize = 8, TextXAlignment = Enum.TextXAlignment.Left}, container)
local button = createInstance("TextButton", {Text = buttonText, Size = UDim2.new(0.6,0,0.8,0), Position = UDim2.new(0.4,0,0.1,0), BackgroundColor3 = theme["Color Theme"], TextColor3 = theme["Color Text"], Font = Enum.Font.GothamBold, TextSize = 8}, container)
createInstance("UICorner", {CornerRadius = UDim.new(0,6)}, button)
button.MouseButton1Click:Connect(function() pcall(callback) end)
return container
end
return sectionObj
end
return tabObject
end
return windowObject
end
function JustHub:ShowLoadingScreen(duration, callback)
duration = duration or 3
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 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 ti = TweenInfo.new(duration, Enum.EasingStyle.Quad, Enum.EasingDirection.Out)
local tw = TweenService:Create(progressBarFill, ti, {Size=UDim2.new(1,0,1,0)})
tw:Play()
spawn(function()
while tw.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)
tw.Completed:Connect(function() loadingGui:Destroy() callback() end)
end
function JustHub:SaveConfig(config)
if writefile then
local json = HttpService:JSONEncode(config)
writefile("JustHub_Config.json", json)
print("Config saved!")
else
warn("Saving config is not supported in this environment.")
end
end
function JustHub:LoadConfig()
if readfile then
local data = readfile("JustHub_Config.json")
local config = HttpService:JSONDecode(data)
print("Config loaded!")
return config
else
warn("Loading config is not supported in this environment.")
return {}
end
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==Enum.KeyCode.RightShift then
JustHub:ToggleUIVisibility()
end
end)
function JustHub:Notify(options)
options = options or {}
local title = options.Title or ""
local message = options.Message or ""
local duration = options.Duration or 3
local theme = getCurrentTheme(options.Theme) or JustHub.Themes[JustHub.Save.Theme]
local player = Players.LocalPlayer
local playerGui = player:WaitForChild("PlayerGui")
local notificationContainer = playerGui:FindFirstChild("NotificationContainer")
if not notificationContainer then
notificationContainer = createInstance("ScreenGui", {Name="NotificationContainer", ResetOnSpawn=false}, playerGui)
local containerFrame = createInstance("Frame", {Name="Container", AnchorPoint=Vector2.new(1,1), Position=UDim2.new(1,-10,1,-10), Size=UDim2.new(0,300,0,0), BackgroundTransparency=1}, notificationContainer)
createInstance("UIListLayout", {SortOrder=Enum.SortOrder.LayoutOrder, Padding=UDim.new(0,10), VerticalAlignment=Enum.VerticalAlignment.Bottom}, containerFrame)
notificationContainer.Container = containerFrame
end
local containerFrame = notificationContainer.Container
local notificationFrame = createInstance("Frame", {Name="Notification", Size=UDim2.new(1,0,0,80), BackgroundColor3=theme["Color Hub 2"], BackgroundTransparency=1}, containerFrame)
createInstance("UICorner", {CornerRadius=UDim.new(0,8)}, notificationFrame)
createInstance("UIStroke", {Color=theme["Color Stroke"], Thickness=1}, notificationFrame)
local titleLabel = createInstance("TextLabel", {Name="Title", Text=title, Size=UDim2.new(1,-10,0,20), Position=UDim2.new(0,5,0,5), BackgroundTransparency=1, TextColor3=theme["Color Text"], Font=Enum.Font.GothamBold, TextSize=16, TextXAlignment=Enum.TextXAlignment.Left}, notificationFrame)
local messageLabel = createInstance("TextLabel", {Name="Message", Text=message, Size=UDim2.new(1,-10,0,40), Position=UDim2.new(0,5,0,30), BackgroundTransparency=1, TextColor3=theme["Color Dark Text"], Font=Enum.Font.Gotham, TextSize=14, TextXAlignment=Enum.TextXAlignment.Left, TextWrapped=true}, notificationFrame)
tweenProperty(notificationFrame, {BackgroundTransparency=0}, 0.5)
tweenProperty(titleLabel, {TextTransparency=0}, 0.5)
tweenProperty(messageLabel, {TextTransparency=0}, 0.5)
delay(duration, function()
tweenProperty(notificationFrame, {BackgroundTransparency=1}, 0.5)
tweenProperty(titleLabel, {TextTransparency=1}, 0.5)
tweenProperty(messageLabel, {TextTransparency=1}, 0.5).Completed:Connect(function() notificationFrame:Destroy() end)
end)
end
return JustHub