Compare commits

..

15 Commits

Author SHA1 Message Date
hizumi
1e5d50828b Update CHANGELOG.md 2024-02-08 19:12:44 -06:00
f8af54aa06 Merge pull request 'develop' (#24) from develop into main
Reviewed-on: https://17th-gs.iceberg-gaming.com:5443/hizumi/MissionTemplate/pulls/24
2024-02-08 19:05:40 -06:00
hizumi
2c733f77df Merge branch 'develop' of https://iceberg-gaming.com:5443/hizumi/MissionTemplate into develop 2024-02-08 19:00:15 -06:00
8ed6b8a5c6 Merge pull request 'misc-improvements' (#23) from misc-improvements into develop
Reviewed-on: https://17th-gs.iceberg-gaming.com:5443/hizumi/MissionTemplate/pulls/23
2024-02-08 18:35:52 -06:00
1d7e1ede37 Merge branch 'develop' into misc-improvements 2024-02-08 18:35:36 -06:00
442cb0b0b2 bugfixing 2024-02-08 15:35:42 -08:00
2db018103c move local diary mgmt to common module, clarify clientInit complete msg 2024-02-08 15:04:22 -08:00
fba423e38d update mapcopy module with CBA events 2024-02-08 12:47:51 -08:00
7268d8fd50 change vehicle flag actions to use class inheritance instead of object 2024-02-08 12:01:51 -08:00
3217ec487d simplify resupply actions addition 2024-02-08 11:50:07 -08:00
7c903d1021 add some built in flags as options 2024-02-08 11:48:41 -08:00
hizumi
bbe798734a Update README.md
correct typo
2024-02-07 23:26:32 -06:00
hizumi
e372563e58 prepare v4.0.0 release 2024-02-07 23:25:23 -06:00
hizumi
8283f19b77 Update mission_settings.hpp
document and give a default example
2024-02-07 23:25:04 -06:00
02e97b3e0e Merge pull request 'develop' (#21) from develop into main
Reviewed-on: https://17th-gs.iceberg-gaming.com:5443/hizumi/MissionTemplate/pulls/21
2024-02-06 23:17:30 -06:00
34 changed files with 436 additions and 296 deletions

View File

@@ -4,7 +4,34 @@ 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).
## [3.2] - 2024-02-01
## [4.0.0] - 2024-02-07
Version 4 marks a massive rewrite due in whole to @IndigoFox by updating the internals of the framework into CBA macros and functions.
### Added
- Added ability for FBCB2 Assets to locate themselves on player local map
- Added various framework utitily functions
- Added ability for mission maker to allow spawning of resupply boxes from arsenal boxes
- Added CBA settings for resupply box spawning
- Added additional vehicle flags
- Addded Zeus module to fill vehicle ace cargo inventory with tracks/tires
### Changed
- Documented purpose of `missionSeries` parameter in `mission_settings.hpp`
- Moved internal functions into new framework directory structure
- Moved FBCB2 internal data structure into multiple defintion files
- Moved resupply boxes internal data structures into their own definiton file
- Moved player inventory internal data structure into its own defintion file
- Moved vehicle flags internal data structure into its own defitinion file
- Use player's preferred ACE color settings for medical triage icons
### Deleted
- Leftover resupply box code from before version 3.2.0 update
## [3.2.0] - 2024-02-01
### Added
@@ -62,7 +89,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
- Lowered garbage collection times and range for dead bodies
## [3.0] - 2023-05-03
## [3.0.0] - 2023-05-03
### Added
@@ -79,7 +106,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
- Remove `CfgRemoteExec` from `description.ext` as it has been deprecated as of Arma v1.54
## [2.2] - 2023-04-23
## [2.2.0] - 2023-04-23
### Added
@@ -93,7 +120,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
- Force `sideChat` CBA setting to 'disabled' on mission start by default
## [2.1] - 2023-04-12
## [2.1.0] - 2023-04-12
### Added
@@ -103,7 +130,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
- Allow `#admin` to enable or disable `sideChat` via CBA setting on a per mission file basis.
`Escape -> Configure -> Addon Options -> Server -> 17th Battalion -> Enable Side Chat`
## [2.0] -2023-04-12
## [2.0.0] -2023-04-12
### Added
@@ -113,7 +140,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
- mission.jpg to correct dimensions and optimize
## [1.9] - 2023-03-07
## [1.9.0] - 2023-03-07
### Added

View File

@@ -20,7 +20,7 @@ Once copied, the final structure should appear similar to the following:
├── mission.sqm
```
If you're building a mission for use in an op, please delete "aaFrameworkUtils" and "framework\x". These are for the purposes of development and add bloat to the mission download when players connect to your mission.
> **Note:** If you're building a mission for use and not actively developing code, the `aaFrameworkUtils` and `framework\x` directories **should be deleted**. *These are for the purposes of development and add size bloat to the mission download when players connect to your mission.*
After the requisite configuration file edits have been made, your mission is ready to be packed into a pbo for deployment.
@@ -45,6 +45,14 @@ The contents of the lower half of the file are where the mission maker is able t
This file will be displayed the client mission loading screen.
File should remain small *(under 300KiB)* and should optimally be `1024px by 512px` in resolution
## defines/
This directory contains the definition files use by the framework in various places. *Contents should not be edited*
## framework/
This directory contains the code for the mission framework. **Contents must not be edited.**
## images/
This directory is for organizational purposes for any images you wish to use in your mission
@@ -52,7 +60,7 @@ This directory is for organizational purposes for any images you wish to use in
## scripts/
This directory is for organizational purposes for any custom scripts you wish to use in your mission.
> **Note**: Scripts may need to be edited to account for their new location
> **Note:** Scripts may need to be edited to account for their new location
## sounds/
@@ -63,7 +71,8 @@ This directory is for organizational purposes for any custom scripts you wish to
This directory is for organizational purposes for textures files used by mission scripts.
## DEV NOTES
# Development Notes
All modules are broken apart as such in /framework. Client and server inits are managed in /framework/init.
@@ -99,7 +108,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.
- `init`:
- 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.
- `performance`:
- Contains functionality for monitoring and logging performance data.

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

@@ -12,7 +12,6 @@ class CfgFunctions {
class addRespawnChatHandler { postInit = 1; };
};
};
class PREFIX {
class ambience {
@@ -20,16 +19,6 @@ class CfgFunctions {
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) {
@@ -42,13 +31,13 @@ class CfgFunctions {
};
};
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";

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,8 +14,16 @@ 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);
@@ -28,7 +36,7 @@ call EFUNC(fbcb2_assets,initClient);
[
LEVEL_DEBUG,
QUOTE(COMPONENT),
"postInit complete",
"initClient complete",
[]
] 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"
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 = [
QGVAR(fileReinsertRequestAction),
"File Re-insert Request",
"\A3\ui_f\data\igui\cfg\simpleTasks\types\takeoff_ca.paa",
{ // statement
params ["_target", "_player", "_params"];
// find nearest base or location
private _base = [_player] call EFUNC(common,getNearestBase);
private _baseName = [_base] call EFUNC(common,getNameOfBase);
// send event to server
[QGVAR(fileReinsertRequest), [_player, _base]] call CBA_fnc_serverEvent;
// notify player their request was filed
[["Re-insert Request Filed"], [format["Location: %1", _baseName]]] call CBA_fnc_notify;
},
{ // condition
params ["_target", "_player", "_params"];
// find nearest base or location
private _base = [_player] call EFUNC(common,getNearestBase);
private _baseDistance = _player distance _base;
private _fileForReinsertAction = [
QGVAR(fileReinsertRequestAction),
"File Re-insert Request",
"\A3\ui_f\data\igui\cfg\simpleTasks\types\takeoff_ca.paa",
{ // statement
params ["_target", "_player", "_params"];
// find nearest base or location
private _base = [_player] call EFUNC(common,getNearestBase);
private _baseName = [_base] call EFUNC(common,getNameOfBase);
// send event to server
[QGVAR(fileReinsertRequest), [_player, _base]] call CBA_fnc_serverEvent;
// notify player their request was filed
[["Re-insert Request Filed"], [format["Location: %1", _baseName]]] call CBA_fnc_notify;
},
{ // condition
params ["_target", "_player", "_params"];
// find nearest base or location
private _base = [_player] call EFUNC(common,getNearestBase);
private _baseDistance = _player distance _base;
private _maxRangeToReady = missionNamespace getVariable [QGVAR(setting_maxRangeToReady), 400];
private _existingQueue = missionNamespace getVariable [QGVAR(reinsertionQueue), []];
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] &&
(_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;
// 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
[QGVAR(setting_enabled)] call CBA_settings_fnc_get &&
(_baseDistance < _maxRangeToReady) &&
not (_player in (_existingQueue apply {_x#0}))
}
] call ace_interact_menu_fnc_createAction;
[_classToAddActionsTo, 1, ["ACE_SelfActions"], _fileForReinsertAction, _useInheritance] call ace_interact_menu_fnc_addActionToClass;
private _removeFileForReinsertAction = [
QGVAR(removeReinsertRequestAction),
"Remove Re-insert Request",
"\A3\ui_f\data\igui\cfg\simpleTasks\types\land_ca.paa",
{ // statement
params ["_target", "_player", "_params"];
// send event to server
[QGVAR(removeReinsertRequest), [_player]] call CBA_fnc_serverEvent;
// notify player their request was rescinded
"Re-insert Request Rescinded" call CBA_fnc_notify;
},
{ // condition
params ["_target", "_player", "_params"];
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];
private _removeFileForReinsertAction = [
QGVAR(removeReinsertRequestAction),
"Remove Re-insert Request",
"\A3\ui_f\data\igui\cfg\simpleTasks\types\land_ca.paa",
{ // statement
params ["_target", "_player", "_params"];
// send event to server
[QGVAR(removeReinsertRequest), [_player]] call CBA_fnc_serverEvent;
// notify player their request was rescinded
"Re-insert Request Rescinded" call CBA_fnc_notify;
},
{ // condition
params ["_target", "_player", "_params"];
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
[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"
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 = [
QGVAR(checkReinsertQueue),
"[PILOT] Check Re-insert Queue",
"\A3\ui_f\data\igui\cfg\simpleTasks\types\land_ca.paa",
{
params ["_target", "_player", "_params"];
// request notification from the server
call FUNC(requestShowQueue);
// reset last check time
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;
private _checkReinsertQueueAction = [
QGVAR(checkReinsertQueue),
"[PILOT] Check Re-insert Queue",
"\A3\ui_f\data\igui\cfg\simpleTasks\types\land_ca.paa",
{
params ["_target", "_player", "_params"];
// request notification from the server
call FUNC(requestShowQueue);
// reset last check time
localNamespace setVariable [QGVAR(lastReinsertQueueCheck), diag_tickTime];
},
{
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);
] 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,7 @@ call FUNC(addArsenalObjectSpawnBoxActions);
[
LEVEL_DEBUG,
QUOTE(COMPONENT),
"postInit complete",
"initClient complete",
[]
] call EFUNC(common,log);

View File

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

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 {
@@ -16,94 +16,95 @@ private _flagCategoryCfgs = (_vehicleFlagsCfg >> "FlagCategories") call BIS_fnc_
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
// create the root action
////////////////////////////////////////////////////////////////////////
[_parentClass, "InitPost", {
////////////////////////////////////////////////////////////////////////
// create the root action
////////////////////////////////////////////////////////////////////////
private _rootActionID = "SetVehicleFlag";
private _flagRootAction = [
_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;
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
{true}, // statement
{
params ["_target", "_player", "_params"];
// _params params ["_parentActionID", "_flagCategories"];
}, 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;
[
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

@@ -6,7 +6,8 @@ onLoadMission = "THIS APPEARS BELOW THE LOADING SCREEN IMAGE";
briefingName = "THIS IS THE NAME ON THE #MISSIONS LIST";
overviewText = "THIS IS WHERE YOU DESCRIBE THE MISSION IN THE #MISSION LIST";
missionSeries = "";
// The name for the series of missions of your campaign. Used for organizational and search purposes
missionSeries = "MY SERIES NAME";
// activate via #ace-fortify west base 2000