--[[ Apollo Hub - Roblox LocalScript Categorias: Informação, Início, Jogador, Jogadores, Avatar, Casa, Áudio/Música, Proteção, Teleporte, Configuração, Crédito COMO USAR: 1. Coloque este script como um LocalScript dentro de StarterPlayer > StarterPlayerScripts (ou dentro de um ScreenGui em StarterGui, como LocalScript). 2. Ao entrar no jogo vai aparecer um botão (ícone) no canto superior esquerdo. 3. Clique nele para abrir/fechar o painel. OBS: As categorias aqui são só a estrutura visual (placeholders), exceto Informação, Início, Jogador, Jogadores, Avatar e Teleporte/Configuração, que já vêm com conteúdo pronto. Pra cada categoria fazer algo de verdade (teleportar, trocar avatar, etc.) você precisa ligar isso a um sistema do SEU jogo (RemoteEvents, módulos etc.). ATUALIZAÇÕES: - Ícones novos em "Jogador" e "Jogadores". - Ícones das categorias maiores. - Aba "Informação" com créditos + Discord. - Aba "Início" com status do jogador, servidor e resolução (FOV da câmera). - Aba "Jogador" com barras de Velocidade / Super Pulo / Gravidade (0-1000) + botão de reset. - Aba "Jogadores" com seletor de jogador (busca + lista + foto + id), Teleportar, Visualizar (spectate) e Atualizar lista. - Aba "Avatar" com seletor de jogador, botão de copiar o visual completo (corpo, roupas, acessórios, cores e altura/escala) e um sistema de "código de skin" pra copiar/colar (igual a ideia de skins do Brookhaven, mas só visual no cliente). - Popup de boas-vindas atualizado com botão de Discord + OK. IMPORTANTE SOBRE A ABA "AVATAR": Mudar a aparência via HumanoidDescription a partir de um LocalScript só é visível PRA VOCÊ MESMO. O Roblox não deixa um cliente mudar o visual de um jeito que os outros jogadores da sala vejam — isso só é possível com um Script (servidor). Então o "código de skin" daqui serve pra você guardar/compartilhar uma combinação de visual e aplicar localmente, não pra sincronizar com todo mundo no servidor. ]] local Players = game:GetService("Players") local TweenService = game:GetService("TweenService") local UserInputService = game:GetService("UserInputService") local LocalPlayer = Players.LocalPlayer local PlayerGui = LocalPlayer:WaitForChild("PlayerGui") local oldGui = PlayerGui:FindFirstChild("ApolloUI") if oldGui then oldGui:Destroy() end ------------------------------------------------------------ -- IMAGENS (rbxassetid) ------------------------------------------------------------ local IMAGES = { Background = "rbxassetid://112936672736233", OpenButton = "rbxassetid://75536915971879", Informacao = "rbxassetid://99817994990650", Inicio = "rbxassetid://96654633860104", Jogador = "rbxassetid://100103388050732", Jogadores = "rbxassetid://87153697054693", Avatar = "rbxassetid://94082885196830", Casa = "rbxassetid://82488438051860", Musica = "rbxassetid://83223736609777", Protecao = "rbxassetid://106618616722076", Teleporte = "rbxassetid://85775708362810", Configuracao = "rbxassetid://126678377094199", Discord = "", -- coloque aqui o rbxassetid do seu ícone do Discord quando tiver um } -- Link de convite do Discord. Deixe "" enquanto ainda não tiver um servidor. local DISCORD_LINK = "" ------------------------------------------------------------ -- CORES (tema roxo) ------------------------------------------------------------ local COLORS = { Background = Color3.fromRGB(20, 12, 30), Panel = Color3.fromRGB(70, 20, 120), PanelLight = Color3.fromRGB(95, 30, 160), Purple = Color3.fromRGB(170, 60, 245), Text = Color3.fromRGB(240, 240, 245), TextDim = Color3.fromRGB(200, 180, 225), } ------------------------------------------------------------ -- UTILITÁRIOS ------------------------------------------------------------ local function create(class, props, children) local inst = Instance.new(class) for prop, value in pairs(props or {}) do inst[prop] = value end for _, child in ipairs(children or {}) do child.Parent = inst end return inst end local function corner(radius) return create("UICorner", { CornerRadius = UDim.new(0, radius or 10) }) end local function stroke(color, thickness) return create("UIStroke", { Color = color or COLORS.Purple, Thickness = thickness or 1.5, ApplyStrokeMode = Enum.ApplyStrokeMode.Border, }) end ------------------------------------------------------------ -- SCREEN GUI ------------------------------------------------------------ local ScreenGui = create("ScreenGui", { Name = "ApolloUI", ResetOnSpawn = false, ZIndexBehavior = Enum.ZIndexBehavior.Sibling, Parent = PlayerGui, }) ------------------------------------------------------------ -- BOTÃO PARA ABRIR O PAINEL ------------------------------------------------------------ local OpenButton = create("TextButton", { Name = "OpenButton", Parent = ScreenGui, Size = UDim2.new(0, 54, 0, 54), Position = UDim2.new(0, 20, 0, 20), BackgroundColor3 = COLORS.Panel, BackgroundTransparency = 0.15, AutoButtonColor = false, Text = "", }, { corner(14), stroke(COLORS.Purple, 2), create("ImageLabel", { Name = "Icon", AnchorPoint = Vector2.new(0.5, 0.5), Position = UDim2.new(0.5, 0, 0.5, 0), Size = UDim2.new(0, 32, 0, 32), BackgroundTransparency = 1, Image = IMAGES.OpenButton, ScaleType = Enum.ScaleType.Fit, }), }) ------------------------------------------------------------ -- FRAME PRINCIPAL ------------------------------------------------------------ local MainFrame = create("Frame", { Name = "MainFrame", Parent = ScreenGui, AnchorPoint = Vector2.new(0.5, 0.5), Position = UDim2.new(0.5, 0, 0.5, 0), Size = UDim2.new(0, 0, 0, 0), BackgroundColor3 = COLORS.Background, BackgroundTransparency = 1, ClipsDescendants = true, Visible = false, }, { corner(16), stroke(COLORS.Purple, 2), }) -- Imagem de fundo do painel inteiro local BackgroundImage = create("ImageLabel", { Name = "BackgroundImage", Parent = MainFrame, Size = UDim2.new(1, 0, 1, 0), BackgroundColor3 = COLORS.Background, BackgroundTransparency = 0.25, Image = IMAGES.Background, ScaleType = Enum.ScaleType.Crop, ImageTransparency = 0.05, ZIndex = 0, }, { corner(16) }) local FULL_SIZE = UDim2.new(0, 640, 0, 430) local MIN_SIZE = UDim2.new(0, 640, 0, 42) ------------------------------------------------------------ -- BARRA SUPERIOR ------------------------------------------------------------ local TopBar = create("Frame", { Name = "TopBar", Parent = MainFrame, Size = UDim2.new(1, 0, 0, 42), BackgroundColor3 = COLORS.Panel, BackgroundTransparency = 0.25, ZIndex = 2, }, { corner(16) }) create("Frame", { Parent = TopBar, Size = UDim2.new(1, 0, 0, 16), Position = UDim2.new(0, 0, 1, -16), BackgroundColor3 = COLORS.Panel, BackgroundTransparency = 0.25, BorderSizePixel = 0, ZIndex = 1, }) create("ImageLabel", { Name = "TitleIcon", Parent = TopBar, BackgroundTransparency = 1, Position = UDim2.new(0, 16, 0.5, -12), Size = UDim2.new(0, 24, 0, 24), Image = IMAGES.OpenButton, ScaleType = Enum.ScaleType.Fit, ZIndex = 2, }) create("TextLabel", { Parent = TopBar, BackgroundTransparency = 1, Position = UDim2.new(0, 48, 0, 0), Size = UDim2.new(0, 280, 1, 0), Text = "Apollo Hub", TextXAlignment = Enum.TextXAlignment.Left, Font = Enum.Font.GothamBold, TextSize = 16, TextColor3 = COLORS.Text, ZIndex = 2, }) local CloseButton = create("TextButton", { Name = "CloseButton", Parent = TopBar, AnchorPoint = Vector2.new(1, 0.5), Position = UDim2.new(1, -10, 0.5, 0), Size = UDim2.new(0, 28, 0, 28), BackgroundColor3 = COLORS.PanelLight, Text = "X", TextColor3 = COLORS.Text, Font = Enum.Font.GothamBold, TextSize = 14, AutoButtonColor = false, ZIndex = 2, }, { corner(8), stroke(COLORS.Purple, 1.5) }) local MinimizeButton = create("TextButton", { Name = "MinimizeButton", Parent = TopBar, AnchorPoint = Vector2.new(1, 0.5), Position = UDim2.new(1, -46, 0.5, 0), Size = UDim2.new(0, 28, 0, 28), BackgroundColor3 = COLORS.PanelLight, Text = "-", TextColor3 = COLORS.Text, Font = Enum.Font.GothamBold, TextSize = 18, AutoButtonColor = false, ZIndex = 2, }, { corner(8), stroke(COLORS.Purple, 1.5) }) ------------------------------------------------------------ -- CONTAINER (sidebar + conteúdo) ------------------------------------------------------------ local Container = create("Frame", { Name = "Container", Parent = MainFrame, Position = UDim2.new(0, 0, 0, 42), Size = UDim2.new(1, 0, 1, -42), BackgroundTransparency = 1, ZIndex = 2, }) ------------------------------------------------------------ -- SIDEBAR ------------------------------------------------------------ local Sidebar = create("Frame", { Name = "Sidebar", Parent = Container, Size = UDim2.new(0, 190, 1, 0), BackgroundColor3 = COLORS.Panel, BackgroundTransparency = 0.3, }) create("UIListLayout", { Parent = Sidebar, Padding = UDim.new(0, 4), SortOrder = Enum.SortOrder.LayoutOrder, }) create("UIPadding", { Parent = Sidebar, PaddingTop = UDim.new(0, 8), PaddingLeft = UDim.new(0, 6), PaddingRight = UDim.new(0, 6), }) ------------------------------------------------------------ -- ÁREA DE CONTEÚDO ------------------------------------------------------------ local ContentArea = create("Frame", { Name = "ContentArea", Parent = Container, Position = UDim2.new(0, 190, 0, 0), Size = UDim2.new(1, -190, 1, 0), BackgroundTransparency = 1, }) ------------------------------------------------------------ -- CATEGORIAS (nome + ícone, usa imagem quando disponível, senão emoji) ------------------------------------------------------------ local categorias = { { nome = "Informação", icone = "ℹ️", imagem = IMAGES.Informacao }, { nome = "Início", icone = "🏠", imagem = IMAGES.Inicio }, { nome = "Jogador", icone = "🧍", imagem = IMAGES.Jogador }, { nome = "Jogadores", icone = "👥", imagem = IMAGES.Jogadores }, { nome = "Avatar", icone = "🧥", imagem = IMAGES.Avatar }, { nome = "Casa", icone = "🏡", imagem = IMAGES.Casa }, { nome = "Áudio/Música", icone = "🎵", imagem = IMAGES.Musica }, { nome = "Proteção", icone = "🛡️", imagem = IMAGES.Protecao }, { nome = "Teleporte", icone = "🌀", imagem = IMAGES.Teleporte }, { nome = "Configuração", icone = "⚙️", imagem = IMAGES.Configuracao }, { nome = "Crédito", icone = "⭐" }, } local tabButtons = {} local pages = {} local currentTab = nil local function selectTab(name) if currentTab == name then return end currentTab = name for tabName, data in pairs(tabButtons) do local isSelected = (tabName == name) TweenService:Create(data.bar, TweenInfo.new(0.18, Enum.EasingStyle.Quad), { BackgroundTransparency = isSelected and 0 or 1, }):Play() TweenService:Create(data.label, TweenInfo.new(0.18, Enum.EasingStyle.Quad), { TextColor3 = isSelected and COLORS.Text or COLORS.TextDim, }):Play() data.button.BackgroundColor3 = isSelected and COLORS.PanelLight or COLORS.Panel data.button.BackgroundTransparency = isSelected and 0.1 or 0.4 end for pageName, page in pairs(pages) do page.Visible = (pageName == name) end end for i, cat in ipairs(categorias) do local nome = cat.nome local temImagem = cat.imagem ~= nil and cat.imagem ~= "" local TabButton = create("Frame", { Name = nome, Parent = Sidebar, LayoutOrder = i, Size = UDim2.new(1, 0, 0, 34), BackgroundColor3 = COLORS.Panel, BackgroundTransparency = 0.4, ClipsDescendants = true, }, { corner(8) }) local SelectBar = create("Frame", { Name = "SelectBar", Parent = TabButton, AnchorPoint = Vector2.new(0, 0.5), Size = UDim2.new(0, 4, 1, -10), Position = UDim2.new(0, 0, 0.5, 0), BackgroundColor3 = COLORS.Purple, BackgroundTransparency = 1, }, { corner(4) }) local textOffsetX = 14 if temImagem then create("ImageLabel", { Name = "Icon", Parent = TabButton, Position = UDim2.new(0, 10, 0.5, -12), Size = UDim2.new(0, 24, 0, 24), BackgroundTransparency = 1, Image = cat.imagem, ScaleType = Enum.ScaleType.Fit, }) textOffsetX = 42 end local Label = create("TextLabel", { Parent = TabButton, BackgroundTransparency = 1, Position = UDim2.new(0, textOffsetX, 0, 0), Size = UDim2.new(1, -textOffsetX - 6, 1, 0), Text = temImagem and nome or (cat.icone .. " " .. nome), TextXAlignment = Enum.TextXAlignment.Left, Font = Enum.Font.Gotham, TextSize = 14, TextColor3 = COLORS.TextDim, }) local ClickDetector = create("TextButton", { Parent = TabButton, BackgroundTransparency = 1, Size = UDim2.new(1, 0, 1, 0), Text = "", }) ClickDetector.MouseButton1Click:Connect(function() selectTab(nome) end) tabButtons[nome] = { button = TabButton, bar = SelectBar, label = Label } local Page = create("ScrollingFrame", { Name = nome .. "Page", Parent = ContentArea, Size = UDim2.new(1, 0, 1, 0), BackgroundTransparency = 1, Visible = false, ScrollBarThickness = 4, ScrollBarImageColor3 = COLORS.Purple, AutomaticCanvasSize = Enum.AutomaticSize.Y, CanvasSize = UDim2.new(0, 0, 0, 0), }) create("UIPadding", { Parent = Page, PaddingTop = UDim.new(0, 14), PaddingLeft = UDim.new(0, 16), PaddingRight = UDim.new(0, 16), }) create("UIListLayout", { Parent = Page, Padding = UDim.new(0, 8), SortOrder = Enum.SortOrder.LayoutOrder, }) local HeaderRow = create("Frame", { Parent = Page, BackgroundTransparency = 1, Size = UDim2.new(1, 0, 0, 30), }) local headerTextOffset = 0 if temImagem then create("ImageLabel", { Parent = HeaderRow, Position = UDim2.new(0, 0, 0.5, -15), Size = UDim2.new(0, 30, 0, 30), BackgroundTransparency = 1, Image = cat.imagem, ScaleType = Enum.ScaleType.Fit, }) headerTextOffset = 40 end create("TextLabel", { Parent = HeaderRow, BackgroundTransparency = 1, Position = UDim2.new(0, headerTextOffset, 0, 0), Size = UDim2.new(1, -headerTextOffset, 1, 0), Text = temImagem and nome or (cat.icone .. " " .. nome), Font = Enum.Font.GothamBold, TextSize = 20, TextColor3 = COLORS.Text, TextXAlignment = Enum.TextXAlignment.Left, }) -- "Informação", "Início", "Jogador", "Jogadores", "Avatar", "Teleporte" e -- "Configuração" têm conteúdo próprio (montado depois deste loop), então -- não recebem o placeholder genérico. if nome ~= "Informação" and nome ~= "Início" and nome ~= "Jogador" and nome ~= "Jogadores" and nome ~= "Avatar" and nome ~= "Teleporte" and nome ~= "Configuração" then create("TextLabel", { Parent = Page, BackgroundTransparency = 1, Size = UDim2.new(1, 0, 0, 20), Text = 'Conteúdo da categoria "' .. nome .. '" vai aqui.', Font = Enum.Font.Gotham, TextSize = 13, TextColor3 = COLORS.TextDim, TextXAlignment = Enum.TextXAlignment.Left, }) end pages[nome] = Page end ------------------------------------------------------------ -- CONTEÚDO PERSONALIZADO: INFORMAÇÃO ------------------------------------------------------------ do local InfoPage = pages["Informação"] local CreditCard = create("Frame", { Name = "CreditCard", Parent = InfoPage, LayoutOrder = 1, Size = UDim2.new(1, 0, 0, 150), BackgroundColor3 = COLORS.Panel, BackgroundTransparency = 0.35, }, { corner(10), stroke(COLORS.Purple, 1.5) }) create("UIPadding", { Parent = CreditCard, PaddingTop = UDim.new(0, 14), PaddingLeft = UDim.new(0, 14), PaddingRight = UDim.new(0, 14), }) create("UIListLayout", { Parent = CreditCard, Padding = UDim.new(0, 8), SortOrder = Enum.SortOrder.LayoutOrder, }) create("TextLabel", { Parent = CreditCard, LayoutOrder = 1, BackgroundTransparency = 1, Size = UDim2.new(1, 0, 0, 20), Text = "By Lightbolt_dev", Font = Enum.Font.GothamBold, TextSize = 14, TextColor3 = COLORS.Purple, TextXAlignment = Enum.TextXAlignment.Left, }) create("TextLabel", { Parent = CreditCard, LayoutOrder = 2, BackgroundTransparency = 1, Size = UDim2.new(1, 0, 0, 18), Text = "Dono: Lightbolt_dev", Font = Enum.Font.Gotham, TextSize = 13, TextColor3 = COLORS.Text, TextXAlignment = Enum.TextXAlignment.Left, }) create("TextLabel", { Parent = CreditCard, LayoutOrder = 3, BackgroundTransparency = 1, Size = UDim2.new(1, 0, 0, 18), Text = "Tik Tok: light.bolt", Font = Enum.Font.Gotham, TextSize = 13, TextColor3 = COLORS.Text, TextXAlignment = Enum.TextXAlignment.Left, }) local DiscordRow = create("Frame", { Parent = CreditCard, LayoutOrder = 4, BackgroundTransparency = 1, Size = UDim2.new(1, 0, 0, 22), }) if IMAGES.Discord ~= "" then create("ImageLabel", { Parent = DiscordRow, Position = UDim2.new(0, 0, 0.5, -9), Size = UDim2.new(0, 18, 0, 18), BackgroundTransparency = 1, Image = IMAGES.Discord, ScaleType = Enum.ScaleType.Fit, }) end create("TextLabel", { Name = "DiscordLabel", Parent = DiscordRow, Position = UDim2.new(0, IMAGES.Discord ~= "" and 24 or 0, 0, 0), Size = UDim2.new(1, IMAGES.Discord ~= "" and -24 or 0, 1, 0), BackgroundTransparency = 1, Text = (DISCORD_LINK ~= "" and ("Discord: " .. DISCORD_LINK)) or "Discord: ainda não temos", Font = Enum.Font.Gotham, TextSize = 13, TextColor3 = COLORS.Text, TextXAlignment = Enum.TextXAlignment.Left, }) end ------------------------------------------------------------ -- CONTEÚDO PERSONALIZADO: INÍCIO ------------------------------------------------------------ do local InicioPage = pages["Início"] local RunService = game:GetService("RunService") ------------------------------------------------------ -- Status do jogador ------------------------------------------------------ local StatusCard = create("Frame", { Name = "StatusCard", Parent = InicioPage, LayoutOrder = 1, Size = UDim2.new(1, 0, 0, 100), BackgroundColor3 = COLORS.Panel, BackgroundTransparency = 0.35, }, { corner(10), stroke(COLORS.Purple, 1.5) }) local AvatarImage = create("ImageLabel", { Name = "AvatarImage", Parent = StatusCard, Position = UDim2.new(0, 12, 0.5, -38), Size = UDim2.new(0, 76, 0, 76), BackgroundColor3 = COLORS.PanelLight, Image = "", ScaleType = Enum.ScaleType.Fit, }, { corner(10) }) task.spawn(function() local ok, content = pcall(function() return Players:GetUserThumbnailAsync( LocalPlayer.UserId, Enum.ThumbnailType.HeadShot, Enum.ThumbnailSize.Size180x180 ) end) if ok and content then AvatarImage.Image = content end end) local InfoColumn = create("Frame", { Parent = StatusCard, Position = UDim2.new(0, 100, 0, 10), Size = UDim2.new(1, -112, 1, -20), BackgroundTransparency = 1, }) create("UIListLayout", { Parent = InfoColumn, Padding = UDim.new(0, 2), SortOrder = Enum.SortOrder.LayoutOrder, }) create("TextLabel", { Parent = InfoColumn, LayoutOrder = 1, BackgroundTransparency = 1, Size = UDim2.new(1, 0, 0, 18), Text = "Nome: " .. LocalPlayer.Name, Font = Enum.Font.Gotham, TextSize = 13, TextColor3 = COLORS.Text, TextXAlignment = Enum.TextXAlignment.Left, }) create("TextLabel", { Parent = InfoColumn, LayoutOrder = 2, BackgroundTransparency = 1, Size = UDim2.new(1, 0, 0, 18), Text = "Id: " .. LocalPlayer.UserId, Font = Enum.Font.Gotham, TextSize = 13, TextColor3 = COLORS.Text, TextXAlignment = Enum.TextXAlignment.Left, }) local TempoLabel = create("TextLabel", { Parent = InfoColumn, LayoutOrder = 3, BackgroundTransparency = 1, Size = UDim2.new(1, 0, 0, 18), Text = "Tempo: 0s", Font = Enum.Font.Gotham, TextSize = 13, TextColor3 = COLORS.Text, TextXAlignment = Enum.TextXAlignment.Left, }) local FpsLabel = create("TextLabel", { Parent = InfoColumn, LayoutOrder = 4, BackgroundTransparency = 1, Size = UDim2.new(1, 0, 0, 18), Text = "Fps: 0", Font = Enum.Font.Gotham, TextSize = 13, TextColor3 = COLORS.Text, TextXAlignment = Enum.TextXAlignment.Left, }) -- Tempo jogado local joinTime = os.clock() local function formatTempo(segundos) local h = math.floor(segundos / 3600) local m = math.floor((segundos % 3600) / 60) local s = math.floor(segundos % 60) if h > 0 then return string.format("%dh %02dm %02ds", h, m, s) end return string.format("%02dm %02ds", m, s) end task.spawn(function() while InicioPage.Parent do TempoLabel.Text = "Tempo: " .. formatTempo(os.clock() - joinTime) task.wait(1) end end) -- FPS local frameCount = 0 local fpsTimer = 0 RunService.Heartbeat:Connect(function(dt) frameCount += 1 fpsTimer += dt if fpsTimer >= 0.5 then FpsLabel.Text = "Fps: " .. math.floor(frameCount / fpsTimer) frameCount = 0 fpsTimer = 0 end end) ------------------------------------------------------ -- Servidor ------------------------------------------------------ create("TextLabel", { Parent = InicioPage, LayoutOrder = 2, BackgroundTransparency = 1, Size = UDim2.new(1, 0, 0, 22), Text = "--server--", Font = Enum.Font.GothamBold, TextSize = 15, TextColor3 = COLORS.Purple, TextXAlignment = Enum.TextXAlignment.Left, }) local ServerCard = create("Frame", { Parent = InicioPage, LayoutOrder = 3, Size = UDim2.new(1, 0, 0, 56), BackgroundColor3 = COLORS.Panel, BackgroundTransparency = 0.35, }, { corner(10), stroke(COLORS.Purple, 1.5) }) create("UIPadding", { Parent = ServerCard, PaddingTop = UDim.new(0, 8), PaddingLeft = UDim.new(0, 12), }) create("UIListLayout", { Parent = ServerCard, Padding = UDim.new(0, 2), SortOrder = Enum.SortOrder.LayoutOrder, }) create("TextLabel", { Parent = ServerCard, LayoutOrder = 1, BackgroundTransparency = 1, Size = UDim2.new(1, -12, 0, 18), Text = "Id do server: " .. game.JobId, Font = Enum.Font.Gotham, TextSize = 13, TextColor3 = COLORS.Text, TextXAlignment = Enum.TextXAlignment.Left, }) local OnlineLabel = create("TextLabel", { Parent = ServerCard, LayoutOrder = 2, BackgroundTransparency = 1, Size = UDim2.new(1, -12, 0, 18), Text = "Online: " .. #Players:GetPlayers() .. "/" .. Players.MaxPlayers, Font = Enum.Font.Gotham, TextSize = 13, TextColor3 = COLORS.Text, TextXAlignment = Enum.TextXAlignment.Left, }) local function updateOnline() OnlineLabel.Text = "Online: " .. #Players:GetPlayers() .. "/" .. Players.MaxPlayers end Players.PlayerAdded:Connect(updateOnline) Players.PlayerRemoving:Connect(function() task.wait() updateOnline() end) ------------------------------------------------------ -- Resolução (FOV da câmera) ------------------------------------------------------ create("TextLabel", { Parent = InicioPage, LayoutOrder = 4, BackgroundTransparency = 1, Size = UDim2.new(1, 0, 0, 22), Text = "--resolução--", Font = Enum.Font.GothamBold, TextSize = 15, TextColor3 = COLORS.Purple, TextXAlignment = Enum.TextXAlignment.Left, }) local ResRow = create("Frame", { Parent = InicioPage, LayoutOrder = 5, Size = UDim2.new(1, 0, 0, 34), BackgroundTransparency = 1, }) create("UIListLayout", { Parent = ResRow, FillDirection = Enum.FillDirection.Horizontal, Padding = UDim.new(0, 8), SortOrder = Enum.SortOrder.LayoutOrder, }) local BASE_FOV = 70 local resolucoes = { { label = "1.85", mult = 1.85 }, { label = "1.75", mult = 1.75 }, { label = "Normal", mult = 1.0 }, { label = "0.85", mult = 0.85 }, { label = "0.75", mult = 0.75 }, } local resButtons = {} local selectedMult = 1.0 local function applyFOV(mult) local cam = workspace.CurrentCamera if cam then cam.FieldOfView = math.clamp(BASE_FOV * mult, 1, 120) end end workspace:GetPropertyChangedSignal("CurrentCamera"):Connect(function() task.wait() applyFOV(selectedMult) end) for i, res in ipairs(resolucoes) do local Btn = create("TextButton", { Name = "Res_" .. res.label, Parent = ResRow, LayoutOrder = i, Size = UDim2.new(0, 70, 1, 0), BackgroundColor3 = res.mult == 1.0 and COLORS.PanelLight or COLORS.Panel, BackgroundTransparency = res.mult == 1.0 and 0.1 or 0.4, Text = res.label, Font = Enum.Font.GothamBold, TextSize = 13, TextColor3 = COLORS.Text, AutoButtonColor = false, }, { corner(8), stroke(COLORS.Purple, 1.5) }) resButtons[res.label] = Btn Btn.MouseButton1Click:Connect(function() selectedMult = res.mult applyFOV(selectedMult) for _, b in pairs(resButtons) do b.BackgroundColor3 = COLORS.Panel b.BackgroundTransparency = 0.4 end Btn.BackgroundColor3 = COLORS.PanelLight Btn.BackgroundTransparency = 0.1 end) end end ------------------------------------------------------------ -- CONTEÚDO PERSONALIZADO: JOGADOR (Velocidade / Super Pulo / Gravidade) ------------------------------------------------------------ do local JogadorPage = pages["Jogador"] -- Valores padrão "normais" do Roblox, usados pelo botão de reset local DEFAULTS = { Velocidade = 16, SuperPulo = 50, Gravidade = 196.2, } local statState = { Velocidade = DEFAULTS.Velocidade, SuperPulo = DEFAULTS.SuperPulo, Gravidade = DEFAULTS.Gravidade, } local SLIDER_MIN = 0 local SLIDER_MAX = 1000 -- todas as 3 barras vão de 0 a 1000, como pedido local function applyStats() workspace.Gravity = statState.Gravidade local char = LocalPlayer.Character if char then local hum = char:FindFirstChildOfClass("Humanoid") if hum then hum.WalkSpeed = statState.Velocidade hum.UseJumpPower = true hum.JumpPower = statState.SuperPulo end end end LocalPlayer.CharacterAdded:Connect(function() task.wait(0.1) applyStats() end) -- guarda a função "setValue" de cada barra, pra poder resetar depois local sliderSetters = {} local function createStatRow(layoutOrder, key, label) local Row = create("Frame", { Name = key .. "Row", Parent = JogadorPage, LayoutOrder = layoutOrder, Size = UDim2.new(1, 0, 0, 64), BackgroundTransparency = 1, }) create("TextLabel", { Parent = Row, Size = UDim2.new(1, 0, 0, 18), BackgroundTransparency = 1, Text = label, Font = Enum.Font.GothamBold, TextSize = 13, TextColor3 = COLORS.Text, TextXAlignment = Enum.TextXAlignment.Left, }) local Track = create("Frame", { Name = "Track", Parent = Row, Position = UDim2.new(0, 0, 0, 28), Size = UDim2.new(1, -92, 0, 18), BackgroundColor3 = COLORS.Panel, BackgroundTransparency = 0.2, }, { corner(9) }) local Fill = create("Frame", { Name = "Fill", Parent = Track, Size = UDim2.new(0, 0, 1, 0), BackgroundColor3 = COLORS.Purple, BorderSizePixel = 0, }, { corner(9) }) local Knob = create("Frame", { Name = "Knob", Parent = Track, AnchorPoint = Vector2.new(0.5, 0.5), Position = UDim2.new(0, 0, 0.5, 0), Size = UDim2.new(0, 16, 0, 16), BackgroundColor3 = COLORS.Text, ZIndex = 3, }, { corner(8), stroke(COLORS.Purple, 1.5) }) local Box = create("TextBox", { Name = "ValueBox", Parent = Row, AnchorPoint = Vector2.new(1, 0), Position = UDim2.new(1, 0, 0, 26), Size = UDim2.new(0, 82, 0, 22), BackgroundColor3 = COLORS.PanelLight, Text = tostring(math.floor(statState[key])), Font = Enum.Font.GothamBold, TextSize = 13, TextColor3 = COLORS.Text, ClearTextOnFocus = false, }, { corner(6), stroke(COLORS.Purple, 1.5) }) local function setValue(value, fromTyping) value = math.clamp(math.floor(value + 0.5), SLIDER_MIN, SLIDER_MAX) statState[key] = value local pct = (value - SLIDER_MIN) / (SLIDER_MAX - SLIDER_MIN) Fill.Size = UDim2.new(pct, 0, 1, 0) Knob.Position = UDim2.new(pct, 0, 0.5, 0) if not fromTyping then Box.Text = tostring(value) end applyStats() end sliderSetters[key] = setValue -- arrastar/clicar na barra pra mudar o valor local draggingSlider = false local function updateFromInputPos(inputPos) local relativeX = inputPos.X - Track.AbsolutePosition.X local pct = math.clamp(relativeX / Track.AbsoluteSize.X, 0, 1) setValue(SLIDER_MIN + pct * (SLIDER_MAX - SLIDER_MIN)) end Track.InputBegan:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then draggingSlider = true updateFromInputPos(input.Position) end end) Track.InputEnded:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then draggingSlider = false end end) UserInputService.InputChanged:Connect(function(input) if draggingSlider and (input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch) then updateFromInputPos(input.Position) end end) -- digitar o número direto na caixinha Box.FocusLost:Connect(function() local num = tonumber(Box.Text) if num then setValue(num, true) else Box.Text = tostring(statState[key]) end end) setValue(statState[key]) return Row end createStatRow(1, "Velocidade", "Velocidade (Speed)") createStatRow(2, "SuperPulo", "Super Pulo (Jump Power)") createStatRow(3, "Gravidade", "Gravidade (Gravity)") local ResetButton = create("TextButton", { Name = "ResetButton", Parent = JogadorPage, LayoutOrder = 4, Size = UDim2.new(1, 0, 0, 36), BackgroundColor3 = COLORS.PanelLight, Text = "Resetar Status", Font = Enum.Font.GothamBold, TextSize = 14, TextColor3 = COLORS.Text, AutoButtonColor = false, }, { corner(8), stroke(COLORS.Purple, 1.5) }) ResetButton.MouseButton1Click:Connect(function() sliderSetters.Velocidade(DEFAULTS.Velocidade) sliderSetters.SuperPulo(DEFAULTS.SuperPulo) sliderSetters.Gravidade(DEFAULTS.Gravidade) end) applyStats() end ------------------------------------------------------------ -- CONTEÚDO PERSONALIZADO: JOGADORES (seletor / teleporte / visualizar) ------------------------------------------------------------ do local JogadoresPage = pages["Jogadores"] local selectedPlayer = nil local viewing = false local dropdownOpen = false local playerRows = {} -- [Player] = { Frame = ..., name = ... } ------------------------------------------------------ -- Barra "Selecionar um jogador ->" ------------------------------------------------------ create("TextLabel", { Parent = JogadoresPage, LayoutOrder = 1, Size = UDim2.new(1, 0, 0, 16), BackgroundTransparency = 1, Text = "Selecionar um jogador ->", Font = Enum.Font.GothamBold, TextSize = 13, TextColor3 = COLORS.Text, TextXAlignment = Enum.TextXAlignment.Left, }) local SelectorContainer = create("Frame", { Name = "SelectorContainer", Parent = JogadoresPage, LayoutOrder = 2, Size = UDim2.new(1, 0, 0, 38), BackgroundTransparency = 1, ClipsDescendants = true, }) local SelectBar = create("TextButton", { Name = "SelectBar", Parent = SelectorContainer, Size = UDim2.new(1, 0, 0, 38), BackgroundColor3 = COLORS.Panel, BackgroundTransparency = 0.25, Text = "", AutoButtonColor = false, }, { corner(8), stroke(COLORS.Purple, 1.5) }) local SelectBarLabel = create("TextLabel", { Parent = SelectBar, Position = UDim2.new(0, 12, 0, 0), Size = UDim2.new(1, -40, 1, 0), BackgroundTransparency = 1, Text = "Nenhum jogador selecionado", Font = Enum.Font.Gotham, TextSize = 13, TextColor3 = COLORS.TextDim, TextXAlignment = Enum.TextXAlignment.Left, }) local SelectBarArrow = create("TextLabel", { Parent = SelectBar, AnchorPoint = Vector2.new(1, 0.5), Position = UDim2.new(1, -12, 0.5, 0), Size = UDim2.new(0, 16, 0, 16), BackgroundTransparency = 1, Text = "v", Font = Enum.Font.GothamBold, TextSize = 13, TextColor3 = COLORS.TextDim, }) local DropdownArea = create("Frame", { Name = "DropdownArea", Parent = SelectorContainer, Position = UDim2.new(0, 0, 0, 44), Size = UDim2.new(1, 0, 0, 290), BackgroundTransparency = 1, }) local SearchBox = create("TextBox", { Name = "SearchBox", Parent = DropdownArea, Size = UDim2.new(1, 0, 0, 28), BackgroundColor3 = COLORS.PanelLight, PlaceholderText = "Pesquisar jogador...", Text = "", Font = Enum.Font.Gotham, TextSize = 13, TextColor3 = COLORS.Text, PlaceholderColor3 = COLORS.TextDim, ClearTextOnFocus = false, }, { corner(7), stroke(COLORS.Purple, 1.5) }) -- ScrollingFrame mostra ~5 jogadores por vez; o resto aparece arrastando/rolando local ListScroll = create("ScrollingFrame", { Name = "ListScroll", Parent = DropdownArea, Position = UDim2.new(0, 0, 0, 36), Size = UDim2.new(1, 0, 0, 254), BackgroundTransparency = 1, ScrollBarThickness = 4, ScrollBarImageColor3 = COLORS.Purple, AutomaticCanvasSize = Enum.AutomaticSize.Y, CanvasSize = UDim2.new(0, 0, 0, 0), }) create("UIListLayout", { Parent = ListScroll, Padding = UDim.new(0, 6), SortOrder = Enum.SortOrder.LayoutOrder, }) -- permite arrastar com o mouse (ou dedo) pra cima/baixo pra rolar a lista do local scrollDragging = false local dragStartY = 0 local startCanvasY = 0 ListScroll.InputBegan:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then scrollDragging = true dragStartY = input.Position.Y startCanvasY = ListScroll.CanvasPosition.Y end end) ListScroll.InputEnded:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then scrollDragging = false end end) UserInputService.InputChanged:Connect(function(input) if scrollDragging and (input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch) then local deltaY = input.Position.Y - dragStartY local maxY = math.max(0, ListScroll.CanvasSize.Y.Offset - ListScroll.AbsoluteSize.Y) ListScroll.CanvasPosition = Vector2.new(0, math.clamp(startCanvasY - deltaY, 0, maxY)) end end) end local function setDropdown(open) dropdownOpen = open SelectorContainer.Size = open and UDim2.new(1, 0, 0, 38 + 6 + 290) or UDim2.new(1, 0, 0, 38) SelectBarArrow.Text = open and "^" or "v" if open then SearchBox.Text = "" for _, row in pairs(playerRows) do row.Frame.Visible = true end end end SelectBar.MouseButton1Click:Connect(function() setDropdown(not dropdownOpen) end) SearchBox:GetPropertyChangedSignal("Text"):Connect(function() local query = SearchBox.Text:lower() for _, row in pairs(playerRows) do if query == "" then row.Frame.Visible = true else row.Frame.Visible = row.name:lower():find(query, 1, true) ~= nil end end end) ------------------------------------------------------ -- Botões de ação: Teleportar / Visualizar ------------------------------------------------------ local ActionsRow = create("Frame", { Name = "ActionsRow", Parent = JogadoresPage, LayoutOrder = 3, Size = UDim2.new(1, 0, 0, 36), BackgroundTransparency = 1, }) create("UIListLayout", { Parent = ActionsRow, FillDirection = Enum.FillDirection.Horizontal, Padding = UDim.new(0, 8), SortOrder = Enum.SortOrder.LayoutOrder, }) local TeleportButton = create("TextButton", { Name = "TeleportButton", Parent = ActionsRow, LayoutOrder = 1, Size = UDim2.new(0, 150, 1, 0), BackgroundColor3 = COLORS.Purple, Text = "Teleportar", Font = Enum.Font.GothamBold, TextSize = 13, TextColor3 = COLORS.Text, AutoButtonColor = false, }, { corner(8) }) local ViewButton = create("TextButton", { Name = "ViewButton", Parent = ActionsRow, LayoutOrder = 2, Size = UDim2.new(0, 150, 1, 0), BackgroundColor3 = COLORS.Panel, Text = "Visualizar: Desativado", Font = Enum.Font.GothamBold, TextSize = 13, TextColor3 = COLORS.Text, AutoButtonColor = false, }, { corner(8), stroke(COLORS.Purple, 1.5) }) local function getCharRoot(plr) local char = plr.Character if not char then return nil end return char:FindFirstChild("HumanoidRootPart") end TeleportButton.MouseButton1Click:Connect(function() if not selectedPlayer or not selectedPlayer.Parent then return end local myRoot = getCharRoot(LocalPlayer) local targetRoot = getCharRoot(selectedPlayer) if myRoot and targetRoot then myRoot.CFrame = targetRoot.CFrame + Vector3.new(2, 0, 2) end end) local function stopViewing() viewing = false ViewButton.Text = "Visualizar: Desativado" ViewButton.BackgroundColor3 = COLORS.Panel local cam = workspace.CurrentCamera if cam and LocalPlayer.Character then local hum = LocalPlayer.Character:FindFirstChildOfClass("Humanoid") cam.CameraSubject = hum cam.CameraType = Enum.CameraType.Custom end end ViewButton.MouseButton1Click:Connect(function() if not selectedPlayer or not selectedPlayer.Parent then return end viewing = not viewing if viewing then ViewButton.Text = "Visualizar: Ativado" ViewButton.BackgroundColor3 = COLORS.PanelLight local cam = workspace.CurrentCamera local char = selectedPlayer.Character if cam and char then local hum = char:FindFirstChildOfClass("Humanoid") if hum then cam.CameraSubject = hum cam.CameraType = Enum.CameraType.Custom end end else stopViewing() end end) ------------------------------------------------------ -- Botão Atualizar lista ------------------------------------------------------ local UpdateButton = create("TextButton", { Name = "UpdateButton", Parent = JogadoresPage, LayoutOrder = 4, Size = UDim2.new(1, 0, 0, 32), BackgroundColor3 = COLORS.PanelLight, Text = "Atualizar lista", Font = Enum.Font.GothamBold, TextSize = 13, TextColor3 = COLORS.Text, AutoButtonColor = false, }, { corner(8), stroke(COLORS.Purple, 1.5) }) ------------------------------------------------------ -- Linhas da lista de jogadores (foto sem borda + nome + id) ------------------------------------------------------ local function selectPlayer(plr) selectedPlayer = plr SelectBarLabel.Text = plr.Name SelectBarLabel.TextColor3 = COLORS.Text setDropdown(false) if viewing then stopViewing() end end local function createPlayerRow(plr, layoutOrder) local Row = create("TextButton", { Name = plr.Name, Parent = ListScroll, LayoutOrder = layoutOrder, Size = UDim2.new(1, -4, 0, 46), BackgroundColor3 = COLORS.Panel, BackgroundTransparency = 0.4, Text = "", AutoButtonColor = false, }, { corner(8) }) -- foto sem nenhuma borda (sem UIStroke) local Avatar = create("ImageLabel", { Name = "Avatar", Parent = Row, Position = UDim2.new(0, 6, 0.5, -17), Size = UDim2.new(0, 34, 0, 34), BackgroundColor3 = COLORS.PanelLight, Image = "", ScaleType = Enum.ScaleType.Fit, }, { corner(17) }) create("TextLabel", { Parent = Row, Position = UDim2.new(0, 50, 0, 4), Size = UDim2.new(1, -56, 0, 18), BackgroundTransparency = 1, Text = plr.Name, Font = Enum.Font.GothamBold, TextSize = 13, TextColor3 = COLORS.Text, TextXAlignment = Enum.TextXAlignment.Left, }) create("TextLabel", { Parent = Row, Position = UDim2.new(0, 50, 0, 22), Size = UDim2.new(1, -56, 0, 16), BackgroundTransparency = 1, Text = "Id: " .. plr.UserId, Font = Enum.Font.Gotham, TextSize = 11, TextColor3 = COLORS.TextDim, TextXAlignment = Enum.TextXAlignment.Left, }) task.spawn(function() local ok, content = pcall(function() return Players:GetUserThumbnailAsync(plr.UserId, Enum.ThumbnailType.HeadShot, Enum.ThumbnailSize.Size180x180) end) if ok and content and Avatar.Parent then Avatar.Image = content end end) Row.MouseButton1Click:Connect(function() selectPlayer(plr) end) return { Frame = Row, name = plr.Name } end local function refreshPlayerList() for _, row in pairs(playerRows) do row.Frame:Destroy() end playerRows = {} local order = 1 for _, plr in ipairs(Players:GetPlayers()) do if plr ~= LocalPlayer then playerRows[plr] = createPlayerRow(plr, order) order += 1 end end if selectedPlayer and not selectedPlayer.Parent then selectedPlayer = nil SelectBarLabel.Text = "Nenhum jogador selecionado" SelectBarLabel.TextColor3 = COLORS.TextDim if viewing then stopViewing() end end end UpdateButton.MouseButton1Click:Connect(refreshPlayerList) -- some sozinho quando sai, aparece sozinho quando entra Players.PlayerAdded:Connect(refreshPlayerList) Players.PlayerRemoving:Connect(function() task.wait() refreshPlayerList() end) refreshPlayerList() end ------------------------------------------------------------ -- CONTEÚDO PERSONALIZADO: AVATAR (copiar skin de um jogador + código de skin) ------------------------------------------------------------ do local AvatarPage = pages["Avatar"] local HttpService = game:GetService("HttpService") local selectedAvatarPlayer = nil local avatarDropdownOpen = false local avatarPlayerRows = {} ------------------------------------------------------ -- Aviso ------------------------------------------------------ create("TextLabel", { Parent = AvatarPage, LayoutOrder = 1, BackgroundTransparency = 1, Size = UDim2.new(1, 0, 0, 32), Text = "Copia o corpo, roupas, acessórios, cores e altura de outro jogador pro seu personagem. É só visual, só você vê (não sincroniza com o servidor).", Font = Enum.Font.Gotham, TextSize = 12, TextColor3 = COLORS.TextDim, TextWrapped = true, TextXAlignment = Enum.TextXAlignment.Left, }) ------------------------------------------------------ -- Seletor de jogador (igual o de "Jogadores") ------------------------------------------------------ create("TextLabel", { Parent = AvatarPage, LayoutOrder = 2, Size = UDim2.new(1, 0, 0, 16), BackgroundTransparency = 1, Text = "Selecionar jogador pra copiar ->", Font = Enum.Font.GothamBold, TextSize = 13, TextColor3 = COLORS.Text, TextXAlignment = Enum.TextXAlignment.Left, }) local AvSelectorContainer = create("Frame", { Name = "AvSelectorContainer", Parent = AvatarPage, LayoutOrder = 3, Size = UDim2.new(1, 0, 0, 38), BackgroundTransparency = 1, ClipsDescendants = true, }) local AvSelectBar = create("TextButton", { Name = "AvSelectBar", Parent = AvSelectorContainer, Size = UDim2.new(1, 0, 0, 38), BackgroundColor3 = COLORS.Panel, BackgroundTransparency = 0.25, Text = "", AutoButtonColor = false, }, { corner(8), stroke(COLORS.Purple, 1.5) }) local AvSelectBarLabel = create("TextLabel", { Parent = AvSelectBar, Position = UDim2.new(0, 12, 0, 0), Size = UDim2.new(1, -40, 1, 0), BackgroundTransparency = 1, Text = "Nenhum jogador selecionado", Font = Enum.Font.Gotham, TextSize = 13, TextColor3 = COLORS.TextDim, TextXAlignment = Enum.TextXAlignment.Left, }) local AvSelectBarArrow = create("TextLabel", { Parent = AvSelectBar, AnchorPoint = Vector2.new(1, 0.5), Position = UDim2.new(1, -12, 0.5, 0), Size = UDim2.new(0, 16, 0, 16), BackgroundTransparency = 1, Text = "v", Font = Enum.Font.GothamBold, TextSize = 13, TextColor3 = COLORS.TextDim, }) local AvDropdownArea = create("Frame", { Name = "AvDropdownArea", Parent = AvSelectorContainer, Position = UDim2.new(0, 0, 0, 44), Size = UDim2.new(1, 0, 0, 220), BackgroundTransparency = 1, }) local AvSearchBox = create("TextBox", { Name = "AvSearchBox", Parent = AvDropdownArea, Size = UDim2.new(1, 0, 0, 28), BackgroundColor3 = COLORS.PanelLight, PlaceholderText = "Pesquisar jogador...", Text = "", Font = Enum.Font.Gotham, TextSize = 13, TextColor3 = COLORS.Text, PlaceholderColor3 = COLORS.TextDim, ClearTextOnFocus = false, }, { corner(7), stroke(COLORS.Purple, 1.5) }) local AvListScroll = create("ScrollingFrame", { Name = "AvListScroll", Parent = AvDropdownArea, Position = UDim2.new(0, 0, 0, 36), Size = UDim2.new(1, 0, 0, 184), BackgroundTransparency = 1, ScrollBarThickness = 4, ScrollBarImageColor3 = COLORS.Purple, AutomaticCanvasSize = Enum.AutomaticSize.Y, CanvasSize = UDim2.new(0, 0, 0, 0), }) create("UIListLayout", { Parent = AvListScroll, Padding = UDim.new(0, 6), SortOrder = Enum.SortOrder.LayoutOrder, }) local function setAvatarDropdown(open) avatarDropdownOpen = open AvSelectorContainer.Size = open and UDim2.new(1, 0, 0, 38 + 6 + 220) or UDim2.new(1, 0, 0, 38) AvSelectBarArrow.Text = open and "^" or "v" if open then AvSearchBox.Text = "" for _, row in pairs(avatarPlayerRows) do row.Frame.Visible = true end end end AvSelectBar.MouseButton1Click:Connect(function() setAvatarDropdown(not avatarDropdownOpen) end) AvSearchBox:GetPropertyChangedSignal("Text"):Connect(function() local query = AvSearchBox.Text:lower() for _, row in pairs(avatarPlayerRows) do if query == "" then row.Frame.Visible = true else row.Frame.Visible = row.name:lower():find(query, 1, true) ~= nil end end end) local function selectAvatarPlayer(plr) selectedAvatarPlayer = plr AvSelectBarLabel.Text = plr.Name AvSelectBarLabel.TextColor3 = COLORS.Text setAvatarDropdown(false) end local function createAvatarPlayerRow(plr, layoutOrder) local Row = create("TextButton", { Name = plr.Name, Parent = AvListScroll, LayoutOrder = layoutOrder, Size = UDim2.new(1, -4, 0, 46), BackgroundColor3 = COLORS.Panel, BackgroundTransparency = 0.4, Text = "", AutoButtonColor = false, }, { corner(8) }) local Avatar = create("ImageLabel", { Name = "Avatar", Parent = Row, Position = UDim2.new(0, 6, 0.5, -17), Size = UDim2.new(0, 34, 0, 34), BackgroundColor3 = COLORS.PanelLight, Image = "", ScaleType = Enum.ScaleType.Fit, }, { corner(17) }) create("TextLabel", { Parent = Row, Position = UDim2.new(0, 50, 0, 4), Size = UDim2.new(1, -56, 0, 18), BackgroundTransparency = 1, Text = plr.Name, Font = Enum.Font.GothamBold, TextSize = 13, TextColor3 = COLORS.Text, TextXAlignment = Enum.TextXAlignment.Left, }) create("TextLabel", { Parent = Row, Position = UDim2.new(0, 50, 0, 22), Size = UDim2.new(1, -56, 0, 16), BackgroundTransparency = 1, Text = "Id: " .. plr.UserId, Font = Enum.Font.Gotham, TextSize = 11, TextColor3 = COLORS.TextDim, TextXAlignment = Enum.TextXAlignment.Left, }) task.spawn(function() local ok, content = pcall(function() return Players:GetUserThumbnailAsync(plr.UserId, Enum.ThumbnailType.HeadShot, Enum.ThumbnailSize.Size180x180) end) if ok and content and Avatar.Parent then Avatar.Image = content end end) Row.MouseButton1Click:Connect(function() selectAvatarPlayer(plr) end) return { Frame = Row, name = plr.Name } end local function refreshAvatarPlayerList() for _, row in pairs(avatarPlayerRows) do row.Frame:Destroy() end avatarPlayerRows = {} local order = 1 for _, plr in ipairs(Players:GetPlayers()) do avatarPlayerRows[plr] = createAvatarPlayerRow(plr, order) order += 1 end if selectedAvatarPlayer and not selectedAvatarPlayer.Parent then selectedAvatarPlayer = nil AvSelectBarLabel.Text = "Nenhum jogador selecionado" AvSelectBarLabel.TextColor3 = COLORS.TextDim end end Players.PlayerAdded:Connect(refreshAvatarPlayerList) Players.PlayerRemoving:Connect(function() task.wait() refreshAvatarPlayerList() end) refreshAvatarPlayerList() ------------------------------------------------------ -- Conversão HumanoidDescription <-> tabela/código ------------------------------------------------------ local DESC_FIELDS = { "Head", "LeftArm", "LeftLeg", "RightArm", "RightLeg", "Torso", "Shirt", "Pants", "GraphicTShirt", "Face", "BackAccessory", "FaceAccessory", "FrontAccessory", "HairAccessory", "HatAccessory", "NeckAccessory", "ShouldersAccessory", "WaistAccessory", } local DESC_COLOR_FIELDS = { "HeadColor", "LeftArmColor", "LeftLegColor", "RightArmColor", "RightLegColor", "TorsoColor", } -- estes campos controlam a ALTURA / proporção do corpo (escala R15) local DESC_SCALE_FIELDS = { "BodyTypeScale", "DepthScale", "HeadScale", "HeightScale", "ProportionScale", "WidthScale", } local function descToTable(desc) local t = {} for _, field in ipairs(DESC_FIELDS) do t[field] = desc[field] end for _, field in ipairs(DESC_COLOR_FIELDS) do local c = desc[field] t[field] = { c.R, c.G, c.B } end for _, field in ipairs(DESC_SCALE_FIELDS) do t[field] = desc[field] end return t end local function tableToDesc(t) local desc = Instance.new("HumanoidDescription") for _, field in ipairs(DESC_FIELDS) do if t[field] ~= nil then desc[field] = t[field] end end for _, field in ipairs(DESC_COLOR_FIELDS) do local c = t[field] if c then desc[field] = Color3.new(c[1], c[2], c[3]) end end for _, field in ipairs(DESC_SCALE_FIELDS) do if t[field] ~= nil then desc[field] = t[field] end end return desc end local function applyDescriptionToLocal(desc) local char = LocalPlayer.Character if not char then return false end local hum = char:FindFirstChildOfClass("Humanoid") if not hum then return false end local ok = pcall(function() hum:ApplyDescription(desc) end) return ok end ------------------------------------------------------ -- Botão: copiar visual do jogador selecionado ------------------------------------------------------ local CopyVisualButton = create("TextButton", { Name = "CopyVisualButton", Parent = AvatarPage, LayoutOrder = 4, Size = UDim2.new(1, 0, 0, 36), BackgroundColor3 = COLORS.Purple, Text = "Copiar visual do jogador selecionado", Font = Enum.Font.GothamBold, TextSize = 14, TextColor3 = COLORS.Text, AutoButtonColor = false, }, { corner(8) }) local AvatarFeedback = create("TextLabel", { Name = "AvatarFeedback", Parent = AvatarPage, LayoutOrder = 5, BackgroundTransparency = 1, Size = UDim2.new(1, 0, 0, 16), Text = "", Font = Enum.Font.Gotham, TextSize = 12, TextColor3 = COLORS.TextDim, TextXAlignment = Enum.TextXAlignment.Left, }) ------------------------------------------------------ -- Caixa do "Código da Skin" gerado (copiável, igual JobId/PlaceId) ------------------------------------------------------ create("TextLabel", { Parent = AvatarPage, LayoutOrder = 6, BackgroundTransparency = 1, Size = UDim2.new(1, 0, 0, 18), Text = "Código da skin (gerado)", Font = Enum.Font.GothamBold, TextSize = 14, TextColor3 = COLORS.Purple, TextXAlignment = Enum.TextXAlignment.Left, }) local CodeRow = create("Frame", { Name = "CodeRow", Parent = AvatarPage, LayoutOrder = 7, Size = UDim2.new(1, 0, 0, 30), BackgroundTransparency = 1, }) create("UIListLayout", { Parent = CodeRow, FillDirection = Enum.FillDirection.Horizontal, Padding = UDim.new(0, 8), SortOrder = Enum.SortOrder.LayoutOrder, }) local CodeBox = create("TextBox", { Name = "CodeBox", Parent = CodeRow, LayoutOrder = 1, Size = UDim2.new(0, 366, 1, 0), BackgroundColor3 = COLORS.Panel, BackgroundTransparency = 0.25, Text = "", PlaceholderText = "Copie um jogador pra gerar o código...", TextTruncate = Enum.TextTruncate.AtEnd, Font = Enum.Font.Gotham, TextSize = 12, TextColor3 = COLORS.TextDim, TextEditable = false, ClearTextOnFocus = false, }, { corner(8), stroke(COLORS.Purple, 1.5) }) local CopyCodeButton = create("TextButton", { Name = "CopyCodeButton", Parent = CodeRow, LayoutOrder = 2, Size = UDim2.new(0, 80, 1, 0), BackgroundColor3 = COLORS.PanelLight, Text = "Copiar", Font = Enum.Font.GothamBold, TextSize = 12, TextColor3 = COLORS.Text, AutoButtonColor = false, }, { corner(8), stroke(COLORS.Purple, 1.5) }) CopyCodeButton.MouseButton1Click:Connect(function() if CodeBox.Text == "" then return end CodeBox.SelectionStart = 1 CodeBox.CursorPosition = #CodeBox.Text + 1 CodeBox:CaptureFocus() local original = CopyCodeButton.Text CopyCodeButton.Text = "Selecionado!" task.delay(1.2, function() if CopyCodeButton and CopyCodeButton.Parent then CopyCodeButton.Text = original end end) end) CopyVisualButton.MouseButton1Click:Connect(function() if not selectedAvatarPlayer or not selectedAvatarPlayer.Parent then AvatarFeedback.Text = "Selecione um jogador primeiro." AvatarFeedback.TextColor3 = Color3.fromRGB(255, 120, 120) return end local targetChar = selectedAvatarPlayer.Character local targetHum = targetChar and targetChar:FindFirstChildOfClass("Humanoid") local desc if targetHum then -- pega o visual ATUAL do personagem (já com tudo que ele tá usando agora) local ok, result = pcall(function() return targetHum:GetAppliedDescription() end) if ok then desc = result end end if not desc then -- fallback: pega o visual "oficial" da conta dele (caso não tenha char carregado) local ok, result = pcall(function() return Players:GetHumanoidDescriptionFromUserId(selectedAvatarPlayer.UserId) end) if ok then desc = result end end if not desc then AvatarFeedback.Text = "Não foi possível ler o visual desse jogador." AvatarFeedback.TextColor3 = Color3.fromRGB(255, 120, 120) return end local applied = applyDescriptionToLocal(desc) if applied then AvatarFeedback.Text = "Visual de " .. selectedAvatarPlayer.Name .. " copiado! (só você vê)" AvatarFeedback.TextColor3 = COLORS.TextDim else AvatarFeedback.Text = "Seu personagem ainda não carregou, tenta de novo." AvatarFeedback.TextColor3 = Color3.fromRGB(255, 120, 120) end -- gera o código da skin (texto que dá pra copiar e usar em "Colar código") local ok, json = pcall(function() return HttpService:JSONEncode(descToTable(desc)) end) if ok then CodeBox.Text = json CodeBox.TextColor3 = COLORS.Text end end) ------------------------------------------------------ -- Colar código e aplicar (pra "importar" uma skin de outro lugar) ------------------------------------------------------ create("TextLabel", { Parent = AvatarPage, LayoutOrder = 8, BackgroundTransparency = 1, Size = UDim2.new(1, 0, 0, 18), Text = "Usar um código de skin", Font = Enum.Font.GothamBold, TextSize = 14, TextColor3 = COLORS.Purple, TextXAlignment = Enum.TextXAlignment.Left, }) local PasteRow = create("Frame", { Name = "PasteRow", Parent = AvatarPage, LayoutOrder = 9, Size = UDim2.new(1, 0, 0, 30), BackgroundTransparency = 1, }) create("UIListLayout", { Parent = PasteRow, FillDirection = Enum.FillDirection.Horizontal, Padding = UDim.new(0, 8), SortOrder = Enum.SortOrder.LayoutOrder, }) local PasteBox = create("TextBox", { Name = "PasteBox", Parent = PasteRow, LayoutOrder = 1, Size = UDim2.new(0, 366, 1, 0), BackgroundColor3 = COLORS.Panel, BackgroundTransparency = 0.25, PlaceholderText = "Cole aqui o código da skin...", Text = "", Font = Enum.Font.Gotham, TextSize = 12, TextColor3 = COLORS.Text, PlaceholderColor3 = COLORS.TextDim, ClearTextOnFocus = false, }, { corner(8), stroke(COLORS.Purple, 1.5) }) local ApplyCodeButton = create("TextButton", { Name = "ApplyCodeButton", Parent = PasteRow, LayoutOrder = 2, Size = UDim2.new(0, 80, 1, 0), BackgroundColor3 = COLORS.Purple, Text = "Aplicar", Font = Enum.Font.GothamBold, TextSize = 12, TextColor3 = COLORS.Text, AutoButtonColor = false, }, { corner(8) }) ApplyCodeButton.MouseButton1Click:Connect(function() if PasteBox.Text == "" then AvatarFeedback.Text = "Cole um código antes de aplicar." AvatarFeedback.TextColor3 = Color3.fromRGB(255, 120, 120) return end local ok, t = pcall(function() return HttpService:JSONDecode(PasteBox.Text) end) if not ok or type(t) ~= "table" then AvatarFeedback.Text = "Código inválido." AvatarFeedback.TextColor3 = Color3.fromRGB(255, 120, 120) return end local desc = tableToDesc(t) local applied = applyDescriptionToLocal(desc) if applied then AvatarFeedback.Text = "Código aplicado com sucesso!" AvatarFeedback.TextColor3 = COLORS.TextDim else AvatarFeedback.Text = "Seu personagem ainda não carregou, tenta de novo." AvatarFeedback.TextColor3 = Color3.fromRGB(255, 120, 120) end end) end ------------------------------------------------------------ -- CONTEÚDO PERSONALIZADO: TELEPORTE (locais fixos + entrar em servidor) ------------------------------------------------------------ do local TeleportePage = pages["Teleporte"] local TeleportService = game:GetService("TeleportService") local function getTeleporteRoot() local char = LocalPlayer.Character return char and char:FindFirstChild("HumanoidRootPart") end ------------------------------------------------------ -- Locais ------------------------------------------------------ create("TextLabel", { Parent = TeleportePage, LayoutOrder = 1, BackgroundTransparency = 1, Size = UDim2.new(1, 0, 0, 18), Text = "Locais", Font = Enum.Font.GothamBold, TextSize = 14, TextColor3 = COLORS.Purple, TextXAlignment = Enum.TextXAlignment.Left, }) -- Lista de locais fixos. Pra adicionar mais, só incluir outra linha aqui. local locais = { { nome = "Lobby", pos = Vector3.new(-26.52, 3.62, -0.97) }, { nome = "Escola", pos = Vector3.new(-247.28, 3.61, 212.07) }, { nome = "Morro", pos = Vector3.new(-306.51, 72.51, -404.82) }, { nome = "Mar 1", pos = Vector3.new(-1623.39, 4.21, -270.60) }, { nome = "Mar 2", pos = Vector3.new(65.25, 4.21, -1597.10) }, { nome = "Mar 3", pos = Vector3.new(63.18, 4.21, 1586.60) }, } local LocaisGrid = create("Frame", { Name = "LocaisGrid", Parent = TeleportePage, LayoutOrder = 2, Size = UDim2.new(1, 0, 0, 0), AutomaticSize = Enum.AutomaticSize.Y, BackgroundTransparency = 1, }) create("UIGridLayout", { Parent = LocaisGrid, CellSize = UDim2.new(0, 130, 0, 36), CellPadding = UDim2.new(0, 8, 0, 8), SortOrder = Enum.SortOrder.LayoutOrder, }) for i, local_ in ipairs(locais) do local LocalButton = create("TextButton", { Name = "Local_" .. local_.nome, Parent = LocaisGrid, LayoutOrder = i, BackgroundColor3 = COLORS.Panel, BackgroundTransparency = 0.3, Text = local_.nome, Font = Enum.Font.GothamBold, TextSize = 13, TextColor3 = COLORS.Text, AutoButtonColor = false, }, { corner(8), stroke(COLORS.Purple, 1.5) }) LocalButton.MouseButton1Click:Connect(function() local root = getTeleporteRoot() if root then root.CFrame = CFrame.new(local_.pos) end end) end ------------------------------------------------------ -- Servidor ------------------------------------------------------ create("TextLabel", { Parent = TeleportePage, LayoutOrder = 3, BackgroundTransparency = 1, Size = UDim2.new(1, 0, 0, 18), Text = "Servidor", Font = Enum.Font.GothamBold, TextSize = 14, TextColor3 = COLORS.Purple, TextXAlignment = Enum.TextXAlignment.Left, }) -- Caixa de JobId + botões de entrar local JobIdRow = create("Frame", { Name = "JobIdRow", Parent = TeleportePage, LayoutOrder = 4, Size = UDim2.new(1, 0, 0, 36), BackgroundTransparency = 1, }) create("UIListLayout", { Parent = JobIdRow, FillDirection = Enum.FillDirection.Horizontal, Padding = UDim.new(0, 8), SortOrder = Enum.SortOrder.LayoutOrder, }) local JobIdInputBox = create("TextBox", { Name = "JobIdInputBox", Parent = JobIdRow, LayoutOrder = 1, Size = UDim2.new(0, 230, 1, 0), BackgroundColor3 = COLORS.Panel, BackgroundTransparency = 0.25, PlaceholderText = "Cole o JobId aqui...", Text = "", Font = Enum.Font.Gotham, TextSize = 13, TextColor3 = COLORS.Text, PlaceholderColor3 = COLORS.TextDim, ClearTextOnFocus = false, }, { corner(8), stroke(COLORS.Purple, 1.5) }) local JoinServerButton = create("TextButton", { Name = "JoinServerButton", Parent = JobIdRow, LayoutOrder = 2, Size = UDim2.new(0, 150, 1, 0), BackgroundColor3 = COLORS.Purple, Text = "Entrar no Servidor", Font = Enum.Font.GothamBold, TextSize = 12, TextColor3 = COLORS.Text, AutoButtonColor = false, }, { corner(8) }) local RandomServerButton = create("TextButton", { Name = "RandomServerButton", Parent = JobIdRow, LayoutOrder = 3, Size = UDim2.new(0, 150, 1, 0), BackgroundColor3 = COLORS.PanelLight, Text = "Servidor Aleatório", Font = Enum.Font.GothamBold, TextSize = 12, TextColor3 = COLORS.Text, AutoButtonColor = false, }, { corner(8), stroke(COLORS.Purple, 1.5) }) local ServerFeedback = create("TextLabel", { Name = "ServerFeedback", Parent = TeleportePage, LayoutOrder = 5, BackgroundTransparency = 1, Size = UDim2.new(1, 0, 0, 16), Text = "", Font = Enum.Font.Gotham, TextSize = 12, TextColor3 = COLORS.TextDim, TextXAlignment = Enum.TextXAlignment.Left, }) JoinServerButton.MouseButton1Click:Connect(function() local jobId = JobIdInputBox.Text:gsub("%s+", "") if jobId == "" then ServerFeedback.Text = "Cole um JobId válido antes de entrar." ServerFeedback.TextColor3 = Color3.fromRGB(255, 120, 120) return end ServerFeedback.Text = "Entrando no servidor..." ServerFeedback.TextColor3 = COLORS.TextDim local ok = pcall(function() TeleportService:TeleportToPlaceInstance(game.PlaceId, jobId, LocalPlayer) end) if not ok then ServerFeedback.Text = "Não foi possível entrar (JobId inválido ou servidor indisponível)." ServerFeedback.TextColor3 = Color3.fromRGB(255, 120, 120) end end) -- "Aleatório" aqui usa o mesmo mecanismo do botão "Jogar" do Roblox: ele -- deixa o próprio Roblox escolher uma instância disponível pra esse jogo, -- então normalmente cai em um servidor diferente do atual. O Roblox não -- libera pra um LocalScript pedir uma lista de servidores e escolher um -- na mão sem um Script do lado do servidor + HttpService. RandomServerButton.MouseButton1Click:Connect(function() ServerFeedback.Text = "Procurando um servidor disponível..." ServerFeedback.TextColor3 = COLORS.TextDim local ok = pcall(function() TeleportService:Teleport(game.PlaceId, LocalPlayer) end) if not ok then ServerFeedback.Text = "Não foi possível teleportar para outro servidor." ServerFeedback.TextColor3 = Color3.fromRGB(255, 120, 120) end end) ------------------------------------------------------ -- JobId / PlaceId atuais + copiar ------------------------------------------------------ local function createCopyRow(layoutOrder, labelText, value) local Row = create("Frame", { Parent = TeleportePage, LayoutOrder = layoutOrder, Size = UDim2.new(1, 0, 0, 30), BackgroundTransparency = 1, }) create("UIListLayout", { Parent = Row, FillDirection = Enum.FillDirection.Horizontal, Padding = UDim.new(0, 8), SortOrder = Enum.SortOrder.LayoutOrder, }) create("TextLabel", { Parent = Row, LayoutOrder = 1, Size = UDim2.new(0, 64, 1, 0), BackgroundTransparency = 1, Text = labelText, Font = Enum.Font.GothamBold, TextSize = 13, TextColor3 = COLORS.Text, TextXAlignment = Enum.TextXAlignment.Left, }) -- TextEditable = false deixa o texto selecionável (pra copiar) mas -- impede que o jogador edite o valor mostrado. local ValueBox = create("TextBox", { Name = "ValueBox", Parent = Row, LayoutOrder = 2, Size = UDim2.new(0, 286, 1, 0), BackgroundColor3 = COLORS.Panel, BackgroundTransparency = 0.25, Text = value, TextTruncate = Enum.TextTruncate.AtEnd, Font = Enum.Font.Gotham, TextSize = 12, TextColor3 = COLORS.TextDim, TextEditable = false, ClearTextOnFocus = false, }, { corner(8), stroke(COLORS.Purple, 1.5) }) local CopyButton = create("TextButton", { Name = "CopyButton", Parent = Row, LayoutOrder = 3, Size = UDim2.new(0, 80, 1, 0), BackgroundColor3 = COLORS.PanelLight, Text = "Copiar", Font = Enum.Font.GothamBold, TextSize = 12, TextColor3 = COLORS.Text, AutoButtonColor = false, }, { corner(8), stroke(COLORS.Purple, 1.5) }) CopyButton.MouseButton1Click:Connect(function() -- O Roblox não deixa um LocalScript escrever direto na área de -- transferência do sistema (por segurança). Então selecionamos todo -- o texto e focamos a caixa: o jogador só precisa apertar Ctrl+C -- (ou usar o menu de copiar, no celular) pra copiar de verdade. ValueBox.SelectionStart = 1 ValueBox.CursorPosition = #ValueBox.Text + 1 ValueBox:CaptureFocus() local original = CopyButton.Text CopyButton.Text = "Selecionado!" task.delay(1.2, function() if CopyButton and CopyButton.Parent then CopyButton.Text = original end end) end) return ValueBox end createCopyRow(6, "JobId:", game.JobId) createCopyRow(7, "PlaceId:", tostring(game.PlaceId)) end ------------------------------------------------------------ -- CONTEÚDO PERSONALIZADO: CONFIGURAÇÃO (Teleporte por coordenadas) ------------------------------------------------------------ do local ConfigPage = pages["Configuração"] create("TextLabel", { Parent = ConfigPage, LayoutOrder = 1, BackgroundTransparency = 1, Size = UDim2.new(1, 0, 0, 18), Text = "Teleporte por coordenadas", Font = Enum.Font.GothamBold, TextSize = 14, TextColor3 = COLORS.Purple, TextXAlignment = Enum.TextXAlignment.Left, }) local CoordRow = create("Frame", { Name = "CoordRow", Parent = ConfigPage, LayoutOrder = 2, Size = UDim2.new(1, 0, 0, 36), BackgroundTransparency = 1, }) create("UIListLayout", { Parent = CoordRow, FillDirection = Enum.FillDirection.Horizontal, Padding = UDim.new(0, 8), SortOrder = Enum.SortOrder.LayoutOrder, }) local coordBoxes = {} for i, eixo in ipairs({ "X", "Y", "Z" }) do local Box = create("TextBox", { Name = eixo .. "Box", Parent = CoordRow, LayoutOrder = i, Size = UDim2.new(0, 90, 1, 0), BackgroundColor3 = COLORS.Panel, BackgroundTransparency = 0.25, PlaceholderText = eixo, Text = "", Font = Enum.Font.GothamBold, TextSize = 14, TextColor3 = COLORS.Text, PlaceholderColor3 = COLORS.TextDim, ClearTextOnFocus = false, }, { corner(8), stroke(COLORS.Purple, 1.5) }) coordBoxes[eixo] = Box end local CoordTeleportButton = create("TextButton", { Name = "CoordTeleportButton", Parent = CoordRow, LayoutOrder = 4, Size = UDim2.new(0, 140, 1, 0), BackgroundColor3 = COLORS.Purple, Text = "Teleportar", Font = Enum.Font.GothamBold, TextSize = 13, TextColor3 = COLORS.Text, AutoButtonColor = false, }, { corner(8) }) local CoordFeedback = create("TextLabel", { Name = "CoordFeedback", Parent = ConfigPage, LayoutOrder = 3, BackgroundTransparency = 1, Size = UDim2.new(1, 0, 0, 16), Text = "", Font = Enum.Font.Gotham, TextSize = 12, TextColor3 = COLORS.TextDim, TextXAlignment = Enum.TextXAlignment.Left, }) local function getRoot() local char = LocalPlayer.Character return char and char:FindFirstChild("HumanoidRootPart") end local function teleportToCoords(x, y, z) local root = getRoot() if not root then CoordFeedback.Text = "Seu personagem não foi encontrado." CoordFeedback.TextColor3 = Color3.fromRGB(255, 120, 120) return false end root.CFrame = CFrame.new(x, y, z) CoordFeedback.Text = string.format("Teleportado para %.1f, %.1f, %.1f", x, y, z) CoordFeedback.TextColor3 = COLORS.TextDim return true end CoordTeleportButton.MouseButton1Click:Connect(function() local x = tonumber(coordBoxes.X.Text) local y = tonumber(coordBoxes.Y.Text) local z = tonumber(coordBoxes.Z.Text) if not (x and y and z) then CoordFeedback.Text = "Preencha X, Y e Z com números válidos." CoordFeedback.TextColor3 = Color3.fromRGB(255, 120, 120) return end teleportToCoords(x, y, z) end) ------------------------------------------------------ -- Locais salvos (lista de pontos de teleporte) ------------------------------------------------------ create("TextLabel", { Parent = ConfigPage, LayoutOrder = 4, BackgroundTransparency = 1, Size = UDim2.new(1, 0, 0, 18), Text = "Locais salvos", Font = Enum.Font.GothamBold, TextSize = 14, TextColor3 = COLORS.Purple, TextXAlignment = Enum.TextXAlignment.Left, }) local SaveRow = create("Frame", { Name = "SaveRow", Parent = ConfigPage, LayoutOrder = 5, Size = UDim2.new(1, 0, 0, 36), BackgroundTransparency = 1, }) create("UIListLayout", { Parent = SaveRow, FillDirection = Enum.FillDirection.Horizontal, Padding = UDim.new(0, 8), SortOrder = Enum.SortOrder.LayoutOrder, }) local NameBox = create("TextBox", { Name = "NameBox", Parent = SaveRow, LayoutOrder = 1, Size = UDim2.new(0, 200, 1, 0), BackgroundColor3 = COLORS.Panel, BackgroundTransparency = 0.25, PlaceholderText = "Nome do local (ex: Base)", Text = "", Font = Enum.Font.Gotham, TextSize = 13, TextColor3 = COLORS.Text, PlaceholderColor3 = COLORS.TextDim, ClearTextOnFocus = false, }, { corner(8), stroke(COLORS.Purple, 1.5) }) local SaveButton = create("TextButton", { Name = "SaveButton", Parent = SaveRow, LayoutOrder = 2, Size = UDim2.new(0, 150, 1, 0), BackgroundColor3 = COLORS.PanelLight, Text = "Salvar local (X/Y/Z)", Font = Enum.Font.GothamBold, TextSize = 12, TextColor3 = COLORS.Text, AutoButtonColor = false, }, { corner(8), stroke(COLORS.Purple, 1.5) }) local SavedList = create("Frame", { Name = "SavedList", Parent = ConfigPage, LayoutOrder = 6, Size = UDim2.new(1, 0, 0, 0), AutomaticSize = Enum.AutomaticSize.Y, BackgroundTransparency = 1, }) create("UIListLayout", { Parent = SavedList, Padding = UDim.new(0, 6), SortOrder = Enum.SortOrder.LayoutOrder, }) local savedSpots = {} -- { {name=, x=, y=, z=}, ... } local function rebuildSavedList() for _, child in ipairs(SavedList:GetChildren()) do child:Destroy() end for i, spot in ipairs(savedSpots) do local Row = create("Frame", { Name = "Spot_" .. i, Parent = SavedList, LayoutOrder = i, Size = UDim2.new(1, 0, 0, 38), BackgroundColor3 = COLORS.Panel, BackgroundTransparency = 0.35, }, { corner(8) }) create("TextLabel", { Parent = Row, Position = UDim2.new(0, 10, 0, 0), Size = UDim2.new(1, -190, 1, 0), BackgroundTransparency = 1, Text = string.format("%s (%.0f, %.0f, %.0f)", spot.name, spot.x, spot.y, spot.z), Font = Enum.Font.Gotham, TextSize = 13, TextColor3 = COLORS.Text, TextXAlignment = Enum.TextXAlignment.Left, TextTruncate = Enum.TextTruncate.AtEnd, }) local GoButton = create("TextButton", { Parent = Row, AnchorPoint = Vector2.new(1, 0.5), Position = UDim2.new(1, -46, 0.5, 0), Size = UDim2.new(0, 90, 0, 26), BackgroundColor3 = COLORS.Purple, Text = "Teleportar", Font = Enum.Font.GothamBold, TextSize = 12, TextColor3 = COLORS.Text, AutoButtonColor = false, }, { corner(6) }) local DelButton = create("TextButton", { Parent = Row, AnchorPoint = Vector2.new(1, 0.5), Position = UDim2.new(1, -8, 0.5, 0), Size = UDim2.new(0, 30, 0, 26), BackgroundColor3 = COLORS.PanelLight, Text = "X", Font = Enum.Font.GothamBold, TextSize = 12, TextColor3 = COLORS.Text, AutoButtonColor = false, }, { corner(6), stroke(COLORS.Purple, 1.5) }) GoButton.MouseButton1Click:Connect(function() teleportToCoords(spot.x, spot.y, spot.z) end) DelButton.MouseButton1Click:Connect(function() table.remove(savedSpots, i) rebuildSavedList() end) end end SaveButton.MouseButton1Click:Connect(function() local x = tonumber(coordBoxes.X.Text) local y = tonumber(coordBoxes.Y.Text) local z = tonumber(coordBoxes.Z.Text) if not (x and y and z) then CoordFeedback.Text = "Preencha X, Y e Z antes de salvar." CoordFeedback.TextColor3 = Color3.fromRGB(255, 120, 120) return end local name = NameBox.Text ~= "" and NameBox.Text or ("Local " .. (#savedSpots + 1)) table.insert(savedSpots, { name = name, x = x, y = y, z = z }) NameBox.Text = "" rebuildSavedList() end) end ------------------------------------------------------------ -- POPUP DE BOAS-VINDAS ------------------------------------------------------------ local WelcomeOverlay = create("Frame", { Name = "WelcomeOverlay", Parent = MainFrame, Size = UDim2.new(1, 0, 1, -42), Position = UDim2.new(0, 0, 0, 42), BackgroundColor3 = Color3.new(0, 0, 0), BackgroundTransparency = 0.45, Visible = false, ZIndex = 10, }) local WelcomeCard = create("Frame", { Name = "WelcomeCard", Parent = WelcomeOverlay, AnchorPoint = Vector2.new(0.5, 0.5), Position = UDim2.new(0.5, 0, 0.5, 0), Size = UDim2.new(0, 380, 0, 230), BackgroundColor3 = COLORS.Panel, BackgroundTransparency = 0.05, ZIndex = 11, }, { corner(14), stroke(COLORS.Purple, 2) }) create("ImageLabel", { Parent = WelcomeCard, BackgroundTransparency = 1, Position = UDim2.new(0, 18, 0, 16), Size = UDim2.new(0, 24, 0, 24), Image = IMAGES.OpenButton, ScaleType = Enum.ScaleType.Fit, ZIndex = 11, }) create("TextLabel", { Parent = WelcomeCard, BackgroundTransparency = 1, Position = UDim2.new(0, 50, 0, 16), Size = UDim2.new(1, -68, 0, 26), Text = "Seja Bem-Vindo(a)", Font = Enum.Font.GothamBold, TextSize = 18, TextColor3 = COLORS.Text, TextXAlignment = Enum.TextXAlignment.Left, ZIndex = 11, }) create("TextLabel", { Parent = WelcomeCard, BackgroundTransparency = 1, Position = UDim2.new(0, 18, 0, 52), Size = UDim2.new(1, -36, 0, 100), Text = "Somos uma comunidade organizada. Aproveite e entre no Discord, e dê uma olhada nas categorias do menu caso queira.", Font = Enum.Font.Gotham, TextSize = 13, TextColor3 = COLORS.TextDim, TextWrapped = true, TextXAlignment = Enum.TextXAlignment.Left, TextYAlignment = Enum.TextYAlignment.Top, ZIndex = 11, }) local DiscordButton = create("TextButton", { Name = "DiscordButton", Parent = WelcomeCard, AnchorPoint = Vector2.new(0, 1), Position = UDim2.new(0, 18, 1, -16), Size = UDim2.new(0, 170, 0, 34), BackgroundColor3 = COLORS.Purple, Text = "Entrar no Discord", Font = Enum.Font.GothamBold, TextSize = 13, TextColor3 = COLORS.Text, AutoButtonColor = false, ZIndex = 11, }, { corner(8) }) local OkButton = create("TextButton", { Name = "OkButton", Parent = WelcomeCard, AnchorPoint = Vector2.new(1, 1), Position = UDim2.new(1, -18, 1, -16), Size = UDim2.new(0, 130, 0, 34), BackgroundColor3 = COLORS.PanelLight, Text = "OK, entendi", Font = Enum.Font.GothamBold, TextSize = 13, TextColor3 = COLORS.Text, AutoButtonColor = false, ZIndex = 11, }, { corner(8), stroke(COLORS.Purple, 1.5) }) local function closeWelcome() WelcomeOverlay.Visible = false end DiscordButton.MouseButton1Click:Connect(function() if DISCORD_LINK ~= "" then -- Roblox não permite abrir o navegador direto de um LocalScript comum, -- então aqui só fechamos o popup. Quando tiver o link, troque DISCORD_LINK -- no topo do script e, se quiser, ligue isso a um TextBox copiável. closeWelcome() else local originalText = DiscordButton.Text DiscordButton.Text = "Ainda não temos 😅" task.delay(1.5, function() if DiscordButton and DiscordButton.Parent then DiscordButton.Text = originalText end end) closeWelcome() end end) OkButton.MouseButton1Click:Connect(closeWelcome) ------------------------------------------------------------ -- ANIMAÇÕES: ABRIR / FECHAR / MINIMIZAR ------------------------------------------------------------ local isOpen = false local isMinimized = false local firstOpen = true local function openMenu() if isOpen then return end isOpen = true MainFrame.Visible = true MainFrame.Size = UDim2.new(0, 0, 0, 0) TweenService:Create(MainFrame, TweenInfo.new(0.35, Enum.EasingStyle.Back, Enum.EasingDirection.Out), { Size = FULL_SIZE, }):Play() if not currentTab then selectTab(categorias[1].nome) end if firstOpen then firstOpen = false task.delay(0.35, function() WelcomeOverlay.Visible = true end) end end local function closeMenu() if not isOpen then return end isOpen = false local tween = TweenService:Create(MainFrame, TweenInfo.new(0.25, Enum.EasingStyle.Quad, Enum.EasingDirection.In), { Size = UDim2.new(0, 0, 0, 0), }) tween:Play() tween.Completed:Connect(function() if not isOpen then MainFrame.Visible = false end end) end local function toggleMinimize() isMinimized = not isMinimized Container.Visible = not isMinimized local targetSize = isMinimized and MIN_SIZE or FULL_SIZE TweenService:Create(MainFrame, TweenInfo.new(0.25, Enum.EasingStyle.Quad), { Size = targetSize, }):Play() MinimizeButton.Text = isMinimized and "+" or "-" end OpenButton.MouseButton1Click:Connect(function() if isOpen then closeMenu() else openMenu() end end) CloseButton.MouseButton1Click:Connect(closeMenu) MinimizeButton.MouseButton1Click:Connect(toggleMinimize) ------------------------------------------------------------ -- ARRASTAR O PAINEL PELA BARRA SUPERIOR ------------------------------------------------------------ local dragging = false local dragStart, startPos TopBar.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 input.Changed:Connect(function() if input.UserInputState == Enum.UserInputState.End then dragging = false end end) 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)