Скрипты в Dota 2 бывают двух разных типов, и из‑за этого у новичков обычно всё “не складывается”. В одном случае это простые файлы настроек для консоли (обычно формат .cfg), где вы биндите действия на клавиши. В другом - программирование логики для кастомных игр через Lua (это уже полноценный разработческий подход).

Дальше разберу оба пути: что именно вы делаете, куда это кладёте, как запускаете и как не упереться в типичные ошибки.

Что обычно называют “скриптом” в Dota 2

Что ищут в запросах Как это выглядит Где применяется В чём суть
Скрипт для героя через горячие клавиши Файл .cfg с командами bind, которые меняют поведение клавиш Игровая папка Dota 2 (cfg) + консоль Автоматизировать последовательности действий под одну кнопку
Скрипт в кастомной игре (аддон) Lua-код в папке аддона vscripts внутри кастомного аддона Программировать логику: события, обработчики, команды UI

Важно: в сети часто встречаются “скрипты” для читерства и автоматических преимуществ. Я ниже описываю легитимные способы: консольные cfg для биндов и разработку аддона на Lua. Это помогает учиться и не ломать игру правилами.

Путь 1: cfg-скрипты (бинды в консоли)

Как понять, что вы сможете сделать

Если вы хотите, чтобы по нажатию одной клавиши происходила последовательность команд (например, несколько умений или предметов), то вам ближе формат .cfg.

По сути это “настройка клавиш”, а не “магия”: Dota просто исполняет команды, которые вы прописали.

Где лежат cfg-файлы

Файлы .cfg кладут в папку cfg в директории Dota 2. Практический ориентир такой:

Шаг Что сделать
1 Откройте Steam -> Библиотека
2 ПКМ по Dota 2 -> Свойства
3 Локальные файлы -> Посмотреть локальные файлы
4 В папке с игрой найдите каталог game/cfg (часто путь заканчивается на dota/cfg)
5 Сохраняйте ваши .cfg именно туда

Как устроен cfg (самое важное)

Обычно ключевой кусок выглядит так:

bind "1" "some_command"
  • первая часть - клавиша, на которую вы “повесили” действие
  • вторая часть - команда(ы), которые исполняются

В описаниях по героям часто встречается логика вида “одним биндом включить набор действий подряд”.

Как запускать cfg в матче

Один из популярных форматов запуска - через консоль командой exec.

Что вводить в консоли Пример
exec ИмяФайла.cfg без кавычек exec invoker.cfg

То есть, если ваш файл называется my_hero.cfg, в консоли будет exec my_hero.cfg.

Мини-шпаргалка: как не сломать управление

Один из самых частых барьеров - конфликт биндов. Логика простая: если вы назначили клавишу под скрипт, на этой же клавише не должно висеть другое назначение.

Что проверить заранее:
- какие клавиши уже заняты в настройках
- не назначили ли вы их же внутри вашего .cfg через bind

Плюсы и минусы cfg-скриптов

Плюсы Минусы
Быстрый старт: вы можете учиться на готовых командах и постепенно собирать свои файлы Легко получить конфликты биндов и “потерять” управление
Наглядно: текст файла понятен, можно править вручную Некоторые команды могут срабатывать не так, как вы ожидали, если игре “не хватает времени” на обработку набора действий
Подходит для персональных сценариев “на одну кнопку” Нередко такие скрипты требуют отдельной активации, и это вы будете делать каждый раз

Путь 2: Lua-скрипты в кастомных играх (аддоны)

Если вас интересует именно “как делать скрипты” в смысле разработки, то дальше начинается Lua.

Это уже не про бинды, а про то, как движок Dota вызывает ваши функции: события, think, обработчики и команды из UI.

Структура проекта аддона (куда писать)

В аддоне есть папки и файлы, которые движок запускает в определённой последовательности. В типичном подходе:

Файл Когда выполняется Зачем
addon_init.lua первым Подключение модулей, подготовка
addon_game_mode.lua после addon_init.lua Инициализация игрового режима
ваши Lua файлы (ядро) подключаете через require Вся логика кастомки

Обычно рабочее место для Lua логики - внутри scripts/vscripts вашего аддона.

Базовая схема запуска

Классический паттерн такой:
- в addon_init.lua подключаете нужные модули через require
- в addon_game_mode.lua создаёте объект игрового режима и вызываете InitGameMode()

Пример того, как создают игровой режим:

local gameMode = CustomGameMode:new()
gameMode:InitGameMode()

События: когда что-то произошло

События - это “сигналы” от движка. Вы говорите: “если случилось событие X, вызови мою функцию”.

Пример подключения слушателя:

ListenToGameEvent( "dota_player_gained_level", Dynamic_Wrap( CustomGameMode, "OnLevelUp" ), self )

А обработчик, например, может выглядеть так:
- получает параметры в keys
- берёт нужные значения (например, PlayerID)
- делает действие

think-функция: регулярная логика

Если вам нужно, чтобы код выполнялся регулярно (например, каждые 0.25 секунды), используют Think/таймерную логику через SetThink.

Идея такая:
- вы один раз задаёте “мыслителю” имя функции и интервал
- дальше движок сам вызывает её

Команды из консоли или UI

Команда - это действие, которое запускаете вы (или UI), а движок передаёт параметр вашей функции.

Пример регистрации:

Convars:RegisterCommand( "GiveAbilityPoints", function(name, parameter)
    local cmdPlayer = Convars:GetCommandClient()
    if cmdPlayer then
        return self:GivePlayerAbilityPoints( cmdPlayer, parameter )
    end
end, "Gives a player some ability points", 0 )

А затем в обработчике вы делаете нужное (например, выдаёте очки).

Где брать “предметы/сущности” для кода

В разработке модов часто встречается проблема: вы знаете, какие данные вам нужны, но не знаете как получить их из инвентаря/юнита.

Для этого используют функции получения предметов по имени из инвентаря/слотов - пример подхода:
- проверить, что предмет вообще есть
- пройти слоты
- вернуть найденное

Это полезно, потому что в аддонах вы обычно работаете данными по ID/именам, а не “красивыми названиями из интерфейса”.

Как учиться, если вы начинаете “с нуля”

Шаг 1: выберите формат “скрипта”

Ваш запрос по ощущениям Что делать дальше
“Хочу, чтобы по одной кнопке нажимались умения” Начинайте с .cfg и консольного exec
“Хочу писать логику игры, аддоны, события” Начинайте с Lua: addon_init.lua, addon_game_mode.lua, события и обработчики

Шаг 2: тренируйтесь на маленьких примерах

  • в cfg - одна клавиша, один сценарий (минимум команд)
  • в Lua - одна обработка события (например, “при апе уровня выдать золото”)

Шаг 3: фиксируйте, что именно не работает

Не “скрипт не работает”, а:
- не вызывается exec
- конфликт биндов
- обработчик не зарегистрирован
- функция не получает нужные параметры

Большая часть ошибок на старте - не “проблема Lua”, а “не та папка / не тот запуск / не подключили модуль”.

Про правила, блокировки и “серые” варианты

Скрипты и доп. ПО в Dota 2 исторически упоминаются рядом, и в сети много материалов, которые уходят в читерство. Это обычно заканчивается жалобами, банами и другими последствиями.

Поэтому безопасная траектория для обучения выглядит так:
- cfg - только как бинды под ваши действия
- Lua - только в рамках кастомной разработки (аддоны, логика модов)

И да, если вы увидели где-то готовые “геройские” cfg, их стоит рассматривать как учебные примеры к синтаксису bind/exec, а не как готовое решение “просто вставил и выиграл”.

Источники

  • Valve Developer Community: Dota 2 Workshop Tools - Scripting - Getting Started: https://developer.valvesoftware.com/wiki/Ru/Dota_2_Workshop_Tools/Scripting/Getting_Started
  • CQ.ru: “Скрипты в Dota 2: плюсы и минусы” (о командах, .cfg, bind и exec): https://cq.ru/articles/dota-2/skripty-v-dota-2-pliusy-i-minusy
  • CustomGames.ru: “Скриптинг Dota 2 — руководство для начинающих” (организация Lua в аддонах, события/команды): https://customgames.ru/forum/threads/%D0%A1%D0%9A%D1%80%D0%B8%D0%BF%D1%82%D0%B8%D0%BD%D0%B3-dota-2-%E2%80%94-%D1%80%D1%83%D0%BA%D0%BE%D0%B2%D0%BE%D0%B4%D1%81%D1%82%D0%B2%D0%BE-%D0%B4%D0%BB%D1%8F-%D0%BD%D0%B0%D1%87%D0%B8%D0%BD%D0%B0%D1%8E%D1%89%D0%B8%D1%85.1684/

Если хотите именно результат “как делать скрипты в дота 2”, то короткий вывод такой: начните с .cfg и exec, если вам нужен быстрый биндинг, или идите в Lua-аддоны, если вам нужна настоящая разработка. Оба подхода дают рост, просто в разных направлениях.