Вступление.
Всем курлык. В этом гайде постараюсь подробно рассказать, как использовать файлы из репозитория barebones, отлавливать действия через него и как узнавать, когда и какой приказ отдает игрок своему герою.
Содержание
[list type=decimal]
[li]Barebones и с чем его едят.[/li]
[li]Отлов приказов.[/li]
[li]Примеры.[/li]
[/list]
2. Отлов приказов.
В голову часто приходят идеи отличных скиллов для своих героев, но задавая вопросом "а как это реализовать ?" желание иногда пропадает. Узнав о том, как отлавливать приказы, такая ситуация с вами происходить будет реже.
Какие бывают типы приказов ?
Что же нужно для того, чтобы начать отлавливать приказы, которые игрок отдает своему герою ? Для этого в функции Gamemode:InitGameMode() добавить следующую строку:
Теперь, обращаясь к GameMode, мы можем узнать, кто и какой приказ отдает, и разрешить его герою выполнять данный приказ, или наоборот - запретить. Для начала создадим функцию и выведем filterTable в консоль.
Что же можно теперь получить из filterTable:
Достать эти строки из filterTable отдельно можно так:
3. Примеры
3.1 Давайте создадим код, который будет позволять Невермору передавать итемы только траксе.
На этом пока всё. Гайд постараюсь дополнить еще примерами, но позже.
Советы:
• Советую для ознакомления два открытых на гитхабе популярных проекта:
Warchasers: https://github.com/MNoya/Warchasers
Жизнь на Арене: https://github.com/ZLOY5/LiA
Скачайте их, распакуйте и установите программу Far 3. И когда становится тяжело понять, как описать ту или иную команду или функцию - заходите через Far в корень скачанных проектов, жмите alt + F7. В первом поле вводите "*.*", во втором - то, что нужно найти, например "OnAttacked".
• На ГитХабе в поиске так же всегда можно поискать интересующие команды и функции. Также для поиска и вообще "почитать" советую https://moddota.com
• На сайте https://moddota.com создатель Warchasers - Noya, оформляет качественные гайды, несколько из них:
http://moddota.com/forums/discussion/14/datadriven-ability-breakdown-documentation
https://moddota.com/forums/discussion/4/datadriven-items
http://moddota.com/forums/discussion/93/point-channeling-aoe-ability-example
https://moddota.com/forums/discussion/69/particle-attachment
• Репозиторий, где показаны базовые вещи и есть стартовый набор скриптов: https://github.com/bmddota/barebones
• Ну и конечно же - по возможности старайтесь создавать свои или переводить чужие гайды, так как то, что Вам кажется очевидным, кому-то придется понимать на забугорских сайтах 2 а то и больше дней, так как российское сообщество D2WT ушло не очень далеко от нулевого уровня.
Всем курлык. В этом гайде постараюсь подробно рассказать, как использовать файлы из репозитория barebones, отлавливать действия через него и как узнавать, когда и какой приказ отдает игрок своему герою.
Содержание
[list type=decimal]
[li]Barebones и с чем его едят.[/li]
[li]Отлов приказов.[/li]
[li]Примеры.[/li]
[/list]
1.Barebones и с чем его едят.
Специально для таких, как мы, хорошие люди создали репозиторий со стартовым набором скриптов. Сейчас разберем всех их в отдельности:
- addon_game_mode.lua - обычный файл, как и стандартный, к которому уже подключены(require) остальные скрипты из репозитория. Здесь есть только функции Activate() и Precache(). Больше ничего добавлять здесь не желательно, чтобы не было беспорядка, да и не понадобится это, если хорошо разобраться.
- settings.lua - настройки аддона. Здесь можно найти настройки всего, что душа пожелает: расстояние от камеры до героя, форс пик(когда всем игрокам дается один и тот же герой), количество получаемой каждый тик золота, количество и настройка команд и многое другое. В файле есть комментарии на английском языке.
- gamemode.lua - через этот файл осуществляется подключение всей библиотеке к addon_game_mode. Здесь уже есть несколько событий, например GameMode:OnGameInProgress() - когда начался раунд(00:00), GameMode:OnAllPlayersLoaded() - когда все игроки загрузились в игру и очень полезная функция - GameMode:InitGameMode(), которая выполняет код, когда наш мод загружен, к этой функции мы еще вернемся. Также вверху скрипта есть настройка: BAREBONES_DEBUG_SPEW = false. Изменив false на true мы позволим barebones сообщать о многих событиях и действиях на карте в консоль.
- internal/gamemode.lua - здесь barebones определяет, что вы сообщили ему в settings.lua и производит нужные настройки. Ниже есть блок с ListenToGameEvent. Именно здесь происходит отлов событий. Стоит понимать, что все скрипты соединены друг с другом, они находятся в одной системе и благодаря этому произвести действие при каком-то событии, отмеченном здесь, можно в любом другом скрипте.
- libraries/timers.lua - всем известные и всеми любимые таймеры. Подключите их к своему скрипту ( require('libraries/timers.lua') ), и сможете использовать в нем таймеры.
- events.lua - Вот здесь-то и происходят действия при том или ином событии на карте, указанном в internal/gamemode.lua.
Существуют и другие скрипты в этой библиотеке, но в их подробности вдаваться сразу не стоит - слишком много информации.[/font]
Специально для таких, как мы, хорошие люди создали репозиторий со стартовым набором скриптов. Сейчас разберем всех их в отдельности:
- addon_game_mode.lua - обычный файл, как и стандартный, к которому уже подключены(require) остальные скрипты из репозитория. Здесь есть только функции Activate() и Precache(). Больше ничего добавлять здесь не желательно, чтобы не было беспорядка, да и не понадобится это, если хорошо разобраться.
- settings.lua - настройки аддона. Здесь можно найти настройки всего, что душа пожелает: расстояние от камеры до героя, форс пик(когда всем игрокам дается один и тот же герой), количество получаемой каждый тик золота, количество и настройка команд и многое другое. В файле есть комментарии на английском языке.
- gamemode.lua - через этот файл осуществляется подключение всей библиотеке к addon_game_mode. Здесь уже есть несколько событий, например GameMode:OnGameInProgress() - когда начался раунд(00:00), GameMode:OnAllPlayersLoaded() - когда все игроки загрузились в игру и очень полезная функция - GameMode:InitGameMode(), которая выполняет код, когда наш мод загружен, к этой функции мы еще вернемся. Также вверху скрипта есть настройка: BAREBONES_DEBUG_SPEW = false. Изменив false на true мы позволим barebones сообщать о многих событиях и действиях на карте в консоль.
- internal/gamemode.lua - здесь barebones определяет, что вы сообщили ему в settings.lua и производит нужные настройки. Ниже есть блок с ListenToGameEvent. Именно здесь происходит отлов событий. Стоит понимать, что все скрипты соединены друг с другом, они находятся в одной системе и благодаря этому произвести действие при каком-то событии, отмеченном здесь, можно в любом другом скрипте.
- libraries/timers.lua - всем известные и всеми любимые таймеры. Подключите их к своему скрипту ( require('libraries/timers.lua') ), и сможете использовать в нем таймеры.
- events.lua - Вот здесь-то и происходят действия при том или ином событии на карте, указанном в internal/gamemode.lua.
Существуют и другие скрипты в этой библиотеке, но в их подробности вдаваться сразу не стоит - слишком много информации.[/font]
2. Отлов приказов.
В голову часто приходят идеи отличных скиллов для своих героев, но задавая вопросом "а как это реализовать ?" желание иногда пропадает. Узнав о том, как отлавливать приказы, такая ситуация с вами происходить будет реже.
Какие бывают типы приказов ?
DOTA_UNIT_ORDER_NONE = 0; -- Пустой приказ. DOTA_UNIT_ORDER_MOVE_TO_POSITION = 1; -- Герой перемещается по нажатию ПКМ. DOTA_UNIT_ORDER_MOVE_TO_TARGET = 2; -- Герой бежит к цели. DOTA_UNIT_ORDER_ATTACK_MOVE = 3; -- Герой бежит, чтобы бить цель. DOTA_UNIT_ORDER_ATTACK_TARGET = 4; -- Герой атакует цель. DOTA_UNIT_ORDER_CAST_POSITION = 5; -- Герой начинает кастовать способность типа TARGET_POINT. DOTA_UNIT_ORDER_CAST_TARGET = 6; -- Герой начинает кастовать способность типа TARGET_UNIT. DOTA_UNIT_ORDER_CAST_TARGET_TREE = 7; -- Герой начинает кастовать способность, которая направляется на деревья. Например - топор за 225. DOTA_UNIT_ORDER_CAST_NO_TARGET = 8; -- Герой начинает кастовать способность типа NO_TARGET DOTA_UNIT_ORDER_CAST_TOGGLE = 9; -- Герой начинает кастовать способность типа TOGGLE. DOTA_UNIT_ORDER_HOLD_POSITION = 10; -- Когда игрок жмет "S" - то бишь отменяет действие. DOTA_UNIT_ORDER_TRAIN_ABILITY = 11; DOTA_UNIT_ORDER_DROP_ITEM = 12; -- Приказ выбросить итем. DOTA_UNIT_ORDER_GIVE_ITEM = 13; -- Приказ передать итем другому герою. DOTA_UNIT_ORDER_PICKUP_ITEM = 14; -- Приказ поднять итем. DOTA_UNIT_ORDER_PICKUP_RUNE = 15; -- Приказ поднять руну DOTA_UNIT_ORDER_PURCHASE_ITEM = 16; -- Приобрести итем DOTA_UNIT_ORDER_SELL_ITEM = 17; -- Продать итем DOTA_UNIT_ORDER_DISASSEMBLE_ITEM = 18; DOTA_UNIT_ORDER_MOVE_ITEM = 19; DOTA_UNIT_ORDER_CAST_TOGGLE_AUTO = 20; -- Переключить способность на авто-каст( как стрелы траксы ) DOTA_UNIT_ORDER_STOP = 21; DOTA_UNIT_ORDER_TAUNT = 22; DOTA_UNIT_ORDER_BUYBACK = 23; -- Выкупиться в игру. DOTA_UNIT_ORDER_GLYPH = 24; -- Прожать глиф. DOTA_UNIT_ORDER_EJECT_ITEM_FROM_STASH = 25; -- Выбросить итем из стэша. DOTA_UNIT_ORDER_CAST_RUNE = 26; DOTA_UNIT_ORDER_PING_ABILITY = 27; DOTA_UNIT_ORDER_MOVE_TO_DIRECTION = 28; |
Что же нужно для того, чтобы начать отлавливать приказы, которые игрок отдает своему герою ? Для этого в функции Gamemode:InitGameMode() добавить следующую строку:
Код:
GameRules:GetGameModeEntity():SetExecuteOrderFilter(GameMode.FilterExecuteOrder, self)
Код:
function GameMode:FilterExecuteOrder(filterTable)
for k, v in pairs(filterTable) do -- стандартный способ вывода таблицы через key/value.
print(k, v)
end
return true -- разрешаем герою произвести действие по приказу.
end
Что же можно теперь получить из filterTable:
Код:
[ VScript ]: entindex_ability 0 -- Здесь будет intindex скилла, если типа ордера - каст.
[ VScript ]: sequence_number_const 11
[ VScript ]: queue 0 -- очередь на применение.
[ VScript ]: units table: 0x03207b38 -- Таблица с юнитами, которым отдают приказ. Эту таблицу так же нужно выводить, чтобы производить какие-то действия.
[ VScript ]: entindex_target 0 -- Индекс цели. Выводится при приказе атаковать или подобном.
[ VScript ]: position_z 0 -- координаты. Выводятся, когда, используется способность типа POINT, или MOVE_TO_POZITION. С X и Y тоже самое.
[ VScript ]: position_x 0
[ VScript ]: order_type 10 -- тип ордера из списка выше.
[ VScript ]: position_y 0
[ VScript ]: issuer_player_id_const 0 -- id игрока( не героя).
Код:
local units_table = filterTable["units"]
local ability = filterTable["entindex_ability"]
local order = filterTable["order_type"]
3. Примеры
3.1 Давайте создадим код, который будет позволять Невермору передавать итемы только траксе.
Код:
function GameMode:FilterExecuteOrder(filterTable)
local units_table = filterTable["units"]
local ability = filterTable["entindex_ability"]
local order = filterTable["order_type"]
local TargetIndex = filterTable["entindex_target"]
local heroName1 = "npc_dota_hero_nevermore"
local heroName2 = "npc_dota_hero_drow_ranger"
for key, hero in pairs(units_table) do -- берем героя, которому отдают приказ.
local HHeroIndex = EntIndexToHScript(hero) -- Переводим EntIndex в HScript
local HHeroName = HHeroIndex:GetUnitName() -- Получаем имя героя
if order == 13 and HHeroName == heroName1 then -- Если приказ - передать итем и герой, которому приказывают - Невермор, то..
local HTargetIndex = EntIndexToHScript(TargetIndex)
local HTargetName = HTargetIndex:GetUnitName()
if HTargetName == heroName2 then -- Если цель, которой невермор передает итем - тракса, то..
return true -- разрешаем герою выполнить приказ.
else -- если не тракса, то..
return nil -- запрещаем.
end
end
end
return true -- во всех остальных случаях разрешаем героям выполнять приказы.
end
На этом пока всё. Гайд постараюсь дополнить еще примерами, но позже.
Советы:
• Советую для ознакомления два открытых на гитхабе популярных проекта:
Warchasers: https://github.com/MNoya/Warchasers
Жизнь на Арене: https://github.com/ZLOY5/LiA
Скачайте их, распакуйте и установите программу Far 3. И когда становится тяжело понять, как описать ту или иную команду или функцию - заходите через Far в корень скачанных проектов, жмите alt + F7. В первом поле вводите "*.*", во втором - то, что нужно найти, например "OnAttacked".
• На ГитХабе в поиске так же всегда можно поискать интересующие команды и функции. Также для поиска и вообще "почитать" советую https://moddota.com
• На сайте https://moddota.com создатель Warchasers - Noya, оформляет качественные гайды, несколько из них:
http://moddota.com/forums/discussion/14/datadriven-ability-breakdown-documentation
https://moddota.com/forums/discussion/4/datadriven-items
http://moddota.com/forums/discussion/93/point-channeling-aoe-ability-example
https://moddota.com/forums/discussion/69/particle-attachment
• Репозиторий, где показаны базовые вещи и есть стартовый набор скриптов: https://github.com/bmddota/barebones
• Ну и конечно же - по возможности старайтесь создавать свои или переводить чужие гайды, так как то, что Вам кажется очевидным, кому-то придется понимать на забугорских сайтах 2 а то и больше дней, так как российское сообщество D2WT ушло не очень далеко от нулевого уровня.
Автор - Slavko.
barebones, D2WT, workshop, dota 2, дота 2, создать карту, отлов событий, отлов действий, гайд, гейм мод, кастом, абилити
Последнее редактирование модератором: