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


-- WeaponHUD_kdm1eHvH.lua
-- Красивый HUD переключателя оружия

-- ============================================================
-- Скрываем стандартный GMod-переключатель через HUDShouldDraw
-- НО оставляем логику переключения!
-- ============================================================
hook.Add("HUDShouldDraw", "HideDefaultWeaponSel", 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_num",   { font = "Montserrat", size = 26, weight = 900, extended = true })
surface.CreateFont("wsel_name",  { font = "Montserrat", size = 16, weight = 700, extended = true })
surface.CreateFont("wsel_ammo",  { font = "Montserrat", size = 18, weight = 800, extended = true })

-- ============================================================
-- Цвета
-- ============================================================
local ACCENT = Color(220, 40, 40)
local BG     = Color(12, 12, 18, 245)
local BG_SEL = Color(45, 15, 15, 250)
local BG_ROW = Color(24, 24, 32, 235)
local TEXT   = Color(235, 235, 235)
local 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 drawWeaponSelection()
    local ply = LocalPlayer()
    if not IsValid(ply) then return end

    -- Проверяем, нажата ли цифра 1-9
    local pressedSlot = 0
    for i = 1, 9 do
        if input.IsKeyDown(KEY_1 + (i - 1)) then
            pressedSlot = i
            break
        end
    end

    if pressedSlot == 0 then return end

    -- Собираем оружие этого слота
    local list = {}
    for _, wep in ipairs(ply:GetWeapons()) do
        if IsValid(wep) and wep:GetSlot() == pressedSlot 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 cardW = 170
    local cardH = 110
    local gap = 10
    local headerH = 36
    local padding = 14

    local totalW = #list * cardW + (#list - 1) * gap + padding * 2
    local totalH = headerH + cardH + padding * 2

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

    -- Тень
    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, 3)

    -- Заголовок с логотипом
    local title = "kdm1e"
    local title2 = "HvH"
    surface.SetFont("wsel_title")
    local w1 = surface.GetTextSize(title)
    local w2 = surface.GetTextSize(title2)
    local totalW_text = w1 + w2

    local titleX = x + totalW / 2 - totalW_text / 2
    local titleY = y + 3 + headerH / 2

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

    -- Карточки
    local startX = x + padding
    local startY = y + 3 + headerH + padding

    for i, data in ipairs(list) do
        local cx = startX + (i - 1) * (cardW + gap)
        local cy = startY

        if data.selected then
            surface.SetDrawColor(BG_SEL)
        else
            surface.SetDrawColor(BG_ROW)
        end
        surface.DrawRect(cx, cy, cardW, cardH)

        if data.selected then
            surface.SetDrawColor(ACCENT)
            surface.DrawOutlinedRect(cx, cy, cardW, cardH, 2)
        else
            surface.SetDrawColor(60, 60, 80, 150)
            surface.DrawOutlinedRect(cx, cy, cardW, cardH, 1)
        end

        -- Номер
        draw.SimpleText(
            tostring(i),
            "wsel_num",
            cx + cardW / 2, cy + 8,
            data.selected and ACCENT or DIM,
            TEXT_ALIGN_CENTER, TEXT_ALIGN_TOP
        )

        -- Название
        local nameColor = data.selected and Color(255, 220, 220) or TEXT
        draw.SimpleText(
            data.name,
            "wsel_name",
            cx + cardW / 2, cy + cardH - 46,
            nameColor,
            TEXT_ALIGN_CENTER, TEXT_ALIGN_TOP
        )

        -- Патроны
        draw.SimpleText(
            data.clip .. " / " .. data.reserve,
            "wsel_ammo",
            cx + cardW / 2, cy + cardH - 24,
            data.selected and ACCENT or DIM,
            TEXT_ALIGN_CENTER, TEXT_ALIGN_TOP
        )
    end
end

hook.Add("HUDPaint", "WeaponHUD_kdm1eHvH", drawWeaponSelection)

print("[WeaponHUD] Кастомный HUD оружия загружен")