move part of ability not working, unsure why

Discussion in 'JASS Zone' started by afisakov, Feb 25, 2016.

  1. afisakov

    afisakov You can change this now in User CP.

    Ratings:
    +38 / 0 / -0
    I am working on adding an AOE hex to a tower-defense map. I based it off a triggered-hex another unit has in-game. So far I got the hex to work but cannot force the unit to resume moving again afterwards.
    main ability:
    JASS:
    function Trig_hex_aoe_Conditions takes nothing returns boolean
      return (GetUnitTypeId(GetAttacker())=='o022') and GetUnitState(GetAttacker(),UNIT_STATE_MANA)>100.
    endfunction
    
    function hithexc takes nothing returns boolean
       return IsUnitEnemy(GetFilterUnit(),GetOwningPlayer(GetAttacker())) and GetUnitState(GetFilterUnit(),UNIT_STATE_LIFE)>0.405 and (GetUnitAbilityLevel(GetFilterUnit(), 'ACmi') < 1) and (GetUnitAbilityLevel(GetFilterUnit(), 'Bams') < 1)
    endfunction
    
    function forcemove2 takes unit u1 returns nothing
    call TriggerSleepAction(0.2)
    call DisplayTextToForce( GetPlayersAll(), "1" )
       set udg_TempPoint = GetRectCenter(udg_Regions[GetUnitUserData(u1)])
       call IssuePointOrderLoc( u1, "move", udg_TempPoint )
       call RemoveLocation(udg_TempPoint)
    endfunction
    function forcemove2s takes unit u1, integer i returns nothing
    local integer tr
    call DisplayTextToForce( GetPlayersAll(), "1" )
    if IsUnitInGroup(u1, udg_Red) then
       set tr=1
       elseif IsUnitInGroup(u1, udg_Blue) then
       set tr=2
       elseif IsUnitInGroup(u1, udg_Teal) then
       set tr=3
       elseif IsUnitInGroup(u1, udg_Purple) then
       set tr=4
       endif
       call PolledWait(i+0.1)
       set udg_TempPoint = GetRectCenter(udg_SiegeRegions[tr])
       call IssuePointOrderLoc( u1, "attack", udg_TempPoint )
       call RemoveLocation(udg_TempPoint)
    endfunction
    
    function hexem takes nothing returns nothing
    local unit u=GetEnumUnit()
    local unit u2
    if IsUnitType(u, UNIT_TYPE_SUMMONED) then
       call UnitDamageTargetBJ(GetAttacker(),u, ( 4000.* udg_abp[GetConvertedPlayerId(GetOwningPlayer(GetAttacker()))] ), ATTACK_TYPE_CHAOS, DAMAGE_TYPE_NORMAL )
    else
       set u2=CreateUnit(GetOwningPlayer(GetAttacker()), 'n00C', GetUnitX(u),GetUnitY(u), 270.0)
       call UnitAddAbilityBJ( 'A02C', u2 )
       call SetUnitAbilityLevel(u2, 'A02C', udg_inthex)
       call IssueTargetOrderBJ( u2, "hex", u )
       call UnitApplyTimedLife(u2, 'BTLF', .5)
    [B]   call DisplayTextToForce( GetPlayersAll(), "0" )
       if udg_Siege then
         call forcemove2s(u,udg_inthex)
       else
         call forcemove2(u)
       endif[/B]
    endif
    set u=null
    set u2=null
    endfunction
    
    function Trig_hex_aoe_Actions takes nothing returns nothing
    local location tp1
    local real hexl
    local group tg
    local integer pn=GetConvertedPlayerId(GetOwningPlayer(GetAttacker()))
    local real cx
    if (GetUnitAbilityLevel(GetTriggerUnit(), 'ACmi') < 1) and (GetUnitAbilityLevel(GetTriggerUnit(), 'Bams') < 1) then
       set hexl=6.*Pow(.95,udg_hlev)*udg_abp[pn]
       set udg_inthex=R2I(hexl+.5)
       set cx=200*udg_mypc[pn]
       set tp1=GetUnitLoc(GetTriggerUnit())
       set tg=GetUnitsInRangeOfLocMatching(cx,tp1,Condition(function hithexc))
       call ForGroup(tg,function hexem)
       call DestroyGroup(tg)
       call RemoveLocation (tp1)
       call SetUnitState(GetAttacker(), UNIT_STATE_MANA, GetUnitState(GetAttacker(),UNIT_STATE_MANA)-100*(2.-udg_mypc[pn]) )
    endif
    set tg=null
    set tp1=null
    endfunction
    
    //===========================================================================
    function InitTrig_hex_aoe takes nothing returns nothing
       set gg_trg_hex_aoe = CreateTrigger(  )
       call TriggerRegisterPlayerUnitEventSimple( gg_trg_hex_aoe, Player(11), EVENT_PLAYER_UNIT_ATTACKED )
       call TriggerAddCondition( gg_trg_hex_aoe, Condition( function Trig_hex_aoe_Conditions ) )
       call TriggerAddAction( gg_trg_hex_aoe, function Trig_hex_aoe_Actions )
    endfunction

    I tried to use the displaytexttoplayersall function to troubleshoot, but now got stuck. I cannot figure out why it displays "0" repeatedly (multiple units in area), but not the "1".

    the ability it was based on, in which the move again function does work:
    JASS:
    function Trig_Hexing_Tower_2_Conditions takes nothing returns boolean
       if not( (GetUnitTypeId(GetAttacker())=='o011') or(GetUnitTypeId(GetAttacker())=='o012') or(GetUnitTypeId(GetAttacker())=='o015') ) then
         return false
       endif
       if GetUnitStateSwap(UNIT_STATE_MANA, GetAttacker())<100. then
         return false
      endif
      return true
    endfunction
    
    function forcemove takes unit u1 returns nothing
    call TriggerSleepAction(0.2)
       set udg_TempPoint = GetRectCenter(udg_Regions[GetUnitUserData(u1)])
       call IssuePointOrderLoc( u1, "move", udg_TempPoint )
       call RemoveLocation(udg_TempPoint)
    endfunction
    function forcemoves takes unit u1, integer i returns nothing
    local integer tr
    if IsUnitInGroup(u1, udg_Red) then
       set tr=1
       elseif IsUnitInGroup(u1, udg_Blue) then
       set tr=2
       elseif IsUnitInGroup(u1, udg_Teal) then
       set tr=3
       elseif IsUnitInGroup(u1, udg_Purple) then
       set tr=4
       endif
       call PolledWait(i+0.1)
       set udg_TempPoint = GetRectCenter(udg_SiegeRegions[tr])
       call IssuePointOrderLoc( u1, "attack", udg_TempPoint )
       call RemoveLocation(udg_TempPoint)
    endfunction
    
    function Trig_Hexing_Tower_2_Actions takes nothing returns nothing
    local unit u=GetTriggerUnit()
    local unit u2
    local real hexl
    if (GetUnitAbilityLevel(u, 'BOhx') < 1) and GetUnitUserData(GetAttacker())==0 then
    if (GetUnitAbilityLevel(u, 'ACmi') < 1) and (GetUnitAbilityLevel(u, 'Bams') < 1) then
       if IsUnitType(u, UNIT_TYPE_SUMMONED) then
       call UnitDamageTargetBJ(GetAttacker(),u, ( 900.* udg_abp[GetConvertedPlayerId(GetOwningPlayer(GetAttacker()))] ), ATTACK_TYPE_CHAOS, DAMAGE_TYPE_NORMAL )
       else
       set u2=CreateUnit(GetOwningPlayer(GetAttacker()), 'n00C', GetUnitX(u),GetUnitY(u), 270.0)
       call UnitAddAbilityBJ( 'A02C', u2 )
       set hexl=10.*Pow(.95,udg_hlev)*udg_abp[GetConvertedPlayerId(GetOwningPlayer(GetAttacker()))]
       call SetUnitAbilityLevel(u2, 'A02C', R2I(hexl+.5))
       call IssueTargetOrderBJ( u2, "hex", u )
       call UnitApplyTimedLife(u2, 'BTLF', .5)
       if udg_Siege then
         call forcemoves(u,R2I(hexl+.5))
       else
         call forcemove(u)
       endif
       endif
       call SetUnitState(GetAttacker(), UNIT_STATE_MANA, GetUnitState(GetAttacker(),UNIT_STATE_MANA)-100*(2.-udg_mypc[GetConvertedPlayerId(GetOwningPlayer(GetAttacker()))]) )
    endif
    endif
    set u=null
    set u2=null
    endfunction
    
    //===========================================================================
    function InitTrig_Hexing_Tower_2 takes nothing returns nothing
      set gg_trg_Hexing_Tower_2 = CreateTrigger(  )
      call TriggerRegisterPlayerUnitEventSimple( gg_trg_Hexing_Tower_2, Player(11), EVENT_PLAYER_UNIT_ATTACKED )
      call TriggerAddCondition( gg_trg_Hexing_Tower_2, Condition( function Trig_Hexing_Tower_2_Conditions ) )
      call TriggerAddAction( gg_trg_Hexing_Tower_2, function Trig_Hexing_Tower_2_Actions )
    endfunction
    ps. udg_siege is a boolean, game does not give me a syntax error when saving in world editor, and once again the hex itself works, something goes wrong after the display "0" command and the display "1" command does not run.

    Thanks in advance for the help
     
    Last edited: Feb 25, 2016
  2. jonas

    jonas Well-Known Member

    Ratings:
    +42 / 4 / -0
    • Informative Informative x 1
  3. afisakov

    afisakov You can change this now in User CP.

    Ratings:
    +38 / 0 / -0
    Thanks for the tip, unfortunately it only half-fixes my problem.
    Removing the wait makes the game message appear properly, but the move still does not work.
    I tested the change on the base ability trigger, and removing the wait there made it stop working. It seems I need the delay to get units to obey orders after they have been hexed, simultaneous orders fail.

    Any ideas on a workaround? or why the triggersleepaction was ok in the base trigger?

    p.s. I already tried using PolledWait and it created the same problem.
     
  4. jonas

    jonas Well-Known Member

    Ratings:
    +42 / 4 / -0
    Wait before the callback.

    Because it was not in a callback.

    Because it is a TriggerSleepAction.

    Maybe you will understand better if you imagine the callback to be executed as a loop. Unit n+1 is only considered once unit n has been completely processed. So if you wait in the callback, then the waits would accumulate, which is certainly not what you want.


    Oh, another thing. If you have to do something, then wait; or you have to wait repeatedly, you can use callback, wait, callback; or a timer and a global group/list of groups, where the callback of the timer runs the ForGroup.
     
    Last edited: Mar 7, 2016
    • Like Like x 1
  5. afisakov

    afisakov You can change this now in User CP.

    Ratings:
    +38 / 0 / -0
    Thank you!I had assumed that since the wait was in a different function it would not affect the callforgroup function. but thinking of it as 1 big loop really helped me visualize the problem. I rebuilt the trigger based on more transparent loops and finally got it to work :)
    JASS:
    function Trig_hex_aoe_Conditions takes nothing returns boolean
      return (GetUnitTypeId(GetAttacker())=='o022') and GetUnitState(GetAttacker(),UNIT_STATE_MANA)>100.
    endfunction
    
    function hithexc takes nothing returns boolean
       return IsUnitEnemy(GetFilterUnit(),GetOwningPlayer(GetAttacker())) and GetUnitState(GetFilterUnit(),UNIT_STATE_LIFE)>0.405 and (GetUnitAbilityLevel(GetFilterUnit(), 'ACmi') < 1) and (GetUnitAbilityLevel(GetFilterUnit(), 'Bams') < 1)
    endfunction
    
    function Trig_hex_aoe_Actions takes nothing returns nothing
    local location tp1
    local real hexl
    local group tg
    local group tg2=CreateGroup()
    local unit u
    local unit u2
    local integer pn=GetConvertedPlayerId(GetOwningPlayer(GetAttacker()))
    local integer i
    local real cx
    if (GetUnitAbilityLevel(GetTriggerUnit(), 'ACmi') < 1) and (GetUnitAbilityLevel(GetTriggerUnit(), 'Bams') < 1) then
       set hexl=6.*Pow(.95,udg_hlev)*udg_abp[pn]
       if IsUnitType(GetTriggerUnit(), UNIT_TYPE_MECHANICAL) then
         set hexl=hexl*.7
       endif
       if udg_Siege then
         set hexl=hexl*.65
       endif
       if udg_Level==41 then
         set hexl=hexl*.6
       endif
       set udg_inthex=R2I(hexl+.5)
       set cx=240*udg_abp[pn]
       set tp1=GetUnitLoc(GetTriggerUnit())
       set tg=GetUnitsInRangeOfLocMatching(cx,tp1,Condition(function hithexc))
       call RemoveLocation (tp1)
       loop
         set u=FirstOfGroup(tg)
         exitwhen u==null
         call GroupRemoveUnit(tg, u)
         call GroupAddUnit(tg2, u)
         if IsUnitType(u, UNIT_TYPE_SUMMONED) then
           call UnitDamageTargetBJ(GetAttacker(),u, ( 4000.* udg_abp[GetConvertedPlayerId(GetOwningPlayer(GetAttacker()))] ), ATTACK_TYPE_CHAOS, DAMAGE_TYPE_NORMAL )
         else
           set u2=CreateUnit(GetOwningPlayer(GetAttacker()), 'n00C', GetUnitX(u),GetUnitY(u), 270.0)
           call UnitAddAbilityBJ( 'A02C', u2 )
           call SetUnitAbilityLevel(u2, 'A02C', udg_inthex)
           call IssueTargetOrderBJ( u2, "hex", u )
           call UnitApplyTimedLife(u2, 'BTLF', .5)
         endif
         set u=null
       endloop
      
       if udg_Siege then
       call PolledWait(udg_inthex+0.1)
       loop
         set u=FirstOfGroup(tg2)
         exitwhen u==null
         call GroupRemoveUnit(tg2, u)
         if IsUnitInGroup(u, udg_Red) then
         set i=1
         elseif IsUnitInGroup(u, udg_Blue) then
         set i=2
         elseif IsUnitInGroup(u, udg_Teal) then
         set i=3
         elseif IsUnitInGroup(u, udg_Purple) then
         set i=4
         endif
         set udg_TempPoint = GetRectCenter(udg_SiegeRegions[I])
         call IssuePointOrderLoc( u, "attack", udg_TempPoint )
         call RemoveLocation(udg_TempPoint)
         set u=null
       endloop
       else
       call PolledWait(0.2)
       loop
         set u=FirstOfGroup(tg2)
         exitwhen u==null
         call GroupRemoveUnit(tg2, u)
         set udg_TempPoint = GetRectCenter(udg_Regions[GetUnitUserData(u)])
         call IssuePointOrderLoc( u, "move", udg_TempPoint )
         call RemoveLocation(udg_TempPoint)   
         set u=null
       endloop
       endif
       
       call DestroyGroup(tg)
       call DestroyGroup(tg2)
       call SetUnitState(GetAttacker(), UNIT_STATE_MANA, GetUnitState(GetAttacker(),UNIT_STATE_MANA)-100*(2.-udg_mypc[pn]) )
    endif
    set tg=null
    set tg2=null
    set tp1=null
    set u2=null
    endfunction
    
    //===========================================================================
    function InitTrig_hex_aoe takes nothing returns nothing
       set gg_trg_hex_aoe = CreateTrigger(  )
       call TriggerRegisterPlayerUnitEventSimple( gg_trg_hex_aoe, Player(11), EVENT_PLAYER_UNIT_ATTACKED )
       call TriggerAddCondition( gg_trg_hex_aoe, Condition( function Trig_hex_aoe_Conditions ) )
       call TriggerAddAction( gg_trg_hex_aoe, function Trig_hex_aoe_Actions )
    endfunction
    [/I]
    Posted the fixed version just in case someone was interested.
     

Share This Page