Кастомные абилки. Структура и пример модификатора атаки.

Qweik

Пользователь
14 Фев 2015
54
1
Скажите возможно добавить в Fissure эффект отбрасывания врагов в верх и в сторону? Побывал бурда какая то получалась :D


Код:
// General
		//-------------------------------------------------------------------------------------------------------------
	    "AbilityName"					"my_earthshaker_fissure"
		"AbilityBehavior"				"DOTA_ABILITY_BEHAVIOR_POINT | DOTA_ABILITY_BEHAVIOR_UNIT_TARGET"
		"AbilityUnitTargetTeam"			"DOTA_UNIT_TARGET_TEAM_ENEMY"
		"AbilityUnitTargetType"			"DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC"
		"AbilityUnitDamageType"			"DAMAGE_TYPE_MAGICAL"	
        "BaseClass" "earthshaker_fissure"
		"precache"
		{
			"soundfile"					"soundevents/game_sounds_heroes/game_sounds_earthshaker.vsndevts"
		}
		
		// Casting
		//-------------------------------------------------------------------------------------------------------------
		"AbilityCastRange"				"1000 1200 1400 1800"
		"AbilityCastPoint"				"0.69 0.69 0.69 0.69"

		// Time		
		//-------------------------------------------------------------------------------------------------------------
		"AbilityCooldown"				"1.0 1.0 1.0 1.0"
		"AbilityDuration"				"1.0 1.25 1.5 1.75"

		// Damage.
		//-------------------------------------------------------------------------------------------------------------
		"AbilityDamage"					"125 175 225 275"

		// Cost
		//-------------------------------------------------------------------------------------------------------------
		"AbilityManaCost"				"1 4 5 7"		

		// Special
		//-------------------------------------------------------------------------------------------------------------
		"AbilitySpecial"
		{
			"01"
			{
				"var_type"					"FIELD_FLOAT"
				"fissure_duration"			"2.0 23"
			}
			"02"
			{
				"var_type"					"FIELD_INTEGER"
				"fissure_radius"				"225"
			}
			"03"
			{
				"var_type"					"FIELD_FLOAT"
				"stun_duration"				"1.0 1.25 1.5 1.75"
			}
		}
	}
 
Последнее редактирование модератором:

l30P0H

Пользователь
9 Июл 2020
25
0
Откуда вообще люди узнают эти переменные? Пока что для меня очевиден вариант спереть из других кастомок, но ведь где-то всяко есть полный список переменных и их значений, которые дота вообще способна понимать.
 

вовае

Новичок
11 Янв 2022
1
0
Проект
кастомка для друзей
привет! помогите пожалуйста!!
хочу изменить третью способность таска на аганимную....перечитал тут все гайды, ничего не помогает((
 

Terrorbetch

Пользователь
24 Ноя 2021
12
0
Проект
Кастомные карты
Вступление

Начать нужно с того, что всё, что я опишу ниже, было получено мною только из иностранных туториалов и путём реверс инженеринга. Я не имею ни малейшего понятия о луа, не смотря на то, что затрагиваю его при создании способностей - это всё познания из области реверс инженеринга, не языка программирования.
С горем пополам я понял структуру абилок в DotA 2 и попытаюсь сейчас вам всё объяснить во всех известных подробностях.

Форма создания способности и путь к файлам.

Стандартные способности в DotA 2 находятся в файле /scripts/npc/npc_abilities.txt
D2WT, при создании мода, предлагает нам не создавать новые абилки, а поверхностно переписывать стандартные через /scripts/npc/npc_abilities_custom.txt. Я выбрал файл npc_abilities.txt. Создал в нужной папке файл с таким именем и провёл начальную разметку.
Почему именно этот путь действий? Мне не нужны были лишние абилки в моём моде. Я просто удалил все стандартные и начал писать свои собственные новые. Если бы я пошёл по другому пути - у меня были бы стандартные абилки + мои. Не критично, но я захотел по-своему.

Начальная разметка npc_abilities.txt

Код:
"DOTAAbilities"
{
<-----здесь----->
}
Всё. Больше там ничего не нужно. Абилки будем записывать внутри фигурных скобочек (надеюсь вы понимаете, что они делают в коде)

Структура способности

Код:
"название_способности_в_кавычках"
{
<-----здесь----->
}
Это основа. Внутри будем писать код способности.



Какую способность я делал, и что писал в коде:

У меня, с самого начала, была задумка сделать комплексную способность.
1. Это была бы автокаст-абилка с манакостом (как фрост арровс у траксы)
2. У неё был бы кулдаун после применения (как у ликвид файр жакиро)
3. Она применялась бы на врагов и была бы модификатором автоатаки (как всё вышесказанное)
4. При применении, она давала бы стан/министан, и не наносила урона цели
5. После попадания по цели, она отскакивала бы в другого врага и наносила урон уже ему, но другой (я не решил какой - пониженный или повышенный)

Я начал писать код.
Первым делом идут обязательные переменные (они находятся слева) и их значения (они находятся справа):
Код:
        "BaseClass"                       "ability_datadriven" // говорит о том, что наша абилка будет сделана нашими ручками в виде кода
        "ID"                    "5003" // уникальный айди, постарайтесь угадать такой, который не будет занят другими абилками
        "AbilityTextureName"          "venomancer_venomous_gale" // иконка на худе
        "AbilityUnitTargetTeam"            "DOTA_UNIT_TARGET_TEAM_ENEMY" // команда, по которой можно целить абилкой
        "AbilityBehavior"                "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_AUTOCAST | DOTA_ABILITY_BEHAVIOR_ATTACK" // определяет поведение абилки (здесь - удар по одиночной цели, автокаст, модификатор автоатаки)
        "AbilityCastAnimation"         "ACT_DOTA_ATTACK" // анимация каста
        "AbilityUnitTargetType"         "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC | DOTA_UNIT_TARGET_MECHANICAL" // какие типы юнитов эта абилка будет затрагивать


        "AbilityCastRange"               "625" // радиус каста
        "AbilityCastPoint"               "0.0 0.0 0.0 0.0" // Что-то из того, чего я не знаю

        "AbilityCooldown"                "3.0 2.5 2.0 1.5" // куллдаун на разных уровнях, пишется через пробле
       
        "AbilityManaCost"                "3" // манакост (он у нас един на всех уровнях, поэтому можно не дублировать)

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

Дальше, так-как это модификатор атаки, мы создаём область, где будут отмечаться все последствия применения на разных временных отрезках.

Код:
"Modifiers"
{
<-----здесь----->
}

Вот тут уже и проявляется структура действия абилок.
Сначала мы пишем в какой момент проявляется нужный эффект. Потом сами эффекты и нужные параметры.
Дадим название модификатору

Код:
"modifier_ваше_название"
{
<-----здесь----->
}

Разберёмся с переменными модификатора. Для начала я нашёл похожую способность по действию - это фрост арровс траксы из Ночи Призраков.

Код:
"Passive"        "1" // пара переменная-значение определяет модификатор как пассивный
"Orb" // переменная и, идущие дальше в скобках, её параметры
                {
                    "Priority"            "DOTA_ORB_PRIORITY_ABILITY" // приоритет для каста (аттака защитывается как орб-эффект)
                    "ProjectileName"    "drow_frost_arrow" // визуальный вид партикля атаки, можно сделать "шоб как у дезолятора стрелы менялись"
                    "CastAttack"        "1" //каст с аттакой
                }
Дальше я использовал событие "во каста орба", которое тоже одолжил у траксы. Сначала идёт название события, потом мы открываем скобку, задаём то, что произойдет в этот момент и закрываем скобки.
Код:
                "OnOrbFire" //название события
                {
                    "SpendMana" // то, что произойдёт (потратится мана)
                    {
                        "Mana"    "%AbilityManaCost" // здесь придётся написать её количество (знак % обозначает ссылку к другой переменной (вы же помните, что они слева находятся) которая у нас уже есть в коде выше - AbilityManaCost)
                    }
         
                    "FireSound" // произойдёт воспроизведение звука
                    {
                        "EffectName"            "Hero_DrowRanger.FrostArrows" // задаём название звука
                        "Target"                "CASTER" // и источник
                    }
         
                }

Полдела - сделано. Теперь следующее событие. Теперь мы решаем, что произойдет в момент, когда наша стрела попадёт по врагу. Я использовал всё ту же абилку траксы из Ночи Призраков и смешал её с ультой ВР из той же Ночи Призраков

Код:
"OnOrbImpact" // событие "при попадании по цели"
                {

                   
                    "ApplyModifier" // применить модификатор
                    {
                        "Target"            "TARGET" // определяем цель, как цель автоатаки
                        "ModifierName"        "modifier_drow_ranger_frost_arrows_slow" //название модификатора (тут у нас замедло траксы осталось с оригинальной абилки. я не стал его убирать)
                        "Duration"            "%slow_duration" //длительность действия модификатора (опять тут ссылка на переменную)
                    }

                    "Stun" // применить стан
                    {
                        "Target"        "TARGET" // по цели автоатаки
                        "Duration"        "%duration" //длительность со ссылкой
                        "Height"        "0" // я так понимаю, высота подброса (для таких вещей как стан Лиона и тд.)
                        "ShouldStun"    "1" // застанит ли врага этот стан (странный параметра, не особо разобрался)
                    }
          "CreateBonusAttack" // Это кусок ульта ВРки. Создаёт вторую стрелу, для реализации моего рикошета
                    {
                        "Target" // Определяем цель, но не просто значением "TARGET". Если мы так сделаем, то у нас выйдет геминейт аттак вивера. Мы делаем, чтобы цель определялась в радиусе, от первой цели.
              {
                                "Center"        "TARGET" // центр круга определения - цель первой атаки
                                "Radius"        "%bonus_arrow_radius" //радиус круга определения - ссылка на переменную
                "Teams"            "DOTA_UNIT_TARGET_TEAM_ENEMY" // команда цели
                                "Types"            "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC" // тип цели
                                "MaxTargets"    "1" // и максимум целей
                            }
                        }
                }


Мы закончили с модификаторами. Абилка сделана. Но у нас есть ещё парочка несуществующих переменных, на которые мы сослались. Определим их для игры.

Начинаем перечислять их после списка модификаторов.

Код:
"Modifiers"
{

}
<-----здесь----->

Код:
        "AbilitySpecial" //заголовок для области перечисления переменных
        {
            "01" //нумерация переменных
            {
                "var_type"                        "FIELD_FLOAT" //тип переменных
                "duration"                        "5" // пара переменная-значение (тут - duration = 5)
            }
            "02"
            {
                "var_type"                        "FIELD_INTEGER"
                "knockback_distance"            "1"
            }
            "03"
            {
                "var_type"                        "FIELD_FLOAT"
                "slow_duration"                    "0 0 0 0"
            }
            "04"
            {
                "var_type"                        "FIELD_INTEGER"
                "frost_arrows_movement_speed"    "0 0 0 0"
            }
      "05"
            {
                "var_type"                        "FIELD_INTEGER"
                "bonus_arrow_radius"            "200 250 300 350"
            }
        }


В итоге, полученный код сохраняем, ищем нужного героя и меняем его, допустим "Ability 1" на нашу "название_способности"

В игре всё, теоретически, должно работать.

В итоге

Весь код абилки:

Код:
"sniper_frost_wing"
    {
        // General
        //-------------------------------------------------------------------------------------------------------------
        "BaseClass"                       "ability_datadriven"
        "ID"                    "5003"
        "AbilityTextureName"          "venomancer_venomous_gale"
        "AbilityUnitTargetTeam"            "DOTA_UNIT_TARGET_TEAM_ENEMY"
        "AbilityBehavior"                "DOTA_ABILITY_BEHAVIOR_UNIT_TARGET | DOTA_ABILITY_BEHAVIOR_AUTOCAST | DOTA_ABILITY_BEHAVIOR_ATTACK"
        "AbilityCastAnimation"         "ACT_DOTA_ATTACK"
        "AbilityUnitTargetType"         "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC | DOTA_UNIT_TARGET_MECHANICAL"

        // Casting
        //-------------------------------------------------------------------------------------------------------------
        "AbilityCastRange"               "625"
        "AbilityCastPoint"               "0.0 0.0 0.0 0.0"

        // Time   
        //-------------------------------------------------------------------------------------------------------------
        "AbilityCooldown"                "3.0 2.5 2.0 1.5"
       
        // Cost
        //-------------------------------------------------------------------------------------------------------------
        "AbilityManaCost"                "3"

       
       

        "Modifiers"
        {
            "modifier_sniper_frost_wing"
            {
                "Passive"        "1"
                "Orb"
                {
                    "Priority"            "DOTA_ORB_PRIORITY_ABILITY"
                    "ProjectileName"    "drow_frost_arrow"
                    "CastAttack"        "1"
                }

                "OnOrbFire"
                {
                    "SpendMana"
                    {
                        "Mana"    "%AbilityManaCost"
                    }
         
                    "FireSound"
                    {
                        "EffectName"            "Hero_DrowRanger.FrostArrows"
                        "Target"                "CASTER"
                    }
         
                }

                "OnOrbImpact"
                {
                   
                    "ApplyModifier"
                    {
                        "Target"            "TARGET"
                        "ModifierName"        "modifier_drow_ranger_frost_arrows_slow"
                        "Duration"            "%slow_duration"
                    }

                    "Stun"
                    {
                        "Target"        "TARGET"
                        "Duration"        "%duration"
                        "Height"        "0"
                        "ShouldStun"    "1"
                    }
          "CreateBonusAttack"
                    {
                        "Target"
              {
                                "Center"        "TARGET"
                                "Radius"        "%bonus_arrow_radius"
                "Teams"            "DOTA_UNIT_TARGET_TEAM_ENEMY"
                                "Types"            "DOTA_UNIT_TARGET_HERO | DOTA_UNIT_TARGET_BASIC"
                                "MaxTargets"    "1"
                            }
                        }
                }
            }
        }
       
        // Special  
        //-------------------------------------------------------------------------------------------------------------
        "AbilitySpecial"
        {
            "01"
            {
                "var_type"                        "FIELD_FLOAT"
                "duration"                        "5"
            }
            "02"
            {
                "var_type"                        "FIELD_INTEGER"
                "knockback_distance"            "1"
            }
            "03"
            {
                "var_type"                        "FIELD_FLOAT"
                "slow_duration"                    "0 0 0 0"
            }
            "04"
            {
                "var_type"                        "FIELD_INTEGER"
                "frost_arrows_movement_speed"    "0 0 0 0"
            }
      "05"
            {
                "var_type"                        "FIELD_INTEGER"
                "bonus_arrow_radius"            "200 250 300 350"
            }
        }
    }

Что же я получил на выходе:
1. Автокастовый модификатор автоатаки. :)
2. С манакостом. :)
3. Но без кд. :(
4. Станит врага при попадании, но наносит урон. ::)
5. При попадании создаёт новую автотатаку, которая вылетает из моего героя и попадает в рандомную цель в радиусе. :(

2.5 пункта из пяти. Почему? Потому что я не знаю всех перменных кода, который написаль в Valve.
Вы скажете: так возьми событие "OnOrbImpact" и напиши в коде, чтобы заместо "CreateBonusAttack" выполнялось действие типа "Rikoshet In Other Enemy Without Damage". Я отвечу: не могу, я не знаю какая переменная даёт такой эффект. Бонусную атаку даёт "CreateBonusAttack", стан - "Stun", а нужный мне эффект - не знаю. Где же твой реверс инженеринг? - спросите вы. "Подсмотри как делать рикошет у, например, Луны."
А вот тут и главная загвоздка - там, в коде абилки рикошета Луны, ничего об этом нету. Информация о стандартных абилках DotA 2 хранится где-то глубоко в ядре, и я туда не смог добраться. А в тхт-файлах представлены просто поверхностные сведения. Из них полезной информации не извлечёшь.

И так - со всеми переменными. Единственный источник примеров - другие, более пытливые моддеры и npc_custom_abilities.txt в папке режимы Ночи Прзраков, который содержит изменённые абилки героев с этого режима. Там-то сведения относительно полные, и можно подчерпнуть переменных, чем я и воспользовался.

Поэтому, если вы хотите сделать свою способность - либо учите ЛУА и пишите код с нуля, либо ищите список всех переменных. Иначе у вас вряд ли получится то, что вы хотели сначала.

Заключение

Русское комьюнити D2WT сильно страдает от недостатка информации по скриптингу. В то время, как иноязычные моддеры собираются в довольно крупные сообщества в России D2WT, видимо, мало кого интересует.
Этот туториал содержит ОЧЕНЬ базовые знания о создании абилок в DotA 2, но, на безрыбье и этот, сделанный на коленке, туториал может быть полезным. Именно поэтому я его выложил, не обессудьте.
Никогда не бойтесь спрашивать, я всегда поделюсь крохами знаний. И сами делитесь, потому что у меня ещё куча всего, чему я хотел бы научиться.
А есть ли где небудь(не нашел) сбор всех способностей из доты(стандартных) нужно найти как называется способность осадная единица(дамаг по таверам увеличвается) а не могу найти.
 

MrJaJa

Новичок
28 Апр 2022
2
0
А есть ли где небудь(не нашел) сбор всех способностей из доты(стандартных) нужно найти как называется способность осадная единица(дамаг по таверам увеличвается) а не могу найти.
"creep_siege"
{
// General
//-------------------------------------------------------------------------------------------------------------
"ID" "912" // unique ID number for this ability. Do not change this once established or it will invalidate collected stats.
"AbilityBehavior" "DOTA_ABILITY_BEHAVIOR_PASSIVE"
"MaxLevel" "1"


// Special
//-------------------------------------------------------------------------------------------------------------
"AbilityValues"
{
"bonus_building_damage" "150"
"incoming_hero_damage_penalty" "-50"
"incoming_basic_damage_penalty" "-30"
}
}
 

MrJaJa

Новичок
28 Апр 2022
2
0
А есть ли где небудь(не нашел) сбор всех способностей из доты(стандартных) нужно найти как называется способность осадная единица(дамаг по таверам увеличвается) а не могу найти.
 

Вложения

  • npc_abilities.txt
    3 MB · Просмотры: 2
Реклама: