Решили: врагу с блоком выдаём свой AI-пресет (ai_preset.goblin_blocker,
ai_preset.bandit_blocker) вместо того, чтобы включить триггер в общем пресете фракции. Бонус урона в
тыл и бонус стаи волка сделаны компонентами через существующий шов IOutgoingDamageBonusComponent, а
антихил — четырьмя ассетами шкалы поверх стата HealShieldTakenEff, без нового кода.
Почему: BlockComponent читает условие срабатывания не из своего ассета, а из
Unit.Ai.PassiveTrigger — то есть щит поднимается только у юнита, чей профиль этого разрешает.
Эффект и профиль обязаны ставиться парой; альтернатива (поднять AnyHit в общем GoblinMelee, где
сидят ещё grunt и командир) сегодня безвредна, но триггер читает и DodgeComponent — первое же
уклонение у соседа заработало бы «бесплатно» и молча. Бонус стаи через способность-ауру
(AlliesInRadius) отвергнут дважды: баф не гаснет в момент смерти союзника, а ApplyAllyAura по
контракту бафает кастующего — одинокий волк получал бы бонус за самого себя.
Грабли: мандат Фазы 2 числил антихил новым кодом, а он оказался чистой датой — стат
HealShieldTakenEff разведён в CombatSimulation с самого начала и лежал неиспользованным. Второе:
RearStrikeEffectComponent на «удар в тыл» не годится намеренно — он добавляет цели ЭФФЕКТ и силы не
несёт, поэтому множитель урона поехал в отдельный компонент, а не полем в него.
Владелец правды: BlockComponent.cs (триггер), RearDamageBonusComponent.cs,
AllyProximityDamageBonusComponent.cs, тест EnemyKitsSliceTests.