ScriptRoblox/Library/JustHub (1).lua

709 lines
31 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=100,Theme="Darker"}
JustHub.ConfigData = {}
JustHub.ControlRegistry = {}
local function createInstance(c,p,par)
local i=Instance.new(c)
if p then
for k,v in pairs(p) do
i[k]=v
end
end
if par then
i.Parent=par
end
return i
end
local function tweenProperty(o,t,d)
local ti=TweenInfo.new(d,Enum.EasingStyle.Quad,Enum.EasingDirection.Out)
local tw=TweenService:Create(o,ti,t)
tw:Play()
return tw
end
local function getCurrentTheme(c)
if type(c)=="table" then
return c
else
return JustHub.Themes[c or JustHub.Save.Theme]
end
end
local function clampPosition(pos,sz)
local x=math.clamp(pos.X.Offset,0,sz.X)
local y=math.clamp(pos.Y.Offset,0,sz.Y)
return UDim2.new(pos.X.Scale,x,pos.Y.Scale,y)
end
local function addBorder(o,col,th)
return createInstance("UIStroke",{Color=col,Thickness=th},o)
end
function JustHub:RegisterControl(k,u)
JustHub.ControlRegistry[k]=u
end
function JustHub:ApplyConfig(cf)
for k,v in pairs(cf) do
if JustHub.ControlRegistry[k] then
JustHub.ControlRegistry[k](v)
end
end
end
local function parseKey(str)
for _,kc in pairs(Enum.KeyCode:GetEnumItems()) do
if kc.Name:lower()==str:lower() then
return kc
end
end
return nil
end
local SectionMethods={}
function SectionMethods:addMenu(n)
n=n or "Menu"
local f=createInstance("Frame",{Name=n,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)},f)
createInstance("TextLabel",{Name="MenuLabel",Text=n,Size=UDim2.new(1,0,1,0),BackgroundTransparency=1,TextColor3=getCurrentTheme(JustHub.Save.Theme)["Color Text"],Font=Enum.Font.GothamBold,TextSize=16},f)
return f
end
function SectionMethods:addToggle(o)
o=o or {}
local t=o.Name or "Toggle"
local d=o.Default or false
local cb=o.Callback or function(x)end
local f=createInstance("Frame",{Name=t.."Toggle",Size=UDim2.new(1,0,0,20),BackgroundColor3=Color3.fromRGB(40,40,40)},self.Content)
createInstance("UICorner",{CornerRadius=UDim.new(0,20)},f)
addBorder(f,getCurrentTheme(JustHub.Save.Theme)["Color Stroke"],1)
local l=createInstance("TextLabel",{Size=UDim2.new(0.7,0,1,0),Position=UDim2.new(0,0,0,0),BackgroundTransparency=1,Text=t,TextColor3=getCurrentTheme(JustHub.Save.Theme)["Color Text"],Font=Enum.Font.Gotham,TextSize=12,TextXAlignment=Enum.TextXAlignment.Left},f)
local sep=createInstance("Frame",{Size=UDim2.new(0,2,1,0),Position=UDim2.new(0.7,0,0,0),BackgroundColor3=Color3.fromRGB(255,255,255)},f)
createInstance("UICorner",{CornerRadius=UDim.new(0,1)},sep)
local tc=createInstance("Frame",{Size=UDim2.new(0.3,0,1,0),Position=UDim2.new(0.7,0,0,0),BackgroundTransparency=1},f)
local sw=createInstance("Frame",{Size=UDim2.new(0,35,0,15),Position=UDim2.new(1,-35,0.5,-7.5),BackgroundColor3=d and Color3.fromRGB(0,200,0) or Color3.fromRGB(100,100,100),BorderSizePixel=0},tc)
sw.Active=true
sw.Selectable=true
createInstance("UICorner",{CornerRadius=UDim.new(0,15)},sw)
local c=createInstance("Frame",{Size=UDim2.new(0,13,0,13),Position=d 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},sw)
createInstance("UICorner",{CornerRadius=UDim.new(1,0)},c)
local s=d
if d then cb(true) else cb(false) end
JustHub.ConfigData[t]=s
JustHub:RegisterControl(t,function(v)
s=v
if s then
c.Position=UDim2.new(0,20,0.5,-6.5)
sw.BackgroundColor3=Color3.fromRGB(0,200,0)
l.TextColor3=Color3.fromRGB(0,255,0)
else
c.Position=UDim2.new(0,2,0.5,-6.5)
sw.BackgroundColor3=Color3.fromRGB(100,100,100)
l.TextColor3=Color3.fromRGB(255,255,255)
end
end)
sw.InputBegan:Connect(function(i)
if i.UserInputType==Enum.UserInputType.MouseButton1 or i.UserInputType==Enum.UserInputType.Touch then
if not s then
tweenProperty(c,{Position=UDim2.new(0,20,0.5,-6.5)},0.3)
tweenProperty(sw,{BackgroundColor3=Color3.fromRGB(0,200,0)},0.3)
tweenProperty(l,{TextColor3=Color3.fromRGB(0,255,0)},0.3)
else
tweenProperty(c,{Position=UDim2.new(0,2,0.5,-6.5)},0.3)
tweenProperty(sw,{BackgroundColor3=Color3.fromRGB(100,100,100)},0.3)
tweenProperty(l,{TextColor3=Color3.fromRGB(255,255,255)},0.3)
end
s=not s
JustHub.ConfigData[t]=s
cb(s)
end
end)
return f
end
function SectionMethods:addSlider(o)
o=o or {}
local n=o.Name or "Slider"
local mi=o.Min or 0
local ma=o.Max or 100
local df=o.Default or mi
if JustHub.ConfigData[n]~=nil then
df=JustHub.ConfigData[n]
else
JustHub.ConfigData[n]=df
end
local cb=o.Callback or function(x)end
local f=createInstance("Frame",{Name=n.."Slider",Size=UDim2.new(1,0,0,25),BackgroundTransparency=1},self.Content)
addBorder(f,getCurrentTheme(JustHub.Save.Theme)["Color Stroke"],1)
local l=createInstance("TextLabel",{Name="Label",Text=n,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},f)
local sep=createInstance("Frame",{Size=UDim2.new(0,2,1,0),Position=UDim2.new(0.7,0,0,0),BackgroundColor3=Color3.fromRGB(255,255,255)},f)
createInstance("UICorner",{CornerRadius=UDim.new(0,1)},sep)
local sc=createInstance("Frame",{Name="SliderContainer",Size=UDim2.new(0.3,0,1,0),Position=UDim2.new(0.7,0,0,0),BackgroundTransparency=1},f)
local sb=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"]},sc)
createInstance("UICorner",{CornerRadius=UDim.new(0,4)},sb)
local sh=createInstance("Frame",{Name="SliderHandle",Size=UDim2.new(0,12,0,12),BackgroundColor3=getCurrentTheme(JustHub.Save.Theme)["Color Theme"],Position=UDim2.new((df-mi)/(ma-mi),-6,0.5,-6)},sb)
createInstance("UICorner",{CornerRadius=UDim.new(0,4)},sh)
local drag=false
sh.InputBegan:Connect(function(i)
if i.UserInputType==Enum.UserInputType.MouseButton1 or i.UserInputType==Enum.UserInputType.Touch then drag=true end
end)
sh.InputEnded:Connect(function(i)
if i.UserInputType==Enum.UserInputType.MouseButton1 or i.UserInputType==Enum.UserInputType.Touch then drag=false end
end)
UserInputService.InputChanged:Connect(function(i)
if drag and (i.UserInputType==Enum.UserInputType.MouseMovement or i.UserInputType==Enum.UserInputType.Touch) then
local bp=sb.AbsolutePosition.X
local bw=sb.AbsoluteSize.X
local rp=math.clamp((i.Position.X-bp)/bw,0,1)
sh.Position=UDim2.new(rp,-6,sh.Position.Y.Scale,sh.Position.Y.Offset)
local val=mi+rp*(ma-mi)
JustHub.ConfigData[n]=val
cb(val)
end
end)
JustHub:RegisterControl(n,function(sv)
local nr=(sv-mi)/(ma-mi)
sh.Position=UDim2.new(nr,-6,0.5,-6)
end)
return f
end
function SectionMethods:addTextBox(o)
o=o or {}
local n=o.Name or "TextBox"
local d=o.Default or ""
local cb=o.Callback or function(x)end
local f=createInstance("Frame",{Name=n.."TextBox",Size=UDim2.new(1,0,0,20),BackgroundTransparency=1},self.Content)
addBorder(f,getCurrentTheme(JustHub.Save.Theme)["Color Stroke"],1)
local l=createInstance("TextLabel",{Name="Label",Text=n,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},f)
local tb=createInstance("TextBox",{Name="Input",Text=d,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},f)
tb.FocusLost:Connect(function(e)
JustHub.ConfigData[n]=tb.Text
cb(tb.Text)
end)
JustHub:RegisterControl(n,function(sv)
tb.Text=sv
end)
return f
end
function SectionMethods:addDropdown(o)
o=o or {}
local t=o.Name or "Dropdown"
local df=o.Default or ""
local it=o.Items or {}
local cb=o.Callback or function(x)end
local ch=20
local oh=ch+(#it*20+((#it-1)*2))
local f=createInstance("Frame",{Name=t.."Dropdown",BackgroundTransparency=1},self.Content)
f.Size=UDim2.new(1,0,0,ch)
addBorder(f,getCurrentTheme(JustHub.Save.Theme)["Color Stroke"],1)
local l=createInstance("TextLabel",{Name="Label",Text=t,Size=UDim2.new(0.7,0,0,ch),Position=UDim2.new(0,0,0,0),BackgroundTransparency=1,TextColor3=getCurrentTheme(JustHub.Save.Theme)["Color Text"],Font=Enum.Font.Gotham,TextSize=10},f)
local b=createInstance("TextButton",{Name="DropdownButton",Text=(df~="" and (df.."") or "Select ▼"),Size=UDim2.new(0.3,0,0,ch),Position=UDim2.new(0.7,0,0,0),BackgroundColor3=getCurrentTheme(JustHub.Save.Theme)["Color Stroke"],Font=Enum.Font.GothamBold,TextSize=10},f)
local lf=createInstance("Frame",{Name="DropdownList",BackgroundColor3=getCurrentTheme(JustHub.Save.Theme)["Color Hub 2"],Visible=false,Position=UDim2.new(0,0,0,ch)},f)
lf.Size=UDim2.new(1,0,0,#it*20+((#it-1)*2))
createInstance("UIListLayout",{Padding=UDim.new(0,2),SortOrder=Enum.SortOrder.LayoutOrder,HorizontalAlignment=Enum.HorizontalAlignment.Left},lf)
local dt=false
b.MouseButton1Click:Connect(function()
if dt then
tweenProperty(f,{Size=UDim2.new(1,0,0,ch)},0.2)
tweenProperty(b,{TextColor3=getCurrentTheme(JustHub.Save.Theme)["Color Text"]},0.2)
tweenProperty(lf,{Position=UDim2.new(0,0,0,ch-10)},0.2)
wait(0.2)
lf.Visible=false
else
lf.Position=UDim2.new(0,0,0,ch-10)
lf.Visible=true
tweenProperty(f,{Size=UDim2.new(1,0,0,oh)},0.2)
tweenProperty(b,{TextColor3=Color3.fromRGB(0,255,0)},0.2)
tweenProperty(lf,{Position=UDim2.new(0,0,0,ch)},0.2)
end
dt=not dt
end)
for _,op in ipairs(it) do
local btn=createInstance("TextButton",{Size=UDim2.new(1,0,0,20),Text=op,TextColor3=Color3.fromRGB(255,255,255),BackgroundTransparency=1,Font=Enum.Font.Gotham,TextSize=10},lf)
btn.MouseButton1Click:Connect(function()
l.Text=t.." - "..op
JustHub.ConfigData[t]=op
pcall(cb,op)
tweenProperty(f,{Size=UDim2.new(1,0,0,ch)},0.2)
dt=false
wait(0.2)
lf.Visible=false
end)
end
JustHub.ConfigData[t]=df
JustHub:RegisterControl(t,function(sv)
l.Text=t.." - "..sv
end)
local upd={}
function upd:Clear()
for i,v in pairs(lf:GetChildren()) do
if v:IsA("TextButton") then
v:Destroy()
dt=false
l.Text=t
tweenProperty(f,{Size=UDim2.new(1,0,0,ch)},0.2)
end
end
end
function upd:Refresh(nl)
nl=nl or {}
for i,v in pairs(nl) 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},lf)
btn.MouseButton1Click:Connect(function()
dt=false
l.Text=t.." - "..v
pcall(cb,v)
tweenProperty(f,{Size=UDim2.new(1,0,0,ch)},0.2)
end)
end
end
return upd
end
function SectionMethods:addButton(o)
o=o or {}
local n=o.Name or "Button"
local bt=o.ButtonText or "Click"
local cb=o.Callback or function()end
local c=createInstance("Frame",{Name=n.."ButtonControl",Size=UDim2.new(1,0,0,30),BackgroundTransparency=1},self.Content)
addBorder(c,getCurrentTheme(JustHub.Save.Theme)["Color Stroke"],1)
local l=createInstance("TextLabel",{Name="Label",Text=n,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},c)
local b=createInstance("TextButton",{Name="ActionButton",Text=bt,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},c)
createInstance("UICorner",{CornerRadius=UDim.new(0,6)},b)
b.MouseButton1Click:Connect(function()
pcall(cb)
end)
return c
end
function SectionMethods:addBind(o)
o=o or {}
local n=o.Name or "KeyBind"
local d=o.Default or "RightShift"
local cb=o.Callback or function()end
local c=createInstance("Frame",{Name=n.."BindControl",Size=UDim2.new(1,0,0,30),BackgroundTransparency=1},self.Content)
addBorder(c,getCurrentTheme(JustHub.Save.Theme)["Color Stroke"],1)
local l=createInstance("TextLabel",{Name="Label",Text=n,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},c)
local tb=createInstance("TextBox",{Name="BindInput",Text=d,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},c)
local currentKey
local conn
local function parseKey(str)
for _,k in pairs(Enum.KeyCode:GetEnumItems()) do
if k.Name:lower()==str:lower() then
return k
end
end
return nil
end
local function setKey(k)
local kc=parseKey(k)
if kc then
if conn then conn:Disconnect() end
currentKey=kc
conn=UserInputService.InputBegan:Connect(function(i,g)
if not g and i.KeyCode==currentKey then
pcall(cb)
end
end)
JustHub.ConfigData[n]=k
end
end
setKey(d)
tb.FocusLost:Connect(function(enterPressed)
setKey(tb.Text)
end)
JustHub:RegisterControl(n,function(sv)
tb.Text=sv
setKey(sv)
end)
return c
end
function JustHub:addSection(sn,sh)
sn=sn or "Section"
sh=sh or 100
local sf=createInstance("Frame",{Name=sn,Size=UDim2.new(1,0,0,sh),BackgroundColor3=getCurrentTheme(JustHub.Save.Theme)["Color Hub 2"],BackgroundTransparency=0},nil)
addBorder(sf,getCurrentTheme(JustHub.Save.Theme)["Color Stroke"],2)
createInstance("UICorner",{CornerRadius=UDim.new(0,8)},sf)
local st=createInstance("TextLabel",{Name="SectionTitle",Text=sn,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},sf)
local sc=createInstance("Frame",{Name="SectionContent",Size=UDim2.new(1,0,1,-30),Position=UDim2.new(0,0,0,30),BackgroundTransparency=1},sf)
createInstance("UIListLayout",{FillDirection=Enum.FillDirection.Vertical,Padding=UDim.new(0,5),SortOrder=Enum.SortOrder.LayoutOrder,HorizontalAlignment=Enum.HorizontalAlignment.Left},sc)
local so={Frame=sf,Title=st,Content=sc}
setmetatable(so,{__index=SectionMethods})
return so
end
function JustHub:CreateWindow(o)
o=o or {}
local wn=o.Name or "JustHub Window"
local th=getCurrentTheme(o.Theme)
local gid=HttpService:GenerateGUID(false)
local ft=wn.." ["..gid.."]"
local pl=Players.LocalPlayer
local pg=pl:WaitForChild("PlayerGui")
local sg=createInstance("ScreenGui",{Name="JustHub",ResetOnSpawn=false},pg)
self.ScreenGui=sg
local uw=JustHub.Save.UISize[1]
local uh=JustHub.Save.UISize[2]
local mf=createInstance("Frame",{Name="MainFrame",AnchorPoint=Vector2.new(0.5,0.5),Position=UDim2.new(0.5,0,-0.5,0),Size=UDim2.new(0,uw,0,uh),BackgroundColor3=th["Color Hub 2"]},sg)
createInstance("UICorner",{CornerRadius=UDim.new(0,12)},mf)
addBorder(mf,th["Color Stroke"],2)
local tb=createInstance("Frame",{Name="TopBar",Size=UDim2.new(1,0,0,60),BackgroundColor3=th["Color Hub 2"]},mf)
createInstance("UICorner",{CornerRadius=UDim.new(0,12)},tb)
local tl=createInstance("TextLabel",{Name="TitleLabel",Size=UDim2.new(1,-180,1,0),Position=UDim2.new(0,10,0,0),BackgroundTransparency=1,Text=ft,TextColor3=th["Color Text"],Font=Enum.Font.GothamBold,TextSize=18,TextXAlignment=Enum.TextXAlignment.Left},tb)
local wl=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, "..pl.Name,TextColor3=th["Color Text"],Font=Enum.Font.GothamBold,TextSize=16,TextXAlignment=Enum.TextXAlignment.Left},mf)
local function ccb(n,s,p)
local b=createInstance("TextButton",{Name=n,Text=s,Size=UDim2.new(0,40,0,40),Position=p,BackgroundTransparency=1,TextColor3=th["Color Text"],Font=Enum.Font.GothamBold,TextSize=24},tb)
return b
end
local hb=ccb("HideButton","",UDim2.new(1,-110,0,10))
local xb=ccb("MaxButton","",UDim2.new(1,-70,0,10))
local cb=ccb("CloseButton","X",UDim2.new(1,-30,0,10))
local sw=JustHub.Save.TabSize
local sb=createInstance("Frame",{Name="Sidebar",Size=UDim2.new(0,sw,1,-60),Position=UDim2.new(0,0,0,60),BackgroundColor3=th["Color Hub 2"]},mf)
createInstance("UICorner",{CornerRadius=UDim.new(0,10)},sb)
createInstance("UIListLayout",{FillDirection=Enum.FillDirection.Vertical,Padding=UDim.new(0,10),HorizontalAlignment=Enum.HorizontalAlignment.Center,VerticalAlignment=Enum.VerticalAlignment.Top},sb)
local cc=createInstance("Frame",{Name="ContentContainer",Size=UDim2.new(1,-sw,1,-60),Position=UDim2.new(0,sw,0,60),BackgroundColor3=th["Color Hub 2"]},mf)
createInstance("UICorner",{CornerRadius=UDim.new(0,10)},cc)
local sf=createInstance("ScrollingFrame",{Size=UDim2.new(1,0,1,0),BackgroundTransparency=1,ScrollBarThickness=8,BorderSizePixel=0},cc)
createInstance("UIListLayout",{SortOrder=Enum.SortOrder.LayoutOrder,Padding=UDim.new(0,10),HorizontalAlignment=Enum.HorizontalAlignment.Left},sf)
local fl=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=th["Color Text"],Font=Enum.Font.Gotham,TextSize=14,Text="FPS: Calculating..."},mf)
RunService.Heartbeat:Connect(function(d)
local fps=math.floor(1/d)
fl.Text="FPS: "..fps
end)
local i=TweenInfo.new(0.5,Enum.EasingStyle.Back,Enum.EasingDirection.Out)
local tin=TweenService:Create(mf,i,{Position=UDim2.new(0.5,0,0.5,0)})
tin:Play()
local minimized=false
local maximized=false
local osz=mf.Size
local op=mf.Position
hb.MouseButton1Click:Connect(function()
if not minimized then
tweenProperty(mf,{Size=UDim2.new(osz.X.Scale,osz.X.Offset,0,60)},0.3)
wl.Visible=false
sb.Visible=false
cc.Visible=false
fl.Visible=false
minimized=true
else
tweenProperty(mf,{Size=osz},0.3)
wait(0.3)
wl.Visible=true
sb.Visible=true
cc.Visible=true
fl.Visible=true
minimized=false
end
end)
xb.MouseButton1Click:Connect(function()
if not maximized then
tweenProperty(mf,{Size=UDim2.new(1,0,1,0),Position=UDim2.new(0.5,0,0.5,0)},0.3)
maximized=true
else
tweenProperty(mf,{Size=osz,Position=op},0.3)
maximized=false
end
end)
cb.MouseButton1Click:Connect(function()
local toi=TweenInfo.new(0.5,Enum.EasingStyle.Back,Enum.EasingDirection.In)
local tout=TweenService:Create(mf,toi,{Position=UDim2.new(0.5,0,-0.5,0)})
tout:Play()
tout.Completed:Connect(function()
mf.Visible=false
local plr=Players.LocalPlayer
local pg2=plr:WaitForChild("PlayerGui")
local sg2=Instance.new("ScreenGui")
sg2.Name="ShowUI"
sg2.ResetOnSpawn=false
sg2.Parent=pg2
local showBtn=Instance.new("TextButton")
showBtn.Name="ShowUIButton"
showBtn.Size=UDim2.new(0,150,0,50)
showBtn.Position=UDim2.new(0.5,-75,0,0)
showBtn.BackgroundColor3=th["Color Hub 2"]
showBtn.Text="Show UI"
showBtn.TextColor3=Color3.fromRGB(128,0,128)
showBtn.Font=Enum.Font.GothamBold
showBtn.TextSize=20
createInstance("UICorner",{CornerRadius=UDim.new(0,25)},showBtn)
createInstance("UIStroke",{Color=th["Color Theme"],Thickness=1},showBtn)
showBtn.Parent=sg2
showBtn.MouseButton1Click:Connect(function()
mf.Visible=true
tweenProperty(mf,{Position=UDim2.new(0.5,0,0.5,0)},0.5)
sg2:Destroy()
end)
end)
end)
mf.Active=true
local dragging=false
local dragStart,startPos
mf.InputBegan:Connect(function(input)
if input.UserInputType==Enum.UserInputType.MouseButton1 or input.UserInputType==Enum.UserInputType.Touch then
dragging=true
dragStart=input.Position
startPos=mf.Position
end
end)
mf.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 np=UDim2.new(startPos.X.Scale,startPos.X.Offset+delta.X,startPos.Y.Scale,startPos.Y.Offset+delta.Y)
np=clampPosition(np,Vector2.new(sg.AbsoluteSize.X,sg.AbsoluteSize.Y))
mf.Position=np
end
end)
UserInputService.InputEnded:Connect(function(input)
if input.UserInputType==Enum.UserInputType.MouseButton1 or input.UserInputType==Enum.UserInputType.Touch then
dragging=false
end
end)
local notiContainer=createInstance("Frame",{Name="NotificationContainer",AnchorPoint=Vector2.new(1,1),Position=UDim2.new(1,-10,1,-10),Size=UDim2.new(0,300,1,-20),BackgroundTransparency=1},sg)
local notiLayout=createInstance("UIListLayout",{Padding=UDim.new(0,8),HorizontalAlignment=Enum.HorizontalAlignment.Right,VerticalAlignment=Enum.VerticalAlignment.Bottom,SortOrder=Enum.SortOrder.LayoutOrder},notiContainer)
self.NotificationContainer=notiContainer
local wObj={ScreenGui=sg,MainFrame=mf,TopBar=tb,Sidebar=sb,ContentContainer=cc,Tabs={}}
function wObj:addTab(tn)
tn=tn or "Tab"
local b=createInstance("TextButton",{Name=tn.."Button",Text=tn,Size=UDim2.new(1,0,0,20),BackgroundColor3=th["Color Stroke"],TextColor3=Color3.fromRGB(128,0,128),Font=Enum.Font.GothamBold,TextSize=12},sb)
createInstance("UICorner",{CornerRadius=UDim.new(0,10)},b)
createInstance("UIStroke",{Color=th["Color Theme"],Thickness=1},b)
local tc=createInstance("Frame",{Name=tn.."Content",Size=UDim2.new(1,0,1,0),BackgroundTransparency=1,Visible=false},sf)
local tObj={Name=tn,Button=b,Content=tc,Sections={}}
table.insert(wObj.Tabs,tObj)
b.MouseButton1Click:Connect(function()
for _,tt in ipairs(wObj.Tabs) do
tt.Content.Visible=false
end
tObj.Content.Visible=true
end)
if #wObj.Tabs==1 then
tObj.Content.Visible=true
end
function tObj:addSection(sn,sh)
sn=sn or "Section"
sh=sh or 80
local sframe=createInstance("Frame",{Name=sn,Size=UDim2.new(1,0,0,sh),BackgroundColor3=th["Color Hub 2"],BackgroundTransparency=0.0},tc)
createInstance("UICorner",{CornerRadius=UDim.new(0,8)},sframe)
addBorder(sframe,th["Color Stroke"],2)
local st=createInstance("TextLabel",{Name="SectionTitle",Text=sn,Size=UDim2.new(1,0,0,30),BackgroundTransparency=1,TextColor3=th["Color Text"],Font=Enum.Font.GothamBold,TextSize=14,TextXAlignment=Enum.TextXAlignment.Left},sframe)
local sc=createInstance("Frame",{Name="SectionContent",Size=UDim2.new(1,0,1,-30),Position=UDim2.new(0,0,0,30),BackgroundTransparency=1},sframe)
createInstance("UIListLayout",{FillDirection=Enum.FillDirection.Vertical,Padding=UDim.new(0,5),SortOrder=Enum.SortOrder.LayoutOrder,HorizontalAlignment=Enum.HorizontalAlignment.Left},sc)
local sObj={Frame=sframe,Title=st,Content=sc}
table.insert(tObj.Sections,sObj)
setmetatable(sObj,{__index=SectionMethods})
return sObj
end
return tObj
end
return wObj
end
function JustHub:ShowLoadingScreen(d,cb)
d=d or 5
cb=cb or function()end
local pl=Players.LocalPlayer
local pg=pl:WaitForChild("PlayerGui")
local lg=createInstance("ScreenGui",{Name="LoadingScreen",ResetOnSpawn=false,IgnoreGuiInset=true},pg)
local bg=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},lg)
local tl=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)},lg)
local wl=createInstance("TextLabel",{Text="Welcome, "..pl.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)},lg)
local pbc=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},lg)
createInstance("UICorner",{CornerRadius=UDim.new(0,4)},pbc)
local pbf=createInstance("Frame",{Size=UDim2.new(0,0,1,0),BackgroundColor3=getCurrentTheme(JustHub.Save.Theme)["Color Theme"],BorderSizePixel=0},pbc)
createInstance("UICorner",{CornerRadius=UDim.new(0,4)},pbf)
local tinfo=TweenInfo.new(d,Enum.EasingStyle.Quad,Enum.EasingDirection.Out)
local pt=TweenService:Create(pbf,tinfo,{Size=UDim2.new(1,0,1,0)})
pt:Play()
spawn(function()
while pt.PlaybackState==Enum.PlaybackState.Playing do
tweenProperty(tl,{TextTransparency=0.5},0.5)
wait(0.5)
tweenProperty(tl,{TextTransparency=0},0.5)
wait(0.5)
end
end)
pt.Completed:Connect(function()
wait(0.5)
lg:Destroy()
cb()
end)
end
function JustHub:InitializeUI(o)
self:ShowLoadingScreen(5,function()
local w=self:CreateWindow(o)
self.Window=w
end)
end
function JustHub:SaveConfig(f)
f=f or "JustHub_Config.json"
if writefile then
local j=HttpService:JSONEncode(JustHub.ConfigData)
writefile(f,j)
StarterGui:SetCore("SendNotification",{Title="Save Config",Text="Config berhasil disimpan ke "..f,Duration=5})
else
warn("Saving config is not supported in this environment.")
end
end
function JustHub:LoadConfig(f)
f=f or "JustHub_Config.json"
if readfile then
local d=readfile(f)
local c=HttpService:JSONDecode(d)
JustHub.ConfigData=c
JustHub:ApplyConfig(c)
StarterGui:SetCore("SendNotification",{Title="Load Config",Text="Config berhasil dimuat dari "..f,Duration=5})
return c
else
warn("Loading config is not supported in this environment.")
return {}
end
end
function JustHub:UpdateTheme(nt)
JustHub.Save.Theme=nt
local th=getCurrentTheme(nt)
if self.Window then
local mf=self.Window.MainFrame
mf.BackgroundColor3=th["Color Hub 2"]
local tb=self.Window.TopBar
tb.BackgroundColor3=th["Color Hub 2"]
local tl=tb:FindFirstChild("TitleLabel")
if tl then tl.TextColor3=th["Color Text"] end
local sb=self.Window.Sidebar
sb.BackgroundColor3=th["Color Hub 2"]
local cc=self.Window.ContentContainer
cc.BackgroundColor3=th["Color Hub 2"]
for _,tab in ipairs(self.Window.Tabs) do
if tab.Button then
tab.Button.BackgroundColor3=th["Color Stroke"]
tab.Button.TextColor3=th["Color Text"]
end
end
local fl=mf:FindFirstChild("FPSLabel",true)
if fl then
fl.TextColor3=th["Color Text"]
end
end
end
function JustHub:SetTheme(nt)
self:UpdateTheme(nt)
end
function JustHub:ToggleUIVisibility()
if self.ScreenGui and self.ScreenGui.Parent then
self.ScreenGui.Enabled=not self.ScreenGui.Enabled
end
end
function JustHub:Notify(o)
o=o or {}
local t=o.Title or ""
local m=o.Message or ""
local d=o.Duration or 5
local theme=getCurrentTheme(JustHub.Save.Theme)
if not self.NotificationContainer then
return
end
local nf=createInstance("Frame",{Size=UDim2.new(0,300,0,0),BackgroundTransparency=0,ClipsDescendants=true},self.NotificationContainer)
local corner=createInstance("UICorner",{CornerRadius=UDim.new(0,8)},nf)
local stroke=addBorder(nf,theme["Color Stroke"],2)
local grad=createInstance("UIGradient",{Color=theme["Color Hub 1"]},nf)
local tLabel=createInstance("TextLabel",{Text=t,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=14,TextXAlignment=Enum.TextXAlignment.Left},nf)
local mLabel=createInstance("TextLabel",{Text=m,Size=UDim2.new(1,-10,0,0),Position=UDim2.new(0,5,0,25),BackgroundTransparency=1,TextColor3=theme["Color Text"],Font=Enum.Font.Gotham,TextSize=12,TextWrapped=true,TextXAlignment=Enum.TextXAlignment.Left},nf)
mLabel.Size=UDim2.new(1,-10,0,mLabel.TextBounds.Y+5)
local fullHeight=mLabel.AbsolutePosition.Y+mLabel.AbsoluteSize.Y-nf.AbsolutePosition.Y+10
nf.Size=UDim2.new(0,300,0,fullHeight)
nf.BackgroundColor3=theme["Color Hub 2"]
nf.BackgroundTransparency=0.1
nf.Position=UDim2.new(1,0,1,0)
local inTween=TweenService:Create(nf,TweenInfo.new(0.3,Enum.EasingStyle.Quad,Enum.EasingDirection.Out),{Size=UDim2.new(0,300,0,fullHeight)})
inTween:Play()
spawn(function()
inTween.Completed:Wait()
wait(d)
local outTween=TweenService:Create(nf,TweenInfo.new(0.3,Enum.EasingStyle.Quad,Enum.EasingDirection.In),{BackgroundTransparency=1,Size=UDim2.new(0,300,0,0)})
outTween:Play()
outTween.Completed:Wait()
nf:Destroy()
end)
end
return JustHub