- Joined
- Aug 1, 2013
- Messages
- 4,658
Hi all.
I have been making an event system but it was kind of really slow because it loaded every single action from a hashtable.
Because of that, I tried to save everything inside arrays but that is really hard or you have to give each event a maximum number of fields which would be a pain in the ass to use this system.
Now I made a converter that places all events from the hashtable into arrays.
The only way how the hashtable is still used is to get the event id of the event that you want to call.
It also checks if you have changed the triggers of an event since the last convertion to make it run from the hashtable (like before) or from the arrays.
If anyone has any suggestions on what it could improve or what it could use then feel free to comment.
This system is created to have events with priorities so you can organize the actions by integers.
This system also supports 2 event parameters which can make event calls to address more specific triggers.
You can register a trigger to an event (unique integer) and with optional 2 parameters.
For example, I register a trigger that should run when Blizzard is cast to the event "UNIT_SPELL_EFFECT" and 'AHbz'.
Then I have to call the event using "UNIT_SPELL_EFFECT" and "GetSpellAbilityId()" and then all the triggers of those events are called only if their parameter is the same.
Check out how AEM_TriggerRegisterEvent2() and AEM_TriggerRegisterEvent3() work.
Events can be executed via "AEM_CallEvent()".
Here are a few regular events implemented into the system:
Events need a unique number and before you had to initialize all events inside the global tags and have a list of all events to know which numbers are free and which numbers are used.
In this one, you automatically create a value for the event that you give to the system.
This value is returned to the return address and should be set into the variable.
In the first register, the value of "udg_AEM_Event_Unit_Spell_Effect" is set to the returned value.
After that, you can use that value over and over again.
It is not necessary to set the value again and this would still work:
I have been making an event system but it was kind of really slow because it loaded every single action from a hashtable.
Because of that, I tried to save everything inside arrays but that is really hard or you have to give each event a maximum number of fields which would be a pain in the ass to use this system.
Now I made a converter that places all events from the hashtable into arrays.
The only way how the hashtable is still used is to get the event id of the event that you want to call.
It also checks if you have changed the triggers of an event since the last convertion to make it run from the hashtable (like before) or from the arrays.
If anyone has any suggestions on what it could improve or what it could use then feel free to comment.
This system is created to have events with priorities so you can organize the actions by integers.
This system also supports 2 event parameters which can make event calls to address more specific triggers.
You can register a trigger to an event (unique integer) and with optional 2 parameters.
For example, I register a trigger that should run when Blizzard is cast to the event "UNIT_SPELL_EFFECT" and 'AHbz'.
Then I have to call the event using "UNIT_SPELL_EFFECT" and "GetSpellAbilityId()" and then all the triggers of those events are called only if their parameter is the same.
Check out how AEM_TriggerRegisterEvent2() and AEM_TriggerRegisterEvent3() work.
JASS:
library aemSystem
globals
//Dynamic allocation of events.
integer udg_AEM_NewEvent = 0
hashtable udg_AEM_Hashtable = InitHashtable()
integer udg_AEM_NumberOfFields = 3
trigger udg_AEM_ConvertToArray = CreateTrigger()
boolean udg_AEM_IsConverting = false
boolean udg_AEM_IsCallingAnEvent = false
integer udg_AEM_EventIndex
integer udg_AEM_TriggerIndex
integer udg_AEM_Event2Offset = 8191 //udg_AEM_ArraySize
integer udg_AEM_Event3Offset = 8191 //udg_AEM_ArraySize
integer udg_AEM_NextEventIndex = 0
integer array udg_AEM_Events
integer array udg_AEM_StartingIndex
integer array udg_AEM_EventSize
boolean array udg_AEM_IsConverted
//Having more than 8,191 triggers is very probable for large maps.
//Having more than 24,573 triggers is probably bad coding.
//Having more than 8,191 events... is not god either.
integer udg_AEM_ArraySize = 8191
trigger array udg_AEM_Triggers1
integer array udg_AEM_Priorities1
boolean array udg_AEM_Repeating1
trigger array udg_AEM_Triggers2
integer array udg_AEM_Priorities2
boolean array udg_AEM_Repeating2
trigger array udg_AEM_Triggers3
integer array udg_AEM_Priorities3
boolean array udg_AEM_Repeating3
boolean udg_AEM_StopRemainingActions = false
endglobals
function AEM_TriggerRemoveEvent takes trigger whichTrigger, integer whichEvent returns nothing
local integer i = 1
local trigger t
loop
set t = LoadTriggerHandle(udg_AEM_Hashtable, whichEvent, i)
exitwhen t == null
if t == whichTrigger then
loop
exitwhen not HaveSavedHandle(udg_AEM_Hashtable, whichEvent, i+3)
//Replace all event responses after the found trigger by the ones that follow it afterwards.
call SaveTriggerHandle(udg_AEM_Hashtable, whichEvent, i, LoadTriggerHandle(udg_AEM_Hashtable, whichEvent, i+3))
call SaveInteger(udg_AEM_Hashtable, whichEvent, i+1, LoadInteger(udg_AEM_Hashtable, whichEvent, i+4))
call SaveBoolean(udg_AEM_Hashtable, whichEvent, i+2, LoadBoolean(udg_AEM_Hashtable, whichEvent, i+5))
set i = i + udg_AEM_NumberOfFields
endloop
//Remove the last event response from the event.
call RemoveSavedHandle(udg_AEM_Hashtable, whichEvent, i)
call RemoveSavedInteger(udg_AEM_Hashtable, whichEvent, i+1)
call RemoveSavedBoolean(udg_AEM_Hashtable, whichEvent, i+2)
set udg_AEM_IsConverted[LoadInteger(udg_AEM_Hashtable, whichEvent, 0)] = false
return
endif
set i = i + udg_AEM_NumberOfFields
endloop
endfunction
function AEM_TriggerRemoveEvent2 takes trigger whichTrigger, integer whichEvent, integer whichParameter2 returns nothing
local integer realEvent = LoadInteger(udg_AEM_Hashtable, whichEvent + udg_AEM_ArraySize*2, whichParameter2)
if realEvent == 0 then
set realEvent = udg_AEM_Event2Offset
set udg_AEM_Event2Offset = udg_AEM_Event2Offset +1
call SaveInteger(udg_AEM_Hashtable, whichEvent + udg_AEM_ArraySize*2, whichParameter2, realEvent)
endif
call AEM_TriggerRemoveEvent(whichTrigger, realEvent)
endfunction
function AEM_TriggerRemoveEvent3 takes trigger whichTrigger, integer whichEvent, integer whichParameter2, integer whichParameter3 returns nothing
local integer realEvent = LoadInteger(udg_AEM_Hashtable, whichEvent + udg_AEM_ArraySize*4, whichParameter2)
if realEvent == 0 then
set realEvent = udg_AEM_Event2Offset
set udg_AEM_Event2Offset = udg_AEM_Event2Offset +1
call SaveInteger(udg_AEM_Hashtable, whichEvent + udg_AEM_ArraySize*4, whichParameter2, realEvent)
endif
call AEM_TriggerRemoveEvent2(whichTrigger, realEvent, whichParameter3)
endfunction
function AEM_CallEvent takes integer whichEvent returns nothing
local integer eventIndex
local integer triggerIndex
local integer lastIndex
local integer i
local integer index
local trigger t
local trigger array triggers
local boolean oldStopRemainingActions
if whichEvent == 0 then
return
endif
set eventIndex = LoadInteger(udg_AEM_Hashtable, whichEvent, 0)
if eventIndex == 0 then
//The event doesnt have actions.
return
endif
set udg_AEM_IsCallingAnEvent = true
set oldStopRemainingActions = udg_AEM_StopRemainingActions
set udg_AEM_StopRemainingActions = false
if not udg_AEM_IsConverted[eventIndex] then
//The event has registered triggers or removed triggers after the last ConvertToArray.
//So we need the data directly from the hashtable.
debug call BJDebugMsg("Event [" + I2S(eventIndex) + "] isnt converted.")
set i = 1
set index = 0
loop
set t = LoadTriggerHandle(udg_AEM_Hashtable, whichEvent, i)
exitwhen t == null
set triggers[index] = t
if not LoadBoolean(udg_AEM_Hashtable, whichEvent, i+2) then
//Remove the event response because it is not repeating.
call AEM_TriggerRemoveEvent(triggers[index], whichEvent)
set i = i - udg_AEM_NumberOfFields
endif
set index = index + 1
set i = i + udg_AEM_NumberOfFields
endloop
set i = 0
loop
exitwhen triggers[i] == null
if not udg_AEM_StopRemainingActions then
if TriggerEvaluate(triggers[i]) then
call TriggerExecute(triggers[i])
endif
endif
set triggers[i] = null
set i = i + 1
endloop
else
//The event is properly registered in the arrays.
set triggerIndex = udg_AEM_StartingIndex[eventIndex]
set lastIndex = triggerIndex + udg_AEM_EventSize[eventIndex]
loop
exitwhen triggerIndex >= lastIndex
//If the end of this array is reached, we move on to the next array.
if triggerIndex >= udg_AEM_ArraySize then
set lastIndex = lastIndex - udg_AEM_ArraySize
set triggerIndex = triggerIndex - udg_AEM_ArraySize
loop
exitwhen triggerIndex >= lastIndex
if triggerIndex >= udg_AEM_ArraySize then
set lastIndex = lastIndex - udg_AEM_ArraySize
set triggerIndex = triggerIndex - udg_AEM_ArraySize
loop
exitwhen triggerIndex >= lastIndex
if triggerIndex >= udg_AEM_ArraySize then
exitwhen true
endif
if not udg_AEM_StopRemainingActions then
if TriggerEvaluate(udg_AEM_Triggers3[triggerIndex]) then
call TriggerExecute(udg_AEM_Triggers3[triggerIndex])
endif
endif
if not udg_AEM_Repeating3[triggerIndex] then
call AEM_AEM_TriggerRemoveEvent(udg_AEM_Triggers3[triggerIndex], whichEvent)
endif
set triggerIndex = triggerIndex +1
endloop
exitwhen true
endif
if not udg_AEM_StopRemainingActions then
if TriggerEvaluate(udg_AEM_Triggers2[triggerIndex]) then
call TriggerExecute(udg_AEM_Triggers2[triggerIndex])
endif
endif
if not udg_AEM_Repeating2[triggerIndex] then
call AEM_AEM_TriggerRemoveEvent(udg_AEM_Triggers3[triggerIndex], whichEvent)
endif
set triggerIndex = triggerIndex +1
endloop
exitwhen true
endif
//Evaluate and Execute the trigger.
if not udg_AEM_StopRemainingActions then
if TriggerEvaluate(udg_AEM_Triggers1[triggerIndex]) then
call TriggerExecute(udg_AEM_Triggers1[triggerIndex])
endif
endif
//Remove the trigger from this event if it is set to non-repeating.
if not udg_AEM_Repeating1[triggerIndex] then
call AEM_AEM_TriggerRemoveEvent(udg_AEM_Triggers3[triggerIndex], whichEvent)
endif
set triggerIndex = triggerIndex +1
endloop
endif
set udg_AEM_StopRemainingActions = oldStopRemainingActions
set udg_AEM_IsCallingAnEvent = false
endfunction
function AEM_CallEvent2 takes integer whichEvent, integer whichParameter2 returns nothing
local integer realEvent
if whichEvent > 0 then
set realEvent = LoadInteger(udg_AEM_Hashtable, whichEvent + udg_AEM_ArraySize*2, whichParameter2)
if realEvent > 0 then
call AEM_CallEvent(realEvent)
endif
endif
endfunction
function AEM_CallEvent3 takes integer whichEvent, integer whichParameter2, integer whichParameter3 returns nothing
local integer realEvent
if whichEvent > 0 then
set realEvent = LoadInteger(udg_AEM_Hashtable, whichEvent + udg_AEM_ArraySize*4, whichParameter3)
if realEvent > 0 then
call AEM_CallEvent2(realEvent, whichParameter3)
endif
endif
endfunction
function AEM_TriggerRegisterEvent takes trigger whichTrigger, integer whichEvent, integer priority, boolean priorize, boolean repeating returns integer
local integer i = 1
local integer i2 = 1
if whichEvent == 0 then
set udg_AEM_NewEvent = udg_AEM_NewEvent +1
set whichEvent = udg_AEM_NewEvent
endif
loop
exitwhen not HaveSavedHandle(udg_AEM_Hashtable, whichEvent, i)
if priorize then
exitwhen LoadInteger(udg_AEM_Hashtable, whichEvent, i+1) >= priority
else
exitwhen LoadInteger(udg_AEM_Hashtable, whichEvent, i+1) > priority
endif
set i = i + udg_AEM_NumberOfFields
endloop
set i2 = i
loop
exitwhen not HaveSavedHandle(udg_AEM_Hashtable, whichEvent, i2)
set i2 = i2 + udg_AEM_NumberOfFields
endloop
loop
exitwhen i2 == i
call SaveTriggerHandle(udg_AEM_Hashtable, whichEvent, i2, LoadTriggerHandle(udg_AEM_Hashtable, whichEvent, i2-3))
call SaveInteger(udg_AEM_Hashtable, whichEvent, i2+1, LoadInteger(udg_AEM_Hashtable, whichEvent, i2-2))
call SaveBoolean(udg_AEM_Hashtable, whichEvent, i2+2, LoadBoolean(udg_AEM_Hashtable, whichEvent, i2-1))
set i2 = i2 - udg_AEM_NumberOfFields
endloop
call SaveTriggerHandle(udg_AEM_Hashtable, whichEvent, i, whichTrigger)
call SaveInteger(udg_AEM_Hashtable, whichEvent, i+1, priority)
call SaveBoolean(udg_AEM_Hashtable, whichEvent, i+2, repeating)
set i = LoadInteger(udg_AEM_Hashtable, whichEvent, 0)
if i == 0 then
set udg_AEM_NextEventIndex = udg_AEM_NextEventIndex +1
set udg_AEM_Events[udg_AEM_NextEventIndex] = whichEvent
call SaveInteger(udg_AEM_Hashtable, whichEvent, 0, udg_AEM_NextEventIndex)
endif
set udg_AEM_IsConverted[i] = false
return whichEvent
endfunction
function AEM_TriggerRegisterEvent2 takes trigger whichTrigger, integer whichEvent, integer whichParameter2, integer priority, boolean priorize, boolean repeating returns integer
local integer realEvent
if whichEvent == 0 then
set udg_AEM_NewEvent = udg_AEM_NewEvent +1
set whichEvent = udg_AEM_NewEvent
endif
set realEvent = LoadInteger(udg_AEM_Hashtable, whichEvent + udg_AEM_ArraySize*2, whichParameter2)
if realEvent == 0 then
set realEvent = udg_AEM_Event2Offset
set udg_AEM_Event2Offset = udg_AEM_Event2Offset +1
call SaveInteger(udg_AEM_Hashtable, whichEvent + udg_AEM_ArraySize*2, whichParameter2, realEvent)
endif
call AEM_TriggerRegisterEvent(whichTrigger, realEvent, priority, priorize, repeating)
return whichEvent
endfunction
function AEM_TriggerRegisterEvent3 takes trigger whichTrigger, integer whichEvent, integer whichParameter2, integer whichParameter3, integer priority, boolean priorize, boolean repeating returns integer
local integer realEvent
if whichEvent == 0 then
set udg_AEM_NewEvent = udg_AEM_NewEvent +1
set whichEvent = udg_AEM_NewEvent
endif
set realEvent = LoadInteger(udg_AEM_Hashtable, whichEvent + udg_AEM_ArraySize*4, whichParameter2)
if realEvent == 0 then
set realEvent = udg_AEM_Event3Offset
set udg_AEM_Event3Offset = udg_AEM_Event3Offset +1
call SaveInteger(udg_AEM_Hashtable, whichEvent + udg_AEM_ArraySize*4, whichParameter2, realEvent)
endif
call AEM_TriggerRegisterEvent2(whichTrigger, realEvent, whichParameter3, priority, priorize, repeating)
return whichEvent
endfunction
function AEM_ConvertToArray_Callback takes nothing returns nothing
local integer i = 0
local integer eventIndex = udg_AEM_EventIndex
local integer hashtableIndex
local integer triggerIndex = udg_AEM_TriggerIndex
local integer eventSize
loop
if i >= 200 then
set udg_AEM_EventIndex = eventIndex
set udg_AEM_TriggerIndex = triggerIndex
return
endif
exitwhen udg_AEM_Events[eventIndex] == 0
set hashtableIndex = 1
set eventSize = 0
set udg_AEM_StartingIndex[eventIndex] = triggerIndex
loop
exitwhen not HaveSavedHandle(udg_AEM_Hashtable, udg_AEM_Events[eventIndex], hashtableIndex)
//I really dont give a **** for performance in this function... yet.
//Store the trigger in the array.
if triggerIndex < udg_AEM_ArraySize then
set udg_AEM_Triggers1[triggerIndex] = LoadTriggerHandle(udg_AEM_Hashtable, udg_AEM_Events[eventIndex], hashtableIndex)
//set udg_AEM_Priorities1[triggerIndex] = LoadInteger(udg_AEM_Hashtable, udg_AEM_Events[eventIndex], hashtableIndex+1)
set udg_AEM_Repeating1[triggerIndex] = LoadBoolean(udg_AEM_Hashtable, udg_AEM_Events[eventIndex], hashtableIndex+2)
elseif triggerIndex < udg_AEM_ArraySize*2 then
set udg_AEM_Triggers2[triggerIndex - udg_AEM_ArraySize] = LoadTriggerHandle(udg_AEM_Hashtable, udg_AEM_Events[eventIndex], hashtableIndex)
//set udg_AEM_Priorities2[triggerIndex - udg_AEM_ArraySize] = LoadInteger(udg_AEM_Hashtable, udg_AEM_Events[eventIndex], hashtableIndex+1)
set udg_AEM_Repeating2[triggerIndex - udg_AEM_ArraySize] = LoadBoolean(udg_AEM_Hashtable, udg_AEM_Events[eventIndex], hashtableIndex+2)
elseif triggerIndex < udg_AEM_ArraySize*3 then
set udg_AEM_Triggers3[triggerIndex - udg_AEM_ArraySize*2] = LoadTriggerHandle(udg_AEM_Hashtable, udg_AEM_Events[eventIndex], hashtableIndex)
//set udg_AEM_Priorities3[triggerIndex - udg_AEM_ArraySize*2] = LoadInteger(udg_AEM_Hashtable, udg_AEM_Events[eventIndex], hashtableIndex+1)
set udg_AEM_Repeating3[triggerIndex - udg_AEM_ArraySize*2] = LoadBoolean(udg_AEM_Hashtable, udg_AEM_Events[eventIndex], hashtableIndex+2)
//else
//you are doing something wrong in your code... you have reached your 24,574 th trigger!
endif
set triggerIndex = triggerIndex +1
set eventSize = eventSize +1
set hashtableIndex = hashtableIndex + udg_AEM_NumberOfFields
endloop
set udg_AEM_EventSize[eventIndex] = eventSize
set udg_AEM_IsConverted[eventIndex] = true
set eventIndex = eventIndex +1
set i = i +1
endloop
//Ended converting.
debug call BJDebugMsg("ConvertToArray ended")
set udg_AEM_IsConverting = false
call DestroyTimer(GetExpiredTimer())
endfunction
function AEM_ConvertToArrayAttempt takes nothing returns nothing
//Be patient.
if udg_AEM_IsConverting then
call DestroyTimer(GetExpiredTimer())
return
endif
//The system would break if you rewrite the event arrays while the system is calling an event.
//Check again on next interval.
if udg_AEM_IsCallingAnEvent then
return
endif
//Start converting.
set udg_AEM_IsConverting = true
debug call BJDebugMsg("ConvertToArray started")
//Set the global indexes to their starting values.
set udg_AEM_EventIndex = 1
set udg_AEM_TriggerIndex = 0
call TimerStart(GetExpiredTimer(), 0, true, function AEM_ConvertToArray_Callback)
endif
function AEM_ConvertToArray takes nothing returns nothing
//Be patient.
if udg_AEM_IsConverting then
return
endif
//The system would break if you rewrite the event arrays while the system is calling an event.
//So we create a 0 seconds timer that would ofcourse occur after the event has been called to check again.
if udg_AEM_IsCallingAnEvent then
call TimerStart(CreateTimer(), 0, true, function AEM_ConvertToArrayAttempt)
return
endif
//Start converting.
set udg_AEM_IsConverting = true
debug call BJDebugMsg("ConvertToArray started")
//Set the global indexes to their starting values.
set udg_AEM_EventIndex = 1
set udg_AEM_TriggerIndex = 0
call TimerStart(CreateTimer(), 0, true, function AEM_ConvertToArray_Callback)
endfunction
endlibrary
//===========================================================================
function InitTrig_AEM_System takes nothing returns nothing
//Execute this trigger manually to convert the system into arrays.
call TriggerRegisterTimerEvent(udg_AEM_ConvertToArray, 1, false)
call TriggerAddAction(udg_AEM_ConvertToArray, function AEM_ConvertToArray)
endfunction
Events can be executed via "AEM_CallEvent()".
Here are a few regular events implemented into the system:
JASS:
globals
integer udg_AEM_Event_Player_Chat_Message = 0
integer udg_AEM_Event_Player_Esc_Button = 0
integer udg_AEM_Event_Player_Leave = 0
integer udg_AEM_Event_Unit_Pickup_Item = 0
integer udg_AEM_Event_Unit_Drop_Item = 0
integer udg_AEM_Event_Unit_Attacked = 0
integer udg_AEM_Event_Unit_Spell_Channel = 0
integer udg_AEM_Event_Unit_Spell_Cast = 0
integer udg_AEM_Event_Unit_Spell_Effect = 0
integer udg_AEM_Event_Unit_Spell_Finish = 0
integer udg_AEM_Event_Unit_Spell_Cancel = 0
integer udg_AEM_Event_Unit_Levelup = 0
integer udg_AEM_Event_Unit_Die = 0
integer udg_AEM_Event_Unit_Order_Target = 0
integer udg_AEM_Event_Unit_Order_Point = 0
integer udg_AEM_Event_Unit_Order_Instant = 0
integer udg_AEM_Event_Unit_Created = 0
endglobals
function AEM_Event_Player_Chat_Message takes nothing returns boolean
call AEM_CallEvent(udg_AEM_Event_Player_Chat_Message)
return false
endfunction
function AEM_Event_Player_Esc_Button takes nothing returns boolean
call AEM_CallEvent(udg_AEM_Event_Player_Esc_Button)
return false
endfunction
function AEM_Event_Player_Leave takes nothing returns boolean
call AEM_CallEvent(udg_AEM_Event_Player_Leave)
return false
endfunction
function AEM_Event_Unit_Pickup_Item takes nothing returns boolean
call AEM_CallEvent(udg_AEM_Event_Unit_Pickup_Item)
call AEM_CallEvent2(udg_AEM_Event_Unit_Pickup_Item, GetItemTypeId(GetManipulatedItem()))
return false
endfunction
function AEM_Event_Unit_Drop_Item takes nothing returns boolean
call AEM_CallEvent(udg_AEM_Event_Unit_Drop_Item)
call AEM_CallEvent2(udg_AEM_Event_Unit_Drop_Item, GetItemTypeId(GetManipulatedItem()))
return false
endfunction
function AEM_Event_Unit_Attacked takes nothing returns boolean
call AEM_CallEvent(udg_AEM_Event_Unit_Attacked)
return false
endfunction
function AEM_Event_Unit_Spell_Cast takes nothing returns boolean
call AEM_CallEvent(udg_AEM_Event_Unit_Spell_Cast,)
call AEM_CallEvent2(udg_AEM_Event_Unit_Spell_Cast, GetSpellAbilityId())
return false
endfunction
function AEM_Event_Unit_Spell_Channel takes nothing returns boolean
call AEM_CallEvent(udg_AEM_Event_Unit_Spell_Channel)
call AEM_CallEvent2(udg_AEM_Event_Unit_Spell_Channel, GetSpellAbilityId())
return false
endfunction
function AEM_Event_Unit_Spell_Effect takes nothing returns boolean
call AEM_CallEvent(udg_AEM_Event_Unit_Spell_Effect)
call AEM_CallEvent2(udg_AEM_Event_Unit_Spell_Effect, GetSpellAbilityId())
return false
endfunction
function AEM_Event_Unit_Spell_Finish takes nothing returns boolean
call AEM_CallEvent(udg_AEM_Event_Unit_Spell_Finish)
call AEM_CallEvent2(udg_AEM_Event_Unit_Spell_Finish, GetSpellAbilityId())
return false
endfunction
function AEM_Event_Unit_Spell_Cancel takes nothing returns boolean
call AEM_CallEvent(udg_AEM_Event_Unit_Spell_Cancel)
call AEM_CallEvent2(udg_AEM_Event_Unit_Spell_Cancel, GetSpellAbilityId())
return false
endfunction
function AEM_Event_Unit_Levelup takes nothing returns boolean
call AEM_CallEvent(udg_AEM_Event_Unit_Levelup)
call AEM_CallEvent2(udg_AEM_Event_Unit_Levelup, GetUnitTypeId(GetLevelingUnit()))
return false
endfunction
function AEM_Event_Unit_Die takes nothing returns boolean
call AEM_CallEvent(udg_AEM_Event_Unit_Die)
call AEM_CallEvent2(udg_AEM_Event_Unit_Levelup, GetUnitTypeId(GetDyingUnit()))
return false
endfunction
function AEM_Event_Unit_Order_Target takes nothing returns boolean
call AEM_CallEvent(udg_AEM_Event_Unit_Order_Target)
call AEM_CallEvent2(udg_AEM_Event_Unit_Order_Target, GetIssuedOrderId())
return false
endfunction
function AEM_Event_Unit_Order_Point takes nothing returns boolean
call AEM_CallEvent(udg_AEM_Event_Unit_Order_Point)
call AEM_CallEvent2(udg_AEM_Event_Unit_Order_Point, GetIssuedOrderId())
return false
endfunction
function AEM_Event_Unit_Order_Instant takes nothing returns boolean
call AEM_CallEvent(udg_AEM_Event_Unit_Order_Instant)
call AEM_CallEvent2(udg_AEM_Event_Unit_Order_Instant, GetIssuedOrderId())
return false
endfunction
function UnitCreation_Event takes nothing returns boolean
set bj_lastCreatedUnit = GetFilterUnit()
call AEM_CallEvent(udg_AEM_Event_Unit_Created)
return false
endfunction
function UnitCreation_Start takes nothing returns nothing
local group g = CreateGroup()
local unit FoG
local trigger t = CreateTrigger()
local region rectRegion = CreateRegion()
local integer i = 0
local rect r = GetWorldBounds()
call DestroyTimer(GetExpiredTimer())
call RegionAddRect(rectRegion, r)
call TriggerRegisterEnterRegion(t, rectRegion, Filter(function UnitCreation_Event))
call RemoveRect(r)
loop
exitwhen i >= 16
call GroupEnumUnitsOfPlayer(g, Player(i), null)
loop
set FoG = FirstOfGroup(g)
exitwhen FoG == null
call GroupRemoveUnit(g, FoG)
set bj_lastCreatedUnit = FoG
call AEM_CallEvent(udg_AEM_Event_Unit_Created)
endloop
set i = i + 1
endloop
call DestroyGroup(g)
set g = null
endfunction
//===========================================================================
function InitTrig_AEM_Normal_Events_Implementation takes nothing returns nothing
local trigger t
local integer i
set t = CreateTrigger()
set i = 0
loop
exitwhen i == bj_MAX_PLAYER_SLOTS
call TriggerRegisterPlayerChatEvent(t, Player(i), "", false)
set i = i + 1
endloop
call TriggerAddCondition(t, Filter(function AEM_Event_Player_Chat_Message))
set t = CreateTrigger()
set i = 0
loop
exitwhen i == bj_MAX_PLAYER_SLOTS
call TriggerRegisterPlayerEvent(t, Player(i), EVENT_PLAYER_END_CINEMATIC)
set i = i + 1
endloop
call TriggerAddCondition(t, Filter(function AEM_Event_Player_Esc_Button))
set t = CreateTrigger()
set i = 0
loop
exitwhen i == bj_MAX_PLAYER_SLOTS
call TriggerRegisterPlayerEvent(t, Player(i), EVENT_PLAYER_LEAVE)
set i = i + 1
endloop
call TriggerAddCondition(t, Filter(function AEM_Event_Player_Leave))
set t = CreateTrigger()
set i = 0
loop
exitwhen i == bj_MAX_PLAYER_SLOTS
call TriggerRegisterPlayerUnitEvent(t, Player(i), EVENT_PLAYER_UNIT_PICKUP_ITEM, null)
set i = i + 1
endloop
call TriggerAddCondition(t, Filter(function AEM_Event_Unit_Pickup_Item))
set t = CreateTrigger()
set i = 0
loop
exitwhen i == bj_MAX_PLAYER_SLOTS
call TriggerRegisterPlayerUnitEvent(t, Player(i), EVENT_PLAYER_UNIT_DROP_ITEM, null)
set i = i + 1
endloop
call TriggerAddCondition(t, Filter(function AEM_Event_Unit_Drop_Item))
set t = CreateTrigger()
set i = 0
loop
exitwhen i == bj_MAX_PLAYER_SLOTS
call TriggerRegisterPlayerUnitEvent(t, Player(i), EVENT_PLAYER_UNIT_ATTACKED, null)
set i = i + 1
endloop
call TriggerAddCondition(t, Filter(function AEM_Event_Unit_Attacked))
set t = CreateTrigger()
set i = 0
loop
exitwhen i == bj_MAX_PLAYER_SLOTS
call TriggerRegisterPlayerUnitEvent(t, Player(i), EVENT_PLAYER_UNIT_SPELL_CHANNEL, null)
set i = i + 1
endloop
call TriggerAddCondition(t, Filter(function AEM_Event_Unit_Spell_Channel))
set t = CreateTrigger()
set i = 0
loop
exitwhen i == bj_MAX_PLAYER_SLOTS
call TriggerRegisterPlayerUnitEvent(t, Player(i), EVENT_PLAYER_UNIT_SPELL_CAST, null)
set i = i + 1
endloop
call TriggerAddCondition(t, Filter(function AEM_Event_Unit_Spell_Cast))
set t = CreateTrigger()
set i = 0
loop
exitwhen i == bj_MAX_PLAYER_SLOTS
call TriggerRegisterPlayerUnitEvent(t, Player(i), EVENT_PLAYER_UNIT_SPELL_EFFECT, null)
set i = i + 1
endloop
call TriggerAddCondition(t, Filter(function AEM_Event_Unit_Spell_Effect))
set t = CreateTrigger()
set i = 0
loop
exitwhen i == bj_MAX_PLAYER_SLOTS
call TriggerRegisterPlayerUnitEvent(t, Player(i), EVENT_PLAYER_UNIT_SPELL_FINISH, null)
set i = i + 1
endloop
call TriggerAddCondition(t, Filter(function AEM_Event_Unit_Spell_Finish))
set t = CreateTrigger()
set i = 0
loop
exitwhen i == bj_MAX_PLAYER_SLOTS
call TriggerRegisterPlayerUnitEvent(t, Player(i), EVENT_PLAYER_UNIT_SPELL_ENDCAST, null)
set i = i + 1
endloop
call TriggerAddCondition(t, Filter(function AEM_Event_Unit_Spell_Cancel))
set t = CreateTrigger()
set i = 0
loop
exitwhen i == bj_MAX_PLAYER_SLOTS
call TriggerRegisterPlayerUnitEvent(t, Player(i), EVENT_PLAYER_HERO_LEVEL, null)
set i = i + 1
endloop
call TriggerAddCondition(t, Filter(function AEM_Event_Unit_Levelup))
set t = CreateTrigger()
set i = 0
loop
exitwhen i == bj_MAX_PLAYER_SLOTS
call TriggerRegisterPlayerUnitEvent(t, Player(i), EVENT_PLAYER_UNIT_DEATH, null)
set i = i + 1
endloop
call TriggerAddCondition(t, Filter(function AEM_Event_Unit_Die))
set t = CreateTrigger()
set i = 0
loop
exitwhen i == bj_MAX_PLAYER_SLOTS
call TriggerRegisterPlayerUnitEvent(t, Player(i), EVENT_PLAYER_UNIT_ISSUED_TARGET_ORDER, null)
set i = i + 1
endloop
call TriggerAddCondition(t, Filter(function AEM_Event_Unit_Order_Target))
set t = CreateTrigger()
set i = 0
loop
exitwhen i == bj_MAX_PLAYER_SLOTS
call TriggerRegisterPlayerUnitEvent(t, Player(i), EVENT_PLAYER_UNIT_ISSUED_POINT_ORDER, null)
set i = i + 1
endloop
call TriggerAddCondition(t, Filter(function AEM_Event_Unit_Order_Point))
set t = CreateTrigger()
set i = 0
loop
exitwhen i == bj_MAX_PLAYER_SLOTS
call TriggerRegisterPlayerUnitEvent(t, Player(i), EVENT_PLAYER_UNIT_ISSUED_ORDER, null)
set i = i + 1
endloop
call TriggerAddCondition(t, Filter(function AEM_Event_Unit_Order_Instant))
call TimerStart(CreateTimer(), 0.05, false, function UnitCreation_Start)
set t = null
endfunction
Events need a unique number and before you had to initialize all events inside the global tags and have a list of all events to know which numbers are free and which numbers are used.
In this one, you automatically create a value for the event that you give to the system.
This value is returned to the return address and should be set into the variable.
JASS:
function Ability_Effect_Blizzard takes nothing returns boolean
call DisplayTextToPlayer(GetLocalPlayer(), 0, 0, "Blizzard has being cast.")
return false
endfunction
function Ability_Effect_SummonWaterElemental takes nothing returns boolean
call DisplayTextToPlayer(GetLocalPlayer(), 0, 0, "Summon Water Elemental has being cast.")
return false
endfunction
//===========================================================================
function InitTrig_Blizzard takes nothing returns nothing
local trigger t = CreateTrigger()
call BJDebugMsg("started Blizzard")
set udg_AEM_Event_Unit_Spell_Effect = AEM_TriggerRegisterEvent2(t, udg_AEM_Event_Unit_Spell_Effect, 'AHbz', 50, true, true)
call TriggerAddCondition(t, Filter(function Ability_Effect_Blizzard))
set t = CreateTrigger()
call BJDebugMsg("started SWE")
call AEM_TriggerRegisterEvent2(t, udg_AEM_Event_Unit_Spell_Effect, 'AHwe', 0, true, true)
call TriggerAddCondition(t, Filter(function Ability_Effect_SummonWaterElemental))
endfunction
After that, you can use that value over and over again.
It is not necessary to set the value again and this would still work:
JASS:
function InitTrig_Blizzard takes nothing returns nothing
local trigger t = CreateTrigger()
call BJDebugMsg("started Blizzard")
set udg_AEM_Event_Unit_Spell_Effect = AEM_TriggerRegisterEvent2(t, udg_AEM_Event_Unit_Spell_Effect, 'AHbz', 50, true, true)
call TriggerAddCondition(t, Filter(function Ability_Effect_Blizzard))
set t = CreateTrigger()
call BJDebugMsg("started SWE")
set udg_AEM_Event_Unit_Spell_Effect = AEM_TriggerRegisterEvent2(t, udg_AEM_Event_Unit_Spell_Effect, 'AHwe', 0, true, true)
call TriggerAddCondition(t, Filter(function Ability_Effect_SummonWaterElemental))
endfunction
Last edited: