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

  • Автор темы Автор темы .фи
  • Дата начала Дата начала
Пара часов мозготраха, и теперь я точно знаю как убрать пустые слоты у рубика с первого запуска.
В npc_heroes_custom прописываем ему:

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

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

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

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

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

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

Более того, теперь ворованный скилл ещё и не прокачан.
+ консоль ругается что 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 в описании этих абилок
 
Код:
    "Ability4"                    "doom_bringer_empty1_datadriven"
    "Ability5"                    "doom_bringer_empty2_datadriven"
И не забудь прописать эти абилки в abilities_custom. Если хочешь, чтобы слоты не были видны, поставь DOTA_ABILITY_BEHAVIOR_HIDDEN в AbilityBehavior

Почему именно в custom?
Я их прописал в override.
 
Последнее редактирование:
Всё было проще хозяйственного мыла. Вот как это решается:

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

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

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

Код:
"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() и т.д.
 
Последнее редактирование:
Код:
"VerticalControlFunction"     "анимация поднятия в воздух"

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

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

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

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

Любопытно. Спасибо за ссылку, буду учиться дальше.
 
Я осилил код и разбил его по папкам: луа и 3 модифаера.

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

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

И есть ли предел количества параметров AbilitySpecial ?
У меня их вышло аж 12, переписанных с примера.
 
Подумал ещё немного, получается:
GetCooldownReduction - это 25-талант к уменьшению кд 1ого скилла,
GetCastRangeIncrease - это 20-талант к увеличению рэнджа.

Но почему движок их не видит O.o
 
Подумал ещё немного, получается:
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, либо пытаться писать самому.
 
Потому что это функции, которые автор аддона написал сам, в стандартных апи их нет. Ты можешь либо поискать их у него в аддоне либо использовать другие методы.
Например для рассчета кулдауна ты можешь при старте способности (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, либо пытаться писать самому.

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

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

К примеру:

1 скилл хускара, что отталкивает и вешает модифаер дизарма.
 
Потому что это функции, которые автор аддона написал сам, в стандартных апи их нет. Ты можешь либо поискать их у него в аддоне либо использовать другие методы.
Например для рассчета кулдауна ты можешь при старте способности (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, либо пытаться писать самому.
Если под дальность броска имеется ввиду дальность абилок, то это изи.
 
Реклама: