A function is mainly a chunk of code that either is used for multiple actions
of the same item, or a simple way to check the status of something. This
eliminates lots of code from the main script and makes it a bit cleaner for
you to see and debug.
In order to create a function, you can do one of many things. Many scripters
place their functions in 1 of 2 locations. I, myself, place my functions in a
functions.txt script file and load that independently. By doing this, you can
organize your functions and keep all your other scripts clean and free of
clutter. Another method is to simply place them inside the script itself,
however, I find this to lengthen the script quite a bit, and makes it
complicated to find where the function is located in case another script file
is calling it.
function(TAB)script(TAB)name(TAB){
// code
}
Sometimes it's necessary to send back information that you retrieved from your
function. Such as a TRUE/FALSE 0/1 response, or sometimes even more. In order
to do this, your function needs a return statement.
return <Value>;
return <Variable>;
There are a few ways to call functions, depends on what information you are
retrieving.
callfunc "MyFunction";
// Simply calls the function that does not use a RETURN command
Sometimes it's helpful to pass variables or values to a function in order to
retrieve the information that you would like. These values are called
arguments. Many people use these in order to make calculations.
function(TAB)script(TAB)calc(TAB){
set @a, getarg(0) + getarg(1);
return @a;
}
set @a, callfunc("calc",1,2)
mes @a;
3
Calling the Function:
callfunc "calc", MyArrayName;
The Function:
function(TAB)script(TAB)calc(TAB){
getelementofarray(getarg(0), 1);
}
prontera,150,150,5<TAB>script<TAB>Calculator<TAB>999,{
function<TAB>Add<TAB>{
return (getarg(0)+getarg(1));
}
mes Add(1,2);
}
Variables are passed to functions by reference
This means that you can do normal variable operations on a variable reference
returned by getarg.
Ex:
function<tab>script<tab>F_Increment<tab>-1,{
// getarg(0) returns a reference to the .@num variable in NPC_Test
// NOTE: you can't use .@num directly, it's a different variable from the .@num in NPC_Test
set getarg(0), getarg(0) + 1;
return;
}
prontera,156,156,4<tab>script<tab>NPC_Test<tab>56,{
// initial number
set .@num, 123;
mes .@num;
// increment inside the function
callfunc("F_Increment", .@num);
mes .@num;
close;
}
Operators always return values, so this would provoke an error on the set
inside F_Increment:
callfunc("F_Increment", .@num + 1);
It's important to note the difference between the reference of the variable
and the value of the variable: