Difference between revisions of "Arma 3: Functions Library"

From Bohemia Interactive Community
Jump to navigation Jump to search
(Cleanup about the Functions Library only (function redaction on Arma 3: Writing a Function))
m (Fix typo)
 
(11 intermediate revisions by 2 users not shown)
Line 2: Line 2:
 
{{arma3}}'s '''Functions Library''' is the way to declare mission, campaign or addon's [[Function]]s. The main difference from older [[:Category:Functions Library|Function Libraries]] is that it runs automatically and does not require a Functions module.
 
{{arma3}}'s '''Functions Library''' is the way to declare mission, campaign or addon's [[Function]]s. The main difference from older [[:Category:Functions Library|Function Libraries]] is that it runs automatically and does not require a Functions module.
  
 
{{Feature|informative|
 
 
The advantages of using the Functions Library over e.g [[execVM]] an [[SQF Syntax|SQF]] file are as follow:
 
The advantages of using the Functions Library over e.g [[execVM]] an [[SQF Syntax|SQF]] file are as follow:
 
# '''Automatic compilation upon mission start''' into a global variable - no need to remember direct paths to files.
 
# '''Automatic compilation upon mission start''' into a global variable - no need to remember direct paths to files.
Line 11: Line 9:
 
# '''Optional immediate execution upon mission start''', without need for manual call
 
# '''Optional immediate execution upon mission start''', without need for manual call
 
# '''Potential performance improvements'''
 
# '''Potential performance improvements'''
}}
 
  
  
Line 28: Line 25:
  
  
{{Feature|important|The root directory (noted as '''%ROOT%''' on this page) is the origin from which the game will try to load function files. It depends on <tt>CfgFunctions</tt>' location:
+
{{Feature|informative|The root directory (noted as '''&lt;ROOT&gt;''' on this page) is the origin from which the game will try to load function files. It depends on <tt>CfgFunctions</tt>' location:
* if [[Description.ext]], '''%ROOT%''' means the [[Mission Editor: External#Mission Folder|mission' root]] directory
+
* if [[Description.ext]], '''&lt;ROOT&gt;''' means the [[Mission Editor: External#Mission Folder|mission's root]] directory
* if [[Campaign Description.ext]], '''%ROOT%''' means the campaign's root directory
+
* if [[Campaign Description.ext]], '''&lt;ROOT&gt;''' means the campaign's root directory
* if in config, '''%ROOT%''' means the '''game'''<nowiki/>'s root directory. The addon path needs to be set manually.
+
* if in config, '''&lt;ROOT&gt;''' means the '''game'''<nowiki/>'s root directory. The addon path needs to be set manually.
 
}}
 
}}
  
Line 40: Line 37:
 
  class {{Color|purple|TAG}}
 
  class {{Color|purple|TAG}}
 
  {
 
  {
  class {{Color|orange|Category}}
+
  class {{Color|darkorange|Category}}
 
  {
 
  {
 
  class {{Color|teal|functionName}} {};
 
  class {{Color|teal|functionName}} {};
Line 48: Line 45:
 
* The function's name will be '''{{Color|purple|TAG}}'''_fnc_'''{{Color|teal|functionName}}'''
 
* The function's name will be '''{{Color|purple|TAG}}'''_fnc_'''{{Color|teal|functionName}}'''
 
* The function will be loaded:
 
* The function will be loaded:
** from config: <tt>'''%ROOT%'''\'''{{Color|orange|Category}}'''\'''fn_{{Color|teal|functionName}}.sqf'''</tt>
+
** from config: <tt>'''&lt;ROOT&gt;'''\{{Color|darkorange|Category}}\'''fn_'''{{Color|teal|functionName}}'''.sqf'''</tt>
** from description.ext: <tt>'''%ROOT%'''\Functions\'''{{Color|orange|Category}}'''\'''fn_{{Color|teal|functionName}}.sqf'''</tt>
+
** from description.ext: <tt>'''&lt;ROOT&gt;'''\'''Functions'''\{{Color|darkorange|Category}}\'''fn_'''{{Color|teal|functionName}}'''.sqf'''</tt>
  
{{Feature|informative|'''config.cpp only''': Anywhere outside of running mission, refer to the functions stored in [[uiNamespace]].
+
{{Feature|informative|'''config.cpp only''': Anywhere outside of running mission, refer to the functions stored in [[uiNamespace]]. e.g:
''arguments'' [[call]] ([[uiNamespace]] [[getVariable]] ''"functionName"'');}}
+
<code>''arguments'' [[call]] ([[uiNamespace]] [[getVariable]] ''"{{Color|purple|TAG}}_fnc_{{Color|teal|functionName}}"'');</code>}}
  
 
=== Config Levels ===
 
=== Config Levels ===
Line 73: Line 70:
 
  class TAG_WeaponManagement
 
  class TAG_WeaponManagement
 
  {
 
  {
  tag = {{Color|purple|"TAG"}}; {{cc|the function will be named '''{{Color|purple|TAG}}_fnc_myOtherFunction'''}}
+
  '''tag''' = {{Color|purple|"TAG"}}; {{cc|the function will be named '''{{Color|purple|TAG}}_fnc_myOtherFunction'''}}
 
  class Category
 
  class Category
 
  {
 
  {
Line 83: Line 80:
 
===== Attributes =====
 
===== Attributes =====
 
====== tag ======
 
====== tag ======
* the <tt>tag</tt> attribute  
+
The <tt>tag</tt> attribute can override the config {{Color|green|tag}} set differently.
 
 
=== Category ===
 
  
 +
==== Category ====
 
The category name changes the function's category in the [[Arma 3: Functions Viewer|Functions Viewer]]. It does not change the function's name, only the loading path.
 
The category name changes the function's category in the [[Arma 3: Functions Viewer|Functions Viewer]]. It does not change the function's name, only the loading path.
 
  class CfgFunctions
 
  class CfgFunctions
Line 92: Line 88:
 
  class TAG
 
  class TAG
 
  {
 
  {
  class {{Color|orange|Category}}
+
  class {{Color|darkorange|Category}}
 
  {
 
  {
 
  class myFunction {};
 
  class myFunction {};
 
  };
 
  };
 
   
 
   
  class {{Color|orange|OtherCategory}}
+
  class OtherCategory
 
  {
 
  {
  '''file''' = "My\Category\Path";
+
  '''file''' = "{{Color|darkorange|My}}\{{Color|darkorange|Category}}\{{Color|darkorange|Path}}";
  class myFunction {}; {{cc|file path will be %ROOT%\{{Color|orange|My\Category\Path}}\fn_myFunction.sqf";
+
  class myFunction {}; {{cc|file path will be '''&lt;ROOT&gt;'''\{{Color|darkorange|My}}\{{Color|darkorange|Category}}\{{Color|darkorange|Path}}\fn_myFunction.sqf";}}
 
  };
 
  };
 
   
 
   
  class {{Color|orange|Data}}
+
  class DataCategory
 
  {
 
  {
  '''requiredAddons[]''' = { "A3_Data_F" }; {{cc|Optional requirements of [[CfgPatches]] classes. If some addons are missing, category functions will not be compiled.}}
+
  '''requiredAddons[]''' = {{Color|darkorange|{ "A3_Data_F" }<nowiki/>}}; {{cc|Optional requirements of [[CfgPatches]] classes. If some addons are missing, category functions will not be compiled.}}
 
  class myDataFunction {};
 
  class myDataFunction {};
 
  };
 
  };
Line 112: Line 108:
  
 
===== Attributes =====
 
===== Attributes =====
 
 
====== file ======
 
====== file ======
 
The <tt>file</tt> attribute can override the category's loading path segment.
 
The <tt>file</tt> attribute can override the category's loading path segment.
Line 118: Line 113:
 
====== requiredAddons ======
 
====== requiredAddons ======
 
The category can skip loading if a required addon is missing by setting its dependency with the <tt>requiredAddons</tt> attribute.
 
The category can skip loading if a required addon is missing by setting its dependency with the <tt>requiredAddons</tt> attribute.
class Data
 
{
 
requiredAddons[]''' = { "A3_Data_F" }; {{cc|Optional requirements of [[CfgPatches]] classes. If some addons are missing, category functions will not be compiled.}}
 
class myDataFunction {};
 
};
 
 
=== Function ===
 
  
 +
==== Function ====
 
{{Feature|informative|By convention, the function class should be named in '''camelCase''' and not have its first letter capitalised (e.g PascalCase):
 
{{Feature|informative|By convention, the function class should be named in '''camelCase''' and not have its first letter capitalised (e.g PascalCase):
 
* {{Icon|checked}} TAG_fnc_{{Color|teal|myFunction}}
 
* {{Icon|checked}} TAG_fnc_{{Color|teal|myFunction}}
Line 143: Line 132:
 
  {
 
  {
 
  file = "Path\To\Category";
 
  file = "Path\To\Category";
  class {{Color|teal|myFunction}}
+
  class myFunction
 
  {
 
  {
  '''file''' = "My\Function\Filepath.sqf"; {{cc|file path will be %ROOT%\My\Function\Filepath.sqf", ignoring "Path\To\Category"}}
+
  '''file''' = "{{Color|teal|My}}\{{Color|teal|Function}}\{{Color|teal|Filepath.sqf}}"; {{cc|file path will be '''&lt;ROOT&gt;'''\{{Color|teal|My}}\{{Color|teal|Function}}\{{Color|teal|Filepath.sqf}}", ignoring "Path\To\Category"}}
 
  };
 
  };
 
   
 
   
  class {{Color|teal|myOtherFunction}}
+
  class {{Color|teal|myFSMFunction}}
 
  {
 
  {
  preInit = 1;
+
  '''preInit''' = 1;
  postInit = 1;
+
  '''postInit''' = 1;
  ext = ".fsm";
+
  '''ext''' = ".fsm";
  preStart = 1;
+
  '''preStart''' = 1;
  recompile = 1;
+
  '''recompile''' = 1;
 
  };
 
  };
 
  };
 
  };
Line 161: Line 150:
  
 
===== Attributes =====
 
===== Attributes =====
{| class="wikitable"
+
{| class="wikitable sortable"
|+ Attributes
+
! rowspan="2" | Attribute
! Attribute
+
! rowspan="2" | Description
! Description
+
! colspan="2" | Available in
 +
|- style="font-size: 0.9em"
 +
! [[Description.ext]]
 +
! [[config.cpp]]
 
|-
 
|-
 
| file
 
| file
 
| the <tt>file</tt> attribute can be used to manually set the file path.
 
| the <tt>file</tt> attribute can be used to manually set the file path.
 
{{Feature|important|The '''file''' entry '''overrides''' Category's set path and ignores it entirely (they are not merged).}}
 
{{Feature|important|The '''file''' entry '''overrides''' Category's set path and ignores it entirely (they are not merged).}}
 +
| style="text-align: center" | {{Icon|checked}}
 +
| style="text-align: center" | {{Icon|checked}}
 
|-
 
|-
 
| preInit
 
| preInit
 
| the <tt>preInit</tt> attribute (formerly known as "forced") can be set to 1 to call the function upon mission start, before objects are initialized.<br>Passed arguments are {{ic|["preInit"]}}. The function is run in an '''[[Scheduler#Unscheduled Environment|unscheduled environment]]'''.
 
| the <tt>preInit</tt> attribute (formerly known as "forced") can be set to 1 to call the function upon mission start, before objects are initialized.<br>Passed arguments are {{ic|["preInit"]}}. The function is run in an '''[[Scheduler#Unscheduled Environment|unscheduled environment]]'''.
 +
| style="text-align: center" | {{Icon|checked}}
 +
| style="text-align: center" | {{Icon|checked}}
 
|-
 
|-
 
| postInit
 
| postInit
 
| the <tt>postInit</tt> attribute can be set to 1 to call the function upon mission start, after objects are initialized.<br>Passed arguments are {{ic|["postInit", [[didJIP]]]}}. The function is run in a '''[[Scheduler#Scheduled Environment|scheduled environment]]''' so suspension is allowed, but '''any long term suspension will halt the mission loading until suspension is done'''.
 
| the <tt>postInit</tt> attribute can be set to 1 to call the function upon mission start, after objects are initialized.<br>Passed arguments are {{ic|["postInit", [[didJIP]]]}}. The function is run in a '''[[Scheduler#Scheduled Environment|scheduled environment]]''' so suspension is allowed, but '''any long term suspension will halt the mission loading until suspension is done'''.
 +
| style="text-align: center" | {{Icon|checked}}
 +
| style="text-align: center" | {{Icon|checked}}
 
|-
 
|-
 
| ext
 
| ext
| the <tt>ext</tt> attribute can be used to set function file's type; it can be
+
| the <tt>ext</tt> attribute can be used to set function file's type; it can be one of:
** ".sqf" (default)
+
* ".sqf" (default)
** ".fsm" (see [[FSM]])
+
* ".fsm" (see [[FSM]])
 +
| style="text-align: center" | {{Icon|checked}}
 +
| style="text-align: center" | {{Icon|checked}}
 +
|-
 +
| preStart
 +
| the <tt>preStart</tt> attribute can be set to 1 to call the function upon game start, before title screen, but after all addons are loaded.
 +
| style="text-align: center" | {{Icon|unchecked}}
 +
| style="text-align: center" | {{Icon|checked}}
 +
|-
 +
| recompile
 +
| 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|checked}}
 +
|-
 +
| headerType
 +
| the <tt>headerType</tt> adds code to the beginning of 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 functions. The functions will have no debug or {{HashLink|#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 Modes|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}}
 
|}
 
|}
  
Line 188: Line 213:
 
}}
 
}}
  
The following attributes only work with '''config.cpp''' (addon) usage:
+
 
{| class="wikitable"
+
== Advanced Knowledge ==
|+ config.cpp only
+
 
! Attribute
+
=== Meta Variables ===
! Description
+
 
|-
+
* '''_fnc_scriptName''': [[String]] - Name of the script
| preStart
+
* '''_fnc_scriptNameParent''': [[String]] - Name of the parent script
| the <tt>preStart</tt> attribute can be set to 1 to call the function upon game start, before title screen, but after all addons are loaded.
+
* '''_fnc_scriptMap''': [[Array]] - List of all parent scripts
|-
+
 
| recompile
+
=== Debug Modes ===
| 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)
+
 
|}
+
Developers can access several debug modes using ''[[BIS_fnc_functionsDebug]]'' function. '''For this to work [[Description.ext#allowFunctionsRecompile|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];
  
  
 
== See Also ==
 
== See Also ==
  
* [[Initialization_Order]]
+
* [[Initialization Order]]
 
* [[Arma 3: Functions Viewer]]
 
* [[Arma 3: Functions Viewer]]
 
* [[: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]]
 
 
 
  
 
{{GameCategory|arma3|Editing}}
 
{{GameCategory|arma3|Editing}}
 
[[Category: Functions Library]]
 
[[Category: Functions Library]]

Latest revision as of 23:41, 1 September 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:

  1. Automatic compilation upon mission start into a global variable - no need to remember direct paths to files.
  2. Anti-hack protection using compileFinal (see Recompiling)
  3. Listing in the Functions Viewer
  4. Advanced debugging options
  5. Optional immediate execution upon mission start, without need for manual call
  6. Potential performance improvements


This page is about Arma 3 Functions Library.


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.


The root directory (noted as <ROOT> on this page) is the origin from which the game will try to load function files. It depends on CfgFunctions' location:


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.cpp only: Anywhere outside of running mission, refer to the functions stored in uiNamespace. e.g: arguments call (uiNamespace getVariable "TAG_fnc_functionName");

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

By convention, the function class should be named in camelCase and not have its first letter capitalised (e.g PascalCase):
  • Ico ok.png TAG_fnc_myFunction
  • Ico none.png TAG_fnc_MyFunction
  • Ico ok.png TAG_fnc_POWRescue
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.
The file entry overrides Category's set path and ignores it entirely (they are not merged).
Ico ok.png Ico ok.png
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.
Ico ok.png Ico ok.png
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.
Ico ok.png Ico ok.png
ext the ext attribute can be used to set function file's type; it can be one of:
  • ".sqf" (default)
  • ".fsm" (see FSM)
Ico ok.png Ico ok.png
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. Ico none.png Ico ok.png
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) Ico none.png Ico ok.png
headerType the headerType adds code to the beginning of functions that can:
  • Set up the 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.

Possible values are:

  • -1: No header - Adds nothing, literally adds a blank String to the beginning of functions. The functions will have no debug or 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
  • 1: System header - Incorporates the 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.

Ico ok.png Ico ok.png
Notes about preInit and postInit defined in config.cpp:
  • these attributes will make the function run on each, every and any mission start
  • Any scripting error will prevent the mission from being loaded correctly
  • Server admins might blacklist the whole addon if they find out the function is used for hacking


Advanced Knowledge

Meta Variables

  • _fnc_scriptName: String - Name of the script
  • _fnc_scriptNameParent: String - Name of the parent script
  • _fnc_scriptMap: Array - List of all parent scripts

Debug Modes

Developers can access several debug modes using BIS_fnc_functionsDebug function. For this to work function recompiling has to be allowed!

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];


See Also