HUD-элементы
Драг — это точка на экране, которую клиент двигает вместе с остальными элементами интерфейса и хранит в конфиге. Всё, что рисует скрипт, привязывается к ней.
Создание
local drag = ui.draggable("watermark", 10, 10, 90, 15)Первый аргумент — идентификатор внутри скрипта, по нему запоминается позиция. Дальше стартовые координаты и размер рамки.
drag.pos()текущие координаты элементаdrag.set_size(w, h)размер рамки, обновляется каждый кадрdrag.anchor()к какому краю прижат: left/right и top/bottomdrag.add_settings(...)настройки в контекстное меню элементаdrag.menu_open()открыто ли это менюМасштаб
Встроенные элементы клиента рисуются внутри масштаба HUD. Скрипт должен объявить его сам — иначе ползунок масштаба на элемент не действует, а картинка расходится с рамкой захвата, и правый клик по элементу промахивается мимо меню.
events.on("render2d", function()
if not player.exists() then return end
render.push_hud_scale()
-- всё рисование элемента
render.pop_hud_scale()
end)Своё меню по правому клику
Настройки элемента удобнее держать в нём самом, а не в общей панели модуля. add_settings кладёт виджеты в контекстное меню драга — оно открывается правым кликом по элементу в редакторе HUD.
local drag = ui.draggable("watermark", 10, 10, 90, 15)
local nick = ui.checkbox("Ник", true)
local fps = ui.checkbox("FPS", false)
nick.visible(false)
fps.visible(false)
drag.add_settings(nick, fps)visible(false) убирает виджет из панели модуля, но в меню элемента он остаётся. В панели тогда видно только галочку самого элемента, а его параметры лежат там, где на них смотрят.
Размер по содержимому
Ширину почти всегда считают от текста, а не задают числом. Тогда элемент не разъедется от длинного ника или трёхзначного пинга.
local name = client.user() or "player"
local w = 25 + render.font_width(name, 8, "medium")
render.rect_style(x, y, w, 15, 4)
render.font_text_middle(name, x + 19, y + 7.5, theme.text, 8, "medium")
drag.set_size(w, 15)Пустое состояние
Список, в котором сейчас нечего показать, исчезает с экрана — и поймать его мышью становится нечем. client.hud_editor() подсказывает, что открыт редактор: в этот момент показывают строку-пример.
if #items == 0 and client.hud_editor() then
items = { { label = "AttackAura", key = "R" } }
end