• 🏆 Texturing Contest #33 is OPEN! Contestants must re-texture a SD unit model found in-game (Warcraft 3 Classic), recreating the unit into a peaceful NPC version. 🔗Click here to enter!
  • 🏆 Hive's 6th HD Modeling Contest: Mechanical is now open! Design and model a mechanical creature, mechanized animal, a futuristic robotic being, or anything else your imagination can tinker with! 📅 Submissions close on June 30, 2024. Don't miss this opportunity to let your creativity shine! Enter now and show us your mechanical masterpiece! 🔗 Click here to enter!

vJASS: How about vJASS events?

Status
Not open for further replies.
Level 24
Joined
Aug 1, 2013
Messages
4,657
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.
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.
 
Status
Not open for further replies.
Top