CS2 Lua API

ui

Модуль ui создаёт вкладку скрипта в меню: страницы, группы и элементы — переключатели, ползунки, списки, поля ввода, кнопки и выбор цвета. Значения элементов сохраняются в конфиге автоматически.

Устройство меню скрипта#

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

вкладка скрипта в группе SCRIPTS: две колонки групп с переключателем, ползунком и выбором цвета

Скрипт получает объекты трёх типов:

Тип Что это Откуда
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.
  • Ключ вкладки не меняется, поэтому сохранённые значения остаются. Подпись, заданная здесь, не меняется при переименовании скрипта.

Возвращает: ничего.

вкладка скрипта в группе SCRIPTS с иконкой gear и двумя вложенными страницами

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")