Teste antes de usar
Cole esta linha no seu executor e abre um menu de teste com todos os elementos ligados a notificações. Você não precisa escrever nada.
loadstring(game:HttpGet("https://raw.githubusercontent.com/Lilwero20/CookiesLib/main/CookiesDemo.lua"))()| Aba | O que dá para testar |
|---|---|
| Inicio (Início) | Aviso de boas-vindas, estatísticas ao vivo (FPS, ping, jogadores, hora), parágrafo, campo para copiar e imagem. |
| Controles | Botões (normal, principal, com confirmação, em colunas, desativado), toggles com tecla, sliders, caixas de texto, keybinds e dropdowns. |
| Avanzado (Avançado) | Seletor de pílulas, slider de intervalo, campos numéricos, barra de progresso, seletor de cor, alertas e seções com rolagem. |
| Avisos | Os 4 tipos de notificação, uma que se atualiza sozinha, diálogos, marca d'água, lista de keybinds e badges. |
| Personalizar | Tema, cor de destaque, título, tamanho da janela e o Key System de teste. |
| Ajustes | A aba de ajustes da biblioteca: tema, destaque, escala, tecla do menu, configs e carregamento automático. |
O menu de teste está em espanhol. A key do Key System de teste é COOKIES-DEMO. RightShift esconde ou mostra o menu e Ctrl+F abre a busca.
Instalação
A CookiesLib carrega do GitHub em uma linha. Funciona em qualquer executor que tenha loadstring e game:HttpGet:
local Library = loadstring(game:HttpGet("https://raw.githubusercontent.com/Lilwero20/CookiesLib/main/CookiesLib.lua"))()As outras funções do executor são opcionais. Se faltar alguma, a biblioteca se adapta:
| Função | Para que serve | Se não existir |
|---|---|---|
gethui | Colocar a UI num contêiner oculto | Usa PlayerGui |
writefile, readfile, isfolder, makefolder | Configs, estado salvo e key lembrada | Desativados |
listfiles | Listar configs | A lista fica vazia |
delfile | Apagar configs e a key salva | Apagar fica desativado |
setclipboard | Campos para copiar e links | Mostra o texto |
request | Abrir o convite do Discord | Só copia o link |
Início rápido
Uma janela com uma aba, uma seção e um toggle com tecla. É o ponto de partida de qualquer 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()Ao executar:
- 1A intro toca (logo e barra de carregamento; um clique pula) e a janela aparece.
- 2Aparece o botão flutuante com o logo. Um clique abre ou fecha a janela, e dá para arrastar.
- 3RightShift mostra ou esconde a janela e Ctrl+F abre a busca.
- 4Na próxima vez que você executar, a janela volta com o mesmo tamanho, posição, aba e tema.
Janela
Library:CreateWindow cria a janela principal. Todas as opções são opcionais:
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) },
})| Opção | Padrão | O que faz |
|---|---|---|
Title / Subtitle | "Cookies Hub" / versão | Textos da barra superior |
Logo | logo do Cookies | Imagem do título e do botão flutuante. false remove |
Width, Height | 740, 500 | Tamanho inicial |
ToggleKey | RightShift | Tecla para mostrar ou esconder |
FloatingButton | true | Botão flutuante para abrir a janela (importante no celular) |
Resizable / Draggable | true | Redimensionar pelo canto e arrastar pela barra |
Searchable | true | Botão de lupa e busca global |
ShowProfile | true | Cartão com avatar e nome na barra lateral |
RememberLayout | true | Lembra tamanho, posição, aba e tema entre execuções |
ConfigFolder | "CookiesHub" | Pasta das configs e do estado salvo |
CompactBelow | 600 | Abaixo dessa largura a barra lateral mostra só ícones |
Intro
A janela fica oculta enquanto a intro toca. Configure com Intro = { ... }: Enabled, Duration (segundos), Skippable, OncePerSession (não repete ao executar de novo na mesma partida), Logo e 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()Parar seus loops ao descarregar
Quando o jogador clica em Unload UI nos Ajustes, OnUnload avisa você para parar seus loops:
local running = true
Window:OnUnload(function() running = false end)
task.spawn(function()
while running do
task.wait(0.1)
end
end)Abas
Crie com um nome e um ícone, ou com uma tabela de opções. A primeira aba criada abre sozinha.
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",
})| Opção | Padrão | O que faz |
|---|---|---|
Icon | primeira letra | Ícone do Lucide, asset id ou uma letra (veja Ícones) |
IconColor | destaque | Cor do ícone quando a aba está ativa |
Columns | 2 | Colunas de seções (1 em telas estreitas) |
Badge | nil | Etiqueta ao lado do nome, como "NEW" ou um número |
Use Window:AddTabCategory("Nome") para colocar um separador de texto na barra lateral, como General ou Automation.
Combat:Select()
Combat:SetName("Fight")
Combat:SetIcon(icon("flame"))
Combat:SetBadge(3)
Combat:SetBadge(nil)
Combat:SetVisible(false)
Combat:ScrollToTop()
Combat:Destroy()Ícones
Abas e seções aceitam ícones do Lucide através do lucide-roblox. Use tamanho 48; o helper com pcall evita erros quando o nome não 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") | Ícone do Lucide (recomendado) |
123456789 | Asset id → rbxassetid://123456789 |
"rbxassetid://123" | Asset id como texto |
"H" | Letra dentro de um quadrado (máx. 2 caracteres) |
nil | Abas: primeira letra do nome. Seções: ponto colorido |
O lucide-roblox usa nomes antigos do Lucide: "home" em vez de "house", "line-chart" em vez de "chart-line".
Seções
As seções agrupam elementos dentro de uma aba. Elas se distribuem sozinhas entre as colunas, ou você escolhe onde cada uma fica:
Tab:CreateSection({ Name = "Left", Column = "Left" })
Tab:CreateSection({ Name = "Right", Column = "Right" })
Tab:CreateSection({ Name = "Wide", Full = true })
Tab:CreateSection("Name only")Elas recolhem ao clicar no cabeçalho. Opções e 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 faz o conteúdo rolar passando dessa altura, e Minimized = true faz a seção começar recolhida.
Várias colunas dentro de uma seção
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 são criados a partir de uma seção com Section:AddXxx({ ... }). Os que têm Flag são salvos nas configs.
| Elemento | Para que serve | Salva |
|---|---|---|
AddButton | Executar uma ação | — |
AddToggle | Liga / desliga, com tecla opcional | Sim |
AddSlider | Escolher um número arrastando | Sim |
AddRangeSlider | Escolher um intervalo mín. – máx. | Sim |
AddNumber | Número com botões − / + | Sim |
AddDropdown | Escolher uma ou várias opções | Sim |
AddPlayerDropdown | Escolher jogadores do servidor | Opcional |
AddSegmented | Escolher entre 2–5 opções com pílulas | Sim |
AddKeybind | Atribuir uma tecla | Sim |
AddTextBox | Digitar texto ou números | Sim |
AddColorPicker | Escolher uma cor | Sim |
AddProgress, AddStat | Mostrar progresso ou um valor | — |
AddAlert, AddCopyField, AddImage | Avisos, texto para copiar e imagens | — |
AddLabel, AddParagraph, AddDivider, AddSpacer | Texto e layout | — |
Opções e métodos comuns
Quase todos aceitam Name, Flag, Callback, Description (texto abaixo do nome e tooltip), Tooltip, Visible e Enabled. E compartilham estes 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()Todo Callback roda com task.spawn: um erro na sua função não quebra a interface. :Set(valor, true) muda o valor sem executar o callback.
Toggle
Interruptor estilo iOS ou caixa de seleção (Style = "Checkbox"). Com Keybind aparece um chip com a tecla na mesma linha:
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` da tecla | O que faz |
|---|---|
Toggle (padrão) | Cada toque liga ou desliga |
Hold | Ligado só enquanto a tecla está pressionada |
Para trocar a tecla, o jogador clica no chip e aperta outra. Esc cancela e Backspace remove.
Slider
A caixa numérica da direita também aceita digitação. As casas decimais vêm de Increment (0.25 → 2 casas). O callback roda enquanto arrasta.
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
Duas alças para escolher um intervalo. O valor é uma tabela { min, max }; se você passar os valores invertidos, eles são ordenados.
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 com − e +. Segurar um botão repete a mudança. Min e Max são opcionais.
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
Com Multi = true o valor é uma tabela. Com 7 ou mais opções aparece uma busca. AllowNull = true deixa limpar a seleção clicando na opção escolhida.
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 com os jogadores do servidor que se atualiza sozinho quando alguém entra ou sai. O valor é o nome; GetPlayer() retorna o objeto Player. Não é salvo nas configs, a menos que você use Savable = true.
local victim = Section:AddPlayerDropdown({
Name = "Player",
IncludeSelf = false,
Callback = function(name)
print("Picked:", name)
end,
})
local player = victim:GetPlayer()Segmented
Pílulas com um indicador que desliza. Melhor que um dropdown quando há de 2 a 5 opções.
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` recebe |
|---|---|
Press | Nada; roda uma vez por toque |
Toggle | true / false, alternando a cada toque |
Hold | true ao apertar e false ao soltar |
Changed roda quando o jogador troca a tecla. As teclas não disparam enquanto o jogador digita numa caixa de texto.
TextBox
Com Numeric = true o valor é um número. Por padrão o callback roda ao apertar Enter ou ao sair da caixa (CallbackOnBlur).
local msg = Section:AddTextBox({
Name = "Message",
Placeholder = "Type here...",
Default = "",
Numeric = false,
Flag = "Msg",
Callback = function(text) end,
})ColorPicker
Seletor de saturação e brilho, barra de matiz, caixa hexadecimal e cores predefinidas opcionais.
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 informação
Progress
Barra de progresso só de leitura. Com ShowPercent = false mostra o valor bruto.
local bar = Section:AddProgress({ Name = "Loading", Min = 0, Max = 100, Default = 40 })
bar:Set(75)Stat
Linha com o nome à esquerda e o valor à direita: dinheiro, nível, status do 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 em destaque. Type pode ser Info, Success, Warning ou Error, e o conteúdo aceita 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 (um link, um código) com um botão Copy que copia para a área de transferência.
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 e 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 e configs
Um elemento com Flag fica registrado em Library.Flags e entra nas configs. Você pode ler ou mudar o valor de qualquer parte do script:
Library:GetFlag("ESP")
Library:SetFlag("ESP", true)
Library:GetObject("ESP")
Window:SaveConfig("my-config")
Window:LoadConfig("my-config")
Window:DeleteConfig("my-config")
Window:GetConfigs()Carregamento automático
Uma config marcada como auto-load é aplicada sozinha toda vez que o jogador executa o script:
Window:SetAutoload("my-config")
Window:GetAutoload()
Window:LoadAutoloadConfig()- As configs são arquivos JSON dentro de
ConfigFolder. LoadConfigexecuta o callback de cada elemento, como se o jogador tivesse mudado.Progress,Stat,CopyFieldePlayerDropdownnão são salvos.Library.Flagsé global: use nomes deFlagúnicos se tiver várias janelas.
Crie a aba de ajustes no final do script para que o carregamento automático encontre todos os seus flags. Se não usar, chame Window:LoadAutoloadConfig() quando o menu estiver pronto.
Notificações
Type pode ser Info, Success, Warning ou Error, cada um com seu ícone. Duration = 0 deixa aberta. A notificação retornada pode ser atualizada:
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")- Um clique fecha (e executa o
Callback, se tiver). - Com o mouse em cima, o tempo pausa.
- Posição e limite:
Notify = { Position = "TopRight", Max = 5 }ao criar a janela.
Diálogos
Janela modal para confirmar ações. Sem Buttons mostra Cancel e Confirm; com Buttons você coloca os que quiser, cada um com seu 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 impede que feche ao clicar fora.
Marca d'água e lista de keybinds
Painéis flutuantes que dá para arrastar e que lembram a posição. A lista mostra as teclas dos toggles e acende quando estão ativos.
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()Busca e tooltips
A lupa da barra superior (ou Ctrl+F) busca em abas, seções e elementos. Ao escolher um resultado, a aba abre, a seção se expande e o elemento fica destacado.
Os tooltips aparecem sozinhos quando um texto está cortado, ou sempre que o elemento tem Tooltip.
Window:OpenSearch("speed")
Window:CloseSearch()
Section:AddToggle({ Name = "Auto Farm", Tooltip = "Farms the nearest mob" })Temas e cores
Os temas se aplicam ao vivo: a interface inteira é repintada sem ser recriada. Há 8 incluídos: Cookies, Mocha, Midnight, Ocean, Matcha, Strawberry, Grape e 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.CurrentThemeVocê também pode escolher ao criar a janela: Library:CreateWindow({ Theme = "Ocean" }).
Se o jogador escolher um tema ou destaque nos Ajustes, a escolha dele é salva e tem prioridade sobre o tema do script.
Criar seu próprio 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")O novo tema também aparece no seletor dos Ajustes. Use uma cor diferente para cada chave: se duas chaves tiverem a mesma cor, a biblioteca não sabe qual repintar ao trocar de tema.
Configuração global
Library:Configure muda os valores padrão de todas as janelas que você criar depois: animações, tamanhos, notificações, 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 },
})Aba de ajustes
Window:CreateSettingsTab() cria uma aba pronta para usar:
- Appearance: tema, cor de destaque e escala da UI.
- Interface: tecla do menu, botão flutuante, animações, tooltips, marca d'água, lista de keybinds, Reset Layout e Unload UI.
- Configs: salvar, carregar, apagar e marcar uma config como auto-load.
Window:CreateSettingsTab("Settings", icon("settings"))Com RememberLayout = true a biblioteca salva em ConfigFolder/_ui_state.txt o tamanho, a posição, a aba aberta, o tema e a tecla do menu. Window:ResetLayout() apaga esse arquivo.
Exemplo completo
Um hub de exemplo com ícones, estatísticas ao vivo, sliders, toggles com tecla, diálogos, uma aba de ESP de exemplo e a aba de ajustes. Copie e execute do jeito que está:
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 comuns
- Não vejo a janela ao executar: a intro a mantém oculta por uns 2 segundos (um clique pula). Com
Intro = { Enabled = false }ela aparece na hora. - A intro não aparece ao executar de novo: é de propósito (
OncePerSession). UseIntro = { OncePerSession = false }para ver sempre. - Fechei a janela e não consigo abrir: use a
ToggleKeyou o botão flutuante. No celular, não desativeFloatingButton. - A janela abre em outro lugar ou com outro tema: a biblioteca lembra o que o jogador deixou. Use Reset Layout,
Window:ResetLayout()ouRememberLayout = false. - Meu callback roda ao carregar uma config: é normal no
LoadConfig. Use:Set(valor, true)para mudanças silenciosas. - Meus loops continuam depois do Unload UI: pare-os com
Window:OnUnload. - `Lucide.GetAsset` falha: o ícone não existe; use o helper com
pcall.