[Гайд] Barebones | Отлов приказов

Slavko

Продвинутый
22 Июн 2015
224
4
Вступление.
Всем курлык. В этом гайде постараюсь подробно рассказать, как использовать файлы из репозитория 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]​

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)
Теперь, обращаясь к GameMode, мы можем узнать, кто и какой приказ отдает, и разрешить его герою выполнять данный приказ, или наоборот - запретить. Для начала создадим функцию и выведем filterTable в консоль.

Код:
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 игрока( не героя).
Достать эти строки из filterTable отдельно можно так:

Код:
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, создать карту, отлов событий, отлов действий, гайд, гейм мод, кастом, абилити
 
Последнее редактирование модератором:
  • Нравится
Реакции: MrMuk

doter.ua

Продвинутый
17 Авг 2014
280
5
Используй константы вместо хардкодных значений:
if order == DOTA_UNIT_ORDER_GIVE_ITEM
 
Реклама: