- Joined
- Aug 1, 2013
- Messages
- 4,658
Hi all.
I am making an Advanced Event Manager System.
The system is simply an event handler that can add priorities to a trigger to let it run in specific order.
Also you can choose how the trigger should run and eventually (you get it?) remove the trigger from the event.
This should replace the "Set value = 1 |n Set value = 0" parts in my triggers.
However... even though I never use vJASS (I do use globals and libraries but have never used structs, methods, constants, etc, etc, etc.)
I would like to have this system vJASS supportive.
I am still looking for a way to add raw functions to the event but Blizzard does not allow "code array"... don't even think about code handles inside a hashtable.
I don't know if vJASS has an alternative way of using events... so a skilled vJASS user should explain to me in plain JASS what those alternative event responses could do.
When this is finished I will upload it to the Spell Section ofc.
EDIT: Don't worry about the BJ functions about hashtables.
I guess my TESH is a bit bugged so I got to revert it sometimes to an old version.
In the old version, TESH does not know hashtable and so I cannot see the native function.
Will change it when I go back to 2.0.
I am making an Advanced Event Manager System.
The system is simply an event handler that can add priorities to a trigger to let it run in specific order.
Also you can choose how the trigger should run and eventually (you get it?) remove the trigger from the event.
This should replace the "Set value = 1 |n Set value = 0" parts in my triggers.
JASS:
globals
hashtable udg_AEM_Hashtable = InitHashtable()
integer udg_AEM_ET_Execute = 1
integer udg_AEM_ET_Evaluate = 2
integer udg_AEM_ET_Conditional = 3
endglobals
library aemsystem
function AEM_TriggerRemoveEvent takes integer whichEvent, trigger whichTrigger returns nothing
local integer i = 0
local trigger t
loop
set t = LoadTriggerHandle(udg_AEM_Hashtable, whichEvent, i)
if t == null then
return
elseif t == whichTrigger then
loop
exitwhen HaveSavedValue(i+4, bj_HASHTABLE_HANDLE, whichEvent, udg_AEM_Hashtable) == false
call SaveTriggerHandle(udg_AEM_Hashtable, whichEvent, i, LoadTriggerHandle(udg_AEM_Hashtable, whichEvent, i+4))
call SaveInteger(udg_AEM_Hashtable, whichEvent, i+1, LoadInteger(udg_AEM_Hashtable, whichEvent, i+5))
call SaveInteger(udg_AEM_Hashtable, whichEvent, i+2, LoadInteger(udg_AEM_Hashtable, whichEvent, i+6))
call SaveBoolean(udg_AEM_Hashtable, whichEvent, i+3, LoadBoolean(udg_AEM_Hashtable, whichEvent, i+7))
set i = i + 4
endloop
return
endif
set i = i + 4
endloop
endfunction
function AEM_CallEvent takes integer whichEvent returns nothing
local trigger array actions
local integer index = 0
local integer i = 0
local integer array executionType
loop
exitwhen HaveSavedValue(i, bj_HASHTABLE_HANDLE, whichEvent, udg_AEM_Hashtable) == false
set actions[index] = LoadTriggerHandle(udg_AEM_Hashtable, whichEvent, i)
set executionType[index] = LoadInteger(udg_AEM_Hashtable, whichEvent, i+2)
if not(LoadBoolean(udg_AEM_Hashtable, whichEvent, i+3)) then
call AEM_TriggerRemoveEvent(whichEvent, actions[index])
set i = i - 4
endif
set index = index + 1
set i = i + 4
endloop
set i = 0
loop
exitwhen i == index
if executionType[i] == udg_AEM_ET_Execute then
call TriggerExecute(actions[i])
elseif executionType[i] == udg_AEM_ET_Evaluate then
call TriggerEvaluate(actions[i])
elseif executionType[i] == udg_AEM_ET_Conditional then
call ConditionalTriggerExecute(actions[i])
endif
set i = i + 1
endloop
endfunction
function AEM_TriggerRegisterEvent takes integer whichEvent, trigger whichTrigger, integer priority, boolean priorize, integer executionType, boolean repeating returns nothing
local integer i = 0
local integer i2
local trigger t
local boolean shiftRemaining = false
loop
exitwhen HaveSavedValue(i, bj_HASHTABLE_HANDLE, whichEvent, udg_AEM_Hashtable) == false
if priorize then
set shiftRemaining = true
exitwhen LoadInteger(udg_AEM_Hashtable, whichEvent, i+1) >= priority
set shiftRemaining = false
else
set shiftRemaining = true
exitwhen LoadInteger(udg_AEM_Hashtable, whichEvent, i+1) > priority
set shiftRemaining = false
endif
set i = i + 4
endloop
if shiftRemaining then
set i2 = i
loop
exitwhen HaveSavedValue(i2, bj_HASHTABLE_HANDLE, whichEvent, udg_AEM_Hashtable) == false
set i2 = i2 + 4
endloop
loop
exitwhen i2 == i
call SaveTriggerHandle(udg_AEM_Hashtable, whichEvent, i2, LoadTriggerHandle(udg_AEM_Hashtable, whichEvent, i2-4))
call SaveInteger(udg_AEM_Hashtable, whichEvent, i2+1, LoadInteger(udg_AEM_Hashtable, whichEvent, i2-3))
call SaveInteger(udg_AEM_Hashtable, whichEvent, i2+2, LoadInteger(udg_AEM_Hashtable, whichEvent, i2-2))
call SaveBoolean(udg_AEM_Hashtable, whichEvent, i2+3, LoadBoolean(udg_AEM_Hashtable, whichEvent, i2-1))
set i2 = i2 - 4
endloop
endif
call SaveTriggerHandle(udg_AEM_Hashtable, whichEvent, i, whichTrigger)
call SaveInteger(udg_AEM_Hashtable, whichEvent, i+1, priority)
call SaveInteger(udg_AEM_Hashtable, whichEvent, i+2, executionType)
call SaveBoolean(udg_AEM_Hashtable, whichEvent, i+3, repeating)
endfunction
endlibrary
However... even though I never use vJASS (I do use globals and libraries but have never used structs, methods, constants, etc, etc, etc.)
I would like to have this system vJASS supportive.
I am still looking for a way to add raw functions to the event but Blizzard does not allow "code array"... don't even think about code handles inside a hashtable.
I don't know if vJASS has an alternative way of using events... so a skilled vJASS user should explain to me in plain JASS what those alternative event responses could do.
When this is finished I will upload it to the Spell Section ofc.
EDIT: Don't worry about the BJ functions about hashtables.
I guess my TESH is a bit bugged so I got to revert it sometimes to an old version.
In the old version, TESH does not know hashtable and so I cannot see the native function.
Will change it when I go back to 2.0.