-- VICTOR HUB — GUI Moderno, Arrastrable con Minimizar -- LocalScript en StarterGui local Players = game:GetService("Players") local TweenService = game:GetService("TweenService") local RunService = game:GetService("RunService") local UIS = game:GetService("UserInputService") local player = Players.LocalPlayer local pGui = player:WaitForChild("PlayerGui") local char = player.Character or player.CharacterAdded:Wait() -- ══════════════════════════════════════════════ -- COLORES -- ══════════════════════════════════════════════ local C = { BG = Color3.fromRGB(8, 12, 22), PANEL = Color3.fromRGB(12, 18, 35), HEADER = Color3.fromRGB(20, 30, 55), ACCENT = Color3.fromRGB(110, 60, 240), ACCENT2 = Color3.fromRGB(60, 180, 255), TEXT = Color3.fromRGB(230, 225, 255), TEXTDIM = Color3.fromRGB(130, 120, 170), DANGER = Color3.fromRGB(220, 40, 60), SUCCESS = Color3.fromRGB(50, 200, 110), } -- ══════════════════════════════════════════════ -- HELPERS -- ══════════════════════════════════════════════ local function addCorner(p, r) local c = Instance.new("UICorner", p) c.CornerRadius = UDim.new(0, r or 10) return c end local function addStroke(p, col, th) local s = Instance.new("UIStroke", p) s.Color = col s.Thickness = th or 1.5 return s end local function addGradient(p, c0, c1, rot) local g = Instance.new("UIGradient", p) g.Color = ColorSequence.new({ ColorSequenceKeypoint.new(0, c0), ColorSequenceKeypoint.new(1, c1), }) g.Rotation = rot or 90 return g end -- ══════════════════════════════════════════════ -- SCREENGUI -- ══════════════════════════════════════════════ local SG = Instance.new("ScreenGui") SG.Name = "VictorHub" SG.ResetOnSpawn = false SG.IgnoreGuiInset = true SG.ZIndexBehavior = Enum.ZIndexBehavior.Sibling SG.Parent = pGui -- ══════════════════════════════════════════════ -- PANEL PRINCIPAL -- ══════════════════════════════════════════════ local PW, PH = 420, 520 local Panel = Instance.new("Frame") Panel.Name = "VictorHubPanel" Panel.Size = UDim2.new(0, PW, 0, PH) Panel.Position = UDim2.new(0.5, -PW/2, 0.5, -PH/2) Panel.BackgroundColor3= C.BG Panel.BorderSizePixel = 0 Panel.ZIndex = 50 Panel.Active = true Panel.Parent = SG addCorner(Panel, 18) addGradient(Panel, Color3.fromRGB(15, 20, 40), Color3.fromRGB(8, 10, 25), 140) addStroke(Panel, C.ACCENT, 2.5) -- ── HEADER ────────────────────────────────── local Header = Instance.new("TextButton") Header.Size = UDim2.new(1, 0, 0, 50) Header.BackgroundColor3 = C.HEADER Header.BorderSizePixel = 0 Header.Text = "" Header.AutoButtonColor = false Header.ZIndex = 51 Header.Active = true Header.Parent = Panel addCorner(Header, 18) local hFix = Instance.new("Frame", Header) hFix.Size = UDim2.new(1, 0, 0.5, 0) hFix.Position = UDim2.new(0, 0, 0.5, 0) hFix.BackgroundColor3 = C.HEADER hFix.BorderSizePixel = 0 hFix.ZIndex = 51 -- Ícono local hIcon = Instance.new("TextLabel", Header) hIcon.Size = UDim2.new(0, 44, 1, 0) hIcon.Position = UDim2.new(0, 10, 0, 0) hIcon.BackgroundTransparency = 1 hIcon.Text = "⚡" hIcon.TextSize = 26 hIcon.Font = Enum.Font.GothamBold hIcon.TextColor3 = C.ACCENT2 hIcon.ZIndex = 52 -- Título local hTitle = Instance.new("TextLabel", Header) hTitle.Size = UDim2.new(1, -110, 1, 0) hTitle.Position = UDim2.new(0, 56, 0, 0) hTitle.BackgroundTransparency = 1 hTitle.Text = "VICTOR HUB" hTitle.TextColor3 = C.TEXT hTitle.TextSize = 18 hTitle.Font = Enum.Font.GothamBold hTitle.TextXAlignment = Enum.TextXAlignment.Left hTitle.ZIndex = 52 -- Gradiente en título local tg = Instance.new("UIGradient", hTitle) tg.Color = ColorSequence.new({ ColorSequenceKeypoint.new(0, Color3.fromRGB(255, 100, 200)), ColorSequenceKeypoint.new(0.5, Color3.fromRGB(100, 200, 255)), ColorSequenceKeypoint.new(1, Color3.fromRGB(100, 255, 150)), }) tg.Rotation = 0 -- Animar gradiente task.spawn(function() local r = 0 while hTitle and hTitle.Parent do r = (r + 1.5) % 360 tg.Rotation = r task.wait(0.04) end end) -- Botón minimizar local MinBtn = Instance.new("TextButton", Header) MinBtn.Size = UDim2.new(0, 32, 0, 32) MinBtn.Position = UDim2.new(1, -74, 0.5, -16) MinBtn.BackgroundColor3 = Color3.fromRGB(80, 120, 200) MinBtn.Text = "−" MinBtn.TextColor3 = Color3.fromRGB(255, 255, 255) MinBtn.TextSize = 20 MinBtn.Font = Enum.Font.GothamBold MinBtn.AutoButtonColor = false MinBtn.ZIndex = 53 addCorner(MinBtn, 8) addStroke(MinBtn, C.ACCENT, 1.5) -- Botón cerrar local CloseBtn = Instance.new("TextButton", Header) CloseBtn.Size = UDim2.new(0, 32, 0, 32) CloseBtn.Position = UDim2.new(1, -36, 0.5, -16) CloseBtn.BackgroundColor3 = C.DANGER CloseBtn.Text = "✕" CloseBtn.TextColor3 = Color3.fromRGB(255, 255, 255) CloseBtn.TextSize = 16 CloseBtn.Font = Enum.Font.GothamBold CloseBtn.AutoButtonColor = false CloseBtn.ZIndex = 53 addCorner(CloseBtn, 8) -- ── TABS ──────────────────────────────────── -- (Todo el código de tabs, contenido, habilidades se mantiene exactamente igual) local tabNames = {"⚡ Habilidades"} local tabs = {} local tabActivo = 1 local TabBar = Instance.new("Frame", Panel) TabBar.Size = UDim2.new(1, -20, 0, 36) TabBar.Position = UDim2.new(0, 10, 0, 58) TabBar.BackgroundColor3= C.PANEL TabBar.BorderSizePixel = 0 TabBar.ZIndex = 51 addCorner(TabBar, 10) local tabLay = Instance.new("UIListLayout", TabBar) tabLay.FillDirection = Enum.FillDirection.Horizontal tabLay.SortOrder = Enum.SortOrder.LayoutOrder tabLay.Padding = UDim.new(0, 4) local tabPad = Instance.new("UIPadding", TabBar) tabPad.PaddingLeft = UDim.new(0, 4) tabPad.PaddingTop = UDim.new(0, 4) tabPad.PaddingBottom = UDim.new(0, 4) local Content = Instance.new("Frame", Panel) Content.Size = UDim2.new(1, -20, 1, -110) Content.Position = UDim2.new(0, 10, 0, 102) Content.BackgroundColor3= C.PANEL Content.BorderSizePixel = 0 Content.ZIndex = 51 addCorner(Content, 10) for i, name in ipairs(tabNames) do local btn = Instance.new("TextButton", TabBar) btn.Size = UDim2.new(0, (PW-28-16), 1, 0) btn.BackgroundColor3 = C.ACCENT btn.Text = name btn.TextColor3 = Color3.fromRGB(255, 255, 255) btn.TextSize = 12 btn.Font = Enum.Font.GothamBold btn.AutoButtonColor = false btn.ZIndex = 52 btn.LayoutOrder = i addCorner(btn, 8) local frame = Instance.new("Frame", Content) frame.Size = UDim2.new(1, 0, 1, 0) frame.BackgroundTransparency = 1 frame.Visible = i == 1 frame.ZIndex = 52 tabs[i] = frame btn.Activated:Connect(function() tabActivo = i for j, b in ipairs(TabBar:GetChildren()) do if b:IsA("TextButton") then TweenService:Create(b, TweenInfo.new(0.15), { BackgroundColor3 = j == i and C.ACCENT or Color3.fromRGB(30, 22, 60), }):Play() end end for j, f in ipairs(tabs) do f.Visible = j == i end end) end -- ══════════════════════════════════════════════ -- TAB: HABILIDADES -- ══════════════════════════════════════════════ local scrollHab = Instance.new("ScrollingFrame", tabs[1]) scrollHab.Size = UDim2.new(1, -10, 1, -10) scrollHab.Position = UDim2.new(0, 5, 0, 5) scrollHab.BackgroundTransparency = 1 scrollHab.ScrollBarThickness = 4 scrollHab.CanvasSize = UDim2.new(0, 0, 0, 0) scrollHab.AutomaticCanvasSize = Enum.AutomaticSize.Y scrollHab.ZIndex = 53 local habLay = Instance.new("UIListLayout", scrollHab) habLay.SortOrder = Enum.SortOrder.LayoutOrder habLay.Padding = UDim.new(0, 8) local habPad = Instance.new("UIPadding", scrollHab) habPad.PaddingLeft = UDim.new(0, 5) habPad.PaddingRight = UDim.new(0, 5) habPad.PaddingTop = UDim.new(0, 5) local habilidades = { {emoji="🚀", nombre="Infiniti Jump", desc="Salta infinitamente", toggle=true}, {emoji="👻", nombre="Noclip", desc="Atraviesa paredes", toggle=true}, {emoji="⚡", nombre="Speed Boost", desc="Aumenta tu velocidad x2", toggle=true}, {emoji="💨", nombre="Boost", desc="Propulsa hacia adelante", button=true}, {emoji="🛡️", nombre="Anti Void", desc="No caes al vacío", toggle=true}, {emoji="🟢", nombre="Anti Lag", desc="Optimiza rendering", toggle=true}, {emoji="👁️", nombre="ESP Players", desc="Ve a otros jugadores", toggle=true}, } for i, hab in ipairs(habilidades) do local row = Instance.new("Frame", scrollHab) row.Size = UDim2.new(1, 0, 0, 46) row.BackgroundColor3 = Color3.fromRGB(18, 13, 40) row.BorderSizePixel = 0 row.ZIndex = 53 row.LayoutOrder = i addCorner(row, 10) addStroke(row, C.ACCENT, 1) local emoji = Instance.new("TextLabel", row) emoji.Size = UDim2.new(0, 40, 1, 0) emoji.BackgroundTransparency = 1 emoji.Text = hab.emoji emoji.TextSize = 20 emoji.Font = Enum.Font.GothamBold emoji.ZIndex = 54 local nombre = Instance.new("TextLabel", row) nombre.Size = UDim2.new(0.55, 0, 0.5, 0) nombre.Position = UDim2.new(0, 45, 0, 4) nombre.BackgroundTransparency = 1 nombre.Text = hab.nombre nombre.TextColor3 = C.ACCENT2 nombre.TextSize = 13 nombre.Font = Enum.Font.GothamBold nombre.TextXAlignment = Enum.TextXAlignment.Left nombre.ZIndex = 54 local desc = Instance.new("TextLabel", row) desc.Size = UDim2.new(0.55, 0, 0.5, 0) desc.Position = UDim2.new(0, 45, 0, 20) desc.BackgroundTransparency = 1 desc.Text = hab.desc desc.TextColor3 = C.TEXTDIM desc.TextSize = 11 desc.Font = Enum.Font.Gotham desc.TextXAlignment = Enum.TextXAlignment.Left desc.ZIndex = 54 if hab.toggle then local toggleBG = Instance.new("Frame", row) toggleBG.Size = UDim2.new(0, 50, 0, 24) toggleBG.Position = UDim2.new(1, -58, 0.5, -12) toggleBG.BackgroundColor3 = Color3.fromRGB(40, 30, 70) toggleBG.BorderSizePixel = 0 toggleBG.ZIndex = 54 addCorner(toggleBG, 12) addStroke(toggleBG, C.ACCENT, 1.5) local toggleBtn = Instance.new("TextButton", toggleBG) toggleBtn.Size = UDim2.new(0, 20, 0, 20) toggleBtn.Position = UDim2.new(0, 2, 0.5, -10) toggleBtn.BackgroundColor3 = Color3.fromRGB(100, 80, 150) toggleBtn.Text = "" toggleBtn.AutoButtonColor = false toggleBtn.ZIndex = 55 addCorner(toggleBtn, 4) local activo = false toggleBtn.Activated:Connect(function() activo = not activo if activo then TweenService:Create(toggleBtn, TweenInfo.new(0.2), {Position = UDim2.new(0, 28, 0.5, -10), BackgroundColor3 = C.SUCCESS}):Play() TweenService:Create(toggleBG, TweenInfo.new(0.2), {BackgroundColor3 = Color3.fromRGB(30, 50, 40)}):Play() else TweenService:Create(toggleBtn, TweenInfo.new(0.2), {Position = UDim2.new(0, 2, 0.5, -10), BackgroundColor3 = Color3.fromRGB(100, 80, 150)}):Play() TweenService:Create(toggleBG, TweenInfo.new(0.2), {BackgroundColor3 = Color3.fromRGB(40, 30, 70)}):Play() end end) else local actionBtn = Instance.new("TextButton", row) actionBtn.Size = UDim2.new(0, 50, 0, 28) actionBtn.Position = UDim2.new(1, -58, 0.5, -14) actionBtn.BackgroundColor3 = C.ACCENT actionBtn.Text = "→" actionBtn.TextColor3 = Color3.fromRGB(255, 255, 255) actionBtn.TextSize = 14 actionBtn.Font = Enum.Font.GothamBold actionBtn.AutoButtonColor = false actionBtn.ZIndex = 54 addCorner(actionBtn, 7) actionBtn.MouseEnter:Connect(function() TweenService:Create(actionBtn, TweenInfo.new(0.12), {BackgroundColor3 = C.ACCENT:Lerp(Color3.fromRGB(255,255,255), 0.15)}):Play() end) actionBtn.MouseLeave:Connect(function() TweenService:Create(actionBtn, TweenInfo.new(0.12), {BackgroundColor3 = C.ACCENT}):Play() end) actionBtn.Activated:Connect(function() print("[BOOST] Activado") end) end end -- ══════════════════════════════════════════════ -- HOVER Y CLICK (botones) -- ══════════════════════════════════════════════ MinBtn.MouseEnter:Connect(function() TweenService:Create(MinBtn, TweenInfo.new(0.1), {BackgroundColor3 = Color3.fromRGB(100, 140, 220)}):Play() end) MinBtn.MouseLeave:Connect(function() TweenService:Create(MinBtn, TweenInfo.new(0.1), {BackgroundColor3 = Color3.fromRGB(80, 120, 200)}):Play() end) CloseBtn.MouseEnter:Connect(function() TweenService:Create(CloseBtn, TweenInfo.new(0.1), {BackgroundColor3 = Color3.fromRGB(240, 60, 80)}):Play() end) CloseBtn.MouseLeave:Connect(function() TweenService:Create(CloseBtn, TweenInfo.new(0.1), {BackgroundColor3 = C.DANGER}):Play() end) -- ══════════════════════════════════════════════ -- MINIMIZAR Y CERRAR (sin cambios) -- ══════════════════════════════════════════════ local minimizado = false MinBtn.Activated:Connect(function() minimizado = not minimizado if minimizado then TweenService:Create(Panel, TweenInfo.new(0.4, Enum.EasingStyle.Back, Enum.EasingDirection.In), { Size = UDim2.new(0, PW, 0, 50), Position = UDim2.new(0.5, -PW/2, 1, -60), }):Play() MinBtn.Text = "▲" for _, child in ipairs(Panel:GetChildren()) do if child ~= Header and child:IsA("GuiObject") then child.Visible = false end end else for _, child in ipairs(Panel:GetChildren()) do if child ~= Header and child:IsA("GuiObject") then child.Visible = true end end TweenService:Create(Panel, TweenInfo.new(0.4, Enum.EasingStyle.Back, Enum.EasingDirection.Out), { Size = UDim2.new(0, PW, 0, PH), Position = UDim2.new(0.5, -PW/2, 0.5, -PH/2), }):Play() MinBtn.Text = "−" end end) CloseBtn.Activated:Connect(function() TweenService:Create(Panel, TweenInfo.new(0.3, Enum.EasingStyle.Quad, Enum.EasingDirection.In), { Size = UDim2.new(0, PW, 0, 0), Position = UDim2.new(0.5, -PW/2, 0.5, 0), BackgroundTransparency = 1, }):Play() task.wait(0.4) Panel.Visible = false end) -- ══════════════════════════════════════════════ -- ARRASTRE OPTIMIZADO PARA DELTA -- ══════════════════════════════════════════════ local dragging = false local dragStart = nil local startPos = nil Header.InputBegan:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then dragging = true dragStart = input.Position startPos = Panel.AbsolutePosition end end) UIS.InputEnded:Connect(function(input) if input.UserInputType == Enum.UserInputType.MouseButton1 or input.UserInputType == Enum.UserInputType.Touch then dragging = false end end) UIS.InputChanged:Connect(function(input) if not dragging then return end if input.UserInputType == Enum.UserInputType.MouseMovement or input.UserInputType == Enum.UserInputType.Touch then local delta = input.Position - dragStart local viewport = workspace.CurrentCamera.ViewportSize local panelSize = Panel.AbsoluteSize local newX = math.clamp(startPos.X + delta.X, 0, viewport.X - panelSize.X) local newY = math.clamp(startPos.Y + delta.Y, 0, viewport.Y - panelSize.Y) Panel.Position = UDim2.new(0, newX, 0, newY) -- Actualizar startPos para movimiento continuo dragStart = input.Position startPos = Vector2.new(newX, newY) end end) print("✅ VICTOR HUB listo (arrastrable optimizado para Delta)")