-- Переопределение стилей чатбокса под общий дизайн Military RP local PLUGIN = PLUGIN local gradient = surface.GetTextureID("vgui/gradient-u") local gradientUp = surface.GetTextureID("vgui/gradient-d") -- Цвета в стиле HUD local Colors = { green = Color(84, 147, 90), dark_green = Color(52, 91, 60), darker_green = Color(35, 53, 29), gray = Color(193, 193, 193), gray_dark = Color(94, 94, 94), black = Color(0, 0, 0, 220), black_light = Color(0, 0, 0, 150), white = Color(255, 255, 255) } -- Переопределяем стандартные функции рисования чатбокса local SKIN = derma.GetDefaultSkin() -- Фон чатбокса function SKIN:PaintChatboxBackground(panel, width, height) -- Blur эффект ix.util.DrawBlur(panel, 8) -- Основной фон с градиентом surface.SetDrawColor(Colors.black) surface.DrawRect(0, 0, width, height) if (panel:GetActive()) then -- Зелёный градиент сверху когда чат активен surface.SetDrawColor(Colors.dark_green.r, Colors.dark_green.g, Colors.dark_green.b, 120) surface.SetTexture(gradientUp) surface.DrawTexturedRect(0, panel.tabs.buttons:GetTall(), width, height * 0.25) end -- Обводка в стиле HUD surface.SetDrawColor(Colors.darker_green) surface.DrawOutlinedRect(0, 0, width, height) -- Тонкая внутренняя обводка surface.SetDrawColor(Colors.green.r, Colors.green.g, Colors.green.b, 60) surface.DrawOutlinedRect(1, 1, width - 2, height - 2) end -- Кнопки табов function SKIN:PaintChatboxTabButton(panel, width, height) if (panel:GetActive()) then -- Активная вкладка - зелёный градиент surface.SetDrawColor(Colors.dark_green) surface.DrawRect(0, 0, width, height) surface.SetDrawColor(Colors.green.r, Colors.green.g, Colors.green.b, 100) surface.SetTexture(gradient) surface.DrawTexturedRect(0, 0, width, height) else -- Неактивная вкладка surface.SetDrawColor(Colors.black_light) surface.DrawRect(0, 0, width, height) -- Индикатор непрочитанных сообщений if (panel:GetUnread()) then surface.SetDrawColor(ColorAlpha(Color(200, 200, 50), Lerp(panel.unreadAlpha, 0, 120))) surface.SetTexture(gradient) surface.DrawTexturedRect(0, 0, width, height - 1) end end -- Разделитель вкладок surface.SetDrawColor(Colors.darker_green) surface.DrawRect(width - 1, 0, 1, height) end -- Панель табов function SKIN:PaintChatboxTabs(panel, width, height, alpha) -- Фон панели табов surface.SetDrawColor(Colors.black_light) surface.DrawRect(0, 0, width, height) -- Градиент вниз surface.SetDrawColor(Colors.darker_green.r, Colors.darker_green.g, Colors.darker_green.b, 150) surface.SetTexture(gradient) surface.DrawTexturedRect(0, height * 0.5, width, height * 0.5) local tab = panel:GetActiveTab() if (tab) then local button = tab:GetButton() local x, _ = button:GetPos() -- Линия под активной вкладкой (зелёная) surface.SetDrawColor(Colors.green) surface.DrawRect(x, height - 2, button:GetWide(), 2) -- Обводка панели табов surface.SetDrawColor(Colors.darker_green) surface.DrawRect(0, height - 1, x, 1) -- слева surface.DrawRect(x + button:GetWide(), height - 1, width - x - button:GetWide(), 1) -- справа end end -- Поле ввода текста function SKIN:PaintChatboxEntry(panel, width, height) -- Фон поля ввода surface.SetDrawColor(Colors.darker_green.r, Colors.darker_green.g, Colors.darker_green.b, 100) surface.DrawRect(0, 0, width, height) -- Текст panel:DrawTextEntryText(Colors.white, Colors.green, Colors.white) -- Обводка surface.SetDrawColor(Colors.dark_green) surface.DrawOutlinedRect(0, 0, width, height) -- Внутренний highlight когда активно if panel:HasFocus() then surface.SetDrawColor(Colors.green.r, Colors.green.g, Colors.green.b, 80) surface.DrawOutlinedRect(1, 1, width - 2, height - 2) end end -- Превью команды function SKIN:DrawChatboxPreviewBox(x, y, text, color) color = color or Colors.green local textWidth, textHeight = surface.GetTextSize(text) local width, height = textWidth + 8, textHeight + 8 -- Фон surface.SetDrawColor(Colors.dark_green) surface.DrawRect(x, y, width, height) -- Градиент surface.SetDrawColor(color.r, color.g, color.b, 60) surface.SetTexture(gradient) surface.DrawTexturedRect(x, y, width, height) -- Текст surface.SetTextColor(Colors.white) surface.SetTextPos(x + width * 0.5 - textWidth * 0.5, y + height * 0.5 - textHeight * 0.5) surface.DrawText(text) -- Обводка surface.SetDrawColor(Colors.darker_green) surface.DrawOutlinedRect(x, y, width, height) return width end -- Префикс команды function SKIN:DrawChatboxPrefixBox(panel, width, height) local color = panel:GetBackgroundColor() or Colors.green -- Фон surface.SetDrawColor(Colors.dark_green) surface.DrawRect(0, 0, width, height) -- Градиент surface.SetDrawColor(color.r, color.g, color.b, 80) surface.SetTexture(gradient) surface.DrawTexturedRect(0, 0, width, height) -- Обводка surface.SetDrawColor(Colors.darker_green) surface.DrawOutlinedRect(0, 0, width, height) end -- Автодополнение команд function SKIN:PaintChatboxAutocompleteEntry(panel, width, height) -- Выделенный фон if (panel.highlightAlpha > 0) then surface.SetDrawColor(Colors.dark_green.r, Colors.dark_green.g, Colors.dark_green.b, panel.highlightAlpha * 150) surface.DrawRect(0, 0, width, height) -- Градиент выделения surface.SetDrawColor(Colors.green.r, Colors.green.g, Colors.green.b, panel.highlightAlpha * 60) surface.SetTexture(gradient) surface.DrawTexturedRect(0, 0, width, height) end -- Разделитель между командами surface.SetDrawColor(Colors.darker_green.r, Colors.darker_green.g, Colors.darker_green.b, 100) surface.DrawRect(0, height - 1, width, 1) end hook.Add("LoadFonts", "MilitaryRPChatFonts", function() -- Переопределяем шрифты чата на Montserrat local scale = ix.option.Get("chatFontScale", 1) surface.CreateFont("ixChatFont", { font = "Montserrat", size = 17 * scale, weight = 400, extended = true }) surface.CreateFont("ixChatFontItalics", { font = "Montserrat", size = 17 * scale, weight = 400, italic = true, extended = true }) end)