[lua, datadriven] Урок 0. Вступительный обзор datadriven системы

Se7eN

Друзья CG
22 Ноя 2014
334
18
Структура способности в ability_datadriven.

После того как вы слегка полазили и немного освоились с Valve Hammer Editor, вы можете приступать к скриптингу на lua.
Залезьте в папку с скриптами.
C:\Program Files (x86)\Steam\SteamApps\common\dota 2 beta\game\dota_addons\microwars - у меня так выглядит путь до проекта, может это поможет вам быстрее найти свой проект. Если не находите, воспользуйтесь поиском по npc_abilities_custom в поиске проводника, тут уж точно не ошибетесь!)

Там есть папка vscripts и npc, эти папки почти всё что нужно для начального скриптинга.

npc_abilities_custom.txt - Все нестандартные способности можно создать здесь.
npc_heroes_custom.txt - Все нестандартные и новые герои могут быть созданы здесь
npc_items_custom.txt - Все предметы, которые вы создадите будут здесь
npc_units_custom.txt - Все здания и юниты новые будут созданы здесь.
npc_abilities_override.txt - Здесь все стандартные способности, которые изменены.
herolist.txt - Те герои, которые доступны для выбора в игре.
Итак, вообще есть два направления скриптинга и очень важно освоить их вместе.
Первая и очень легко разбираемая это Datadriven System. Эта система содержит в себе значения, которые вы будете использовать в своих предметах, способностях и прочее. Как раз таки её сегодня мы и разберем.

Начнём мы пожалуй с примера, которая прикрепляет эффект к юниту 1 раз, при изучении способности.
Код:
"fx_test_ability" //название способности
{
  // General
  //-------------------------------------------------------------------------------------------------------------
  "BaseClass"       "ability_datadriven" //базовый класс, называя её ability_datadriven говорит что это уникальная способность, которую вы создадите самостоятельно
  "AbilityBehavior"    "DOTA_ABILITY_BEHAVIOR_PASSIVE" //пассивка, снизу есть список, какие бывают поведения у способности
  "AbilityTextureName"  "axe_battle_hunger" //иконка
 
  // Modifiers
  //-------------------------------------------------------------------------------------------------------------
  "Modifiers" //параметры
  {
    "fx_test_modifier" //название параметра, он прицепляет эффект
    {
      "Passive" "1" //пассивный параметр
      "OnCreated" //событие: когда этот параметр приходит в действие:
      {
        "AttachEffect" //прицепить эффект
        {
          "Target" "CASTER" //к кому? К тому, кто использовал способность
          "EffectName" "particles/econ/generic/generic_buff_1/generic_buff_1.vpcf" //путь до эффекта
          "EffectAttachType" "follow_overhead" //Куда именно? Над головой
          "EffectLifeDurationScale" "1" //сколько длится? 1 сек
          "EffectColorA" "255 255 0" //Цвет эффекта, поэтому можно изменять даже стандартные эффекты
        }
      }
    }
  }
}
Итак, внимательно прочтите код, разберитесь. Перечитайте, чтобы усвоилось.


Какие бывают вообще поведения?

(Используется в параметре AbilityBehavior)
DOTA_ABILITY_BEHAVIOR_HIDDEN = 1 << 0, //Скрытая способность, не отображается в виде иконки
DOTA_ABILITY_BEHAVIOR_PASSIVE = 1 << 1, //Пассивная способность
DOTA_ABILITY_BEHAVIOR_NO_TARGET = 1 << 2, //Способность применяется без цели, как инвиз баунти хантера
DOTA_ABILITY_BEHAVIOR_UNIT_TARGET = 1 << 3, //Целевая способность
DOTA_ABILITY_BEHAVIOR_POINT = 1 << 4, //Способность применяется на точку как Defeaning Blast инвокера
DOTA_ABILITY_BEHAVIOR_AOE = 1 << 5, //Способность применяется на точку, но с радиусом, как сало у Death Prophet
DOTA_ABILITY_BEHAVIOR_NOT_LEARNABLE = 1 << 6, //Нельзя изучить эту способность. Типа таблички минера
DOTA_ABILITY_BEHAVIOR_CHANNELLED = 1 << 7, //Способность которая кастуется и может быть прервана, как Black Hole Энигмы.
DOTA_ABILITY_BEHAVIOR_ITEM = 1 << 8, //Способность от предмета.
DOTA_ABILITY_BEHAVIOR_TOGGLE = 1 << 9, //Включающаяся способность. Типа манащита
DOTA_ABILITY_BEHAVIOR_DIRECTIONAL = 1 << 10, //Зависит от того, куда смотрит герой. Как хук Pudge.
DOTA_ABILITY_BEHAVIOR_IMMEDIATE = 1 << 11, //Применяется мгновенно, без задержки
DOTA_ABILITY_BEHAVIOR_AUTOCAST = 1 << 12, //Автокаст, как ледяные стрелы у траксы.
DOTA_ABILITY_BEHAVIOR_NOASSIST = 1 << 13, //Точной информации нет, но используется для Town Portal Scroll
DOTA_ABILITY_BEHAVIOR_AURA = 1 << 14, //Аура, распространяет эффекты в радиусе. Но, мы можем сделать даже активный скилл аурой.
DOTA_ABILITY_BEHAVIOR_ATTACK = 1 << 15, //Способность-атака. Поэтому не может быть применена на юнитов в Ghost Scepter’e, например.
DOTA_ABILITY_BEHAVIOR_DONT_RESUME_MOVEMENT = 1 << 16, //После применения, юнит теряет ориентир, и забывает куда двигался до этого
DOTA_ABILITY_BEHAVIOR_ROOT_DISABLES = 1 << 17, //Не может быть применена, когда в корнях. (Корни это ульт Treant Protector и 2 Crystal Maiden)
DOTA_ABILITY_BEHAVIOR_UNRESTRICTED = 1 << 18, //Способности работают даже тогда, когда другие недоступны. Consume &amp; Control у Lifesteler'a &amp; Detonate у Techies'а.
DOTA_ABILITY_BEHAVIOR_IGNORE_PSEUDO_QUEUE = 1 << 19, //Применяется только с Toggle способностями. Разрешает применять эту способность в стане и различных дизейблах, типа Хекса, когда кастуется тоже.
DOTA_ABILITY_BEHAVIOR_IGNORE_CHANNEL = 1 << 20, //Можно применять даже когда вы кастуете что-нибудь.
DOTA_ABILITY_BEHAVIOR_DONT_CANCEL_MOVEMENT = 1 << 21, //Для курьера и его СПИД берста.
DOTA_ABILITY_BEHAVIOR_DONT_ALERT_TARGET = 1 << 22, //Не тревожит противников, когда кастуется на них.
DOTA_ABILITY_BEHAVIOR_DONT_RESUME_ATTACK = 1 << 23, //Не продолжает предыдущую атаку по последней цели. Используются только для no-target, non-immediate abilities и unit-target способностях.
DOTA_ABILITY_BEHAVIOR_NORMAL_WHEN_STOLEN = 1 << 24, //Оставляет каст поинт даже когда украдена. Имеется в виду украдена рубиком.
DOTA_ABILITY_BEHAVIOR_IGNORE_BACKSWING = 1 << 25, //Убирает задержку перед использованием способности (например перед Fissure Earthshaker)
DOTA_ABILITY_BEHAVIOR_RUNE_TARGET = 1 << 26, //Использует в качестве цели руны.

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

На каждое событие можно сделать отдельный блок. Позже объясню как и зачем это делается.
• OnAbilityEndChannel -
• OnAbilityPhaseStart - до того как начнется каст способности.
• OnAbilityStart - как только способность скастовалась, отнялась манна и пошел кулдаун.
• OnAttack - как только кастер атакует.
• OnAttackAllied - Как только кастер атакует союзника.
• OnAttackFailed - Если промахнулся.
• OnChannelFinish - Как только каст ченнелинга закончился. То есть например как только ульта энигмы закончилась.
• OnChannelInterrupted - если ченнелинг сбили станом или как-то по другому.
• OnChannelSucceeded -
• OnCreated - как только способность была прокачена.
• OnEquip - Как только вещь была надета.
• OnHealReceived - Как только цель захилили.
• OnHealthGained - Как только у цели прибавилось здоровье.
• OnHeroKilled - Как только был герой убит.
• OnManaGained - Как только прибавилось маны.
• OnOrder - На приказ. (Например вы дали приказ идти, или атаковать)
• OnOwnerDied - Если умрет носитель способности.
• OnOwnerSpawned - Как только носитель появился. (Может быть такое, что способность у него есть изначально, и если юнита создадут, то запустится этот блок)
• OnProjectileDodge - Если уклонились от снаряда.
• OnProjectileFinish -
• OnProjectileHitUnit -- Как только снаряд попал во врага.
• OnRespawn - Как только носитель возродится
• OnSpellStart - Как только начнется каст способности, забирается мана и идёт кулдаун.
• OnSpentMana - Как только мана потрачена.
• OnStateChanged - Как только статус юнита был изменен.
• OnTeleported - Если вас телепортировали. (Дота, свиток)
• OnTeleporting - В то время когда цель телепортируется.
• OnToggleOff - Когда выключаете способность. (Для манащита, например)
• OnToggleOn - Когда включаете способность.
• OnUnitMoved - Реагирует на движение юнита.
• OnUpgrade - Реагирует на прокачку способности.

Действия
Итак, теперь сами действия. Без lua-скриптов нам много не доступно, поэтому способности основанные только на datadriven имеют ограничения. Но ничего, мы в любом случае должны с этим разобраться.
Сначала идёт само действие, а далее к нему идут параметры, которые обязательны, иначе эффект не применится.
AddAbility - добавить способность юниту.
Target, AbilityName (цель, название способности)

ActOnTargets - воздействует на цели, пока данное действие мне не понятно
Target, Action

ApplyModifier - применяет модифиер к юниту. Об этом поговорим позже.
Target, ModifierName (цель, название модифиера)

AttachEffect - прикрепляет эффект
EffectName, EffectAttachType, Target, ControlPoints, TargetPoint, EffectRadius, EffectDurationScale, EffectLifeDurationScale ,EffectColorA, EffectColorB, EffectAlphaScale (имя эффекта, куда прицеплять, цель, контрольные точки, точка, радиус, длительность, сколько будет угасать, цветА, цветБ, цвет альфа)

Blink - пока не понятно, вроде должно телепортировать.
Target - цель.

CleaveAttack - сплэш.
CleavePercent, CleaveRadius (Процент сплэша, радиус)

CreateThinker - создать периодический таймер с модифиером.
Target, ModifierName (Цель, название модифиера)

Damage - нанести урон.
Target, Type, MinDamage/MaxDamage, Damage, CurrentHealthPercentBasedDamage, MaxHealthPercentBasedDamage (Цель, тип урона, Мин/макс урон, Урон, Надо ли наносить урон от текущего здоровье, Надо ли наносить урон от макс. здоровья)

DelayedAction - действие через определенный промежутк.
Delay, Action (Промежуток, Действие)

DestroyTrees - Уничтожить деревья.
Target, Radius (Цель вокруг которой будут деревья уничтожены, радиус)

FireEffect - применяет однократно эффект.
EffectName, EffectAttachType, Target, ControlPoints, TargetPoint, EffectRadius, EffectDurationScale, EffectLifeDurationScale ,EffectColorA, EffectColorB, EffectAlphaScale (имя эффекта, куда прицеплять, цель, контрольные точки, точка, радиус, длительность, сколько будет угасать, цветА, цветБ, цвет альфа)

FireSound - воспроизвести звук.
EffectName, Target (Имя звука, возле кого в игре будет звучать)

Heal - захилить.
HealAmount, Target (кол-во восполняемого здоровья, цель)

Knockback - оттолкнуть юнита.
Target, Center, Duration, Distance, Height, IsFixedDistance, ShouldStun (Цель, с какой точки, длительность, дистанция, высота, дистанция определена заранее?, станит ли)

LevelUpAbility - повысить уровень способности.
Target, AbilityName (цель, название способности)

Lifesteal - отожраться.
Target, LifestealPercent (Цель, процент отжора)

LinearProjectile
Target, EffectName, MoveSpeed, StartRadius, EndRadius, FixedDistance, StartPosition, TargetTeams, TargetTypes, TargetFlags, HasFrontalCone, ProvidesVision, VisionRadius (цель, название снаряда, скорость, начальный радиус, конечный радиус, дистанция определена заранее?, начальная точка, какие команды, какие цели, как флаги у цели, false, дает обзор?, радиус обзора)

Random - случайно выбираемое значение.
Chance, PseudoRandom, OnSuccess, OnFailure (Шанс, псевдо рандом ли?, что делать в случае успеха, что делать в случае неуспеха)

RemoveAbility - удалить способность.
Target, AbilityName (У какой цели, название способности)

RemoveModifier - удалить модифиер.
Target, ModifierName (У кого, название модифиера)

RunScript - запустить lua-скрипт. В принципе отсюда и начинаются все уникальные способности. Научу вас кодить позже)
Target, ScriptFile, Function (Цель-параметр, Название скрипта, Функция в скрипте)

SpawnUnit - создать юнита.
UnitName, UnitCount, UnitLimit, SpawnRadius, Duration, Target, GrantsGold, GrantsXP (Название юнита, Сколько создать, Лимит юнитов, В радиусе каком, Длительность, Цель, Дают золото?, Дают опыт?)

Stun - оглушить цель.
Target, Duration (Цель оглушения, секунды)

TrackingProjectile - Выпустить снаряд.
Target, EffectName, Dodgeable, ProvidesVision, VisionRadius, MoveSpeed, SourceAttachment (Цель, Название эффекта, Можно ли увернуться от снаряда?, Дает ли обзор?, Радиус обзора, Скорость снаряда, Не знаю)

Как теперь использовать полученные знания?
Взгляните на следующий пример:
Код:
"OnSpellStart"   // Событие, вы можете выбрать из вкладки события
{ //все действия, касающиеся одного события должны быть в фигурных скобках
 //тут будут наши действия
} //конец
Добавляем событие:
Код:
  "FireSound"   // Действие, которое производится после события
  {
    "EffectName"  "SoundEventName"
    "Target"    "CASTER" //действующее лицо события, тот кто применил способность
  }
Соединяем код:
Код:
"OnSpellStart"   // Когда начинается использование способности:
{ 
   "FireSound"   //Запустить звук вокруг кастера
  {
    "EffectName"  "SoundEventName"
    "Target"    "CASTER" //действующее лицо события, тот кто применил способность
  }
}
В этом примере, как только применяется способность, сразу запускается звук вокруг кастующего юнита. Это значит что звук услышит тот чья камера в момент каста фиксировала владельца заклинания.

Какие ещё бывают цели?
Для целевых/точечных способностей существует система целей:
CASTER - сам кастующий юнит. Посмотрите пример выше, там звук воспроизводится на самого себя
TARGET - цель. Действия будут производиться над целью. Например вы кидаете стан в противника, так вот в переменную TARGET будет занесен именно тот противник, которого вы указали
POINT - цель-точка. Применяется для скиллов типа Shockwave магнуса, когда какой-нибудь снаряд летит в точку.
ATTACKER - цель-атакующий. В способностях крутилки акса или 3 пассивки тини, применяется цель-атакующий. Производит забор в переменную атакующего юнита.
UNIT - просто юнит. Может быть любой юнит, включая себя. Всё зависит от ваших условий.

Последнее обновление 05.07.2015
Исправлены неточности в формулировках. Спасибо MeowHellYeah.
Мелкие фиксы в тегах.
 
Последнее редактирование модератором:
  • Нравится
Реакции: Sannin

doter.ua

Продвинутый
17 Авг 2014
280
5
Ап реп.
З.Ы. добавь в подпись ссылки на свои гайды (в спойлере).
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
3b285c0940af2e17aad7a7729741d438.png


Результат можно посмотреть в моей подписи.
 

MeowHellYeah

Пользователь
4 Июл 2015
66
0
Хороший гайд, +реп) Жаль, что его не было раньше, когда я пытался вникнуть в эти дела. Не сочти за умника, поправь эти моменты, дабы не путать падаванов:

DOTA_ABILITY_BEHAVIOR_NOT_LEARNABLE = 1 << 6, //Нельзя изучить эту способность. Типа таблички минера
Не совсем таблички Минёра. Я тоже сначала думал, что это типа неё, и с помощью этого флага хотел сделать способности сразу выученными, чтоб не учить их вручную за уровни. Однако, способности с этим свойством не только не выучились сами собой, но и выучить их за уровень тоже стало нельзя) Так что это скорее как Blinding Light Котла.

DOTA_ABILITY_BEHAVIOR_AURA = 1 << 14, //Аура, вообще по сути ничего не дает. Мы можем сделать даже активный скилл аурой.
Как это ничего? Ауру и даёт: пассивно распространяет эффекты в радиусе вокруг носителя.

DOTA_ABILITY_BEHAVIOR_DONT_RESUME_MOVEMENT = 1 << 16, //Не прерывает движения, как инвиз Bounty Hunter'a.
Судя из содержания, напротив, прерывает. Don't resume - не возобновлять.

DOTA_ABILITY_BEHAVIOR_UNRESTRICTED
Этот флаг прописан у Consume и Control Лайфстилера (вылезти из юнита и взять его под контроль), а так же у Focused detonated Минёра. Эти способности работают тогда, когда остальные способности и предметы недоступны. Гуля, например, сидя в крипе, кроме этих скилов ничего прожать не может, а Текис вообще может использовать детонейт из таверны. Флаг позволяет активировать способности тогда, когда другие по каким-то причинам прожать нельзя, даже если кастер мёртв. Как-то так. :-*
З.Ы. Права прожимать абилку из стана эта штука не даёт (как перекачка Морфлинга, например).

OnHealReceived - Как только вас захилили.
OnHealthGained - Как только вам прибавилось здоровье.
OnTeleported - Если вас телепортировали. (Дота, свиток)
Не Вас, а юнит, для которого описывается событие.

Stun - оглушить противника.
Не противника, а цель. Оглушить юнит может и сам себя.

//все действия, касающиеся одного события должны быть в квадратных скобках
В фигурных скобках

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

SniperX

Друзья CG
26 Фев 2018
539
100
Проект
Dota 2x4
Можно по подробнее про модификаторы автор!
 

SniperX

Друзья CG
26 Фев 2018
539
100
Проект
Dota 2x4
Разве там есть,что-то сложное?
Я только только начинаю изучать datadriven способности чтобы хотя-бы начинать писать что-то в npc_abilities_custom ато у меня почти всё уходить в npc_abilities_override ведь я не разбираюсь в датадривен и я хочу сделать хотя-бы какой-то скилл из доты в датадривен без SpellLibrary и я поставил себе задачу сделать Blade Dance Juggernaut'а но я не знаю ничего про модификаторы и мне нужно про них больше инфы)
А так за эту инфу спс
 

HappyFeedFriends

Друзья CG
14 Авг 2017
540
32
Проект
Battle Heroes Arena
Я только только начинаю изучать datadriven способности чтобы хотя-бы начинать писать что-то в npc_abilities_custom ато у меня почти всё уходить в npc_abilities_override ведь я не разбираюсь в датадривен и я хочу сделать хотя-бы какой-то скилл из доты в датадривен без SpellLibrary и я поставил себе задачу сделать Blade Dance Juggernaut'а но я не знаю ничего про модификаторы и мне нужно про них больше инфы)
А так за эту инфу спс
SpellLibrary нужен именно для того,что бы изучать абилки и понимать как работает код.
 
Реклама: