Быстрый старт
/

Lua в destahook

Скрипты позволяют добавить собственный оверлей, элементы меню и логику на Lua 5.4. Вкладка Lua отвечает за загрузку файлов и элементы их меню; кнопка Open Blueprint Editor открывает визуальный граф в отдельном окне, которое можно перемещать и растягивать.

Скрипты выполняются на вашем компьютере. Запускайте только код, которому доверяете. Это API расширения, а не изолированная песочница для чужого кода.

Первый запуск

  1. Запустите CS2 Dev из лоудера и откройте вкладку Lua.
  2. В облачной библиотеке введите имя, например hello.lua, и нажмите New Lua. Выберите ресурс, нажмите Edit source, вставьте код и сохраните Save.
  3. Нажмите Refresh, если ресурс ещё не появился в менеджере, затем включите чекбокс скрипта. Autoload сохраняет автоматическую загрузку в облаке.
  4. После изменения исходника облачная библиотека передаёт новую ревизию. Reload позволяет перечитать её сразу; при ошибке менеджер показывает сообщение под скриптом.

Import file читает выбранный вами существующий .lua и отправляет его в облако. Browse public и Import sharecode позволяют импортировать опубликованный ресурс. Public resource / Publish открывает доступ к исходнику другим пользователям; приватный ресурс остаётся в вашей библиотеке.

Клиент не создаёт папку скриптов, autoload.txt или локальный лог. Исходники, autoload и позиции оверлея хранятся в облачном аккаунте. Кнопка Open docs открывает lua.destahook.xyz.

Минимальный скрипт

Добавьте этот код в облачный ресурс hello.lua:

script = { name = "Hello", author = "you", version = "1.0" }

local accent = render.color(255, 90, 90, 255)

events.on("render", function()
    render.draggable_text("hello_label", 30, 30,
                          "Hello from Lua", accent, 18, true, true)
end)

events.on("menu", function()
    ui.text("Мой первый скрипт")
end)

На вкладке Lua появится имя Hello. Ошибка загрузки или исполнения показывается под скриптом; локальный logs.txt не создаётся.

Чтобы переместить надпись, откройте меню, включите Edit overlay positions на вкладке Lua или в окне Blueprint и перетащите подсвеченный прямоугольник мышью. Если открыто окно Blueprint и оно закрывает надпись, закройте или отодвиньте его. Позиция сохраняется после отпускания кнопки и переживает перезагрузку скрипта. В раскрывающемся списке Overlay positions можно включить Scale with screen для каждого элемента или сбросить его позицию. При включённом масштабировании сохраняется относительное место на экранах другого размера. Для линий и прямоугольников используйте layout.position; параметры описаны в API.

Частые задачи

-- Список игроков: доступен в игровом контексте.
events.on("render", function()
    if not entity.in_game() then return end

    for _, player in ipairs(entity.players(true)) do
        if player.alive and player:has_bone(7) then
            local visible, point = render.world_to_screen(player:bone(7))
            if visible then
                render.text(point.x, point.y, player.name, render.color(255, 255, 255), 14, true)
            end
        end
    end
end)

-- Слайдер и изменение существующей настройки.
events.on("menu", function()
    local fov = ui.slider_float("Lua FOV", 0.5, 30.0, config.get("aim.fov") or 5.0)
    if ui.button("Применить") then config.set("aim.fov", fov) end
end)

-- Свой бинд: клавиша выбирается через меню и проверяется в render/tick.
local my_key = keys.shift
events.on("menu", function()
    my_key = ui.keybind("My action", my_key)
end)
events.on("tick", function()
    if input.is_down(my_key) then
        -- действие при удержании клавиши
    end
end)

Следующие страницы: Lua API destahook, совместимость gamesensical, визуальный редактор и лицензии.

Производительность и безопасность

  • События tick и render вызываются каждый кадр. Не выполняйте в них тяжёлые циклы, многочисленные schema.read_* или создание больших таблиц без необходимости.
  • Данные других игроков читаются после первого вызова entity.players() или entity.by_id(). Кости читаются лишь при явном true, например entity.players(true). Первый вызов может вернуть пустой список: чтение включается со следующего кадра. Если скрипт перестаёт запрашивать данные, дополнительные чтения вскоре прекращаются.
  • Для каждого вызова Lua действует лимит примерно 250 000 инструкций. Превышение считается ошибкой скрипта; лимита памяти сейчас нет.
  • schema.read_* — чтение памяти игры, без записи. Ошибочный адрес возвращает nil. Проверяйте результат перед использованием.
  • При перезагрузке внутренние Lua-переменные и значения собственных UI-контролов скрипта сбрасываются.
  • Основные библиотеки Lua доступны, включая package; отключённые io, os и debug не делают среду безопасной песочницей. Код расширения следует считать доверенным.

Совместимость gamesensical

Доступен отдельный read-only слой: client.set_event_callback, entity.get_prop, renderer.* и ui.new_*. Существующий API events / render продолжает работать. Скрипт с entity.set_prop, FFI, игровыми интерфейсами или изменением usercmd требует переработки: эти возможности отсутствуют. Поддержанные функции, сигнатуры и пример.

require("module") загружает ресурс module.lua из облачной библиотеки. Загрузка нативных библиотек, loadfile, dofile, io и os отключены. Собственные элементы UI сбрасываются после reload; сохранённые позиции layout восстанавливаются из облака.