
KeylessUniversal

-- Services
local Players = game:GetService("Players")
local UserInputService = game:GetService("UserInputService")
local player = Players.LocalPlayer
local playerGui = player:WaitForChild("PlayerGui")
---------------------------------------------------------
-- 1. MAIN SCREEN GUI & TOGGLE BUTTON
---------------------------------------------------------
local screenGui = Instance.new("ScreenGui")
screenGui.Name = "BundleAnimationsGui"
screenGui.ResetOnSpawn = false
screenGui.Parent = playerGui
local toggleBtn = Instance.new("TextButton")
toggleBtn.Name = "ToggleAnimBtn"
toggleBtn.Size = UDim2.new(0, 130, 0, 36)
toggleBtn.Position = UDim2.new(0, 15, 0, 100)
toggleBtn.BackgroundColor3 = Color3.fromRGB(30, 30, 35)
toggleBtn.Text = "▶ Animations"
toggleBtn.TextColor3 = Color3.fromRGB(255, 255, 255)
toggleBtn.Font = Enum.Font.SourceSansBold
toggleBtn.TextSize = 14
toggleBtn.Parent = screenGui
local toggleCorner = Instance.new("UICorner")
toggleCorner.CornerRadius = UDim.new(0, 8)
toggleCorner.Parent = toggleBtn
---------------------------------------------------------
-- 2. MAIN FRAME (DESAIN DARK THEME)
---------------------------------------------------------
local mainFrame = Instance.new("Frame")
mainFrame.Name = "MainFrame"
mainFrame.Size = UDim2.new(0, 440, 0, 320)
mainFrame.Position = UDim2.new(0.5, -220, 0.5, -160)
mainFrame.BackgroundColor3 = Color3.fromRGB(20, 20, 23)
mainFrame.BorderSizePixel = 0
mainFrame.Active = true
mainFrame.ClipsDescendants = true
mainFrame.Parent = screenGui
local mainCorner = Instance.new("UICorner")
mainCorner.CornerRadius = UDim.new(0, 10)
mainCorner.Parent = mainFrame
-- Header Container
local headerFrame = Instance.new("Frame")
headerFrame.Size = UDim2.new(1, 0, 0, 45)
headerFrame.BackgroundTransparency = 1
headerFrame.Parent = mainFrame
-- Play Icon
local iconLabel = Instance.new("TextLabel")
iconLabel.Size = UDim2.new(0, 28, 0, 28)
iconLabel.Position = UDim2.new(0, 12, 0, 8)
iconLabel.BackgroundColor3 = Color3.fromRGB(255, 255, 255)
iconLabel.Text = "▶"
iconLabel.TextColor3 = Color3.fromRGB(20, 20, 23)
iconLabel.Font = Enum.Font.SourceSansBold
iconLabel.TextSize = 12
iconLabel.Parent = headerFrame
local iconCorner = Instance.new("UICorner")
iconCorner.CornerRadius = UDim.new(0, 6)
iconCorner.Parent = iconLabel
-- Title Text
local titleLabel = Instance.new("TextLabel")
titleLabel.Size = UDim2.new(0, 200, 1, 0)
titleLabel.Position = UDim2.new(0, 48, 0, 0)
titleLabel.BackgroundTransparency = 1
titleLabel.Text = "BUNDLE ANIMATIONS"
titleLabel.TextColor3 = Color3.fromRGB(255, 255, 255)
titleLabel.Font = Enum.Font.SourceSansBold
titleLabel.TextSize = 16
titleLabel.TextXAlignment = Enum.TextXAlignment.Left
titleLabel.Parent = headerFrame
-- Close Button (X)
local closeBtn = Instance.new("TextButton")
closeBtn.Size = UDim2.new(0, 28, 0, 28)
closeBtn.Position = UDim2.new(1, -38, 0, 8)
closeBtn.BackgroundColor3 = Color3.fromRGB(35, 35, 40)
closeBtn.Text = "X"
closeBtn.TextColor3 = Color3.fromRGB(220, 220, 220)
closeBtn.Font = Enum.Font.SourceSansBold
closeBtn.TextSize = 14
closeBtn.Parent = headerFrame
local closeCorner = Instance.new("UICorner")
closeCorner.CornerRadius = UDim.new(0, 6)
closeCorner.Parent = closeBtn
---------------------------------------------------------
-- 3. SCROLLING CONTAINER
---------------------------------------------------------
local scrollFrame = Instance.new("ScrollingFrame")
scrollFrame.Size = UDim2.new(1, -20, 1, -55)
scrollFrame.Position = UDim2.new(0, 10, 0, 45)
scrollFrame.BackgroundTransparency = 1
scrollFrame.BorderSizePixel = 0
scrollFrame.ScrollBarThickness = 4
scrollFrame.AutomaticCanvasSize = Enum.AutomaticSize.Y
scrollFrame.Parent = mainFrame
local listLayout = Instance.new("UIListLayout")
listLayout.SortOrder = Enum.SortOrder.LayoutOrder
listLayout.Padding = UDim.new(0, 8)
listLayout.Parent = scrollFrame
---------------------------------------------------------
-- 4. LOGIKA ANIMASI & TOGGLE STATE
---------------------------------------------------------
local animList = {"Idle", "Walk", "Run", "Jump", "Fall"}
local savedCustomIds = {}
local defaultAnimIds = {}
local toggleStates = {} -- Menyimpan status ON/OFF tiap baris
local function captureDefaults(animateScript)
if not animateScript then return end
if not defaultAnimIds["Idle"] and animateScript:FindFirstChild("idle") then
local a1 = animateScript.idle:FindFirstChild("Animation1")
if a1 then defaultAnimIds["Idle"] = a1.AnimationId end
end
if not defaultAnimIds["Walk"] and animateScript:FindFirstChild("walk") then
local w = animateScript.walk:FindFirstChild("WalkAnim")
if w then defaultAnimIds["Walk"] = w.AnimationId end
end
if not defaultAnimIds["Run"] and animateScript:FindFirstChild("run") then
local r = animateScript.run:FindFirstChild("RunAnim")
if r then defaultAnimIds["Run"] = r.AnimationId end
end
if not defaultAnimIds["Jump"] and animateScript:FindFirstChild("jump") then
local j = animateScript.jump:FindFirstChild("JumpAnim")
if j then defaultAnimIds["Jump"] = j.AnimationId end
end
if not defaultAnimIds["Fall"] and animateScript:FindFirstChild("fall") then
local f = animateScript.fall:FindFirstChild("FallAnim")
if f then defaultAnimIds["Fall"] = f.AnimationId end
end
end
local function applyAnimToCharacter(animType, id, enableCustom)
local char = player.Character
if not char then return end
local animateScript = char:FindFirstChild("Animate")
if not animateScript then return end
captureDefaults(animateScript)
local cleanId = id and tostring(id):gsub("%D", "") or ""
local formattedId = nil
if enableCustom and cleanId ~= "" and #cleanId >= 5 then
formattedId = "rbxassetid://" .. cleanId
else
-- Gunakan ID default jika OFF / ID invalid / kosong
if animType == "Idle" then formattedId = defaultAnimIds["Idle"]
elseif animType == "Walk" then formattedId = defaultAnimIds["Walk"]
elseif animType == "Run" then formattedId = defaultAnimIds["Run"]
elseif animType == "Jump" then formattedId = defaultAnimIds["Jump"]
elseif animType == "Fall" then formattedId = defaultAnimIds["Fall"]
end
end
if animType == "Idle" and animateScript:FindFirstChild("idle") then
if animateScript.idle:FindFirstChild("Animation1") and formattedId then
animateScript.idle.Animation1.AnimationId = formattedId
end
if animateScript.idle:FindFirstChild("Animation2") and formattedId then
animateScript.idle.Animation2.AnimationId = formattedId
end
elseif animType == "Walk" and animateScript:FindFirstChild("walk") and animateScript.walk:FindFirstChild("WalkAnim") then
if formattedId then animateScript.walk.WalkAnim.AnimationId = formattedId end
elseif animType == "Run" and animateScript:FindFirstChild("run") and animateScript.run:FindFirstChild("RunAnim") then
if formattedId then animateScript.run.RunAnim.AnimationId = formattedId end
elseif animType == "Jump" and animateScript:FindFirstChild("jump") and animateScript.jump:FindFirstChild("JumpAnim") then
if formattedId then animateScript.jump.JumpAnim.AnimationId = formattedId end
elseif animType == "Fall" and animateScript:FindFirstChild("fall") and animateScript.fall:FindFirstChild("FallAnim") then
if formattedId then animateScript.fall.FallAnim.AnimationId = formattedId end
end
-- Reload animasi berjalan
local humanoid = char:FindFirstChildOfClass("Humanoid")
if humanoid then
local animator = humanoid:FindFirstChildOfClass("Animator")
if animator then
for _, track in ipairs(animator:GetPlayingAnimationTracks()) do
track:Stop()
end
end
end
end
-- Helper Baris UI
local function createAnimRow(name, order)
toggleStates[name] = false -- Status awal: OFF
local rowFrame = Instance.new("Frame")
rowFrame.Size = UDim2.new(1, -6, 0, 42)
rowFrame.BackgroundColor3 = Color3.fromRGB(30, 30, 35)
rowFrame.BorderSizePixel = 0
rowFrame.LayoutOrder = order
rowFrame.Parent = scrollFrame
local rowCorner = Instance.new("UICorner")
rowCorner.CornerRadius = UDim.new(0, 8)
rowCorner.Parent = rowFrame
local nameLabel = Instance.new("TextLabel")
nameLabel.Size = UDim2.new(0, 60, 1, 0)
nameLabel.Position = UDim2.new(0, 15, 0, 0)
nameLabel.BackgroundTransparency = 1
nameLabel.Text = name
nameLabel.TextColor3 = Color3.fromRGB(255, 255, 255)
nameLabel.Font = Enum.Font.SourceSansBold
nameLabel.TextSize = 14
nameLabel.TextXAlignment = Enum.TextXAlignment.Left
nameLabel.Parent = rowFrame
local idBox = Instance.new("TextBox")
idBox.Size = UDim2.new(1, -190, 0, 26)
idBox.Position = UDim2.new(0, 80, 0.5, -13)
idBox.BackgroundTransparency = 1
idBox.Text = "— default —"
idBox.TextColor3 = Color3.fromRGB(150, 150, 160)
idBox.Font = Enum.Font.SourceSans
idBox.TextSize = 13
idBox.ClearTextOnFocus = true
idBox.Parent = rowFrame
-- 🔄 TOMBOL ON / OFF
local toggleOnOffBtn = Instance.new("TextButton")
toggleOnOffBtn.Size = UDim2.new(0, 48, 0, 26)
toggleOnOffBtn.Position = UDim2.new(1, -95, 0.5, -13)
toggleOnOffBtn.BackgroundColor3 = Color3.fromRGB(50, 50, 55)
toggleOnOffBtn.Text = "OFF"
toggleOnOffBtn.TextColor3 = Color3.fromRGB(180, 180, 180)
toggleOnOffBtn.Font = Enum.Font.SourceSansBold
toggleOnOffBtn.TextSize = 12
toggleOnOffBtn.Parent = rowFrame
local toggleOnOffCorner = Instance.new("UICorner")
toggleOnOffCorner.CornerRadius = UDim.new(0, 6)
toggleOnOffCorner.Parent = toggleOnOffBtn
-- Tombol Reset (X)
local resetBtn = Instance.new("TextButton")
resetBtn.Size = UDim2.new(0, 30, 0, 26)
resetBtn.Position = UDim2.new(1, -40, 0.5, -13)
resetBtn.BackgroundColor3 = Color3.fromRGB(42, 42, 48)
resetBtn.Text = "X"
resetBtn.TextColor3 = Color3.fromRGB(180, 180, 190)
resetBtn.Font = Enum.Font.SourceSansBold
resetBtn.TextSize = 12
resetBtn.Parent = rowFrame
local resetCorner = Instance.new("UICorner")
resetCorner.CornerRadius = UDim.new(0, 6)
resetCorner.Parent = resetBtn
-- Logika Perubahan Tombol ON/OFF
local function updateToggleUI()
local isON = toggleStates[name]
local textId = idBox.Text
local clean = textId:gsub("%D", "")
if isON then
if textId ~= "" and textId ~= "— default —" and #clean >= 5 then
-- Tampilan Saat ON & Valid
toggleOnOffBtn.Text = "ON"
toggleOnOffBtn.BackgroundColor3 = Color3.fromRGB(46, 139, 87) -- Hijau
toggleOnOffBtn.TextColor3 = Color3.fromRGB(255, 255, 255)
idBox.TextColor3 = Color3.fromRGB(100, 255, 150)
savedCustomIds[name] = textId
applyAnimToCharacter(name, textId, true)
else
-- Jika diketik kosong/invalid tapi ditekan ON, otomatis kembali OFF
toggleStates[name] = false
toggleOnOffBtn.Text = "OFF"
toggleOnOffBtn.BackgroundColor3 = Color3.fromRGB(50, 50, 55)
toggleOnOffBtn.TextColor3 = Color3.fromRGB(180, 180, 180)
idBox.TextColor3 = Color3.fromRGB(255, 100, 100) -- Merah penanda invalid
applyAnimToCharacter(name, "", false)
end
else
-- Tampilan Saat OFF
toggleOnOffBtn.Text = "OFF"
toggleOnOffBtn.BackgroundColor3 = Color3.fromRGB(50, 50, 55)
toggleOnOffBtn.TextColor3 = Color3.fromRGB(180, 180, 180)
if textId == "" or textId == "— default —" then
idBox.TextColor3 = Color3.fromRGB(150, 150, 160)
end
applyAnimToCharacter(name, "", false)
end
end
-- Click Event ON / OFF
toggleOnOffBtn.MouseButton1Click:Connect(function()
toggleStates[name] = not toggleStates[name]
updateToggleUI()
end)
-- Reset Button Event
resetBtn.MouseButton1Click:Connect(function()
toggleStates[name] = false
savedCustomIds[name] = nil
idBox.Text = "— default —"
updateToggleUI()
end)
end
for index, name in ipairs(animList) do
createAnimRow(name, index)
end
---------------------------------------------------------
-- 5. DRAGGABLE & TOGGLE MAIN WINDOW
---------------------------------------------------------
local dragging, dragStart, startPos
mainFrame.InputBegan:Connect(function(input)
if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then
dragging = true
dragStart = input.Position
startPos = mainFrame.Position
end
end)
UserInputService.InputChanged:Connect(function(input)
if dragging and (input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch) then
local delta = input.Position - dragStart
mainFrame.Position = UDim2.new(
startPos.X.Scale, startPos.X.Offset + delta.X,
startPos.Y.Scale, startPos.Y.Offset + delta.Y
)
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 function setGuiState(visible)
mainFrame.Visible = visible
toggleBtn.Text = visible and "▶ Animations" or "▶ Open Anim"
end
toggleBtn.MouseButton1Click:Connect(function() setGuiState(not mainFrame.Visible) end)
closeBtn.MouseButton1Click:Connect(function() setGuiState(false) end)
-- Re-apply saat respawn
player.CharacterAdded:Connect(function(newChar)
local animScript = newChar:WaitForChild("Animate", 3)
if animScript then
task.wait(0.5)
captureDefaults(animScript)
end
task.wait(1)
for animName, isON in pairs(toggleStates) do
if isON and savedCustomIds[animName] then
applyAnimToCharacter(animName, savedCustomIds[animName], true)
end
end
end)
if player.Character then
task.spawn(function()
local animScript = player.Character:WaitForChild("Animate", 3)
if animScript then captureDefaults(animScript) end
end)
endNo comments yet for this script.



