Spot the differences +REP

Lightstalker

New Member
Reaction score
55
So once upon a time, in 20 minutes, I made this gigantic multi-trigger that moves a unit based on arrow keys pressed.

JASS:
scope Movement initializer Init

private function Actions takes nothing returns nothing
    local real angle = 0.0
    local real x = 0.0
    local real y = 0.0
    local integer i = 0
    
    loop
        if LEFTBOOLEAN<i> and UPBOOLEAN<i> == true then
            set angle = 135.0
            set x = GetUnitX(FIGHTER<i>) + 1024 * Cos(angle * bj_DEGTORAD)
            set y = GetUnitY(FIGHTER<i>) + 1024 * Sin(angle * bj_DEGTORAD)
            call IssuePointOrder(FIGHTER<i>, &quot;move&quot;, x, y)
        elseif LEFTBOOLEAN<i> and DOWNBOOLEAN<i> == true then
            set angle = 235.0
            set x = GetUnitX(FIGHTER<i>) + 1024 * Cos(angle * bj_DEGTORAD)
            set y = GetUnitY(FIGHTER<i>) + 1024 * Sin(angle * bj_DEGTORAD)
            call IssuePointOrder(FIGHTER<i>, &quot;move&quot;, x, y)
        elseif RIGHTBOOLEAN<i> and UPBOOLEAN<i> == true then
            set angle = 45.0
            set x = GetUnitX(FIGHTER<i>) + 1024 * Cos(angle * bj_DEGTORAD)
            set y = GetUnitY(FIGHTER<i>) + 1024 * Sin(angle * bj_DEGTORAD)
            call IssuePointOrder(FIGHTER<i>, &quot;move&quot;, x, y)
        elseif RIGHTBOOLEAN<i> and DOWNBOOLEAN<i> == true then
            set angle = 315.0
            set x = GetUnitX(FIGHTER<i>) + 1024 * Cos(angle * bj_DEGTORAD)
            set y = GetUnitY(FIGHTER<i>) + 1024 * Sin(angle * bj_DEGTORAD)
            call IssuePointOrder(FIGHTER<i>, &quot;move&quot;, x, y)
            
            elseif LEFTBOOLEAN<i> == true then
                set angle = 180.0
                set x = GetUnitX(FIGHTER<i>) + 1024 * Cos(angle * bj_DEGTORAD)
                set y = GetUnitY(FIGHTER<i>) + 1024 * Sin(angle * bj_DEGTORAD)
                call IssuePointOrder(FIGHTER<i>, &quot;move&quot;, x, y)
            elseif RIGHTBOOLEAN<i> == true then
                set angle = 0.0
                set x = GetUnitX(FIGHTER<i>) + 1024 * Cos(angle * bj_DEGTORAD)
                set y = GetUnitY(FIGHTER<i>) + 1024 * Sin(angle * bj_DEGTORAD)
                call IssuePointOrder(FIGHTER<i>, &quot;move&quot;, x, y)
            elseif UPBOOLEAN<i> == true then
                set angle = 90.0
                set x = GetUnitX(FIGHTER<i>) + 1024 * Cos(angle * bj_DEGTORAD)
                set y = GetUnitY(FIGHTER<i>) + 1024 * Sin(angle * bj_DEGTORAD)
                call IssuePointOrder(FIGHTER<i>, &quot;move&quot;, x, y)
            elseif DOWNBOOLEAN<i> == true then
                set angle = 270.0
                set x = GetUnitX(FIGHTER<i>) + 1024 * Cos(angle * bj_DEGTORAD)
                set y = GetUnitY(FIGHTER<i>) + 1024 * Sin(angle * bj_DEGTORAD)
                call IssuePointOrder(FIGHTER<i>, &quot;move&quot;, x, y)
            endif
    set i = i + 1
    exitwhen i &gt; 11
    endloop
endfunction

private function MoveLeft takes nothing returns nothing
    local integer pid = GetPlayerId(GetTriggerPlayer())
    local real angle = 180.0
    local real x = GetUnitX(FIGHTER[pid]) + 1024 * Cos(angle * bj_DEGTORAD)
    local real y = GetUnitY(FIGHTER[pid]) + 1024 * Sin(angle * bj_DEGTORAD)
    
    set LEFTBOOLEAN[pid] = true
    call IssuePointOrder(FIGHTER[pid], &quot;move&quot;, x, y)
endfunction
private function StopLeft takes nothing returns nothing
    local integer pid = GetPlayerId(GetTriggerPlayer())
    set LEFTBOOLEAN[pid] = false
    call IssueImmediateOrder(FIGHTER[pid], &quot;stop&quot;)
endfunction

private function MoveRight takes nothing returns nothing
    local integer pid = GetPlayerId(GetTriggerPlayer())
    local real angle = 0.0
    local real x = GetUnitX(FIGHTER[pid]) + 1024 * Cos(angle * bj_DEGTORAD)
    local real y = GetUnitY(FIGHTER[pid]) + 1024 * Sin(angle * bj_DEGTORAD)
    
    set RIGHTBOOLEAN[pid] = true
    call IssuePointOrder(FIGHTER[pid], &quot;move&quot;, x, y)
endfunction
private function StopRight takes nothing returns nothing
    local integer pid = GetPlayerId(GetTriggerPlayer())
    set RIGHTBOOLEAN[pid] = false
    call IssueImmediateOrder(FIGHTER[pid], &quot;stop&quot;)
endfunction

private function MoveUp takes nothing returns nothing
    local integer pid = GetPlayerId(GetTriggerPlayer())
    local real angle = 90.0
    local real x = GetUnitX(FIGHTER[pid]) + 1024 * Cos(angle * bj_DEGTORAD)
    local real y = GetUnitY(FIGHTER[pid]) + 1024 * Sin(angle * bj_DEGTORAD)
    
    set UPBOOLEAN[pid] = true
    call IssuePointOrder(FIGHTER[pid], &quot;move&quot;, x, y)
endfunction
private function StopUp takes nothing returns nothing
    local integer pid = GetPlayerId(GetTriggerPlayer())
    set UPBOOLEAN[pid] = false
    call IssueImmediateOrder(FIGHTER[pid], &quot;stop&quot;)
endfunction


private function MoveDown takes nothing returns nothing
    local integer pid = GetPlayerId(GetTriggerPlayer())
    local real angle = 270.0
    local real x = GetUnitX(FIGHTER[pid]) + 1024 * Cos(angle * bj_DEGTORAD)
    local real y = GetUnitY(FIGHTER[pid]) + 1024 * Sin(angle * bj_DEGTORAD)
    
    set DOWNBOOLEAN[pid] = true
    call IssuePointOrder(FIGHTER[pid], &quot;move&quot;, x, y)
endfunction
private function StopDown takes nothing returns nothing
    local integer pid = GetPlayerId(GetTriggerPlayer())
    set DOWNBOOLEAN[pid] = false
    call IssueImmediateOrder(FIGHTER[pid], &quot;stop&quot;)
endfunction

private function Init takes nothing returns nothing
    local trigger pressleft = CreateTrigger()
    local trigger releaseleft = CreateTrigger()
    
    local trigger pressright = CreateTrigger()
    local trigger releaseright = CreateTrigger()
    
    local trigger pressup = CreateTrigger()
    local trigger releaseup = CreateTrigger()
    
    local trigger pressdown = CreateTrigger()
    local trigger releasedown = CreateTrigger()

    local integer i = 0
    local trigger t = CreateTrigger()
    call TriggerRegisterTimerEvent(t, 0.333, true)
    loop
        
        call TriggerRegisterPlayerKeyEventBJ(pressleft, Player(i), bj_KEYEVENTTYPE_DEPRESS, bj_KEYEVENTKEY_LEFT)
        call TriggerRegisterPlayerKeyEventBJ(releaseleft, Player(i), bj_KEYEVENTTYPE_RELEASE, bj_KEYEVENTKEY_LEFT)
        
        call TriggerRegisterPlayerKeyEventBJ(pressright, Player(i), bj_KEYEVENTTYPE_DEPRESS, bj_KEYEVENTKEY_RIGHT)
        call TriggerRegisterPlayerKeyEventBJ(releaseright, Player(i), bj_KEYEVENTTYPE_RELEASE, bj_KEYEVENTKEY_RIGHT)
        
        call TriggerRegisterPlayerKeyEventBJ(pressup, Player(i), bj_KEYEVENTTYPE_DEPRESS, bj_KEYEVENTKEY_UP)
        call TriggerRegisterPlayerKeyEventBJ(releaseup, Player(i), bj_KEYEVENTTYPE_RELEASE, bj_KEYEVENTKEY_UP)
        
        call TriggerRegisterPlayerKeyEventBJ(pressdown, Player(i), bj_KEYEVENTTYPE_DEPRESS, bj_KEYEVENTKEY_DOWN)
        call TriggerRegisterPlayerKeyEventBJ(releasedown, Player(i), bj_KEYEVENTTYPE_RELEASE, bj_KEYEVENTKEY_DOWN)
    set i = i + 1
    exitwhen i &gt; 11
    endloop
    
    call TriggerAddAction(t, function Actions)
    
    call TriggerAddAction(pressleft, function MoveLeft)
    call TriggerAddAction(releaseleft, function StopLeft)
    
    call TriggerAddAction(pressright, function MoveRight)
    call TriggerAddAction(releaseright, function StopRight)
    
    call TriggerAddAction(pressup, function MoveUp)
    call TriggerAddAction(releaseup, function StopUp)
    
    call TriggerAddAction(pressdown, function MoveDown)
    call TriggerAddAction(releasedown, function StopDown)
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></i></i></i></i></i></i></i></i></i></i></i></i></i>


I then decided to optimize it (and by that I mean cut it up into different triggers), but it would not work correctly anymore:

JASS:
scope MoveLeft initializer Init
    
    private function Move takes nothing returns nothing
        local integer pid = GetPlayerId(GetTriggerPlayer())
        local real angle = 180.0
        local real x = GetUnitX(FIGHTER[pid]) + 1024 * Cos(angle * bj_DEGTORAD)
        local real y = GetUnitY(FIGHTER[pid]) + 1024 * Sin(angle * bj_DEGTORAD)
        
        set LEFTBOOLEAN[pid] = true
        call IssuePointOrder(FIGHTER[pid], &quot;move&quot;, x, y)
    endfunction
    
    private function Stop takes nothing returns nothing
        local integer pid = GetPlayerId(GetTriggerPlayer())
        set LEFTBOOLEAN[pid] = false
        call IssueImmediateOrder(FIGHTER[pid], &quot;stop&quot;)
    endfunction

    private function Init takes nothing returns nothing
        local integer i = 0
        local trigger press = CreateTrigger()
        local trigger release = CreateTrigger()
        
        loop
            call TriggerRegisterPlayerEvent(press, Player(i), EVENT_PLAYER_ARROW_LEFT_DOWN)
            call TriggerRegisterPlayerEvent(release, Player(i), EVENT_PLAYER_ARROW_LEFT_UP)
        set i = i + 1
        exitwhen i == 12
        endloop
        call TriggerAddAction(press, function Move)
        call TriggerAddAction(release, function Stop)
    endfunction
endscope


For some reason, the unit will move left, and then stop and attempt to move in every direction at once.
 

ZugZugZealot

New Member
Reaction score
33
You lack something that tells it to "keep going". The first one has a periodic trigger which keeps track of when a key is down or up and moves every 1/3rd second while the key press events merely set a boolean for the periodic to read (press event set to true; release event set to false). The second one merely tells the unit to be moved once upon the arrow key event.
 
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