Static ifs in modules

luorax

Invasion in Duskwood
Reaction score
67
Okay, so I need a way to use static ifs in my aura module. An example:

JASS:
method removeUnit takes unit u returns nothing
    call GroupRemoveUnit(this.affected,u)
    set thistype.stack[GetUnitUserData(u)]=thistype.stack[GetUnitUserData(u)]-1
    static if thistype.unitLeave.exists then
        if thistype.stack[GetUnitUserData(u)]==0
            call this.unitLeave(u)
        endif
    endif
endmethod


So basically I want to avoid useless methods and method calls by using static ifs. However, static ifs run before the module itself is implemented, therefor it won't work like that. So, any ideas what should I do?
 

Dirac

22710180
Reaction score
147
False, the module is implemented and then it checks for the static ifs.
Many resources at the hive already work this way
 

luorax

Invasion in Duskwood
Reaction score
67
Well, I have JH 0.A.2.B, the latest released by Vexorian (not going to use the THW version ever), the methods exist and nothing:

JASS:
method removeUnit takes unit u returns nothing
    call GroupRemoveUnit(this.affected,u)
    set thistype.stack[GetUnitUserData(u)]=thistype.stack[GetUnitUserData(u)]-1
    static if thistype.unitLeave.exists then
        call BJDebugMsg("Running the method")
        if thistype.stack[GetUnitUserData(u)]==0
            call this.unitLeave(u)
        endif
    endif
endmethod


The debug message doesn't pop up.
 

Dirac

22710180
Reaction score
147
I have 0.A.2.B too, and i'll quote from some systems
Missile
JASS:
private static method missileIterate takes nothing returns nothing
    local unit u
    local Missile this = NODE[INDEX].next
    call this.move()
    loop
        exitwhen this.head
        
        if this.wantDestroy then
            static if thistype.onFinish.exists then
                call thistype.onFinish(this)
            endif
            call missileTerminate(this)
        else
            if this.recycle then
                static if thistype.onCollide.exists then
                    static if thistype.onFinish.exists then
                        if this.target==null then
                            if thistype.onFinish(this) then
                                call missileTerminate(this)
                            else
                                set this.recycle = false
                            endif
                        elseif thistype.onCollide(this,this.target) then
                            call missileTerminate(this)
                        else
                            set this.recycle = false
                        endif
                    else 
                        if this.target==null then
                            call missileTerminate(this)
                        elseif thistype.onCollide(this,this.target) then
                            call missileTerminate(this)
                        else
                            set this.recycle = false
                        endif
                    endif
                else
                    static if thistype.onFinish.exists then
                        if thistype.onFinish(this) then
                            call missileTerminate(this)
                        else
                            set this.recycle = false
                        endif
                    else
                        call missileTerminate(this)
                    endif
                endif
            else
                static if thistype.onCollide.exists then
                    if this.collision!=0 then
                        call GroupEnumUnitsInRange(bj_lastCreatedGroup,this.x,this.y,this.collision,null)
                        loop
                            set u = FirstOfGroup(bj_lastCreatedGroup)
                            exitwhen u==null
                            if not(IsUnitInGroup(u,this.unitsHit)) and u!=this.target and thistype.onCollide(this,u) then
                                call missileTerminate(this)
                            endif
                            call GroupAddUnit(this.unitsHit,u)
                            call GroupRemoveUnit(bj_lastCreatedGroup,u)
                        endloop
                    endif
                endif
            endif
        endif
        
        static if thistype.onMissile.exists then
            call onMissileLoop(this)
        endif
        
        static if thistype.onPeriod.exists then
            if thistype.onPeriod(this) then
                call missileTerminate(this)
            endif
        endif
        
        set this = this.next
    endloop
    
    set u=null
endmethod

UnitIndexer
JASS:
module UnitIndexStruct
    static method operator [] takes unit u returns thistype
        return GetUnitUserData(u)
    endmethod
    method operator unit takes nothing returns unit
        return e[this]
    endmethod
    static if thistype.filter.exists then
        static if thistype.index.exists then
            static if thistype.deindex.exists then
                readonly boolean allocated
            else
                method operator allocated takes nothing returns boolean
                    return filter(e[this])
                endmethod
            endif
        else
            method operator allocated takes nothing returns boolean
                return filter(e[this])
            endmethod
        endif
    elseif (thistype.index.exists) then
        static if thistype.deindex.exists then
            readonly boolean allocated
        else
            method operator allocated takes nothing returns boolean
                return this==GetUnitUserData(e[this])
            endmethod
        endif
    else
        method operator allocated takes nothing returns boolean
            return this==GetUnitUserData(e[this])
        endmethod
    endif
    static if thistype.index.exists then
        private static method onIndexEvent takes nothing returns boolean
            static if thistype.filter.exists then
                if (filter(e[o])) then
                    static if thistype.deindex.exists then
                        set thistype(o).allocated=true
                    endif
                    call thistype(o).index()
                endif
            else
                static if thistype.deindex.exists then
                    set thistype(o).allocated=true
                endif
                call thistype(o).index()
            endif
            return false
        endmethod
    endif
    static if thistype.deindex.exists then
        private static method onDeindexEvent takes nothing returns boolean
            static if thistype.filter.exists then
                static if thistype.index.exists then
                    if (thistype(o).allocated) then
                        set thistype(o).allocated=false
                        call thistype(o).deindex()
                    endif
                else
                    if (filter(e[o])) then
                        call thistype(o).deindex()
                    endif
                endif
            else
                static if thistype.index.exists then
                    set thistype(o).allocated=false
                endif
                call thistype(o).deindex()
            endif
            return false
        endmethod
    endif
    static if thistype.index.exists then
        static if thistype.deindex.exists then
            private static method onInit takes nothing returns nothing
                call RegisterUnitIndexEvent(Condition(function thistype.onIndexEvent),UnitIndexer.INDEX)
                call RegisterUnitIndexEvent(Condition(function thistype.onDeindexEvent),UnitIndexer.DEINDEX)
            endmethod
        else
            private static method onInit takes nothing returns nothing
                call RegisterUnitIndexEvent(Condition(function thistype.onIndexEvent),UnitIndexer.INDEX)
            endmethod
        endif
    elseif thistype.deindex.exists then
        private static method onInit takes nothing returns nothing
            call RegisterUnitIndexEvent(Condition(function thistype.onDeindexEvent),UnitIndexer.DEINDEX)
        endmethod
    endif
endmodule
Etc... you must be doing something wrong, check for the method name
 

luorax

Invasion in Duskwood
Reaction score
67
I know that there're resources based on static ifs, I've even tried to figure out why they work; and I actually got what was wrong with my module. The module was implemented at the wrong place; it must be below those methods (it's also obvious, because normally it'd lead to trigger evals, but forgot about that). The module was implemented at the top of the struct, that's why it was bugged.
It's working now (I can rework my auras finally)
 

Bribe

vJass errors are legion
Reaction score
67
"static if thistype.methodName.exists then" only works if the method is found *above* the module. If it is below the module, it will return false. Edit: didn't read your last post, but yeah that is the general rule.
 
General chit-chat
Help Users
  • No one is chatting at the moment.

      The Helper Discord

      Members online

      No members online now.

      Affiliates

      Hive Workshop NUON Dome World Editor Tutorials

      Network Sponsors

      Apex Steel Pipe - Buys and sells Steel Pipe.
      Top