Наносит 240 ед. урона указанной боевой единице или строению.
Поражает наземные и воздушные цели.
Поражает наземные и воздушные цели.
Способность из кампании Legacy of The Void. Принадлежит одной из вариации бессмертного протоссов, а именно Аннигилятору Неразимов.
Для корректной работы требует только подключенную к карте стандартную модификацию Liberty.SC2Mod
Для корректной работы требует только подключенную к карте стандартную модификацию Liberty.SC2Mod
Видеодемонстрация
Ну что... Это обычная способность применяемая на цель с дальностью применения равным 13. Также при "подготовке к применению" на юните вызывается эффект ShadowCannon@AB@DisableWeapon (Это поле PrepEffect в способности). Это нужно для того чтобы единица не могла попутно ещё кого-то атаковать своей атакой пока кастует способность, так как способность как видно имеет долгий эффект действия.
После активации
А после активации у нас тут срабатывает эффект типа Create Persistent ShadowCannon@CP. Это такой эффект, который может циклически делать другие эффекты в течении какого-то времени или сколько-то раз.
Он у нас:
- Поворачивает башню юнита в сторону цели (<InitialEffect value="ShadowCannon@Turret"/>)
- Далее периодически запускает в эту самую цель множество (а именно 8) снарядов (<PeriodicEffectArray value="ShadowCannon@LM"/>)
- А затем в конце концов, очищает "слежение" башни юнита за целью (<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>
SC2







