Решили: заряд усиленной авто-атаки снимается по тегу, который объявил сам компонент
(EmpowerNextAttackComponent._consumeTag, новый EffectTag.Empowered), а не по жёстко вбитому
Stealth. Заодно заряд научился толкать цель (_knockbackDistance → RuntimeUnit.EmpowerKnockback).
Почему: до этого AutoAttackSystem тратил заряд диспелом EffectTag.Stealth — потому что
единственным носителем усиления был Убийца, у которого удар и правда выводит из тени. «Восходящий
удар» Монаха воды — тот же заряд, но никакого стелса рядом нет: со старым кодом удар либо срывал бы
скрытность, которой нет, либо (что и происходило бы) не снимал заряд вовсе, и кит бил бы усиленно
всегда. Альтернатива «хранить ссылку на выдавший эффект» отвергнута: компоненты stateless и шарятся
между носителями, своего экземпляра у них нет, а тег у эффекта уже есть и проверяется битовой маской.
Толчок отдан заряду, а не отдельному реактиву на «я попал», потому что заряд снимается в момент снятия цифр удара — реактив «на удар» к моменту прилёта уже не висел бы.
Грабли: толкает только ближний одиночный удар. Линия не толкает (кого из четверых уносить —
вопрос без ответа), снаряд тоже: его попадание случается в ProjectileSystem позже и без снятых
цифр этого удара.
Владелец правды: EmpowerNextAttackComponent.cs, AutoAttackSystem.Resolve/PushIfEmpowered,
тест EmpowerChargeContractTests (тег компонента обязан быть на самом эффекте, и эффект обязан быть
снимаемым — иначе усиление не израсходуется никогда).