Lua в destahook
Скрипты позволяют добавить собственный оверлей, элементы меню и логику на Lua 5.4. Вкладка Lua отвечает за загрузку файлов и элементы их меню; кнопка Open Blueprint Editor открывает визуальный граф в отдельном окне, которое можно перемещать и растягивать.
Скрипты выполняются на вашем компьютере. Запускайте только код, которому доверяете. Это API расширения, а не изолированная песочница для чужого кода.
Первый запуск
- Запустите CS2 Dev из лоудера и откройте вкладку Lua.
- В облачной библиотеке введите имя, например
hello.lua, и нажмите New Lua. Выберите ресурс, нажмите Edit source, вставьте код и сохраните Save. - Нажмите Refresh, если ресурс ещё не появился в менеджере, затем включите чекбокс скрипта. Autoload сохраняет автоматическую загрузку в облаке.
- После изменения исходника облачная библиотека передаёт новую ревизию. 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 восстанавливаются из облака.