Интерфейс и отрисовка
Весь интерфейс — только клиентские файлы. Инструменты уже есть, свои изобретать не нужно.
Шрифты
surface.CreateFont в проекте вызывается ровно в одном месте — vgui/cl_skin.lua, на загрузке. В остальном коде берут готовое:
Нужен новый размер или начертание — добавьте запись в roleplay.Kit.FontConfig, а не вызывайте surface.CreateFont по месту.
Создание шрифта из Paint или HUDPaint перезагружает его каждый кадр и заметно роняет FPS. То же с Material — см. Производительность.
Отрисовка через RNDX
Скруглённые прямоугольники, круги, тени и размытие рисует библиотека RNDX — не draw.RoundedBox:
Цепочка всегда заканчивается :Draw(). Полезное: :Radii(tl, tr, bl, br), :Outline(толщина), :Shadow(размытие, разброс, ox, oy), :Material(mat), :Blur(сила). :Angles(от, до) рисует дугу — удобно для круговых таймеров.
:Color() принимает и четыре числа, и готовый объект Color.
Функции вида RNDX.Draw, RNDX.DrawShadows помечены устаревшими — в новом коде их не используют.
Панели и скин
Скин OpenRP определён поверх стандартного и рисует кнопки девятипатчем из общего атласа.
Скин ставится кнопке явно: он не наследуется от родителя, созданного раньше.
Раскладка — докингом (Dock, DockMargin, DockPadding). Абсолютные координаты нужны только корневой панели относительно ScrW() и ScrH().
Панель создаётся один раз
Строит панель отдельная функция, обновляет — другая. Пересоздавать панель на каждое изменение данных не надо:
Дорогие расчёты — перенос текста, замеры surface.GetTextSize — считаются в момент обновления данных и складываются в поля панели, а не выполняются в Paint.
HUD
Лишние элементы стандартного HUD глушатся списком roleplay.HUD.Hidden: хук GM:HUDShouldDraw в cl_init.lua делает по нему обычный лукап. Чтобы спрятать ещё один элемент, достаточно добавить его имя в таблицу.
Курсор включается через gui.EnableScreenClicker, и только по изменению состояния, а не каждый кадр:
Тексты
Подписи берутся через roleplay.L('Ключ'), ключи живут в lang.lua. Русских строк прямо в панели быть не должно.
