How to prevent infinite order loop?

LurkerAspect

Now officially a Super Lurker
Reaction score
118
Hi there, this time I have a really aggravating problem that's refusing all my attempts to fix it.

Basically I'm making a fear system, whereby a unit who is feared will ignore orders from it's controlling player, and walk around randomly. I've set it up so that it theoretically should work, but I can't prevent an infinite order loop when I order the unit to wander around.

Here's the code:
JASS:
scope Fear initializer init

globals
    private constant integer ABILCODE = 'Aslo'
    private constant integer BUFFCODE = 'B005'
    private constant real MOVE_INTERVAL = 1
    private constant real MOVE_AREA = 300
    
    private integer I = 0
    private unit array UNIT
    private real array MOVE_X
    private real array MOVE_Y
    private timer TIMER = CreateTimer()
    private boolean DENY = false //previous attempt at solving the problem; booleans in the conditions don't work.
    private trigger ORDER_DENIER = CreateTrigger() //I thought if I made this a trigger I could enable/disable, it would fix my problem... NOT
endglobals

private function Callback takes nothing returns nothing
    local integer i = 1
    local real r = GetRandomReal(0,360)
    
    //call DisableTrigger(ORDER_DENIER)
    loop
        exitwhen i > I
        if GetUnitAbilityLevel(UNIT<i>,BUFFCODE) == 0 then
            set UNIT<i> = UNIT<i>
            set MOVE_X<i> = MOVE_X<i>
            set MOVE_Y<i> = MOVE_Y<i>
            set I = I-1
            set i = i-1
            call BJDebugMsg(&quot;unit released&quot;)
        else
            set MOVE_X<i> = GetUnitX(UNIT<i>)+MOVE_AREA*Cos(r)
            set MOVE_Y<i> = GetUnitY(UNIT<i>)+MOVE_AREA*Sin(r)
            call IssuePointOrder(UNIT<i>,&quot;patrol&quot;,MOVE_X<i>,MOVE_Y<i>)
        endif
        set i = i+1
    endloop
    
    //call EnableTrigger(ORDER_DENIER)
    if I == 0 then
        call PauseTimer(TIMER)
        call BJDebugMsg(&quot;timer paused&quot;)
    endif
endfunction

private function Actions takes nothing returns nothing
    local unit u = GetSpellTargetUnit()
    local real r = GetRandomReal(0,360)
    
    //call DisableTrigger(ORDER_DENIER)
    set I = I+1
    set UNIT<i> = u
    set MOVE_X<i> = GetUnitX(u)+MOVE_AREA*Cos(r)
    set MOVE_Y<i> = GetUnitY(u)+MOVE_AREA*Sin(r)
    call IssuePointOrder(u,&quot;patrol&quot;,MOVE_X<i>,MOVE_Y<i>)
    //call EnableTrigger(ORDER_DENIER)
    
    if I == 1 then
        call TimerStart(TIMER,MOVE_INTERVAL,true,function Callback)
    endif
    
    set u = null
    call BJDebugMsg(&quot;unit added&quot;)
endfunction

private function Actions2 takes nothing returns nothing
    local integer i = 1
    
    //call DisableTrigger(ORDER_DENIER)
    loop
        exitwhen i &gt; I
        if GetTriggerUnit() == UNIT<i> then
            call IssuePointOrder(UNIT<i>,&quot;patrol&quot;,MOVE_X<i>,MOVE_Y<i>)
        endif
        set i = i+1
    endloop
    //call EnableTrigger(ORDER_DENIER)
    call BJDebugMsg(&quot;unit course corrected&quot;)
endfunction

private function Conditions takes nothing returns boolean
    return GetSpellAbilityId() == ABILCODE
endfunction

private function Conditions2 takes nothing returns boolean
    return GetUnitAbilityLevel(GetTriggerUnit(),BUFFCODE) &gt; 0 and OrderId2String(GetUnitCurrentOrder(GetTriggerUnit())) != &quot;patrol&quot;
endfunction

private function init takes nothing returns nothing
    local trigger t = CreateTrigger()
    call TriggerRegisterAnyUnitEventBJ(t,EVENT_PLAYER_UNIT_SPELL_CAST)
    call TriggerAddCondition(t,Condition(function Conditions))
    call TriggerAddAction(t,function Actions)
    //=================================================================================
    call TriggerRegisterAnyUnitEventBJ(ORDER_DENIER,EVENT_PLAYER_UNIT_ISSUED_POINT_ORDER)
    call TriggerRegisterAnyUnitEventBJ(ORDER_DENIER,EVENT_PLAYER_UNIT_ISSUED_UNIT_ORDER)
    call TriggerRegisterAnyUnitEventBJ(ORDER_DENIER,EVENT_PLAYER_UNIT_ISSUED_ORDER)
    call TriggerRegisterAnyUnitEventBJ(ORDER_DENIER,EVENT_PLAYER_UNIT_ISSUED_TARGET_ORDER)
    call TriggerAddCondition(ORDER_DENIER,Condition(function Conditions2))
    call TriggerAddAction(ORDER_DENIER,function Actions2)
    set t = null
endfunction

endscope</i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i></i>

Commented out are some of my previous attempts, which did'nt work :/. I'm not interested in comments about how my code could be improved or how terrible it is, I just want comments relevant to the problem.
 

LurkerAspect

Now officially a Super Lurker
Reaction score
118
Thanks for the reply luorax but I've already solved my problem using a timer that periodically orders the unit to move, overriding any player input. +repped anyway :)
 
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