kingkingyyk3
Visitor (Welcome to the Jungle, Baby!)
- Reaction score
- 216
JASS:
//Easy Timers
library ET initializer Init
globals
public constant real PERIOD = .03125
public constant integer FPS = R2I(1 / PERIOD)
public constant integer EX_PRELOAD = 64
public integer Tick = 0
endglobals
private struct Node
thistype prev
thistype next
trigger trig
integer data
integer periodType
timer t
endstruct
globals
private integer HandleId = 0
private timer array TimerStack
private integer TimersCount = 0
private integer array TimersData
private Node node
endglobals
//=========Fixed Period==========\\
public function Add takes trigger trig, integer data returns nothing
local Node this = Node.create()
debug if trig == null then
debug call this.destroy()
debug call BJDebugMsg("FT Error, null trigger is added in queue!")
debug endif
set this.prev = Node(0).prev
set this.next = Node(0)
set Node(0).prev.next = this
set Node(0).prev = this
set this.trig = trig
set this.data = data
set this.periodType = 1
endfunction
public function GetData takes nothing returns integer
return node.data
endfunction
public function Stop takes nothing returns nothing
set node.trig = null
set node.data = 0
if node.periodType == 1 then
set node.prev.next = node.next
set node.next.prev = node.prev
else
call PauseTimer(node.t)
set TimersCount = TimersCount + 1
set TimerStack[TimersCount] = node.t
endif
call node.destroy()
endfunction
private function Execute takes nothing returns nothing
set Tick = Tick + 1
set node = 0
loop
set node = node.next
exitwhen node == 0
call TriggerExecute(node.trig)
endloop
endfunction
//==================================\\
//===========PeriodEx===============\\
private function Handler takes nothing returns nothing
set node = TimersData[GetHandleId(GetExpiredTimer()) - HandleId]
call TriggerExecute(node.trig)
endfunction
public function AddEx takes trigger trig, integer data, real period returns nothing
local Node this = Node.create()
set this.trig = trig
set this.data = data
if TimersCount > 0 then
set this.t = TimerStack[TimersCount]
set TimersCount = TimersCount - 1
else
set this.t = CreateTimer()
endif
set TimersData[GetHandleId(this.t) - HandleId] = this
set this.periodType = 2
call TimerStart(this.t,period,true,function Handler)
endfunction
//=========PeriodEx End=============\\
private function Init takes nothing returns nothing
local integer i = 0
local timer t
loop
exitwhen i > EX_PRELOAD
set TimersCount = TimersCount + 1
set TimerStack[TimersCount] = CreateTimer()
set i = i + 1
endloop
set HandleId = GetHandleId(TimerStack[1])
call TimerStart(CreateTimer(),0.03125,true,function Execute)
endfunction
endlibrary
Example for usage :
JASS:
scope spell initializer Init
globals
private trigger ET_Trig = CreateTrigger()
endglobals
private struct Data
//members here
endstruct
private function Effects takes nothing returns nothing
local Data this = ET_GetData()
//some stuffs here.
//I want to stop!
call ET_Stop()
endfunction
private function Actions takes nothing returns nothing
local Data this = Data.create()
//some stuffs here
call ET_Add(ET_Trig,this)
endfunction
private function Conditions takes nothing returns boolean
return GetSpellAbilityId() == //abil's id
endfunction
private function Init takes nothing returns nothing
//spell loads here.
call TriggerAddAction(ET_Trig,function Effects)
endfunction
endscope