Commit 94efb620 authored by zero's avatar zero 🎱

Add new file

parent dc3516d5
--[[
© 2025 Gemin-AI para [El Nombre de tu Servidor]
FUNCIÓN:
Este es el corazón del plugin. Contiene todo el código Lua del lado del cliente
para dibujar la nueva interfaz. Anula la función que abre el menú de Helix
y la reemplaza por una propia que crea una ventana a pantalla completa con el
estilo de Battlefront. Gestiona la creación de pestañas, el cambio entre ellas
y, lo más importante, inserta los paneles originales de Helix (inventario,
personaje, etc.) dentro del nuevo diseño.
--]]
-- Almacenaremos nuestro panel principal en esta variable local para poder
-- comprobar si ya está abierto o no.
local vguiBattlefrontMenu
-- ---------------------------------------------------------------------------------
-- CONFIGURACIÓN DE ESTILO (Puedes modificar estos valores)
-- ---------------------------------------------------------------------------------
-- Paleta de colores para la interfaz.
local COLOR_BACKGROUND = Color(0, 0, 0, 225)
local COLOR_BLUE_HIGHLIGHT = Color(0, 170, 255, 255)
local COLOR_WHITE_TEXT = Color(240, 240, 240, 255)
local COLOR_GREY_TEXT = Color(180, 190, 200, 200)
local FONT_FAMILY = "Arial" -- Cambia esto por la fuente que prefieras (debe estar instalada o en el servidor).
-- Creación de las fuentes personalizadas que usará la interfaz.
surface.CreateFont("BF_Menu_Tab_Active", {
font = FONT_FAMILY,
extended = true,
size = 20,
weight = 700,
antialias = true,
shadow = false
})
surface.CreateFont("BF_Menu_Tab_Inactive", {
font = FONT_FAMILY,
extended = true,
size = 20,
weight = 500,
antialias = true,
shadow = false
})
-- ---------------------------------------------------------------------------------
-- ANULACIÓN DEL MENÚ DE HELIX
-- ---------------------------------------------------------------------------------
-- Esta es la función clave. Cuando un jugador pulsa F1, Helix llama a 'ix.menu.Toggle()'.
-- Al redefinir esta función, tomamos el control total sobre lo que sucede.
function ix.menu.Toggle()
-- Si el panel del menú ya es válido (es decir, ya está abierto), lo eliminamos para cerrarlo.
if (IsValid(vguiBattlefrontMenu)) then
vguiBattlefrontMenu:Remove()
return
end
-- Creamos el panel principal ('DFrame') que servirá de contenedor para todo el menú.
vguiBattlefrontMenu = vgui.Create("DFrame")
vguiBattlefrontMenu:SetSize(ScrW(), ScrH()) -- Ocupa toda la pantalla.
vguiBattlefrontMenu:SetPos(0, 0)
vguiBattlefrontMenu:SetTitle("")
vguiBattlefrontMenu:ShowCloseButton(false) -- Ocultamos la 'X' de cierre por defecto.
vguiBattlefrontMenu:MakePopup() -- Hace que el panel se muestre por encima de todo y capture el input.
vguiBattlefrontMenu:SetDraggable(false) -- Evita que se pueda arrastrar.
-- La función 'Paint' se ejecuta cada frame y es donde dibujamos el aspecto del panel.
vguiBattlefrontMenu.Paint = function(self, width, height)
-- 1. DIBUJAR EL FONDO
-- Asegúrate de que esta ruta apunte a la imagen de fondo de tu addon.
-- Ejemplo: "materials/tu_addon/fondos/menu.png"
surface.SetDrawColor(255, 255, 255, 255)
surface.SetMaterial(Material("materials/custom_backgrounds/swrp_bg.png")) -- <<< ¡¡¡CAMBIA ESTA RUTA!!!
surface.DrawTexturedRect(0, 0, width, height)
-- 2. DIBUJAR LA BARRA DE NAVEGACIÓN SUPERIOR
-- Un degradado sutil para la barra superior.
draw.SimpleRectGradientVertical(0, 0, width, 62, COLOR_BACKGROUND, Color(0, 0, 0, 150))
-- La línea azul que subraya la barra de navegación.
surface.SetDrawColor(COLOR_BLUE_HIGHLIGHT)
surface.DrawRect(0, 60, width, 2)
end
-- Este panel contendrá el contenido de la pestaña activa (inventario, personaje, etc.).
local contentPanel = vgui.Create("DPanel", vguiBattlefrontMenu)
contentPanel:Dock(FILL)
contentPanel:DockMargin(0, 62, 0, 0) -- Lo posicionamos justo debajo de la barra de navegación.
contentPanel.Paint = function(self, width, height)
-- Hacemos su fondo completamente transparente para que se vea la imagen principal.
return true
end
-- Almacenaremos las pestañas y su contenido en esta tabla.
local TABS = {}
local activeTabPanel -- Variable para saber qué panel de contenido está visible.
-- Función para cambiar de pestaña.
local function SwitchTab(tabID, panelToShow)
-- Ocultamos el panel de la pestaña que estuviera activa.
if (IsValid(activeTabPanel)) then
activeTabPanel:SetVisible(false)
end
-- Mostramos el nuevo panel de contenido y lo guardamos como el activo.
panelToShow:SetVisible(true)
activeTabPanel = panelToShow
-- Actualizamos el estado visual de todos los botones de las pestañas.
for id, data in pairs(TABS) do
data.button:SetActivated(id == tabID)
end
end
-- Función auxiliar para crear una nueva pestaña de navegación.
local function CreateTab(id, name, creationFunction)
local button = vgui.Create("DButton", vguiBattlefrontMenu)
button:SetText("") -- El texto lo dibujamos nosotros en Paint para un mayor control.
button:SetSize(140, 60) -- Ancho ajustado para que quepan todas las pestañas.
button.tabName = name
button.isActivated = false -- Variable para saber si la pestaña está activa.
function button:SetActivated(isNowActive)
self.isActivated = isNowActive
end
-- Redibujamos el botón para darle el estilo de Battlefront.
button.Paint = function(self, width, height)
local color
local font
if (self.isActivated) then
color = COLOR_BLUE_HIGHLIGHT
font = "BF_Menu_Tab_Active"
elseif (self:IsHovered()) then
color = COLOR_WHITE_TEXT
font = "BF_Menu_Tab_Active"
else
color = COLOR_GREY_TEXT
font = "BF_Menu_Tab_Inactive"
end
-- Dibuja el texto de la pestaña.
draw.SimpleText(self.tabName, font, width * 0.5, height * 0.5 - 2, color, TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER)
-- Si la pestaña está activada, dibuja la línea azul debajo.
if (self.isActivated) then
surface.SetDrawColor(COLOR_BLUE_HIGHLIGHT)
surface.DrawRect(width * 0.1, height - 5, width * 0.8, 3)
end
end
-- Creamos el panel de contenido para esta pestaña usando la función que nos pasaron.
-- ¡Esta es la parte donde reutilizamos los paneles de Helix!
local panel = creationFunction(contentPanel)
panel:SetVisible(false)
panel:Dock(FILL)
TABS[id] = { button = button, panel = panel }
-- Cuando se hace clic en el botón, llamamos a la función para cambiar de pestaña.
button.DoClick = function()
SwitchTab(id, panel)
surface.PlaySound("garrysmod/ui_click.wav")
end
return button
end
-- Definimos las pestañas que queremos en nuestro menú.
-- 'id' es un identificador único.
-- 'name' es el texto que se mostrará.
-- 'func' es la función que crea el panel de Helix correspondiente.
-- ACTUALIZADO: Añadidas las pestañas 'Clases' y 'Negocios' para una integración completa.
local tabsData = {
{ id = "character", name = "PERSONAJE", func = function(parent) return vgui.Create("ix.derma.Character", parent) end },
{ id = "inventory", name = "INVENTARIO", func = function(parent) return vgui.Create("ix.derma.Inventory", parent) end },
{ id = "classes", name = "CLASES", func = function(parent) return vgui.Create("ix.derma.Classes", parent) end },
{ id = "business", name = "NEGOCIOS", func = function(parent) return vgui.Create("ix.derma.Business", parent) end },
{ id = "scoreboard", name = "JUGADORES", func = function(parent) return vgui.Create("ix.derma.Scoreboard", parent) end },
{ id = "settings", name = "CONFIGURACIÓN", func = function(parent) return vgui.Create("ix.derma.Settings", parent) end },
{ id = "help", name = "AYUDA", func = function(parent) return vgui.Create("ix.derma.Help", parent) end }
}
-- Creamos y posicionamos los botones de las pestañas en la barra superior.
local xOffset = 20
for _, data in ipairs(tabsData) do
local tabButton = CreateTab(data.id, data.name, data.func)
tabButton:SetPos(xOffset, 0)
xOffset = xOffset + tabButton:GetWide()
end
-- Botón para cerrar el menú en la esquina superior derecha.
local closeButton = vgui.Create("DButton", vguiBattlefrontMenu)
closeButton:SetText("CERRAR")
closeButton:SetFont("BF_Menu_Tab_Active")
closeButton:SetSize(120, 60)
closeButton:SetPos(vguiBattlefrontMenu:GetWide() - closeButton:GetWide() - 20, 0)
closeButton:SetTextColor(COLOR_GREY_TEXT)
closeButton.Paint = function(self, w, h)
-- No dibujamos fondo, solo cambiamos el color del texto al pasar el ratón.
if (self:IsHovered()) then
self:SetTextColor(COLOR_WHITE_TEXT)
else
self:SetTextColor(COLOR_GREY_TEXT)
end
end
closeButton.DoClick = function()
vguiBattlefrontMenu:Remove()
surface.PlaySound("garrysmod/ui_close.wav")
end
-- Activamos la primera pestaña ("Personaje") por defecto al abrir el menú.
-- Usamos un 'timer.Simple' de 0 segundos para asegurarnos de que todos los
-- paneles se han creado antes de intentar cambiar a uno.
timer.Simple(0, function()
if (TABS["character"] and IsValid(TABS["character"].panel)) then
SwitchTab("character", TABS["character"].panel)
end
end)
end
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment