Pruébala antes de usarla
Pega esta línea en tu executor y se abre un menú de prueba con todos los elementos conectados a notificaciones. No tienes que escribir nada.
loadstring(game:HttpGet("https://raw.githubusercontent.com/Lilwero20/CookiesLib/main/CookiesDemo.lua"))()| Pestaña | Qué puedes probar |
|---|---|
| Inicio | Aviso de bienvenida, estadísticas en vivo (FPS, ping, jugadores, hora), párrafo, campo para copiar e imagen. |
| Controles | Botones (normal, principal, con confirmación, en columnas, desactivado), toggles con tecla, sliders, cajas de texto, keybinds y dropdowns. |
| Avanzado | Selector de pastillas, slider de rango, campos numéricos, barra de progreso, selector de color, alertas y secciones con scroll. |
| Avisos | Los 4 tipos de notificación, una que se actualiza sola, diálogos, marca de agua, lista de keybinds y badges. |
| Personalizar | Tema, color de acento, título, tamaño de la ventana y el Key System de prueba. |
| Ajustes | La pestaña de ajustes de la librería: tema, acento, escala, tecla del menú, configs y auto-carga. |
La key del Key System de prueba es COOKIES-DEMO. RightShift oculta o muestra el menú y Ctrl+F abre la búsqueda.
Instalación
CookiesLib se carga desde GitHub con una línea. Funciona en cualquier executor que tenga loadstring y game:HttpGet:
local Library = loadstring(game:HttpGet("https://raw.githubusercontent.com/Lilwero20/CookiesLib/main/CookiesLib.lua"))()El resto de funciones del executor son opcionales. Si faltan, la librería se adapta:
| Función | Para qué se usa | Si no existe |
|---|---|---|
gethui | Colocar la UI en un contenedor oculto | Usa PlayerGui |
writefile, readfile, isfolder, makefolder | Configs, estado guardado y key recordada | Se desactivan |
listfiles | Listar configs | La lista sale vacía |
delfile | Borrar configs y la key guardada | Borrar se desactiva |
setclipboard | Campos para copiar y enlaces | Muestra el texto |
request | Abrir la invitación de Discord | Solo copia el enlace |
Inicio rápido
Una ventana con una pestaña, una sección y un toggle con tecla. Es el punto de partida de cualquier hub:
local Library = loadstring(game:HttpGet("https://raw.githubusercontent.com/Lilwero20/CookiesLib/main/CookiesLib.lua"))()
local Window = Library:CreateWindow({
Title = "Cookies Hub",
ToggleKey = Enum.KeyCode.RightShift,
})
local Main = Window:CreateTab("Main", "H")
local Section = Main:CreateSection("Combat")
Section:AddToggle({
Name = "Auto Farm",
Flag = "AutoFarm",
Default = false,
Keybind = "F",
Callback = function(value)
print("Auto Farm:", value)
end,
})
Window:CreateSettingsTab()Al ejecutarlo:
- 1Se reproduce la intro (logo y barra de carga; un clic la salta) y aparece la ventana.
- 2Aparece el botón flotante con el logo. Un clic abre o cierra la ventana, y se puede arrastrar.
- 3RightShift muestra u oculta la ventana y Ctrl+F abre la búsqueda.
- 4La próxima vez que lo ejecutes, la ventana vuelve con el mismo tamaño, posición, pestaña y tema.
Ventana
Library:CreateWindow crea la ventana principal. Todas las opciones son opcionales:
local Window = Library:CreateWindow({
Title = "Cookies Hub",
Subtitle = "v1.0",
Logo = "rbxassetid://76143769732706",
Width = 740, Height = 500,
ToggleKey = Enum.KeyCode.RightShift,
ConfigFolder = "CookiesHub",
Intro = { Enabled = true, Duration = 2 },
Notify = { Duration = 4, Position = "TopRight" },
Theme = { Accent = Color3.fromRGB(245, 194, 12) },
})| Opción | Por defecto | Qué hace |
|---|---|---|
Title / Subtitle | "Cookies Hub" / versión | Textos de la barra superior |
Logo | logo de Cookies | Imagen del título y del botón flotante. false lo quita |
Width, Height | 740, 500 | Tamaño inicial |
ToggleKey | RightShift | Tecla para mostrar u ocultar |
FloatingButton | true | Botón flotante para abrir la ventana (importante en móvil) |
Resizable / Draggable | true | Redimensionar desde la esquina y arrastrar desde la barra |
Searchable | true | Botón de lupa y búsqueda global |
ShowProfile | true | Tarjeta con avatar y nombre en la barra lateral |
RememberLayout | true | Recuerda tamaño, posición, pestaña y tema entre ejecuciones |
ConfigFolder | "CookiesHub" | Carpeta de configs y del estado guardado |
CompactBelow | 600 | Por debajo de este ancho la barra lateral muestra solo iconos |
Intro
La ventana queda oculta mientras dura la intro. Configúrala con Intro = { ... }: Enabled, Duration (segundos), Skippable, OncePerSession (no se repite al re-ejecutar en la misma partida), Logo y ShowBar.
Métodos
Window:Toggle() Window:Show() Window:Hide()
Window:Minimize()
Window:Resize(800, 520)
Window:SetUIScale(1.2)
Window:ResetPosition()
Window:ResetLayout()
Window:SetTitle("New title")
Window:SetSubtitle("Text")
Window:SetToggleKey(Enum.KeyCode.K)
Window:SetFloatingButton(false)
Window:AddTabCategory("Combat")
Window:GetTab("Main")
Window:SelectTab("Main")
Window:Destroy()Detener tus loops al descargar
Cuando el jugador pulsa Unload UI en Ajustes, OnUnload te avisa para que pares tus bucles:
local running = true
Window:OnUnload(function() running = false end)
task.spawn(function()
while running do
task.wait(0.1)
end
end)Pestañas
Se crean con un nombre y un icono, o con una tabla de opciones. La primera pestaña creada se abre sola.
local Main = Window:CreateTab("Main", "H")
local Combat = Window:CreateTab({
Name = "Combat",
Icon = icon("swords"),
IconColor = Color3.fromRGB(245, 194, 12),
Columns = 2,
Badge = "NEW",
})| Opción | Por defecto | Qué hace |
|---|---|---|
Icon | primera letra | Icono de Lucide, asset id o una letra (ver Iconos) |
IconColor | acento | Color del icono cuando la pestaña está activa |
Columns | 2 | Columnas de secciones (1 en pantallas estrechas) |
Badge | nil | Etiqueta junto al nombre, como "NEW" o un número |
Usa Window:AddTabCategory("Nombre") para poner un separador de texto en la barra lateral, como General o Automation.
Combat:Select()
Combat:SetName("Fight")
Combat:SetIcon(icon("flame"))
Combat:SetBadge(3)
Combat:SetBadge(nil)
Combat:SetVisible(false)
Combat:ScrollToTop()
Combat:Destroy()Iconos
Pestañas y secciones aceptan iconos de Lucide a través de lucide-roblox. Usa tamaño 48; el helper con pcall evita errores si el nombre no existe:
local Lucide = loadstring(game:HttpGet(
"https://github.com/latte-soft/lucide-roblox/releases/latest/download/lucide-roblox.luau"
))()
local function icon(name)
local ok, asset = pcall(Lucide.GetAsset, name, 48)
return ok and asset or nil
end
local Home = Window:CreateTab("Home", icon("home"))
local Combat = Window:CreateTab("Combat", icon("swords"))
local Aimbot = Combat:CreateSection({
Name = "Aimbot",
Icon = icon("crosshair"),
})| Valor de `Icon` | Resultado |
|---|---|
icon("home") | Icono de Lucide (recomendado) |
123456789 | Asset id → rbxassetid://123456789 |
"rbxassetid://123" | Asset id como texto |
"H" | Letra dentro de un recuadro (máx. 2 caracteres) |
nil | Pestañas: primera letra del nombre. Secciones: punto de color |
lucide-roblox usa nombres antiguos de Lucide: "home" en vez de "house", "line-chart" en vez de "chart-line".
Secciones
Las secciones agrupan elementos dentro de una pestaña. Se reparten solas entre las columnas, o puedes elegir dónde va cada una:
Tab:CreateSection({ Name = "Left", Column = "Left" })
Tab:CreateSection({ Name = "Right", Column = "Right" })
Tab:CreateSection({ Name = "Wide", Full = true })
Tab:CreateSection("Name only")Se pliegan pulsando su cabecera. Opciones y métodos:
local Section = Tab:CreateSection({
Name = "Aimbot",
Icon = icon("crosshair"),
Color = Color3.fromRGB(245, 194, 12),
Minimized = true,
Collapsible = true,
MaxHeight = 220,
})
Section:Minimize() Section:Expand() Section:Toggle()
Section:SetTitle("Another name")
Section:OnToggle(function(open) print(open) end)MaxHeight hace que el contenido tenga scroll al superar esa altura, y Minimized = true hace que empiece plegada.
Varias columnas dentro de una sección
local Grid = Tab:CreateSection({ Name = "Grid", Columns = 2 })
Grid:AddButton({ Name = "A" })
Grid:AddButton({ Name = "B", Column = 2 })
local left, right = Grid:AddColumns(2)
left:AddButton({ Name = "Left" })
right:AddButton({ Name = "Right" })Elementos
Todos se crean desde una sección con Section:AddXxx({ ... }). Los que tienen Flag se guardan en las configs.
| Elemento | Para qué | Se guarda |
|---|---|---|
AddButton | Ejecutar una acción | — |
AddToggle | Encendido / apagado, con tecla opcional | Sí |
AddSlider | Elegir un número arrastrando | Sí |
AddRangeSlider | Elegir un rango mínimo – máximo | Sí |
AddNumber | Número con botones − / + | Sí |
AddDropdown | Elegir una o varias opciones | Sí |
AddPlayerDropdown | Elegir jugadores del servidor | Opcional |
AddSegmented | Elegir entre 2–5 opciones con pastillas | Sí |
AddKeybind | Asignar una tecla | Sí |
AddTextBox | Escribir texto o números | Sí |
AddColorPicker | Elegir un color | Sí |
AddProgress, AddStat | Mostrar progreso o un valor | — |
AddAlert, AddCopyField, AddImage | Avisos, texto para copiar e imágenes | — |
AddLabel, AddParagraph, AddDivider, AddSpacer | Texto y diseño | — |
Opciones y métodos comunes
Casi todos aceptan Name, Flag, Callback, Description (texto bajo el nombre y tooltip), Tooltip, Visible y Enabled. Y comparten estos métodos:
element:Set(value, silent)
element:Get()
element:SetText("New name")
element:SetVisible(true)
element:SetEnabled(false)
element:SetCallback(function(value) end)
element:OnChanged(function(value) end)
element:Destroy()Los Callback se ejecutan con task.spawn: un error en tu función no rompe la interfaz. :Set(valor, true) cambia el valor sin ejecutar el callback.
Toggle
Interruptor estilo iOS o casilla (Style = "Checkbox"). Con Keybind aparece un chip con la tecla dentro de la misma fila:
local esp = Section:AddToggle({
Name = "ESP",
Description = "Shows players",
Default = false,
Style = "Switch",
Keybind = { Default = "F", Mode = "Toggle", Flag = "ESPKey" },
Flag = "ESP",
Callback = function(on)
print("ESP:", on)
end,
})
esp:Set(true) esp:Toggle() esp:Get()| `Mode` de la tecla | Qué hace |
|---|---|
Toggle (por defecto) | Cada pulsación enciende o apaga |
Hold | Encendido solo mientras se mantiene pulsada |
Para cambiar la tecla, el jugador hace clic en el chip y pulsa otra. Esc cancela y Backspace la quita.
Slider
La caja numérica de la derecha también se puede escribir. Los decimales se deducen de Increment (0.25 → 2 decimales). El callback se llama mientras se arrastra.
local speed = Section:AddSlider({
Name = "Speed",
Min = 16, Max = 100, Increment = 1, Default = 16,
Suffix = " ws",
Flag = "Speed",
Callback = function(v)
local h = game.Players.LocalPlayer.Character:FindFirstChildOfClass("Humanoid")
if h then h.WalkSpeed = v end
end,
})
speed:Set(50) speed:SetRange(0, 200)RangeSlider
Dos manijas para elegir un rango. El valor es una tabla { min, max }; si pasas los valores al revés se ordenan solos.
local levels = Section:AddRangeSlider({
Name = "Enemy level",
Min = 1, Max = 100,
Default = { 10, 60 },
Flag = "LevelRange",
Callback = function(v)
print(v[1], v[2])
end,
})
levels:Set({ 20, 80 })Number
Campo numérico con − y +. Mantener presionado un botón repite el cambio. Min y Max son opcionales.
local amount = Section:AddNumber({
Name = "Amount",
Min = 0, Max = 99, Increment = 1, Default = 5,
Suffix = "x",
Flag = "Amount",
Callback = function(v) end,
})
amount:Set(10)Dropdown
Con Multi = true el valor es una tabla. Con 7 o más opciones aparece un buscador. AllowNull = true deja quitar la selección haciendo clic en la opción elegida.
local target = Section:AddDropdown({
Name = "Target",
Options = { "Head", "Torso", "Legs" },
Default = "Head",
Multi = false,
AllowNull = false,
Flag = "Target",
Callback = function(v) end,
})
target:Set("Torso")
target:Refresh({ "Head", "Arms" }, true)
target:AddOption("Feet") target:RemoveOption("Arms") target:Clear()PlayerDropdown
Dropdown con los jugadores del servidor que se actualiza solo cuando alguien entra o sale. El valor es el nombre; GetPlayer() devuelve el objeto Player. No se guarda en configs salvo que pongas Savable = true.
local victim = Section:AddPlayerDropdown({
Name = "Player",
IncludeSelf = false,
Callback = function(name)
print("Picked:", name)
end,
})
local player = victim:GetPlayer()Segmented
Pastillas con un indicador que se desliza. Mejor que un dropdown cuando hay de 2 a 5 opciones.
local mode = Section:AddSegmented({
Name = "Mode",
Options = { "Safe", "Normal", "Fast" },
Default = "Normal",
Flag = "Mode",
Callback = function(v) end,
})
mode:Set("Fast")Keybind
local aim = Section:AddKeybind({
Name = "Aim key",
Default = Enum.KeyCode.E,
Mode = "Hold",
Flag = "AimKey",
Callback = function(holding) end,
Changed = function(key) end,
})
aim:Set(Enum.KeyCode.Q) aim:SetMode("Toggle")| `Mode` | `Callback` recibe |
|---|---|
Press | Nada; se llama una vez al pulsar |
Toggle | true / false alternando en cada pulsación |
Hold | true al pulsar y false al soltar |
Changed se ejecuta cuando el jugador reasigna la tecla. Las teclas no se disparan mientras se escribe en una caja de texto.
TextBox
Con Numeric = true el valor es un número. Por defecto el callback se ejecuta al pulsar Enter o al salir de la caja (CallbackOnBlur).
local msg = Section:AddTextBox({
Name = "Message",
Placeholder = "Type here...",
Default = "",
Numeric = false,
Flag = "Msg",
Callback = function(text) end,
})ColorPicker
Selector de saturación y brillo, barra de tono, caja hexadecimal y colores predefinidos opcionales.
local tint = Section:AddColorPicker({
Name = "ESP color",
Default = Color3.fromRGB(245, 194, 12),
Presets = { Color3.fromRGB(255, 80, 80), Color3.fromRGB(80, 200, 120) },
Flag = "ESPColor",
Callback = function(c) end,
})
tint:SetHex("#FF0000") tint:GetHex()Elementos para mostrar información
Progress
Barra de progreso de solo lectura. Con ShowPercent = false muestra el valor en bruto.
local bar = Section:AddProgress({ Name = "Loading", Min = 0, Max = 100, Default = 40 })
bar:Set(75)Stat
Fila con nombre a la izquierda y valor a la derecha: dinero, nivel, estado del farm…
local money = Section:AddStat({ Name = "Money", Value = "$0", Color = Color3.fromRGB(96, 196, 124) })
money:Set("$1500")
money:SetColor(Color3.fromRGB(224, 92, 92))Alert
Aviso destacado. Type puede ser Info, Success, Warning o Error, y el contenido acepta RichText.
local warning = Section:AddAlert({
Type = "Warning",
Title = "Careful",
Content = "This option can get you <b>kicked</b>.",
})
warning:Set("New title", "New content")
warning:SetType("Success")CopyField
Texto (un enlace, un código) con un botón Copy que lo copia al portapapeles.
Section:AddCopyField({
Name = "Discord",
Text = "discord.gg/cookieshub",
Callback = function(text) end,
})Image
Section:AddImage({
Image = 76143769732706,
Height = 120,
ScaleType = Enum.ScaleType.Fit,
Caption = "Text below",
})Label, Paragraph, Divider y Spacer
local info = Section:AddLabel("Info text")
Section:AddLabel({ Text = "Notice with <b>bold</b>", RichText = true, Color = Color3.fromRGB(232, 148, 58) })
local about = Section:AddParagraph({ Title = "Title", Content = "Longer description" })
about:Set("New title", "New content")
Section:AddDivider()
Section:AddDivider("Options")
Section:AddSpacer(8)Flags y configs
Un elemento con Flag queda registrado en Library.Flags y entra en las configs. Desde cualquier parte del script puedes leerlo o cambiarlo:
Library:GetFlag("ESP")
Library:SetFlag("ESP", true)
Library:GetObject("ESP")
Window:SaveConfig("my-config")
Window:LoadConfig("my-config")
Window:DeleteConfig("my-config")
Window:GetConfigs()Auto-carga
Una config marcada como auto-carga se aplica sola cada vez que el jugador ejecuta el script:
Window:SetAutoload("my-config")
Window:GetAutoload()
Window:LoadAutoloadConfig()- Las configs son archivos JSON dentro de
ConfigFolder. LoadConfigejecuta los callbacks de cada elemento, como si el jugador los hubiera cambiado.- No se guardan
Progress,Stat,CopyFieldniPlayerDropdown. Library.Flagses global: usa nombres deFlagúnicos si tienes varias ventanas.
Crea la pestaña de ajustes al final del script: así la auto-carga encuentra todos tus flags. Si no la usas, llama a Window:LoadAutoloadConfig() al terminar el menú.
Notificaciones
Type puede ser Info, Success, Warning o Error, cada uno con su icono. Duration = 0 hace que no se cierre sola. La notificación devuelta se puede actualizar:
Window:Notify({
Title = "Cookies Hub",
Content = "Config <b>loaded</b>",
Type = "Success",
Duration = 4,
})
local download = Window:Notify({ Title = "Downloading...", Content = "0%", Duration = 0 })
for i = 1, 10 do
task.wait(0.3)
download:SetContent(i * 10 .. "%")
end
download:SetTitle("Done")- Un clic la cierra (y ejecuta su
Callback, si tiene). - Con el mouse encima, el tiempo se pausa.
- Posición y límite:
Notify = { Position = "TopRight", Max = 5 }al crear la ventana.
Diálogos
Ventana modal para confirmar acciones. Sin Buttons muestra Cancel y Confirm; con Buttons puedes poner los que quieras, cada uno con su Style.
Window:Dialog({
Title = "Teleport?",
Content = "You will go to the final boss.",
Callback = function()
print("confirmed")
end,
})
Window:Dialog({
Title = "Save changes",
Content = "You have unsaved changes.",
Buttons = {
{ Name = "Cancel" },
{ Name = "Discard", Style = "Danger", Callback = function() end },
{ Name = "Save", Style = "Primary", Callback = function() end },
},
})Dismissible = false evita que se cierre al hacer clic fuera.
Marca de agua y lista de keybinds
Paneles flotantes que se pueden arrastrar y recuerdan su posición. La lista muestra las teclas de los toggles y se ilumina cuando están activos.
local wm = Window:CreateWatermark({ Text = "Cookies Hub", ShowFPS = true, ShowPing = true, ShowTime = true })
wm:SetText("My Hub") wm:SetVisible(false)
local binds = Window:CreateKeybindList({ Title = "Keybinds", ShowAll = false })
binds:Destroy()Búsqueda y tooltips
La lupa de la barra superior (o Ctrl+F) busca en pestañas, secciones y elementos. Al elegir un resultado se abre la pestaña, se despliega la sección y se resalta el elemento.
Los tooltips salen solos cuando un texto está cortado, o siempre que el elemento tenga Tooltip.
Window:OpenSearch("speed")
Window:CloseSearch()
Section:AddToggle({ Name = "Auto Farm", Tooltip = "Farms the nearest mob" })Temas y colores
Los temas se aplican en vivo: toda la interfaz se repinta sin recrearse. Hay 8 incluidos: Cookies, Mocha, Midnight, Ocean, Matcha, Strawberry, Grape y Graphite.
Library:SetTheme("Midnight")
Library:SetAccent(Color3.fromRGB(170, 120, 255))
Library:SetTheme({ Accent = Color3.fromRGB(255, 80, 80) })
local themes = Library:GetThemes()
local current = Library.CurrentThemeTambién puedes elegirlo al crear la ventana: Library:CreateWindow({ Theme = "Ocean" }).
Si el jugador elige un tema o un acento en Ajustes, su elección se guarda y tiene prioridad sobre el tema del script.
Crear tu propio tema
Library:AddTheme("Lava", {
Background = Color3.fromRGB(20, 10, 8), Panel = Color3.fromRGB(30, 14, 10),
Element = Color3.fromRGB(38, 18, 12), Row = Color3.fromRGB(48, 22, 14),
RowHover = Color3.fromRGB(60, 28, 18), Input = Color3.fromRGB(16, 8, 6),
Stroke = Color3.fromRGB(90, 40, 24), Outline = Color3.fromRGB(10, 5, 4),
Accent = Color3.fromRGB(255, 110, 40),
Text = Color3.fromRGB(250, 236, 228), Muted = Color3.fromRGB(190, 150, 130),
Dim = Color3.fromRGB(130, 100, 86),
Success = Color3.fromRGB(96, 196, 124), Warning = Color3.fromRGB(232, 148, 58),
Error = Color3.fromRGB(224, 92, 92),
})
Library:SetTheme("Lava")El tema nuevo aparece también en el selector de Ajustes. Usa colores distintos para cada clave: si dos comparten el mismo color, la librería no sabe cuál repintar al cambiar de tema.
Configuración global
Library:Configure cambia los valores por defecto de todas las ventanas que crees después: animaciones, tamaños, notificaciones, tooltips, intro…
Library:Configure({
Animations = true,
AnimationSpeed = 1,
Window = { Width = 740, Height = 500, Shadow = true, RememberLayout = true, UIScale = 1 },
Tab = { Columns = 2, Padding = 12, Gap = 10, IconSize = 20 },
Section = { Collapsible = true, Minimized = false },
Element = { Height = 32, Corner = 7 },
Notify = { Duration = 4, Position = "BottomRight", Max = 5 },
Tooltip = { Enabled = true, Delay = 0.55 },
Dropdown = { SearchThreshold = 7, MaxVisible = 5 },
Intro = { Enabled = true, Duration = 2, OncePerSession = true },
})Pestaña de ajustes
Window:CreateSettingsTab() crea una pestaña lista para usar:
- Appearance: tema, color de acento y escala de la UI.
- Interface: tecla del menú, botón flotante, animaciones, tooltips, marca de agua, lista de keybinds, Reset Layout y Unload UI.
- Configs: guardar, cargar, borrar y marcar una config como auto-carga.
Window:CreateSettingsTab("Settings", icon("settings"))Con RememberLayout = true la librería guarda en ConfigFolder/_ui_state.txt el tamaño, la posición, la pestaña abierta, el tema y la tecla del menú. Window:ResetLayout() lo borra.
Ejemplo completo
Un hub de ejemplo con iconos, estadísticas en vivo, sliders, toggles con tecla, diálogos, ESP de prueba y la pestaña de ajustes. Cópialo y ejecútalo tal cual:
local Library = loadstring(game:HttpGet("https://raw.githubusercontent.com/Lilwero20/CookiesLib/main/CookiesLib.lua"))()
local Lucide = loadstring(game:HttpGet(
"https://github.com/latte-soft/lucide-roblox/releases/latest/download/lucide-roblox.luau"
))()
local Players = game:GetService("Players")
local LocalPlayer = Players.LocalPlayer
local function icon(name)
local ok, asset = pcall(Lucide.GetAsset, name, 48)
return ok and asset or nil
end
local Window = Library:CreateWindow({
Title = "My Hub",
Subtitle = "Demo",
ToggleKey = Enum.KeyCode.RightShift,
Theme = "Cookies",
Notify = { Position = "TopRight" },
})
local running = true
Window:OnUnload(function() running = false end)
Window:AddTabCategory("General")
local Home = Window:CreateTab("Home", icon("home"))
local Info = Home:CreateSection({ Name = "Welcome", Full = true })
Info:AddAlert({ Type = "Info", Title = "My Hub", Content = "Press <b>RightShift</b> to hide the menu." })
local Stats = Home:CreateSection({ Name = "Live", Icon = icon("line-chart"), Column = "Left" })
local sPlayers = Stats:AddStat({ Name = "Players", Value = #Players:GetPlayers() })
local sTime = Stats:AddStat({ Name = "Time", Value = os.date("%H:%M:%S") })
local Links = Home:CreateSection({ Name = "Community", Icon = icon("users"), Column = "Right" })
Links:AddCopyField({ Name = "Discord", Text = "discord.gg/xxxxxx" })
task.spawn(function()
while running do
sPlayers:Set(#Players:GetPlayers())
sTime:Set(os.date("%H:%M:%S"))
task.wait(1)
end
end)
Window:AddTabCategory("Game")
local Player = Window:CreateTab({ Name = "Player", Icon = icon("user"), Badge = "NEW" })
local Move = Player:CreateSection({ Name = "Movement", Icon = icon("footprints"), Column = "Left" })
Move:AddSlider({
Name = "Walk speed", Min = 16, Max = 200, Default = 16, Suffix = " ws", Flag = "WalkSpeed",
Callback = function(v)
local h = LocalPlayer.Character and LocalPlayer.Character:FindFirstChildOfClass("Humanoid")
if h then h.WalkSpeed = v end
end,
})
Move:AddSegmented({ Name = "Mode", Options = { "Safe", "Normal", "Fast" }, Default = "Normal", Flag = "Mode" })
Move:AddToggle({
Name = "Infinite jump", Flag = "InfJump",
Keybind = { Default = "J", Flag = "InfJumpKey" },
Callback = function(on)
Window:Notify({ Title = "Infinite jump", Content = on and "On" or "Off", Type = on and "Success" or "Info" })
end,
})
local Tp = Player:CreateSection({ Name = "Teleport", Icon = icon("map-pin"), Column = "Right" })
local target = Tp:AddPlayerDropdown({ Name = "Target" })
Tp:AddButton({ Name = "Go to target", Primary = true, Callback = function()
local p = target:GetPlayer()
if not p then
return Window:Notify({ Title = "Teleport", Content = "Pick a player first", Type = "Warning" })
end
Window:Dialog({
Title = "Teleport?",
Content = "You will go next to <b>" .. p.DisplayName .. "</b>.",
Callback = function()
local mine = LocalPlayer.Character and LocalPlayer.Character:FindFirstChild("HumanoidRootPart")
local theirs = p.Character and p.Character:FindFirstChild("HumanoidRootPart")
if mine and theirs then mine.CFrame = theirs.CFrame * CFrame.new(0, 0, 3) end
end,
})
end })
Tp:AddButton({ Name = "Reset character", Style = "Danger", Confirm = true, Callback = function()
local h = LocalPlayer.Character and LocalPlayer.Character:FindFirstChildOfClass("Humanoid")
if h then h.Health = 0 end
end })
local Visuals = Window:CreateTab("Visuals", icon("eye"))
local Esp = Visuals:CreateSection({ Name = "ESP", Icon = icon("scan-eye") })
local c1, c2 = Esp:AddColumns(2)
c1:AddToggle({ Name = "Boxes", Style = "Checkbox", Flag = "EspBoxes" })
c2:AddToggle({ Name = "Names", Style = "Checkbox", Flag = "EspNames" })
Esp:AddColorPicker({ Name = "Color", Default = Color3.fromRGB(245, 194, 12), Flag = "EspColor" })
Esp:AddRangeSlider({ Name = "Distance", Min = 0, Max = 5000, Default = { 0, 1000 }, Flag = "EspRange" })
Window:CreateSettingsTab("Settings", icon("settings"))
Window:Notify({ Title = "My Hub", Content = "Loaded", Type = "Success" })Problemas comunes
- No veo la ventana al ejecutar: la intro la mantiene oculta unos 2 segundos (un clic la salta). Con
Intro = { Enabled = false }aparece al instante. - La intro no sale al re-ejecutar: es intencional (
OncePerSession). PonIntro = { OncePerSession = false }para verla siempre. - Cerré la ventana y no puedo abrirla: usa la
ToggleKeyo el botón flotante. En móvil no desactivesFloatingButton. - La ventana sale en otro sitio o con otro tema: la librería recuerda lo que dejó el jugador. Usa Reset Layout,
Window:ResetLayout()oRememberLayout = false. - Mi callback se ejecuta al cargar una config: es lo normal en
LoadConfig. Usa:Set(valor, true)para cambios silenciosos. - Mis loops siguen después de Unload UI: detenlos con
Window:OnUnload. - `Lucide.GetAsset` falla: el icono no existe; usa el helper con
pcall.