Function Callbacks

Jass Tutorials

Function Callbacks

Some of you might be wondering: "How can I execute a code/boolexpr variable at will?"

There are only a few answers to this question:

Method 1: Dynamic Triggers

Code (jass) Select
local trigger t = CreateTrigger()
call TriggerAddCondition(t, boolexpr)
call TriggerEvaluate(t)
call DestroyTrigger(t)
set t = null


This is a simple concept of it.
What would be even better is doing this:

Code (jass) Select
globals
    private trigger t = CreateTrigger()
endglobals

function RunBoolexpr takes boolexpr b returns nothing
    call TriggerClearConditions(t)
    call TriggerAddCondition(t, b)
    call TriggerEvaluate(t)
endfunction


This method can also be used for executing code. You'd just have to use
TriggerAddAction and TriggerClearActions instead.

Method 2: Timer Callbacks

This method isn't so good. It appends the current thread, so it will only execute after the
current thread has finished executing.

Code (jass) Select
call TimerStart(CreateTimer(),0,false,code)

It only works for boolexprs.

Method 3: Function Interfaces

No. Function Interfaces produce a lot of garbage and they spam functions throughout the mapscript.
(If you don't know what a function interface is, basically, it's an object pointing to a certain function-type (Types are defined by their parameters and return-values))

Method 4: ForForce method

It involves creating a global force variable and using it
in the ForForce function. This is the most effective way to execute code.
Note: You must make sure that there will always be only one player in the force.

Method 5: ForceEnumPlayersCounted method

This method should NEVER be used in public resources.
What it does is execute a boolexpr based on the number of players in the map.
Its usage is only recommended for Single-player maps.

Note:
Sometimes, using a global trigger beats any of these methods.
The only case in which it does is when you want to execute multiple boolexprs/codes in the same thread/function.
Instead of constantly executing these functions, we could instead of enqueue them and fire them all as one code.

TriggerAddCondition allows us to enqueue these code/boolexprs into a trigger.
TriggerEvaluate will execute all of these functions.

Code (jass) Select
globals
    private trigger t = CreateTrigger()
    private boolexpr array b
endglobals

function Example takes nothing returns nothing
    local integer i = 10

    call TriggerClearConditions()
    loop
        // Enqueue the boolexpr
        call TriggerAddCondition(t, b[i])
        exitwhen i == 0
        set i = i - 1
    endloop

    call TriggerEvaluate(t)
endfunction


This method should always be used when you need to execute multiple boolexprs. It isn't helpful with codes though.
The ForForce method is the most effective.

FireCode - Executes Boolexprs and Codes efficiently and Correctly.

End
I hope this tutorial helps =)
Do not credit me for any of this information.
DioD at TheHelper.net is one of the first people to outline the ForForce method.
Nice tutorial :)

I was thinking that you should be more specific of which methods are the most recommended (third and fourth)

I think you should add some links to function interfaces method documentation. As you probably are aware, I'm placing the vJASS tutorial in this site for further reference. Just right now I'm going to give you the link to the WC3C link.

http://www.wc3c.net/vexorian/jasshelpermanual.html#funcinterf

Is it good enough? Or should I include anything extra to get 'er done? :p
Quote from: Magtheridon96 on December 29, 2011, 09:32:12 PM
Is it good enough? Or should I include anything extra to get 'er done? :p

Just add the jass tags that I've implemented (the highlighter is in development process, but it's working 50%)

Here's an example:

This code....
[code=jass]function interface someFunctionThatReturnsBoolean takes nothing returns boolean

function hello takes nothing returns boolean
    return false
endfunction

function hi takes nothing returns boolean
    return true
endfunction



produces this presentation:
Code (jass) Select
function interface someFunctionThatReturnsBoolean takes nothing returns boolean

function hello takes nothing returns boolean
    return false
endfunction

function hi takes nothing returns boolean
    return true
endfunction



Just add "=jass" to your code tags ;)
Done! :D
This tutorial looks better already ^.^
Kudos to you for making those nifty tags :P
Well, unfortunately, I recently realized that any "Counted" function fails and can execute more than once.
I guess the best way to execute boolexprs is by having a static trigger, clearing conditions, adding the boolexpr and evaluating the trigger.
It's slow, but it's the only working method :/
Quote from: Magtheridon96 on January 17, 2012, 07:54:57 PM
Well, unfortunately, I recently realized that any "Counted" function fails and can execute more than once.
I guess the best way to execute boolexprs is by having a static trigger, clearing conditions, adding the boolexpr and evaluating the trigger.
It's slow, but it's the only working method :/
yes, "groupenumcounted" functions are buggy as hell, I avoid them totally. Is better the non counted version, and in the boolexpr function you can implement the counting with coding.