//ββββββββββββββββββββββββββββββββββββββββββββββββββββββ
scope Locator initializer Init
//ββββββββββββββββββββββββββββββββββββββββββββββββββββββ
globals
private constant trigger The_Trigger = CreateTrigger()
private constant group The_Group = CreateGroup()
private constant real SR3 = SquareRoot(3.)
private constant location loc = Location(0.,0.)
private constant hashtable Hash = InitHashtable()
private real array cos
private real array sin
private real z
private integer id
private integer it
endglobals
//ββββββββββββββββββββββββββββββββββββββββββββββββββββββ
private function Found takes unit u,integer i,real SrcX,real SrcY,real SrcZ returns boolean
local real To_X = SrcX + cos[i]
local real To_Y = SrcY + sin[i]
local real To_Z = GetLocationZ(loc)
loop
exitwhen (i == 0)
set i = i - 1
call MoveLocation(loc,SrcX + cos[i],SrcY + sin[i])
if (GetLocationZ(loc) < To_Z) then
set To_X = SrcX + cos[i]
set To_Y = SrcY + sin[i]
set To_Z = GetLocationZ(loc)
endif
endloop
if (SrcZ - To_Z >= SR3) then
set id = GetHandleId(u)
set it = LoadInteger(Hash,id,0)
if it < 1 then
call DestroyEffect(AddSpecialEffect("Objects\\Spawnmodels\\Undead\\ImpaleTargetDust\\ImpaleTargetDust.mdl",SrcX,SrcY))
call SaveInteger(Hash,id,0,30)
else
call SaveInteger(Hash,id,0,it-1)
endif
call SetUnitX(u,To_X)
call SetUnitY(u,To_Y)
endif
return true
endfunction
//ββββββββββββββββββββββββββββββββββββββββββββββββββββββ
private function DoEval takes unit u returns nothing
local integer i = 29
local real x = GetUnitX(u)
local real y = GetUnitY(u)
call MoveLocation(loc,x,y)
set z = GetLocationZ(loc)
loop
call MoveLocation(loc,x + cos[i],y + sin[i])
if (GetLocationZ(loc) < z) then
exitwhen (Found(u,i,x,y,z))
endif
exitwhen (i == 0)
set i = i - 1
endloop
endfunction
//ββββββββββββββββββββββββββββββββββββββββββββββββββββββ
private function Pick takes nothing returns nothing
call DoEval(GetEnumUnit())
endfunction
//ββββββββββββββββββββββββββββββββββββββββββββββββββββββ
private function Slide takes nothing returns nothing
call ForGroup(The_Group,function Pick)
endfunction
//ββββββββββββββββββββββββββββββββββββββββββββββββββββββ
private function Toggle takes nothing returns nothing
if (IsTriggerEnabled(The_Trigger)) then
call DisableTrigger(The_Trigger)
else
call EnableTrigger(The_Trigger)
endif
endfunction
//ββββββββββββββββββββββββββββββββββββββββββββββββββββββ
private function Add takes nothing returns nothing
call GroupAddUnit(The_Group,CreateUnit(GetTriggerPlayer(),'hpea',0.,0.,0.))
endfunction
//ββββββββββββββββββββββββββββββββββββββββββββββββββββββ
private function DoRemove takes unit u returns nothing
if (u == null) then
set u = GroupPickRandomUnit(The_Group)
endif
call GroupRemoveUnit(The_Group,u)
call RemoveSavedInteger(Hash,GetHandleId(u),0)
call RemoveUnit(u)
endfunction
//ββββββββββββββββββββββββββββββββββββββββββββββββββββββ
private function Remove takes nothing returns nothing
call DoRemove(GetTriggerUnit())
endfunction
//ββββββββββββββββββββββββββββββββββββββββββββββββββββββ
private function Init takes nothing returns nothing
local integer i = 11
local trigger ToggleTrig = CreateTrigger()
local trigger NoDeadTrig = CreateTrigger()
local trigger RemoveTrig = CreateTrigger()
local trigger AddTrig = CreateTrigger()
call TriggerAddAction(ToggleTrig,function Toggle)
call TriggerAddAction(NoDeadTrig,function Remove)
call TriggerAddAction(RemoveTrig,function Remove)
call TriggerAddAction(AddTrig,function Add)
loop
call TriggerRegisterPlayerEvent(ToggleTrig,Player(i),EVENT_PLAYER_END_CINEMATIC)
call TriggerRegisterPlayerUnitEvent(NoDeadTrig,Player(i),EVENT_PLAYER_UNIT_DEATH,null)
call TriggerRegisterPlayerChatEvent(RemoveTrig,Player(i),"remove",true)
call TriggerRegisterPlayerChatEvent(AddTrig,Player(i),"add",true)
exitwhen (i == 0)
set i = i - 1
endloop
loop
set cos[i] = 1.*Cos(12*(i+1)*bj_DEGTORAD)
set sin[i] = 1.*Sin(12*(i+1)*bj_DEGTORAD)
set i = i + 1
exitwhen (i > 29)
endloop
call TriggerAddAction(The_Trigger,function Slide)
call TriggerRegisterTimerEvent(The_Trigger,0.01,true)
call GroupEnumUnitsInRect(The_Group,bj_mapInitialPlayableArea,null)
endfunction
//ββββββββββββββββββββββββββββββββββββββββββββββββββββββ
endscope
//ββββββββββββββββββββββββββββββββββββββββββββββββββββββ