C# в Dota 2? Да, это реально. Гайд для тех, кому надоел Lua и хочется нормальной типизации
Привет, Пикабу! Сегодня хочу поделиться своим опытом в разработке кастомных игр для Dota 2. Если вы когда-нибудь пробовали писать свои режимы, то знаете, что стандартный путь — это Lua и VScripts. Но что, если я скажу, что можно использовать всю мощь C#, сохраняя при этом совместимость с движком игры?
Да, это про «костыли», но очень изящные. Мы будем использовать проект CSharp.lua, который превращает ваш C# код в читаемый Lua, работающий внутри «песочницы» Доты.
Зачем это нужно?
Lua — это круто для быстрых набросков, но когда проект разрастается, начинаются проблемы:
Отсутствие строгой типизации (ошибки в именах переменных вылетают только в рантайме).
Скудный инструментарий для работы с коллекциями.
Никакого LINQ, нормальных интерфейсов и современных фишек языка.
C# дает нам Roslyn, типизацию и возможность писать чистый, поддерживаемый код.
1. Как это работает?
Магия строится на двух столпах:
CSharp.lua — компилятор, который не просто переводит синтаксис, но и тянет за собой CoreSystem.lua (эмуляция .NET типов: List, Dictionary, Delegates и т.д.).
VScript API — родной API Доты, к которому мы будем обращаться через extern методы.
Важный нюанс: Дота использует обрезанный Lua 5.1. У нас нет доступа к файловой системе (io), библиотеке debug и многим функциям os. Поэтому придется немного «подшаманить».
2. Готовим окружение
Нам понадобятся:
.NET SDK 7.0+.
Сам компилятор CSharp.lua.
Dota 2 Workshop Tools.
Структура проекта обычно выглядит так: в папке src пишем на C#, а в output получаем готовый out.lua, который закидываем в папку аддона.
3. Патчим CoreSystem (Борьба с песочницей)
Так как Valve ограничили os.time и os.clock, стандартный DateTime в C# может «уронить» ваш аддон. Нужно залезть в файлы библиотеки CoreSystem.lua и обернуть вызовы в проверки.
И самое важное: в Core.lua нужно закомментировать assert, который запрещает переопределение классов. В Доте это нужно для работы script_reload (горячая перезагрузка кода без перезапуска игры).
4. Пишем код: Точка входа
Чтобы Дота поняла, что наш код существует, создаем EntryPoint.cs. Здесь мы связываем методы C# с глобальными функциями Lua.
5. Как работать с API Доты?
Чтобы не писать обертки на каждый чих, используем шаблоны. Это позволяет вызывать любые методы VScript API напрямую.
6. Компиляция и запуск
Я использую простой .bat файл для сборки:
CSharp.Lua.Launcher.dll -s src -d output -c -p -include CoreSystem.lua copy /Y "output\out.lua" "C:\...\dota_addons\my_addon\scripts\vscripts\out.lua"
-c: Совместимость с Lua 5.1.
-p: Отключает debug.setmetatable (в Доте он запрещен).
-include: Собирает всё в один файл out.lua.
В самой игре в консоли пишем script_reload — и вуаля, ваша логика на C# работает!
Итог
Да, порог входа чуть выше, чем у обычного Lua-скриптинга. Но для сложных проектов с кучей кастомных механик, способностей и систем — это спасение. Вы получаете автодополнение, поиск ссылок, рефакторинг и нормальную структуру кода.
Если есть вопросы по настройке или конкретным багам — пишите в комментариях, постараюсь помочь. Удачи в модострое!