Huskar - современный Герострат

Джасс разборов не было по разным причинам. Сперва мы пошли делать патчи самостоятельно — не было времени. Потом нужно было искать на что жить — не было времени. Наконец, стало две версии — моя и фрога. По какой же делать? Проще забить. Но теперь время есть, так что почему бы нет. В дальнейшем разборы будут касаться нашей Allstars версии. Код фрога, как легаси, будет вспоминаться максимум в контексте «как делать не надо».



Относительно старый герой, способный поджечь как в игре, так и стул, на котором сидит враг. Или союзник, если игрок так себе. Как обычно, чем дольше герой был в доте, тем примитивнее его способности. В конце концов, освоение редактора — это длительный процесс, хотя некоторые и думают, что могут лучше (да, я тоже).


Inner Vitality — A0QP
Основано на канале ANcl, что обеспечивает прицел и возможность кастовать на маг иммунных союзников.

При касте проверяет, нет ли на цели уже работающего Inner Vitality. Если такого не обнаруживается, создается периодический таймер, тикающий 10 раз в секунду, а также отслеживается любая смерть (включая реинкарнацию). Если баф уже был, то подгружается старый таймер и дописывается, что он должен тикнуть еще 160 раз (16 сек). Затем добавляется псевдо-аура, которая обеспечивает баф, и записывается ассист Хускару.

На каждом тике проверяется, какой атрибут у цели основной, и высчитывается реген, эквивалентно тому, что уже есть в описании навыка. Если у цели осталось менее 35% хп, то реген за атрибуты увеличивается в 4 раза. Затем проверяется, что это не смерть юнита. Если цель жива, и высчитанный реген не равен тому, который был выдан раньше (0 на первом тике), добавляется разница и сохраняется новый реген.

Если цель все же умирает, то снимается дамми-аура и бонусный реген, триггер закрывается. Аналогичные действия выполняются, если количество срабатываний триггера превысило ранее записанное количество (при касте), или баф был снят с юнита чем-либо еще.


Burning Spears — A0QN
Основано на ледяной броне AUfu, что обеспечивает возможность автокаста и целеуказание. Доступные цели — только враги, поэтому сам по себе автокаст не срабатывает).

При первом изучении создается триггер, который отслеживает каждый приказ юнита по цели и без цели. Если приказ равен включению автокаста, то записывается, что автокаст был активирован. Если это отключение, соответственно, сохраняется статус «выкл». При этом выдается или забирается отдельная способность, превращающая обычную атаку визуально в огненную.

Если приказ эквивалентен применению ледяной брони по цели, то юниту отдается приказ «стоп», а затем — вручается огненная анимация и приказ атаки по цели. Чтобы крипы не подумали, что это обычная атака, используется глобальная переменная, активируемая строго при этой атаке. Цель сохраняется отдельно, чтобы в дальнейшем отключить огненную анимацию.

Глобальная система отлова атак самостоятельно снимает огненную анимацию, когда выстрел завершен. Она же вызывает функцию, которая проверяет, можно ли применить поджог. Для этого цель должна быть живым существом (не зданием), не иметь маркера и быть врагом, при этом — без иммунитета к магии.

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

При срабатывании поджога, опять же, забирается анимация огня со стрел, если это была одиночная атака, и создается таймер, тикающий раз в секунду. После этого у хускара забирается 15 хп. Отдельно на цели создается спецэффект горения, чтобы точнее видеть, сколько стаков на юните, а также добавляется дамми-аура, подсказывающая, что горение все еще идет. Она действует независимо от горения, длится 8 секунд и снимается при смерти.

При тике таймера сразу наносится урон по цели. Если после этого количество тиков равно 8, или цель мертва, то таймер стирается вместе с эффектом огня. При этом никак не отлавливатся факт смерти или реинкарнации, что, в принципе, не имеет значения, т.к. таких быстрых реинкарнаций все равно нет.

Откуда такой велосипед? Потому что не было мемхака, не было детекта атаки, и всё было неочень. Не было гарантии, что атака завершена, не было гарантии, что это та самая атака, и т.д. Придет время — нужно будет переписать, возможно. уже завтра.


Berserker's Blood — A0QQ
Основано на Demolish (ANde) (теперь на AEev, нафиг плодить сущности), которая обеспечивает иконку.

При изучении создается триггер, который следит за всем уроном, который входит в Хускара, а также постояннл отсчитывает по 0.5 секунды таймером. При каждом тике проверяется, что уровень пассивки выше 0, или входящий урон больше 0. Затем — а жив ли вообще герой? Эта проверка, на деле, нафиг не нужна, поэтому прямо сейчас стер.

Если герой находится под Break, т.е. пассивка отключена, то все бонусы выставляются на 0. Иначе — по особой формуле, учитывающей текущее хп, линейно подбирая бонус скорости атаки и сопротивления к магии.

Если сохраненные бонусы не совпадают с новыми, то производится модификация (если было меньше — добавить, иначе — отнять). Если процент здоровья ниже 40%, то еще добавляются два визуальных эффекта, которые исчезнут, когда хп перевалят за 40%.

Для выдачи скорости атаки используются стандартные способности. Выдача маг резиста производится через способность с динамически регулируемым сопротивлением. На данный момент в игре таких может быть не более 13 штук (что, в принципе, более, чем достаточно). Это стало возможно с появлением мемхака. У фрога использовалось 28 абилок, поднимающих резист ступенями по 4%.


Life Break — A0QR (A1B3)
Основаны на канале (ANcl), что обеспечивает иконочку.

При касте проверяет, не от лотуса ли это обраточка. Если так, то назначает хускаром героя, который был целью. Далее включается таймер на 0.015 (писос как быстро), а также подрубается событие «хускар умирает». Потом выключаем проходимость хускару, чтобы он ехал через скалы, добавляем маг иммун, снимаем лишнюю грязь-дебафы. Затем активируем подходящую анимацию бега и ускоряем её!

При каждом срабатывании триггера хускара заставляют вновь проиграть анимацию, чтобы он, не дай бог, не занялся чем-то еще. Если триггер вызвался, потому что хускар умер, или попал в какой-то дизейбл, или цель убежала за дальность 1400, то разбег заканчивается неудачно. Если же между целью и хускаром расстояние менее 125, то разбег заканчивается удачей. Наконец, если еще надо бежать и бежать, хускара жестко передвигают на 15 в направлении цели. Это и не позволяет ему атаковать окружающих во время разбега.

При завершении разбега возвращается проходимость, снимается маг иммун, восстанавливается нормальная скорость анимации.

Если разбег закончился успешно и цель достигнута, то отдается приказ атаковать и переходим к нанесению урона. Для этого находим уровень ульты и узнаем, присутствовал ли при этом аганим. Добавляем цели ауру замедления, которая, собственно, замедляет, а также создает иконочку в статусе о замедлении. Наносим урон хускару, затем — цели. Все цифры из описания верны. Наконец, проигрываем пару эффектов — кровь на хускаре, огонек — на цели.

Фрог прерывал разбег из-за расстояния, только если цель перемещалась больше, чем на 1400, между тиками. Это все же далеко не лучшая характеристика — тот же эмбер перебегает до ремнантов очень плавно. Это позволяет затащить на фонтан неосторожного хусика и там за милую душу забрать фраг. Но вот с теми, кто перемещается действительно мгновенно, такой фокус не провернуть.

3 комментария

avatar
Ну это ты уже переделал, у фрога было куда ущербнее.
avatar
Ульту стоит переписать, станить хускара кастом стуном и двигать плавным перемещением, по координатам по 47 ренжа 32 раза в сек. чтобы не нагружать движок бестолку. Реньж проверять от точки каста а не от расстояние, это поможет всем блинкерам уворачиватся от ульта хускара как и должно быть, а не так как это сейчас есть.
avatar
Чекать ренж от местоположения цели, и ещё местоположения .03 секунды назад, если оно больше хотя бы 100., то уже можно сбрасывать цель и волочить Хуска в точку обрыва, в итоге он влетит в землю и ничего не сделает (потому что именно так работают стандартные скиллы — летят в место где была цель).
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.