Документация
Скрипты
К скриптам
Начало

Первый скрипт

Соберём счётчик FPS: от пустого файла до элемента, который двигается в редакторе HUD и помнит своё место.

1. Нарисовать текст

Всё рисование живёт внутри события render2d — оно приходит каждый кадр. Первая строка проверяет, что игрок в мире: без неё скрипт упадёт в меню.

events.on("render2d", function()
    if not player.exists() then return end
    render.font_text(client.fps() .. " fps", 20, 20, 0xFFFFFFFF, 7, "medium")
end)

2. Добавить фон

Ширину панели считаем от текста, а не задаём числом: тогда элемент не развалится, когда fps станет трёхзначным. Цвета берём из темы клиента, чтобы скрипт совпадал с остальным интерфейсом.

events.on("render2d", function()
    if not player.exists() then return end

    local theme = render.theme()
    local text = client.fps() .. " fps"
    local w = render.font_width(text, 7, "medium") + 12

    render.rounded_rect(20, 20, w, 15, 4, render.with_alpha(theme.background, theme.alpha))
    render.font_text_middle(text, 26, 27.5, theme.text, 7, "medium")
end)

font_text_middle центрирует строку по вертикали: вы передаёте середину панели, а не её верх.

3. Сделать его перетаскиваемым

Координаты больше не пишем руками — их даёт ui.draggable. Элемент появляется в общем редакторе HUD, двигается мышью и сохраняется в конфиг. Размер рамки обновляем каждый кадр, иначе прямоугольник захвата разойдётся с картинкой.

local drag = ui.draggable("fps", 20, 20, 60, 15)

events.on("render2d", function()
    if not player.exists() then return end

    render.push_hud_scale()

    local theme = render.theme()
    local x, y = drag.pos()
    local text = client.fps() .. " fps"
    local w = render.font_width(text, 7, "medium") + 12

    render.rounded_rect(x, y, w, 15, 4, render.with_alpha(theme.background, theme.alpha))
    render.font_text_middle(text, x + 6, y + 7.5, theme.text, 7, "medium")

    drag.set_size(w, 15)
    render.pop_hud_scale()
end)

push_hud_scale и pop_hud_scale обязательны для всего, что стоит на драге: внутри них элемент подчиняется ползунку масштаба HUD и попадает в свою рамку в редакторе.

4. Включить и подвигать

Сохраните скрипт, включите модуль в ClickGUI и откройте чат — в этом режиме элементы HUD перетаскиваются. Позиция запишется в конфиг сама.