System UnitInRangeEvent

Nestharus

o-o
Reaction score
84
JASS:

library UnitInRangeEvent /* v2.0.0.1
*************************************************************************************
*
*   Trigger condition UnitInRangeEvent
*
*************************************************************************************
*
*   */uses/*
*
*       */ Table /*                 hiveworkshop.com/forums/jass-functions-413/snippet-new-table-188084/
*       */ UnitIndexer /*           hiveworkshop.com/forums/jass-functions-413/unit-indexer-172090/
*
************************************************************************************
*
*   function RegisterUnitInRangeEvent takes code condition, unit whichUnit, real range returns triggercondition
*   function UnregisterUnitInRangeEvent takes triggercondition condition, unit whichUnit, real range returns nothing
*
*   function GetEventSourceUnitId takes nothing returns UnitIndex
*   function GetEventSourceUnit takes nothing returns unit
*
************************************************************************************/
    globals
        private integer instanceCount = 0
        private integer array first
        private integer array next              //recycler
        private integer array prev
        private trigger array trig
        private integer array source
        private integer array handleId
        
        private Table rangeEvent
    endglobals
    
    static if DEBUG_MODE then
        private struct Debug extends array
            static boolean array allocated
        endstruct
    endif
    
    function GetEventSourceUnitId takes nothing returns UnitIndex
        return source[rangeEvent[GetHandleId(GetTriggeringTrigger())]]
    endfunction
    function GetEventSourceUnit takes nothing returns unit
        return GetUnitById(GetEventSourceUnitId())
    endfunction
    function RegisterUnitInRangeEvent takes code eventCode, unit whichUnit, real range returns integer
        local integer sourceUnit=GetUnitUserData(whichUnit)
        local integer this
        local trigger eventTrigger
        local integer head
        local integer triggerId
        
        //if the unit isn't null
        debug if (GetUnitById(sourceUnit) == whichUnit and null != whichUnit) then
            //allocate
            if (0 == next[0]) then
                set this = instanceCount + 1
                set instanceCount = this
            else
                set this = next[0]
                set next[0]=next[this]
            endif
            debug set Debug.allocated[this] = true
            
            //add to list
            set head = first[sourceUnit]
            if (0 == head) then
                set first[sourceUnit] = this
                set next[this] = this
                set prev[this] = this
            else
                set prev[this] = prev[head]
                set next[this] = head
                set next[prev[head]] = this
                set prev[head] = this
            endif
            
            //register trigger
            set eventTrigger = CreateTrigger()
            call TriggerRegisterUnitInRange(eventTrigger, whichUnit, range, null)
            call TriggerAddCondition(eventTrigger, Condition(eventCode))
            
            //store fields
            set triggerId = GetHandleId(eventTrigger)
            
            set handleId[this] = triggerId
            set trig[this] = eventTrigger
            set source[this] = sourceUnit
            
            set rangeEvent[triggerId] = this
            
            //clean
            set eventTrigger = null
            
            return this
        debug else
            debug call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,60,"RANGE EVENT ERROR: ATTEMPT TO REGISTER NULL UNIT")
        debug endif
        
        return 0
    endfunction
    function UnregisterUnitInRangeEvent takes integer this returns nothing
        local integer sourceUnit
        
        //if event was allocated
        debug if (Debug.allocated[this]) then
            set sourceUnit = source[this]
        
            //remove from list
            set next[prev[this]] = next[this]
            set prev[next[this]] = prev[this]
            
            if (first[sourceUnit] == this) then
                set first[sourceUnit] = next[this]
                
                if (first[sourceUnit] == this) then
                    set first[sourceUnit] = 0
                endif
            endif
            
            //deallocate
            set next[this] = next[0]
            set next[0] = this
            debug set Debug.allocated[this] = false
            
            //clean
            call DestroyTrigger(trig[this])
            set trig[this] = null
            
            call rangeEvent.remove(handleId[this])
        debug else
            debug call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,60,"RANGE EVENT ERROR: ATTEMPT TO UNREGISTER NULL RANGE EVENT")
        debug endif
    endfunction
    private module Init
        private static method onDeindex takes nothing returns boolean
            local integer sourceUnit = GetIndexedUnitId()
            local integer node = first[sourceUnit]
            
            //if there are any events on the unit
            if (0 != node) then
                //clean all events
                set next[prev[node]] = 0
                loop
                    call DestroyTrigger(trig[node])
                    set trig[node] = null
                    
                    call rangeEvent.remove(handleId[node])
                    
                    debug set Debug.allocated[node] = false
                    
                    set node = next[node]
                    exitwhen 0 == node
                endloop
                
                //deallocate list
                set node = first[sourceUnit]
                set next[prev[node]] = next[0]
                set next[0] = node
            endif
            
            return false
        endmethod
        private static method onInit takes nothing returns nothing
            call RegisterUnitIndexEvent(Condition(function thistype.onDeindex),UnitIndexer.DEINDEX)
            set rangeEvent=Table.create()
        endmethod
    endmodule
    private struct Inits extends array
        implement Init
    endstruct
endlibrary
 
General chit-chat
Help Users
  • No one is chatting at the moment.

      The Helper Discord

      Members online

      Affiliates

      Hive Workshop NUON Dome World Editor Tutorials

      Network Sponsors

      Apex Steel Pipe - Buys and sells Steel Pipe.
      Top