ui
Модуль ui создаёт вкладку скрипта в меню: страницы, группы и элементы — переключатели, ползунки, списки, поля ввода, кнопки и выбор цвета. Значения элементов сохраняются в конфиге автоматически.
Устройство меню скрипта#
- Вкладка скрипта находится в группе сайдбара SCRIPTS и называется по имени скрипта.
- Внутри вкладки — страницы (
ui.tab), на страницах — группы (tab:group), в группах — элементы (group:toggleи др.). - У элемента может быть своя дочерняя группа — попап «···» (
item:group()).

Скрипт получает объекты трёх типов:
| Тип | Что это | Откуда |
|---|---|---|
ui_tab |
страница скрипта | ui.tab, ui.find, item:parent() |
ui_group |
группа или дочерняя группа элемента | tab:group, item:group(), esp_item:group(), ui.find |
ui_item |
элемент меню | конструкторы group:*, ui.find |
Общие правила#
- Почти все сеттеры возвращают сам объект, поэтому вызовы можно цеплять:
el:visible(false):disabled(true). - В именах можно менять цвет кодами
\x07RRGGBBAA(цвет) и\x07DEFAULT(обычный цвет). При поиске и в конфиге коды не учитываются. - Повторный
ui.tabилиtab:groupс тем же именем возвращает существующий узел. - Если узел снят (скрипт-владелец выгружен), любой его метод даёт ошибку
invalid menu group.
Хранение значений#
- Значения элементов сохраняются в конфиге вместе со скриптом и восстанавливаются при создании элемента.
- Сохраняется базовое значение, а не временное
override. - Ключ вкладки скрипта в конфиге привязан к id скрипта, поэтому переименование скрипта на сайте не теряет настройки.
- При перезапуске скрипта значения элементов и открытая вкладка восстанавливаются.
ui.tab(name: string)#
Возвращает страницу name во вкладке скрипта. При первом вызове создаётся сама вкладка скрипта (иконка по умолчанию — brackets-curly). Если страница с таким именем уже есть, возвращается она.
| Параметр | Тип | Описание |
|---|---|---|
name |
string |
имя страницы |
Как страницы показываются в сайдбаре (по умолчанию — как у встроенных вкладок):
- одна страница — подвкладок нет, выделяется сама строка вкладки скрипта;
- две и больше — страницы видны вложенными строками под вкладкой скрипта.
Чтобы страницы были вложены всегда, даже одна, вызовите ui.sidebar(nil, nil, true).
Возвращает: ui_tab.
local main = ui.tab("Main")
local extra = ui.tab("Extra") -- две страницы: вложены в сайдбаре
local again = ui.tab("Main") -- та же страница, новой не создаётся
ui.sidebar(name?: string, icon?: string, nested?: boolean)#
Меняет подпись, иконку и показ страниц вкладки скрипта в сайдбаре. Вызывайте после первого ui.tab: если вкладки ещё нет, функция ничего не делает.
| Параметр | Тип | Описание |
|---|---|---|
name |
string |
новая подпись; не строка — не меняется |
icon |
string |
имя иконки Font Awesome 6: "gear", "crosshairs", "bomb", "user", "eye", "code", "folder", "github", "discord" …; пустая строка — без иконки; по умолчанию "brackets-curly" |
nested |
boolean |
true — страницы всегда вложены, даже одна; false — как у встроенных вкладок (по умолчанию); nil — не меняется |
- Имена иконок — в форме Font Awesome 6 (
trash-can, а неtrash-o), регистр важен. Подходит любое имя FA6 Solid или Brands, если такая иконка есть в шрифте меню. Неизвестное имя — вкладка без иконки и строка в консолиui.sidebar: неизвестное имя иконки "…". - Строка, которая начинается с не-ASCII байта, ставится как готовый символ иконки в UTF-8.
nestedнеbooleanи неnil— ошибкаboolean expected.- Ключ вкладки не меняется, поэтому сохранённые значения остаются. Подпись, заданная здесь, не меняется при переименовании скрипта.
Возвращает: ничего.

ui.tab("Main")
ui.tab("Misc")
ui.sidebar("My Script", "gear") -- две страницы: вложены, как у встроенных вкладок
ui.sidebar(nil, nil, true) -- страницы вложены всегда
ui.binds(all?: boolean)#
Список биндов.
| Параметр | Тип | Описание |
|---|---|---|
all |
boolean |
true — все действующие бинды; не передан или false — строки окна Keybinds |
- Без аргумента — те же строки, что показывает окно Keybinds в игре: по строке на элемент с действующим биндом, у которого включён показ в списке. Список ведётся только в игре; вне игры он пуст. От того, включено ли окно Keybinds, список не зависит.
- В список без аргумента входят и гаснущие строки: бинд уже отпущен, а строка ещё затухает. У них
is_activeравенfalse. true— запись на каждый действующий бинд, без фильтра показа.
Возвращает: table — массив объектов bind.
Поля объекта bind:
| Поле | Тип | Описание |
|---|---|---|
name |
string |
подпись строки меню |
mode |
number |
режим бинда: 0 — Toggle, 1 — Hold |
value |
по типу строки | текущее значение бинда (как get() элемента); nil, если бинд уже снят |
reference |
ui_item или nil |
элемент меню этой строки |
is_active |
boolean |
бинд действует сейчас |
should_show |
boolean |
у бинда включён показ в списке Keybinds |
tostring(bind) даёт "bind<имя>".
local font = render.load_font("Verdana", 13, "outline")
-- Свой список активных биндов
events.render:set(function()
local y = 300
for _, b in ipairs(ui.binds()) do
if b.is_active then
local mode = b.mode == 1 and "hold" or "toggle"
render.text(vector2(20, y), color(255, 255, 255, 255), font, nil, b.name, " [", mode, "]")
y = y + 14
end
end
end)
ui.scale(name?: string, value?: number)#
Масштаб интерфейса. Возвращает value, умноженное на масштаб (без value — сам масштаб).
| Параметр | Тип | Описание |
|---|---|---|
name |
string |
"menu" — масштаб меню, "esp" — ESP Scale, "windows" — Windows Scale; не передан — масштаб меню |
value |
number |
число для умножения; по умолчанию 1 |
- Аргументы позиционные: чтобы передать только
value, пишитеui.scale(nil, 8). - Другое имя — ошибка
invalid option '<имя>'.
Возвращает: number.
local pad = ui.scale(nil, 8) -- 8 px в масштабе меню
print("ESP Scale: ", ui.scale("esp"), " Windows Scale: ", ui.scale("windows"))
ui.cursor()#
Позиция курсора мыши на экране.
Возвращает: vector2.
events.render:set(function()
local m = ui.cursor()
render.circle(m, color(255, 255, 0, 255), 3)
end)
ui.units(distance?: number)#
Единицы расстояния по настройке профиля Units (в режиме Auto — по региональным настройкам Windows).
| Параметр | Тип | Описание |
|---|---|---|
distance |
number |
расстояние в игровых единицах |
- Без аргумента —
"metric"или"imperial". - С числом — три значения: расстояние в метрах (
distance × 0.0254) или футах (distance / 12), суффикс"m"или"ft"и вид"metric"или"imperial".
Возвращает: string без аргумента; number, string, string с числом.
local font = render.load_font("Verdana", 13, "outline")
events.render:set(function()
local me = entity.local_pawn()
if not me then return end
for _, pawn in ipairs(entity.pawns(true)) do
local p = render.world_to_screen(pawn:origin())
if p then
local d, suffix = ui.units(me:origin():dist(pawn:origin()))
render.text(p, color(255, 255, 255, 255), font, "c", string.format("%.0f %s", d, suffix))
end
end
end)
ui.style(name?: string)#
Цвета стиля меню — текущая палитра темы.
| Параметр | Тип | Описание |
|---|---|---|
name |
string |
имя цвета (регистр важен); не передан — все цвета |
Имена цветов: Text, Disabled Text, Active Text, Small Text, Grey Text, Logo, Sidebar Background, Popup Background, Main Window Background, Preview Background, Border, Frame Background, Frame Active Background, Text Preview, Window Title, Active Window Title, Scrollbar Background, Scrollbar Grab, Scrollbar Grab Active, Switch, Switch Active, Switch Background, Switch Active Background, Slider Background, Slider Active Background, Slider Grab, Slider Grab Active, Button, Button Active, Link, Link Active, Selection, Separator, Tab, Text Selection, Shadows, Spinner, Block Background, Sidebar Selection, Logo Background, Button Text, Button Active Text, Transparent Background.
Возвращает: color — с именем; nil — неизвестное имя; table { [имя] = color } — без имени.
local font = render.load_font("Verdana", 14, "outline")
events.render:set(function()
render.rect(vector2(20, 400), vector2(160, 24), ui.style("Main Window Background"), 6)
render.text(vector2(30, 405), ui.style("Link Active"), font, nil, "Цвет темы меню")
end)
ui.localize(lang: string, key: string, text: string)#
Задаёт перевод подписи элемента скрипта для языка меню.
| Параметр | Тип | Описание |
|---|---|---|
lang |
string |
язык меню: "ru" или "en" |
key |
string |
имя элемента, как его передали при создании (цветовые коды не учитываются) |
text |
string |
подпись на этом языке, до 1000 байт |
- В меню показывается перевод текущего языка, если его нет — перевод
"en", если нет и его — исходное имя. - Меняется только видимая подпись. Ключ элемента в конфиге, бинды и путь для
ui.findостаются прежними. - Повторный вызов с тем же
langиkeyзаменяет перевод. Переводы снимаются при выгрузке скрипта. - Переводятся только подписи элементов; подписи групп, страниц и вкладки скрипта не переводятся.
- Другой язык — ошибка
invalid language.
Возвращает: ничего.
local g = ui.tab("Main"):group("General")
local on = g:toggle("Enable", true)
ui.localize("ru", "Enable", "Включить")
ui.localize("en", "Enable", "Enable")
ui.alpha()#
Прозрачность меню.
Возвращает: number от 0 до 1; при открытом меню — 1.
local font = render.load_font("Verdana", 14, "outline")
-- Подсказка, которая появляется и гаснет вместе с меню
events.render:set(function()
local a = ui.alpha()
if a <= 0 then return end
render.text(vector2(20, 440), color(255, 255, 255, math.floor(255 * a)), font, nil, "Меню открыто")
end)
ui.position()#
Позиция главного окна меню. Аргументы не учитываются: всегда берётся главное окно.
Возвращает: vector2; (0, 0), если окна нет.
local font = render.load_font("Verdana", 14, "outline")
-- Подпись над окном меню, пока оно открыто
events.render:set(function()
local pos, size = ui.position(), ui.size()
if size.x > 0 then
render.text(vector2(pos.x + size.x / 2, pos.y - 14), color(255, 255, 255, 255), font, "c", "Мой скрипт")
end
end)
ui.size()#
Размер главного окна меню. Аргументы не учитываются: всегда берётся главное окно.
Возвращает: vector2; (0, 0), если окна нет.
local s = ui.size()
print("Меню: ", s.x, "x", s.y)
ui.find(...)#
Находит узел меню по пути из подписей. Подписи сравниваются без учёта регистра.
| Параметр | Тип | Описание |
|---|---|---|
... |
string |
сегменты пути |
Пути:
- Меню скриптов:
"Scripts", <имя скрипта>, <страница>, <группа>, <элемент>. - Встроенное меню:
[<группа сайдбара>,] <вкладка>, <подвкладка>, <группа>, [<элемент-хозяин «···»>,] <подпись строки>. Путь только из областей возвращает контейнер.
Ошибки: empty path — нет аргументов; аргумент не строка — string expected.
Возвращает: ui_item, ui_group, ui_tab или nil. Если у найденного элемента есть дочерняя группа, вторым значением идёт ui_group.
Во встроенных группах нельзя создавать свои элементы (
cannot create elements inside a built-in menu group). Встроенные строки можно читать, менять черезsetи временно переопределять черезoverride.
local rage = ui.find("Rage", "Rage", "MAIN", "Enabled")
if rage then
print("Рейдж включён: ", tostring(rage:get()))
end
-- Элемент своего скрипта (скрипт называется «My Script»)
local el = ui.find("Scripts", "My Script", "Main", "General", "Enabled")
tab:group(name: string, column?: string)#
Возвращает группу на странице. Если группа с таким именем есть, возвращается она, а column не применяется.
| Параметр | Тип | Описание |
|---|---|---|
name |
string |
имя группы |
column |
string |
"left", "right", "auto" или nil; "auto" чередует колонки |
Ошибка: column can either be 'left', 'right', 'auto', nil or none.
Возвращает: ui_group.
local tab = ui.tab("Main")
local left = tab:group("General", "left")
local right = tab:group("Colors", "right")