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:
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.
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 = 039;Aslo039;
private constant integer BUFFCODE = 039;B005039;
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("unit released")
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>,"patrol",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("timer paused")
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,"patrol",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("unit added")
endfunction
private function Actions2 takes nothing returns nothing
local integer i = 1
//call DisableTrigger(ORDER_DENIER)
loop
exitwhen i > I
if GetTriggerUnit() == UNIT<i> then
call IssuePointOrder(UNIT<i>,"patrol",MOVE_X<i>,MOVE_Y<i>)
endif
set i = i+1
endloop
//call EnableTrigger(ORDER_DENIER)
call BJDebugMsg("unit course corrected")
endfunction
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == ABILCODE
endfunction
private function Conditions2 takes nothing returns boolean
return GetUnitAbilityLevel(GetTriggerUnit(),BUFFCODE) > 0 and OrderId2String(GetUnitCurrentOrder(GetTriggerUnit())) != "patrol"
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.