Merge pull request 'misc-improvements' (#23) from misc-improvements into develop

Reviewed-on: https://17th-gs.iceberg-gaming.com:5443/hizumi/MissionTemplate/pulls/23
This commit was merged in pull request #23.
This commit is contained in:
2024-02-08 18:35:52 -06:00
31 changed files with 386 additions and 283 deletions

View File

@@ -99,7 +99,7 @@ This directory contains a number of hpp files used to define constants throughou
- A subcomponent of `fbcb2_main`. Used to gather, display, and manage diary records as intel for assets near known bases. - A subcomponent of `fbcb2_main`. Used to gather, display, and manage diary records as intel for assets near known bases.
- `init`: - `init`:
- Contains core initialization functions. Both server and client inits across all modules are managed here. - Contains core initialization functions. Both server and client inits across all modules are managed here.
- `map`: - `mapcopy`:
- Gives players the ability to copy each other's maps. - Gives players the ability to copy each other's maps.
- `performance`: - `performance`:
- Contains functionality for monitoring and logging performance data. - Contains functionality for monitoring and logging performance data.

View File

@@ -125,5 +125,40 @@ class VehicleFlags {
texture = "textures\flags_misc\flag_redcross_co.paa"; 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

@@ -12,7 +12,6 @@ class CfgFunctions {
class addRespawnChatHandler { postInit = 1; }; class addRespawnChatHandler { postInit = 1; };
}; };
}; };
class PREFIX { class PREFIX {
class ambience { class ambience {
@@ -20,16 +19,6 @@ class CfgFunctions {
class flakInitVehicle {}; class flakInitVehicle {};
class flakEH {}; 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 DOUBLES(PREFIX,client) {
@@ -42,13 +31,13 @@ class CfgFunctions {
}; };
}; };
class DOUBLES(PREFIX,common) { class DOUBLES(PREFIX,common) {
class functions { class functions {
file = "framework\common\functions"; file = "framework\common\functions";
class addCBASettings { preInit = 1; }; class addCBASettings { preInit = 1; };
class logMissionInfo {}; class logMissionInfo {};
class addPlayerInfoToArray {}; class addPlayerInfoToArray {};
class createOrUpdateDiaryRecord {};
class getApprovedAssetsCfg {}; class getApprovedAssetsCfg {};
class getBattalionCfg {}; class getBattalionCfg {};
class getNameOfBase {}; class getNameOfBase {};
@@ -95,12 +84,23 @@ class CfgFunctions {
}; };
class util { class util {
file = "framework\fbcb2_main\util"; file = "framework\fbcb2_main\util";
class createOrUpdateDiaryRecord {};
class formatRadioElementForDiary {}; class formatRadioElementForDiary {};
class generateElementFrequencyRecordText {}; 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 DOUBLES(PREFIX,performance) {
class functions { class functions {
file = "framework\performance\functions"; file = "framework\performance\functions";

View File

@@ -3,12 +3,21 @@
if (!hasInterface) exitWith {}; if (!hasInterface) exitWith {};
params [ params [
["_subjectID", GVAR(subjectStatusID), [""]], ["_subjectID", "", [""]],
["_recordTitle", "", [""]], ["_recordTitle", "", [""]],
["_recordText", "", [""]], ["_recordText", "", [""]],
["_recordIcon", "", [""]] ["_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 // Check if already created
private _subjectRecords = GVAR(diaryRecords) getOrDefault [_subjectID, createHashMap, true]; private _subjectRecords = GVAR(diaryRecords) getOrDefault [_subjectID, createHashMap, true];
private _existingRecord = _subjectRecords getOrDefault [_recordTitle, diaryRecordNull, true]; private _existingRecord = _subjectRecords getOrDefault [_recordTitle, diaryRecordNull, true];

View File

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

View File

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

View File

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

View File

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

View File

@@ -56,4 +56,4 @@ _text = _text joinString "<br/><br/>";
GVAR(subjectIntelID), GVAR(subjectIntelID),
_recordTitle, _recordTitle,
_text _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(subjectAssetsRotaryID), "FBCB2 Helicopters"];
player createDiarySubject[GVAR(subjectAssetsGroundID), "FBCB2 Ground"]; player createDiarySubject[GVAR(subjectAssetsGroundID), "FBCB2 Ground"];
// store records in format:
// [subject, [
// [title, diaryRecord]
// ]]
GVAR(diaryRecords) = createHashMap;
// run main inits // run main inits
[] call FUNC(addFrequenciesRecord); [] call FUNC(addFrequenciesRecord);
[] call FUNC(addSignalColorsRecord); [] call FUNC(addSignalColorsRecord);
@@ -47,7 +41,7 @@ GVAR(diaryRecords) = createHashMap;
[ [
LEVEL_DEBUG, LEVEL_DEBUG,
QUOTE(COMPONENT), QUOTE(COMPONENT),
"postInit complete", "initClient complete",
[] []
] call EFUNC(common,log); ] call EFUNC(common,log);

View File

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

View File

@@ -14,8 +14,16 @@ waitUntil {!isNil QGVARMAIN(complete)};
["InitializePlayer", [player, true]] call BIS_fnc_dynamicGroups; ["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 // initialize other modules
call EFUNC(mapcopy,initClient);
call EFUNC(reinsert,initClient); call EFUNC(reinsert,initClient);
call EFUNC(resupply,initClient); call EFUNC(resupply,initClient);
call EFUNC(triageIcons,initClient); call EFUNC(triageIcons,initClient);
@@ -28,7 +36,7 @@ call EFUNC(fbcb2_assets,initClient);
[ [
LEVEL_DEBUG, LEVEL_DEBUG,
QUOTE(COMPONENT), QUOTE(COMPONENT),
"postInit complete", "initClient complete",
[] []
] call EFUNC(common,log); ] call EFUNC(common,log);

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,69 +1,65 @@
#include "..\script_component.hpp" #include "..\script_component.hpp"
params ["_type"]; // string of the object's classname params [
if (!(_type isKindOf "CAManBase")) exitWith {}; ["_types", [], [[]]], // classnames to assign these action to
["_useInheritance", false, [false]]
];
if ( { // forEach _types
(localNamespace getVariable [QGVAR(fileForReinsertClassesAdded), []]) private _classToAddActionsTo = _x;
find _type != -1
) exitWith {};
private _fileForReinsertAction = [ private _fileForReinsertAction = [
QGVAR(fileReinsertRequestAction), QGVAR(fileReinsertRequestAction),
"File Re-insert Request", "File Re-insert Request",
"\A3\ui_f\data\igui\cfg\simpleTasks\types\takeoff_ca.paa", "\A3\ui_f\data\igui\cfg\simpleTasks\types\takeoff_ca.paa",
{ // statement { // statement
params ["_target", "_player", "_params"]; params ["_target", "_player", "_params"];
// find nearest base or location // find nearest base or location
private _base = [_player] call EFUNC(common,getNearestBase); private _base = [_player] call EFUNC(common,getNearestBase);
private _baseName = [_base] call EFUNC(common,getNameOfBase); private _baseName = [_base] call EFUNC(common,getNameOfBase);
// send event to server // send event to server
[QGVAR(fileReinsertRequest), [_player, _base]] call CBA_fnc_serverEvent; [QGVAR(fileReinsertRequest), [_player, _base]] call CBA_fnc_serverEvent;
// notify player their request was filed // notify player their request was filed
[["Re-insert Request Filed"], [format["Location: %1", _baseName]]] call CBA_fnc_notify; [["Re-insert Request Filed"], [format["Location: %1", _baseName]]] call CBA_fnc_notify;
}, },
{ // condition { // condition
params ["_target", "_player", "_params"]; params ["_target", "_player", "_params"];
// find nearest base or location // find nearest base or location
private _base = [_player] call EFUNC(common,getNearestBase); private _base = [_player] call EFUNC(common,getNearestBase);
private _baseDistance = _player distance _base; 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), []]; private _existingQueue = missionNamespace getVariable [QGVAR(reinsertionQueue), []];
// check if module is enabled, player is near a base, and player is not already in the queue // 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 // (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) && (_baseDistance < _maxRangeToReady) &&
not (_player in (_existingQueue apply {_x#0})) not (_player in (_existingQueue apply {_x#0}))
} }
] call ace_interact_menu_fnc_createAction; ] call ace_interact_menu_fnc_createAction;
[_type, 1, ["ACE_SelfActions"], _fileForReinsertAction, true] call ace_interact_menu_fnc_addActionToClass; [_classToAddActionsTo, 1, ["ACE_SelfActions"], _fileForReinsertAction, _useInheritance] call ace_interact_menu_fnc_addActionToClass;
private _removeFileForReinsertAction = [ private _removeFileForReinsertAction = [
QGVAR(removeReinsertRequestAction), QGVAR(removeReinsertRequestAction),
"Remove Re-insert Request", "Remove Re-insert Request",
"\A3\ui_f\data\igui\cfg\simpleTasks\types\land_ca.paa", "\A3\ui_f\data\igui\cfg\simpleTasks\types\land_ca.paa",
{ // statement { // statement
params ["_target", "_player", "_params"]; params ["_target", "_player", "_params"];
// send event to server // send event to server
[QGVAR(removeReinsertRequest), [_player]] call CBA_fnc_serverEvent; [QGVAR(removeReinsertRequest), [_player]] call CBA_fnc_serverEvent;
// notify player their request was rescinded // notify player their request was rescinded
"Re-insert Request Rescinded" call CBA_fnc_notify; "Re-insert Request Rescinded" call CBA_fnc_notify;
}, },
{ // condition { // condition
params ["_target", "_player", "_params"]; params ["_target", "_player", "_params"];
private _existingQueue = missionNamespace getVariable [QGVAR(reinsertionQueue), []]; private _existingQueue = missionNamespace getVariable [QGVAR(reinsertionQueue), []];
// 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] &&
(_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];
// check if module is enabled, player is in the queue
// (serverTime - GVAR(missionStartServerTime)) > 60*5 && // only allow after 15 minutes
[QGVAR(setting_enabled)] call CBA_settings_fnc_get &&
(_player in (_existingQueue apply {_x#0}))
}
] call ace_interact_menu_fnc_createAction;
[_classToAddActionsTo, 1, ["ACE_SelfActions"], _removeFileForReinsertAction, _useInheritance] call ace_interact_menu_fnc_addActionToClass;
} forEach _types;

View File

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

View File

@@ -5,26 +5,16 @@ if (!hasInterface) exitWith {};
// ACE SELF-INTERACTIONS FOR FILING AND RESCINDING REINSERT REQUESTS NEAR BASE - ALL PLAYERS // ACE SELF-INTERACTIONS FOR FILING AND RESCINDING REINSERT REQUESTS NEAR BASE - ALL PLAYERS
localNamespace setVariable [QGVAR(fileForReinsertClassesAdded), []]; localNamespace setVariable [QGVAR(fileForReinsertClassesAdded), []];
// add actions to current class // add actions to current class
[typeOf player] call FUNC(addAceSelfActions); [["CAManBase"], true] call FUNC(addAceSelfActions);
// add actions to future classes
["ace_interact_menu_newControllableObject", {
_this call FUNC(addAceSelfActions);
}] call CBA_fnc_addEventHandler;
///////////////////////////////////////////////////// /////////////////////////////////////////////////////
// PILOTS ONLY // PILOTS ONLY
// ACE SELF-INTERACTIONS FOR CHECKING REINSERT QUEUE - ONLY FOR PILOTS // 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(checkReinsertQueueClassesAdded), []]; localNamespace setVariable [QGVAR(lastReinsertQueueCheck), diag_tickTime];
localNamespace setVariable [QGVAR(lastReinsertQueueCheck), diag_tickTime];
// add actions to current class // add actions to pilot classes, and don't apply to child classes
[typeOf player] call FUNC(addCheckQueueSelfAction); [["B_Helipilot_F", "B_helicrew_F"], false] call FUNC(addCheckQueueSelfAction);
// add actions to future classes
["ace_interact_menu_newControllableObject", {
_this call FUNC(addCheckQueueSelfAction);
}] call CBA_fnc_addEventHandler;
};
///////////////////////////////////////////////////// /////////////////////////////////////////////////////
@@ -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 module not enabled and pilot forced check not enabled, exit
if (not ( if (not (
missionNamespace getVariable [QGVAR(setting_enabled), true] && [QGVAR(setting_enabled)] call CBA_settings_fnc_get and
missionNamespace getVariable [QGVAR(setting_pilotForcedCheckEnabled), true] [QGVAR(setting_pilotForcedCheckEnabled)] call CBA_settings_fnc_get
)) exitWith {}; )) exitWith {};
// if last check was less than X minutes ago, skip // if last check was less than X minutes ago, skip
private _lastCheck = localNamespace getVariable [QGVAR(lastReinsertQueueCheck), diag_tickTime]; 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 ( if (
diag_tickTime - _lastCheck < diag_tickTime - _lastCheck <
_requiredCheckInterval _requiredCheckInterval
@@ -57,6 +47,8 @@ if ((typeOf player) in ["B_Helipilot_F", "B_helicrew_F"]) then {
[ [
LEVEL_DEBUG, LEVEL_DEBUG,
QUOTE(COMPONENT), QUOTE(COMPONENT),
"postInit complete", "initClient complete",
[] []
] call EFUNC(common,log); ] 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 _cfg = _x;
private _supplyCrateDisplayName = (_cfg >> "displayName") call BIS_fnc_getCfgData; 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], { private _actionID = _arsenalBox addAction [format ["<t color='#ffffff'>Spawn %1</t>", _supplyCrateDisplayName], {
params ["_target", "_caller", "_actionId", "_arguments"]; params ["_target", "_caller", "_actionId", "_arguments"];
_arguments params ["_supplyCrateCfg"]; _arguments params ["_supplyCrateCfg"];
@@ -46,13 +44,16 @@ private _supplyCrateTypesCfgs = _supplyCratesCfg call BIS_fnc_returnChildren;
configName _supplyCrateCfg, configName _supplyCrateCfg,
getPos _target getPos _target
] call FUNC(createBox); ] call FUNC(createBox);
// log action use in server RPT // log action use in server RPT
private _supplyCrateDisplayName = (_supplyCrateCfg >> "displayName") call BIS_fnc_getCfgData;
[ [
LEVEL_INFO, LEVEL_INFO,
QUOTE(COMPONENT), QUOTE(COMPONENT),
"Supply crate spawned", "Supply crate spawned",
[player, [ [player, [
["supplyCrateType", _supplyCrateDisplayName], ["supplyCrateDisplayName", _supplyCrateDisplayName],
["supplyCrateCfgName", configName _supplyCrateCfg],
["position", getPos _target] ["position", getPos _target]
]] call EFUNC(common,addPlayerInfoToArray) ]] call EFUNC(common,addPlayerInfoToArray)
] remoteExec [QEFUNC(common,log), 2]; ] remoteExec [QEFUNC(common,log), 2];

View File

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

View File

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

View File

@@ -1,7 +1,7 @@
if (!hasInterface) exitWith {};
#include "..\script_component.hpp" #include "..\script_component.hpp"
if (!hasInterface) exitWith {};
private _vehicleFlagsCfg = call FUNC(getVehicleFlagsCfg); private _vehicleFlagsCfg = call FUNC(getVehicleFlagsCfg);
if (!isClass _vehicleFlagsCfg) exitWith { if (!isClass _vehicleFlagsCfg) exitWith {
@@ -16,94 +16,95 @@ private _flagCategoryCfgs = (_vehicleFlagsCfg >> "FlagCategories") call BIS_fnc_
private _parentClass = _x; private _parentClass = _x;
//////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////
// add CBA class event handler to add actions to vehicles after they are initialized // create the root action
// 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", { private _rootActionID = QGVAR(SetVehicleFlagAction);
private _flagRootAction = [
_rootActionID, // id
"Set Vehicle Flag", // displayed title
//////////////////////////////////////////////////////////////////////// "\A3\ui_f\data\map\markers\flags\nato_ca.paa", // flag icon
// create the root action {true}, // statement
//////////////////////////////////////////////////////////////////////// {
private _rootActionID = "SetVehicleFlag"; params ["_target", "_player", "_params"];
private _flagRootAction = [ // _params params ["_parentActionID", "_flagCategories"];
_rootActionID, // id
"Set Vehicle Flag", // displayed title
"\A3\ui_f\data\map\markers\flags\nato_ca.paa", // flag icon
{true}, // statement
{
params ["_target", "_player", "_params"];
// _params params ["_parentActionID", "_flagCategories"];
// check if vehicle is excluded
private _excluded = [typeOf _target] call FUNC(isClassExcluded);
if (_excluded || !alive _target) exitWith {false};
true;
}, // condition
{
////////////////////////////////////////////////////////////////////////
// create the flag category actions (with nested flag actions)
////////////////////////////////////////////////////////////////////////
params ["_target", "_player", "_params"];
_params params ["_rootActionID"];
private _vehicleFlagsCfg = call FUNC(getVehicleFlagsCfg);
if (isNull _vehicleFlagsCfg) exitWith {[]};
private _flagCategoryCfgs = (_vehicleFlagsCfg >> "FlagCategories") call BIS_fnc_returnChildren;
// return category child actions with individual flag actions nested as children
[_rootActionID, _flagCategoryCfgs] call FUNC(getActionsFlagCategories);
}, // child code
[_rootActionID], // params
nil, // position
4, // distance
[false, false, false, false, false], // other params
nil // modifier function code
] call ace_interact_menu_fnc_createAction;
////////////////////////////////////////////////////////////////////////
// add root action to add flags
////////////////////////////////////////////////////////////////////////
[
(_this select 0), // object
0, // action 0 or self-action 1
["ACE_MainActions"], // parent
_flagRootAction // action
] call ace_interact_menu_fnc_addActionToObject;
////////////////////////////////////////////////////////////////////////
// add action to remove flag under the root action
////////////////////////////////////////////////////////////////////////
// create action
private _removeFlagAction = [
_rootActionID + "_removeflag", // id
"Remove Flag", // displayed title
"\A3\ui_f\data\map\markers\flags\nato_ca.paa", // flag icon
{
params ["_target", "_player", "_params"];
_target forceFlagTexture "";
}, // statement
{
params ["_target", "_player", "_params"];
alive _target && getForcedFlagTexture _target != "";
}, // condition
nil // child code
] call ace_interact_menu_fnc_createAction;
// add the action to the vehicle
// in this class event handler, this#0 will be the vehicle
[
(_this select 0), // object
0, // action 0 or self-action 1
["ACE_MainActions", _rootActionID], // parent
_removeFlagAction // action
] call ace_interact_menu_fnc_addActionToObject;
}, true, [], true] call CBA_fnc_addClassEventHandler; // check if vehicle is excluded
private _excluded = [typeOf _target] call FUNC(isClassExcluded);
if (_excluded || !alive _target) exitWith {false};
true;
}, // condition
{
////////////////////////////////////////////////////////////////////////
// create the flag category actions (with nested flag actions)
////////////////////////////////////////////////////////////////////////
params ["_target", "_player", "_params"];
_params params ["_rootActionID"];
private _vehicleFlagsCfg = call FUNC(getVehicleFlagsCfg);
if (isNull _vehicleFlagsCfg) exitWith {[]};
private _flagCategoryCfgs = (_vehicleFlagsCfg >> "FlagCategories") call BIS_fnc_returnChildren;
// return category child actions with individual flag actions nested as children
[_rootActionID, _flagCategoryCfgs] call FUNC(getActionsFlagCategories);
}, // child code
[_rootActionID], // params
nil, // position
4, // distance
[false, false, false, false, false], // other params
nil // modifier function code
] call ace_interact_menu_fnc_createAction;
////////////////////////////////////////////////////////////////////////
// add root action to add flags
////////////////////////////////////////////////////////////////////////
[
_parentClass, // parent classname
0, // action 0 or self-action 1
["ACE_MainActions"], // parent
_flagRootAction, // action
true // apply to child classes
] call ace_interact_menu_fnc_addActionToClass;
////////////////////////////////////////////////////////////////////////
// add action to remove flag under the root action
////////////////////////////////////////////////////////////////////////
// create action
private _removeFlagAction = [
_rootActionID + "_removeflag", // id
"Remove Flag", // displayed title
"\A3\ui_f\data\map\markers\flags\nato_ca.paa", // flag icon
{
params ["_target", "_player", "_params"];
_target forceFlagTexture "";
}, // statement
{
params ["_target", "_player", "_params"];
alive _target && getForcedFlagTexture _target != "";
}, // condition
nil // child code
] call ace_interact_menu_fnc_createAction;
// add the action to the vehicle
// in this class event handler, this#0 will be the vehicle
[
_parentClass, // parent classname
0, // action 0 or self-action 1
["ACE_MainActions", _rootActionID], // parent
_removeFlagAction, // action
true // apply to child classes
] call ace_interact_menu_fnc_addActionToClass;
} forEach _baseClassesToApplyActionsFor; } forEach _baseClassesToApplyActionsFor;
[
LEVEL_DEBUG,
QUOTE(COMPONENT),
"initClient complete",
[]
] call EFUNC(common,log);
localNamespace setVariable [QGVAR(complete), true];
nil; nil;

View File

@@ -6,21 +6,30 @@
Parameter(s): Parameter(s):
0: STRING - Classname of the vehicle to check 0: STRING - Classname of the vehicle to check
*/ */
#include "..\script_component.hpp"
if (!hasInterface) exitWith {}; if (!hasInterface) exitWith {};
params [["_className", "", [""]]]; params [["_className", "", [""]]];
if (_className == "") exitWith {false}; if (_className == "") exitWith {false};
private _vehicleFlagsCfg = call milsim_vehicleFlags_fnc_getVehicleFlagsCfg; private _vehicleFlagsCfg = call FUNC(getVehicleFlagsCfg);
private _excludedVehiclesClass = (_vehicleFlagsCfg >> "ExcludedVehicles"); private _excludedVehiclesClass = (_vehicleFlagsCfg >> "ExcludedVehicles");
private _exclusionGroups = configProperties [_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; 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; } forEach _exclusionGroups;
false; _isExcluded;