
KeylessUniversal

--// HOURS Subject Potions GUI (Pink/Black)
--// Drag-enabled + opacity variable at top
--// Unload hotkey: M (FULL unload: disconnects + destroys GUI)
-- =========================
-- SETTINGS (EDIT THESE)
-- =========================
local UI_OPACITY = 0.15
-- 0.00 = fully transparent, 1.00 = fully opaque
-- =========================
-- FULL UNLOAD + SINGLETON
-- =========================
local SINGLETON_KEY = "__HOURS_POTIONS_GUI_SINGLETON__"
local function safeDisconnect(conn)
if conn and typeof(conn) == "RBXScriptConnection" then
pcall(function() conn:Disconnect() end)
end
end
if getgenv and getgenv()[SINGLETON_KEY] and type(getgenv()[SINGLETON_KEY]) == "table" then
pcall(function()
local old = getgenv()[SINGLETON_KEY]
if old.Unload then old.Unload() end
end)
end
local Players = game:GetService("Players")
local UserInputService = game:GetService("UserInputService")
local TextService = game:GetService("TextService")
local lp = Players.LocalPlayer
local pg = lp:WaitForChild("PlayerGui")
local connections = {}
local gui
local function Unload()
for _, c in ipairs(connections) do
safeDisconnect(c)
end
table.clear(connections)
if gui then
pcall(function() gui:Destroy() end)
gui = nil
end
if getgenv then
getgenv()[SINGLETON_KEY] = nil
end
end
if getgenv then
getgenv()[SINGLETON_KEY] = { Unload = Unload }
end
-- =========================
-- POTION DATA
-- =========================
local potions = {
{ name = "Life", imbue = "L L L L", throw = "R L L L" },
{ name = "Water", imbue = "L L L R", throw = "R L L R" },
{ name = "Crystal", imbue = "L L L Q", throw = "R L L Q" },
{ name = "Earth", imbue = "L L R L", throw = "R L R L" },
{ name = "Wind", imbue = "L L R R", throw = "R L R R" },
{ name = "Blood", imbue = "L L R Q", throw = "R L R Q" },
{ name = "Lightning", imbue = "L R L Q", throw = "R R L Q" },
{ name = "Poison", imbue = "L R L R", throw = "R R L R" },
{ name = "Fire", imbue = "L R L L", throw = "R R L L" },
{ name = "Shadow", imbue = "L R R L", throw = "R R R L" },
{ name = "Frost", imbue = "L R R R", throw = "R R R R" },
{ name = "Nether", imbue = "L R R Q", throw = "R R R Q" },
}
local function buildPotionText()
local lines = {}
table.insert(lines, "HOURS • Subject Potions")
table.insert(lines, "------------------------")
table.insert(lines, "")
for _, p in ipairs(potions) do
table.insert(lines, string.format("%s (Imbue): %s", p.name, p.imbue))
table.insert(lines, string.format("%s (Throw): %s", p.name, p.throw))
table.insert(lines, "")
end
return table.concat(lines, "\n")
end
-- =========================
-- SIMPLE DRAG HELPER (Frame drag)
-- =========================
local function makeDraggable(frame, dragHandle)
dragHandle = dragHandle or frame
local dragging = false
local dragStart, startPos
local dragConn1, dragConn2
local function update(input)
local delta = input.Position - dragStart
frame.Position = UDim2.new(
startPos.X.Scale, startPos.X.Offset + delta.X,
startPos.Y.Scale, startPos.Y.Offset + delta.Y
)
end
dragConn1 = dragHandle.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
local endedConn
endedConn = input.Changed:Connect(function()
if input.UserInputState == Enum.UserInputState.End then
dragging = false
safeDisconnect(endedConn)
end
end)
end
end)
dragConn2 = dragHandle.InputChanged:Connect(function(input)
if input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch then
local moveConn
moveConn = UserInputService.InputChanged:Connect(function(i)
if dragging and i == input then
update(i)
end
end)
-- keep it lightweight: disconnect after drag ends
table.insert(connections, moveConn)
end
end)
table.insert(connections, dragConn1)
table.insert(connections, dragConn2)
end
-- =========================
-- GUI
-- =========================
gui = Instance.new("ScreenGui")
gui.Name = "HoursPotionsGui"
gui.ResetOnSpawn = false
gui.IgnoreGuiInset = true
gui.Parent = pg
local main = Instance.new("Frame")
main.Name = "Main"
main.AnchorPoint = Vector2.new(0.5, 0.5)
main.Position = UDim2.new(0.5, 0, 0.5, 0)
main.Size = UDim2.new(0, 520, 0, 420)
main.BackgroundColor3 = Color3.fromRGB(10, 10, 12)
main.BackgroundTransparency = math.clamp(1 - UI_OPACITY, 0, 1)
main.BorderSizePixel = 0
main.Parent = gui
local stroke = Instance.new("UIStroke")
stroke.Thickness = 2
stroke.Color = Color3.fromRGB(255, 105, 180)
stroke.Parent = main
local corner = Instance.new("UICorner")
corner.CornerRadius = UDim.new(0, 12)
corner.Parent = main
local title = Instance.new("TextLabel")
title.Name = "Title"
title.BackgroundTransparency = 1
title.Position = UDim2.new(0, 16, 0, 10)
title.Size = UDim2.new(1, -32, 0, 28)
title.Font = Enum.Font.GothamBold
title.TextSize = 20
title.TextXAlignment = Enum.TextXAlignment.Left
title.TextColor3 = Color3.fromRGB(255, 105, 180)
title.Text = "Subject Potions • Craft Combos"
title.Parent = main
local closeHint = Instance.new("TextLabel")
closeHint.Name = "CloseHint"
closeHint.BackgroundTransparency = 1
closeHint.Position = UDim2.new(0, 16, 0, 38)
closeHint.Size = UDim2.new(1, -32, 0, 18)
closeHint.Font = Enum.Font.Gotham
closeHint.TextSize = 13
closeHint.TextXAlignment = Enum.TextXAlignment.Left
closeHint.TextColor3 = Color3.fromRGB(210, 210, 210)
closeHint.Text = "Drag the title bar • Press M to unload"
closeHint.Parent = main
local scroll = Instance.new("ScrollingFrame")
scroll.Name = "Scroll"
scroll.Position = UDim2.new(0, 16, 0, 64)
scroll.Size = UDim2.new(1, -32, 1, -110)
scroll.BackgroundColor3 = Color3.fromRGB(16, 16, 20)
scroll.BackgroundTransparency = math.clamp(1 - UI_OPACITY, 0, 1)
scroll.BorderSizePixel = 0
scroll.ScrollBarThickness = 8
scroll.ScrollingDirection = Enum.ScrollingDirection.Y
scroll.CanvasSize = UDim2.new(0, 0, 0, 0)
scroll.Parent = main
local scrollCorner = Instance.new("UICorner")
scrollCorner.CornerRadius = UDim.new(0, 10)
scrollCorner.Parent = scroll
local scrollStroke = Instance.new("UIStroke")
scrollStroke.Thickness = 1
scrollStroke.Color = Color3.fromRGB(255, 105, 180)
scrollStroke.Transparency = 0.35
scrollStroke.Parent = scroll
local pad = Instance.new("UIPadding")
pad.PaddingTop = UDim.new(0, 10)
pad.PaddingBottom = UDim.new(0, 10)
pad.PaddingLeft = UDim.new(0, 10)
pad.PaddingRight = UDim.new(0, 10)
pad.Parent = scroll
local content = Instance.new("TextLabel")
content.Name = "Content"
content.BackgroundTransparency = 1
content.Size = UDim2.new(1, -20, 0, 0)
content.Position = UDim2.new(0, 0, 0, 0)
content.Font = Enum.Font.Code
content.TextSize = 16
content.TextXAlignment = Enum.TextXAlignment.Left
content.TextYAlignment = Enum.TextYAlignment.Top
content.TextColor3 = Color3.fromRGB(245, 245, 245)
content.TextWrapped = true
content.RichText = false
content.Parent = scroll
local tip = Instance.new("TextLabel")
tip.Name = "Tip"
tip.BackgroundTransparency = 1
tip.Position = UDim2.new(0, 16, 1, -40)
tip.Size = UDim2.new(1, -32, 0, 28)
tip.Font = Enum.Font.GothamSemibold
tip.TextSize = 14
tip.TextXAlignment = Enum.TextXAlignment.Left
tip.TextColor3 = Color3.fromRGB(255, 170, 220)
tip.Text = 'Tip: "Starts with L = Imbue, R = Throw".'
tip.Parent = main
local footer = Instance.new("TextLabel")
footer.Name = "Footer"
footer.BackgroundTransparency = 1
footer.Position = UDim2.new(0, 16, 1, -18)
footer.Size = UDim2.new(1, -32, 0, 16)
footer.Font = Enum.Font.Gotham
footer.TextSize = 12
footer.TextXAlignment = Enum.TextXAlignment.Left
footer.TextColor3 = Color3.fromRGB(160, 160, 160)
footer.Text = "Format: Potion (Variant): Combo"
footer.Parent = main
-- Make draggable by grabbing title area (title + hint acts like a title bar)
local titleBar = Instance.new("Frame")
titleBar.Name = "TitleBar"
titleBar.BackgroundTransparency = 1
titleBar.Position = UDim2.new(0, 0, 0, 0)
titleBar.Size = UDim2.new(1, 0, 0, 60)
titleBar.Parent = main
title.ZIndex = 2
closeHint.ZIndex = 2
titleBar.ZIndex = 1
makeDraggable(main, titleBar)
-- Fill text + compute size for scrolling
local function refreshText()
local txt = buildPotionText()
content.Text = txt
local maxWidth = math.max(1, scroll.AbsoluteSize.X - 20)
local bounds = TextService:GetTextSize(
txt,
content.TextSize,
content.Font,
Vector2.new(maxWidth, 100000)
)
content.Size = UDim2.new(1, -20, 0, bounds.Y + 6)
scroll.CanvasSize = UDim2.new(0, 0, 0, bounds.Y + 26)
end
refreshText()
table.insert(connections, scroll:GetPropertyChangedSignal("AbsoluteSize"):Connect(refreshText))
-- Unload hotkey: M
table.insert(connections, UserInputService.InputBegan:Connect(function(input, gp)
if gp then return end
if input.KeyCode == Enum.KeyCode.M then
Unload()
end
end))



w