Arma 3 Scripting

Command in Config

loadConfig

Also available as Markdown and JSON, or read the original wiki page.

Description

Loads the given file as a Config, allowing easy processing of the config file contents using commands such as configClasses, configProperties, >>, etc. It can load .rvmat, .bisurf, .cpp, .bin, .sqm, and description.ext files (both binarized and unbinarized configs are supported).

Important

  • Config loading can be very slow; the config should only be loaded once and cached, e.g in a HashMap of File Path → Config pairs (see #Example 3).
  • It is advised to store the generated config in a variable, otherwise it will get destroyed if it is not being referenced directly (see #Example 2).

Syntax

loadConfig path

Parameters:

Returns: Config - loaded config. Returns configNull if the file doesn't exist.

Examples

Example 1

private _cfg = loadConfig "a3\data_f\default_super.rvmat"; // note: very slow! ~0.1200 ms on tested system
getText (_cfg >> "Stage2" >> "uvSource");

Example 2

// INCORRECT - the config is destroyed after the first operator >> accesses it
getNumber (loadConfig "mission.sqm" >> "ScenarioData" >> "respawnDelay");

// CORRECT - the config is destroyed only when the variable _cfg is destroyed
_cfg = loadConfig "mission.sqm";
getNumber (_cfg >> "ScenarioData" >> "respawnDelay");

Example 3

// using a hashmap to cache loaded configs, since loading configs is very slow and should be done once.
private _fnc_loadConfig = {
    params ["_path"];
    // initialize cache if not initialized yet
    if (isNil "TAG_configCache") then
    {
        TAG_configCache = createHashMap;
    };
    private _cfg = TAG_configCache getOrDefault [_path, configNull];
    // if path doesn't exist in the cache or cfg is null, load the config
    if (isNull _cfg) then
    {
        _cfg = loadConfig _path;
        TAG_configCache set [_path, _cfg];
    };
    _cfg;
};
// the first call will be slow (~0.1200 ms), but subsequent calls are fast (~0.0050 ms)
["a3\data_f\default_super.rvmat"] call _fnc_loadConfig;

Example 4

// converting a config into hashmap
private _fnc_convertClass = {
    params ["_cfgClass"];

    private _result = createHashMap;
    private _props = configProperties [_cfgClass, "true", true];
    // note: Hashmaps are case-sensitive so configName cases have to be consistent (e.g. all lowercase)
    {
        if (isNumber _x)    then { _result set [toLowerANSI configName _x, getNumber _x];    continue; };
        if (isText _x)        then { _result set [toLowerANSI configName _x, getText _x];        continue; };
        if (isArray _x)        then { _result set [toLowerANSI configName _x, getArray _x];    continue; };
    } forEach _props;

    private _classes = "true" configClasses _cfgClass;
    {
        _result set [toLowerANSI configName _x, _x call _fnc_convertClass];
    } forEach _classes;

    _result;
};

private _cfg = loadConfig "mission.sqm";
private _cfgMap = _cfg call _fnc_convertClass;

// the following expression is similar to getNumber(_cfg >> "EditorData" >> "moveGridStep")
// note that all strings are lowercase (which is how they were stored in hashmap)
_cfgMap get "editordata" get "movegridstep";

See also

loadFile · config greater greater name · configFile · configClasses · isText · isNumber · isArray · isClass · configName · getText · getNumber · getArray

Community notes

Dedmen

When trying to load a terrain surface name, like you get from Ammo Eventhandlers when you hit the terrain, you can simply use

private _config = configFile >> "CfgSurfaces" >> _surfaceName;

You can recognize surface names by them not having any \ path separators in them, they usually start with gdt, for example "gdtvrsurface01".