Merge pull request 'develop' (#24) from develop into main

Reviewed-on: https://17th-gs.iceberg-gaming.com:5443/hizumi/MissionTemplate/pulls/24
This commit was merged in pull request #24.
This commit is contained in:
2024-02-08 19:05:40 -06:00
35 changed files with 755 additions and 339 deletions

View File

@@ -79,3 +79,48 @@ All modules are broken apart as such in /framework. Client and server inits are
Pay attention to framework/script_mod.hpp prior to deployment of releases, as the debug settings within will determine what is logged during prod missions.
CfgFunctions is sensitive to the folder/script_component.hpp of each module.
### `defines` Directory
This directory contains a number of hpp files used to define constants throughout the framework. These should ONLY be edited by or with the supervision of a developer to reflect format battalion-wide changes.
- `ApprovedAssets.hpp`: Contains subclasses for approved aerial assets with their assigned callsigns. Used primarily in `fbcb2_assets`.
- `BattalionInfo.hpp`: Used for representing Battalion structure, element callsigns, and radio frequency assignments. Used primarily in `fbcb2_main`.
- `DisallowedEquipment.hpp`: Contains flagged item classnames by category that players may not use, or may use only in specific roles. Used to monitor and enforce equipment restrictions.
- `SignalColors.hpp`: Contains smoke/flare/chemlight colors and what they represent in the field. Used primarily in `fbcb2_main` for the Signal Colors diary record.
- `SupplyCrates.hpp`: Contains the types, contents, and metadata for all supply crate types in the `resupply` module.
- `VehicleFlags.hpp`: Defines system information, flag categories, and flag options used to populate ACE3 interaction menus for vehicles. Used by the `vehicleFlags` module.
### Modules List
*Within `framework`:*
- `ambience`:
- Adds ambient flak capabilities.
- `client`:
- Contains core client-side event handlers and actions that don't fit into other modules.
- `common`:
- Contains common functions and variables used by multiple modules.
- `fbcb2_main`:
- Contains the main FBCB2 functionality and initialization code. Populates the briefing/diary with mission information.
- `fbcb2_assets`:
- A subcomponent of `fbcb2_main`. Used to gather, display, and manage diary records as intel for assets near known bases.
- `init`:
- Contains core initialization functions. Both server and client inits across all modules are managed here.
- `mapcopy`:
- Gives players the ability to copy each other's maps.
- `performance`:
- Contains functionality for monitoring and logging performance data.
- `reinsert`:
- Provides a reinsertion queue system for players and pilots to maximize efficiency of the reinsertion process.
- `resupply`:
- Provides a Zeus module and standalone function to spawn pre-equipped supply crates onto the battlefield.
- Supply crate definitions are stored in `defines/SupplyCrates.hpp`.
- Optionally, allows players to spawn supply crates from arsenal boxes.
- `triageIcons`:
- For those with medical permissions (`ace_medical`), provides a configurable 3D icon over unconscious units indicating their current ACE Triage Card status.
- `vehicleFlags`:
- Provides an ACE3 interaction menu that allows players to attach and remove flags from vehicles.
- Flags are defined in `defines/VehicleFlags.hpp`.

View File

@@ -125,5 +125,40 @@ class VehicleFlags {
texture = "textures\flags_misc\flag_redcross_co.paa";
};
};
class BuiltIn {
actionID = "flag_builtin";
actionTitle = "Built-In";
class BlueFlag {
actionID = "flag_builtin_blue";
actionTitle = "Blue Flag";
texture = "\A3\Data_F\Flags\flag_blue_CO.paa";
};
class GreenFlag {
actionID = "flag_builtin_green";
actionTitle = "Green Flag";
texture = "\A3\Data_F\Flags\flag_green_CO.paa";
};
class RedFlag {
actionID = "flag_builtin_red";
actionTitle = "Red Flag";
texture = "\A3\Data_F\Flags\flag_red_CO.paa";
};
class WhiteFlag {
actionID = "flag_builtin_white";
actionTitle = "White Flag";
texture = "\A3\Data_F\Flags\flag_white_CO.paa";
};
class NATOFlag {
actionID = "flag_builtin_nato";
actionTitle = "NATO Flag";
texture = "\A3\Data_F\Flags\flag_NATO_CO.paa";
};
class UNFlag {
actionID = "flag_builtin_un";
actionTitle = "UN Flag";
texture = "\A3\Data_F\Flags\Flag_uno_CO.paa";
};
};
};
};

View File

@@ -13,42 +13,31 @@ class CfgFunctions {
};
};
class PREFIX {
class ambience {
file = "framework\ambience";
class flakInitVehicle {};
class flakEH {};
};
class map {
file = "framework\map";
class initMapCopy { postInit = 1; };
class copyMapFromPlayer {}; //needs refactor
class getPlayerMapMarkers {}; //needs refactor
class loadMapMarkers {}; //needs refactor
class mapMarkerToString {}; //needs refactor
class stringToMapMarker {}; //needs refactor
};
};
class DOUBLES(PREFIX,client) {
class functions {
file = "framework\client\functions";
class addZenModules { postInit = 1; };
class bindEmptyGroupGarbageCleanup { postInit = 1; };
class bindEventHandlers { postInit = 1; };
class bindVehicleActions { postInit = 1; };
class addZenModules {postInit = 1;};
};
};
class DOUBLES(PREFIX,common) {
class functions {
file = "framework\common\functions";
class addCBASettings { preInit = 1; };
class logMissionInfo {};
class addPlayerInfoToArray {};
class createOrUpdateDiaryRecord {};
class getApprovedAssetsCfg {};
class getBattalionCfg {};
class getNameOfBase {};
@@ -95,12 +84,23 @@ class CfgFunctions {
};
class util {
file = "framework\fbcb2_main\util";
class createOrUpdateDiaryRecord {};
class formatRadioElementForDiary {};
class generateElementFrequencyRecordText {};
};
};
class DOUBLES(PREFIX,mapcopy) {
class functions {
file = "framework\mapcopy\functions";
class addCBASettings {preInit=1;};
class initClient {};
class getMapMarkers {};
class loadMapMarkers {};
class mapMarkerToString {};
class stringToMapMarker {};
};
};
class DOUBLES(PREFIX,performance) {
class functions {
file = "framework\performance\functions";
@@ -169,4 +169,12 @@ class CfgFunctions {
class isClassExcluded {};
};
};
class DOUBLES(PREFIX,zeus) {
class functions {
file = "framework\zeus\functions";
class initClient {};
class addZenModules {};
};
};
};

View File

@@ -2,61 +2,6 @@
if ( !hasInterface ) exitWith {};
[
QUOTE(MODULE_CATEGORY_NAME),
"Create Resupply Box",
{
params [["_pos", [0,0,0], [[]], 3], ["_target", objNull, [objNull]]];
// get parent definition
private _supplyCratesCfg = call EFUNC(resupply,getSupplyCratesCfg);
// get the subclass names
private _boxTypesAvailable = _supplyCratesCfg call BIS_fnc_getCfgSubClasses;
_boxTypesAvailable sort true;
_comboOptions = _boxTypesAvailable apply {
[
// display name
[_supplyCratesCfg >> _x >> "displayName", "STRING", "ERROR"] call CBA_fnc_getConfigEntry,
// tooltip
[_supplyCratesCfg >> _x >> "tooltip", "STRING", "ERROR"] call CBA_fnc_getConfigEntry,
// icon
[_supplyCratesCfg >> _x >> "icon", "STRING", "ERROR"] call CBA_fnc_getConfigEntry
]
};
[
"Resupply Box Options",
[
// [ "COMBO", "Box Type", [[1,2,3], [["Ammo"],["Weapons"],["Medical"]],0] ]
["COMBO", "Box Type", [_boxTypesAvailable, _comboOptions, 0]]
],
{
params ["_dialog", "_args"];
_dialog params ["_typeOptionSelected"];
_args params ["_pos", "_target", "_keysSorted"];
private _box = [_target, _typeOptionSelected, _pos] call EFUNC(resupply,createBox);
if (isNull _box) exitWith {
["Resupply Box", "WARNING: Failed to locate or create box!"] call BIS_fnc_curatorHint;
};
[
"Resupply Box",
format[
"Created %1",
getText((call EFUNC(resupply,getSupplyCratesCfg)) >> _typeOptionSelected >> "displayName")
]
] call BIS_fnc_curatorHint;
},
{},
[_pos, _target]
] call zen_dialog_fnc_create;
}
] call zen_custom_modules_fnc_register;
[
QUOTE(MODULE_CATEGORY_NAME),
"Grounds Cleanup",

View File

@@ -3,12 +3,21 @@
if (!hasInterface) exitWith {};
params [
["_subjectID", GVAR(subjectStatusID), [""]],
["_subjectID", "", [""]],
["_recordTitle", "", [""]],
["_recordText", "", [""]],
["_recordIcon", "", [""]]
];
// Check if all parameters are provided
if (
count _subjectID isEqualTo 0 ||
count _recordTitle isEqualTo 0 ||
count _recordText isEqualTo 0
) exitWith {
[LEVEL_ERROR, QUOTE(COMPONENT), "Not all parameters provided"] call EFUNC(common,log);
};
// Check if already created
private _subjectRecords = GVAR(diaryRecords) getOrDefault [_subjectID, createHashMap, true];
private _existingRecord = _subjectRecords getOrDefault [_recordTitle, diaryRecordNull, true];

View File

@@ -21,7 +21,7 @@ call FUNC(updateAssetDiary);
[
LEVEL_DEBUG,
QUOTE(COMPONENT),
"postInit complete",
"initClient complete",
[]
] call EFUNC(common,log);

View File

@@ -241,7 +241,7 @@ private _randomColors = [
],
_recordText joinString "<br/>",
_icon
] call EFUNC(fbcb2_main,createOrUpdateDiaryRecord);
] call EFUNC(common,createOrUpdateDiaryRecord);
// "\A3\ui_f\data\igui\cfg\simpleTasks\types\car_ca.paa"
} forEach _distinctVehiclesClassNames;

View File

@@ -109,4 +109,4 @@ _text = _text joinString "<br/>";
GVAR(subjectIntelID),
_recordTitle,
_text
] call FUNC(createOrUpdateDiaryRecord);
] call EFUNC(common,createOrUpdateDiaryRecord);

View File

@@ -62,7 +62,7 @@ reverse _battalionElementCfgs;
GVAR(subjectFrequenciesID),
_diaryTitleText#0,
_diaryTitleText#1
] call FUNC(createOrUpdateDiaryRecord);
] call EFUNC(common,createOrUpdateDiaryRecord);
} forEach _battalionElementCfgs;
// add the battalion command to the top of the list
@@ -72,6 +72,6 @@ private _diaryTitleText = [_battalionInfoCfg >> "Command", false] call FUNC(gene
GVAR(subjectFrequenciesID),
_diaryTitleText#0,
_diaryTitleText#1
] call FUNC(createOrUpdateDiaryRecord);
] call EFUNC(common,createOrUpdateDiaryRecord);
true;

View File

@@ -56,4 +56,4 @@ _text = _text joinString "<br/><br/>";
GVAR(subjectIntelID),
_recordTitle,
_text
] call FUNC(createOrUpdateDiaryRecord);
] call EFUNC(common,createOrUpdateDiaryRecord);

View File

@@ -25,12 +25,6 @@ player createDiarySubject[GVAR(subjectAssetsFixedWingID), "FBCB2 Planes"];
player createDiarySubject[GVAR(subjectAssetsRotaryID), "FBCB2 Helicopters"];
player createDiarySubject[GVAR(subjectAssetsGroundID), "FBCB2 Ground"];
// store records in format:
// [subject, [
// [title, diaryRecord]
// ]]
GVAR(diaryRecords) = createHashMap;
// run main inits
[] call FUNC(addFrequenciesRecord);
[] call FUNC(addSignalColorsRecord);
@@ -47,7 +41,7 @@ GVAR(diaryRecords) = createHashMap;
[
LEVEL_DEBUG,
QUOTE(COMPONENT),
"postInit complete",
"initClient complete",
[]
] call EFUNC(common,log);

View File

@@ -24,7 +24,7 @@
[
LEVEL_INFO,
QUOTE(COMPONENT),
"Respawn chat handler registered",
"respawn chat handler registered",
[player] call EFUNC(common,addPlayerInfoToArray)
] call EFUNC(common,log);

View File

@@ -14,12 +14,21 @@ waitUntil {!isNil QGVARMAIN(complete)};
["InitializePlayer", [player, true]] call BIS_fnc_dynamicGroups;
// Initialize a holder for managing local diary records
// store records in format:
// [subject, [
// [title, diaryRecord]
// ]]
EGVAR(common,diaryRecords) = createHashMap;
// initialize other modules
call EFUNC(mapcopy,initClient);
call EFUNC(reinsert,initClient);
call EFUNC(resupply,initClient);
call EFUNC(triageIcons,initClient);
call EFUNC(vehicleFlags,initClient);
call EFUNC(zeus,initClient);
call EFUNC(fbcb2_main,initClient);
call EFUNC(fbcb2_assets,initClient);
@@ -27,8 +36,10 @@ call EFUNC(fbcb2_assets,initClient);
[
LEVEL_DEBUG,
QUOTE(COMPONENT),
"postInit complete",
"initClient complete",
[]
] call EFUNC(common,log);
localNamespace setVariable [QGVAR(complete), true];
nil;

View File

@@ -1,5 +0,0 @@
params ["_sourcePlayer","_destinationPlayer"];
hint format["Copying map markers from %1", name _sourcePlayer];
[_destinationPlayer] remoteExecCall ["milsim_fnc_getPlayerMapMarkers",_sourcePlayer];

View File

@@ -1,16 +0,0 @@
params ["_destinationPlayer"];
_markerData = [];
hint format["Your map is being copied by %1", name _destinationPlayer];
{
_marker = toArray _x;
_marker resize 15;
if ( toString _marker == "_USER_DEFINED #" ) then {
_marker = _x call milsim_fnc_mapMarkerToString;
_markerData pushBack _marker;
};
} forEach allMapMarkers;
[_markerData] remoteExecCall ["milsim_fnc_loadMapMarkers",_destinationPlayer];

View File

@@ -1,17 +0,0 @@
_map_copy_condition =
{
('ItemMap' in (assignedItems _player)) && ('ItemMap' in (assignedItems _target)) && ([_player, _target, []] call ace_common_fnc_canInteractWith)
};
_map_copy_action =
[
"MilSimCopyMap",
"Copy Map",
"\a3\ui_f\data\igui\cfg\actions\talk_ca.paa",
{
[_target,_player] call milsim_fnc_copyMapFromPlayer
},
_map_copy_condition
] call ace_interact_menu_fnc_createAction;
["Man", 0, ["ACE_MainActions"], _map_copy_action, true] call ace_interact_menu_fnc_addActionToClass;

View File

@@ -1,10 +0,0 @@
params ["_markerList"];
if ('ItemMap' in (assignedItems player)) then {
{
_x call milsim_fnc_stringToMapMarker;
} foreach _markerList;
hint format["Map copied!"];
} else {
hint format["You need a map to copy onto!"];
};

View File

@@ -0,0 +1,24 @@
#include "..\script_component.hpp"
[
QGVAR(setting_enable),
"CHECKBOX",
"Allow Map Copying",
[QUOTE(SETTINGS_GROUP_NAME), QUOTE(COMPONENT_BEAUTIFIED)],
true, // default value
true, // is global
{
params ["_value"];
[
QGVAR(setting_enable),
_value
] call EFUNC(common,logSettingChanged);
}
] call CBA_fnc_addSetting;
[
LEVEL_INFO,
QUOTE(COMPONENT),
"CREATED SETTINGS",
[]
] call EFUNC(common,log);

View File

@@ -0,0 +1,15 @@
#include "..\script_component.hpp"
// serializes markers on local machine and returns them as array
_markerData = [];
{
_marker = toArray _x;
_marker resize 15;
if ( toString _marker == "_USER_DEFINED #" ) then {
_marker = _x call FUNC(mapMarkerToString);
_markerData pushBack _marker;
};
} forEach allMapMarkers;
_markerData;

View File

@@ -0,0 +1,57 @@
#include "..\script_component.hpp"
////////////////////////////////////////////////////////////////////
// Create action to copy map markers on all inheritors of CAManBase
////////////////////////////////////////////////////////////////////
private _mapCopyAction =
[
QGVAR(actionID),
"Copy Map",
"\a3\ui_f\data\igui\cfg\actions\talk_ca.paa",
{
params ["_target", "_player", "_params"];
format["Copying map markers from %1", name _target] call CBA_fnc_notify;
[QGVAR(mapCopyRequest), _this, _target] call CBA_fnc_targetEvent;
},
{
params ["_target", "_player", "_params"];
[QGVAR(setting_enable)] call CBA_settings_fnc_get && {
('ItemMap' in (assignedItems _player)) &&
('ItemMap' in (assignedItems _target)) &&
([_player, _target, []] call ace_common_fnc_canInteractWith)
};
}
] call ace_interact_menu_fnc_createAction;
["CAManBase", 0, ["ACE_MainActions"], _mapCopyAction, true] call ace_interact_menu_fnc_addActionToClass;
////////////////////////////////////////////////////////////////////
// Create CBA event to receive requests
////////////////////////////////////////////////////////////////////
[QGVAR(mapCopyRequest), {
params ["_me", "_requester", "_params"];
format["Your map is being copied by %1", name _requester] call CBA_fnc_notify;
private _myMarkers = _this call FUNC(getMapMarkers);
[QGVAR(mapCopyResponse), [_me, _myMarkers], _requester] call CBA_fnc_targetEvent;
}] call CBA_fnc_addEventHandler;
////////////////////////////////////////////////////////////////////
// Create CBA event to receive responses
////////////////////////////////////////////////////////////////////
[QGVAR(mapCopyResponse), {
params [["_responder", objNull, [objNull]], ["_markerList", [], [[]]]];
if ('ItemMap' in (assignedItems player)) then {
[_markerList] call FUNC(loadMapMarkers);
format["Copied %1 markers from %2", count _markerList, name _responder] call CBA_fnc_notify;
} else {
format["You need a map to copy onto!"] call CBA_fnc_notify;
};
}] call CBA_fnc_addEventHandler;
[
LEVEL_DEBUG,
QUOTE(COMPONENT),
"initClient complete",
[]
] call EFUNC(common,log);
localNamespace setVariable [QGVAR(complete), true];

View File

@@ -0,0 +1,8 @@
#include "..\script_component.hpp"
// accepts an array of serialized markers and adds them to local map
params [["_markerList", [], [[]]]];
{
_x call FUNC(stringToMapMarker);
} foreach _markerList;

View File

@@ -0,0 +1,3 @@
#define COMPONENT mapcopy
#define COMPONENT_BEAUTIFIED Map Copy
#include "../script_mod.hpp"

View File

@@ -1,14 +1,14 @@
#include "..\script_component.hpp"
params ["_type"]; // string of the object's classname
if (!(_type isKindOf "CAManBase")) exitWith {};
params [
["_types", [], [[]]], // classnames to assign these action to
["_useInheritance", false, [false]]
];
if (
(localNamespace getVariable [QGVAR(fileForReinsertClassesAdded), []])
find _type != -1
) exitWith {};
{ // forEach _types
private _classToAddActionsTo = _x;
private _fileForReinsertAction = [
private _fileForReinsertAction = [
QGVAR(fileReinsertRequestAction),
"File Re-insert Request",
"\A3\ui_f\data\igui\cfg\simpleTasks\types\takeoff_ca.paa",
@@ -28,19 +28,19 @@ private _fileForReinsertAction = [
private _base = [_player] call EFUNC(common,getNearestBase);
private _baseDistance = _player distance _base;
private _maxRangeToReady = missionNamespace getVariable [QGVAR(setting_maxRangeToReady), 400];
private _maxRangeToReady = [QGVAR(setting_maxRangeToReady)] call CBA_settings_fnc_get;
private _existingQueue = missionNamespace getVariable [QGVAR(reinsertionQueue), []];
// check if module is enabled, player is near a base, and player is not already in the queue
// (serverTime - GVAR(missionStartServerTime)) > 60*5 && // only allow after 15 minutes
missionNamespace getVariable ["milsim_reinsert_setting_reinsertion_enabled", true] &&
[QGVAR(setting_enabled)] call CBA_settings_fnc_get &&
(_baseDistance < _maxRangeToReady) &&
not (_player in (_existingQueue apply {_x#0}))
}
] call ace_interact_menu_fnc_createAction;
[_type, 1, ["ACE_SelfActions"], _fileForReinsertAction, true] call ace_interact_menu_fnc_addActionToClass;
] call ace_interact_menu_fnc_createAction;
[_classToAddActionsTo, 1, ["ACE_SelfActions"], _fileForReinsertAction, _useInheritance] call ace_interact_menu_fnc_addActionToClass;
private _removeFileForReinsertAction = [
private _removeFileForReinsertAction = [
QGVAR(removeReinsertRequestAction),
"Remove Re-insert Request",
"\A3\ui_f\data\igui\cfg\simpleTasks\types\land_ca.paa",
@@ -57,13 +57,9 @@ private _removeFileForReinsertAction = [
// check if module is enabled, player is in the queue
// (serverTime - GVAR(missionStartServerTime)) > 60*5 && // only allow after 15 minutes
missionNamespace getVariable ["milsim_reinsert_setting_reinsertion_enabled", true] &&
[QGVAR(setting_enabled)] call CBA_settings_fnc_get &&
(_player in (_existingQueue apply {_x#0}))
}
] call ace_interact_menu_fnc_createAction;
[_type, 1, ["ACE_SelfActions"], _removeFileForReinsertAction, true] call ace_interact_menu_fnc_addActionToClass;
private _classesActionsAddedTo = (localNamespace getVariable [QGVAR(fileForReinsertClassesAdded), []]);
_classesActionsAddedTo pushBackUnique _type;
localNamespace setVariable [QGVAR(fileForReinsertClassesAdded), _classesActionsAddedTo];
] call ace_interact_menu_fnc_createAction;
[_classToAddActionsTo, 1, ["ACE_SelfActions"], _removeFileForReinsertAction, _useInheritance] call ace_interact_menu_fnc_addActionToClass;
} forEach _types;

View File

@@ -1,14 +1,14 @@
#include "..\script_component.hpp"
params ["_type"]; // string of the object's classname
if (!(_type isKindOf "CAManBase")) exitWith {};
params [
["_types", [], [[]]], // classnames to assign these action to
["_useInheritance", false, [false]]
];
if (
(localNamespace getVariable [QGVAR(checkReinsertQueueClassesAdded), []])
find _type != -1
) exitWith {};
{ // forEach _types
private _classToAddActionsTo = _x;
private _checkReinsertQueueAction = [
private _checkReinsertQueueAction = [
QGVAR(checkReinsertQueue),
"[PILOT] Check Re-insert Queue",
"\A3\ui_f\data\igui\cfg\simpleTasks\types\land_ca.paa",
@@ -20,11 +20,9 @@ private _checkReinsertQueueAction = [
localNamespace setVariable [QGVAR(lastReinsertQueueCheck), diag_tickTime];
},
{
missionNamespace getVariable [QGVAR(setting_enabled), true]
} // always allow
] call ace_interact_menu_fnc_createAction;
[_type, 1, ["ACE_SelfActions"], _checkReinsertQueueAction, true] call ace_interact_menu_fnc_addActionToClass;
GVAR(setting_enabled);
} // condition
] call ace_interact_menu_fnc_createAction;
[_classToAddActionsTo, 1, ["ACE_SelfActions"], _checkReinsertQueueAction, _useInheritance] call ace_interact_menu_fnc_addActionToClass;
private _classesActionsAddedTo = (localNamespace getVariable [QGVAR(checkReinsertQueueClassesAdded), []]);
_classesActionsAddedTo pushBackUnique _type;
localNamespace setVariable [QGVAR(checkReinsertQueueClassesAdded), _classesActionsAddedTo];
} forEach _types;

View File

@@ -5,26 +5,16 @@ if (!hasInterface) exitWith {};
// ACE SELF-INTERACTIONS FOR FILING AND RESCINDING REINSERT REQUESTS NEAR BASE - ALL PLAYERS
localNamespace setVariable [QGVAR(fileForReinsertClassesAdded), []];
// add actions to current class
[typeOf player] call FUNC(addAceSelfActions);
// add actions to future classes
["ace_interact_menu_newControllableObject", {
_this call FUNC(addAceSelfActions);
}] call CBA_fnc_addEventHandler;
[["CAManBase"], true] call FUNC(addAceSelfActions);
/////////////////////////////////////////////////////
// PILOTS ONLY
// ACE SELF-INTERACTIONS FOR CHECKING REINSERT QUEUE - ONLY FOR PILOTS
if ((typeOf player) in ["B_Helipilot_F", "B_helicrew_F"]) then {
localNamespace setVariable [QGVAR(checkReinsertQueueClassesAdded), []];
localNamespace setVariable [QGVAR(lastReinsertQueueCheck), diag_tickTime];
localNamespace setVariable [QGVAR(checkReinsertQueueClassesAdded), []];
localNamespace setVariable [QGVAR(lastReinsertQueueCheck), diag_tickTime];
// add actions to current class
[typeOf player] call FUNC(addCheckQueueSelfAction);
// add actions to future classes
["ace_interact_menu_newControllableObject", {
_this call FUNC(addCheckQueueSelfAction);
}] call CBA_fnc_addEventHandler;
};
// add actions to pilot classes, and don't apply to child classes
[["B_Helipilot_F", "B_helicrew_F"], false] call FUNC(addCheckQueueSelfAction);
/////////////////////////////////////////////////////
@@ -33,13 +23,13 @@ if ((typeOf player) in ["B_Helipilot_F", "B_helicrew_F"]) then {
[{
// if module not enabled and pilot forced check not enabled, exit
if (not (
missionNamespace getVariable [QGVAR(setting_enabled), true] &&
missionNamespace getVariable [QGVAR(setting_pilotForcedCheckEnabled), true]
[QGVAR(setting_enabled)] call CBA_settings_fnc_get and
[QGVAR(setting_pilotForcedCheckEnabled)] call CBA_settings_fnc_get
)) exitWith {};
// if last check was less than X minutes ago, skip
private _lastCheck = localNamespace getVariable [QGVAR(lastReinsertQueueCheck), diag_tickTime];
private _requiredCheckInterval = missionNamespace getVariable [QGVAR(setting_pilotForcedCheckInterval), 60*20];
private _requiredCheckInterval = [QGVAR(setting_pilotForcedCheckInterval)] call CBA_settings_fnc_get;
if (
diag_tickTime - _lastCheck <
_requiredCheckInterval
@@ -57,6 +47,8 @@ if ((typeOf player) in ["B_Helipilot_F", "B_helicrew_F"]) then {
[
LEVEL_DEBUG,
QUOTE(COMPONENT),
"postInit complete",
"initClient complete",
[]
] call EFUNC(common,log);
localNamespace setVariable [QGVAR(complete), true];

View File

@@ -35,9 +35,7 @@ private _supplyCrateTypesCfgs = _supplyCratesCfg call BIS_fnc_returnChildren;
private _cfg = _x;
private _supplyCrateDisplayName = (_cfg >> "displayName") call BIS_fnc_getCfgData;
// add action to spawn supply crate
private _actionID = _arsenalBox addAction [format ["<t color='#ffffff'>Spawn %1</t>", _supplyCrateDisplayName], {
params ["_target", "_caller", "_actionId", "_arguments"];
_arguments params ["_supplyCrateCfg"];
@@ -46,13 +44,16 @@ private _supplyCrateTypesCfgs = _supplyCratesCfg call BIS_fnc_returnChildren;
configName _supplyCrateCfg,
getPos _target
] call FUNC(createBox);
// log action use in server RPT
private _supplyCrateDisplayName = (_supplyCrateCfg >> "displayName") call BIS_fnc_getCfgData;
[
LEVEL_INFO,
QUOTE(COMPONENT),
"Supply crate spawned",
[player, [
["supplyCrateType", _supplyCrateDisplayName],
["supplyCrateDisplayName", _supplyCrateDisplayName],
["supplyCrateCfgName", configName _supplyCrateCfg],
["position", getPos _target]
]] call EFUNC(common,addPlayerInfoToArray)
] remoteExec [QEFUNC(common,log), 2];

View File

@@ -7,7 +7,8 @@ call FUNC(addArsenalObjectSpawnBoxActions);
[
LEVEL_DEBUG,
QUOTE(COMPONENT),
"postInit complete",
"initClient complete",
[]
] call EFUNC(common,log);
localNamespace setVariable [QGVAR(complete), true];

View File

@@ -6,7 +6,8 @@ GVAR(drawTargets) = [];
[
LEVEL_DEBUG,
QUOTE(COMPONENT),
"postInit complete",
"initClient complete",
[]
] call EFUNC(common,log);
localNamespace setVariable [QGVAR(complete), true];

View File

@@ -1,7 +1,7 @@
if (!hasInterface) exitWith {};
#include "..\script_component.hpp"
if (!hasInterface) exitWith {};
private _vehicleFlagsCfg = call FUNC(getVehicleFlagsCfg);
if (!isClass _vehicleFlagsCfg) exitWith {
@@ -15,19 +15,10 @@ private _flagCategoryCfgs = (_vehicleFlagsCfg >> "FlagCategories") call BIS_fnc_
{ // forEach _baseClassesToApplyActionsFor
private _parentClass = _x;
////////////////////////////////////////////////////////////////////////
// add CBA class event handler to add actions to vehicles after they are initialized
// all classes that inherit from the base classes will also have this applied
// an exclusion function is present for manually excluding specific classes
////////////////////////////////////////////////////////////////////////
[_parentClass, "InitPost", {
////////////////////////////////////////////////////////////////////////
// create the root action
////////////////////////////////////////////////////////////////////////
private _rootActionID = "SetVehicleFlag";
private _rootActionID = QGVAR(SetVehicleFlagAction);
private _flagRootAction = [
_rootActionID, // id
"Set Vehicle Flag", // displayed title
@@ -69,11 +60,12 @@ private _flagCategoryCfgs = (_vehicleFlagsCfg >> "FlagCategories") call BIS_fnc_
// add root action to add flags
////////////////////////////////////////////////////////////////////////
[
(_this select 0), // object
_parentClass, // parent classname
0, // action 0 or self-action 1
["ACE_MainActions"], // parent
_flagRootAction // action
] call ace_interact_menu_fnc_addActionToObject;
_flagRootAction, // action
true // apply to child classes
] call ace_interact_menu_fnc_addActionToClass;
////////////////////////////////////////////////////////////////////////
// add action to remove flag under the root action
@@ -97,13 +89,22 @@ private _flagCategoryCfgs = (_vehicleFlagsCfg >> "FlagCategories") call BIS_fnc_
// add the action to the vehicle
// in this class event handler, this#0 will be the vehicle
[
(_this select 0), // object
_parentClass, // parent classname
0, // action 0 or self-action 1
["ACE_MainActions", _rootActionID], // parent
_removeFlagAction // action
] call ace_interact_menu_fnc_addActionToObject;
_removeFlagAction, // action
true // apply to child classes
] call ace_interact_menu_fnc_addActionToClass;
}, true, [], true] call CBA_fnc_addClassEventHandler;
} forEach _baseClassesToApplyActionsFor;
[
LEVEL_DEBUG,
QUOTE(COMPONENT),
"initClient complete",
[]
] call EFUNC(common,log);
localNamespace setVariable [QGVAR(complete), true];
nil;

View File

@@ -6,21 +6,30 @@
Parameter(s):
0: STRING - Classname of the vehicle to check
*/
#include "..\script_component.hpp"
if (!hasInterface) exitWith {};
params [["_className", "", [""]]];
if (_className == "") exitWith {false};
private _vehicleFlagsCfg = call milsim_vehicleFlags_fnc_getVehicleFlagsCfg;
private _vehicleFlagsCfg = call FUNC(getVehicleFlagsCfg);
private _excludedVehiclesClass = (_vehicleFlagsCfg >> "ExcludedVehicles");
private _exclusionGroups = configProperties [_vehicleFlagsCfg >> "ExcludedVehicles"];
private _isExcluded = false;
{
// Check if the class doesn't have a flag proxy
// Check if the class is directly excluded
private _excludedClasses = _x call BIS_fnc_getCfgDataArray;
if (_className in _excludedClasses) exitWith {true};
if (_className in _excludedClasses) exitWith {
_isExcluded = true;
};
{
if (_className isKindOf _x) exitWith {
_isExcluded = true;
};
} forEach _excludedClasses;
if (_isExcluded) exitWith {};
} forEach _exclusionGroups;
false;
_isExcluded;

View File

@@ -0,0 +1,294 @@
#include "..\script_component.hpp"
if ( !hasInterface ) exitWith {};
// Create Resupply Box
[
QUOTE(MODULE_CATEGORY_NAME),
"Create Resupply Box",
{
// module placement
params [["_pos", [0,0,0], [[]], 3], ["_target", objNull, [objNull]]];
// get parent definition
private _supplyCratesCfg = call EFUNC(resupply,getSupplyCratesCfg);
// get the subclass names
private _boxTypesAvailable = _supplyCratesCfg call BIS_fnc_getCfgSubClasses;
_boxTypesAvailable sort true;
_comboOptions = _boxTypesAvailable apply {
[
// display name
[_supplyCratesCfg >> _x >> "displayName", "STRING", "ERROR"] call CBA_fnc_getConfigEntry,
// tooltip
[_supplyCratesCfg >> _x >> "tooltip", "STRING", "ERROR"] call CBA_fnc_getConfigEntry,
// icon
[_supplyCratesCfg >> _x >> "icon", "STRING", "ERROR"] call CBA_fnc_getConfigEntry
]
};
[ // create the dialog
"Resupply Box Options",
[
// [ "COMBO", "Box Type", [[1,2,3], [["Ammo"],["Weapons"],["Medical"]],0] ]
["COMBO", "Box Type", [_boxTypesAvailable, _comboOptions, 0]]
],
{
params ["_dialog", "_args"];
_dialog params ["_typeOptionSelected"];
_args params ["_pos", "_target", "_keysSorted"];
private _box = [_target, _typeOptionSelected, _pos] call EFUNC(resupply,createBox);
if (isNull _box) exitWith {
["Resupply Box", "WARNING: Failed to locate or create box!"] call BIS_fnc_curatorHint;
};
[
"Resupply Box",
format[
"Created %1",
getText((call EFUNC(resupply,getSupplyCratesCfg)) >> _typeOptionSelected >> "displayName")
]
] call BIS_fnc_curatorHint;
},
{},
[_pos, _target]
] call zen_dialog_fnc_create;
}
] call zen_custom_modules_fnc_register;
// Manage wheels in a vehicle's ACE cargo
[
QUOTE(MODULE_CATEGORY_NAME),
"Manage Wheels in Vehicle",
{
// module placement
params [["_pos", [0,0,0], [[]], 3], ["_target", objNull, [objNull]]];
if (isNull _target) exitWith {
["Manage Wheels in Vehicle", "WARNING: No vehicle selected!"] call BIS_fnc_curatorHint;
};
if (_target isKindOf "CAManBase") exitWith {
["Manage Wheels in Vehicle", "WARNING: Cannot add wheels/tracks to a person!"] call BIS_fnc_curatorHint;
};
if (_target isKindOf "Static") exitWith {
["Manage Wheels in Vehicle", "WARNING: Cannot add wheels/tracks to a static object!"] call BIS_fnc_curatorHint;
};
// get loaded details
private _loadedItems = _target getVariable ["ace_cargo_loaded", []];
private _loadedItemsObjects = _loadedItems select { _x isEqualType objNull };
private _loadedItemsVirtual = _loadedItems select { _x isEqualType "" };
private _spaceLeft = _target getVariable ["ace_cargo_space", 0];
private _wheels = _loadedItemsVirtual select { _x isEqualTo "ACE_Wheel" };
_wheels append (_loadedItemsObjects select { typeOf _x isEqualTo "ACE_Wheel" });
private _maxWheels = floor ((_spaceLeft + count _loadedItems) / ("ACE_Wheel" call ace_cargo_fnc_getSizeItem));
private _currentWheels = count _wheels;
private _comboOptions = [[], [], _currentWheels];
for "_i" from 0 to _maxWheels do {
_comboOptions#0 pushBack _i;
_comboOptions#1 pushBack format["%1", _i];
};
[ // create the dialog
"Manage Wheels in Vehicle",
[
// [ "COMBO", "Box Type", [[1,2,3], [["Ammo"],["Weapons"],["Medical"]],0] ]
["TOOLBOX", "Existing Data", [
0, // default value
2, // num rows
2, // num columns
[
format["Loaded Items: %1", count _loadedItems],
format["Space Left: %1", _spaceLeft],
format["Loaded Wheels: %1", count _wheels]
]
]],
["COMBO", "Desired ACE Wheels Count", _comboOptions, true]
],
{
params ["_dialogValues", "_args"];
_dialogValues params ["_listItem", "_desiredWheelsCount"];
_args params ["_pos", "_target", "_currentWheelsCount"];
// MANAGE WHEELS
if (_desiredWheelsCount > _currentWheelsCount) then {
// add wheels
private _wheelsToAdd = _desiredWheelsCount - _currentWheelsCount;
systemChat format["Adding %1 wheels...", _wheelsToAdd];
for "_i" from 1 to _wheelsToAdd do {
if (
["ACE_Wheel", _target] call ace_cargo_fnc_canLoadItemIn
) then {
["ACE_Wheel", _target] call ace_cargo_fnc_addCargoItem;
};
};
};
if (_desiredWheelsCount < _currentWheelsCount) then {
// remove wheels
private _wheelsToRemove = _currentWheelsCount - _desiredWheelsCount;
systemChat format["Removing %1 wheels...", _wheelsToRemove];
["ACE_Wheel", _target, _wheelsToRemove] call ace_cargo_fnc_removeCargoItem;
};
// get loaded details
private _loadedItems = _target getVariable ["ace_cargo_loaded", []];
private _loadedItemsObjects = _loadedItems select { _x isEqualType objNull };
private _loadedItemsVirtual = _loadedItems select { _x isEqualType "" };
private _spaceLeft = _target getVariable ["ace_cargo_space", 0];
private _wheels = _loadedItemsVirtual select { _x isEqualTo "ACE_Wheel" };
_wheels append (_loadedItemsObjects select { typeOf _x isEqualTo "ACE_Wheel" });
private _maxWheels = floor ((_spaceLeft + count _loadedItems) / ("ACE_Wheel" call ace_cargo_fnc_getSizeItem));
private _currentWheels = count _wheels;
[
"Manage Wheels in Vehicle",
format[
"Updated count of wheels in vehicle: %1",
_currentWheels
]
] call BIS_fnc_curatorHint;
true;
},
{},
[_pos, _target, count _wheels, count _tracks]
] call zen_dialog_fnc_create;
}
] call zen_custom_modules_fnc_register;
// Manage tracks in a vehicle's ACE cargo
[
QUOTE(MODULE_CATEGORY_NAME),
"Manage Tracks in Vehicle",
{
// module placement
params [["_pos", [0,0,0], [[]], 3], ["_target", objNull, [objNull]]];
if (isNull _target) exitWith {
["Manage Tracks in Vehicle", "WARNING: No vehicle selected!"] call BIS_fnc_curatorHint;
};
if (_target isKindOf "CAManBase") exitWith {
["Manage Tracks in Vehicle", "WARNING: Cannot add wheels/tracks to a person!"] call BIS_fnc_curatorHint;
};
if (_target isKindOf "Static") exitWith {
["Manage Tracks in Vehicle", "WARNING: Cannot add wheels/tracks to a static object!"] call BIS_fnc_curatorHint;
};
// get loaded details
private _loadedItems = _target getVariable ["ace_cargo_loaded", []];
private _loadedItemsObjects = _loadedItems select { _x isEqualType objNull };
private _loadedItemsVirtual = _loadedItems select { _x isEqualType "" };
private _spaceLeft = _target getVariable ["ace_cargo_space", 0];
private _tracks = _loadedItemsVirtual select { _x isEqualTo "ACE_Track" };
_tracks append (_loadedItemsObjects select { typeOf _x isEqualTo "ACE_Track" });
private _maxTracks = floor ((_spaceLeft + count _loadedItems) / ("ACE_Track" call ace_cargo_fnc_getSizeItem));
private _currentTracks = count _tracks;
private _comboOptions = [[], [], _currentTracks];
for "_i" from 0 to _maxTracks do {
_comboOptions#0 pushBack _i;
_comboOptions#1 pushBack format["%1", _i];
};
[ // create the dialog
"Manage Tracks in Vehicle",
[
// [ "COMBO", "Box Type", [[1,2,3], [["Ammo"],["Weapons"],["Medical"]],0] ]
["TOOLBOX", "Existing Data", [
0, // default value
2, // num rows
2, // num columns
[
format["Loaded Items: %1", count _loadedItems],
format["Space Left: %1", _spaceLeft],
format["Loaded Tracks: %1", count _tracks]
]
]],
["COMBO", "Desired ACE Tracks Count", _comboOptions, true]
],
{
params ["_dialogValues", "_args"];
_dialogValues params ["_listItem", "_desiredTracksCount"];
_args params ["_pos", "_target", "_currentTracksCount"];
// MANAGE TRACKS
if (_desiredTracksCount > _currentTracksCount) then {
// add tracks
private _tracksToAdd = _desiredTracksCount - _currentTracksCount;
systemChat format["Adding %1 tracks...", _tracksToAdd];
for "_i" from 1 to _tracksToAdd do {
if (
["ACE_Track", _target] call ace_cargo_fnc_canLoadItemIn
) then {
["ACE_Track", _target] call ace_cargo_fnc_addCargoItem;
};
};
};
if (_desiredTracksCount < _currentTracksCount) then {
// remove tracks
private _tracksToRemove = _currentTracksCount - _desiredTracksCount;
systemChat format["Removing %1 tracks...", _tracksToRemove];
["ACE_Track", _target, _tracksToRemove] call ace_cargo_fnc_removeCargoItem;
};
// get loaded details
private _loadedItems = _target getVariable ["ace_cargo_loaded", []];
private _loadedItemsObjects = _loadedItems select { _x isEqualType objNull };
private _loadedItemsVirtual = _loadedItems select { _x isEqualType "" };
private _spaceLeft = _target getVariable ["ace_cargo_space", 0];
private _tracks = _loadedItemsVirtual select { _x isEqualTo "ACE_Track" };
_tracks append (_loadedItemsObjects select { typeOf _x isEqualTo "ACE_Track" });
private _maxTracks = floor ((_spaceLeft + count _loadedItems) / ("ACE_Track" call ace_cargo_fnc_getSizeItem));
private _currentTracks = count _tracks;
[
"Manage Tracks in Vehicle",
format[
"Updated count of tracks in vehicle: %1",
_currentTracks
]
] call BIS_fnc_curatorHint;
true;
},
{},
[_pos, _target, _currentTracks]
] call zen_dialog_fnc_create;
}
] call zen_custom_modules_fnc_register;
[
LEVEL_INFO,
QUOTE(COMPONENT),
"ZEUS ENHANCED MODULES ADDED",
[]
] call EFUNC(common,log);
nil;

View File

@@ -0,0 +1,14 @@
#include "..\script_component.hpp"
if (!hasInterface) exitWith {};
call FUNC(addZenModules);
[
LEVEL_DEBUG,
QUOTE(COMPONENT),
"postInit complete",
[]
] call EFUNC(common,log);
localNamespace setVariable [QGVAR(complete), true];

View File

@@ -0,0 +1,3 @@
#define COMPONENT zeus
#define COMPONENT_BEAUTIFIED Zeus Utilities
#include "../script_mod.hpp"