Compare commits

..

6 Commits

Author SHA1 Message Date
baf2f5ecf8 Update defines/ApprovedAssets.hpp
Updated Approved assets.
2024-06-14 21:10:30 -05:00
4e5782f074 Added Black Hornet Restricted Item 2024-06-12 09:15:38 -05:00
4e7b0bb5f7 Removed SMA Resupply Items
Removed the following Items from resupply
{"SMA_30Rnd_762x35_BLK_EPR",25}, 
{"SMA_20Rnd_762x51mm_M80A1_EPR",25},
{"SMA_20Rnd_762x51mm_M80A1_EPR_Tracer",25},
{"SMA_20Rnd_762x51mm_Mk316_Mod_0_Special_Long_Range",25},
{"SMA_20Rnd_762x51mm_Mk316_Mod_0_Special_Long_Range_Tracer",25},
2024-06-12 00:12:03 -05:00
db35c84e8e Asset Change
Removed Athena and Homer, Changed Armed VTOL callsign
2024-06-11 19:30:22 -05:00
fa18e85c7c Update defines/BattalionInfo.hpp
Updated ECO Callsign
2024-06-10 00:19:27 -05:00
080e6f02b8 Update defines/BattalionInfo.hpp
Updated ACO and BCO Callsign
2024-06-10 00:18:40 -05:00
42 changed files with 99 additions and 481 deletions

2
.gitignore vendored
View File

@@ -2,5 +2,3 @@
# Notepad++ backups #
*.bak
.vscode/

View File

@@ -4,34 +4,6 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project badly attempts [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [4.2.1] - 2024-06-23
### Changed
- Allowed Equipment Definition typo
## [4.2.0] - 2024-06-20
### Added
- Custom remainsCollector script to replace and supplement the built in arma remainsCollector function
- New Resupply Boxes
- Ability to spawn spare tires and tracks at the arsenal and via Zeus module
### Changed
- Split vehicle flags into colors and shapes for additional options
- Battalion Callsigns
- Allowed Equipment Definitions
- Resupply Box Contents
- Fixed incorrect ace carry variable setting
### Removed
- SMA mod references
- Extraneous server performance calculation broadcast to all clients
- Ability for pilots to check re-insertion queue
## [4.1.2] - 2024-04-25
### Changed

View File

@@ -1,8 +0,0 @@
// EXAMPLE
// class uncon_alarm
// {
// name = "uncon_alarm";
// sound[] = {"AJ_CBRN_V2\sounds\AJ_warning_1.ogg", 0.9, 1, 5}; //directory, volume, pitch, range
// titles[]={};
// };

View File

@@ -141,7 +141,7 @@ class DisallowedEquipment {
"Tier1_ATACR18_Geissele_Docter_Black", //Nightforce Series Optic
"Tier1_ATACR18_Geissele_Docter_Desert_Vanilla", //Nightforce Series Optic
"Tier1_ATACR18_Geissele_Docter_Desert", //Nightforce Series Optic
"sps_black_hornet_01_Static_F" // Black Hornet Drone Mod
"sps_black_hornet_01_F" // Black Hornet Drone Mod
};
};

View File

@@ -20,8 +20,7 @@ class SupplyCrates {
{"ACE_40mm_Flare_ir",12},
{"rhsusf_200Rnd_556x45_mixed_soft_pouch_coyote",25},
{"rhsusf_20Rnd_762x51_m993_Mag",25},
{"SmokeShell",24},
{"ACE_M84",24},
{"SmokeShell",12},
{"rhs_mag_m67",24},
{"1Rnd_Smoke_Grenade_shell",24},
{"1Rnd_SmokeRed_Grenade_shell",24},
@@ -34,8 +33,7 @@ class SupplyCrates {
{"ACE_20Rnd_762x51_M993_AP_Mag",25},
{"rhsusf_20Rnd_762x51_SR25_m993_Mag",25},
{"Tier1_20Rnd_762x51_M993_SR25_Mag",25},
{"KAR_20Rnd_Fury_blk",25},
{"rhsusf_m112_mag",25},
{"DemoCharge_Remote_Mag",16}
};
items[] = {};
};
@@ -79,7 +77,6 @@ class SupplyCrates {
{"ACE_splint",48},
{"ACE_morphine",50},
{"ACE_epinephrine",50},
{"ACE_painkillers",20},
{"ACE_bloodIV",75},
{"ACE_bloodIV_500",50},
{"ACE_bloodIV_250",25},
@@ -130,42 +127,6 @@ class SupplyCrates {
items[] = {};
};
class SquadUtility {
boxClass = "Box_Syndicate_Ammo_F";
displayName = "Squad Utility Supply Crate";
tooltip = "A crate containing Flairs, Smokes, Breaching Charges";
icon = "\A3\ui_f\data\map\vehicleicons\iconCrateAmmo_ca.paa";
backpacks[] = {};
weapons[] = {};
magazines[] = {};
items[] = {
{"ACE_Chemlight_HiYellow",20},
{"ACE_Chemlight_HiBlue",20},
{"ACE_Chemlight_HiGreen",20},
{"ACE_Chemlight_HiRed",20},
{"ACE_Chemlight_UltraHiOrange",20},
{"ACE_HandFlare_Yellow",20},
{"ACE_HandFlare_White",20},
{"ACE_HandFlare_Red",20},
{"ACE_HandFlare_Green",20},
{"ACE_Chemlight_IR",20},
{"ACE_IR_Strobe_Item",20},
{"SmokeShellYellow",20},
{"SmokeShellBlue",20},
{"SmokeShellPurple",20},
{"SmokeShellOrange",20},
{"SmokeShellGreen",20},
{"SmokeShellRed",20},
{"tsp_popperCharge_auto_mag",10},
{"tsp_frameCharge_mag",20},
{"tsp_stickCharge_auto_mag",10},
{"ACE_CableTie",25},
{"DemoCharge_Remote_Mag",15},
{"TFAR_anprc152",3},
};
};
class MortarMk6Resupply {
boxClass = "Box_NATO_WpsSpecial_F";
displayName = "Mortar MK6 Supply Crate";
@@ -210,28 +171,4 @@ class SupplyCrates {
};
items[] = {};
};
class ResupplyTire {
boxClass = "ACE_Wheel";
displayName = "Vehicle Tire";
tooltip = "A single tire for replacement";
icon = "A3\ui_f\data\igui\cfg\simpletasks\types\repair_ca.paa";
backpacks[] = {};
weapons[] = {};
magazines[] = {};
items[] = {};
};
class ResupplyTrack {
boxClass = "ACE_Track";
displayName = "Vehicle Track";
tooltip = "A single track for replacement";
icon = "z\ace\addons\repair\ui\patch_ca.paa";
backpacks[] = {};
weapons[] = {};
magazines[] = {};
items[] = {};
};
};

View File

@@ -84,160 +84,31 @@ class VehicleFlags {
actionID = "flag_simpleshape";
actionTitle = "Simple Shapes";
class Blue {
actionID = "flags_simpleshape_blue";
actionTitle = "Blue";
class BlueCircle {
actionID = "flag_simpleshape_bluecircle";
actionTitle = "Blue Circle";
texture = "textures\simple_shape\flag_simpleshape_bluecircle_co.paa";
};
class BlueOctagon {
actionID = "flag_simpleshape_blueoctagon";
actionTitle = "Blue Octagon";
texture = "textures\simple_shape\flag_simpleshape_blueoctagon_co.paa";
};
class BluePentagon {
actionID = "flag_simpleshape_bluepentagon";
actionTitle = "Blue Pentagon";
texture = "textures\simple_shape\flag_simpleshape_bluepentagon_co.paa";
};
class BlueSquare {
actionID = "flag_simpleshape_bluesquare";
actionTitle = "Blue Square";
texture = "textures\simple_shape\flag_simpleshape_bluesquare_co.paa";
};
class BlueTriangle {
actionID = "flag_simpleshape_bluetriangle";
actionTitle = "Blue Triangle";
texture = "textures\simple_shape\flag_simpleshape_bluetriangle_co.paa";
};
};
class Green {
actionID = "flags_simpleshape_green";
actionTitle = "Green";
class GreenCircle {
actionID = "flag_simpleshape_greencircle";
actionTitle = "Green Circle";
texture = "textures\simple_shape\flag_simpleshape_greencircle_co.paa";
};
class GreenOctagon {
actionID = "flag_simpleshape_greenoctagon";
actionTitle = "Green Octagon";
texture = "textures\simple_shape\flag_simpleshape_greenoctagon_co.paa";
};
class GreenPentagon {
actionID = "flag_simpleshape_greenpentagon";
actionTitle = "Green Pentagon";
texture = "textures\simple_shape\flag_simpleshape_greenpentagon_co.paa";
};
class GreenSquare {
actionID = "flag_simpleshape_greensquare";
actionTitle = "Green Square";
texture = "textures\simple_shape\flag_simpleshape_greensquare_co.paa";
};
class GreenTriangle {
actionID = "flag_simpleshape_greentriangle";
actionTitle = "Green Triangle";
texture = "textures\simple_shape\flag_simpleshape_greentriangle_co.paa";
};
};
class Orange {
actionID = "flags_simpleshape_orange";
actionTitle = "Orange";
class OrangeCircle {
actionID = "flag_simpleshape_orangecircle";
actionTitle = "Orange Circle";
texture = "textures\simple_shape\flag_simpleshape_orangecircle_co.paa";
};
class OrangeOctagon {
actionID = "flag_simpleshape_orangeoctagon";
actionTitle = "Orange Octagon";
texture = "textures\simple_shape\flag_simpleshape_orangeoctagon_co.paa";
};
class OrangePentagon {
actionID = "flag_simpleshape_orangepentagon";
actionTitle = "Orange Pentagon";
texture = "textures\simple_shape\flag_simpleshape_orangepentagon_co.paa";
class BlueCircle {
actionID = "flag_simpleshape_bluecircle";
actionTitle = "Blue Circle";
texture = "textures\simple_shape\flag_simpleshape_bluecircle_co.paa";
};
class OrangeSquare {
actionID = "flag_simpleshape_orangesquare";
actionTitle = "Orange Square";
texture = "textures\simple_shape\flag_simpleshape_orangesquare_co.paa";
};
class OrangeTriangle {
actionID = "flag_simpleshape_orangetriangle";
actionTitle = "Orange Triangle";
texture = "textures\simple_shape\flag_simpleshape_orangetriangle_co.paa";
};
};
class Pink {
actionID = "flags_simpleshape_pink";
actionTitle = "Pink";
class PinkCircle {
actionID = "flag_simpleshape_pinkcircle";
actionTitle = "Pink Circle";
texture = "textures\simple_shape\flag_simpleshape_pinkcircle_co.paa";
};
class PinkOctagon {
actionID = "flag_simpleshape_pinkoctagon";
actionTitle = "Pink Octagon";
texture = "textures\simple_shape\flag_simpleshape_pinkoctagon_co.paa";
};
class PinkPentagon {
actionID = "flag_simpleshape_pinkpentagon";
actionTitle = "Pink Pentagon";
texture = "textures\simple_shape\flag_simpleshape_pinkpentagon_co.paa";
};
class PinkSquare {
actionID = "flag_simpleshape_pinksquare";
actionTitle = "Pink Square";
texture = "textures\simple_shape\flag_simpleshape_pinksquare_co.paa";
};
class PinkTriangle {
actionID = "flag_simpleshape_pinktriangle";
actionTitle = "Pink Triangle";
texture = "textures\simple_shape\flag_simpleshape_pinktriangle_co.paa";
};
};
class Red {
actionID = "flags_simpleshape_red";
actionTitle = "Red";
class RedCircle {
actionID = "flag_simpleshape_redcircle";
actionTitle = "Red Circle";
texture = "textures\simple_shape\flag_simpleshape_redcircle_co.paa";
};
class RedOctagon {
actionID = "flag_simpleshape_redoctagon";
actionTitle = "Red Octagon";
texture = "textures\simple_shape\flag_simpleshape_redoctagon_co.paa";
};
class RedPentagon {
actionID = "flag_simpleshape_redpentagon";
actionTitle = "Red Pentagon";
texture = "textures\simple_shape\flag_simpleshape_redpentagon_co.paa";
};
class RedSquare {
actionID = "flag_simpleshape_redsquare";
actionTitle = "Red Square";
texture = "textures\simple_shape\flag_simpleshape_redsquare_co.paa";
};
class RedTriangle {
actionID = "flag_simpleshape_redtriangle";
actionTitle = "Red Triangle";
texture = "textures\simple_shape\flag_simpleshape_redtriangle_co.paa";
};
};
};
class Miscellaneous {

View File

@@ -96,10 +96,6 @@ class CfgFunctions {
#include "custom_scripts.hpp"
};
class CfgSounds {
#include "custom_sounds.hpp"
};
class CfgLeaflets {
#include "custom_leaflets.hpp"
};

View File

@@ -120,7 +120,6 @@ class DOUBLES(PREFIX,performance) {
class addServerStatsPFH {};
class calculateServerStats {};
class addEmptyGroupCleanupPFH {};
class addDeadUnitCleanupPFH {};
};
};
@@ -175,8 +174,6 @@ class DOUBLES(PREFIX,vehicleFlags) {
class addFlagActions {};
class draw3D {};
class getActionsFlagCategories {};
class compileFlagAction {};
class compileFlagCategoryAction {};
class getVehicleFlagsCfg {};
class isClassExcluded {};
};

View File

@@ -21,37 +21,6 @@ _curators = allMissionObjects "ModuleCurator_F";
_x removeCuratorAddons ["A3_Modules_F_Curator_Lightning"];
} foreach _curators;
// add dead unit time marking for custom garbage cleanup function
addMissionEventHandler ["EntityKilled", {
params ["_unit", "_killer", "_instigator", "_useEffects"];
if not (_unit isKindOf "CAManBase") exitWith {};
_unit setVariable["milsim_death_time", time];
_unit addEventHandler ["Deleted", {
params ["_entity"];
_remainsCollector = _entity getVariable["milsim_garbage_collected", false];
_decayTime = time - (_entity getVariable ["milsim_death_time", time]);
_i = allUsers select { (getUserInfo _x)#1 isEqualTo _ownerId;};
_owner = if ( _i isEqualTo []) then [ { "server" }, { (getUserInfo (_i#0))#3 }];
diag_log format["isServer: %5, deleted object owned by: %1 via remainsCollector: %2 after %3 seconds of type: %4", _owner, str (not _remainsCollector), _decayTime, _entity, isServer];
}];
}];
// add zeus deletion logging to curator objects
{
_x addEventHandler ["CuratorObjectDeleted", {
params ["_curator", "_entity"];
_decayTime = time - (_entity getVariable ["milsim_death_time", time]);
diag_log format["deleted object: %1 via curator: %2 after %3 seconds", _entity, name _curator, _decayTime];
}];
} foreach _curators;
// declare init complete to other modules
missionNamespace setVariable [QGVARMAIN(complete), true, true];

View File

@@ -1,9 +1,5 @@
#include "..\script_component.hpp"
//---------------------
// Garbage Collection
//---------------------
[
QGVAR(emptyGroupCleanup_enable),
"CHECKBOX",
@@ -26,28 +22,6 @@
}
] call CBA_fnc_addSetting;
[
QGVAR(deadUnitCleanup_enable),
"CHECKBOX",
"Dead Unit Cleanup Enabled",
[QUOTE(SETTINGS_GROUP_NAME), QUOTE(COMPONENT_BEAUTIFIED)],
true,
true,
{
params ["_value"];
[
QGVAR(deadUnitCleanup_enable),
_value
] call EFUNC(common,logSettingChanged);
if (!isNull (missionNamespace getVariable [QGVAR(deadUnitCleanupPFH), locationNull])) then {
deleteLocation GVAR(deadUnitCleanupPFH);
};
call FUNC(addDeadUnitCleanupPFH);
}
] call CBA_fnc_addSetting;
//---------------------
// Server CPS
//---------------------

View File

@@ -1,55 +0,0 @@
#include "..\script_component.hpp"
[
LEVEL_INFO,
QUOTE(COMPONENT),
"Initializing dead unit deletion PFH",
[]
] call EFUNC(common,log);
GVAR(deadUnitCleanupPFH) = [
{
_maxTime = getMissionConfigValue ["corpseRemovalMaxTime", 300] * 1.5;
_maxDead = getMissionConfigValue ["corpseLimit", 80];
// _dead = allDead select { (_x isKindOf "CAManBase") and ( ( (time - (_x getVariable ["milsim_death_time", time] ) ) > (_maxTime * 1.5) ) ) };
// _dead = _dead apply { [ (time - (_x getVariable ["milsim_death_time", time] ) ), _x ] };
_dead = [];
{
if not (_x isKindOf "CAManBase") then { continue };
if not (isInRemainsCollector _x) then { continue };
_dead pushBack [time - (_x getVariable ["milsim_death_time", time] ), _x];
} forEach allDead;
_dead sort false;
_toDelete = 0 max ( (count _dead ) - _maxDead );
_dead = _dead select [0, _toDelete];
{
_unit = _x#1;
_unit setVariable ["milsim_garbage_collected", true];
deleteVehicle (_unit);
} foreach _dead;
},
450,
[],
{ // on creation
[
LEVEL_INFO,
QUOTE(COMPONENT),
"dead unit deletion PFH loaded",
[]
] call EFUNC(common,log);
},
{ // on deletion
[
LEVEL_INFO,
QUOTE(COMPONENT),
"dead unit deletion PFH unloaded",
[]
] call EFUNC(common,log);
},
{ (missionNamespace getVariable [QGVAR(deadUnitCleanup_enable), false]) },
{ false },
[]
] call CBA_fnc_createPerFrameHandlerObject;

View File

@@ -14,7 +14,7 @@ localNamespace setVariable [QGVAR(checkReinsertQueueClassesAdded), []];
localNamespace setVariable [QGVAR(lastReinsertQueueCheck), diag_tickTime];
// add actions to pilot classes, and don't apply to child classes
// [["B_Helipilot_F", "B_helicrew_F"], false] call FUNC(addCheckQueueSelfAction);
[["B_Helipilot_F", "B_helicrew_F"], false] call FUNC(addCheckQueueSelfAction);
/////////////////////////////////////////////////////

View File

@@ -162,7 +162,7 @@ if (isNil "_items") exitWith {
[_box,1] call ace_cargo_fnc_setSize;
// ignore weight restrictions for carry/drag
_box setVariable ["ace_dragging_ignoreWeightCarry", true, true];
_box setVariable ["ace_ignoreWeightCarry", true, true];
// Return the box
_box;

View File

@@ -1,4 +1,4 @@
#define MAJOR 4
#define MINOR 2
#define PATCHLVL 1
#define MINOR 1
#define PATCHLVL 2
#define BUILD 0

View File

@@ -1,40 +0,0 @@
#include "..\script_component.hpp"
params ["_target", "_player", "_params", "_flagOptionCfg"];
_params params ["_rootActionID", "_flagCategoryActionID", "_flagSubclassesCfgs"];
private _flagOptionID = getText(_flagOptionCfg >> "actionID");
private _flagOptionTitle = getText(_flagOptionCfg >> "actionTitle");
private _flagOptionTexture = getText(_flagOptionCfg >> "texture");
// if the texture doesn't exist at the config path, skip this flag option
if (not (fileExists _flagOptionTexture)) then {
diag_log format ["WARN: Flag option texture not found: %1", _flagOptionTexture];
continue
};
// diag_log format ["NewFlagOption: %1 %2", _flagOptionID, _flagOptionData];
private _newFlagOption = [
_rootActionID + "_" + _flagCategoryActionID + "_" + _flagOptionID, // id
_flagOptionTitle, // displayed title
_flagOptionTexture, // flag icon
{
params ["_target", "_player", "_params"];
_params params ["_flagOptionTexture"];
_target forceFlagTexture _flagOptionTexture;
}, // statement
{
params ["_target", "_player", "_params"];
alive _target;
// true;
}, // condition
nil, // child code
[_flagOptionTexture], // params
nil, // position
4, // distance
[false, false, false, false, false] // other params
] call ace_interact_menu_fnc_createAction;
_newFlagOption;

View File

@@ -1,54 +0,0 @@
#include "..\script_component.hpp"
// diag_log format ["NewFlagCategory: %1 %2", _flagCategory, _flagOptions];
params ["_rootActionID", "_flagCategoryCfg"];
private _flagCategoryActionID = getText(_flagCategoryCfg >> "actionID");
private _flagCategoryTitle = getText(_flagCategoryCfg >> "actionTitle");
private _flagSubclassesCfgs = _flagCategoryCfg call BIS_fnc_returnChildren;
private _flagCategoryAction = [
_rootActionID + "_" + _flagCategoryActionID, // id
_flagCategoryTitle, // displayed title
getText((_flagSubclassesCfgs#0) >> "texture"), // flag icon for category - use first flag option
{true}, // statement
{
params ["_target", "_player", "_params"];
alive _target;
// true;
}, // condition
{
// generate child code under category
// this is the level where actual flag options will be displayed
params ["_target", "_player", "_params"];
// these params are passed from the parent action
_params params ["_rootActionID", "_flagCategoryActionID", "_flagSubclassesCfgs"];
private _individualFlagActions = [];
{ // forEach _flagSubclassesCfgs; // we'll generate flag options for each category
private _flagOptionCfg = _x;
// generate flag option for this flag option
private _newFlagOption = [
_target,
_player,
_params,
_flagOptionCfg
] call FUNC(compileFlagAction);
// add flag option to category subactions
_individualFlagActions pushBack [_newFlagOption, [], _target];
} forEach _flagSubclassesCfgs;
// return the generated flag options to the category as child actions
_individualFlagActions;
}, // child code
[_rootActionID, _flagCategoryActionID, _flagSubclassesCfgs], // params
nil, // position
4, // distance
[false, false, false, false, false], // other params
nil // modifier function code
] call ace_interact_menu_fnc_createAction;
_flagCategoryAction;

View File

@@ -5,25 +5,86 @@
0: STRING - Parent action ID
1: ARRAY - Flag category configs
*/
#include "..\script_component.hpp"
params ["_rootActionID", "_flagCategoryCfgs"];
private _allCategoryActions = [];
{
_flagCategoryActions = [];
if (configName _x == "SimpleShapes") then {
// diag_log format ["NewFlagCategory: %1 %2", _flagCategory, _flagOptions];
private _flagCategoryCfg = _x;
private _flagCategoryActionID = getText(_flagCategoryCfg >> "actionID");
private _flagCategoryTitle = getText(_flagCategoryCfg >> "actionTitle");
private _flagSubclassesCfgs = _flagCategoryCfg call BIS_fnc_returnChildren;
private _flagCategoryAction = [
_rootActionID + "_" + _flagCategoryActionID, // id
_flagCategoryTitle, // displayed title
getText((_flagSubclassesCfgs#0) >> "texture"), // flag icon for category - use first flag option
{true}, // statement
{
_flagCategoryActions pushBack ([_rootActionID, _x] call FUNC(compileFlagCategoryAction));
} forEach (_x call BIS_fnc_returnChildren);
} else {
_flagCategoryActions pushBack ([_rootActionID, _x] call FUNC(compileFlagCategoryAction));
};
params ["_target", "_player", "_params"];
alive _target;
// true;
}, // condition
{
// generate child code under category
// this is the level where actual flag options will be displayed
params ["_target", "_player", "_params"];
_params params ["_rootActionID", "_flagCategoryActionID", "_flagSubclassesCfgs"];
private _individualFlagActions = [];
{ // forEach _flagSubclassesCfgs;
private _flagOptionCfg = _x;
private _flagOptionID = getText(_flagOptionCfg >> "actionID");
private _flagOptionTitle = getText(_flagOptionCfg >> "actionTitle");
private _flagOptionTexture = getText(_flagOptionCfg >> "texture");
// if the texture doesn't exist at the config path, skip this flag option
if (not (fileExists _flagOptionTexture)) then {continue};
// diag_log format ["NewFlagOption: %1 %2", _flagOptionID, _flagOptionData];
private _newFlagOption = [
_rootActionID + "_" + _flagCategoryActionID + "_" + _flagOptionID, // id
_flagOptionTitle, // displayed title
_flagOptionTexture, // flag icon
{
params ["_target", "_player", "_params"];
_params params ["_flagOptionTexture"];
_target forceFlagTexture _flagOptionTexture;
}, // statement
{
params ["_target", "_player", "_params"];
alive _target;
// true;
}, // condition
nil, // child code
[_flagOptionTexture], // params
nil, // position
4, // distance
[false, false, false, false, false] // other params
] call ace_interact_menu_fnc_createAction;
// add flag option to category subactions
_individualFlagActions pushBack [_newFlagOption, [], _target];
} forEach _flagSubclassesCfgs;
// return the generated flag options to the category as child actions
_individualFlagActions;
}, // child code
[_rootActionID, _flagCategoryActionID, _flagSubclassesCfgs], // params
nil, // position
4, // distance
[false, false, false, false, false], // other params
nil // modifier function code
] call ace_interact_menu_fnc_createAction;
// add category to all category actions array
{
_allCategoryActions pushBack [_x, [], _target];
} forEach _flagCategoryActions;
_allCategoryActions pushBack [_flagCategoryAction, [], _target];
} forEach _flagCategoryCfgs;
_allCategoryActions;