Redirect order "system"

Faust

You can change this now in User CP.
Reaction score
123
JASS:
scope RedirectCast initializer I

private function IsUnitAnAlly takes nothing returns boolean
    if IsPlayerEnemy(GetOwningPlayer(GetFilterUnit()), udg_Player) == false and GetUnitAbilityLevel(GetFilterUnit(), 'Aloc') == 0 and IsUnitType(GetFilterUnit(), UNIT_TYPE_ANCIENT) == false then
     return true
    else
     return false
    endif
endfunction

private function F takes unit u, integer BuffID returns boolean
    return GetUnitAbilityLevel(u, BuffID) == 0
endfunction

private function A takes nothing returns nothing
    local unit u
    if GetUnitAbilityLevel(GetOrderTargetUnit(), 'B00A') == 1 and GetUnitCurrentOrder(GetTriggerUnit()) == 852486 then
     set udg_Player = GetOwningPlayer(GetTriggerUnit())
     call GroupEnumUnitsInRange(G, GetUnitX(GetTriggerUnit()), GetUnitY(GetTriggerUnit()), 650, Condition(function IsUnitAnAlly))
     call GroupRemoveUnit(G, GetTriggerUnit())
     call GroupRemoveUnit(G, GetOrderTargetUnit())
     loop
      set u = FirstOfGroup(G)
     exitwhen F(u, 'B00A') == true or u == null
      call GroupRemoveUnit(G, u)
     endloop
    endif
    call BJDebugMsg(GetUnitName(u) + "Is the new target unit")
    if u != null then
     call IssueTargetOrderById(GetTriggerUnit(), GetIssuedOrderId(), u)
    else
     call PauseUnit(u, true)
     call IssueImmediateOrder(GetTriggerUnit(), "stop")
     call PauseUnit(u, false)
    endif
    call GroupClear(G)
    set u = null
endfunction

//===========================================================================
private function I takes nothing returns nothing
    local trigger t = CreateTrigger()
    call TriggerRegisterAnyUnitEvent(t, EVENT_PLAYER_UNIT_ISSUED_TARGET_ORDER)
    call TriggerAddAction(t, function A)
endfunction

endscope


I want to avoid my autocast system casting an ability on a unit that already has it's buff, and if possible, redirect the order, so it casts it on an other unit, if no buffless units nearby, just make it stop.

This was one of my attempts, but instead of stopping, the caster starts spamming the spell... This one is based on channel, has some follow through time, 15 seconds cooldown, but the cooldown never starts, yet the targeted units gain the spell effects :nuts:
Suggestions? ^^
 

Rainther

I guess I should write something of value here...
Reaction score
61
Try doing SetUnitPosition(u, GetUnitX(u), GetUnitY(u))
instead of pausing and stoping perhaps.
 

Faust

You can change this now in User CP.
Reaction score
123
Well read the code and you will know it should be like that.
 

Faust

You can change this now in User CP.
Reaction score
123
I tried setting unit position, but he stills casts it once o.o
 

Rainther

I guess I should write something of value here...
Reaction score
61
Ah, pardon me. My thingie only works with the event SPELL_CAST. Not issued order.
 

Faust

You can change this now in User CP.
Reaction score
123
Bump

Freshest code:

JASS:
scope RedirectCast initializer I

globals
        private integer BuffID
endglobals


private function IsUnitAnAlly takes nothing returns boolean
    if IsPlayerEnemy(GetOwningPlayer(GetFilterUnit()), udg_Player) == false and GetUnitAbilityLevel(GetFilterUnit(), 'Aloc') == 0 and GetUnitAbilityLevel(GetFilterUnit(), BuffID) == 0 then
     return true
    else
     return false
    endif
endfunction



private function A takes nothing returns nothing
    local unit u
    local location l = GetUnitLoc(GetOrderedUnit())
    //call DisableTrigger(GetTriggeringTrigger())
    if GetUnitAbilityLevel(GetOrderTargetUnit(), 'B00A') == 1 and GetUnitCurrentOrder(GetTriggerUnit()) == 852486 then
     set udg_Player = GetOwningPlayer(GetTriggerUnit())
     set BuffID = 'B00A'
     call GroupEnumUnitsInRange(G, GetUnitX(GetTriggerUnit()), GetUnitY(GetTriggerUnit()), 650, Condition(function IsUnitAnAlly))
     call GroupRemoveUnit(G, GetOrderedUnit())
     set u = FirstOfGroup(G)
    endif
    if u != null then
     call IssueTargetOrderById(GetTriggerUnit(), GetIssuedOrderId(), u)
    else
     call IssueImmediateOrder(GetTriggerUnit(), "stop")
    endif
    call GroupClear(G)
    set u = null
    //call EnableTrigger(GetTriggeringTrigger())
endfunction

//===========================================================================
private function I takes nothing returns nothing
    local trigger t = CreateTrigger()
    call TriggerRegisterAnyUnitEvent(t, EVENT_PLAYER_UNIT_ISSUED_TARGET_ORDER)
    call TriggerAddAction(t, function A)
endfunction

endscope


If I disable/enable the trigger, it still casts it once (should not cast it).
 

Troll-Brain

You can change this now in User CP.
Reaction score
85
Maybe this ?
JASS:
private function A takes nothing returns nothing
    local unit u
    local location l = GetUnitLoc(GetOrderedUnit())
    call DisableTrigger(GetTriggeringTrigger())
    if GetUnitAbilityLevel(GetOrderTargetUnit(), 'B00A') == 1 and GetUnitCurrentOrder(GetTriggerUnit()) == 852486 then
     set udg_Player = GetOwningPlayer(GetTriggerUnit())
     set BuffID = 'B00A'
     call GroupEnumUnitsInRange(G, GetUnitX(GetTriggerUnit()), GetUnitY(GetTriggerUnit()), 650, Condition(function IsUnitAnAlly))
     call GroupRemoveUnit(G, GetOrderedUnit())
     set u = FirstOfGroup(G)
    endif
    call PauseUnit(u,true)
    if u != null then
     call IssueTargetOrderById(GetTriggerUnit(), GetIssuedOrderId(), u)
    else
     call IssueImmediateOrder(GetTriggerUnit(), "stop")
    endif
    call PauseUnit(u,false)
    call GroupClear(G)
    set u = null
    call EnableTrigger(GetTriggeringTrigger())
endfunction


Or better do the pause thing after the check if u isn't null.

Good Idea ™. :thup:
Sounds like a joke.
 
General chit-chat
Help Users
  • No one is chatting at the moment.

      The Helper Discord

      Staff online

      Members online

      Affiliates

      Hive Workshop NUON Dome World Editor Tutorials

      Network Sponsors

      Apex Steel Pipe - Buys and sells Steel Pipe.
      Top