• 🏆 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!
  • It's time for the first HD Modeling Contest of 2024. Join the theme discussion for Hive's HD Modeling Contest #6! Click here to post your idea!

[Snippet] TriggerUserData

Bannar

Code Reviewer
Level 26
Joined
Mar 19, 2008
Messages
3,140
Simple trigger indexer created in order to give even more flexibility for user while scripting.
My RestoreTrigger required somekind of stuff like this.
JASS:
/*****************************************************************************
*
*    TriggerUserData v1.1.0.1
*       by Spinnaker
*
*    Enables assigning unique indexes to triggers.
*
******************************************************************************
*
*    Requirements:
*       Optional - Table by Bribe
*          hiveworkshop.com/forums/showthread.php?t=188084
*
******************************************************************************
*
*    Functions:
*       function SetTriggerUserData takes trigger t, integer index returns nothing
*          assigns unique index to trigger t
*       function GetTriggerUserData takes trigger t returns integer
*       function GetTriggerId takes trigger t returns integer
*          returns assigned data to trigger
*
*       function GetTriggerById takes integer index returns trigger
*          retrives trigger by it's index
*       function IsTriggerIndexed takes trigger t returns boolean
*          checks whether trigger is indexed or not
*
*****************************************************************************/
library TriggerUserData uses optional Table

    globals
        private integer array next
        private integer array prev
        private integer ic = 0
        private integer rec = 0
        private trigger array trigg
    endglobals

    function SetTriggerUserData takes trigger t, integer index returns nothing
        static if LIBRARY_Table then
            set TriggerData.tt[GetHandleId(t)] = index
        else
            call SaveInteger(TriggerData.tt, 0, GetHandleId(t), index)
        endif
    endfunction
    function GetTriggerUserData takes trigger t returns integer
        static if LIBRARY_Table then
            if TriggerData.tt.has(GetHandleId(t)) then
                return TriggerData.tt[GetHandleId(t)]
            endif
        else
            if HaveSavedInteger(TriggerData.tt, 0, GetHandleId(t)) then
                return LoadInteger(TriggerData.tt, 0, GetHandleId(t))
            endif
        endif
        return TriggerData.indexTrigger(t)
    endfunction

    private module TriggerUDInit
        private static method onInit takes nothing returns nothing
            static if LIBRARY_Table then
                set tt = Table.create()
            endif
        endmethod
    endmodule

    function GetTriggerById takes integer index returns trigger
        return trigg[index]
    endfunction
    function GetTriggerId takes trigger t returns integer
        return GetTriggerUserData(t)
    endfunction
    function IsTriggerIndexed takes trigger t returns boolean
        static if LIBRARY_Table then
            return TriggerData.tt.has(GetHandleId(t))
        else
            return HaveSavedInteger(TriggerData.tt, 0, GetHandleId(t))
        endif
    endfunction

    struct TriggerData extends array
        static boolean enabled = true
        static if LIBRARY_Table then
            static Table tt = 0
        else
            static hashtable tt = InitHashtable()
        endif

        static method indexTrigger takes trigger t returns integer
            local integer this=0
            if enabled and t!= null then
                if (0==rec) then
                    set ic=ic+1
                    set this=ic
                else
                    set this=rec
                    set rec=next[rec]
                endif
                call SetTriggerUserData(t, this)
                set trigg[this]=t

                set prev[this]=prev[0]
                set next[prev[0]]=this
                set next[this]=0
                set prev[0]=this
            endif
            return this
        endmethod

        static method deindexTrigger takes trigger t returns nothing
            local thistype this
            if IsTriggerIndexed(t) then
                set this = GetTriggerUserData(t)
                set next[prev[this]]=next[this]
                set prev[next[this]]=prev[this]
                static if LIBRARY_Table then
                    call TriggerData.tt.remove(GetHandleId(t))
                else
                    call RemoveSavedInteger(tt, 0, GetHandleId(t))
                endif
                set trigg[this]=null
                set next[this]=rec
                set rec=this
            endif
        endmethod

        implement TriggerUDInit
    endstruct
    hook DestroyTrigger TriggerData.deindexTrigger

endlibrary
 
Last edited:

Bannar

Code Reviewer
Level 26
Joined
Mar 19, 2008
Messages
3,140
Nes, tell me how can you reffer to actuall trigger (with 100% accurancy) without using it's handle id?
Jass array can't use indexes with such big numbers.

2nd using arrays with [GetHandleId(handle) - 0x100000] may seem to be a better option, but in big maps there might be more than 8191 handles.. For example, there could be more than 9k destructables on a single map actually.

I've made it in such way that it doesn't index everything, only when you want trigger to be indexed.
 
Level 31
Joined
Jul 10, 2007
Messages
6,306
Nes, tell me how can you reffer to actuall trigger (with 100% accurancy) without using it's handle id?
Jass array can't use indexes with such big numbers.

2nd using arrays with [GetHandleId(handle) - 0x100000] may seem to be a better option, but in big maps there might be more than 8191 handles.. For example, there could be more than 9k destructables on a single map actually.

I've made it in such way that it doesn't index everything, only when you want trigger to be indexed.

that's not the point... why should someone use this over Table?...
 

Bannar

Code Reviewer
Level 26
Joined
Mar 19, 2008
Messages
3,140
I had to be out of my mind. You've shown nothing new to me and yet I havent realised that saving index is not needed in such case. Will fix RestoreTrigger to just use just table I guess.

Nes, I didn't mean to force someone to use this over Table. Not by any means. Just thought, that creating unique triggeruserdata will smooth the process. You should have shown me example like Mag did. I was just plain wrong.
 
Top