Загрузка данных


-- WeaponMenu_kdm1eHvH.lua
-- Красно-чёрное меню выбора оружия

-- ============ Скрываем стандартный GMod-переключатель ============
hook.Add("HUDShouldDraw", "HideDefaultWeaponSelection", function(name)
    if name == "CHudWeaponSelection" then return false end
end)

-- ============ Шрифты ============
surface.CreateFont("wsel_title",  { font = "Montserrat", size = 22, weight = 900, extended = true })
surface.CreateFont("wsel_name",   { font = "Montserrat", size = 20, weight = 800, extended = true })
surface.CreateFont("wsel_small",  { font = "Montserrat", size = 14, weight = 600, extended = true })
surface.CreateFont("wsel_ammo",   { font = "Montserrat", size = 16, weight = 800, extended = true })

-- ============ Цвета ============
local ACCENT   = Color(220, 40, 40)
local BG       = Color(12, 12, 18, 235)
local BG_SEL   = Color(45, 15, 15, 245)
local BG_ROW   = Color(24, 24, 32, 230)
local TEXT     = Color(235, 235, 235)
local TEXT_DIM = Color(150, 150, 160)

-- ============ Утилиты ============
local function getWeaponAmmo(ply, wep)
    local clip = wep:Clip1()
    local reserve = ply:GetAmmoCount(wep:GetPrimaryAmmoType())
    if clip < 0 then clip = 0 end
    if reserve < 0 then reserve = 0 end
    return clip, reserve
end

-- ============ Отрисовка меню ============
local function drawWeaponMenu()
    local ply = LocalPlayer()
    if not IsValid(ply) then return end

    local weps = ply:GetWeapons()
    if #weps == 0 then return end

    -- Собираем данные об оружии
    local list = {}
    for _, wep in ipairs(weps) do
        if IsValid(wep) then
            local clip, reserve = getWeaponAmmo(ply, wep)
            table.insert(list, {
                wep = wep,
                name = wep:GetPrintName() or wep:GetClass(),
                clip = clip,
                reserve = reserve,
                selected = (ply:GetActiveWeapon() == wep)
            })
        end
    end

    if #list == 0 then return end

    -- Размеры
    local rowH = 68
    local rowW = 420
    local gap = 8
    local headerH = 44
    local padding = 12

    local totalH = headerH + #list * (rowH + gap) + padding * 2 - gap
    local totalW = rowW

    local x = (ScrW() - totalW) / 2
    local y = (ScrH() - totalH) / 2

    -- ===== Тень панели =====
    surface.SetDrawColor(0, 0, 0, 180)
    surface.DrawRect(x + 5, y + 5, totalW, totalH)

    -- ===== Фон =====
    surface.SetDrawColor(BG)
    surface.DrawRect(x, y, totalW, totalH)

    -- ===== Красная полоса сверху =====
    surface.SetDrawColor(ACCENT)
    surface.DrawRect(x, y, totalW, 4)

    -- ===== Заголовок =====
    surface.SetDrawColor(BG_ROW)
    surface.DrawRect(x, y + 4, totalW, headerH)

    -- Логотип в заголовке
    surface.SetFont("wsel_title")
    local t1 = "kdm1e"
    local t2 = "HvH"
    local w1 = surface.GetTextSize(t1)
    local w2 = surface.GetTextSize(t2)
    local totalW_text = w1 + w2
    local titleX = x + (totalW - totalW_text) / 2
    local titleY = y + 4 + headerH / 2

    draw.SimpleText(t1, "wsel_title", titleX, titleY, color_white, TEXT_ALIGN_LEFT, TEXT_ALIGN_CENTER)
    draw.SimpleText(t2, "wsel_title", titleX + w1, titleY, ACCENT, TEXT_ALIGN_LEFT, TEXT_ALIGN_CENTER)

    -- ===== Строки оружия =====
    local startY = y + 4 + headerH + padding

    for i, data in ipairs(list) do
        local ry = startY + (i - 1) * (rowH + gap)

        -- Фон строки
        if data.selected then
            surface.SetDrawColor(BG_SEL)
        else
            surface.SetDrawColor(BG_ROW)
        end
        surface.DrawRect(x + padding, ry, totalW - padding * 2, rowH)

        -- Красная рамка для выбранного
        if data.selected then
            surface.SetDrawColor(ACCENT)
            surface.DrawOutlinedRect(x + padding, ry, totalW - padding * 2, rowH, 2)
        else
            surface.SetDrawColor(60, 60, 80, 150)
            surface.DrawOutlinedRect(x + padding, ry, totalW - padding * 2, rowH, 1)
        end

        -- Слот (номер) слева
        local slotColor = data.selected and ACCENT or TEXT_DIM
        draw.SimpleText(
            tostring(i),
            "wsel_name",
            x + padding + 22, ry + rowH / 2,
            slotColor,
            TEXT_ALIGN_CENTER, TEXT_ALIGN_CENTER
        )

        -- Вертикальная линия
        surface.SetDrawColor(255, 255, 255, 20)
        surface.DrawRect(x + padding + 44, ry + 12, 1, rowH - 24)

        -- Название оружия
        local nameColor = data.selected and Color(255, 220, 220) or TEXT
        draw.SimpleText(
            data.name,
            "wsel_name",
            x + padding + 60, ry + rowH / 2,
            nameColor,
            TEXT_ALIGN_LEFT, TEXT_ALIGN_CENTER
        )

        -- Патроны (справа)
        local ammoX = x + totalW - padding - 20
        draw.SimpleText(
            data.clip .. " / " .. data.reserve,
            "wsel_ammo",
            ammoX, ry + rowH / 2,
            data.selected and ACCENT or TEXT_DIM,
            TEXT_ALIGN_RIGHT, TEXT_ALIGN_CENTER
        )
    end
end

-- ============ Показываем меню при нажатии 1-9 ============
local function isWeaponKeyDown()
    for i = 1, 9 do
        if input.IsKeyDown(KEY_1 + (i - 1)) then return true end
    end
    return false
end

hook.Add("HUDPaint", "WeaponMenu_kdm1eHvH", function()
    if not isWeaponKeyDown() then return end
    if gui.IsGameUIVisible() then return end
    if IsValid(vgui.GetKeyboardFocus()) then return end

    drawWeaponMenu()
end)

print("[kdm1eHvH] Меню выбора оружия загружено")