local PLUGIN = PLUGIN local COLOR_BG_DARK = Color(3, 5, 4) local COLOR_BG_MEDIUM = Color(8, 12, 10) local COLOR_BG_LIGHT = Color(12, 18, 14) local COLOR_PRIMARY = Color(27, 94, 32) local COLOR_PRIMARY_DARK = Color(15, 60, 18) local COLOR_ACCENT = Color(56, 102, 35) local COLOR_TEXT_PRIMARY = Color(165, 214, 167) local COLOR_TEXT_SECONDARY = Color(102, 187, 106) local COLOR_DANGER = Color(136, 14, 14) local COLOR_WARNING = Color(191, 130, 0) local COLOR_BORDER = Color(15, 60, 18, 60) if not draw.Circle then function draw.Circle(x, y, radius, color) local segmentCount = math.max(16, radius) surface.SetDrawColor(color or color_white) local circle = {} for i = 0, segmentCount do local angle = math.rad((i / segmentCount) * 360) table.insert(circle, { x = x + math.cos(angle) * radius, y = y + math.sin(angle) * radius }) end surface.DrawPoly(circle) end end if not surface.DrawCircle then function surface.DrawCircle(x, y, radius, color) draw.Circle(x, y, radius, color) end end local COLOR_TEXT_SECONDARY = Color(174, 213, 129) local COLOR_DANGER = Color(229, 57, 53) local COLOR_WARNING = Color(255, 193, 7) local COLOR_BORDER = Color(46, 125, 50, 100) net.Receive("ixArsenalOpen", function() local supply = net.ReadUInt(32) local factionID = net.ReadUInt(8) local weaponsData = net.ReadTable() local weaponHas = net.ReadTable() local armorData = net.ReadTable() local freeRemain = net.ReadUInt(32) if not weaponsData or type(weaponsData) ~= "table" then weaponsData = {} end if not weaponHas or type(weaponHas) ~= "table" then weaponHas = {} end if IsValid(PLUGIN.menu) then PLUGIN.menu:Remove() end local scrW, scrH = ScrW(), ScrH() local frame = vgui.Create("DFrame") frame:SetSize(scrW, scrH) frame:SetPos(0, 0) frame:SetTitle("") frame:SetDraggable(false) frame:ShowCloseButton(false) frame:MakePopup() frame.Paint = function(s, w, h) surface.SetDrawColor(COLOR_BG_DARK) surface.DrawRect(0, 0, w, h) local gradHeight = 300 for i = 0, gradHeight do local alpha = (1 - i/gradHeight) * 40 surface.SetDrawColor(COLOR_PRIMARY.r, COLOR_PRIMARY.g, COLOR_PRIMARY.b, alpha) surface.DrawRect(0, i, w, 1) end surface.SetDrawColor(COLOR_BG_MEDIUM) surface.DrawRect(0, 0, w, 100) surface.SetDrawColor(COLOR_PRIMARY) surface.DrawRect(0, 100, w, 3) surface.SetDrawColor(COLOR_BORDER) for i = 0, w, 200 do surface.DrawRect(i, 0, 1, 100) end draw.SimpleText("◆ ВОЕННЫЙ АРСЕНАЛ ◆", "ixMenuButtonFont", w/2, 35, COLOR_ACCENT, TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER) draw.SimpleText("СИСТЕМА СНАБЖЕНИЯ", "ixSmallFont", w/2, 68, COLOR_TEXT_SECONDARY, TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER) end local closeBtn = vgui.Create("DButton", frame) closeBtn:SetText("") closeBtn:SetSize(42, 42) closeBtn:SetPos(scrW - 60, 18) closeBtn.Paint = function(s, w, h) local col = s:IsHovered() and COLOR_DANGER or Color(COLOR_DANGER.r * 0.7, COLOR_DANGER.g * 0.7, COLOR_DANGER.b * 0.7) draw.RoundedBox(4, 0, 0, w, h, col) surface.SetDrawColor(COLOR_BG_DARK) surface.DrawOutlinedRect(0, 0, w, h, 2) surface.SetDrawColor(COLOR_TEXT_PRIMARY) surface.DrawLine(w*0.3, h*0.3, w*0.7, h*0.7) surface.DrawLine(w*0.7, h*0.3, w*0.3, h*0.7) if s:IsHovered() then surface.SetDrawColor(255, 255, 255, 30) draw.RoundedBox(4, 0, 0, w, h, Color(255, 255, 255, 30)) end end closeBtn.DoClick = function() frame:Close() end local infoPanel = vgui.Create("DPanel", frame) infoPanel:SetSize(scrW - 80, 70) infoPanel:SetPos(40, 115) infoPanel.Paint = function(s, w, h) draw.RoundedBox(8, 0, 0, w, h, COLOR_BG_LIGHT) surface.SetDrawColor(COLOR_PRIMARY) surface.DrawOutlinedRect(0, 0, w, h, 2) end local supplyBox = vgui.Create("DPanel", infoPanel) supplyBox:SetSize(infoPanel:GetWide() / 2 - 10, infoPanel:GetTall()) supplyBox:SetPos(5, 0) supplyBox.Paint = function(s, w, h) draw.SimpleText("ОЧКИ СНАБЖЕНИЯ", "ixSmallFont", 20, 12, COLOR_TEXT_SECONDARY, TEXT_ALIGN_LEFT, TEXT_ALIGN_TOP) draw.SimpleText(tostring(supply), "ixMenuButtonFont", 20, 32, COLOR_ACCENT, TEXT_ALIGN_LEFT, TEXT_ALIGN_TOP) surface.SetDrawColor(COLOR_PRIMARY) draw.NoTexture() surface.DrawCircle(w - 35, h/2, 12, COLOR_PRIMARY) end local currencySymbol = "$" if PLUGIN and PLUGIN.config and PLUGIN.config.currencySymbol and factionID then currencySymbol = PLUGIN.config.currencySymbol[factionID] or currencySymbol end local function formatTime(seconds) seconds = math.max(0, tonumber(seconds) or 0) if seconds <= 0 then return "Готово" end local h = math.floor(seconds / 3600) local m = math.floor((seconds % 3600) / 60) local s = seconds % 60 if h > 0 then return string.format("%02d:%02d:%02d", h, m, s) else return string.format("%02d:%02d", m, s) end end local cooldownBox = vgui.Create("DPanel", infoPanel) cooldownBox:SetSize(infoPanel:GetWide() / 2 - 10, infoPanel:GetTall()) cooldownBox:SetPos(infoPanel:GetWide() / 2 + 5, 0) cooldownBox.Paint = function(s, w, h) draw.SimpleText("БЕСПЛАТНОЕ СНАРЯЖЕНИЕ", "ixSmallFont", 20, 12, COLOR_TEXT_SECONDARY, TEXT_ALIGN_LEFT, TEXT_ALIGN_TOP) local timeText = formatTime(freeRemain) local timeColor = freeRemain <= 0 and COLOR_PRIMARY or COLOR_WARNING draw.SimpleText(timeText, "ixMenuButtonFont", 20, 32, timeColor, TEXT_ALIGN_LEFT, TEXT_ALIGN_TOP) if freeRemain > 0 then surface.SetDrawColor(COLOR_WARNING) draw.NoTexture() surface.DrawCircle(w - 35, h/2, 12, COLOR_WARNING) else surface.SetDrawColor(COLOR_PRIMARY) draw.NoTexture() surface.DrawCircle(w - 35, h/2, 12, COLOR_PRIMARY) end end local colWidth = (scrW - 120) / 2 local startY = 205 -- Панель оружия local weaponsPanel = vgui.Create("DPanel", frame) weaponsPanel:SetSize(colWidth, scrH - startY - 40) weaponsPanel:SetPos(40, startY) weaponsPanel.Paint = function(s, w, h) draw.RoundedBox(8, 0, 0, w, h, COLOR_BG_MEDIUM) surface.SetDrawColor(COLOR_BORDER) surface.DrawOutlinedRect(0, 0, w, h, 2) end local weaponsHeader = vgui.Create("DPanel", weaponsPanel) weaponsHeader:SetSize(weaponsPanel:GetWide(), 45) weaponsHeader:SetPos(0, 0) weaponsHeader.Paint = function(s, w, h) draw.RoundedBoxEx(8, 0, 0, w, h, COLOR_PRIMARY_DARK, true, true, false, false) draw.SimpleText("▣ ОРУЖИЕ", "ixSmallFont", 15, h/2, COLOR_TEXT_PRIMARY, TEXT_ALIGN_LEFT, TEXT_ALIGN_CENTER) -- Декоративная линия surface.SetDrawColor(COLOR_ACCENT) surface.DrawRect(0, h-2, w, 2) end local weaponsScroll = vgui.Create("DScrollPanel", weaponsPanel) weaponsScroll:SetSize(weaponsPanel:GetWide() - 20, weaponsPanel:GetTall() - 60) weaponsScroll:SetPos(10, 50) local sbar = weaponsScroll:GetVBar() sbar:SetHideButtons(true) function sbar:Paint(w, h) draw.RoundedBox(4, 0, 0, w, h, COLOR_BG_DARK) end function sbar.btnGrip:Paint(w, h) draw.RoundedBox(4, 0, 0, w, h, COLOR_PRIMARY) end -- Функция для создания окна выбора оружия из категории local function OpenCategoryWeapons(categoryName, categoryIcon, categoryWeapons) local catFrame = vgui.Create("DFrame") catFrame:SetSize(800, 600) catFrame:Center() catFrame:SetTitle("") catFrame:SetDraggable(true) catFrame:ShowCloseButton(false) catFrame:MakePopup() catFrame.Paint = function(s, w, h) draw.RoundedBox(8, 0, 0, w, h, COLOR_BG_DARK) surface.SetDrawColor(COLOR_PRIMARY) surface.DrawOutlinedRect(0, 0, w, h, 3) -- Заголовок draw.RoundedBoxEx(8, 0, 0, w, 60, COLOR_PRIMARY_DARK, true, true, false, false) draw.SimpleText(categoryIcon .. " " .. categoryName, "ixMenuButtonFont", w/2, 30, COLOR_TEXT_PRIMARY, TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER) surface.SetDrawColor(COLOR_ACCENT) surface.DrawRect(0, 60, w, 2) end -- Кнопка закрытия local catCloseBtn = vgui.Create("DButton", catFrame) catCloseBtn:SetText("") catCloseBtn:SetSize(35, 35) catCloseBtn:SetPos(catFrame:GetWide() - 45, 12) catCloseBtn.Paint = function(s, w, h) local col = s:IsHovered() and COLOR_DANGER or Color(COLOR_DANGER.r * 0.7, COLOR_DANGER.g * 0.7, COLOR_DANGER.b * 0.7) draw.RoundedBox(4, 0, 0, w, h, col) surface.SetDrawColor(COLOR_TEXT_PRIMARY) surface.DrawLine(w*0.3, h*0.3, w*0.7, h*0.7) surface.DrawLine(w*0.7, h*0.3, w*0.3, h*0.7) end catCloseBtn.DoClick = function() catFrame:Close() end -- Скролл с оружием local catScroll = vgui.Create("DScrollPanel", catFrame) catScroll:SetSize(catFrame:GetWide() - 30, catFrame:GetTall() - 85) catScroll:SetPos(15, 70) local catSbar = catScroll:GetVBar() catSbar:SetHideButtons(true) function catSbar:Paint(w, h) draw.RoundedBox(4, 0, 0, w, h, COLOR_BG_DARK) end function catSbar.btnGrip:Paint(w, h) draw.RoundedBox(4, 0, 0, w, h, COLOR_PRIMARY) end -- Создаем карточки оружия for class, data in SortedPairsByMemberValue(categoryWeapons, "name", true) do local has = weaponHas[class] local row = vgui.Create("DPanel", catScroll) row:SetSize(catScroll:GetWide() - 10, 110) row:Dock(TOP) row:DockMargin(0, 0, 0, 10) local isHovered = false row.Paint = function(s, w, h) local bgColor = has and Color(45, 25, 20) or COLOR_BG_LIGHT if isHovered then bgColor = Color(bgColor.r + 10, bgColor.g + 15, bgColor.b + 10) end draw.RoundedBox(6, 0, 0, w, h, bgColor) local statusColor = has and Color(205, 127, 50) or COLOR_PRIMARY draw.RoundedBoxEx(6, 0, 0, 5, h, statusColor, true, false, true, false) surface.SetDrawColor(has and Color(205, 127, 50, 80) or COLOR_BORDER) surface.DrawOutlinedRect(0, 0, w, h, 2) if isHovered then surface.SetDrawColor(COLOR_ACCENT) surface.DrawRect(5, h-3, w-10, 3) end end row.OnCursorEntered = function() isHovered = true end row.OnCursorExited = function() isHovered = false end -- Название local nameLabel = vgui.Create("DLabel", row) nameLabel:SetText(data.name or class) nameLabel:SetFont("ixSmallFont") nameLabel:SetTextColor(COLOR_TEXT_PRIMARY) nameLabel:SetPos(15, 10) nameLabel:SizeToContents() -- Цена local money = data.moneyPrice or 0 local supply = data.supplyPrice or 0 local priceLabel = vgui.Create("DLabel", row) local priceText = "" if (money or 0) <= 0 and (supply or 0) <= 0 then priceText = "★ БЕСПЛАТНО" else local parts = {} if money > 0 then table.insert(parts, currencySymbol .. tostring(money)) end if supply > 0 then table.insert(parts, tostring(supply) .. " ОС") end priceText = table.concat(parts, " • ") end priceLabel:SetText(priceText) priceLabel:SetFont("ixSmallFont") priceLabel:SetTextColor(money <= 0 and supply <= 0 and COLOR_ACCENT or COLOR_TEXT_PRIMARY) priceLabel:SetPos(15, 40) priceLabel:SizeToContents() -- Донат метка if data.donate then local donateLabel = vgui.Create("DLabel", row) donateLabel:SetText("★ ПРЕМИУМ") donateLabel:SetFont("ixSmallFont") donateLabel:SetTextColor(COLOR_WARNING) donateLabel:SetPos(15, 70) donateLabel:SizeToContents() end -- Кнопка действия local btn = vgui.Create("DButton", row) btn:SetSize(120, 40) btn:SetPos(row:GetWide() - 130, 35) btn:SetText("") local btnText = has and "◄ ВЕРНУТЬ" or "ВЗЯТЬ ►" local btnColor = has and Color(165, 85, 60) or COLOR_PRIMARY local btnColorHover = has and Color(205, 105, 70) or COLOR_ACCENT btn.Paint = function(s, w, h) local col = s:IsHovered() and btnColorHover or btnColor draw.RoundedBox(6, 0, 0, w, h, col) if s:IsHovered() then surface.SetDrawColor(255, 255, 255, 30) draw.RoundedBox(6, 2, 2, w-4, h-4, Color(255, 255, 255, 30)) end surface.SetDrawColor(COLOR_BG_DARK) surface.DrawOutlinedRect(0, 0, w, h, 2) draw.SimpleText(btnText, "ixSmallFont", w/2, h/2, COLOR_TEXT_PRIMARY, TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER) end btn.DoClick = function() if has then Derma_Query("Вернуть снаряжение? Фракция получит 80% стоимости.", "Возврат", "Подтвердить", function() net.Start("ixArsenalAction") net.WriteString("return_weapon") net.WriteString(class) net.SendToServer() catFrame:Close() frame:Close() end, "Отмена", function() end) else local options = {} if (data.moneyPrice or 0) > 0 then table.insert(options, {text = "Купить за деньги", method = "money"}) end if (data.supplyPrice or 0) >= 0 then table.insert(options, {text = "Купить за очки", method = "supply"}) end if #options == 0 then Derma_Message("Невозможно приобрести это оружие", "Ошибка", "OK") return end if #options == 1 then net.Start("ixArsenalAction") net.WriteString("buy_weapon") net.WriteString(class) net.WriteString(options[1].method) net.SendToServer() catFrame:Close() frame:Close() else local query = Derma_Query("Выберите способ оплаты:", "Оплата", options[1].text, function() net.Start("ixArsenalAction") net.WriteString("buy_weapon") net.WriteString(class) net.WriteString(options[1].method) net.SendToServer() catFrame:Close() frame:Close() end, options[2].text, function() net.Start("ixArsenalAction") net.WriteString("buy_weapon") net.WriteString(class) net.WriteString(options[2].method) net.SendToServer() catFrame:Close() frame:Close() end, "Отмена", function() end) if IsValid(query) then query:ShowCloseButton(true) end end end end end end -- Панель брони local armorPanel = vgui.Create("DPanel", frame) armorPanel:SetSize(colWidth, scrH - startY - 40) armorPanel:SetPos(scrW - colWidth - 40, startY) armorPanel.Paint = function(s, w, h) draw.RoundedBox(8, 0, 0, w, h, COLOR_BG_MEDIUM) surface.SetDrawColor(COLOR_BORDER) surface.DrawOutlinedRect(0, 0, w, h, 2) end local armorHeader = vgui.Create("DPanel", armorPanel) armorHeader:SetSize(armorPanel:GetWide(), 45) armorHeader:SetPos(0, 0) armorHeader.Paint = function(s, w, h) draw.RoundedBoxEx(8, 0, 0, w, h, COLOR_PRIMARY_DARK, true, true, false, false) draw.SimpleText("⬢ ЗАЩИТА", "ixSmallFont", 15, h/2, COLOR_TEXT_PRIMARY, TEXT_ALIGN_LEFT, TEXT_ALIGN_CENTER) -- Декоративная линия surface.SetDrawColor(COLOR_ACCENT) surface.DrawRect(0, h-2, w, 2) end local armorScroll = vgui.Create("DScrollPanel", armorPanel) armorScroll:SetSize(armorPanel:GetWide() - 20, armorPanel:GetTall() - 60) armorScroll:SetPos(10, 50) local sbar2 = armorScroll:GetVBar() sbar2:SetHideButtons(true) function sbar2:Paint(w, h) draw.RoundedBox(4, 0, 0, w, h, COLOR_BG_DARK) end function sbar2.btnGrip:Paint(w, h) draw.RoundedBox(4, 0, 0, w, h, COLOR_PRIMARY) end -- Группировка оружия по категориям local categories = { {name = "Основное оружие", icon = "▣", key = "primary", weapons = {}}, {name = "Пистолеты", icon = "▢", key = "secondary", weapons = {}}, {name = "Гранаты", icon = "◆", key = "grenades", weapons = {}}, {name = "Холодное оружие", icon = "▸", key = "melee", weapons = {}}, {name = "Прочее", icon = "◇", key = "other", weapons = {}} } -- Распределяем оружие по категориям for class, data in pairs(weaponsData) do if type(data) == "table" then local cat = data.category or "other" local added = false if cat == "primary" then table.insert(categories[1].weapons, {class = class, data = data}) added = true elseif cat == "secondary" then table.insert(categories[2].weapons, {class = class, data = data}) added = true elseif cat == "grenade1" or cat == "grenade2" or cat == "grenade" then table.insert(categories[3].weapons, {class = class, data = data}) added = true elseif cat == "melee" then table.insert(categories[4].weapons, {class = class, data = data}) added = true end if not added then table.insert(categories[5].weapons, {class = class, data = data}) end end end -- Создаем кнопки категорий local totalWeapons = 0 for _, category in ipairs(categories) do if #category.weapons > 0 then totalWeapons = totalWeapons + #category.weapons local catButton = vgui.Create("DPanel", weaponsScroll) catButton:SetSize(weaponsScroll:GetWide() - 10, 80) catButton:Dock(TOP) catButton:DockMargin(0, 0, 0, 10) catButton:SetCursor("hand") local isHovered = false catButton.Paint = function(s, w, h) local bgColor = COLOR_BG_LIGHT if isHovered then bgColor = Color(bgColor.r + 15, bgColor.g + 20, bgColor.b + 15) end draw.RoundedBox(6, 0, 0, w, h, bgColor) -- Боковая полоска draw.RoundedBoxEx(6, 0, 0, 6, h, COLOR_PRIMARY, true, false, true, false) -- Рамка surface.SetDrawColor(COLOR_BORDER) surface.DrawOutlinedRect(0, 0, w, h, 2) -- Акцентная линия при наведении if isHovered then surface.SetDrawColor(COLOR_ACCENT) surface.DrawRect(6, h-3, w-12, 3) end -- Иконка категории draw.SimpleText(category.icon, "ixMenuButtonFont", 30, h/2, COLOR_ACCENT, TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER) -- Название категории draw.SimpleText(category.name, "ixSmallFont", 60, h/2 - 12, COLOR_TEXT_PRIMARY, TEXT_ALIGN_LEFT, TEXT_ALIGN_CENTER) -- Количество оружия draw.SimpleText(#category.weapons .. " ед.", "ixSmallFont", 60, h/2 + 12, COLOR_TEXT_SECONDARY, TEXT_ALIGN_LEFT, TEXT_ALIGN_CENTER) -- Стрелка draw.SimpleText("►", "ixSmallFont", w - 25, h/2, COLOR_PRIMARY, TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER) end catButton.OnCursorEntered = function() isHovered = true end catButton.OnCursorExited = function() isHovered = false end catButton.OnMousePressed = function() -- Подготовка данных для окна категории local categoryWeapons = {} for _, wpn in ipairs(category.weapons) do categoryWeapons[wpn.class] = wpn.data end OpenCategoryWeapons(category.name, category.icon, categoryWeapons) end end end -- Если нет оружия вообще if totalWeapons == 0 then local emptyLabel = vgui.Create("DPanel", weaponsScroll) emptyLabel:SetSize(weaponsScroll:GetWide(), 100) emptyLabel:Dock(TOP) emptyLabel:DockMargin(0, 20, 0, 0) emptyLabel.Paint = function(s, w, h) draw.RoundedBox(6, 0, 0, w, h, COLOR_BG_LIGHT) surface.SetDrawColor(COLOR_BORDER) surface.DrawOutlinedRect(0, 0, w, h, 1) draw.SimpleText("⚠ НЕТ ДОСТУПНОГО ОРУЖИЯ", "ixSmallFont", w/2, h/2 - 10, COLOR_TEXT_SECONDARY, TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER) draw.SimpleText("Обратитесь к командованию", "ixSmallFont", w/2, h/2 + 15, Color(COLOR_TEXT_SECONDARY.r * 0.7, COLOR_TEXT_SECONDARY.g * 0.7, COLOR_TEXT_SECONDARY.b * 0.7), TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER) end end -- Заполнение брони if not armorData or type(armorData) ~= "table" then armorData = {} end if table.Count(armorData) > 0 then for class, data in SortedPairsByMemberValue(armorData, "name", true) do local row = vgui.Create("DPanel", armorScroll) row:SetSize(armorScroll:GetWide() - 10, 100) row:Dock(TOP) row:DockMargin(0, 0, 0, 10) local isHovered = false row.Paint = function(s, w, h) local bgColor = COLOR_BG_LIGHT if isHovered then bgColor = Color(bgColor.r + 10, bgColor.g + 15, bgColor.b + 10) end draw.RoundedBox(6, 0, 0, w, h, bgColor) -- Боковая полоска draw.RoundedBoxEx(6, 0, 0, 5, h, COLOR_ACCENT, true, false, true, false) -- Рамка surface.SetDrawColor(COLOR_BORDER) surface.DrawOutlinedRect(0, 0, w, h, 2) -- Акцентная линия при наведении if isHovered then surface.SetDrawColor(COLOR_ACCENT) surface.DrawRect(5, h-3, w-10, 3) end end row.OnCursorEntered = function() isHovered = true end row.OnCursorExited = function() isHovered = false end -- Название брони local nameLabel = vgui.Create("DLabel", row) nameLabel:SetText(data.name or class) nameLabel:SetFont("ixSmallFont") nameLabel:SetTextColor(COLOR_TEXT_PRIMARY) nameLabel:SetPos(15, 10) nameLabel:SizeToContents() -- Параметры брони local amountLabel = vgui.Create("DLabel", row) amountLabel:SetText("⬢ Защита: " .. tostring(data.amount or 0) .. " ед.") amountLabel:SetFont("ixSmallFont") amountLabel:SetTextColor(COLOR_TEXT_SECONDARY) amountLabel:SetPos(15, 35) amountLabel:SizeToContents() -- Цена local moneyP = data.moneyPrice or 0 local supplyP = data.supplyPrice or 0 local priceText = "" if (moneyP or 0) <= 0 and (supplyP or 0) <= 0 then priceText = "★ БЕСПЛАТНО" else local parts = {} if moneyP > 0 then table.insert(parts, currencySymbol .. tostring(moneyP)) end if supplyP > 0 then table.insert(parts, tostring(supplyP) .. " ОС") end priceText = table.concat(parts, " • ") end local priceLabel = vgui.Create("DLabel", row) priceLabel:SetText(priceText) priceLabel:SetFont("ixSmallFont") priceLabel:SetTextColor(moneyP <= 0 and supplyP <= 0 and COLOR_ACCENT or COLOR_TEXT_PRIMARY) priceLabel:SetPos(15, 58) priceLabel:SizeToContents() -- Кнопка покупки local btn = vgui.Create("DButton", row) btn:SetSize(120, 40) btn:SetPos(row:GetWide() - 130, 30) btn:SetText("") btn.Paint = function(s, w, h) local col = s:IsHovered() and COLOR_ACCENT or COLOR_PRIMARY draw.RoundedBox(6, 0, 0, w, h, col) if s:IsHovered() then surface.SetDrawColor(255, 255, 255, 30) draw.RoundedBox(6, 2, 2, w-4, h-4, Color(255, 255, 255, 30)) end surface.SetDrawColor(COLOR_BG_DARK) surface.DrawOutlinedRect(0, 0, w, h, 2) draw.SimpleText("КУПИТЬ ►", "ixSmallFont", w/2, h/2, COLOR_TEXT_PRIMARY, TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER) end btn.DoClick = function() local options = {} if (data.moneyPrice or 0) > 0 then table.insert(options, {text = "Купить за деньги", method = "money"}) end if (data.supplyPrice or 0) >= 0 then table.insert(options, {text = "Купить за очки", method = "supply"}) end if #options == 0 then Derma_Message("Невозможно приобрести эту броню", "Ошибка", "OK") return end if #options == 1 then net.Start("ixArsenalAction") net.WriteString("buy_armor") net.WriteString(class) net.WriteString(options[1].method) net.SendToServer() frame:Close() else local query = Derma_Query("Выберите способ оплаты:", "Оплата", options[1].text, function() net.Start("ixArsenalAction") net.WriteString("buy_armor") net.WriteString(class) net.WriteString(options[1].method) net.SendToServer() frame:Close() end, options[2].text, function() net.Start("ixArsenalAction") net.WriteString("buy_armor") net.WriteString(class) net.WriteString(options[2].method) net.SendToServer() frame:Close() end, "Отмена", function() end) if IsValid(query) then query:ShowCloseButton(true) end end end end else local emptyLabel = vgui.Create("DPanel", armorScroll) emptyLabel:SetSize(armorScroll:GetWide(), 100) emptyLabel:Dock(TOP) emptyLabel:DockMargin(0, 20, 0, 0) emptyLabel.Paint = function(s, w, h) draw.RoundedBox(6, 0, 0, w, h, COLOR_BG_LIGHT) surface.SetDrawColor(COLOR_BORDER) surface.DrawOutlinedRect(0, 0, w, h, 1) draw.SimpleText("⚠ НЕТ ДОСТУПНОЙ ЗАЩИТЫ", "ixSmallFont", w/2, h/2 - 10, COLOR_TEXT_SECONDARY, TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER) draw.SimpleText("Обратитесь к командованию", "ixSmallFont", w/2, h/2 + 15, Color(COLOR_TEXT_SECONDARY.r * 0.7, COLOR_TEXT_SECONDARY.g * 0.7, COLOR_TEXT_SECONDARY.b * 0.7), TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER) end end PLUGIN.menu = frame end)