
KeylessUniversal

-- ========================================
-- SERVICES & INITIALIZATION
-- ========================================
local Services = {
Players = game:GetService("Players"),
TweenService = game:GetService("TweenService"),
UserInputService = game:GetService("UserInputService"),
RunService = game:GetService("RunService")
}
local Player = Services.Players.LocalPlayer
local PlayerGui = Player:WaitForChild("PlayerGui")
-- ========================================
-- CONFIGURATION
-- ========================================
local Config = {
MaxKeyLength = 50,
AnimationSpeed = 0.4,
ParticleCount = 60,
ParticleSpeed = 60
}
-- ========================================
-- COLOR SCHEME
-- ========================================
local Colors = {
Background = Color3.fromRGB(18, 18, 22),
Surface = Color3.fromRGB(25, 25, 30),
Primary = Color3.fromRGB(45, 45, 50),
Secondary = Color3.fromRGB(35, 35, 40),
Border = Color3.fromRGB(40, 40, 45),
TextPrimary = Color3.fromRGB(220, 220, 225),
TextSecondary = Color3.fromRGB(140, 140, 150),
Success = Color3.fromRGB(25, 135, 84),
Error = Color3.fromRGB(180, 50, 50),
Warning = Color3.fromRGB(200, 120, 30),
Discord = Color3.fromRGB(60, 70, 180),
GetKey = Color3.fromRGB(40, 140, 100),
HoverPrimary = Color3.fromRGB(55, 55, 60),
HoverDiscord = Color3.fromRGB(50, 60, 160),
HoverGetKey = Color3.fromRGB(30, 120, 80),
NeonWhite = Color3.fromRGB(255, 255, 255),
NeonGlow = Color3.fromRGB(240, 248, 255)
}
-- ========================================
-- STATE MANAGEMENT
-- ========================================
local State = {
IsLoading = false,
Particles = {},
Animations = {},
IsDestroyed = false,
MousePosition = {X = 0, Y = 0},
FocusStates = {
InputFocused = false,
ButtonHovered = {},
AnimationsActive = true
}
}
local UI = {}
-- ========================================
-- UI CREATION FUNCTIONS
-- ========================================
local function CreateMainGUI()
local screenGui = Instance.new("ScreenGui")
screenGui.Name = "KeySystemGUI"
screenGui.ResetOnSpawn = false
screenGui.ZIndexBehavior = Enum.ZIndexBehavior.Sibling
screenGui.IgnoreGuiInset = true
screenGui.DisplayOrder = 100
screenGui.Parent = PlayerGui
UI.ScreenGui = screenGui
return screenGui
end
local function CreateBackdrop(parent)
local backdrop = Instance.new("Frame")
backdrop.Name = "Backdrop"
backdrop.Size = UDim2.new(1, 0, 1, 0)
backdrop.BackgroundColor3 = Color3.fromRGB(0, 0, 0)
backdrop.BackgroundTransparency = 0.1
backdrop.BorderSizePixel = 0
backdrop.ZIndex = 100
backdrop.Parent = parent
UI.Backdrop = backdrop
return backdrop
end
local function CreateContainer(parent)
local container = Instance.new("Frame")
container.Name = "MainContainer"
container.Size = UDim2.new(0, 420, 0, 600)
container.Position = UDim2.new(0.5, -210, 0.5, -300)
container.BackgroundColor3 = Colors.Background
container.BorderSizePixel = 0
container.ZIndex = 110
container.Selectable = false
container.Parent = parent
local corner = Instance.new("UICorner")
corner.CornerRadius = UDim.new(0, 20)
corner.Parent = container
local stroke = Instance.new("UIStroke")
stroke.Color = Colors.Border
stroke.Thickness = 1
stroke.Transparency = 0.3
stroke.Parent = container
UI.Container = container
return container
end
local function CreateAnimatedBorder(parent)
local border = Instance.new("Frame")
border.Name = "AnimatedBorder"
border.Size = UDim2.new(1, 6, 1, 6)
border.Position = UDim2.new(0, -3, 0, -3)
border.BackgroundTransparency = 1
border.ZIndex = 109
border.Selectable = false
border.Parent = parent
local corner = Instance.new("UICorner")
corner.CornerRadius = UDim.new(0, 23)
corner.Parent = border
local stroke = Instance.new("UIStroke")
stroke.Color = Colors.NeonWhite
stroke.Thickness = 2
stroke.Transparency = 0.3
stroke.Parent = border
local gradient = Instance.new("UIGradient")
gradient.Color = ColorSequence.new{
ColorSequenceKeypoint.new(0, Colors.NeonWhite),
ColorSequenceKeypoint.new(0.5, Colors.NeonGlow),
ColorSequenceKeypoint.new(1, Colors.NeonWhite)
}
gradient.Transparency = NumberSequence.new{
NumberSequenceKeypoint.new(0, 0.9),
NumberSequenceKeypoint.new(0.2, 0.1),
NumberSequenceKeypoint.new(0.8, 0.1),
NumberSequenceKeypoint.new(1, 0.9)
}
gradient.Parent = stroke
UI.AnimatedBorder = {Frame = border, Gradient = gradient, Stroke = stroke}
return border
end
-- ========================================
-- HEADER SECTION
-- ========================================
local function CreateHeader(parent)
local header = Instance.new("Frame")
header.Name = "Header"
header.Size = UDim2.new(1, 0, 0, 100)
header.BackgroundTransparency = 1
header.ZIndex = 11
header.Selectable = false
header.Parent = parent
local iconContainer = Instance.new("Frame")
iconContainer.Size = UDim2.new(0, 56, 0, 56)
iconContainer.Position = UDim2.new(0.5, -28, 0, 24)
iconContainer.BackgroundColor3 = Colors.Primary
iconContainer.BorderSizePixel = 0
iconContainer.ZIndex = 12
iconContainer.Selectable = false
iconContainer.Parent = header
local iconCorner = Instance.new("UICorner")
iconCorner.CornerRadius = UDim.new(0, 14)
iconCorner.Parent = iconContainer
local iconGlow = Instance.new("Frame")
iconGlow.Size = UDim2.new(1, 12, 1, 12)
iconGlow.Position = UDim2.new(0, -6, 0, -6)
iconGlow.BackgroundTransparency = 1
iconGlow.ZIndex = 11
iconGlow.Selectable = false
iconGlow.Parent = iconContainer
local glowCorner = Instance.new("UICorner")
glowCorner.CornerRadius = UDim.new(0, 20)
glowCorner.Parent = iconGlow
local glowStroke = Instance.new("UIStroke")
glowStroke.Color = Colors.NeonWhite
glowStroke.Thickness = 3
glowStroke.Transparency = 0.2
glowStroke.Parent = iconGlow
local glowGradient = Instance.new("UIGradient")
glowGradient.Color = ColorSequence.new{
ColorSequenceKeypoint.new(0, Colors.NeonWhite),
ColorSequenceKeypoint.new(0.5, Colors.NeonGlow),
ColorSequenceKeypoint.new(1, Colors.NeonWhite)
}
glowGradient.Transparency = NumberSequence.new{
NumberSequenceKeypoint.new(0, 0.8),
NumberSequenceKeypoint.new(0.2, 0.05),
NumberSequenceKeypoint.new(0.8, 0.05),
NumberSequenceKeypoint.new(1, 0.8)
}
glowGradient.Parent = glowStroke
local iconImage = Instance.new("ImageLabel")
iconImage.Size = UDim2.new(0.8, 0, 0.8, 0)
iconImage.Position = UDim2.new(0.1, 0, 0.1, 0)
iconImage.BackgroundTransparency = 1
iconImage.Image = "rbxassetid://95233466475324"
iconImage.ImageColor3 = Colors.NeonWhite
iconImage.ImageTransparency = 0.1
iconImage.ScaleType = Enum.ScaleType.Fit
iconImage.ZIndex = 13
iconImage.Parent = iconContainer
UI.Header = {Container = header, IconGlow = glowGradient, IconStroke = glowStroke}
return header
end
-- ========================================
-- CONTENT SECTION
-- ========================================
local function CreateContent(parent)
local content = Instance.new("Frame")
content.Name = "Content"
content.Size = UDim2.new(1, -64, 0, 440)
content.Position = UDim2.new(0, 32, 0, 120)
content.BackgroundTransparency = 1
content.ZIndex = 11
content.Selectable = false
content.Parent = parent
local title = Instance.new("TextLabel")
title.Size = UDim2.new(1, 0, 0, 32)
title.BackgroundTransparency = 1
title.Text = "Access Key Required"
title.TextColor3 = Colors.TextPrimary
title.TextSize = 24
title.Font = Enum.Font.GothamBold
title.TextXAlignment = Enum.TextXAlignment.Center
title.ZIndex = 12
title.Parent = content
local subtitle = Instance.new("TextLabel")
subtitle.Size = UDim2.new(1, 0, 0, 40)
subtitle.Position = UDim2.new(0, 0, 0, 40)
subtitle.BackgroundTransparency = 1
subtitle.Text = "Enter your access key to continue"
subtitle.TextColor3 = Colors.TextSecondary
subtitle.TextSize = 16
subtitle.Font = Enum.Font.Gotham
subtitle.TextXAlignment = Enum.TextXAlignment.Center
subtitle.TextWrapped = true
subtitle.ZIndex = 12
subtitle.Parent = content
UI.Content = content
return content
end
-- ========================================
-- INPUT SECTION
-- ========================================
local function CreateInputSection(parent)
local section = Instance.new("Frame")
section.Size = UDim2.new(1, 0, 0, 100)
section.Position = UDim2.new(0, 0, 0, 100)
section.BackgroundTransparency = 1
section.ZIndex = 12
section.Selectable = false
section.Parent = parent
local inputContainer = Instance.new("Frame")
inputContainer.Size = UDim2.new(1, 0, 0, 52)
inputContainer.BackgroundColor3 = Colors.Surface
inputContainer.BorderSizePixel = 0
inputContainer.ZIndex = 13
inputContainer.Selectable = false
inputContainer.Parent = section
local corner = Instance.new("UICorner")
corner.CornerRadius = UDim.new(0, 12)
corner.Parent = inputContainer
local stroke = Instance.new("UIStroke")
stroke.Color = Colors.Border
stroke.Thickness = 1
stroke.Transparency = 0.3
stroke.Parent = inputContainer
local inputGlow = Instance.new("Frame")
inputGlow.Size = UDim2.new(1, 8, 1, 8)
inputGlow.Position = UDim2.new(0, -4, 0, -4)
inputGlow.BackgroundTransparency = 1
inputGlow.ZIndex = inputContainer.ZIndex - 1
inputGlow.Visible = false
inputGlow.Selectable = false
inputGlow.Parent = inputContainer
local glowCorner = Instance.new("UICorner")
glowCorner.CornerRadius = UDim.new(0, 16)
glowCorner.Parent = inputGlow
local glowStroke = Instance.new("UIStroke")
glowStroke.Color = Colors.NeonWhite
glowStroke.Thickness = 2
glowStroke.Transparency = 0.3
glowStroke.Parent = inputGlow
local glowGradient = Instance.new("UIGradient")
glowGradient.Color = ColorSequence.new{
ColorSequenceKeypoint.new(0, Colors.NeonWhite),
ColorSequenceKeypoint.new(0.5, Colors.NeonGlow),
ColorSequenceKeypoint.new(1, Colors.NeonWhite)
}
glowGradient.Transparency = NumberSequence.new{
NumberSequenceKeypoint.new(0, 0.8),
NumberSequenceKeypoint.new(0.2, 0.1),
NumberSequenceKeypoint.new(0.8, 0.1),
NumberSequenceKeypoint.new(1, 0.8)
}
glowGradient.Parent = glowStroke
local textInput = Instance.new("TextBox")
textInput.Size = UDim2.new(1, -24, 1, 0)
textInput.Position = UDim2.new(0, 12, 0, 0)
textInput.BackgroundTransparency = 1
textInput.Text = ""
textInput.PlaceholderText = "Enter key here"
textInput.TextColor3 = Colors.TextPrimary
textInput.PlaceholderColor3 = Colors.TextSecondary
textInput.TextSize = 16
textInput.Font = Enum.Font.Gotham
textInput.TextXAlignment = Enum.TextXAlignment.Left
textInput.ClearTextOnFocus = false
textInput.ZIndex = 14
textInput.Selectable = true
textInput.Parent = inputContainer
local charCounter = Instance.new("TextLabel")
charCounter.Size = UDim2.new(0, 80, 0, 20)
charCounter.Position = UDim2.new(1, -85, 0, 60)
charCounter.BackgroundTransparency = 1
charCounter.Text = "0/" .. Config.MaxKeyLength
charCounter.TextColor3 = Colors.TextSecondary
charCounter.TextSize = 12
charCounter.Font = Enum.Font.Gotham
charCounter.TextXAlignment = Enum.TextXAlignment.Right
charCounter.ZIndex = 13
charCounter.Parent = section
UI.Input = {
Container = inputContainer,
TextBox = textInput,
Counter = charCounter,
Stroke = stroke,
Glow = {Frame = inputGlow, Stroke = glowStroke, Gradient = glowGradient}
}
return section
end
-- ========================================
-- BUTTON SECTION
-- ========================================
local function CreateButtons(parent)
local submitButton = Instance.new("TextButton")
submitButton.Size = UDim2.new(1, 0, 0, 48)
submitButton.Position = UDim2.new(0, 0, 0, 200)
submitButton.BackgroundColor3 = Colors.Primary
submitButton.BorderSizePixel = 0
submitButton.Text = "Verify Access Key"
submitButton.TextColor3 = Colors.TextPrimary
submitButton.TextSize = 16
submitButton.Font = Enum.Font.GothamMedium
submitButton.AutoButtonColor = false
submitButton.ZIndex = 13
submitButton.Selectable = true
submitButton.Parent = parent
local submitCorner = Instance.new("UICorner")
submitCorner.CornerRadius = UDim.new(0, 12)
submitCorner.Parent = submitButton
local loadingContainer = Instance.new("Frame")
loadingContainer.Size = UDim2.new(0, 24, 0, 24)
loadingContainer.Position = UDim2.new(0.5, -12, 0, 12)
loadingContainer.BackgroundTransparency = 1
loadingContainer.Visible = false
loadingContainer.ZIndex = 14
loadingContainer.Selectable = false
loadingContainer.Parent = submitButton
local spinner = Instance.new("Frame")
spinner.Size = UDim2.new(1, 0, 1, 0)
spinner.BackgroundColor3 = Colors.TextPrimary
spinner.BorderSizePixel = 0
spinner.ZIndex = 15
spinner.Selectable = false
spinner.Parent = loadingContainer
local spinnerCorner = Instance.new("UICorner")
spinnerCorner.CornerRadius = UDim.new(1, 0)
spinnerCorner.Parent = spinner
local spinnerGradient = Instance.new("UIGradient")
spinnerGradient.Transparency = NumberSequence.new{
NumberSequenceKeypoint.new(0, 0),
NumberSequenceKeypoint.new(0.8, 0.8),
NumberSequenceKeypoint.new(1, 1)
}
spinnerGradient.Parent = spinner
local buttonsContainer = Instance.new("Frame")
buttonsContainer.Size = UDim2.new(1, 0, 0, 48)
buttonsContainer.Position = UDim2.new(0, 0, 0, 260)
buttonsContainer.BackgroundTransparency = 1
buttonsContainer.ZIndex = 12
buttonsContainer.Selectable = false
buttonsContainer.Parent = parent
local getKeyButton = Instance.new("TextButton")
getKeyButton.Size = UDim2.new(0.48, 0, 1, 0)
getKeyButton.BackgroundColor3 = Colors.GetKey
getKeyButton.BorderSizePixel = 0
getKeyButton.Text = "Get Key"
getKeyButton.TextColor3 = Colors.TextPrimary
getKeyButton.TextSize = 14
getKeyButton.Font = Enum.Font.GothamMedium
getKeyButton.AutoButtonColor = false
getKeyButton.ZIndex = 13
getKeyButton.Selectable = true
getKeyButton.Parent = buttonsContainer
local getKeyCorner = Instance.new("UICorner")
getKeyCorner.CornerRadius = UDim.new(0, 10)
getKeyCorner.Parent = getKeyButton
local discordButton = Instance.new("TextButton")
discordButton.Size = UDim2.new(0.48, 0, 1, 0)
discordButton.Position = UDim2.new(0.52, 0, 0, 0)
discordButton.BackgroundColor3 = Colors.Discord
discordButton.BorderSizePixel = 0
discordButton.Text = "Discord"
discordButton.TextColor3 = Colors.TextPrimary
discordButton.TextSize = 14
discordButton.Font = Enum.Font.GothamMedium
discordButton.AutoButtonColor = false
discordButton.ZIndex = 13
discordButton.Selectable = true
discordButton.Parent = buttonsContainer
local discordCorner = Instance.new("UICorner")
discordCorner.CornerRadius = UDim.new(0, 10)
discordCorner.Parent = discordButton
UI.Buttons = {
Submit = submitButton,
GetKey = getKeyButton,
Discord = discordButton,
Loading = {Container = loadingContainer, Spinner = spinner}
}
return {submitButton, getKeyButton, discordButton}
end
-- ========================================
-- STATUS SECTION
-- ========================================
local function CreateStatus(parent)
local statusContainer = Instance.new("Frame")
statusContainer.Size = UDim2.new(1, 0, 0, 60)
statusContainer.Position = UDim2.new(0, 0, 0, 330)
statusContainer.BackgroundTransparency = 1
statusContainer.ZIndex = 12
statusContainer.Selectable = false
statusContainer.Parent = parent
local statusLabel = Instance.new("TextLabel")
statusLabel.Size = UDim2.new(1, 0, 1, 0)
statusLabel.BackgroundTransparency = 1
statusLabel.Text = ""
statusLabel.TextColor3 = Colors.Error
statusLabel.TextSize = 14
statusLabel.Font = Enum.Font.Gotham
statusLabel.TextXAlignment = Enum.TextXAlignment.Center
statusLabel.TextWrapped = true
statusLabel.ZIndex = 13
statusLabel.Parent = statusContainer
UI.Status = statusLabel
return statusLabel
end
-- ========================================
-- PARTICLE SYSTEM
-- ========================================
local function CreateParticleContainer(parent)
local container = Instance.new("Frame")
container.Size = UDim2.new(1, 0, 1, 0)
container.BackgroundTransparency = 1
container.ZIndex = 105
container.Selectable = false
container.Parent = parent
UI.ParticleContainer = container
return container
end
local function CreateParticle()
if not UI.ParticleContainer or not UI.ParticleContainer.Parent or State.IsDestroyed then
return nil
end
local size = math.random(8, 24)
local particle = Instance.new("Frame")
particle.Size = UDim2.new(0, size, 0, size)
particle.Position = UDim2.new(math.random() * 1.4 - 0.2, 0, 1.2, 0)
particle.BackgroundColor3 = Colors.NeonWhite
particle.BackgroundTransparency = math.random(60, 85) / 100
particle.BorderSizePixel = 0
particle.ZIndex = 106
particle.Selectable = false
particle.Parent = UI.ParticleContainer
local corner = Instance.new("UICorner")
corner.CornerRadius = UDim.new(1, 0)
corner.Parent = particle
local gradient = Instance.new("UIGradient")
local bubbleColors = {
Color3.fromRGB(200, 230, 255),
Color3.fromRGB(180, 220, 255),
Color3.fromRGB(220, 240, 255),
Color3.fromRGB(190, 210, 240)
}
local color1 = bubbleColors[math.random(#bubbleColors)]
local color2 = bubbleColors[math.random(#bubbleColors)]
gradient.Color = ColorSequence.new{
ColorSequenceKeypoint.new(0, color1),
ColorSequenceKeypoint.new(0.3, Color3.fromRGB(255, 255, 255)),
ColorSequenceKeypoint.new(0.7, color2),
ColorSequenceKeypoint.new(1, color1)
}
gradient.Rotation = math.random(0, 360)
gradient.Parent = particle
local highlight = Instance.new("Frame")
highlight.Size = UDim2.new(0.3, 0, 0.3, 0)
highlight.Position = UDim2.new(0.2, 0, 0.15, 0)
highlight.BackgroundColor3 = Color3.fromRGB(255, 255, 255)
highlight.BackgroundTransparency = 0.3
highlight.BorderSizePixel = 0
highlight.ZIndex = particle.ZIndex + 1
highlight.Parent = particle
local highlightCorner = Instance.new("UICorner")
highlightCorner.CornerRadius = UDim.new(1, 0)
highlightCorner.Parent = highlight
local glow = Instance.new("Frame")
glow.Size = UDim2.new(1.8, 0, 1.8, 0)
glow.Position = UDim2.new(-0.4, 0, -0.4, 0)
glow.BackgroundColor3 = Color3.fromRGB(200, 230, 255)
glow.BackgroundTransparency = 0.9
glow.BorderSizePixel = 0
glow.ZIndex = particle.ZIndex - 1
glow.Parent = particle
local glowCorner = Instance.new("UICorner")
glowCorner.CornerRadius = UDim.new(1, 0)
glowCorner.Parent = glow
local particleData = {
frame = particle,
vx = (math.random() - 0.5) * 0.004,
vy = -math.random(20, 50) / 10000,
created = tick(),
rotation = 0,
rotationSpeed = (math.random() - 0.5) * 2,
pulsePhase = math.random() * math.pi * 2,
driftPhase = math.random() * math.pi * 2,
originalTransparency = particle.BackgroundTransparency,
glow = glow,
highlight = highlight,
lifetime = math.random(30, 60),
originalSize = size,
wobblePhase = math.random() * math.pi * 2,
repelForce = {x = 0, y = 0},
mass = size / 10
}
table.insert(State.Particles, particleData)
return particle
end
local function UpdateParticles()
if State.IsDestroyed or not UI.ParticleContainer then return end
local screenSize = UI.ScreenGui.AbsoluteSize
local mouseScreenX = State.MousePosition.X / screenSize.X
local mouseScreenY = State.MousePosition.Y / screenSize.Y
for i = #State.Particles, 1, -1 do
local p = State.Particles[i]
if not p or not p.frame or not p.frame.Parent then
table.remove(State.Particles, i)
else
local currentPos = p.frame.Position
local age = tick() - p.created
if currentPos.Y.Scale < -0.3 or age > p.lifetime then
p.frame:Destroy()
table.remove(State.Particles, i)
else
local distanceToMouse = math.sqrt(
(currentPos.X.Scale - mouseScreenX)^2 +
(currentPos.Y.Scale - mouseScreenY)^2
)
local repelStrength = 0.08
local repelRadius = 0.15
local repelForceX = 0
local repelForceY = 0
if distanceToMouse < repelRadius and distanceToMouse > 0 then
local repelPower = (repelRadius - distanceToMouse) / repelRadius
repelPower = repelPower * repelStrength / p.mass
local directionX = (currentPos.X.Scale - mouseScreenX) / distanceToMouse
local directionY = (currentPos.Y.Scale - mouseScreenY) / distanceToMouse
repelForceX = directionX * repelPower
repelForceY = directionY * repelPower
end
p.repelForce.x = p.repelForce.x * 0.85 + repelForceX * 0.15
p.repelForce.y = p.repelForce.y * 0.85 + repelForceY * 0.15
local newX = currentPos.X.Scale + p.vx + p.repelForce.x
local newY = currentPos.Y.Scale + p.vy + p.repelForce.y
if newX <= -0.2 then newX = 1.2
elseif newX >= 1.2 then newX = -0.2 end
local wobbleTime = tick() * 1.5 + p.wobblePhase
newX = newX + math.sin(wobbleTime) * 0.002
newY = newY + math.cos(wobbleTime * 0.7) * 0.001
newX = newX + (math.random() - 0.5) * 0.0008
newY = newY + (math.random() - 0.5) * 0.0005
p.rotation = p.rotation + p.rotationSpeed
p.frame.Rotation = p.rotation
local breathe = math.sin(tick() * 2.5 + p.pulsePhase) * 0.1 + 1
local currentSize = p.originalSize * breathe
p.frame.Size = UDim2.new(0, currentSize, 0, currentSize)
local transparencyPulse = math.sin(tick() * 3 + p.pulsePhase) * 0.1
local newTransparency = math.max(0.5, math.min(0.95, p.originalTransparency + transparencyPulse))
p.frame.BackgroundTransparency = newTransparency
local glowIntensity = 0.9
if distanceToMouse < 0.2 then
glowIntensity = 0.7 + (distanceToMouse / 0.2) * 0.2
end
p.glow.BackgroundTransparency = glowIntensity
local shimmer = math.sin(tick() * 4 + p.pulsePhase) * 0.2 + 0.3
p.highlight.BackgroundTransparency = shimmer
p.vx = p.vx * 0.995
p.vy = p.vy * 0.998
p.frame.Position = UDim2.new(newX, 0, newY, 0)
end
end
end
end
-- ========================================
-- VISUAL EFFECTS
-- ========================================
local function CreateButtonGlow(button, hoverColor, originalColor)
local glowBorder = Instance.new("Frame")
glowBorder.Size = UDim2.new(1, 8, 1, 8)
glowBorder.Position = UDim2.new(0, -4, 0, -4)
glowBorder.BackgroundTransparency = 1
glowBorder.ZIndex = button.ZIndex - 1
glowBorder.Visible = false
glowBorder.Selectable = false
glowBorder.Parent = button
local corner = Instance.new("UICorner")
corner.CornerRadius = UDim.new(0, 14)
corner.Parent = glowBorder
local stroke = Instance.new("UIStroke")
stroke.Color = Colors.NeonWhite
stroke.Thickness = 2
stroke.Transparency = 0.3
stroke.Parent = glowBorder
local gradient = Instance.new("UIGradient")
gradient.Color = ColorSequence.new{
ColorSequenceKeypoint.new(0, Colors.NeonWhite),
ColorSequenceKeypoint.new(0.5, Colors.NeonGlow),
ColorSequenceKeypoint.new(1, Colors.NeonWhite)
}
gradient.Transparency = NumberSequence.new{
NumberSequenceKeypoint.new(0, 0.8),
NumberSequenceKeypoint.new(0.2, 0.1),
NumberSequenceKeypoint.new(0.8, 0.1),
NumberSequenceKeypoint.new(1, 0.8)
}
gradient.Parent = stroke
local currentTween = nil
local buttonId = tostring(button)
button.MouseEnter:Connect(function()
State.FocusStates.ButtonHovered[buttonId] = true
glowBorder.Visible = true
Services.TweenService:Create(button, TweenInfo.new(0.2, Enum.EasingStyle.Quad),
{BackgroundColor3 = hoverColor}):Play()
Services.TweenService:Create(stroke, TweenInfo.new(0.2, Enum.EasingStyle.Quad),
{Transparency = 0.1}):Play()
if currentTween then currentTween:Cancel() end
currentTween = Services.TweenService:Create(gradient,
TweenInfo.new(1.5, Enum.EasingStyle.Linear, Enum.EasingDirection.InOut, -1),
{Rotation = 360})
currentTween:Play()
end)
button.MouseLeave:Connect(function()
State.FocusStates.ButtonHovered[buttonId] = false
Services.TweenService:Create(button, TweenInfo.new(0.2, Enum.EasingStyle.Quad),
{BackgroundColor3 = originalColor}):Play()
Services.TweenService:Create(stroke, TweenInfo.new(0.3, Enum.EasingStyle.Quad),
{Transparency = 0.8}):Play()
if currentTween then
currentTween:Cancel()
gradient.Rotation = 0
end
task.spawn(function()
task.wait(0.3)
if glowBorder and glowBorder.Parent then
glowBorder.Visible = false
end
end)
end)
return {glowBorder, stroke, gradient}
end
-- ========================================
-- STATUS & FEEDBACK FUNCTIONS
-- ========================================
local function ShowStatus(message, isError, isSuccess)
if not UI.Status then return end
UI.Status.Text = message
if isSuccess then
UI.Status.TextColor3 = Colors.Success
elseif isError then
UI.Status.TextColor3 = Colors.Error
else
UI.Status.TextColor3 = Colors.Warning
end
UI.Status.TextTransparency = 1
Services.TweenService:Create(UI.Status, TweenInfo.new(0.3, Enum.EasingStyle.Quad),
{TextTransparency = 0}):Play()
end
local function ClearStatus()
if UI.Status then
Services.TweenService:Create(UI.Status, TweenInfo.new(0.3, Enum.EasingStyle.Quad),
{TextTransparency = 1}):Play()
end
end
local function SetLoading(isLoading)
State.IsLoading = isLoading
if not UI.Buttons then return end
UI.Buttons.Loading.Container.Visible = isLoading
UI.Buttons.Submit.Text = isLoading and "" or "Verify Access Key"
if isLoading then
local tween = Services.TweenService:Create(UI.Buttons.Loading.Spinner,
TweenInfo.new(1, Enum.EasingStyle.Linear, Enum.EasingDirection.InOut, -1),
{Rotation = 360})
tween:Play()
State.Animations.SpinTween = tween
else
if State.Animations.SpinTween then
State.Animations.SpinTween:Cancel()
UI.Buttons.Loading.Spinner.Rotation = 0
end
end
end
-- ========================================
-- INPUT HANDLING
-- ========================================
local function UpdateCharCounter()
if not UI.Input then return end
local currentLength = string.len(UI.Input.TextBox.Text)
UI.Input.Counter.Text = currentLength .. "/" .. Config.MaxKeyLength
if currentLength >= Config.MaxKeyLength then
UI.Input.Counter.TextColor3 = Colors.Error
elseif currentLength >= Config.MaxKeyLength * 0.8 then
UI.Input.Counter.TextColor3 = Colors.Warning
else
UI.Input.Counter.TextColor3 = Colors.TextSecondary
end
end
local function CopyToClipboard(text, successMessage)
local success = pcall(function()
if setclipboard then
setclipboard(text)
ShowStatus(successMessage, false, true)
else
ShowStatus("Link: " .. text, false, true)
end
end)
if not success then
ShowStatus("Link: " .. text, false, true)
end
end
-- ========================================
-- EVENT CONNECTIONS
-- ========================================
local function ConnectEvents()
Services.UserInputService.InputChanged:Connect(function(input, gameProcessed)
if input.UserInputType == Enum.UserInputType.MouseMovement then
State.MousePosition.X = input.Position.X
State.MousePosition.Y = input.Position.Y
end
end)
UI.Input.TextBox:GetPropertyChangedSignal("Text"):Connect(function()
local currentText = UI.Input.TextBox.Text
if string.len(currentText) > Config.MaxKeyLength then
UI.Input.TextBox.Text = string.sub(currentText, 1, Config.MaxKeyLength)
ShowStatus("Maximum character limit reached (" .. Config.MaxKeyLength .. ")", true)
end
UpdateCharCounter()
ClearStatus()
end)
local inputGlowTween = nil
UI.Input.TextBox.Focused:Connect(function()
State.FocusStates.InputFocused = true
UI.Input.Glow.Frame.Visible = true
Services.TweenService:Create(UI.Input.Stroke,
TweenInfo.new(0.2, Enum.EasingStyle.Quad),
{Color = Colors.NeonWhite, Transparency = 0.1}):Play()
Services.TweenService:Create(UI.Input.Glow.Stroke,
TweenInfo.new(0.2, Enum.EasingStyle.Quad),
{Transparency = 0.1}):Play()
if inputGlowTween then inputGlowTween:Cancel() end
inputGlowTween = Services.TweenService:Create(UI.Input.Glow.Gradient,
TweenInfo.new(2, Enum.EasingStyle.Linear, Enum.EasingDirection.InOut, -1),
{Rotation = 360})
inputGlowTween:Play()
State.Animations.InputGlowTween = inputGlowTween
ClearStatus()
end)
UI.Input.TextBox.FocusLost:Connect(function()
State.FocusStates.InputFocused = false
Services.TweenService:Create(UI.Input.Stroke,
TweenInfo.new(0.2, Enum.EasingStyle.Quad),
{Color = Colors.Border, Transparency = 0.3}):Play()
Services.TweenService:Create(UI.Input.Glow.Stroke,
TweenInfo.new(0.3, Enum.EasingStyle.Quad),
{Transparency = 0.8}):Play()
if inputGlowTween then
inputGlowTween:Cancel()
UI.Input.Glow.Gradient.Rotation = 0
State.Animations.InputGlowTween = nil
end
task.spawn(function()
task.wait(0.3)
if UI.Input.Glow.Frame and UI.Input.Glow.Frame.Parent then
UI.Input.Glow.Frame.Visible = false
end
end)
end)
Services.UserInputService.InputBegan:Connect(function(input, gameProcessed)
if gameProcessed or State.IsDestroyed then return end
if input.KeyCode == Enum.KeyCode.Return and UI.Input.TextBox:IsFocused() then
local key = UI.Input.TextBox.Text
if key == "" then
ShowStatus("Please enter an access key", true)
UI.Input.TextBox:CaptureFocus()
return
end
SetLoading(true)
ShowStatus("Validating key...", false, false)
task.spawn(function()
task.wait(2)
SetLoading(false)
ShowStatus("This is a template - add your validation logic here", false, true)
end)
end
end)
UI.Buttons.Submit.MouseButton1Click:Connect(function()
if State.IsLoading then return end
local key = UI.Input.TextBox.Text
if key == "" then
ShowStatus("Please enter an access key", true)
UI.Input.TextBox:CaptureFocus()
return
end
SetLoading(true)
ShowStatus("Validating key...", false, false)
task.spawn(function()
task.wait(2)
SetLoading(false)
ShowStatus("This is a template - add your validation logic here", false, true)
end)
end)
UI.Buttons.GetKey.MouseButton1Click:Connect(function()
ShowStatus("Opening key website...", false, false)
CopyToClipboard("https://your-key-website.com", "Key website link copied to clipboard!")
end)
UI.Buttons.Discord.MouseButton1Click:Connect(function()
ShowStatus("Opening Discord invite...", false, false)
CopyToClipboard("https://discord.gg/your-invite", "Discord link copied to clipboard!")
end)
end
-- ========================================
-- ANIMATION LOOPS
-- ========================================
local function StartAnimationLoops()
State.Animations.BorderTween = nil
State.Animations.IconTween = nil
State.FocusStates.AnimationsActive = true
task.spawn(function()
for i = 1, 25 do
if State.IsDestroyed then break end
CreateParticle()
task.wait(math.random(20, 100) / 1000)
end
while not State.IsDestroyed and UI.ScreenGui.Parent do
if #State.Particles < Config.ParticleCount then
CreateParticle()
end
task.wait(math.random(400, 1200) / 1000)
end
end)
task.spawn(function()
while not State.IsDestroyed and UI.ScreenGui.Parent do
pcall(UpdateParticles)
task.wait(1/Config.ParticleSpeed)
end
end)
task.spawn(function()
while not State.IsDestroyed and UI.AnimatedBorder and UI.AnimatedBorder.Frame.Parent do
if State.Animations.BorderTween then
State.Animations.BorderTween:Cancel()
end
local startRotation = UI.AnimatedBorder.Gradient.Rotation
local tween = Services.TweenService:Create(UI.AnimatedBorder.Gradient,
TweenInfo.new(4, Enum.EasingStyle.Linear),
{Rotation = startRotation + 360})
State.Animations.BorderTween = tween
tween:Play()
local success = pcall(function()
tween.Completed:Wait()
end)
if not success then
task.wait(4)
end
if UI.AnimatedBorder and UI.AnimatedBorder.Gradient and UI.AnimatedBorder.Gradient.Parent then
UI.AnimatedBorder.Gradient.Rotation = UI.AnimatedBorder.Gradient.Rotation % 360
end
task.wait(0.1)
end
end)
task.spawn(function()
while not State.IsDestroyed and UI.Header and UI.Header.IconGlow and UI.Header.IconGlow.Parent do
if State.Animations.IconTween then
State.Animations.IconTween:Cancel()
end
local startRotation = UI.Header.IconGlow.Rotation
State.Animations.IconTween = Services.TweenService:Create(UI.Header.IconGlow,
TweenInfo.new(3, Enum.EasingStyle.Linear),
{Rotation = startRotation + 360})
State.Animations.IconTween:Play()
local success = pcall(function()
State.Animations.IconTween.Completed:Wait()
end)
if not success then
task.wait(3)
end
if UI.Header and UI.Header.IconGlow and UI.Header.IconGlow.Parent then
UI.Header.IconGlow.Rotation = UI.Header.IconGlow.Rotation % 360
end
task.wait(0.1)
end
end)
end
-- ========================================
-- ENTRANCE ANIMATION
-- ========================================
local function PlayEntranceAnimation()
UI.Container.Size = UDim2.new(0, 0, 0, 0)
UI.Container.BackgroundTransparency = 1
UI.Backdrop.BackgroundTransparency = 1
Services.TweenService:Create(UI.Backdrop,
TweenInfo.new(0.3, Enum.EasingStyle.Quad),
{BackgroundTransparency = 0.1}):Play()
task.wait(0.1)
Services.TweenService:Create(UI.Container,
TweenInfo.new(0.4, Enum.EasingStyle.Back, Enum.EasingDirection.Out),
{Size = UDim2.new(0, 420, 0, 600), BackgroundTransparency = 0}):Play()
task.wait(0.5)
UI.Input.TextBox:CaptureFocus()
end
-- ========================================
-- MAIN INITIALIZATION
-- ========================================
local function Initialize()
local screenGui = CreateMainGUI()
local backdrop = CreateBackdrop(screenGui)
CreateParticleContainer(backdrop)
local container = CreateContainer(screenGui)
CreateAnimatedBorder(container)
CreateHeader(container)
local content = CreateContent(container)
CreateInputSection(content)
CreateButtons(content)
CreateStatus(content)
CreateButtonGlow(UI.Buttons.Submit, Colors.HoverPrimary, Colors.Primary)
CreateButtonGlow(UI.Buttons.GetKey, Colors.HoverGetKey, Colors.GetKey)
CreateButtonGlow(UI.Buttons.Discord, Colors.HoverDiscord, Colors.Discord)
UpdateCharCounter()
ConnectEvents()
StartAnimationLoops()
PlayEntranceAnimation()
end
-- ========================================
-- START THE GUI
-- ========================================
Initialize()



W
This is a pretty cool script.! I like the aesthetic of it and its functionality, but It'd be better if you added the closing logic to it. : )
@ScriptbloxTermedMe yeah you can just add some simple closing logic to it, like what i did was make a key system that grabs/fetch the key from this site: https://roblox-key-system-production.up.railway.app/ once the right key’s entered, it just deletes the gui and runs the main script with loadstring. i only shared the gui part since theres a bunch of ways to do key systems, so figured its better to let people set it up how they want
@VincenzoXIII Yeah, you could make it so it has a closing animation, that'd go hard.
@ScriptbloxTermedMe yeah they can just add it e.g. simple fade out or whatnot
w
were do i put it in
what is the key here, I can't find the key
PLS KEY