Урок Перевод гайда от Noya по DataDriven способностям

I_GRIN_I

Друзья CG
15 Мар 2016
1,335
105
[size=20pt]DataDriven Способность.[/size]
DataDriven способность - это перечень значений KeyValues. KeyValues - это простая древовидная структура, используемая для хранения вложенных разделов, содержащих пары ключ/значение.

Способности DataDriven находятся в файле scripts/npc/npc_abilities_custom.txt внутри папки с вашим аддоном.

Эта способность, называемая "datadriven_skeleton" содержит в себе множество KeyValues, которые будут достаточно подробно рассмотрены в этом гайде.
Способность под спойлером:
Код:
"datadriven_skeleton"
{
  // General 
  // ----------------------------------------------------------------------------------------
  "BaseClass"       "ability_datadriven"
  "AbilityBehavior"    "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET"
  "AbilityTextureName"   "spellicon"
  "AbilityUnitTargetTeam" "DOTA_UNIT_TARGET_TEAM_ENEMY"
  "AbilityUnitTargetType" "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC"
  "AbilityUnitTargetFlags" "DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES"
  "AbilityUnitDamageType" "DAMAGE_TYPE_MAGICAL"

  "AbilityType"      "DOTA_ABILITY_TYPE_BASIC"
  "MaxLevel"        "7"
  "RequiredLevel"     "-4"
  "LevelsBetweenUpgrades" "7"

  "AbilityCastPoint"    "0.0"
  "AbilityCastAnimation"  "ACT_DOTA_ATTACK"
  "AnimationPlaybackRate" "1"
  "AnimationIgnoresModelScale" "1"

  // Stats
  //----------------------------------------------------------------------------------------
  "AbilityDamage"      "0 0 0 0"
  "AbilityManaCost"     "0 0 0 0"
  "AbilityCooldown"     "0.0 0.0 0.0 0.0"
  "AbilityCastRange"    "0"
  "AbilityCastRangeBuffer" "250"
  "AbilityChannelTime"   "0.0 0.0 0.0 0.0"
  "AbilityChannelledManaCostPerSecond" "30 35 40 45"
  "AbilityDuration"     "0.0 0.0 0.0 0.0"
  "AoERadius"        "250"

  // ...
}

[size=20pt]BaseClass.[/size]
BaseClass может иметь значение названия любой способности из доты, или же иметь значение "ability_datadriven", которое позволяет использовать все возможности DataDriven, данные нам Valve.

Используя способности в Dota как BaseClass, можно либо изменить значения способностей из обычной доты (изменения вносятся в файл scripts/npc/npc_abilities_override.txt), либо создать новую способность в npc_abilities_custom.txt которая получает выставленные переменные и значения. Однако нам недозволенно изменить/добавить свою внутреннюю структуру, так как этот код блокируется в коде C++ самой доты.

Здесь мы рассмотрим все, что касается написания собственных способностей с нуля, используя "BaseClass" "ability_datadriven.

[size=20pt]AbilityBehavior.[/size]
Это описывает, как способность работает, её общее поведение, выполняемое при её выполнении.

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

Пример:
Код:
"DOTA_ABILITY_BEHAVIOR_CHANNELLED | DOTA_ABILITY_BEHAVIOR_NO_TARGET"
Список всех возможных значений AbilityBehavior:
Доступные флаги с ключом "AbilityBehavior".
AbilityBehaviorОписание
DOTA_ABILITY_BEHAVIOR_NO_TARGETНе нужно цели или точки(на земле) для использования.
Способность срабатывает, как только нажата кнопка.
DOTA_ABILITY_BEHAVIOR_UNIT_TARGETНужна цель, на которую нужно прожать способность.
Требует AbilityUnitTargetTeam и AbilityUnitTargetType об этом далее...
DOTA_ABILITY_BEHAVIOR_POINTМожно использовать на точку на земле.
При нажатии на юнита способность используется на место, на котором стоял этот юнит.
DOTA_ABILITY_BEHAVIOR_PASSIVEНе может быть прожата.
DOTA_ABILITY_BEHAVIOR_CHANNELLEDПрерываемая способность.
Если кастер двинется или будет обезмолвлен/застанен способность прервется.
DOTA_ABILITY_BEHAVIOR_TOGGLEМожно включать и выключать.
DOTA_ABILITY_BEHAVIOR_AURAСпособность является аурой.
Не делает саму способность аурой.
Этот тег только покажет при наведении на способность, что она аура, но не сделает способность таковой.
DOTA_ABILITY_BEHAVIOR_AUTOCASTМожет быть активировано для автоматического использования.
Обычно не работает, если способность не автоатака(стрелы клинкза).
Тоесть ваша способность не будет использоваться по готовности как блудласт огра или броня лича.
DOTA_ABILITY_BEHAVIOR_HIDDENНе может быть скастована и не будет отображаться на HUD.
DOTA_ABILITY_BEHAVIOR_AOEБудет показывать синюю область использования вокруг точки(стан Свена).
Использует AoERadius.
DOTA_ABILITY_BEHAVIOR_NOT_LEARNABLEНельзя получить, нажав на HUD.
Пример: способности Invoker
DOTA_ABILITY_BEHAVIOR_ITEMСпособность привязана к предмету. Нет необходимости использовать этот тег, игра сама назначит поведение для любого "item_datadriven"
DOTA_ABILITY_BEHAVIOR_DIRECTIONALИмеет направление от героя.
Пример: Стрела Мираны или крюк Пуджа.
DOTA_ABILITY_BEHAVIOR_IMMEDIATEАбилка будет использована немедленно (юнит остановит текущее действие и скастует), игнорируя последовательность действий (действия заданные через шифт).
DOTA_ABILITY_BEHAVIOR_NOASSISTА вот тут уже от меня... Вроде как эту способность нельзя применить на союзников, с включенным "без помощи" на вас. Точно не знаю, у Нойи в гайде тоже ничего не написано.
DOTA_ABILITY_BEHAVIOR_ATTACKЭто атака(стрелы клинкза) и эту способность нельзя применить на имунных к атакам юнитов.
DOTA_ABILITY_BEHAVIOR_ROOT_DISABLESНе может быть использован, когда кастер находится в "корнях"(ульт трента или другая способность вещающая стату ROOTED).
DOTA_ABILITY_BEHAVIOR_UNRESTRICTEDСпособность можно использовать под салом.
Пример: "Вылезание" Lifestealer
DOTA_ABILITY_BEHAVIOR_DONT_ALERT_TARGETНе предупреждает врагов если способность использована на них.
Пример: разбег Spirit Breaker
DOTA_ABILITY_BEHAVIOR_DONT_RESUME_MOVEMENTПосле завершения, не продолжает движение кастера.
Подходит только для способностей без целей и не немедленных по действию.
DOTA_ABILITY_BEHAVIOR_DONT_RESUME_ATTACKСпособность не восстанавливает атаку после своего завершения.Подходит только для способностей без целей и не немедленных по действию и для целей типа юнита.
DOTA_ABILITY_BEHAVIOR_NORMAL_WHEN_STOLENСпособность по-прежнему используется в точку каста, когда сбита.
Пример: пуф Мипо, телепорт Фуры.
DOTA_ABILITY_BEHAVIOR_IGNORE_BACKSWINGСпособность игнорирует быстрый отказ(прожал способность и после нажал S).
DOTA_ABILITY_BEHAVIOR_IGNORE_PSEUDO_QUEUEМожет быть скастована во время оглушения, каста другой способности или атаки. Применимо только к переключаемым способностям.
Пример: перекачка морфа
DOTA_ABILITY_BEHAVIOR_RUNE_TARGETКак цель может быть использована руна.
DOTA_ABILITY_BEHAVIOR_IGNORE_CHANNELНе отменяет _CHANNELLED способности.
DOTA_ABILITY_BEHAVIOR_OPTIONAL_UNIT_TARGETКак ботл или варды, прожимается через ctrl.
DOTA_ABILITY_BEHAVIOR_OPTIONAL_NO_TARGETФигъ его знаетъ.

[size=20pt]Подсказки Behavior.[/size]
Следующие теги будут генерировать подсказки по способности. Вы должны иметь, по крайней мере, один тег из этого списка. Остальные теги не несут никаких визуальных изменений.

Интерфейс может показывать только одну подсказку. Не используйте противоречащие друг другу теги(как например NO_TARGET с UNIT_TARGET).
AbilityBehaviorСпособность: подсказкаБерет верх над
DOTA_ABILITY_BEHAVIOR_NO_TARGETНет Цели
DOTA_ABILITY_BEHAVIOR_UNIT_TARGETЦель - юнит_POINT
DOTA_ABILITY_BEHAVIOR_POINTЦель - точка
DOTA_ABILITY_BEHAVIOR_PASSIVEПассивная
DOTA_ABILITY_BEHAVIOR_CHANNELLEDКастуемая_POINT и _UNIT
DOTA_ABILITY_BEHAVIOR_TOGGLEПереключаемая_POINT и _UNIT
DOTA_ABILITY_BEHAVIOR_AURAАура_ PASSIVE
DOTA_ABILITY_BEHAVIOR_AUTOCASTАвто-каст_UNIT_TARGET

Например:
Код:
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_CHANNELLED"
будет показано, как
ef45c12988.jpg


[size=20pt]AbilityType.[/size]
Значение по умолчанию DOTA_ABILITY_TYPE_BASIC.
AbilityTypeОписание
DOTA_ABILITY_TYPE_BASICНормальные способности, изучаемые на 1 уровне и качаемые каждые 2 уровня.
DOTA_ABILITY_TYPE_ULTIMATE5 уровней между обновлениями и требует уровень 6, чтобы провести первую прокачку.
Также показывает HUD, что это ультимативная способность.
DOTA_ABILITY_TYPE_ATTRIBUTESИспользуется для attribute_bonus.
DOTA_ABILITY_TYPE_HIDDENТак же фиг знает зачем.

Кроме того, интервалы прокачки и лимиты способности могут быть изменены этими keyvalues внутри основного блока способности:
[size=20pt]MaxLevel.[/size]
Интерфейс на данный момент поддерживает следующие уровни способности для отображения: 1, 3, 4, и 7.

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

Пример:
Код:
"MaxLevel" "10"
Демонстрация
[size=20pt]RequiredLevel.[/size]
На каком уровне эта способность может быть впервые прокачена. Значение может быть отрицательным, чтобы способность могла быть прокачана в любой момент, потому что следующее значение устанавливает уровень между прокачкой способности, в том числе одного первого.
[size=20pt]LevelsBetweenUpgrades.[/size]
Сколько уровней нужно ждать, чтобы поднять способность на следующий уровень.

Пример:
Код:
"MaxLevel" "7" "RequiredLevel" "-4" "LevelsBetweenUpgrades" "7"
Результаты: способность, которая может быть первый раз изучена на уровне 3, а затем прокачана каждые 7 уровней: 10/17/24/31/38/45

Максимальный уровень героев можно изменять с помощью Lua SetCustomHeroMaxLevel ( MAX_LEVEL ) функции API

[size=20pt]AbilityTextureName.[/size]
Имя файла значка, который будет отображаться в пользовательском интерфейсе для этой способности. Вы можете повторно использовать значок от другой способности. Внутреннее имя каждой дефолтной способности в Dota может быть получена здесь: Внутренние имена дефолтных способностей

Чтобы использовать свои собственные иконки, поместите их в resource\flash3\images\spellicons в папке вашего аддона и просто напишите имя вашей иконки, без пути и формата.

Формат иконки: 128х128 PNG

Пример:
Код:
"AbilityTextureName" "warchasers_buff"
warchasers_buff.png


[size=20pt]Reject Self Cast.[/size]
Добавлен вместе с Reborn.
Код:
"CastFilterRejectCaster" "1"
[size=20pt]Cast While Hidden.[/size]
Добавлен вместе с Reborn.
Код:
"IsCastableWhileHidden" "1"

[size=20pt]Targeting.[/size]
3 ключевых набора правил для выбора цели: Team, Type и Flags.
[size=16pt]Team.[/size]
AbilityUnitTargetTeamОписание
DOTA_UNIT_TARGET_TEAM_BOTHВсе
DOTA_UNIT_TARGET_TEAM_ENEMYВраг
DOTA_UNIT_TARGET_TEAM_FRIENDLYСоюзники
DOTA_UNIT_TARGET_TEAM_NONEЗначение по умолчанию по умолчанию
DOTA_UNIT_TARGET_TEAM_CUSTOMФиг знает

[size=16pt]Type.[/size].
Здесь в описании идут типы юнитов из npc_units_custom.txt, а так же из обычной доты. Так же обозначение типов юнитов в Lua.
AbilityUnitTargetTypeЦели
DOTA_UNIT_TARGET_ALLВсе, в том числе скрытые объекты
DOTA_UNIT_TARGET_HEROnpc_dota_hero героев
DOTA_NPC_UNIT_RELATIONSHIP_TYPE_HERO
DOTA_UNIT_TARGET_BASICБазовые юниты, в том числе призванные(summons)
DOTA_UNIT_TARGET_MECHANICALnpc_dota_creep_siege
DOTA_NPC_UNIT_RELATIONSHIP_TYPE_SIEGE
DOTA_UNIT_TARGET_BUILDINGnpc_dota_tower, npc_dota_building
DOTA_NPC_UNIT_RELATIONSHIP_TYPE_BUILDING
DOTA_UNIT_TARGET_TREEent_dota_tree
Например: Танго, Топорик(Quelling Blade)
DOTA_UNIT_TARGET_CREEPnpc_dota_creature, npc_dota_creep
Простые юниты, но может не принимать за цель некоторых призванных существ
Пример: ульт Клинкза
DOTA_UNIT_TARGET_COURIERnpc_dota_courier, npc_dota_flying_courier
DOTA_NPC_UNIT_RELATIONSHIP_TYPE_COURIER
DOTA_UNIT_TARGET_NONEНичего
DOTA_UNIT_TARGET_OTHERВсе, что не входит в предыдущие типы
DOTA_UNIT_TARGET_CUSTOMНе выделяемые?
Например: Replicate, Sunder, Demonic Conversion, Tether, Infest...

[size=16pt]Flags.[/size].
Флаги позволяют выбрать единицы, которые по умолчанию игнорируются (например, иммунитет к магии), или игнорировать определенные типы юнитов, которые в противном случае могут быть выбраны (как древние или союзники с иммунитетом к магии).
AbilityUnitTargetFlagsЦели / Игнорируемые
DOTA_UNIT_TARGET_FLAG_NONEЗначение по умолчанию
DOTA_UNIT_TARGET_FLAG_DEADМертвые единицы, которые в противном случае игнорируются.
DOTA_UNIT_TARGET_FLAG_MELEE_ONLYЮниты ближнего боя(Блоки у юнитов с AttackCapabilities DOTA_UNIT_CAP_MELEE_ATTACK)
DOTA_UNIT_TARGET_FLAG_RANGED_ONLYЮниты дальнего боя(Блоки у юнитов с AttackCapabilities DOTA_UNIT_CAP_RANGED_ATTACK)
DOTA_UNIT_TARGET_FLAG_MANA_ONLYЮниты с маной, без "StatusMana" "0" в npc_units файле.
DOTA_UNIT_TARGET_FLAG_CHECK_DISABLE_HELPЮниты с отключенной помощью
Не знаю, как сделать, чтобы datadriven использовал это?
DOTA_UNIT_TARGET_FLAG_NO_INVISИгнорирует невидимых юнитов, с MODIFIER_STATE_INVISIBLE
DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIESЦели противника с MODIFIER_STATE_MAGIC_IMMUNE
Примеры: Ensnare, Culling Blade, Primal Roar...
DOTA_UNIT_TARGET_FLAG_NOT_MAGIC_IMMUNE_ALLIESИгнорирует союзников с MODIFIER_STATE_MAGIC_IMMUNE
Пример: Bane Nightmare
DOTA_UNIT_TARGET_FLAG_NOT_ATTACK_IMMUNEЮниты с MODIFIER_STATE_ATTACK_IMMUNE
DOTA_UNIT_TARGET_FLAG_FOW_VISIBLEПерерывается, когда цель уходит в туман войны
Примеры: Mana Drain, Life Drain
DOTA_UNIT_TARGET_FLAG_INVULNERABLEЮниты с MODIFIER_STATE_INVULNERABLE
Примеры: Assassinate, Recall, Boulder Smash..
DOTA_UNIT_TARGET_FLAG_NOT_ANCIENTSИгнорирует юнитов с "IsAncient" "1"
Пример: Hand of Midas
DOTA_UNIT_TARGET_FLAG_NOT_CREEP_HEROИгнорирует юнитов с "ConsideredHero" "1"
Примеры: Astral Imprisonment, Disruption, Sunder
DOTA_UNIT_TARGET_FLAG_NOT_DOMINATEDЮниты с MODIFIER_STATE_DOMINATED
DOTA_UNIT_TARGET_FLAG_NOT_ILLUSIONSЮниты с MODIFIER_PROPERTY_IS_ILLUSION
DOTA_UNIT_TARGET_FLAG_NOT_NIGHTMAREDЮниты с MODIFIER_STATE_NIGHTMARED
DOTA_UNIT_TARGET_FLAG_NOT_SUMMONEDЮниты, созданные ключом SpawnUnit
DOTA_UNIT_TARGET_FLAG_OUT_OF_WORLDЮниты с MODIFIER_STATE_OUT_OF_GAME
DOTA_UNIT_TARGET_FLAG_PLAYER_CONTROLLEDЮниты управляемые игроком, можно менять в Lua IsControllableByAnyPlayer()
DOTA_UNIT_TARGET_FLAG_PREFER_ENEMIESПриоритеты юнитов за деревьями, когда оба кликабельны

[size=16pt]Чистый список.[/size]

  • [li]DOTA_UNIT_TARGET_FLAG_NONE[/li]
    [li]DOTA_UNIT_TARGET_FLAG_DEAD[/li]
    [li]DOTA_UNIT_TARGET_FLAG_MELEE_ONLY[/li]
    [li]DOTA_UNIT_TARGET_FLAG_RANGED_ONLY[/li]
    [li]DOTA_UNIT_TARGET_FLAG_MANA_ONLY[/li]
    [li]DOTA_UNIT_TARGET_FLAG_CHECK_DISABLE_HELP[/li]
    [li]DOTA_UNIT_TARGET_FLAG_NO_INVIS[/li]
    [li]DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES[/li]
    [li]DOTA_UNIT_TARGET_FLAG_NOT_MAGIC_IMMUNE_ALLIES[/li]
    [li]DOTA_UNIT_TARGET_FLAG_NOT_ATTACK_IMMUNE[/li]
    [li]DOTA_UNIT_TARGET_FLAG_FOW_VISIBLE[/li]
    [li]DOTA_UNIT_TARGET_FLAG_INVULNERABLE[/li]
    [li]DOTA_UNIT_TARGET_FLAG_NOT_ANCIENTS[/li]
    [li]DOTA_UNIT_TARGET_FLAG_NOT_CREEP_HERO[/li]
    [li]DOTA_UNIT_TARGET_FLAG_NOT_DOMINATED[/li]
    [li]DOTA_UNIT_TARGET_FLAG_NOT_ILLUSIONS[/li]
    [li]DOTA_UNIT_TARGET_FLAG_NOT_NIGHTMARED[/li]
    [li]DOTA_UNIT_TARGET_FLAG_NOT_SUMMONED[/li]
    [li]DOTA_UNIT_TARGET_FLAG_OUT_OF_WORLD[/li]
    [li]DOTA_UNIT_TARGET_FLAG_PLAYER_CONTROLLED[/li]
    [li]DOTA_UNIT_TARGET_FLAG_PREFER_ENEMIES[/li]

[size=16pt]Веселье с флагами.[/size]
Флаги были созданы для AbilityUnitTargetFlags, но это не единственное их применение:
То же самое относится и к Team и Types.

  • [li]В "Target" блока это дает контроль над тем, что за цель и какие флаги она имеет, чтобы применить что то к ним позже.[/li]
Код:
"Target" 
{
  "Center" "CASTER"
  "Flags" "DOTA_UNIT_TARGET_FLAG_DEAD"
}

  • [li]"TargetFlags" в "LinearProjectile" позволяет LinearProjectile игнорировать юнитов, на которых по умолчанию она была бы использована с Team+Type значения, например с MODIFIER_STATE_INVISIBLE.[/li]
    [li]"Aura_Flags" в модификаторе с другими "Aura" ключами могут быть использованы, например, чтобы сделать ауру, которая влияет только на Дальний бой, добавив DOTA_UNIT_TARGET_FLAG_RANGED_ONLY.[/li]
То же самое касается Teams и Types
Пример: прием всех дружественных юнитов в радиусе от кастера, в том числе курьеров, зданий и осадных юнитов, исключая героев, призванных юнитов и других управляемых игроками единиц.
Код:
"Target"
{
  "Center"  "CASTER"
  "Radius"  "%radius"

  //AbilityUnitTargetTeam values
  "Teams" "DOTA_UNIT_TARGET_TEAM_FRIENDLY"

  //AbilityUnitTargetTypes
  "Types" "DOTA_UNIT_TARGET_ALL"
  "ExcludeTypes" "DOTA_UNIT_TARGET_HERO"

  //AbilityUnitTargetFlags
  "Flags" "DOTA_UNIT_TARGET_FLAG_NOT_SUMMONED"
  "ExcludeFlags" "DOTA_UNIT_TARGET_FLAG_PLAYER_CONTROLLED"  
}
Пример: Переписанная стрела мираны, которая будет попадать только в героев, в том числе с иммунитетом к магии
Код:
"LinearProjectile"
{
  "Target" "POINT"
  "EffectName"   "particles/units/heroes/hero_mirana/mirana_spell_arrow.vpcf"
  "MoveSpeed"   "857"
  "StartRadius"  "115"
  "EndRadius"   "115"
  "StartPosition" "attach_attack1"
  "FixedDistance" "3000"
  "TargetTeams"  "DOTA_UNIT_TARGET_TEAM_ENEMY"
  "TargetTypes"  "DOTA_UNIT_TARGET_HERO"
  "TargetFlags"  "DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES"
  "HasFrontalCone" "0"
  "ProvidesVision" "1"
  "VisionRadius"  "650"
}
С DOTA_UNIT_TARGET_FLAG_MAGIC_IMMUNE_ENEMIES, и с DOTA_UNIT_TARGET_FLAG_NONE: Гифка для сравнения.
 
Последнее редактирование модератором:
  • Нравится
Реакции: almazist1

Son1cPr00wer

Пользователь
23 Сен 2017
43
2
vk.com
Проект
Whack-A-Meepo
Видос от меня, близкий по теме
 
Последнее редактирование:
Реклама: