Skip to content

jetelain/AceArsenalExtended

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

ACE3 Arsenal Extended

Find easily your favorite gear within ACE3 Arsenal

Based on an original idea of Krogar from Arma Mod France and UnderSiege Productions

Need help ? Contact me on Discord on channel #arsenal-extended

For users

Install mod from Steam Workshop

ACE Arsenal

Ingame self-actions

For mission creators

3DEN Editor

ACE3 Arsenal Extended is also now available in 3DEN Editor.

An additional property "Texture options (ACE Arsenal Extended)" is available. This property is used by Arsenal to store "texture options" that would be otherwise lost. This property is an array of key-value pairs [["model_option","value"], ...], example : [["USP_G3C_pantscamo","M81"]].

For mod creators

Lost in configuration making ? You may try the Config Helper Application to generate configuration.

Modelisation

  • The root object is "Model".
  • Each "Model", has one or more "Options".
  • Each "Option", has multiple "Values".
  • Each "Model", has one unique "Config" for a combinaison of "Value" per "Option".

Model

All these objets are found in Arma 3 configuration :

  • A "Config" is a class in CfgWeapons/CfgGlasses/CfgVehicle, that have a XtdGearInfo subclass or that have a class with the same name in XtdGearModels >> CfgWeapons/CfgGlasses/CfgVehicle.
  • A "Model", in a class in XtdGearModels >> CfgWeapons/CfgGlasses/CfgVehicle.
  • An "Option" is a class within a "Model", with it's name referenced in options property.
  • A "Value" is a class within a "Option", with it's name referenced in values property.

"Options" and "Values" may have conventional names, referenced in XtdGearModels >> Conventional. This allow to inherit values, without real inheritance to avoid creating a dependency to this mod. See addons/gearinfo/XtdGearModels.hpp for existing names and options.

Sample

class XtdGearModels
{
    class CfgWeapons 
    {
        class my_model
        {
            label = "Model label";
            author = "My name";
            options[] = {"camo","optionA"};
            class camo // coventional name
            {
                values[] = {"MTP", "Tropic"};
                // all values already exists, no need to create subentries
            };
            class optionA
            {
                label = "Option A label";
                values[] = {"value1", "value2"};
                changeingame = 0; // 1 if value can be changed in game via ACE menu
                alwaysSelectable = 1; // allows the selection of the values even if there isn't an item with a complete match of options available, falling back to a weak match with this single value (optional)
                // changedelay = 2; If can changeingame, wait delay before change is effective (can be 0, 0.1, or more)
                // icon = "xxx"; If can changeingame, action group icon in ACE menu
                class value1
                {
                    label = "1";
                    description = "Value 1 for option A"; // displayed as tooltip
                    // image = "xxx"; Background image in Arsenal
                    // icon = "xxx"; If can changeingame, action icon in ACE menu
                    // actionlabel = "xxx"; If can changeingame, action label in ACE menu 
                    // itemingame = "xxx"; If can changeingame, requires this item to be present in inventory. Item will be removed from inventory (added back if an other value is choosen)
                    // changedelay = (inherited by default); If can changeingame, wait delay before change is effective
                    faction[] = {"BLU_F", "BLU_T_F", "BLU_W_F"}; // shows this value only for selected factions, identified by their A3 code (optional)
                };
                class value2
                {
                    label = "2";
                };
            };
        };
    };
};
class CfgWeapons 
{
    class baseClass;
    class my_model_MTP_value1 : baseClass // you can use any name
    {
        class XtdGearInfo
        {
            model = "my_model"; // class name in XtdGearModels >> CfgWeapons
            camo = "MTP";
            optionA = "value1";
        };
        // ...
    };
    // ...
};

Alternative syntax to avoid impacting CfgWeapons/CfgGlasses/CfgVehicle :

class XtdGearModels
{
    // identical to previous sample
};
class XtdGearInfos
{
    class CfgWeapons 
    {
        class my_model_MTP_value1 // exact class name in CfgWeapons (case sensitive !)
        {
            model = "my_model"; // class name in XtdGearModels >> CfgWeapons
            camo = "MTP";
            optionA = "value1";
        };
        // ...
    };
};

Texture Options

On uniforms and backback, you can add special options called "texture options". Those options will not change the "Config", but will allow you to change a texture of an hiddenselection defined in the "Config".

Those options are listed in the textureOptions array in the "Model". Options are defined like all others options with an additional string or number hiddenselection. "Values" have an additional string texture.

Texture options does not yet support changeingame.

class XtdGearModels
{
    class CfgWeapons 
    {
        class my_model
        {
            // ...
            textureOptions = { "bloodtype" };
            class bloodtype
            {
                label = "Blood type";
                values[] = {"A", "B", "AB", "O"};
                hiddenselection = "selectionName";
                class A
                {
                    texture = "path\to\texture.paa";
                    // material = "path\to\material.rvmat"; (if you use material on an option, you MUST set it on all options to avoid undefined behavior)
                };
                // ...
            };
        };
    };
};
class CfgWeapons 
{
    class baseClass;
    class my_model_MTP_value1 : baseClass
    {
        class XtdGearInfo
        {
            model = "my_model";
            // ...
        };
        hiddenselections = { /*..., */ "selectionName" };
        // ...
    };
    // ...
};

A texture option may impact multiple hidden selections. Instead of hiddenselection + texture, specify hiddenselections + textures.

class XtdGearModels
{
    class CfgWeapons 
    {
        class my_model
        {
            // ...
            textureOptions = { "bloodtype" };
            class bloodtype
            {
                label = "Blood type";
                values[] = {"A", "B", "AB", "O"};
                hiddenselections[] = { "selectionName1", "selectionName2" };
                class A
                {
                    textures[] = { "path\to\texture.paa", "" };
                    // materials[] = { "path\to\material.rvmat", "" }; (if you use material on an option, you MUST set it on all options to avoid undefined behavior)
                };
                class B
                {
                    textures[] = { "", "path\to\texture.paa" };
                    // materials[] = { "", "path\to\material.rvmat" }; 
                };
                class AB
                {
                    textures[] = { "path\to\texture.paa", "path\to\texture.paa" };
                    // materials[] = { "path\to\material.rvmat", "path\to\material.rvmat" }; 
                };
                // ...
            };
        };
    };
};

A texture option can be mapped to a text to texture, it allows player to choose a custom text for texture. It can be usefull for name or call sign. Specify a texttexture with procedural texture value with a %1 for user-input.

class XtdGearModels
{
    class CfgWeapons 
    {
        class my_model
        {
            // ...
            textureOptions = { "name" };
            class name
            {
                label = "Name";
                hiddenselection = "selectionName";
                texttexture = "#(rgb,512,512,3)text(1,1,""PuristaBold"",0.8,""#00000000"",""#101010"",""%1"")";
                // textmaterial = "path\to\material.rvmat";
            };
        };
    };
};

The bluit-in approach

You can builtin configuration for ACE3 Arsenal Extended within your mod, without creating a dependency. You may duplicate all what you need, or use conventional names.

The compat mod approach

You can also build a compat addon that overrides entries in CfgWeapons/CfgGlasses/CfgVehicle to add required informations.

The all-in-one ACEAX mod approach

You can also add data to the ACEAX mod in XtdGearInfos to extends a mod without creating a direct dependency on it (Pull-Request are welcome !).

Scripting events

In-Game option change

Local event aceax_ingame_optionChanged will be raised after a player changed his equiment with the ACE self-interaction menu.

["aceax_ingame_optionChanged", {
     _this params ["_player", "_optionInfos"];
     _optionInfos params ["_model", "_option", "_value"];
     // ...
}] call CBA_fnc_addEventHandler;

How to build ?

Download the incredible HEMTT tool by BrettMayson.

Place hemtt.exe at the project root, and launch .\hemtt.exe build

For a quick start, run .\hemtt.exe launch arsenal. Arma will start directly in the ACE Arsenal. See .hemtt\launch.toml for additional targets.

License

Arsenal integration is under GNU GPL v2 License. Other parts are under the MIT License.

It includes sources files from CBA_A3 (script_macros_common.hpp) and ACE3 (defines.hpp).