HomeUser Control Panel (unavailable in archive)ForumsTutorialsArt GalleryResourcesMaps

Creep agro

07-19-2009, 03:00 PM#1
Sinnergy
Hi I made this trigger to replicate DotA's creep agro system (or they didn't triggered it), here's what the system does, if a unit attacks a hero (or even just issued an order to attack a hero) allied units within 500 range of the attacked hero will be ordered to attack the attacking unit, then a 2 second non periodic timer starts, that when expired, it orders back the picked unit to its last order (I used last order system) so that it will go back to its lane.

I'm not sure if DotA triggered it or not. I already tried changing the value of Stats - Priorities on heroes, and still didn't have the same effect.

My trigger has no compile error, but it does crash warcraft after some hero attacks.
Collapse JASS:
scope CreepAgro initializer init

private struct data
    group e
endstruct

private function tick takes nothing returns nothing
    local timer t = GetExpiredTimer()
    local data d = GetTimerData(t)
    local unit u
    loop
        set u = FirstOfGroup(d.e)
        exitwhen u == null
        call IssueSecondLastOrder(u)
        call GroupRemoveUnit(d.e,u)
    endloop
    call ReleaseGroup(d.e)
    call ReleaseTimer(t)
    call d.destroy()
    set t = null
    set u = null
endfunction

private function con takes nothing returns boolean
    return IsUnitType(GetOrderTargetUnit(),UNIT_TYPE_HERO) and not IsUnitIllusion(GetOrderTargetUnit()) and GetIssuedOrderId() == 851983
endfunction

private function filter takes nothing returns boolean
    return IsUnitAlly(GetFilterUnit(),GetOwningPlayer(GetOrderTargetUnit())) and not IsUnitType(GetFilterUnit(),UNIT_TYPE_HERO)
endfunction

private function act takes nothing returns nothing
    local timer t = NewTimer()
    local data d = data.create()
    local unit trg = GetTriggerUnit()
    local group g = NewGroup()
    local unit u
    set d.e = NewGroup()
    call GroupEnumUnitsInRange(g,GetUnitX(trg),GetUnitY(trg),500.0,null)
    loop
        set u = FirstOfGroup(g)
        exitwhen u == null
        call IssueTargetOrder(u,"attack",trg)
        call GroupAddUnit(d.e,u)
        call GroupRemoveUnit(g,u)
    endloop
    call ReleaseGroup(g)
    call TimerStart(t,2.0,false,function tick)
    call SetTimerData(t,d)
    set g = null
    set trg = null
    set t = null
    set u = null
endfunction

//===========================================================================
private function init takes nothing returns nothing
    local trigger t = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( t, EVENT_PLAYER_UNIT_ISSUED_TARGET_ORDER )
    call TriggerAddCondition(t,Condition(function con))
    call TriggerAddAction( t, function act )
endfunction

endscope
really need the trigger in my map, thanks
07-19-2009, 03:08 PM#2
Tyrande_ma3x
> call IssueTargetOrder(u,"attack",trg)
Try disabling the triggering trigger before this call and enabling it right after, maybe your problem is an infinite loop caused by order detection.
07-20-2009, 12:08 AM#3
Sinnergy
ok I changed some conditions to avoid infinite loops, but the main problem for now is, I cant reorder the creeps with its second last order, or their last order, they just sit there and stand by after the 2 second timer is out

Collapse JASS:
scope CreepAgro initializer init

private struct data
    group e
endstruct

private function tick takes nothing returns nothing
    local timer t = GetExpiredTimer()
    local data d = GetTimerData(t)
    local unit u
    loop
        set u = FirstOfGroup(d.e)
        exitwhen u == null
        call IssueLastOrder(u)
        call GroupRemoveUnit(d.e,u)
    endloop
    call ReleaseGroup(d.e)
    call ReleaseTimer(t)
    call d.destroy()
    set t = null
    set u = null
endfunction

private function con takes nothing returns boolean
    return IsUnitType(GetOrderTargetUnit(),UNIT_TYPE_HERO) and IsUnitType(GetTriggerUnit(),UNIT_TYPE_HERO) and not IsUnitIllusion(GetOrderTargetUnit()) and GetIssuedOrderId() == 851983
endfunction

private function filter takes nothing returns boolean
    return IsUnitAlly(GetFilterUnit(),GetOwningPlayer(GetOrderTargetUnit())) and not IsUnitType(GetFilterUnit(),UNIT_TYPE_HERO)
endfunction

private function act takes nothing returns nothing
    local timer t = NewTimer()
    local data d = data.create()
    local unit trg = GetTriggerUnit()
    local group g = NewGroup()
    local unit u
    set d.e = NewGroup()
    call GroupEnumUnitsInRange(g,GetUnitX(trg),GetUnitY(trg),500.0,Condition(function filter))
    loop
        set u = FirstOfGroup(g)
        exitwhen u == null
        call IssueTargetOrder(u,"attack",trg)
        call GroupAddUnit(d.e,u)
        call GroupRemoveUnit(g,u)
    endloop
    call ReleaseGroup(g)
    call TimerStart(t,2.0,false,function tick)
    call SetTimerData(t,d)
    set g = null
    set trg = null
    set t = null
    set u = null
endfunction

//===========================================================================
private function init takes nothing returns nothing
    local trigger t = CreateTrigger(  )
    call TriggerRegisterAnyUnitEventBJ( t, EVENT_PLAYER_UNIT_ISSUED_TARGET_ORDER )
    call TriggerAddCondition(t,Condition(function con))
    call TriggerAddAction( t, function act )
endfunction

endscope
07-20-2009, 10:42 AM#4
PotatoPeeler
Not suree if this helps but perhaps it's because the unit that it's last order was targeted on is not visible therefore not clickable.