Решили: врагу с блоком выдаём свой 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.