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