Changing Specific Spell Trigger To 'Any' Spell Trigger

luorax

Invasion in Duskwood
Reaction score
67
There're many ways to do it, this one is simple and I guess works:

JASS:
scope NoAutoCast initializer NACInit

    globals
        //--- Locals ---
        private unit nacUnit
        private player nacPlayer
        private timer nacTimer = CreateTimer()
        private integer nacAbil
        //--- Spell Stack ---
        private string array orderStack
        private integer array abilityStack
        private integer stackLevel = 0
        //--- Type Stack ---
        private integer array typeStack
        private integer typeStackLevel = 0
    endglobals
    
    private function Check takes string s returns boolean
        local integer i = 0
        loop
            exitwhen i >= stackLevel
            if s == orderStack<i> then
                return true
            endif
            set i = i + 1
        endloop
        return false
    endfunction
    
    private function TypeCheck takes integer id returns boolean
        local integer i = 0
        loop
            exitwhen i &gt;= typeStackLevel
            if id == typeStack<i> then
                return true
            endif
            set i = i + 1
        endloop
        return false
    endfunction
    
    private function GetAbilityByOrder takes string s, unit u returns integer
        local integer i = 0
        loop
            exitwhen i &gt;= stackLevel
            if s == orderStack<i> and GetUnitAbilityLevel(u, abilityStack<i>) &gt; 0 then
                return abilityStack<i>
            endif
            set i = i + 1
        endloop
        return 0
    endfunction
    
    private function AddToStack takes string s, integer id returns nothing
        set orderStack[stackLevel] = s
        set abilityStack[stackLevel] = id
        set stackLevel = stackLevel + 1
    endfunction
    
    private function AddTypeToStack takes integer id returns nothing
        set typeStack[typeStackLevel] = id
        set typeStackLevel = typeStackLevel + 1
    endfunction
    
    private function CallBack takes nothing returns nothing
        call SetPlayerAbilityAvailable(nacPlayer, nacAbil, true)
    endfunction
    
    private function Conditions takes nothing returns boolean
        local string s = &quot;&quot;
        if TypeCheck(GetUnitTypeId(GetTriggerUnit())) then
            set nacUnit = GetTriggerUnit()
            set nacPlayer = GetOwningPlayer(nacUnit)
            set s = OrderId2String(GetIssuedOrderId())
            if Check(s) then
                set nacAbil = GetAbilityByOrder(s, nacUnit)
                call SetPlayerAbilityAvailable(nacPlayer, nacAbil, false)
                call TimerStart(nacTimer, 0.00, false, function CallBack)
                call SimError(nacPlayer, &quot;This spell isn&#039;t auto-cast!&quot;)
            endif
        endif
        return false
    endfunction
    
    private function NACInit takes nothing returns nothing
        local trigger t = CreateTrigger()
        local integer index = 0
        
        loop
            call TriggerRegisterPlayerUnitEvent(t, Player(index), EVENT_PLAYER_UNIT_ISSUED_ORDER, null)
            set index = index + 1
            exitwhen index == bj_MAX_PLAYER_SLOTS
        endloop
        call TriggerAddCondition(t, Condition(function Conditions))
        
        //Adding spells
        call AddToStack(&quot;poisonarrows&quot;, &#039;A00C&#039;)
        call AddToStack(&quot;coldarrows&quot;, &#039;A00D&#039;)
        
        //Adding unit types
        call AddTypeToStack(mDruid)
        call AddTypeToStack(mRogue)
        
        set t = null
    endfunction
    
endscope
</i></i></i></i></i>


A little off-topic here: does anyone know how can I edit my signature?
 

WolfieeifloW

WEHZ Helper
Reaction score
372
[del]Druid's spell stops, Paladin's doesnt[/del]
Nevermind, it does work.
I just forgot to add the new spell based off Searing Arrows to the Paladin.

And signatures have to be granted by a Mod/Admin.
 

WolfieeifloW

WEHZ Helper
Reaction score
372
It works, edited my post above.
Here's the working code:
JASS:
scope NoAutoCast initializer NACInit

    globals
        //--- Locals ---
        private unit nacUnit
        private player nacPlayer
        private timer nacTimer = CreateTimer()
        private integer nacAbil
        //--- Spell Stack ---
        private string array orderStack
        private integer array abilityStack
        private integer stackLevel = 0
        //--- Type Stack ---
        private integer array typeStack
        private integer typeStackLevel = 0
    endglobals
    
    private function Check takes string s returns boolean
        local integer i = 0
        loop
            exitwhen i &gt;= stackLevel
            if s == orderStack<i> then
                return true
            endif
            set i = i + 1
        endloop
        return false
    endfunction
    
    private function TypeCheck takes integer id returns boolean
        local integer i = 0
        loop
            exitwhen i &gt;= typeStackLevel
            if id == typeStack<i> then
                return true
            endif
            set i = i + 1
        endloop
        return false
    endfunction
    
    private function GetAbilityByOrder takes string s, unit u returns integer
        local integer i = 0
        loop
            exitwhen i &gt;= stackLevel
            if s == orderStack<i> and GetUnitAbilityLevel(u, abilityStack<i>) &gt; 0 then
                return abilityStack<i>
            endif
            set i = i + 1
        endloop
        return 0
    endfunction
    
    private function AddToStack takes string s, integer id returns nothing
        set orderStack[stackLevel] = s
        set abilityStack[stackLevel] = id
        set stackLevel = stackLevel + 1
    endfunction
    
    private function AddTypeToStack takes integer id returns nothing
        set typeStack[typeStackLevel] = id
        set typeStackLevel = typeStackLevel + 1
    endfunction
    
    private function CallBack takes nothing returns nothing
        call SetPlayerAbilityAvailable(nacPlayer, nacAbil, true)
    endfunction
    
    private function Conditions takes nothing returns boolean
        local string s = &quot;&quot;
        if TypeCheck(GetUnitTypeId(GetTriggerUnit())) then
            set nacUnit = GetTriggerUnit()
            set nacPlayer = GetOwningPlayer(nacUnit)
            set s = OrderId2String(GetIssuedOrderId())
            if Check(s) then
                set nacAbil = GetAbilityByOrder(s, nacUnit)
                call SetPlayerAbilityAvailable(nacPlayer, nacAbil, false)
                call TimerStart(nacTimer, 0.00, false, function CallBack)
                call SimError(nacPlayer, &quot;This spell isn&#039;t auto-cast!&quot;)
            endif
        endif
        return false
    endfunction
    
    private function NACInit takes nothing returns nothing
        local trigger t = CreateTrigger()
        local integer index = 0
        
        loop
            call TriggerRegisterPlayerUnitEvent(t, Player(index), EVENT_PLAYER_UNIT_ISSUED_ORDER, null)
            set index = index + 1
            exitwhen index == bj_MAX_PLAYER_SLOTS
        endloop
        call TriggerAddCondition(t, Condition(function Conditions))
        
        //Adding spells
        call AddToStack(&quot;flamingarrows&quot;, &#039;A00L&#039;)
        call AddToStack(&quot;flamingarrows&quot;, &#039;A006&#039;)
        
        //Adding unit types
        call AddTypeToStack(feralDruid)
        call AddTypeToStack(retPaladin)
        
        set t = null
    endfunction
    
endscope</i></i></i></i></i>
 

tooltiperror

Super Moderator
Reaction score
231
JASS:
    private function NACInit takes nothing returns nothing

Can you please stop prefixing your functions like this?
 

WolfieeifloW

WEHZ Helper
Reaction score
372
Is it really a big deal :eek: ?

I mean, I know "Init" works fine, but I just sort of like to have that prefix on it.
Helps identify the trigger too if I'm just browsing through, also.
 

tooltiperror

Super Moderator
Reaction score
231
Because it's a bad practice. Scoping exists for a reason. It's improper. Unnecessary namespaces are bad.
 

WolfieeifloW

WEHZ Helper
Reaction score
372
It's not working again, at least for 1/3.
The Death Knight's 'Obliterate' is allowed to go on auto-cast.
However, the Paladin's Crusader Strike and Feral Druid's Claw are stopped like they should be.
JASS:
scope NoAutoCast initializer Init

    globals
        //--- Locals ---
        private unit nacUnit
        private player nacPlayer
        private timer nacTimer = CreateTimer()
        private integer nacAbil
        //--- Spell Stack ---
        private string array orderStack
        private integer array abilityStack
        private integer stackLevel = 0
        //--- Type Stack ---
        private integer array typeStack
        private integer typeStackLevel = 0
    endglobals
    
    private function Check takes string s returns boolean
        local integer i = 0
        loop
            exitwhen i &gt;= stackLevel
            if s == orderStack<i> then
                return true
            endif
            set i = i + 1
        endloop
        return false
    endfunction
    
    private function TypeCheck takes integer id returns boolean
        local integer i = 0
        loop
            exitwhen i &gt;= typeStackLevel
            if id == typeStack<i> then
                return true
            endif
            set i = i + 1
        endloop
        return false
    endfunction
    
    private function GetAbilityByOrder takes string s, unit u returns integer
        local integer i = 0
        loop
            exitwhen i &gt;= stackLevel
            if s == orderStack<i> and GetUnitAbilityLevel(u, abilityStack<i>) &gt; 0 then
                return abilityStack<i>
            endif
            set i = i + 1
        endloop
        return 0
    endfunction
    
    private function AddSpell takes string s, integer id returns nothing
        set orderStack[stackLevel] = s
        set abilityStack[stackLevel] = id
        set stackLevel = stackLevel + 1
    endfunction
    
    private function AddHero takes integer id returns nothing
        set typeStack[typeStackLevel] = id
        set typeStackLevel = typeStackLevel + 1
    endfunction
    
    private function CallBack takes nothing returns nothing
        call SetPlayerAbilityAvailable(nacPlayer, nacAbil, true)
    endfunction
    
    private function Conditions takes nothing returns boolean
        local string s = &quot;&quot;
        if TypeCheck(GetUnitTypeId(GetTriggerUnit())) then
            set nacUnit = GetTriggerUnit()
            set nacPlayer = GetOwningPlayer(nacUnit)
            set s = OrderId2String(GetIssuedOrderId())
            if Check(s) then
                set nacAbil = GetAbilityByOrder(s, nacUnit)
                call SetPlayerAbilityAvailable(nacPlayer, nacAbil, false)
                call TimerStart(nacTimer, 0.00, false, function CallBack)
                call SimError(nacPlayer, &quot;This spell isn&#039;t auto-cast!&quot;)
            endif
        endif
        return false
    endfunction
    
    private function Init takes nothing returns nothing
        local trigger trig = CreateTrigger()
        local integer index = 0
        
        loop
            call TriggerRegisterPlayerUnitEvent(trig, Player(index), EVENT_PLAYER_UNIT_ISSUED_ORDER, null)
            set index = index + 1
            exitwhen index == bj_MAX_PLAYER_SLOTS
        endloop
        call TriggerAddCondition(trig, Condition(function Conditions))
        
        //Adding spells
        call AddSpell(&quot;flamingarrows&quot;, OBLITERATE)
        call AddSpell(&quot;flamingarrows&quot;, claw)
        call AddSpell(&quot;flamingarrows&quot;, crusaderStrike)
        
        //Adding unit types
        call AddHero(DPS_DEATH_KNIGHT)
        call AddHero(feralDruid)
        call AddHero(retPaladin)
        
        set trig = null
    endfunction
    
endscope</i></i></i></i></i>
 
General chit-chat
Help Users
  • No one is chatting at the moment.

      The Helper Discord

      Members online

      No members online now.

      Affiliates

      Hive Workshop NUON Dome World Editor Tutorials

      Network Sponsors

      Apex Steel Pipe - Buys and sells Steel Pipe.
      Top