Rubick's Journey. Это моя тема, и тут мои вопросы для моей кастомки

.фи

Активный
21 Мар 2018
117
16
Пара часов мозготраха, и теперь я точно знаю как убрать пустые слоты у рубика с первого запуска.
В npc_heroes_custom прописываем ему:

"Ability4" "doom_empty1"
"Ability5" "doom_empty2"

Это упрощает ситуацию, однако 7 и 8 слоты (после появления украденных скиллов) не имеют hotkey.

Можно ли их как-нибудь вписать?
 

.фи

Активный
21 Мар 2018
117
16
Индексы идут с 0

Спасибо, это мне известно.

У Рубика пустые слоты имеют индекс 4 и 5. Именно их я и прописал.
Сегодня попробую удалить все скиллы кроме кастомного, и посмотрю что из этого выйдет.

Может кто-нибудь из админов подскажет что делать в этой, казалось бы, безвыходной ситуации.
 
20 Дек 2016
892
170
Спасибо, да я уловил ход мыслей. Но, увы и ах, не вышло.

Более того, теперь ворованный скилл ещё и не прокачан.
+ консоль ругается что Parameter Type mismatch stack traceback.

В keys хранится вот что:
Код:
"RunScript"
        {
            "ScriptFile"    "heroes/hero_doom_bringer/devour.lua"
            "Function"        "Devour"
            "modifier"        "modifier_devour_datadriven"
            "doom_empty1"    "doom_bringer_empty1_datadriven"
            "doom_empty2"    "doom_bringer_empty2_datadriven"
Пара часов мозготраха, и теперь я точно знаю как убрать пустые слоты у рубика с первого запуска.
В npc_heroes_custom прописываем ему:

"Ability4" "doom_empty1"
"Ability5" "doom_empty2"

Это упрощает ситуацию, однако 7 и 8 слоты (после появления украденных скиллов) не имеют hotkey.

Можно ли их как-нибудь вписать?

Код:
    "Ability4"                    "doom_bringer_empty1_datadriven"
    "Ability5"                    "doom_bringer_empty2_datadriven"
И не забудь прописать эти абилки в abilities_custom. Если хочешь, чтобы слоты не были видны, поставь DOTA_ABILITY_BEHAVIOR_HIDDEN в AbilityBehavior в описании этих абилок
 

.фи

Активный
21 Мар 2018
117
16
Код:
    "Ability4"                    "doom_bringer_empty1_datadriven"
    "Ability5"                    "doom_bringer_empty2_datadriven"
И не забудь прописать эти абилки в abilities_custom. Если хочешь, чтобы слоты не были видны, поставь DOTA_ABILITY_BEHAVIOR_HIDDEN в AbilityBehavior

Почему именно в custom?
Я их прописал в override.
 
Последнее редактирование:

.фи

Активный
21 Мар 2018
117
16
Всё было проще хозяйственного мыла. Вот как это решается:

Devour.lua
local doom_empty1 = keys.doom_empty1
local doom_empty2 = keys.doom_empty2

ищут ключи в abilities_override:
"doom_empty1" "rubick_empty1"
"doom_empty2" "rubick_empty2"

Так как изначально рубик стартует с этими пресловутыми пустыми_слотами, ключи их подменяют в процессе.
Это, конечно, было нетрудно понять. Но нужно было выспаться :)
 

.фи

Активный
21 Мар 2018
117
16
Новый вопрос. Пытаюсь воссоздать телекинез рубика, чтоб можно было давать его на себя.

Код:
"OnSpellStart"
    {
        "ApplyMotionController"
        // For this: gfycat.com/BraveHideousGiantschnauzer -> check: bit.ly/1KWulqA
        {
            "Target"         "CASTER"
            "ScriptFile"    "heroes/hero_rubick/telekinesis.lua"
            "VerticalControlFunction"     "анимация поднятия в воздух"       
        }
    }

Что конкретно вписать в функции чтоб цель подкидывало в воздух на определенное расстояние?

До этого:
Я пытался установить модифаер, с параметром [MODIFIER_STATE_FLYING] = true,
Однако, это выглядит слишком криво, особенно когда цель умирает в воздухе.

То есть конечно я могу скопировать код из SpellLibrary, но мне нужен полный курс Lua как local caster = keys.target превращать в local hCaster = self:GetCaster() и т.д.
 
Последнее редактирование:
20 Дек 2016
892
170
Код:
"VerticalControlFunction"     "анимация поднятия в воздух"

Прописываешь имя функции из луа-файла. Она будет вызываться по 30 раз в секунду, пока не будет прерван MotionController. Рассчитываешь нужную высоту и задаешь ее цели через SetOrigin().
А вообще я не могу поянть твоей тяги к ability_datadriven, если больше половины кода для твоих задач приходится писать на луа.
 

.фи

Активный
21 Мар 2018
117
16
Прописываешь имя функции из луа-файла. Она будет вызываться по 30 раз в секунду, пока не будет прерван MotionController. Рассчитываешь нужную высоту и задаешь ее цели через SetOrigin().
А вообще я не могу поянть твоей тяги к ability_datadriven, если больше половины кода для твоих задач приходится писать на луа.

А разве не нужно в datadrivern вписывать скилл, перед тем как ссылаться на Луа?

Я был бы ОЧЕНЬ благодарен если бы ты привёл пример lua на MotionController который просто поднимает в воздух цель!
 
20 Дек 2016
892
170
А разве не нужно в datadrivern вписывать скилл, перед тем как ссылаться на Луа?

Я был бы ОЧЕНЬ благодарен если бы ты привёл пример lua на MotionController который просто поднимает в воздух цель!
Есть два способа создания кастомных способностей - ability_datadriven и ability_lua. Во втором случае в кв прописываются только AbilitySpecial и все, что обычно пишется до него. Модификаторы же и само действие способности пишутся на lua.
Вот пример телекинеза на луа, тебя больше всего должно интересовать UpdateVerticalMotion.
 
  • Нравится
Реакции: .фи

.фи

Активный
21 Мар 2018
117
16
Есть два способа создания кастомных способностей - ability_datadriven и ability_lua. Во втором случае в кв прописываются только AbilitySpecial и все, что обычно пишется до него. Модификаторы же и само действие способности пишутся на lua.
Вот пример телекинеза на луа, тебя больше всего должно интересовать UpdateVerticalMotion.

Любопытно. Спасибо за ссылку, буду учиться дальше.
 

.фи

Активный
21 Мар 2018
117
16
Я осилил код и разбил его по папкам: луа и 3 модифаера.

Однако, есть проблема с GetCooldownReduction и GetCastRangeIncrease.
В первом случае - метод не найден, во втором - глобальная переменная не объявлена.

Вероятно, это код мода у которого свой, отличный от моего addon_game_mode.lua или gamemode.lua

И есть ли предел количества параметров AbilitySpecial ?
У меня их вышло аж 12, переписанных с примера.
 

.фи

Активный
21 Мар 2018
117
16
Подумал ещё немного, получается:
GetCooldownReduction - это 25-талант к уменьшению кд 1ого скилла,
GetCastRangeIncrease - это 20-талант к увеличению рэнджа.

Но почему движок их не видит o_O
 
20 Дек 2016
892
170
Подумал ещё немного, получается:
GetCooldownReduction - это 25-талант к уменьшению кд 1ого скилла,
GetCastRangeIncrease - это 20-талант к увеличению рэнджа.

Но почему движок их не видит o_O
Потому что это функции, которые автор аддона написал сам, в стандартных апи их нет. Ты можешь либо поискать их у него в аддоне либо использовать другие методы.
Например для рассчета кулдауна ты можешь при старте способности (OnSpellStart) записывать текущее время и оставшуюся длительность прям в поля способности.
Lua:
self.start_time = GameRules:GetGameTime()
self.duration = self:GetCooldownTimeRemaining()
А там, где задается кулдаун (это уже происходит в OnDestroy модификатора), рассчитывать оставшийся кулдаун, опять же исходя из текущего времени
Lua:
local cooldown = self:GetAbility().start_time + self:GetAbility().duration - GameRules:GetGameTime() --т.к. поля start_time и duration были записаны в способность, а сейчас код выполняется в контексте модификатора, нужно вначале получить способность через GetAbility, в которую записаны данные
cooldown = math.max( 0, cooldown ) --чтобы кулдаун не был отрицательным. Вообще, думаю,эту строку можно и убрать (ибо при запуске кулдауна через апи отрицательные числа автоматически повышаются до нуля), но на всякий случай пусть будет.
self:GetAbility():StartCooldown(cooldown)

А если тебе принципиально важно, чтобы дальность броска увеличивалась бонусами к дальности каста (хотя в обычной доте этого не происходит), то тут только искать его метод GetCastRangeIncrease, либо пытаться писать самому.
 

.фи

Активный
21 Мар 2018
117
16
Потому что это функции, которые автор аддона написал сам, в стандартных апи их нет. Ты можешь либо поискать их у него в аддоне либо использовать другие методы.
Например для рассчета кулдауна ты можешь при старте способности (OnSpellStart) записывать текущее время и оставшуюся длительность прям в поля способности.
Lua:
self.start_time = GameRules:GetGameTime()
self.duration = self:GetCooldownTimeRemaining()
А там, где задается кулдаун (это уже происходит в OnDestroy модификатора), рассчитывать оставшийся кулдаун, опять же исходя из текущего времени
Lua:
local cooldown = self:GetAbility().start_time + self:GetAbility().duration - GameRules:GetGameTime() --т.к. поля start_time и duration были записаны в способность, а сейчас код выполняется в контексте модификатора, нужно вначале получить способность через GetAbility, в которую записаны данные
cooldown = math.max( 0, cooldown ) --чтобы кулдаун не был отрицательным. Вообще, думаю,эту строку можно и убрать (ибо при запуске кулдауна через апи отрицательные числа автоматически повышаются до нуля), но на всякий случай пусть будет.
self:GetAbility():StartCooldown(cooldown)

А если тебе принципиально важно, чтобы дальность броска увеличивалась бонусами к дальности каста (хотя в обычной доте этого не происходит), то тут только искать его метод GetCastRangeIncrease, либо пытаться писать самому.

Понял. Но у меня ещё один вопрос:
Примеры, как тот что ты запостил выше, лучше всего разбивать или хранить в одном луа?
 
20 Дек 2016
892
170
Понял. Но у меня ещё один вопрос:
Примеры, как тот что ты запостил выше, лучше всего разбивать или хранить в одном луа?
Как тебе удобнее. Если ты знаешь, что ты делаешь и понимаешь, в каком случае это может привести к ошибке, то хранить модификаторы и абилку в одном файле удобнее, да и то не для всех. А некоторые уникумы хранят в одном файле вообще все способности в их моде.
 

.фи

Активный
21 Мар 2018
117
16
Всем привет,
Вышел новый патч.

Не подскажете где можно взять названия новых скиллов?

К примеру:

1 скилл хускара, что отталкивает и вешает модифаер дизарма.
 

HappyFeedFriends

Друзья CG
14 Авг 2017
540
32
Проект
Battle Heroes Arena
Потому что это функции, которые автор аддона написал сам, в стандартных апи их нет. Ты можешь либо поискать их у него в аддоне либо использовать другие методы.
Например для рассчета кулдауна ты можешь при старте способности (OnSpellStart) записывать текущее время и оставшуюся длительность прям в поля способности.
Lua:
self.start_time = GameRules:GetGameTime()
self.duration = self:GetCooldownTimeRemaining()
А там, где задается кулдаун (это уже происходит в OnDestroy модификатора), рассчитывать оставшийся кулдаун, опять же исходя из текущего времени
Lua:
local cooldown = self:GetAbility().start_time + self:GetAbility().duration - GameRules:GetGameTime() --т.к. поля start_time и duration были записаны в способность, а сейчас код выполняется в контексте модификатора, нужно вначале получить способность через GetAbility, в которую записаны данные
cooldown = math.max( 0, cooldown ) --чтобы кулдаун не был отрицательным. Вообще, думаю,эту строку можно и убрать (ибо при запуске кулдауна через апи отрицательные числа автоматически повышаются до нуля), но на всякий случай пусть будет.
self:GetAbility():StartCooldown(cooldown)

А если тебе принципиально важно, чтобы дальность броска увеличивалась бонусами к дальности каста (хотя в обычной доте этого не происходит), то тут только искать его метод GetCastRangeIncrease, либо пытаться писать самому.
Если под дальность броска имеется ввиду дальность абилок, то это изи.
 
Реклама: