Наносит 240 ед. урона указанной боевой единице или строению.
Поражает наземные и воздушные цели.

Способность из кампании Legacy of The Void. Принадлежит одной из вариации бессмертного протоссов, а именно Аннигилятору Неразимов.
Для корректной работы требует только подключенную к карте стандартную модификацию Liberty.SC2Mod
Видеодемонстрация

Ну что... Это обычная способность применяемая на цель с дальностью применения равным 13. Также при "подготовке к применению" на юните вызывается эффект ShadowCannon@AB@DisableWeapon (Это поле PrepEffect в способности). Это нужно для того чтобы единица не могла попутно ещё кого-то атаковать своей атакой пока кастует способность, так как способность как видно имеет долгий эффект действия.

После активации

А после активации у нас тут срабатывает эффект типа Create Persistent ShadowCannon@CP. Это такой эффект, который может циклически делать другие эффекты в течении какого-то времени или сколько-то раз.
Он у нас:
  1. Поворачивает башню юнита в сторону цели (<InitialEffect value="ShadowCannon@Turret"/>)
  2. Далее периодически запускает в эту самую цель множество (а именно 8) снарядов (<PeriodicEffectArray value="ShadowCannon@LM"/>)
  3. А затем в конце концов, очищает "слежение" башни юнита за целью (<FinalEffect value="ShadowCannon@Turret@Clear"/>)
ВАЖНО Этот эффект всё это делает пока жив заклинатель! Это указано в его поле валидаторов!!! (<PeriodicValidator value="NotDead"/>). То есть он каждый свой "Тик", проверяет по этим валидаторам "а стоит ли вообще дальше что-то делать?". Это нужно для того, чтобы в случае смерти заклинателя, снаряды не продолжали вылетать "из ниоткуда"

Слежка башни юнита за целью

Это у нас эффект ShadowCannon@Turret такого типа как Modify Unit. Довольно мощный тип, для разных целей так-то.
Конкретно в этом случае, он просто для заклинателя <ImpactUnit Value="Caster"/>, он управляет "турелью" юнита, а именно заставляя эту турель вращаться к цели. Заметьте что в качестве турели указан Immortal. Туда нужно указывать ту турель, что указана турелью в оружиях юнита.
        <ModifyTurret>
            <Flags index="Tracking" value="1"/>
            <Target Effect="ShadowCannon@CP" Value="TargetUnit"/>
            <Turret value="Immortal"/>
        </ModifyTurret>

Полёт снаряда

Далее просто каждый тик нашего @CP эффекта, запускается эффект который выпускает 1 снаряд. Эффект этот срабатывает 8 раз.
В качестве снаряда выступает отдельно созданный юнит, с моделью снаряда, а точка попадания указана весьма интересно.
        <ImpactLocation Effect="ShadowCannon@CP"/>
Это значит, что берётся целевая единица эффекта ShadowCannon@CP. Так как по сути цепочка срабатываемых эффектов существует всегда, пока активен в игре хотя бы эффект этой цепочки, мы можем представлять эту цепочку отдельным "объектом", это называется кстати "scope эффектов", и таким образом мы можем брать данные для ЛЮБОГО эффекта цепочки от ЛЮБОГО другого эффекта этой же цепочки.
Ну а далее при попадании снаряда в цель, просто наносим ей урон <ImpactEffect value="ShadowCannon@Damage"/>

Визуальная часть - акторы

Ну, так как тут используются снаряды, и нам просто необходимо выпускать эти снаряды из правильных мест модели заклинателя (из пушек). То нам потребуется Action-актор. По простому, это такой актор, который правильно связывает атакующую и атакуемую единицу, и корректно создаёт визуал при их взаимодействии (также помогает чуть сократить общее количество акторов)
У него есть несколько токенов
  • effectImpact
  • effectLaunch
Туда нужно указывать наши эффекты запуска снаряда и попадания

Точки вылета снарядов

А вот точки вылета снарядов сделаны очень интересно (для начинающих).
Тут используются такие штуки как методы крепления. с помощью этого можно определить чуть более сложный шаблон точек крепления, чем "ну вот из головы стреляй".
<LaunchAttachQuery Methods="AMPatternAnnihilator"/>
Как видно тут указан некий метод AMPatternAnnihilator. Это специальный тип объекта... А хотя тут долго пояснять... потом обновлю если не забуду
XML-код
    <CButton id="ShadowCannon">
        <EditorCategories value="Race:Protoss"/>
        <Icon value="Assets\Textures\BTN-Ability-Protoss-ShadowCannon.dds"/>
        <AlertIcon value="Assets\Textures\BTN-Ability-Protoss-ShadowCannon.dds"/>
    </CButton>

    <CAbilEffectTarget id="ShadowCannon">
        <EditorCategories value="Race:Protoss,AbilityorEffectType:Units"/>
        <CmdButtonArray index="Execute" DefaultButtonFace="ShadowCannon"/>
        <Effect index="0" value="ShadowCannon@CP"/>
        <Cost>
            <Cooldown TimeUse="45"/>
        </Cost>
        <TargetFilters value="-;Self,Player,Ally,Missile,Stasis,Dead,Hidden,Invulnerable"/>
        <Range value="13"/>
        <Arc value="360"/>
        <PrepEffect value="ShadowCannon@AB@DisableWeapon"/>
        <PrepTime value="0.0625"/>
    </CAbilEffectTarget>

    <CBehaviorBuff id="ShadowCannon">
        <EditorCategories value="Race:Protoss,AbilityorEffectType:Units"/>
        <Duration value="2"/>
        <InitialEffect value="ShadowCannon@Turret"/>
        <PeriodicEffect value="ShadowCannon@LM"/>
        <FinalEffect value="ShadowCannon@Turret@Clear"/>
        <Period value="0.25"/>
        <InfoFlags index="Hidden" value="1"/>
        <RemoveValidatorArray value="ImmortalShakurasShadowCannonValidators"/>
        <Modification>
            <StateFlags index="SuppressAttack" value="1"/>
        </Modification>
    </CBehaviorBuff>
    <CBehaviorBuff id="ShadowCannon@DisableWeapon">
        <EditorCategories value="Race:Protoss,AbilityorEffectType:Units"/>
        <InfoFlags index="Hidden" value="1"/>
        <Duration value="0.125"/>
        <Modification>
            <StateFlags index="Passive" value="1"/>
            <StateFlags index="SuppressAttack" value="1"/>
        </Modification>
    </CBehaviorBuff>

    <CEffectApplyBehavior id="ShadowCannon@AB">
        <Behavior value="ShadowCannon"/>
        <WhichUnit Value="Caster"/>
    </CEffectApplyBehavior>
    <CEffectApplyBehavior id="ShadowCannon@AB@DisableWeapon">
        <WhichUnit Value="Caster"/>
        <Behavior value="ShadowCannon@DisableWeapon"/>
    </CEffectApplyBehavior>
    <CEffectLaunchMissile id="ShadowCannon@LM">
        <AmmoUnit value="ShadowCannon@AttackMissile"/>
        <ImpactEffect value="ShadowCannon@Damage"/>
        <ImpactLocation Effect="ShadowCannon@CP"/>
        <LaunchLocation Value="CasterUnit"/>
    </CEffectLaunchMissile>
    <CEffectModifyUnit id="ShadowCannon@Turret">
        <ImpactUnit Value="Caster"/>
        <ModifyTurret>
            <Flags index="Tracking" value="1"/>
            <Target Effect="ShadowCannon@CP" Value="TargetUnit"/>
            <Turret value="Immortal"/>
        </ModifyTurret>
    </CEffectModifyUnit>
    <CEffectModifyUnit id="ShadowCannon@Turret@Clear">
        <ImpactUnit Value="Caster"/>
        <ModifyTurret Action="ClearTarget" Turret="Immortal"/>
    </CEffectModifyUnit>
    <CEffectCreatePersistent id="ShadowCannon@CP">
        <WhichLocation Value="TargetUnit"/>
        <!-- <InitialEffect value="ShadowCannon@AB"/> -->
        <InitialEffect value="ShadowCannon@Turret"/>
        <PeriodicEffectArray value="ShadowCannon@LM"/>
        <FinalEffect value="ShadowCannon@Turret@Clear"/>
        <PeriodCount value="8"/>
        <PeriodicPeriodArray value="0.25"/>
        <PeriodicValidator value="NotDead"/>
    </CEffectCreatePersistent>
    <CEffectDamage id="ShadowCannon@Damage" parent="DU_WEAP_MISSILE">
        <Amount value="40"/>
    </CEffectDamage>

    <CActorAction id="ShadowCannon@Attack" parent="GenericAttack" effectImpact="ShadowCannon@Damage" effectLaunch="ShadowCannon@LM">
        <LaunchAttachQuery Methods="AMPatternAnnihilator"/>
        <LaunchAssets Sound="ShadowCannon@AttackLaunch"/>
        <ImpactMap index="None" Sound="ShadowCannon@AttackImpact"/>
        <ImpactSiteOps Ops="SOpAttachHarness SOpAttachVolumeNoVizEnhance SOpForwardLaunchGuide"/>
    </CActorAction>
    <CActorRange id="ShadowCannon@Range" parent="RangeAbil" abil="ShadowCannon">
        <Icon value="Assets\Textures\RadarIcon2.dds"/>
        <IconArcLength value="3.250000"/>
    </CActorRange>
    <CActorMissile id="ShadowCannon@AttackMissile" parent="GenericAttackMissileWithDeathAnim" unitName="ShadowCannon@AttackMissile"/>
    <CActorSimple id="ShadowCannon@Animation">
        <On Terms="ActorOrphan" Send="Destroy"/>
        <!-- <On Terms="Behavior.ShadowCannon.On" Send="Create"/> -->
        <!-- <On Terms="Behavior.ShadowCannon.Off" Send="Destroy"/> -->
        <On Terms="Effect.ShadowCannon@CP.Start; At Caster" Send="Create"/>
        <On Terms="Effect.ShadowCannon@CP.Stop; At Caster" Send="Destroy"/>
        <On Terms="Effect.ShadowCannon@LM.Start; At Caster" Target="_Unit" Send="AnimPlay Spell Attack"/>
    </CActorSimple>

    <CModel id="ShadowCannon@AttackMissile" parent="MissileFX">
        <Model value="Assets\Effects\Protoss\ShadowCannonMissile\ShadowCannonMissile.m3"/>
        <EditorCategories value="Race:Protoss"/>
    </CModel>

    <CSound id="ShadowCannon@AttackImpact" parent="Protoss_ExplosionSmall">
        <AssetArray index="0" File="Assets\Sounds\ImmortalShakuras_ShadowCannon_Impact01_1ch.wav" Pitch="0.000000,0.000000" FacialGroup=""/>
        <AssetArray index="1" File="Assets\Sounds\ImmortalShakuras_ShadowCannon_Impact02_1ch.wav" Pitch="0.000000,0.000000" FacialGroup=""/>
        <AssetArray index="2" File="Assets\Sounds\ImmortalShakuras_ShadowCannon_Impact03_1ch.wav" Pitch="0.000000,0.000000" FacialGroup=""/>
        <AssetArray index="3" File="Assets\Sounds\ImmortalShakuras_ShadowCannon_Impact04_1ch.wav" Pitch="0.000000,0.000000" FacialGroup=""/>
        <AssetArray index="4" File="Assets\Sounds\ImmortalShakuras_ShadowCannon_Impact05_1ch.wav" Pitch="0.000000,0.000000" FacialGroup=""/>
        <AssetArray index="5" File="Assets\Sounds\ImmortalShakuras_ShadowCannon_Impact06_1ch.wav" Pitch="0.000000,0.000000" FacialGroup=""/>
        <AssetArray index="6" File="Assets\Sounds\ImmortalShakuras_ShadowCannon_Impact07_1ch.wav" Pitch="0.000000,0.000000" FacialGroup=""/>
        <AssetArray index="7" File="Assets\Sounds\ImmortalShakuras_ShadowCannon_Impact08_1ch.wav" Pitch="0.000000,0.000000" FacialGroup=""/>
        <AssetArray index="8" File="Assets\Sounds\ImmortalShakuras_ShadowCannon_Impact09_1ch.wav" Pitch="0.000000,0.000000" FacialGroup=""/>
        <AssetArray index="9" removed="1"/>
        <Pitch value="-4.000000,0.000000"/>
        <Volume value="-2.000000,-1.000000"/>
        <DupeDestroyCount value="4"/>
        <DupeHistoryCount value="4"/>
        <DupeMuteCount value="6"/>
    </CSound>
    <CSound id="ShadowCannon@AttackLaunch" parent="Combat">
        <EditorCategories value="Race:Protoss"/>
        <AssetArray File="Assets\Sounds\ImmortalShakuras_ShadowCannon_AttackLaunch01_1ch.wav" FacialGroup=""/>
        <AssetArray File="Assets\Sounds\ImmortalShakuras_ShadowCannon_AttackLaunch02_1ch.wav" FacialGroup=""/>
        <AssetArray File="Assets\Sounds\ImmortalShakuras_ShadowCannon_AttackLaunch03_1ch.wav" Weight="17" FacialGroup=""/>
        <AssetArray File="Assets\Sounds\ImmortalShakuras_ShadowCannon_AttackLaunch04_1ch.wav" FacialGroup=""/>
        <AssetArray File="Assets\Sounds\ImmortalShakuras_ShadowCannon_AttackLaunch05_1ch.wav" FacialGroup=""/>
        <AssetArray File="Assets\Sounds\ImmortalShakuras_ShadowCannon_AttackLaunch06_1ch.wav" FacialGroup=""/>
        <AssetArray File="Assets\Sounds\ImmortalShakuras_ShadowCannon_AttackLaunch07_1ch.wav" FacialGroup=""/>
        <AssetArray File="Assets\Sounds\ImmortalShakuras_ShadowCannon_AttackLaunch08_1ch.wav" FacialGroup=""/>
        <DupeMaximumMethod value="Replace"/>
        <Volume value="-1.940000,-1.940000"/>
        <Pitch value="-6.000000,-5.000000"/>
        <DupeDestroyCount value="8"/>
        <DupeHistoryCount value="8"/>
        <DupeMuteCount value="8"/>
    </CSound>

    <CUnit id="ShadowCannon@AttackMissile" parent="MISSILE_INVULNERABLE">
        <EditorCategories value="ObjectType:Projectile,ObjectFamily:Melee"/>
        <Race value="Prot"/>
        <Mover value="MissileDefault"/>
    </CUnit>

    <CDataCollectionUnit id="ShadowCannon">
        <EditorCategories value="DataGroup:Ability,DataFamily:Campaign,Race:Protoss,ObjectType:Projectile"/>
        <DataRecord Entry="Button,ShadowCannon"/>
        <DataRecord Entry="Abil,ShadowCannon"/>
        <DataRecord Entry="Behavior,ShadowCannon"/>
        <DataRecord Entry="Behavior,ShadowCannon@DisableWeapon"/>
        <DataRecord Entry="Effect,ShadowCannon@AB"/>
        <DataRecord Entry="Effect,ShadowCannon@AB@DisableWeapon"/>
        <DataRecord Entry="Effect,ShadowCannon@LM"/>
        <DataRecord Entry="Effect,ShadowCannon@Turret"/>
        <DataRecord Entry="Effect,ShadowCannon@Turret@Clear"/>
        <DataRecord Entry="Effect,ShadowCannon@CP"/>
        <DataRecord Entry="Effect,ShadowCannon@Damage"/>
        <DataRecord Entry="Actor,ShadowCannon@Attack"/>
        <DataRecord Entry="Actor,ShadowCannon@Range"/>
        <DataRecord Entry="Actor,ShadowCannon@AttackMissile"/>
        <DataRecord Entry="Actor,ShadowCannon@Animation"/>
        <DataRecord Entry="Model,ShadowCannon@AttackMissile"/>
        <DataRecord Entry="Sound,ShadowCannon@AttackImpact"/>
        <DataRecord Entry="Sound,ShadowCannon@AttackLaunch"/>
        <DataRecord Entry="Unit,ShadowCannon@AttackMissile"/>
    </CDataCollectionUnit>

    <CAttachMethodPattern id="AMPatternAnnihilator">
        <Keyword value="Weapon"/>
        <Base value="::RollingIndex"/>
        <Driver value="ShadowCannon@LM"/>
    </CAttachMethodPattern>
`
ОЖИДАНИЕ РЕКЛАМЫ...