• Check out the results of the Techtree Contest #19!
  • Listen to a special audio message from Bill Roper to the Hive Workshop community (Bill is a former Vice President of Blizzard Entertainment, Producer, Designer, Musician, Voice Actor) 🔗Click here to hear his message!
  • Read Evilhog's interview with Gregory Alper, the original composer of the music for WarCraft: Orcs & Humans 🔗Click here to read the full interview.
  • Create a void inspired texture for Warcraft 3 and enter Hive's 34th Texturing Contest: Void! Click here to enter!
  • The Hive's 22nd Icon Contest: Creep Abilities is now concluded, time to vote for your favourite set of icons! Click here to vote!

Sylvanas Hero Concept

zCl7LRU.png


SotkXca.png
tQqiJrF.png

Sylvanas, the Banshee Queen, responsible for the recent demise of Azeroth. Sylvanas, in this Hero Concept, is a main Long Range Assassin specialized in crowd control. Thanks to all that have been credited for their awesome work on models, effects, icons and code libraries, and please, if you find that no credit was given to you for your work here or credit were given by mistake, let me know, so I can fix it. Enjoy!

Black Arrows

Cry of the Banshee Queen

Arrow Storm

Screaming Banshees

Forsaken Arrow

Withering Fire

Ranger Precision


i9JcyX8.png


KhjH9wX.gif

umIU1CX.png


3IGHjng.gif

1IAcbaH.png


aSHw24d.gif

fYloaM8.png


CKV4HRI.gif

NHh7jn7.png


4FWJDQt.gif

AZGCuvV.png


0xIuYCT.gif

vBJTeBH.png

nyvCDoh.png

  • N3rth
  • YourArthas and the Rebirth Team
  • Magtheridon96
  • The Panda
  • AZ
  • Darkfang
  • Mythic
  • Bribe
  • Deathclaw24
  • 4eNNightmare
  • JetFangInferno
  • Blizzard

10/18/2020
  • Requirement Systems updated to their latest versions.
  • New Library PluginSpellEffect
  • Spells that require SpellEffectEvent by Bribe now also requires the new library.
11/02/2020
  • Requirement Systems updated to their latest versions.
11/23/2020
  • Requirement Systems updated to their latest versions.
04/30/2021
  • Concept ported to LUA
  • Required systems updated to their latest versions
05/11/2021
  • Updated to use the latest version of the requirement libraries
  • Adjust the starting height of abilities that use Missiles
  • Fixed a bug in the Cry of the Banshee Queen ability.
06/06/2021
  • Updated to use the latest version of the requirement libraries
01/13/2022
  • Updated to use the latest version of the requirement libraries
01/01/2023
  • Cry of the Banshee Queen v1.3
    • Updated to use the new CrowdControl system
  • Forsaken Arrow v1.3
    • Updated to use the new CrowdControl system
02/04/2023
  • Black Arrow v1.3
    • Included helper method to fix a bug in Arrow Storm and Forsaken Arrow
  • Arrow Storm v1.3
    • Fixed a bug where units cursed and killed by Arrow Storm would not spawn skeletons. (Requires v1.3 of Black Arrow)
  • Forsaken Arrow v1.4
    • Fixed a bug where units cursed and killed by Forsaken Storm would not spawn skeletons. (Requires v1.3 of Black Arrow)

Pack updated to match my standard requirement libraries. For those who cant open the map due to a problem in the editor when trying to load Object Data, get the Object Data here.
Contents

Sylvanas Hero Concept (Map)

Sylvanas Hero Concept (Map)

Reviews
MyPad
Aside from the usual fanfare, the idea of Sylvanas being an aggressive force of evil that can shred through enemy ranks with her powerful magic and enchanted bows is greatly exemplified here. Impressive as always. The system works fantastically, and...
Great hero design, that's a really clever idea having the Black Arrow toggle affect the other skills.

And that icon for Arrow Storm! Can you believe I made that 14 years ago? I was only 12! I'm still amazed it got approved (It's a blatantly obvious re-color of Blizzard, and a fairly poor one at that LOL).
 
beautiful work, but you could change an ability if possible, an arrow hitting the enemy and two chains coming out of that enemy unit that grab two nearby units, and when exploiting the ability attract the units
 
anyone know how to open this map on editor? it always says missing unit data or invalid on both WE and JGNP. Thank you

What version of the game/editor you trying to open it? This was build using the latest patch. If the problem persists i will post the map Object Data as well so people can import it to a blank map e just copy the code over from Trigger preview
 
What version of the game/editor you trying to open it? This was build using the latest patch. If the problem persists i will post the map Object Data as well so people can import it to a blank map e just copy the code over from Trigger preview
It's ok playing on a really old warcraft 3 1.26.
 
Quick Question related to the Arrow Storm ability. how did you trigger it to detect whether your hero's Black arrow is currently active or not? is it possible to replicate this on older patches?
 
Quick Question related to the Arrow Storm ability. how did you trigger it to detect whether your hero's Black arrow is currently active or not? is it possible to replicate this on older patches?

I use the "A unit is issued an order" event. When the unit active the black arrows it detects an an order and when it deactivates it it detects another order, then i save it in a global variable to be used by the Arrow Storm and other abilities. It can be done in any patch.
 
I use the "A unit is issued an order" event. When the unit active the black arrows it detects an an order and when it deactivates it it detects another order, then i save it in a global variable to be used by the Arrow Storm and other abilities. It can be done in any patch.


hmmm Will try this thanks for the quick reply!
 
Aside from the usual fanfare, the idea of Sylvanas being an aggressive force of evil that can shred through enemy ranks with her powerful magic and enchanted bows is greatly exemplified here. Impressive as always.

The system works fantastically, and is particularly efficient at handling memory usage. A word of caution ought to be given to users who would like to import Screaming Banshees; check the pathability of the area where the caster would blink into.

Nitpicks:
The missile for the Screaming Banshees spell appears to be too small in the SD version (and appears to be an orb for some reason?).

Status:
[color=ffcc00]Approved[/color]
 
my 1.31b WE can't play it.Missing or invalid terrain layer information data
Do you have a copy of the game or are you using the original version? Maybe it's a problem with the latest patch (bloody blizzard f**uking things up). Anyway, you can always use the ObjectData I provided and import it to an empty map and use the Preview Triggers tab in the thread to get the codes. You can use an MPQEditor to get the models and icons.
 
I really like this version of Sylvanas's model, but it doesn't speak and doesn't have a heroic aperture, I wish someone would fix that.
 
Having issues with Sylvanus and Illidan imports (Muradin works fine, some like Yu'lon I can't even open your map because of Bliizard's awful patch update). For both issue heros, everything is imported except scripts (I always get errors for scripts, but I got errors on Muradin too) and the test game works with the models. However some of the abilities aren't working. Sylvanus for example - Ranger Precision (never triggers), Forsaken Arrow and Withering Fire (no damage or visual) and worst of all, Black Arrow (while active attacks do damage but no visual and no buff, and no skeletal soldiers created). Is this a trigger issue? Script issue? It's all imported as is described, and I made no edits in the code since everything appears to match.
Thanks so much your work is awesome!
 
I always get errors for scripts
In the trigger editor menu bar, navigate to JASSHelper > Enable JASSHelper, Enable vJASS and turn them both on. These settings are off by default now in all maps/editors for some godforsaken reason.
For both issue heros, everything is imported
The order you import matters (unless you import all object data via .w3o at once but I think that overwrites your own custom data). If an ability uses a buff, when you paste the ability into a new map it will try to put that correct buff in the same data field. If the buff exists already you’re fine, but if it doesn’t then it will either be blank, populated by the default buff, or populated with another buff of the same rawcode as the original.

The WE does not check to update this field when you DO paste the buff because it doesn’t work retroactively like that. This applies to things like abilities lists for units, upgrades used/techtree requirements, units spawned by abilities, etc.. Think about the order when you are pasting over object data.

GUI Triggers must come after object data, since any references to specific objects need them to exist to work. For JASS/Lua triggers this is less important because you’ll likely have to update the rawcodes used manually anyway.
 
In the trigger editor menu bar, navigate to JASSHelper > Enable JASSHelper, Enable vJASS and turn them both on. These settings are off by default now in all maps/editors for some godforsaken reason.

The order you import matters (unless you import all object data via .w3o at once but I think that overwrites your own custom data). If an ability uses a buff, when you paste the ability into a new map it will try to put that correct buff in the same data field. If the buff exists already you’re fine, but if it doesn’t then it will either be blank, populated by the default buff, or populated with another buff of the same rawcode as the original.

The WE does not check to update this field when you DO paste the buff because it doesn’t work retroactively like that. This applies to things like abilities lists for units, upgrades used/techtree requirements, units spawned by abilities, etc.. Think about the order when you are pasting over object data.

GUI Triggers must come after object data, since any references to specific objects need them to exist to work. For JASS/Lua triggers this is less important because you’ll likely have to update the rawcodes used manually anyway.
Thanks for the reply. For that reason I do the "all object data import via .w3o" but still the RangerPrecision doesn't add agility, the BlackArrow debuff doesn't spawn any skelies, ForsakenArrow doesn't have a visual (I just see the damage on the enemy units) and Whither Arrow doesn't even show up on her abilities even though it's added.

I changed all the .mdl to .mdx (not sure if that matters but that's how it looks in my assets) but that's as far as I'd want to go tinkering as I am not experienced with coding or triggers. If it's just because of the latest patch messing things up, I'll leave it at that. Otherwise I am trying to learn :)
 
Thanks for the reply. For that reason I do the "all object data import via .w3o" but still the RangerPrecision doesn't add agility, the BlackArrow debuff doesn't spawn any skelies, ForsakenArrow doesn't have a visual (I just see the damage on the enemy units) and Whither Arrow doesn't even show up on her abilities even though it's added.

I changed all the .mdl to .mdx (not sure if that matters but that's how it looks in my assets) but that's as far as I'd want to go tinkering as I am not experienced with coding or triggers. If it's just because of the latest patch messing things up, I'll leave it at that. Otherwise I am trying to learn :)
How about sharing your map so we can take a look?
 
How about sharing your map so we can take a look?
Hopefully it lets you open it. Black Arrow doesn't summon skeletons (although you can see something invisible causing damage occasionally), Forsaken Arrow doesn't have a visual and Ranger Precision doesn't proc.
 

Attachments

is it possible I need to add string text somewhere? when i import the strings i get dozens of errors (3, 45, 55, 65, 123, 125, etc)
 

Attachments

  • Screenshot 2023-02-24 150413.png
    Screenshot 2023-02-24 150413.png
    15.2 KB · Views: 71
is it possible I need to add string text somewhere? when i import the strings i get dozens of errors (3, 45, 55, 65, 123, 125, etc)
Hopefully it lets you open it. Black Arrow doesn't summon skeletons (although you can see something invisible causing damage occasionally), Forsaken Arrow doesn't have a visual and Ranger Precision doesn't proc.
Have you figured out how to fix them?
 
How can i fix this error? I'm a noob but i guess it conflicts with the Damage Engine 5.A.0.0 installed in my map.
 

Attachments

  • Untitled.png
    Untitled.png
    52.9 KB · Views: 20
Hi Chopinski,

First of all, thank you for this spell system. It was very clean and easy to understand, which made it a great base for experimentation.

I ended up modifying it quite a bit for a custom Sylvanas ability in my map. The core logic of the spell remains the same, but I expanded the visual and audio side significantly.

Some of the things I added:


Custom launch and impact sound effects with positional playback
Missile trail effect attached to the arrow during flight
Caster weapon enchantment effect when the spell is fired
Launch flash effect on the bow
• Reworked impact visuals (void blink explosion)
• Added a despair aura ground effect that persists briefly after impact
• Proper terrain height alignment for ground effects
• A small system to control the lifespan of persistent effects using timers and a hashtable
• Additional configurable visual parameters (scale, color, duration)


The goal was mainly to push the spell more toward a cinematic style ability while keeping your original mechanics intact.

I’m posting the modified script below in a spoiler for reference, along with a small GIF preview of the spell in action.

Thanks again, sir!


JASS:
library ForsekenArrow requires SpellEffectEvent, PluginSpellEffect, Utilities, Missiles, CrowdControl optional BlackArrow
    /* ------------------------------------- Forseken Arrow v1.4 ------------------------------------ */
    // Credits:
    //     Bribe          - SpellEffectEvent
    //     Darkfang       - Icon
    //     AZ             - Arrow model
    //     JetFangInferno - Dark Nova model
    /* ---------------------------------------- By Chopinski ---------------------------------------- */
    
    /* ---------------------------------------------------------------------------------------------- */
    /*                                          Configuration                                         */
    /* ---------------------------------------------------------------------------------------------- */
    globals
        // The raw code of the Screaming Banshees ability
        private constant integer    ABILITY         = 'A001'
        // The missile model
        private constant string     MISSILE_MODEL   = "world_expansion08_doodads_fx_9fx_raid2_sylvanas_wailingarrow_missile.mdl"
        // The missile size
        private constant real       MISSILE_SCALE   = 0.8
        // The missile speed
        private constant real       MISSILE_SPEED   = 1800.
        // The Explosion model (fast void blink)
        private constant string     EXPLOSION_MODEL = "Blink Purple Caster.mdl"
        // The Explosion size
        private constant real       EXPLOSION_SCALE = 3
        // The fear model
        private constant string     FEAR_MODEL      = "world_expansion08_doodads_fx_9fx_raid2_sylvanas_withingfire_impact.mdl"
        // The the fear attachment point
        private constant string     ATTACH_FEAR     = "chest"
        // The attack type of the damage dealt
        private constant attacktype ATTACK_TYPE     = ATTACK_TYPE_NORMAL 
        // The damage type of the damage dealt
        private constant damagetype DAMAGE_TYPE     = DAMAGE_TYPE_MAGIC
        // Sound paths
        private constant string     LAUNCH_SOUND    = "war3mapImported\\WArrowLaunch.mp3"
        private constant string     IMPACT_SOUND    = "war3mapImported\\WArrowExplode.mp3"

        // ============================ NEW VISUAL EFFECTS ============================

        // 1. Despair aura – long lasting decaying effect at impact point
        private constant string     DESPAIR_MODEL       = "DespairAuraPurple.mdl"
        private constant real       DESPAIR_SCALE       = 7.0
        private constant integer    DESPAIR_RED         = 255
        private constant integer    DESPAIR_GREEN       = 255
        private constant integer    DESPAIR_BLUE        = 255
        private constant real       DESPAIR_DURATION    = 3.0

        // 2. Violet pulse aura – attached to the arrow missile
        private constant string     TRAIL_MODEL         = "VioletPulse.mdl"
        private constant real       TRAIL_SCALE         = 1.2
        private constant integer    TRAIL_RED           = 150
        private constant integer    TRAIL_GREEN         = 0
        private constant integer    TRAIL_BLUE          = 255

        // 3. Caster enchantment – attached to Sylvanas on cast
        private constant string     CASTER_EFFECT_MODEL = "Soul Bow Enchantment Void.mdl"
        private constant real       CASTER_EFFECT_SCALE = 0.7
        private constant integer    CASTER_EFFECT_RED   = 200
        private constant integer    CASTER_EFFECT_GREEN = 100
        private constant integer    CASTER_EFFECT_BLUE  = 255

        // 4. Launch flash (optional)
        private constant string     LAUNCH_FLASH_MODEL = "Abilities\\Weapons\\AvengerMissile\\AvengerMissile.mdl"
        private constant real       LAUNCH_FLASH_SCALE = 1.0
    endglobals

    // Helper to set color on an effect
    private function ApplyColor takes effect e, integer r, integer g, integer b returns nothing
        if r >= 0 and g >= 0 and b >= 0 then
            call BlzSetSpecialEffectColor(e, r, g, b)
        endif
    endfunction

    // Helper to set scale if > 0
    private function ApplyScale takes effect e, real s returns nothing
        if s > 0 then
            call BlzSetSpecialEffectScale(e, s)
        endif
    endfunction

    // The Explosion AoE
    private function GetAoE takes unit caster, integer level returns real
        return BlzGetAbilityRealLevelField(BlzGetUnitAbility(caster, ABILITY), ABILITY_RLF_AREA_OF_EFFECT, level - 1)
    endfunction

    // The duration of the Fear, Silence and Slow.
    private function GetDuration takes unit caster, unit target, integer level returns real
        if IsUnitType(target, UNIT_TYPE_HERO) then
            return BlzGetAbilityRealLevelField(BlzGetUnitAbility(caster, ABILITY), ABILITY_RLF_DURATION_HERO, level - 1)
        else
            return BlzGetAbilityRealLevelField(BlzGetUnitAbility(caster, ABILITY), ABILITY_RLF_DURATION_NORMAL, level - 1)
        endif
    endfunction

    // The slow amount
    private function GetSlow takes unit target, integer level returns real
        if IsUnitType(target, UNIT_TYPE_HERO) then
            return 0.5 + 0.*level
        else
            return 0.5 + 0.*level
        endif
    endfunction

    // The damage when passing through units
    private function GetCollisionDamage takes unit source, integer level returns real
        return level*GetHeroAgi(source, true)*0.5 + level*250
    endfunction

    // The damage when exploding
    private function GetExplosionDamage takes unit source, integer level returns real
        return level*GetHeroAgi(source, true)*0.5 + level*250
    endfunction

    // The missile collision size
    private function GetCollisionSize takes integer level returns real
        return 200. + 0.*level
    endfunction

    // Filter
    private function Filtered takes player op, unit target returns boolean
        return IsUnitEnemy(target, op) and /*
            */ UnitAlive(target) and /*
            */ not IsUnitType(target, UNIT_TYPE_STRUCTURE) and /*
            */ not IsUnitType(target, UNIT_TYPE_MAGIC_IMMUNE)
    endfunction

    // --------------------------------------------------------------------------
    // Helper function to play a sound at a point (leak‑free)
    // --------------------------------------------------------------------------
    private function PlaySfx takes string path, real x, real y, real z returns nothing
        local sound snd = CreateSound(path, false, true, true, 10, 10, "DefaultEAXON")
        call SetSoundChannel(snd, 0)
        call SetSoundDistances(snd, 600.00, 10000.00)
        call SetSoundDistanceCutoff(snd, 3000.00)
        call SetSoundVolume(snd, 127)
        call SetSoundConeAngles(snd, 0.0, 0.0, 127)
        call SetSoundConeOrientation(snd, 0.0, 0.0, 0.0)
        call SetSoundPitch(snd, 1.0)
        call SetSoundPosition(snd, x, y, z)
        call StartSound(snd)
        call KillSoundWhenDone(snd)
        set snd = null
    endfunction

    /* ---------------------------------------------------------------------------------------------- */
    /*                                             System                                             */
    /* ---------------------------------------------------------------------------------------------- */
    private struct ForsekenArrow extends Missiles
        real exp_damage
        real aoe
        real curse_duration
        integer curse_level
        integer level
        integer ability
        boolean curse
        effect trail        // violet pulse attached to missile
        effect casterEffect // enchantment on Sylvanas

        // Hashtable for delayed destruction of despair aura
        private static hashtable timerTable = InitHashtable()

        static method onDespairTimer takes nothing returns nothing
            local timer t = GetExpiredTimer()
            local integer id = GetHandleId(t)
            local effect e = LoadEffectHandle(timerTable, id, 0)
            if e != null then
                call DestroyEffect(e)
                call RemoveSavedHandle(timerTable, id, 0)
            endif
            call DestroyTimer(t)
            set t = null
        endmethod

        method onHit takes unit hit returns boolean
            if Filtered(owner, hit) then
                if UnitDamageTarget(source, hit, damage, true, false, ATTACK_TYPE, DAMAGE_TYPE, null) and curse then
                    static if LIBRARY_BlackArrow then
                        call BlackArrow.curse(hit, source, owner)
                    endif
                endif
            endif
            return false
        endmethod

        method onFinish takes nothing returns boolean
            local group g = CreateGroup()
            local integer i = 0
            local integer size
            local unit u
            local real duration
            local unit blastDummy
            local unit silenceDummy
            local effect tempEffect
            local effect despairEffect
            local real groundZ
            local location loc
            local timer despairTimer

            // ----- Destroy trail cleanly (force vanish) -----
            if this.trail != null then
                call BlzSetSpecialEffectAlpha(this.trail, 0)
                call DestroyEffect(this.trail)
                set this.trail = null
            endif

            // ----- Destroy caster enchantment -----
            if this.casterEffect != null then
                call DestroyEffect(this.casterEffect)
                set this.casterEffect = null
            endif

            // Play impact sound
            call PlaySfx(IMPACT_SOUND, x, y, z)

            // --- Ground Z for effects that should sit on terrain ---
            set loc = Location(x, y)
            set groundZ = GetLocationZ(loc) + 10.0   // offset to lift slightly above ground
            call RemoveLocation(loc)

            // --- Void blink (fast explosion) – placed on terrain (groundZ) ---
            set tempEffect = AddSpecialEffect(EXPLOSION_MODEL, x, y)
            call BlzSetSpecialEffectZ(tempEffect, groundZ)
            call BlzSetSpecialEffectScale(tempEffect, EXPLOSION_SCALE)

            // --- Despair aura (ground effect) – created and destroyed after DESPAIR_DURATION ---
            if DESPAIR_MODEL != "" then
                set despairEffect = AddSpecialEffect(DESPAIR_MODEL, x, y)
                call ApplyScale(despairEffect, DESPAIR_SCALE)
                call ApplyColor(despairEffect, DESPAIR_RED, DESPAIR_GREEN, DESPAIR_BLUE)
                call BlzSetSpecialEffectZ(despairEffect, groundZ)

                // Schedule destruction after DESPAIR_DURATION
                set despairTimer = CreateTimer()
                call SaveEffectHandle(timerTable, GetHandleId(despairTimer), 0, despairEffect)
                call TimerStart(despairTimer, DESPAIR_DURATION, false, function thistype.onDespairTimer)
                set despairTimer = null
                set despairEffect = null
            endif

            // --- Original blast dummy (decaying effect) ---
            set blastDummy = CreateUnit(owner, 'h007', x, y, 0)
            call UnitAddAbility(blastDummy, 'Aloc')
            call SetUnitTimeScale(blastDummy, 1.0)
            call UnitApplyTimedLife(blastDummy, 'BTLF', 2.00)

            // --- Silence dummy ---
            set silenceDummy = CreateUnit(owner, 'h005', x, y, 0)
            call UnitAddAbility(silenceDummy, 'Aloc')
            call IssuePointOrder(silenceDummy, "silence", x, y)
            call UnitApplyTimedLife(silenceDummy, 'BTLF', 2.00)

            // Original area damage and debuff application
            call GroupEnumUnitsInRange(g, x, y, aoe, null)
            set size = BlzGroupGetSize(g)
            loop
                exitwhen i == size
                    set u = BlzGroupUnitAt(g, i)
                    if Filtered(owner, u) then
                        if UnitDamageTarget(source, u, exp_damage, true, false, ATTACK_TYPE, DAMAGE_TYPE, null) then
                            set duration = GetDuration(source, u, level)
                            static if LIBRARY_BlackArrow then
                                if curse then
                                    call BlackArrow.curse(u, source, owner)
                                endif
                            endif
                            call FearUnit(u, duration, FEAR_MODEL, ATTACH_FEAR, false)
                            call SilenceUnit(u, duration, null, null, false)
                            call SlowUnit(u, GetSlow(u, level), duration, null, null, false)
                        endif
                    endif
                set i = i + 1
            endloop
            call DestroyGroup(g)

            set g = null
            set u = null
            set blastDummy = null
            set silenceDummy = null
            set tempEffect = null
            set loc = null

            return true
        endmethod

        private static method onCast takes nothing returns nothing
            local thistype this = thistype.create(Spell.source.x, Spell.source.y, 150, Spell.x, Spell.y, 50)  // end height 50, closer to ground

            set source = Spell.source.unit
            set speed = MISSILE_SPEED
            set model = MISSILE_MODEL
            set scale = MISSILE_SCALE
            set level = Spell.level
            set owner = Spell.source.player
            set vision = 500   // ensures dummy unit is created
            set aoe = GetAoE(Spell.source.unit, Spell.level)
            set damage = GetCollisionDamage(Spell.source.unit, Spell.level)
            set collision = GetCollisionSize(Spell.level)
            set exp_damage = GetExplosionDamage(Spell.source.unit, Spell.level)

            static if LIBRARY_BlackArrow then
                set curse_level = GetUnitAbilityLevel(Spell.source.unit, BlackArrow_ABILITY)
                set curse = curse_level > 0
                set ability = BlackArrow_BLACK_ARROW_CURSE
                set curse_duration = BlackArrow_GetCurseDuration(curse_level)
            else
                set curse = false
            endif

            // Play launch sound
            call PlaySfx(LAUNCH_SOUND, Spell.source.x, Spell.source.y, 50)

            // --- Caster enchantment (on Sylvanas) ---
            if CASTER_EFFECT_MODEL != "" then
                set this.casterEffect = AddSpecialEffectTarget(CASTER_EFFECT_MODEL, source, "weapon")
                call ApplyScale(this.casterEffect, CASTER_EFFECT_SCALE)
                call ApplyColor(this.casterEffect, CASTER_EFFECT_RED, CASTER_EFFECT_GREEN, CASTER_EFFECT_BLUE)
            endif

            // --- Launch flash (optional) ---
            if LAUNCH_FLASH_MODEL != "" then
                call DestroyEffect(AddSpecialEffectTarget(LAUNCH_FLASH_MODEL, source, "weapon"))
            endif

            call launch()

            // Attach violet pulse trail using the attach method
            if TRAIL_MODEL != "" then
                set this.trail = this.attach(TRAIL_MODEL, 0., 0., 0., TRAIL_SCALE)
                call BlzSetSpecialEffectColor(this.trail, TRAIL_RED, TRAIL_GREEN, TRAIL_BLUE)
            endif
        endmethod

        static method onInit takes nothing returns nothing
            call RegisterSpellEffectEvent(ABILITY, function thistype.onCast)
            // timerTable is initialized at declaration
        endmethod
    endstruct
endlibrary

WailingArrow-ezgif.com-video-to-gif-converter.gif
 
Chopinski, i have discovered something last night, i was trying to use withering fire by itself and couldnt get it working, i went back to this map to test it, bringing sylvanas to lvl 20 without getting any other skills to obtain withering fire, she does not shoot 3 targets, it is only after getting black arrow and 'using it/autocast' it only starts shooting 3 targets after black arrow has been activated. I had a plan to use this for a unit of mine that can hit up to 9 targets. What do i need to change for this to work as just the withering fire ability?
 
Chopinski, i have discovered something last night, i was trying to use withering fire by itself and couldnt get it working, i went back to this map to test it, bringing sylvanas to lvl 20 without getting any other skills to obtain withering fire, she does not shoot 3 targets, it is only after getting black arrow and 'using it/autocast' it only starts shooting 3 targets after black arrow has been activated. I had a plan to use this for a unit of mine that can hit up to 9 targets. What do i need to change for this to work as just the withering fire ability?
I've been wondering the similiar thing. I looked up to the trigger and i can't found the setting in Withering Fire that says to limit the max arrow to 2 or 3. And it as you said, it only starts shooting 3 targets after the BA has been activated. But i can't found it on the BA trigger as well.
 
I've been wondering the similiar thing. I looked up to the trigger and i can't found the setting in Withering Fire that says to limit the max arrow to 2 or 3. And it as you said, it only starts shooting 3 targets after the BA has been activated. But i can't found it on the BA trigger as well.
So the one method in withering fire takes a boolean curse, which that method is in black arrow script. It is fully expecting the black arrow skill to have been used atleast once before getting withering fire, without black arrow being activated beforehand seems like the boolean is null, so therefore doesnt work till its been used once, So the part where it takes the boolean curse, i believe could be removed and the actions there adjusted to not include the curse changes and just have it set as the normal missile. I believe would be the fix to that.
Never tested it myself though, i had found a better solution to what i wanted using his relativistic missile system. So hope that helps.
 
Last edited:
Back
Top