Загрузка данных
-- 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 оружия загружен")