- Joined
- Jul 10, 2007
- Messages
- 6,306
private static triggercondition array removal
private static integer array removeStack
private static integer removeStackCount = 0
private static timer removeTimer = CreateTimer()
private static method remove takes nothing returns nothing
loop
call TriggerRemoveCondition(trig[removeStack[removeStackCount]], removal[removeStack[removeStackCount]])
set removal[removeStack[removeStackCount]] = null
set removeStackCount = removeStackCount - 1
exitwhen removeStackCount == 0
endloop
endmethod
method unregister takes triggercondition tc returns nothing
set removeStack[removeStackCount] = this
set removal[removeStackCount] = tc
set removeStackCount = removeStackCount + 1
call TimerStart(removeTimer, 0, false, function thistype.remove)
endmethod
method registerDynamicTrigger takes trigger t returns integer
method unregisterTrigger takes thistype eventId returns nothing
method unregister takes triggercondition tc returns nothing
//Vars
private thistype first
private thistype head
private thistype next
private thistype previous
private static integer dcount = 0
private static integer recycleCount = 0
private static integer array recycle
private trigger dtrig
//Code
set this = first
exitwhen this == 0
readonly static thistype eventTrigger
readonly static thistype event
readonly trigger trigger
library Event
globals
private real eventv = 0
endglobals
struct Event extends array
private static integer count = 0
private static trigger array trig
private static triggercondition array removal
private static integer array removeStack
private static integer removeStackCount = 0
private static timer removeTimer = CreateTimer()
static integer data = 0
readonly trigger trigger
private thistype head
private thistype first
private thistype next
private thistype previous
readonly static thistype eventTrigger = 0
readonly static thistype event = 0
private static integer dcount = 0
private static thistype recycle = 0
static method create takes nothing returns thistype
set count = count + 1
set trig[count] = CreateTrigger()
return count
endmethod
method registerTrigger takes trigger t returns nothing
call TriggerRegisterVariableEvent(t, SCOPE_PRIVATE + "eventv", EQUAL, this)
endmethod
method registerDynamicTrigger takes trigger t returns thistype
local thistype new
if (recycle == 0) then
set dcount = dcount + 1
set new = dcount
else
set new = recycle
set recycle = recycle.next
endif
if (first == 0) then
set first = new
set new.previous = new
set new.next = 0
else
set new.previous = first.previous
set new.next = 0
set new.previous.next = new
set first.previous = new
endif
set new.head = this
set new.trigger = t
return new
endmethod
method unregisterTrigger takes nothing returns nothing
if (head.first == this) then
set head.first = next
else
set previous.next = next
endif
if (next == 0) then
set head.first.previous = previous
else
set next.previous = previous
endif
set next = recycle
set recycle = this
set trigger = null
endmethod
method register takes boolexpr c returns triggercondition
return TriggerAddCondition(trig[this], c)
endmethod
private static method remove takes nothing returns nothing
loop
call TriggerRemoveCondition(trig[removeStack[removeStackCount]], removal[removeStack[removeStackCount]])
set removal[removeStack[removeStackCount]] = null
set removeStackCount = removeStackCount - 1
exitwhen removeStackCount == 0
endloop
endmethod
method unregister takes triggercondition tc returns nothing
set removeStack[removeStackCount] = this
set removal[removeStackCount] = tc
set removeStackCount = removeStackCount + 1
call TimerStart(removeTimer, 0, false, function thistype.remove)
endmethod
method fire takes nothing returns nothing
local integer prevTrigger = eventTrigger
local integer prevEvent = event
set event = this
set eventv = 0
set eventv = this
call TriggerEvaluate(trig[this])
set this = first
loop
exitwhen this == 0
if (IsTriggerEnabled(trigger)) then
set eventTrigger = this
if (TriggerEvaluate(trigger)) then
call TriggerExecute(trigger)
endif
else
call EnableTrigger(trigger)
if (IsTriggerEnabled(trigger)) then
call DisableTrigger(trigger)
else
if (head.first == this) then
set head.first = next
else
set previous.next = next
endif
if (next == 0) then
set head.first.previous = previous
else
set next.previous = previous
endif
set next = recycle
set recycle = this
set trigger = null
endif
endif
set this = next
endloop
set eventTrigger = prevTrigger
set event = prevEvent
endmethod
method fireData takes integer data returns nothing
local integer prev = Event.data
local integer prevTrigger = eventTrigger
local integer prevEvent = event
set event = this
set Event.data = data
set eventv = 0
set eventv = this
call TriggerEvaluate(trig[this])
set this = first
loop
exitwhen this == 0
if (IsTriggerEnabled(trigger)) then
set eventTrigger = this
if (TriggerEvaluate(trigger)) then
call TriggerExecute(trigger)
endif
else
call EnableTrigger(trigger)
if (IsTriggerEnabled(trigger)) then
call DisableTrigger(trigger)
else
if (head.first == this) then
set head.first = next
else
set previous.next = next
endif
if (next == 0) then
set head.first.previous = previous
else
set next.previous = previous
endif
set next = recycle
set recycle = this
set trigger = null
endif
endif
set this = next
endloop
set Event.data = prev
set eventTrigger = prevTrigger
set event = prevEvent
endmethod
endstruct
function GetEventData takes nothing returns integer
return Event.data
endfunction
function CreateEvent takes nothing returns integer
return Event.create()
endfunction
function TriggerRegisterDynamicEvent takes trigger t, Event ev returns integer
return ev.registerDynamicTrigger(t)
endfunction
function TriggerUnregisterEvent takes Event eventId returns nothing
call eventId.unregisterTrigger()
endfunction
function TriggerRegisterEvent takes trigger t, Event ev returns nothing
call ev.registerTrigger(t)
endfunction
function RegisterEvent takes boolexpr c, Event ev returns triggercondition
return ev.register(c)
endfunction
function UnregisterEvent takes triggercondition tc, Event ev returns nothing
call ev.unregister(tc)
endfunction
function FireEvent takes Event ev returns nothing
call ev.fire()
endfunction
function FireEventData takes Event ev, integer data returns nothing
call ev.fireData(data)
endfunction
endlibrary
method fire takes nothing returns nothing
call TriggerEvaluate(trig[this])
set eventv = 0
set eventv = this
endmethod
JASS:method fire takes nothing returns nothing call TriggerEvaluate(trig[this]) set eventv = 0 set eventv = this endmethod
The TriggerEvaluate should go before the hardcoded event, since you don't need to retrieve the event id anyway. It would simplify issues with recursion if you want a simple boolexpr to run before everything else.
Huh? It doesn't matter what order they go in... there is no event id to retrieve...
not changing as order does not matter >.>.
private real eventv = 0
C'mon, you know me. I only use the lightest version possible : P.
That is the only version I recommend for system dev =)
People asked for Data and Dynamic versions. I only recommend the lightest version =).
So you will change the inner-workings of your snippet. Don't worry, you won't lose any efficiency.ehm, that's the way to do custom events for triggers. Not much to be done.
You know very well that Vexorian is inactive, and will probably not return. WC3 modding is doomed to die anyway.Rather than asking me to change my snippet, get vexorian's optimizer fixed.
So you will change the inner-workings of your snippet. You won't lose any efficiency.
You know very well that Vexorian is inactive, and will probably not return. WC3 modding is doomed to die anyway.
TriggerRegisterVariableEvent
Bribe said:I can reproduce this if you want irrefutable proof that it breaks, ...
Then
again the length of a variable name shouldn't either but it does![]()