| 07-19-2009, 03:00 PM | #1 |
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. 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 |
| 07-19-2009, 03:08 PM | #2 |
> 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 |
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 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 |
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. |
