Apollo hub
Key Required

Apollo hub

🏰 Block Tales [DEMO 5]LightboltLightbolt 1.9K views 608 executesUpdated Jun 30, 2026
Unrated
00
Lua Script•2750 lines (77802 chars)
--[[
	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)

Features & Information

Apollo brookhaven
#Apollo hub

Community Comments (2)

vaecooldudevaecooldudeJul 7, 2026

????

twxktwxkAug 8, 2026

would be absolute aura if this was in english

More Scripts for 🏰 Block Tales [DEMO 5]