Сокрытие юнитов ("астралы")

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

О проблемах, фичах и особенностях паузы есть отдельный блог, написанный давным давно.

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

О сокрытии юнита

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

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

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

При сокрытии также слетает выделение с юнита, сбрасывая его у всех игроков. Чтобы эта деталь не мешала играть, юнита выбирают заново игроку, который им владеет. Поэтому в реплеях, например, хост на Шторме будет постоянно выбираться после ульты, независимо от обстоятельств.

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

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


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

Спрятанный юнит не может взаимодействовать с предметами или рунами. Поэтому, например, из ботла может выпасть руна, если оказаться в таком состоянии в момент активации (в версии фрога).

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

Анти-пауза в 85

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

По этой причине нельзя было просто взять и усыпить цель — чтобы нанести урон, пришлось бы снимать неуязвимость, выводить на поверхность, и снова как-то прокидывать сон с неизвестной длительностью. Поэтому первым костылем стала реализация через стан.

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

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

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

Развязка этой эпопеи костылей вряд ли бы наступила, если бы не мемхак.

Как сделано теперь

Теперь юнит теряет возможность ходить, аналогично эффекту сетки, и не может атаковать. Всё. Это единственное, что требуется от скилла, и задача выполняется безупречно. Герой не может убежать, не может огрызаться, а мирно стоит и ждет, что произойдет дальше. При этом в любой момент можно снять неуязвимость, внести урона и вернуть неуязвимость на место.

Вот так легко и непринужденно можно закрыть баг с продлением бафов и дебафов, которому почти стукнуло сто лет. Пауза — грязь, от которой нужно избавляться при каждой возможности, что и было проделано на пути к 88.

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

avatar
жду пост о том, что будет спизжено из 700 в 88, и будет ли
avatar
хочу фиксы системы рутов и что-то еще, они make sense и просто делают игру приятнее
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.