Functions Library – Arma 3
Lou Montana (talk | contribs) m (Some wiki formatting) |
(added back information about headerType and other debug info) |
||
Line 192: | Line 192: | ||
| the <tt>recompile</tt> attribute can be set to 1 to recompile the function upon mission start (functions in [[Description.ext]] are always compiled upon mission (re)start) | | the <tt>recompile</tt> attribute can be set to 1 to recompile the function upon mission start (functions in [[Description.ext]] are always compiled upon mission (re)start) | ||
| style="text-align: center" | {{Icon|unchecked}} | | style="text-align: center" | {{Icon|unchecked}} | ||
| style="text-align: center" | {{Icon|checked}} | |||
|- | |||
| headerType | |||
| the <tt>headerType</tt> adds code to the beginning of your functions that can.. | |||
* Set up the [[#Meta Variables|Meta Variables]] _fnc_scriptParent and _fnc_scriptName | |||
* Name the current scope via the command [[scriptName]] | |||
* Adds debug information by saving the current execution order in the [[Array]] _fnc_scriptMap.<br/> | |||
Possible values are: | |||
* -1: No header - Adds nothing, literally adds a blank [[String]] to the beginning of your function. The function will have no debug or [[#Meta Variables|Meta Variables]] assigned for it and the scope will not be named. Useful to reduce the performance overhead or if custom debug system is used. | |||
* 0: Default header - The default header changes based on the current [[#Debug Mode:Debug Mode]] | |||
* 1: System header - Incorporates the [[#Meta Variables|Meta Variables]] _fnc_scriptParent. Also names the current scope. | |||
private _fnc_scriptNameParent = [[if]] ([[isNil]] '_fnc_scriptName') [[then]] {'%1'} [[else]] {_fnc_scriptName}; | |||
[[scriptName]] '%1'; | |||
See the following section for more information. | |||
| style="text-align: center" | {{Icon|checked}} | |||
| style="text-align: center" | {{Icon|checked}} | | style="text-align: center" | {{Icon|checked}} | ||
|} | |} | ||
Line 201: | Line 216: | ||
}} | }} | ||
== Advanced Knowledge == | |||
=== Debug Mode === | |||
Developers can access several debug modes using ''[[BIS_fnc_functionsDebug]]'' function. | |||
# '''No debug''' | |||
#* Default | |||
# '''Save script map''' | |||
#* Variable ''_fnc_scriptMap'' tracking script execution progress is stored in function header | |||
# '''Save and log script map''' | |||
#* Variable ''_fnc_scriptMap'' tracking script execution progress is stored in functions header and it is printed to debug log. | |||
{{Feature|important|Function recompiling has to be allowed!}} | |||
==== Debug Mode 0 ==== | |||
default - incorporates the [[#Meta Variables|Meta Variables]] _fnc_scriptParent and _fnc_scriptName and names the current scope. | |||
{| | |||
| | |||
private _fnc_scriptNameParent = if (isNil '_fnc_scriptName') then {'%1'} else {_fnc_scriptName}; | |||
private _fnc_scriptName = '%1'; | |||
scriptName _fnc_scriptName; | |||
|} | |||
==== Debug Mode 1 ==== | |||
As per ''Debug Mode 0'' and also saves the current execution order in the [[Array]] _fnc_scriptMap. | |||
{| | |||
| | |||
private _fnc_scriptNameParent = if (isNil '_fnc_scriptName') then {'%1'} else {_fnc_scriptName}; | |||
private _fnc_scriptName = '%1'; | |||
scriptName _fnc_scriptName; | |||
private _fnc_scriptMap = if (isNil '_fnc_scriptMap') then {[_fnc_scriptName]} else {_fnc_scriptMap + [_fnc_scriptName]}; | |||
|} | |||
==== Debug Mode 2 ==== | |||
As per ''Debug Mode 1'' and also outputs execution order using [[textLogFormat]] ( textLogFormat is not available in the retail version of Arma3 ) is it available in Diagnostics exe? | |||
{| | |||
| | |||
private _fnc_scriptNameParent = if (isNil '_fnc_scriptName') then {'%1'} else {_fnc_scriptName}; | |||
private _fnc_scriptName = '%1'; | |||
scriptName _fnc_scriptName; | |||
private _fnc_scriptMap = if (isNil '_fnc_scriptMap') then {[_fnc_scriptName]} else {_fnc_scriptMap + [_fnc_scriptName]}; | |||
textLogFormat ['%1 : %2', _fnc_scriptMap joinString ' >> ', _this]; | |||
|} | |||
=== Meta Variable === | |||
* '''_fnc_scriptMap''': ARRAY - List of all parent scripts (available only in debug mode 1 and higher, see [[#Debug_Mode|above]]). | |||
== See Also == | == See Also == | ||
Line 208: | Line 272: | ||
* [[:Category:Arma 3: Functions|Arma 3 Functions]] | * [[:Category:Arma 3: Functions|Arma 3 Functions]] | ||
* [[Arma 3: Writing a Function|Writing a Function Tutorial]] | * [[Arma 3: Writing a Function|Writing a Function Tutorial]] | ||
{{GameCategory|arma3|Editing}} | {{GameCategory|arma3|Editing}} | ||
[[Category: Functions Library]] | [[Category: Functions Library]] |
Revision as of 10:38, 14 August 2021
Arma 3's Functions Library is the way to declare mission, campaign or addon's Functions. The main difference from older Function Libraries is that it runs automatically and does not require a Functions module.
The advantages of using the Functions Library over e.g execVM an SQF file are as follow:
- Automatic compilation upon mission start into a global variable - no need to remember direct paths to files.
- Anti-hack protection using compileFinal (see Recompiling)
- Listing in the Functions Viewer
- Advanced debugging options
- Optional immediate execution upon mission start, without need for manual call
- Potential performance improvements
Function Declaration
Functions are configured within the CfgFunctions class.
Mission and campaign specific functions can be configured in Description.ext/Campaign Description.ext, while addon functions are defined in Config.cpp. Configuration structure is the same in both cases.
See a basic example config:
class CfgFunctions { class TAG { class Category { class functionName {}; }; }; };
- The function's name will be TAG_fnc_functionName
- The function will be loaded:
- from config: <ROOT>\Category\fn_functionName.sqf
- from description.ext: <ROOT>\Functions\Category\fn_functionName.sqf
Config Levels
A CfgFunctions config is made of three levels: Tag, Category, and Function.
Tag
To prevent duplicates, every author must create a subclass with a unique tag and create functions under it. The tag name will be used when composing a function name (e.g BIS_fnc_spawnGroup).
class CfgFunctions { class TAG { class Category { class myFunction {}; }; }; class TAG_WeaponManagement { tag = "TAG"; // the function will be named TAG_fnc_myOtherFunction class Category { class myOtherFunction {}; }; }; };
Attributes
tag
The tag attribute can override the config tag set differently.
Category
The category name changes the function's category in the Functions Viewer. It does not change the function's name, only the loading path.
class CfgFunctions { class TAG { class Category { class myFunction {}; }; class OtherCategory { file = "My\Category\Path"; class myFunction {}; // file path will be <ROOT>\My\Category\Path\fn_myFunction.sqf"; }; class DataCategory { requiredAddons[] = { "A3_Data_F" }; // Optional requirements of CfgPatches classes. If some addons are missing, category functions will not be compiled. class myDataFunction {}; }; }; };
Attributes
file
The file attribute can override the category's loading path segment.
requiredAddons
The category can skip loading if a required addon is missing by setting its dependency with the requiredAddons attribute.
Function
class CfgFunctions { class TAG { class Category1 { class myFunction {}; }; class Category2 { file = "Path\To\Category"; class myFunction { file = "My\Function\Filepath.sqf"; // file path will be <ROOT>\My\Function\Filepath.sqf", ignoring "Path\To\Category" }; class myFSMFunction { preInit = 1; postInit = 1; ext = ".fsm"; preStart = 1; recompile = 1; }; }; }; };
Attributes
Attribute | Description | Available in | |
---|---|---|---|
Description.ext | config.cpp | ||
file | the file attribute can be used to manually set the file path. | ||
preInit | the preInit attribute (formerly known as "forced") can be set to 1 to call the function upon mission start, before objects are initialized. Passed arguments are ["preInit"] . The function is run in an unscheduled environment.
|
||
postInit | the postInit attribute can be set to 1 to call the function upon mission start, after objects are initialized. Passed arguments are ["postInit", didJIP] . The function is run in a scheduled environment so suspension is allowed, but any long term suspension will halt the mission loading until suspension is done.
|
||
ext | the ext attribute can be used to set function file's type; it can be one of:
|
||
preStart | the preStart attribute can be set to 1 to call the function upon game start, before title screen, but after all addons are loaded. | ||
recompile | the recompile attribute can be set to 1 to recompile the function upon mission start (functions in Description.ext are always compiled upon mission (re)start) | ||
headerType | the headerType adds code to the beginning of your functions that can..
Possible values are:
private _fnc_scriptNameParent = if (isNil '_fnc_scriptName') then {'%1'} else {_fnc_scriptName}; scriptName '%1'; See the following section for more information. |
Advanced Knowledge
Debug Mode
Developers can access several debug modes using BIS_fnc_functionsDebug function.
- No debug
- Default
- Save script map
- Variable _fnc_scriptMap tracking script execution progress is stored in function header
- Save and log script map
- Variable _fnc_scriptMap tracking script execution progress is stored in functions header and it is printed to debug log.
Debug Mode 0
default - incorporates the Meta Variables _fnc_scriptParent and _fnc_scriptName and names the current scope.
private _fnc_scriptNameParent = if (isNil '_fnc_scriptName') then {'%1'} else {_fnc_scriptName}; private _fnc_scriptName = '%1'; scriptName _fnc_scriptName; |
Debug Mode 1
As per Debug Mode 0 and also saves the current execution order in the Array _fnc_scriptMap.
private _fnc_scriptNameParent = if (isNil '_fnc_scriptName') then {'%1'} else {_fnc_scriptName}; private _fnc_scriptName = '%1'; scriptName _fnc_scriptName; private _fnc_scriptMap = if (isNil '_fnc_scriptMap') then {[_fnc_scriptName]} else {_fnc_scriptMap + [_fnc_scriptName]}; |
Debug Mode 2
As per Debug Mode 1 and also outputs execution order using textLogFormat ( textLogFormat is not available in the retail version of Arma3 ) is it available in Diagnostics exe?
private _fnc_scriptNameParent = if (isNil '_fnc_scriptName') then {'%1'} else {_fnc_scriptName}; private _fnc_scriptName = '%1'; scriptName _fnc_scriptName; private _fnc_scriptMap = if (isNil '_fnc_scriptMap') then {[_fnc_scriptName]} else {_fnc_scriptMap + [_fnc_scriptName]}; textLogFormat ['%1 : %2', _fnc_scriptMap joinString ' >> ', _this]; |
Meta Variable
- _fnc_scriptMap: ARRAY - List of all parent scripts (available only in debug mode 1 and higher, see above).