🖼 Dehaka With Spawn Brush Ability

Author: KurumiStella

Regular Dehaka, but with an extra ability to spawn a brush anywhere! You can Brushstalk (Z), get movement speed, etc, anywhere you like!

File: DehakaWithSpawnBrush.xml

<?xml version="1.0" encoding="us-ascii"?>
<Catalog>

  <!-- Constants -->
  <const id="$DehakaSpawnBrushAbilityCooldown" value="60" />
  <const id="$DehakaSpawnBrushUnitTimedLife" value="15" />
  <const id="$DehakaSpawnBrushUnitSightRadius" value="10" />
    <!-- Temp Button Face -->
  <const id="$DehakaSpawnBrushAbilityButtonFace" value="DehakaSpawnBrushAbility" />

  <!-- Add Talent to Dehaka, T1C4 -->
  <!-- <CHero id="Dehaka">
    <TalentTreeArray Talent="DehakaSpawnBrush" Tier="1" Column="4" />
  </CHero> -->

  <!-- Define the Talent -->
  <!-- <CTalent id="DehakaSpawnBrush">
    <Face value="$DehakaSpawnBrushAbilityButtonFace" />
    <Abil value="DehakaSpawnBrush" />
    <RankArray>
      <BehaviorArray value="DehakaSpawnBrushItem" />
    </RankArray>
    <Active value="1" />
  </CTalent> -->

  <!-- Was thinking to make it as a talent -->
  <!-- But its easier to play with if its a baseline ability, hmm... -->

  <CUnit id="HeroDehaka">
    <BehaviorArray Link="DehakaSpawnBrushItem" />
  </CUnit>

  <CButton id="DehakaSpawnBrushAbility" parent="StormButtonParent">
    <Icon value="Assets\Textures\storm_ui_icon_dehaka_brushstalker_a.dds"/>
  </CButton>

  <!-- Gives this behavior when Talent Selected -->
  <CBehaviorAbility id="DehakaSpawnBrushItem">
    <Buttons Face="$DehakaSpawnBrushAbilityButtonFace" Type="AbilCmd" AbilCmd="DehakaSpawnBrush,Execute" />
  </CBehaviorAbility>

  <!-- The Spawn Brush Ability -->
  <CAbilEffectTarget id="DehakaSpawnBrush">
    <AbilityCategories index="Control" value="1" />
    <PrepEffect value="DismountDecloakCasterSet" />
    <Effect value="DehakaSpawnBrushInitialSet" />
    <Flags index="ClearLastMoveTarget" value="1" />
    <Flags index="RequireTargetVision" value="0" />
    <Cost>
      <Cooldown TimeUse="$DehakaSpawnBrushAbilityCooldown" />
    </Cost>
    <Range value="500" />
    <Arc value="360" />
    <CastIntroTime value="0" />
    <CastOutroTime value="0.25" />
    <PlaceUnit value="DehakaSpawnBrushUnit" />
    <CmdButtonArray index="Execute" DefaultButtonFace="$DehakaSpawnBrushAbilityButtonFace" />
  </CAbilEffectTarget>

  <!-- When the Button was pressed -->
  <CEffectSet id="DehakaSpawnBrushInitialSet">
    <EffectArray value="DehakaSpawnBrushInitialPersistent" />
    <TargetLocationType value="Point" />
    <ValidatorArray value="TargetLocationIsPathable" />
    <ValidatorArray value="TargetPointWalkable" />
  </CEffectSet>

  <!-- Do something on the point -->
  <CEffectCreatePersistent id="DehakaSpawnBrushInitialPersistent">
    <ExpireEffect value="DehakaSpawnBrushCreateUnit" />
    <RevealRadius value="1.5" />
    <RevealFlags index="Unfog" value="1" />
  </CEffectCreatePersistent>

  <!-- KEKW -->
  <!-- <CEffectCreatePersistent id="DehakaSpawnBrushInitialPersistent">
    <OffsetFacingFallback Value="TargetPoint" />
    <PeriodCount value="9" />
    <PeriodicEffectArray value="DehakaSpawnBrushCreateUnit" />
    <PeriodicOffsetArray X="1.733" Y="1.454" />
    <PeriodicOffsetArray X="0.393" Y="2.228" />
    <PeriodicOffsetArray X="-1.131" Y="1.959" />
    <PeriodicOffsetArray X="-2.126" Y="0.774" />
    <PeriodicOffsetArray X="-2.126" Y="-0.774" />
    <PeriodicOffsetArray X="-1.131" Y="-1.959" />
    <PeriodicOffsetArray X="0.393" Y="-2.228" />
    <PeriodicOffsetArray X="1.733" Y="-1.454" />
    <PeriodicOffsetArray X="2.262" />
    <PeriodicPeriodArray value="0" />
  </CEffectCreatePersistent> -->

  <!-- Create the DehakaSpawnBrushUnit Unit-->
  <CEffectCreateUnit id="DehakaSpawnBrushCreateUnit">
    <WhichLocation Value="TargetPoint" />
    <SpawnUnit value="DehakaSpawnBrushUnit" />
    <SpawnEffect value="DehakaSpawnBrushUnitSpawnSet" />
  </CEffectCreateUnit>

  <!-- Add some effect to the unit -->
  <CEffectSet id="DehakaSpawnBrushUnitSpawnSet">
    <EffectArray value="DehakaSpawnBrushUnitApplyTimedLifeBehavior" />
  </CEffectSet>

  <!-- Add a timed life behavior -->
  <CEffectApplyBehavior id="DehakaSpawnBrushUnitApplyTimedLifeBehavior">
    <Behavior value="DehakaSpawnBrushUnitTimedLife" />
  </CEffectApplyBehavior>

  <!-- The Time life Behavior -->
  <CBehaviorBuff id="DehakaSpawnBrushUnitTimedLife" parent="StormTimedLife">
    <DisplayDuration index="Enemy" value="0" />
    <DisplayDuration index="Neutral" value="0" />
    <DisplayDuration index="Ally" value="1" />
    <Duration value="$DehakaSpawnBrushUnitTimedLife" />
  </CBehaviorBuff>


  <!-- DehakaSpawnBrushUnit Unit -->

  <!-- Instead of directly spawning Storm_KingsCrest_Shrubbery -->
  <!-- Need to do some workaround wrapper for to insert -->
  <!-- "CustomUnitStatusFrame" into the brush unit -->
  <!-- So that it can display a duration bar -->

  <CUnit id="DehakaSpawnBrushUnit" parent="Storm_KingsCrest_Shrubbery">
    <!-- Unselectable some-how make the duration bar not visible -->
    <FlagArray index="Unselectable" value="0" />
    <Sight value="$DehakaSpawnBrushUnitSightRadius" />
  </CUnit>

  <CActorUnit id="DehakaSpawnBrushUnit" parent="StormUnitBase" unitName="DehakaSpawnBrushUnit">
    <!-- Copied From <CActorUnit id="Storm_KingsCrest_Shrubbery" /> -->
    <!-- Apparently you cannot parent a <CActorUnit> with a unitName in it-->
    <VisibleOpacity value="0.500000" />
    <VisibleOpacityBlendDuration value="0.250000" />
    <SnapshotActor value="SnapshotNoOpacity" />
    <HighlightTooltip value="Unit/Name/Bogus" />
    <!-- A little minimap icon -->
    <MinimapIconScale value="1.000000" />
    <!-- Add the Unit frame to display the duration -->
    <CustomUnitStatusFrame value="UnitStatus/IndestructibleTimedUnitStatusFrameTemplate" />
  </CActorUnit>

  <CModel id="DehakaSpawnBrushUnit" parent="Storm_KingsCrest_Shrubbery" />

  <!-- ===================================================================== -->


  <!-- Literally copied everything from <CActorUnit id="HeroDehaka" /> -->
  <!-- because you cannot parent a <CActorUnit> with a unitName in it -->


  <CActorUnit id="HeroDehaka" parent="StormHeroStandard" unitName="HeroDehaka">
    <!-- The added animation when the spawn brush button was pressed -->
    <On Terms="Abil.DehakaSpawnBrush.SourceCastStart" Send="AnimPlay Attack Attack,C 0 -1.000000 -1.000000 1 AsTimeScale" />

    <Remove Terms="AnimDone; AnimName Taunt" Send="Signal ApplyReady" />
    <Remove Terms="AnimPlay; AnimName Spell" Send="TimerSet 0.750000 UnitWalkingCheckDelay" />
    <On Terms="ActorCreation" Send="StatusSet AttackOrder 0" />
    <On Terms="WeaponStart.*.AttackStart; IsStatus AttackOrder 0" Send="AnimPlay Attack Attack,A" />
    <On Terms="WeaponStart.*.AttackStart; IsStatus AttackOrder 1; !ValidateUnit CasterHasPickedAnUltimate" Send="AnimPlay Attack Attack,B" />
    <On Terms="WeaponStart.*.AttackStart; IsStatus AttackOrder 1; ValidateUnit CasterHasPickedAnUltimate" Send="AnimPlay Attack Attack,X" />
    <On Terms="WeaponStart.*.AttackStart; IsStatus AttackOrder 2" Send="AnimPlay Attack Attack,C" />
    <On Terms="WeaponStart.*.AttackStart; IsStatus AttackOrder 3; !ValidateUnit CasterHasPickedAnUltimate" Send="AnimPlay Attack Attack,D" />
    <On Terms="WeaponStart.*.AttackStart; IsStatus AttackOrder 3; ValidateUnit CasterHasPickedAnUltimate" Send="AnimPlay Attack Attack,Y" />
    <On Terms="Effect.DehakaHeroWeaponImpactSet.Start" Send="StatusIncrement AttackOrder" />
    <On Terms="StatusIncrement.*.AttackOrder; IsStatus AttackOrder 4" Send="StatusSet AttackOrder 0" />
    <On Terms="Effect.DehakaHeroWeaponDamage.Start; At Caster" Send="Create DehakaWeaponBase" />
    <On Terms="Abil.DehakaBrushstalker.SourceCastStart; !ValidatePlayer DehakaHasBrushstalkerApexPredator" Send="AnimPlay StandWorkStart Stand,Work,Start PlayForever,NonLooping -1.000000 -1.000000 1.000000 AsTimeScale" />
    <On Terms="Abil.DehakaBrushstalker.SourceCastStart; ValidatePlayer DehakaHasBrushstalkerApexPredator" Send="AnimPlay StandWorkStart Stand,Work,Start PlayForever,NonLooping -1.000000 -1.000000 1.250000 AsTimeScale" />
    <On Terms="Abil.DehakaBrushstalker.SourceCastStop" Send="TimerSet 0.187500 ClearStandWork" />
    <On Terms="TimerExpired; TimerName ClearStandWork" Send="AnimClear StandWorkStart 0.250000" />
    <On Terms="Behavior.DehakaBrushstalkerDurationBehavior.On" Send="AnimPlay Spell Stand,Work,End 0 0.000000 -1.000000 1.000000 AsTimeScale" />
    <On Terms="Behavior.DehakaBrushstalkerTravelBehavior.On" Send="StatusIncrement StatusBarHide" />
    <On Terms="Behavior.DehakaBrushstalkerDurationBehavior.Off" Send="StatusDecrement StatusBarHide" />
    <On Terms="Behavior.DehakaBrushstalkerTravelBehavior.On" Target="_HeroRing" Send="SetVisibility" />
    <On Terms="Behavior.DehakaBrushstalkerDurationBehavior.Off" Target="_HeroRing" Send="SetVisibility 1" />
    <On Terms="Abil.DehakaBrushstalker.TargetOn; IsActorLocalPlayer" Send="Create DehakaBrushSearchOn" />
    <On Terms="Abil.DehakaBrushstalker.TargetOn; IsActorLocalPlayer" Target="::Terrain" Send="TerrainSetShrubClustersVisible" />
    <On Terms="Abil.DehakaBrushstalker.TargetOff; IsActorLocalPlayer" Send="Create DehakaBrushSearchOff" />
    <On Terms="Abil.DehakaBrushstalker.TargetOff; IsActorLocalPlayer" Target="::Terrain" Send="TerrainSetShrubClustersVisible Clear" />
    <On Terms="UnitDeath" Target="::Terrain" Send="TerrainSetShrubClustersVisible Clear" />
    <On Terms="Abil.DehakaDrag.SourceCastStart" Send="AnimPlay Spell Spell,A 0 -1.000000 -1.000000 1.000000 AsTimeScale" />
    <On Terms="Signal.*.DehakaDragBeamCreation" Send="RefSetFromMsg ::actor.DehakaDragBeamReference ::Sender" />
    <On Terms="Behavior.HeroGenericRecentlyTeleported.On" Target="::actor.DehakaDragBeamReference" Send="Destroy Immediate" />
    <On Terms="Signal.*.DragTargetDummyCreated" Send="RefSetFromMsg ::actor.DragTarget ::Sender" />
    <On Terms="Signal.*.DragTargetDummyCreated" Send="HostSiteOpsSet ::Host {SOpBasicScopeFollow SOpDragForwardGuide}" />
    <On Terms="StatusOn.*.TimeStopPaused; ValidateUnit DehakaHasDragChannel" Send="HostSiteOpsSet ::Host {SOpBasicScopeFollow SOpDragForwardGuide} 1 1" />
    <On Terms="StatusOff.*.TimeStopPaused; ValidateUnit DehakaHasDragChannel" Send="HostSiteOpsSet ::Host {SOpBasicScopeFollow SOpDragForwardGuide}" />
    <On Terms="Behavior.DehakaDragChannelBehavior.Off; !ValidateUnit Mounted" Send="HostSiteOpsSet ::Host SOpBasicScopeFollow" />
    <On Terms="Effect.DehakaDragTalentFinalSet.Start; !ValidateUnit Mounted" Send="HostSiteOpsSet ::Host SOpBasicScopeFollow" />
    <On Terms="Abil.DehakaDarkSwarm.SourceCastStart" Send="AnimPlay Spell Spell,B 0 -1.000000 -1.000000 1.000000 AsTimeScale" />
    <On Terms="Abil.DehakaDarkSwarm.SourceCastStart" Send="AnimBracketStart Unpowered Stand,Unpowered,Start Stand,Unpowered Stand,Unpowered,End" />
    <On Terms="Behavior.DehakaDarkSwarm.Off" Send="AnimBracketStop Unpowered" />
    <On Terms="Abil.DehakaIsolation.SourceCastStart" Send="AnimPlay Spell Spell,C 0 -1.000000 -1.000000 1.000000 AsTimeScale" />
    <On Terms="Abil.DehakaAdaptation.SourceCastStart" Send="AnimPlay Spell Spell,D 0 -1.000000 -1.000000 1.000000 AsTimeScale" />
    <On Terms="Behavior.DehakaBurrowChannel.On" Send="AnimPlay Burrow Burrow,Start 0 -1.000000 0.000000 -1.000000 AsAutomatic 0.000000 13" />
    <On Terms="AnimDone; AnimPlaying Burrow Burrow,Start" Send="AnimPlay Burrow Burrow PlayForever 0.000000 -1.000000 -1.000000 AsAutomatic 0.000000 15" />
    <On Terms="Behavior.DehakaBurrowChannel.On" Send="AnimGroupRemove Ready" />
    <On Terms="Behavior.DehakaBurrowChannel.On" Send="AnimClear Ready" />
    <On Terms="Behavior.DehakaBurrowChannel.On" Send="TimerKill StandReadyOutroDuration" />
    <On Terms="Behavior.DehakaBurrowChannel.On" Send="AnimBracketStop Unpowered" />
    <On Terms="Behavior.DehakaBurrowChannel.Off" Send="TimerSet 5.000000 StandReadyOutroDuration" />
    <On Terms="Behavior.DehakaBurrowChannel.Off" Send="AnimClear Burrow" />
    <On Terms="AnimDone; AnimPlayingProps Burrow,End" Send="AnimGroupApply Ready" />
    <On Terms="Behavior.DehakaBurrowChannel.Off" Send="AnimPlay Burrow Burrow,End" />
    <On Terms="Effect.DehakaBurrowRemoveBehavior.Start" Send="AnimClear Burrow" />
    <On Terms="Effect.DehakaBurrowRemoveBehavior.Start" Send="AnimPlay Spell Burrow,End 0 -1.000000 -1.000000 1.000000 AsTimeScale" />
    <On Terms="UnitMovementUpdate.*.Walk; ValidateUnit DehakaBurrowed" Target="DehakaBurrowFX" Send="Signal Walk" />
    <On Terms="UnitMovementUpdate.*.Stand; ValidateUnit DehakaBurrowed" Target="DehakaBurrowFX" Send="Signal Stand" />
    <On Terms="Abil.DehakaEssenceCollection.SourceCastStart" Send="AnimPlay Spell Spell,E 0 -1.000000 -1.000000 1.000000 AsTimeScale" />
    <On Terms="ActorCreation; !ValidateUnit CasterHasPickedAnUltimate" Send="AnimPlay Cover Cover PlayForever" />
    <On Terms="Behavior.Ultimate1Unlocked.On" Send="Signal UltimatePicked" />
    <On Terms="Behavior.Ultimate2Unlocked.On" Send="Signal UltimatePicked" />
    <On Terms="Signal.*.UltimatePicked; !AnimPlaying Spell; !AnimPlayingName Attack" Send="AnimPlay Spell Spell,F" />
    <On Terms="Signal.*.UltimatePicked" Send="Create DehakaArmGrowthFXLeft" />
    <On Terms="Signal.*.UltimatePicked" Send="Create DehakaArmGrowthFXRight" />
    <On Terms="Signal.*.UltimatePicked" Send="Create DehakaArmGrowthGlaze" />
    <On Terms="Signal.*.UltimatePicked" Send="AnimPlay CoverEnd Cover,End" />
    <On Terms="Signal.*.UltimatePicked" Send="AnimClear Cover" />
    <On Terms="Signal.*.UltimatePicked" Target="::PortraitGameSelf" Send="Signal DoRegrow" />
    <On Terms="Behavior.Ultimate1Unlocked.Off" Send="AnimPlay Cover Cover PlayForever" />
    <On Terms="Behavior.Ultimate2Unlocked.Off" Send="AnimPlay Cover Cover PlayForever" />
    <On Terms="AnimPlay; AnimName Taunt" Send="AnimGroupApply Ready" />
    <On Terms="AnimPlay; AnimName Taunt" Send="AnimClear Ready" />
    <On Terms="AnimPlay; AnimName Taunt" Send="TimerKill StandReadyOutroDuration" />
    <On Terms="AnimPlay; AnimName Taunt" Send="TimerSet 5.000000 StandReadyOutroDuration" />
    <PortraitActor value="DehakaPortrait" />
    <PortraitModel value="DehakaPortrait" />
    <GroupIcon>
      <Image value="Assets\Textures\storm_ui_ingame_partyframe_dehaka.dds" />
    </GroupIcon>
    <HeroIcon value="Assets\Textures\UI_targetportrait_Hero_dehaka.dds" />
    <MinimapIcon value="Assets\Textures\storm_ui_minimapicon_dehaka.dds" />
    <UnitIcon value="Assets\Textures\UI_targetportrait_Hero_dehaka.dds" />
    <Wireframe>
      <Image value="Assets\Textures\UI_targetportrait_Hero_dehaka.dds" />
    </Wireframe>
    <ModelFlags index="AutomateGlobalLoops" value="0" />
    <AbilSoundArray AbilCmd="DehakaBrushstalker,Execute" Sound="DehakaBase_VOX_CastingZ" />
    <AbilSoundArray AbilCmd="DehakaBurrow,Execute" Sound="DehakaBase_VOX_CastingE" />
    <AbilSoundArray AbilCmd="DehakaDrag,Execute" Sound="DehakaBase_VOX_CastingQ" />
    <AbilSoundArray AbilCmd="DehakaDarkSwarm,255" Sound="DehakaBase_VOX_CastingW" />
    <AbilSoundArray AbilCmd="DehakaIsolation,Execute" Sound="DehakaBase_Ultimate1Used" />
    <AbilSoundArray AbilCmd="DehakaAdaptation,Execute" Sound="DehakaBase_Ultimate2Used" />
    <AbilSoundArray AbilCmd="DehakaEssenceCollection,Execute" Sound="DehakaBase_VOX_CastingD" />
    <ErrorArray Error="NotEnoughEnergy" Sound="DehakaBase_LowMana" />
    <SoundArray index="Ready" value="DehakaBase_Revive" />
    <SoundArray index="Yes" value="DehakaBase_Yes" />
    <SoundArray index="Attack" value="DehakaBase_Attack" />
    <SoundArray index="Pissed" value="DehakaBase_Pissed" />
    <MinimapIconBackgroundScale value="0.950000" />
  </CActorUnit>
</Catalog>

Back to top

Try Mode 2.0 is a personal project and is not affiliated, associated, authorized, endorsed by, or in any way officially connected with Blizzard or Heroes of the Storm. Distributed by an MIT license.

Page last modified: May 9 2026 at 05:26 PM.

Edit this page on GitHub.

Made with ❤️ by Jamie Phan | GitHub.