- Где вообще лежит Dota Lua и что нужно трогать
- Правильная схема: datadriven -> RunScript -> функция в Lua
- Пример: предмет с cleave (как в Dota Workshop делается RunScript)
- Важные моменты, которые чаще всего ломают запуск Lua
- Как находить точки входа: где Dota вызывает Lua
- Debug: как понять, что Lua реально исполняется
- Мини-чеклист перед тем как писать “как использовать lua скрипты для доты”
- Итог
- Источники (по теме Dota Workshop Lua и модификаторов)
Коротко по сути запроса: чтобы в Dota 2 “использовать lua скрипты”, нужно понимать разницу между datadriven (это конфиги способностей/предметов) и Lua (это логика, которую Dota вызывает через RunScript). Если просто засунуть Lua-файл “в процесс” (через инжект), он почти наверняка ничего не изменит, потому что Dota не будет подхватывать твой отдельный Lua-интерпретатор и не предоставит нужные игровые API.
Ниже разложу рабочий путь именно для Dota 2 Workshop/кастомок, где Lua гарантированно выполняется движком.
Где вообще лежит Dota Lua и что нужно трогать
Для кастомок Dota 2 Workshop скрипты обычно находятся в папке аддона (типичная структура такая):
your_addon/scripts/vscripts/- Lua-скрипты (серверная логика кастомки)your_addon/scripts/npc/- datadriven-конфиги (npc_items_custom.txt,npc_abilities_custom.txtи т.п.)
Из этого важнее всего усвоить: Lua в Dota 2 подключается не “сам по себе”, а через записи в datadriven-конфиге, где указывается:
- какой
BaseClassописывает объект (предмет/способность) - и где именно движок должен вызвать Lua:
RunScript { ScriptFile ... Function ... }
Правильная схема: datadriven -> RunScript -> функция в Lua
1) В datadriven-конфиге задаёшь предмет/способность
Например, для предмета настраивается npc_items_custom.txt через ability_datadriven/item_datadriven-подход.
Внутри конфигурации ты указываешь:
- статусы, модификаторы, события
- и самое главное - что делать через Lua
Типовой паттерн выглядит так:
"OnCreated"
{
"RunScript"
{
"ScriptFile" "items/item_bfury.lua"
"Function" "modifier_item_bfury_datadriven_on_created"
}
}
Это ключ к вопросу “как использовать lua скрипты для доты”: строка RunScript + ScriptFile + Function и есть механизм подключения Lua к игровому событию.
2) Lua-файл должен лежать в нужной папке
Если в конфиге указано ScriptFile "items/item_bfury.lua", то файл должен реально существовать в структуре аддона, обычно относительно scripts/vscripts/:
scripts/vscripts/items/item_bfury.lua
3) В Lua должны быть функции с нужными именами
Если конфиг зовёт:
Function "modifier_item_bfury_datadriven_on_created"
то в Lua должен быть:
function modifier_item_bfury_datadriven_on_created(keys)
-- код
end
Dota передаст параметр keys (с кастером, абилкой, модификатором и т.д. - зависит от места вызова).
Пример: предмет с cleave (как в Dota Workshop делается RunScript)
Ниже разберём логику, которая встречается в популярных уроках по “item datadriven + Lua”.
Datadriven часть (фрагменты)
Обычно у предмета:
- есть Modifiers (например, базовый модификатор с пассивными статами)
- и есть отдельный модификатор для “сплэша” (cleave), который срабатывает по атаке
События типа OnCreated, OnDestroy, OnIntervalThink могут запускать Lua:
"OnCreated"
{
"RunScript"
{
"ScriptFile" "items/item_bfury.lua"
"Function" "modifier_item_bfury_datadriven_on_created"
}
}
И отдельно:
"OnIntervalThink"
{
"RunScript"
{
"ScriptFile" "items/item_bfury.lua"
"Function" "modifier_item_bfury_datadriven_on_interval_think"
}
}
Lua часть (ключевой смысл)
В Lua ты проверяешь состояние юнита и динамически добавляешь/убираешь модификатор cleave.
Например, в уроках это выглядит логикой:
- при создании модификатора: если юнит ближник - добавить cleave-модификатор
- при удалении: если юнит ближник - убрать cleave-модификатор
- каждые 0.03 секунды: если тип атаки изменился - корректировать модификаторы
Концептуально:
function modifier_item_bfury_datadriven_on_created(keys)
if not keys.caster:IsRangedAttacker() then
keys.ability:ApplyDataDrivenModifier(
keys.caster, keys.caster,
"modifier_item_bfury_datadriven_cleave",
{ duration = -1 }
)
end
end
function modifier_item_bfury_datadriven_on_destroy(keys)
if not keys.caster:IsRangedAttacker() then
keys.caster:RemoveModifierByName("modifier_item_bfury_datadriven_cleave")
end
end
function modifier_item_bfury_datadriven_on_interval_think(keys)
if not keys.caster:IsRangedAttacker()
and not keys.caster:HasModifier("modifier_item_bfury_datadriven_cleave") then
-- (опционально) можно проверить, что предмет реально есть в инвентаре
for i = 0, 5, 1 do
local current_item = keys.caster:GetItemInSlot(i)
if current_item and current_item:GetName() == "item_bfury_datadriven" then
keys.ability:ApplyDataDrivenModifier(
keys.caster, keys.caster,
"modifier_item_bfury_datadriven_cleave",
{ duration = -1 }
)
end
end
end
end
function modifier_item_bfury_datadriven_cleave_on_interval_think(keys)
if keys.caster:IsRangedAttacker() then
while keys.caster:HasModifier("modifier_item_bfury_datadriven_cleave") do
keys.caster:RemoveModifierByName("modifier_item_bfury_datadriven_cleave")
end
end
end
Именно так “lua скрипты для доты как использовать” превращаются в работающую механику: Dota вызывает твои функции, а ты через ApplyDataDrivenModifier/RemoveModifierByName меняешь геймплей.
Важные моменты, которые чаще всего ломают запуск Lua
Lua для Dota выполняется не “как твоя DLL-VM”, а внутри движка
Типичная ошибка из “инжектов”: человек создаёт свой lua_State в C++ и пытается дернуть Entities:GetLocalPlayer() внутри этой собственной Lua-машины.
В итоге:
- у твоей Lua-машины нет доступа к API Dota (Entities, hero, ability и т.д.)
- потому что это не функции Lua, а объекты/интерфейсы внутри дотавской среды
- “подключить include lua” одной строчкой нельзя - должно быть подключение именно через механизм Dota (например RunScript в datadriven или серверная инициализация кастомки)
Работает не “инжект и запусти строку Lua”, а “конфиг и движок вызывают нужную Lua-функцию”.
Lua в кастомках обычно серверный
Практическое следствие: логика предметов/абилок чаще крутится на сервере (кастеры/модификаторы/урон). Клиентский UI можно рисовать отдельно, но это уже другая история (и обычно через отдельный контур/скрипты).
Пути должны совпадать
Если в datadriven указан ScriptFile "items/item_bfury.lua", а файла по факту в vscripts/items/item_bfury.lua нет - вызов не состоится.
Как находить точки входа: где Dota вызывает Lua
Обычно Lua стартует из datadriven через:
OnCreated- срабатывает при появлении модификатора/эффектаOnDestroy- при удаленииOnIntervalThink- периодические проверки (таймером)- и другие события/хендлеры, которые поддерживает конкретный
BaseClass
Если нужно “повеситься” на изменение состояния (например ближник/дальник) - твой выбор обычно OnIntervalThink + проверка в Lua.
Debug: как понять, что Lua реально исполняется
В Dota Workshop чаще всего удобно:
- убедиться, что скрипт грузится (файл/путь/имя функции совпадают)
- логировать из Lua в консоль/лог сервера (в зависимости от среды)
- проверить, что событие реально наступает (например предмет подобран, модификатор создан)
Для этого обычно используют print(...) в Lua и смотрят логи сервера.
Мини-чеклист перед тем как писать “как использовать lua скрипты для доты”
| Что проверить | Должно быть верным |
|---|---|
| Файл Lua существует | в нужном месте scripts/vscripts/... |
Путь в ScriptFile совпадает |
например items/item_bfury.lua |
| Название функции совпадает | Function "..." = реально объявленная function ... |
| Lua вызывается из datadriven | есть RunScript в нужном событии |
| Используемые API доступны | только то, что существует в среде Dota Lua |
| Код реально запускается по событию | OnCreated/OnDestroy/OnIntervalThink соответствует ожиданию |
Итог
Чтобы “lua скрипты для доты как использовать” на практике:
- не инжектируй и не создавай свою Lua-машину “в стороне”
- опирайся на datadriven и точку подключения RunScript
- положи Lua в scripts/vscripts/
- объяви функции с именами, которые указаны в конфиге
- Dota сама вызовет их в нужные моменты (подбор предмета, создание модификатора, интервальные проверки)
Источники (по теме Dota Workshop Lua и модификаторов)
- Valve Developer Wiki: Dota 2 Workshop Tools / Lua Abilities and Modifiers
https://developer.valvesoftware.com/wiki/Ru/Dota_2_Workshop_Tools/Lua_Abilities_and_Modifiers - Valve Developer Wiki: Debugging Lua scripts
https://developer.valvesoftware.com/wiki/Ru/Dota_2_Workshop_Tools/Scripting/Debugging_Lua_scripts