Как сделать скрипт для доты

Обновлено: 05.07.2024

Все скрипты для аддонов, создаваемых с помощью Dota 2 Workshop Tools пишутся на скриптовом языке Lua. Если вы знакомы с написанием скрипт кодов на каком-либо другом языке, то основные понятия в Lua будут даваться вам очень быстро.

Совет: Вы можете перезапустить файлы сценариев во время выполнения с помощью консольной команды script_reload .

Требуемые файлы

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

Этот файл является обязательным и может иметь только такое имя. Также вы можете создать дополнительные файлы в /vscripts , и ссылаться на них при выполнении кода. Это позволить существенно упростить разработку аддона.

Совет: При создании аддона очень простой скрипт файл будет помещен в аддон в соответствующем месте, вы можете использовать его в качестве отправной точки для новых аддонов

Подгрузка скрипт файлов

Скрипт файл addon_game_mode.lua будет загружен сразу же при запуске аддона. Дополнительные скрипт файлы могут быть загружены, если в файл addon_game_mode.lua включить следующие команды

Обязательные Функции

Есть зарезервированные функции, их наличие для правильной работы аддона обязательно.

Precache

Функция Precache загрузит все ресурсы необходимые в игре. Приведенный ниже пример включает в себя три типа ресурсов. Файл системы частиц, папка системы частиц, которая загрузит все файлы частиц внутрь себя и отдельный предмет "item_bag_of_gold" (пример).

Activate

Функция Activate существует для того, чтобы в первый раз настроить игровой режим. Эта функция выполняется во время загрузки файла и обычно используется для настройки используемых классов определенного игрового режима.

В этой прекрасной игре на многих героях в некоторых типичных ситуациях требуется прожимать несколько скиллов и пару-тройку артефактов. Чтобы сделать это вручную, нужно долго тренироваться, быстро соображать и иметь отменную реакцию. Однако все мы люди и очень много ошибаемся, даже топовые игроки, истинные профессионалы киберспорта часто ошибаются, забывают прожимать некоторые кнопки, хотя их навык доведен до автоматизма. Чтобы этого не было, существуют скрипты. Скрипты для Дота 2 – это список команд, которые выполняются по нажатию одной кнопки.

Следует сказать, что в этой игре каждая предустановленная кнопка отвечает за свою команду. А скрипт делает так, чтобы выполнялось сразу несколько предустановленных команд. Например, можно сделать так, чтобы по нажатию одной кнопки нажималось пару скиллов и несколько артефактов.

Установка скриптов: что следует знать?

Скрипты в Дота 2

Скрипты в Дота 2 - 2

Какие бывают скрипты в Дота 2?

Как правило, скрипты для Дота 2 нужны на не многих героев. Например, самый требовательный герой – Мипо, он требует тонкого контроля и чтобы ним управляться, можно использовать заранее заготовленные списки команд. Они помогут телепортировать всех Мипо к одному или, например, они могут прыгнуть на одном месте. Для любого из этих действий требуется лишь одна кнопка, а теперь представим сколько нужно нажать кнопок, чтобы сделать это без скриптов, нужно прожать по три кнопки на каждого из пяти клонов. Сначала нажать прыжок, потом кнопку мыши, в какое место нужно прыгнуть, потом переключиться на другого и повторить еще раз. В итоге мы получаем 15 нажатий, даже при молниеносной реакции, выработанной годами, это займет больше времени, чем нажать одну кнопку.

Такие скрипты могут быть на любого героя, в частности в интернете очень популярны скрипты на Инвокера, Тинкера, Мипо и других героев, которым требуется прожимать несколько способностей и предметов одновременно.

Недостатки скриптов

Во-первых, их нужно активировать в консоли каждый раз, когда вы заходите, все-таки до автоматизма не доведен этот элемент управления. Еще один минус – скиллы используются слишком быстро, иногда игра не успевает воспроизвести все команды. А также порой бывает, что скилл, который требуется использовать первым, требует некоторой анимации, а тот, что нужен вторым, применяет мгновенно. Яркий пример выглядит так: используется Эзериал Блейд и Дагон. Эзериал применяется не сразу, снаряд должен прилететь в цель, а Дагон используется мгновенно. Таким образом жертва получает заряд Дагона, не усиленный Эзериалом.


В декабре 2018 года создатели AI Sports провели презентацию и представили DotA2 AI Competition в школу. DotA (Защита Древних) - игра, в которую играют две команды, каждая из которых состоит из пяти игроков, которые могут выбирать из более чем ста различных героев. Цель игры - уничтожить базу противников, одновременно защищая свою. Каждый герой имеет доступ как минимум к четырем уникальным способностям и может покупать предметы, которые также имеют разные способности. Предметы покупаются за золото, полученное за уничтожение структур противника или за победу над игроками или крипами, за неигровыми персонажами, которые появляются, чтобы помочь защитить и атаковать базы.


Изучение Lua и API

Чтобы создать бота, мы сначала прочитали API и искали другие примеры, созданные пользователями. DotA API был доступен в начале 2016 года, хотя не получал каких-либо значимых обновлений примерно с октября 2017 года. Первым использованным нами ресурсом было руководство по началу работы, написанноеRuoyuSon, RuoyuSon объяснил, где найти другие ресурсы и как запустить игры, а также полезные консольные команды для процесса тестирования. Valve также предоставляет небольшие примеры скриптов ботов в каталоге игр, которые можно использовать для начала работы. С помощью API и других примеров мы наивно полагали, что сможем создать бота и получить сырую, рабочую версию кода в течение недели.

Первая проблема заключалась в выборе героев, которых мы хотели использовать, и запуске игры. В то время мы не знали, что если в коде для выбора героя будет ошибка, вся игра вылетит, ничего не отобразив. Пример, предоставленный Valve, может быть использован для быстрого создания кода выбора героя для режима All Pick Mode, но его нельзя использовать для режима Captain's Mode. Чтобы выбрать героев, мы читаем другие примеры кода. Хотя наша текущая итерация бота позволяет игрокам-людям играть против и рядом с ней, оригинальная версия предназначалась только для игры против другого бота в режиме капитана. Наконец, получение простой версии работы по отбору героев заняло чуть больше недели, но с тех пор было изменено для поддержки All Pick Mode и игроков-людей.

После запуска игры мы начали экспериментировать с тем, чтобы герои шли по локациям на карте. Мы быстро научились, не зная языка Lua, затруднили написание и понимание других примеров кода. Хотя мы могли заставлять ботов ходить в определенные места или покупать предметы, мы часто допускали синтаксические ошибки, и поиск ошибок в коде занимал значительное время. Через две недели мы потратили много времени на изучение языка, прежде чем снова заняться API.

Пока приближался турнир, мы все еще выясняли Lua и боролись за понимание API. Наши герои перемещались в правильные места, и они могли сражаться с вражескими миньонами и противниками, хотя и плохо, но они никогда не отступали, что приводило к смерти после смерти. Даже несмотря на простейшую сложность бота по умолчанию, Passive, мы не смогли победить Мы реализовали грубую функцию отступления - просто приказывая ботам вернуться на свою базу, если они получили слишком много урона, - это помогло, но оставило желать лучшего. Мы смогли последовательно выиграть у пассивного бота, но обычно заканчивали игру с почти 100 смертельными случаями за игру на нашей стороне, и нам повезло увидеть две смерти противников.

Следующим шагом, теперь, когда была заложена основа для поведения ботов, было начать индивидуализировать каждого бота, чтобы они могли использовать свои способности. Каждый бот использует свои навыки в зависимости от условий, что позволяет им сражаться с врагом. В этот момент наш недостаток опыта в DotA начал проявляться - хотя боты могли использовать навыки, они не использовали их оптимально просто потому, что мы не знали, что было оптимальным. Мы часто просили людей с большим опытом за советы и постепенно укрепляли бот. Наконец, мы смогли победить пассивного бота с положительным счетом. Мы пытались преодолеть легкую сложность, но боролись. Разница между ними была значительной, и нам нужно было реализовать больше поведения, чтобы победить.

Государственный аппарат

До этого момента весь код был написан как предопределенные действия, которые должен выполнять каждый бот. Сложность DotA постепенно усложняла разделение того, что нужно делать и когда. Должны ли мы бороться в этом случае или убежать? Когда мы должны сосредоточиться на ударах крипов? Несмотря на то, что мы смогли последовательно преодолеть сложность Passive, мы поняли, что Easy будет серьезным препятствием. Мы начали обсуждать возможные варианты и приземлились на State Machine.


При изменении поведения бота стало невозможно четко разделить, когда он будет выполнять действия. Они были настолько тесно переплетены, что корректировка одного из них повлияла бы на производительность другого, и ни одно из поведений не работало особенно хорошо. Мы также не смогли аккуратно включить больше поведений, не нарушая другие части кода. Создав конечный автомат, мы смогли отделить каждое поведение, используя взвешенные средние значения, чтобы решить, какое из них будет наиболее оптимальным в любом случае игры. Код для каждого бота запускается каждый кадр, что позволяет проводить постоянные вычисления и присваивать каждому поведению значение в виде веса. Предполагая, что мы хорошо запрограммировали бота, теперь он может сам решить, что ему делать, исходя из состояния игры.

В этот момент мы смогли разделить каждое поведение на отдельный код, разбитый на компоненты и условия. Компоненты - это фрагменты информации, которые всегда необходимы для расчета поведения, в то время как условия будут прибавлять или вычитать вес только при определенных обстоятельствах. Разделение кода позволило нам заставить каждое поведение работать лучше - раньше каждое поведение зависело от другого, но с помощью конечного автомата мы выполняли только те части кода, которые нам были нужны, и только тогда, когда это было необходимо.

В то время как некоторые из нас настраивали State Machine, мы также продолжали улучшать версию без State State, до такой степени, что мы смогли преодолеть сложность Easy. Мы снова увидели 100 смертей на табло, но получили бы больше убийств на нашей стороне и выиграли бы. Код из версии без State Machine легко вставляется в наш новый бот, что позволяет нам продолжать работу без каких-либо существенных задержек.

Одним из преимуществ State Machine была модульность системы. До этого общее поведение бота состояло из двух файлов, в которых были написаны необходимые комментарии, чтобы понять, какая часть кода просматривалась - в новой версии были отдельные файлы для каждого веса, а поведения были разделены, чтобы они не взаимодействовали друг с другом. Модульность позволила нескольким людям работать над разными частями проекта, не влияя на то, над чем может работать кто-то еще, улучшая ясность, простоту и рабочий процесс команды.

Во время тестирования на собственных ботах Valve нам часто приходилось перезагружать игры из-за проблем совместимости с их ботом и режимом капитана. Мы решили создать собственный режим комплектации для двух команд, чтобы ускорить процесс и сократить ненужные перезапуски. Мы дали ботам оппонента случайную команду из пяти человек и использовали эту команду для большей части нашего тестирования. В то время мы не знали, что это вернется, чтобы укусить нас позже.

Наша команда продолжала работать с конечным автоматом, добавив больше поведений, которые мы не могли реализовать ранее. По мере того, как поведение улучшалось, мы также начали видеть улучшения в наших матчах с ботом Valve. После победы над Easy в течение 24 часов мы смогли победить Medium, а на следующий день мы победили Hard и Unfair спиной к спине. Мы были в восторге, не ожидая побить Недобросовестных намного позже, но, поскольку мы решили наблюдать за ботами противника, наши челюсти упали. Два бота нашего оппонента не покупали предметы, а один не использовал никаких способностей. Несмотря на то, что мы смогли победить, но это был подвиг сам по себе, но это была не настоящая победа против недобросовестного бота.

Чего мы не знали, так это того, что Valve реализовали использование определенных навыков и покупку предметов только для 46 ботов. Мы поменяли состав противника на пять из этих ботов, и хотя мы могли хорошо бороться с Хардом и выигрывать примерно сорок процентов времени, мы редко выигрывали у Недобросовестных. Мы начали больше обсуждать, что мы можем сделать, чтобы увеличить наш выигрыш, что привело к нашей первой смене состава. Посмотрев на героев, которых мы реализовали, в то время только пять, мы решили выбрать героев, которые, как мы надеемся, лучше соответствовали бы нашему общему плану игры. Сразу же мы увидели рост, и, хотя мы стали привязываться к героям, которых мы выбрали, мы стали рассматривать обмен героями как вариант, поскольку мы продолжали программировать.

Сбор данных

Мы продолжили внедрять больше поведения в State Machine, добавили больше функций и, как мы это сделали, увидели медленный, но неуклонный рост производительности в наших матчах. Чтобы увидеть, насколько хорошо мы справились, добавив что-то новое, нам пришлось смотреть полную игру, чтобы наблюдать за конкретным поведением и посмотреть, выиграли ли мы матч или нет. Все веса бота были настроены вручную, и любые изменения, которые мы сделали, могут быть не видны в одной игре. Даже ускорение игры займет от десяти до пятнадцати минут. Чтобы собрать какие-либо значимые данные, мы могли бы тратить часы на просмотр. Чтобы ускорить этот процесс и убедиться, что любое добавленное нами изменение было значимым, используя Python, язык программирования Go и Docker, мы начали создавать способ сбора данных для сотен игр.

Каждая игра может длиться от пятнадцати до восьмидесяти минут. Docker Swarm распределял общее количество запрошенных игр равномерно на все наши рабочие компьютеры. Если бы у нас было менее 56 игр, это решение было бы хорошо, но все остальное было бы неоптимальным. Сначала мы пытались выполнить развертывание с использованием Docker Swarm, но для нас было больше смысла создавать собственное решение. Он должен быть настраиваемым, хорошо работать в распределенной сети и поддерживать простой параллелизм. Мы решили использовать Go, потому что он отвечал нашим критериям и был прост в сборке и развертывании. Наконец, Python был использован для отображения и иллюстрации результатов наших данных в виде гистограмм и линейных графиков.


Используя эту настройку, мы смогли запустить 500 игр за час, что дает нам значимые данные. Хотя нам по-прежнему необходимо было наблюдать за играми, чтобы наблюдать и подтверждать правильное поведение, теперь мы можем проверить их и собрать данные, чтобы подтвердить, было ли изменение полезным или вредным для бота.

Когда мы шли в последние недели, мы играли с идеей включения генетического алгоритма. Веса конечного автомата были настроены вручную и основаны на наших наблюдениях. В частности, вес фермы, охоты и ретрита был так тесно связан, что, изменяя значения единицы, мы увидели бы драматические различия в том, как они играли, и их выигрыш в целом уменьшился бы. Мы знали, что они были в хорошей точке, но были уверены, что они не были оптимальными, особенно учитывая, что разные персонажи играли по-разному, и использование одинаковых весов заставляло их играть более или менее одинаково Использование генетического алгоритма использовало бы машинное обучение для настройки каждого веса, давая нам наиболее идеальные числа для победы над ботами по умолчанию и, надеюсь, наших противников в турнире. Амбициозная цель состояла в том, чтобы создать разные гены для каждого персонажа, тем самым придав им каждому свой уникальный стиль игры, но мы знали, что без большего количества времени и вычислительных мощностей нам придется обойтись вручную настроенными весами.

За неделю до соревнований мы отошли от добавления основных функций, только небольшие изменения, которые, как доказали наши данные, повысят вероятность выигрыша. В итоге с помощью State Machine мы смогли добиться стабильного выигрыша выше 98% против ботов Valve. Готовясь к конкурсу, Морис связался с нами, сообщив, что конкурс снова продлен еще на месяц.

Генетический алгоритм

С продлением турнира на месяц, мы начали обсуждать, как мы можем создать генетический алгоритм. В конце концов, мы решили использовать Go еще раз, потому что в нем уже были написаны наши программы сбора данных, что облегчает их связывание.


Нашим первым шагом было убедиться, что мы можем запустить генетический алгоритм, используя Go и Docker, и одновременно изменить скрипт Lua. Ген каждого бота представлял собой файл Lua, содержащий значения, которые мы хотели изменить, используя генетический алгоритм. Мы использовали Go для чтения файла гена, мутировали значения и выводили новый ген, используя шаблон гена. Новые гены были затем использованы для последующих итераций.

Успешно создав способ чтения и записи в наши новые файлы генов, вместо создания одного общего генетического алгоритма, как мы изначально планировали, мы создали гены для каждого героя, которого мы использовали. Чтобы это работало, каждый файл должен содержать имя героя, которому мы пишем. К сожалению, мы могли тренировать только пять героев одновременно, поэтому мы решили обучить наш стартовый состав и использовать наши настроенные вручную гены для остальных героев, которых мы реализовали.

Завершение генетического алгоритма заняло больше времени, чем планировалось. Мы надеялись запустить его в течение недели, но нам потребовалось еще несколько дней, чтобы устранить ошибки. Каждый из нас создал отдельные части генетического алгоритма, и на то, чтобы собрать их вместе, потребовалось некоторое время.

Наконец, генетический алгоритм сработал, но когда мы начали запускать первые поколения, мы столкнулись с несколькими проблемами. К этому моменту у нас продолжали возникать некоторые проблемы с нашими контейнерами Docker, на которых не запускались игры, но мы решили пока что игнорировать их, поскольку сбор данных происходил медленнее, но разница не была значительной. Если один компьютер работает со сбоями и отключается от сети, сервер зависает, ожидая поступления данных с неисправного компьютера. Когда мы решили использовать генетический алгоритм, нам нужно, чтобы он работал без перерыва и продолжал работать через каждое поколение. Если работник не отвечает, сервер никогда не сможет перейти к следующему поколению, потому что он ожидает поступления оставшихся игр. Для нас не имело смысла следить за компьютерами в смену весь день, поэтому мы добавили способ тайм-аут, если мы не получили ответ от контейнера после определенного периода времени.

Пока мы наблюдали за ботом, мы знали, что время истекает, и оно не растет достаточно быстро. Хотя это было рискованное решение, которое могло привести к потенциально радикальному снижению коэффициента выигрыша, мы решили скорректировать коэффициент изменения с 10% вероятности мутации и 10% коэффициента мутации до 15% и 25% соответственно. Мы подсчитали, что в самой идеальной ситуации, чтобы избавиться от бесполезного гена, потребуется не менее тридцати поколений или не менее одной недели. Мы хотели уменьшить это число и рассчитывали, что если мы удвоим его, мы увидим более высокие темпы изменений, к лучшему или к худшему. После нескольких дней наблюдения за результатами наш риск окупился, и бот увидел более быстрое и последовательное увеличение коэффициента выигрыша.


После еще одной смены героев мы остановились на нашем последнем списке и продолжили работу генетического алгоритма. За несколько дней до начала турнира мы увидели, что бот наконец достиг 99% побед за одно поколение, но это упало в следующем поколении до 96%. В то время как наши быстрые манипуляции с генами создали мощного бота, как только он приблизился к теоретическому пику, частота мутаций в 25% сразу бы сильно изменилась и упала. Мы решили, что для сохранения нашего выигрыша нам нужно будет замедлить мутацию. Вероятность мутации была снижена до 7%, а частота мутаций была снижена до 15%.

Когда мы снова изменили наш генетический алгоритм, мы решили пойти на другой риск. До этого момента мы брали лучшие пять генов от каждого героя как родители, разводили их и использовали потомство для следующего поколения. Хотя это сработало для нас, классически это было не так, как мы должны были использовать генетический алгоритм. В генетическом алгоритме у всех генов должен быть шанс быть выбранным, но мы активно выбирали, какой использовать. Важность использования ботов с более низким коэффициентом выигрыша - это разнообразие. В то время как в поколении он, возможно, не работал так же хорошо, в будущем поколении его гены могут играть важную роль в увеличении коэффициента выигрыша. Чтобы убедиться, что эти гены с более низкой вероятностью выигрыша были выбраны, мы нанесли на карту все гены, что позволило повысить вероятность выбора более высоких показателей выигрыша, но при этом дать более низким шансам выигрыша шанс, хотя и меньший.

Генетический алгоритм, кажется, улучшил бота, хотя его стиль игры значительно отличается от оригинальной негенетической версии. Если раньше мы были гораздо более агрессивными, то теперь мы играем более консервативно и стремимся побеждать, в основном, разрушая структуры и выигрывая в командных боях. Старший бот чаще объединяется в одну команду, что заставляет ботов противника реагировать и приводит к большему количеству драк Если мы продолжим работу над проектом, я считаю, что следующим шагом будет то, что бот начнет сражаться сам с собой и со старой, не генетической версией бота.

Благодаря этому проекту я смог выучить несколько языков программирования, а также познакомиться с Docker и важностью документации при работе в команде. Причиной, по которой я решил работать над этим проектом, был не столько интерес к DotA2, сколько попытка понять машинное обучение. Я слышал этот термин несколько раз, читал об этом, но у меня не было реального понимания того, что он повлек за собой, и как на самом деле его запрограммировать. Участие в этом проекте дало мне уникальную возможность работать с машинным обучением и расширило мое понимание программирования в целом.

Скрипты на Meepo

Для начала рассмотрим Meepo с точки зрения его плюсов и минусов.

p, blockquote 2,0,1,0,0 -->

  • При игре данным героем против Виверна и Шейкера, велик шанс смерти в одну кнопку. Присутствуют так же герои, против которых сложно играть за Мипо (Лина, Кентавр, Лион и прочие).
  • Meepo не подходит для игры в агрессивном стиле.
  • Мипо очень силен в игре на центральной линии. Это обусловлено быстрым фармом опыта и золота в начале игры.
  • Герой быстро забирает Рошу на 10 уровне с тп и 3 Врейсбендами.
  • При проигрыше мида, в большинстве случаев можно вернуть преимущество с леса.
  • Без особых трудностей возможность забрать любого Кора в игре на центральной линии.

Установка скрипта

Скрипты на Meepo

Ссылка на скачивание скрипта Мипо

Скрипты на Meepo

p, blockquote 6,0,0,1,0 -->

Описание скрипта

Активация скрипта

Для того, чтобы script на meepo в Dota2 начал функционировать, вам необходимо активировать его в игре.

Читайте также: