Compare commits

...

13 Commits

Author SHA1 Message Date
hizumi
1bdbdd1273 Update create-testing-snapshot.yaml
All checks were successful
Generate testing snapshot / Create testing release (push) Successful in 30s
2024-02-15 16:58:17 -06:00
hizumi
d4c01c6554 Update create-testing-snapshot.yaml
Some checks failed
Generate testing snapshot / Create testing release (push) Failing after 28s
2024-02-15 16:51:06 -06:00
hizumi
2866153654 Update create-testing-snapshot.yaml
All checks were successful
Generate testing snapshot / Create testing release (push) Successful in 29s
2024-02-15 16:40:37 -06:00
hizumi
23dc0656a6 Update create-testing-snapshot.yaml
Some checks failed
Generate testing snapshot / Create testing release (push) Failing after 34s
2024-02-15 16:36:07 -06:00
ef83d41a32 Merge pull request 'track-unconscious-duration-in-respawn-msg' (#30) from track-unconscious-duration-in-respawn-msg into develop
All checks were successful
Generate testing snapshot / Create testing release (push) Successful in 30s
Reviewed-on: hizumi/MissionTemplate#30
Reviewed-by: hizumi <hizumi@noreply.iceberg-gaming.com>
2024-02-14 02:02:05 -06:00
e76da62b7f Merge branch 'develop' into track-unconscious-duration-in-respawn-msg 2024-02-14 01:58:47 -06:00
hizumi
aaad8675a6 Create create-testing-snapshot.yaml
All checks were successful
Generate testing snapshot / Create testing release (push) Successful in 33s
move testing workflow to develop branch
2024-02-14 01:56:04 -06:00
c00f1b0e17 Merge pull request 'adds default bases + allows mms to set custom waypoints for microdagr' (#26) from add-microdagr-waypoints into develop
Reviewed-on: hizumi/MissionTemplate#26
Reviewed-by: hizumi <hizumi@noreply.iceberg-gaming.com>
2024-02-14 01:53:08 -06:00
9f89ec12d5 moves empty group cleanup run on all machines to perf module 2024-02-13 23:13:23 -08:00
e55c9a0751 trial implementation 2024-02-13 20:50:09 -08:00
5114ae334f add basic mission_settings check w notify in 3den preview 2024-02-13 11:02:42 -08:00
296f945ea3 adds default bases + allows mms to set custom waypoints for microdagr 2024-02-12 23:51:07 -08:00
fdcf70b713 revert CfgFunctions to nested include 2024-02-12 19:32:19 -08:00
15 changed files with 447 additions and 166 deletions

View File

@@ -0,0 +1,71 @@
name: Generate testing snapshot
on:
push:
branches: [develop]
jobs:
Clean:
name: Create testing release
runs-on: windows
steps:
- name: Diagnostics
run: |
echo "repository: ${{ gitea.repository }}"
echo "ref: ${{ gitea.ref }}"
echo "ref_name: ${{ gitea.ref_name }}"
echo "sha: ${{ gitea.sha }}"
echo "api_url: ${{ gitea.api_url }}"
echo "workflow: ${{ gitea.workflow }}"
- name: Checkout framework
uses: actions/checkout@v3
with:
path: MissionFramework
- name: Clean framework
run: |
Remove-Item -Recurse MissionFramework\aaFrameworkUtils
Remove-Item -Recurse MissionFramework\framework\x
Remove-Item -Recurse MissionFramework\.git*
- name: Backup artifacts from runner
uses: actions/upload-artifact@v3
with:
name: framework-test-snapshot
path: MissionFramework
- name: Create archive
run: Compress-Archive MissionFramework framework-test-snapshot.zip
- name: Delete old testing-release release
run: |
$headers = @{
"accept" = "application/json"
"Authorization" = "token ${{secrets.RELEASE_TOKEN}}"
}
Invoke-WebRequest -Uri "${{ gitea.api_url }}/repos/${{ gitea.repository }}/releases/tags/testing-release" -Method Delete -Headers $headers
- name: Delete old testing-release tag
run: |
$headers = @{
"accept" = "application/json"
"Authorization" = "token ${{secrets.RELEASE_TOKEN}}"
}
Invoke-WebRequest -Uri "${{ gitea.api_url }}/repos/${{ gitea.repository }}/tags/testing-release" -Method Delete -Headers $headers
- name: Create new testing-release tag
run: |
$headers = @{
"accept" = "application/json"
"Authorization" = "token ${{secrets.RELEASE_TOKEN}}"
}
Invoke-WebRequest -Uri "${{ gitea.api_url }}/repos/${{ gitea.repository }}/tags" -Method Post -Headers $headers -ContentType "application/json" -Body "{`"message`": `"testing-release`", `"tag_name`": `"testing-release`", `"target`": `"${{ gitea.sha }}`"}"
- name: Create new testing-release
uses: https://gitea.com/actions/gitea-release-action@v1.1.6
with:
tag_name: 'testing-release'
name: 'testing-release'
prerelease: true
files: |-
framework-test-snapshot.zip

View File

@@ -95,7 +95,9 @@ class Params
// CfgFunctions // CfgFunctions
#include "framework\CfgFunctions.hpp" class CfgFunctions {
#include "framework\CfgFunctions.hpp"
};

View File

@@ -1,180 +1,181 @@
#include "script_mod.hpp" #include "script_mod.hpp"
class CfgFunctions { class DOUBLES(PREFIX,init) {
class functions {
class DOUBLES(PREFIX,init) { file = "framework\init\functions";
class functions { class initServer { postInit = 1;};
file = "framework\init\functions"; class initClient { postInit = 1;};
class initServer { postInit = 1;}; class setDefaults {};
class initClient { postInit = 1;}; class addAARChatHandler {};
class setDefaults { postInit = 1; }; class addRespawnChatHandler {};
class addAARChatHandler { postInit = 1; }; class checkMissionSettings {};
class addRespawnChatHandler { postInit = 1; };
};
}; };
};
class PREFIX {
class ambience { class PREFIX {
file = "framework\ambience"; class ambience {
class flakInitVehicle {}; file = "framework\ambience";
class flakEH {}; class flakInitVehicle {};
}; class flakEH {};
}; };
};
class DOUBLES(PREFIX,client) { class DOUBLES(PREFIX,client) {
class functions { class functions {
file = "framework\client\functions"; file = "framework\client\functions";
class bindEmptyGroupGarbageCleanup { postInit = 1; }; class initClient {};
class bindEventHandlers { postInit = 1; }; class addMicroDAGRWaypoints {};
class bindVehicleActions { postInit = 1; }; class addZenModules {};
class addZenModules {postInit = 1;}; class bindEventHandlers {};
}; class bindUnconsciousListener {};
class bindVehicleActions {};
}; };
};
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 createOrUpdateDiaryRecord {};
class getApprovedAssetsCfg {}; class getApprovedAssetsCfg {};
class getBattalionCfg {}; class getBattalionCfg {};
class getNameOfBase {}; class getNameOfBase {};
class getNearestBase {}; class getNearestBase {};
class log {}; class log {};
class checkPlayerInventory {}; class checkPlayerInventory {};
class logSettingChanged {}; class logSettingChanged {};
class padString {}; class padString {};
class recurseSubclasses {}; class recurseSubclasses {};
};
}; };
};
class DOUBLES(PREFIX,fbcb2_assets) { class DOUBLES(PREFIX,fbcb2_assets) {
class functions { class functions {
file = "framework\fbcb2_assets\functions"; file = "framework\fbcb2_assets\functions";
class addCBASettings {preInit=1;}; class addCBASettings {preInit=1;};
class initServer {}; class initServer {};
class initClient {}; class initClient {};
class getCallsignFromClassname {}; class getCallsignFromClassname {};
class getCurrentAssetsByBase {}; class getCurrentAssetsByBase {};
class getInventory {}; class getInventory {};
class getMagsForWeapon {}; class getMagsForWeapon {};
class getStartingAndCurrentAssets {}; class getStartingAndCurrentAssets {};
class getStartingAssetsByBase {}; class getStartingAssetsByBase {};
class getVehicleData {}; class getVehicleData {};
class getWeaponry {}; class getWeaponry {};
class hintAllApprovedAssets {}; class hintAllApprovedAssets {};
class isAssetInRangeOfBase {}; class isAssetInRangeOfBase {};
class removeAssetDiaryRecords {}; class removeAssetDiaryRecords {};
class removeMarkersOnMap {}; class removeMarkersOnMap {};
class showMarkersOnMap {}; class showMarkersOnMap {};
class updateAssetDiary {}; class updateAssetDiary {};
class updateAssetsByBase {}; class updateAssetsByBase {};
};
}; };
};
class DOUBLES(PREFIX,fbcb2_main) { class DOUBLES(PREFIX,fbcb2_main) {
class functions { class functions {
file = "framework\fbcb2_main\functions"; file = "framework\fbcb2_main\functions";
class initClient {}; class initClient {};
class addEnvironmentRecord {}; class addEnvironmentRecord {};
class addFrequenciesRecord {}; class addFrequenciesRecord {};
class addSignalColorsRecord {}; class addSignalColorsRecord {};
};
class util {
file = "framework\fbcb2_main\util";
class formatRadioElementForDiary {};
class generateElementFrequencyRecordText {};
};
}; };
class util {
class DOUBLES(PREFIX,mapcopy) { file = "framework\fbcb2_main\util";
class functions { class formatRadioElementForDiary {};
file = "framework\mapcopy\functions"; class generateElementFrequencyRecordText {};
class addCBASettings {preInit=1;};
class initClient {};
class getMapMarkers {};
class loadMapMarkers {};
class mapMarkerToString {};
class stringToMapMarker {};
};
}; };
};
class DOUBLES(PREFIX,performance) { class DOUBLES(PREFIX,mapcopy) {
class functions { class functions {
file = "framework\performance\functions"; file = "framework\mapcopy\functions";
class addCBASettings {preInit=1;}; class addCBASettings {preInit=1;};
class addDNI_PlayerFPS { postInit = 1; }; class initClient {};
class getMapMarkers {};
// PFHs managed in addCBASettings onChange code class loadMapMarkers {};
class addClientStatsPFH {}; class mapMarkerToString {};
class calculateClientStats {}; class stringToMapMarker {};
class addServerStatsPFH {};
class calculateServerStats {};
};
}; };
};
class DOUBLES(PREFIX,reinsert) { class DOUBLES(PREFIX,performance) {
class functions { class functions {
file = "framework\reinsert\functions"; file = "framework\performance\functions";
class addCBASettings {preInit=1;}; class addCBASettings {preInit=1;};
}; class addDNI_PlayerFPS {postInit = 1;};
class server {
file = "framework\reinsert\server"; // PFHs managed in addCBASettings onChange code
class initServer {}; class addClientStatsPFH {};
class addToQueue {}; class calculateClientStats {};
class globalShowQueue {}; class addServerStatsPFH {};
class removeFromQueue {}; class calculateServerStats {};
class returnReinsertQueueNotification {}; class addEmptyGroupCleanupPFH {};
class validateQueue {};
};
class client {
file = "framework\reinsert\client";
class initClient {};
class addAceSelfActions {};
class addCheckQueueSelfAction {};
class requestShowQueue {};
};
}; };
};
class DOUBLES(PREFIX,resupply) { class DOUBLES(PREFIX,reinsert) {
class functions { class functions {
file = "framework\resupply\functions"; file = "framework\reinsert\functions";
class addCBASettings {preInit=1;}; class addCBASettings {preInit=1;};
class initClient {};
class createBox {};
class getSupplyCratesCfg {};
class addArsenalObjectSpawnBoxActions {};
};
}; };
class server {
class DOUBLES(PREFIX,triageIcons) { file = "framework\reinsert\server";
class functions { class initServer {};
file = "framework\triageIcons\functions"; class addToQueue {};
class addCBASettings {preInit=1;}; class globalShowQueue {};
class initClient {}; class removeFromQueue {};
class addDrawIconsPFH {}; class returnReinsertQueueNotification {};
class addGetEntitiesPFH {}; class validateQueue {};
class updateColors {};
};
}; };
class client {
class DOUBLES(PREFIX,vehicleFlags) { file = "framework\reinsert\client";
class functions { class initClient {};
file = "framework\vehicleFlags\functions"; class addAceSelfActions {};
class initClient {}; class addCheckQueueSelfAction {};
class getActionsFlagCategories {}; class requestShowQueue {};
class getVehicleFlagsCfg {};
class isClassExcluded {};
};
}; };
};
class DOUBLES(PREFIX,zeus) { class DOUBLES(PREFIX,resupply) {
class functions { class functions {
file = "framework\zeus\functions"; file = "framework\resupply\functions";
class initClient {}; class addCBASettings {preInit=1;};
class addZenModules {}; class initClient {};
}; class createBox {};
class getSupplyCratesCfg {};
class addArsenalObjectSpawnBoxActions {};
};
};
class DOUBLES(PREFIX,triageIcons) {
class functions {
file = "framework\triageIcons\functions";
class addCBASettings {preInit=1;};
class initClient {};
class addDrawIconsPFH {};
class addGetEntitiesPFH {};
class updateColors {};
};
};
class DOUBLES(PREFIX,vehicleFlags) {
class functions {
file = "framework\vehicleFlags\functions";
class initClient {};
class getActionsFlagCategories {};
class getVehicleFlagsCfg {};
class isClassExcluded {};
};
};
class DOUBLES(PREFIX,zeus) {
class functions {
file = "framework\zeus\functions";
class initClient {};
class addZenModules {};
}; };
}; };

View File

@@ -0,0 +1,59 @@
#include "..\script_component.hpp"
// adds default base locations to players' microDAGR as waypoints
if (!hasInterface) exitWith {};
[{!isNull player}, {
// add base locations (respawn modules)
{
private _wpName = [_x] call EFUNC(common,getNameOfBase);
private _posASL = getPosASL _x;
[_wpName, _posASL] call ace_microdagr_fnc_deviceAddWaypoint;
} forEach GVARMAIN(baseObjects);
// add custom waypoints from mission_settings.hpp
private _customWaypoints = [missionConfigFile >> "custom_microdagr_waypoints", "ARRAY", []] call CBA_fnc_getConfigEntry;
{
_x params [
["_wpName", ""],
["_pos", [0, 0, 0], [[], ""]],
["_object", "", [""]]
];
private _realPos = nil;
// if pos was provided, process
if (count _pos > 0) then {
if (typeName _pos == "STRING") then {
_realPos = [_pos, true] call ACE_common_fnc_getMapPosFromGrid;
_realPos set [2, getTerrainHeightASL _realPos];
} else {_realPos = _pos;};
};
// if object was provided, process and override any pos
if (count _object > 0) then {
// object is provided as a string variable name
private _realObject = missionNamespace getVariable _object;
if (isNull _realObject) then {
[
LEVEL_WARNING,
QUOTE(COMPONENT),
format["Invalid object for custom microDAGR waypoint: %1", _wpName],
[["name", _wpName], ["pos", _pos], ["object", _object]]] call EFUNC(common,log);
continue;
};
_realPos = getPosASL (missionNamespace getVariable _object);
};
if (isNil "_realPos") then {
[
LEVEL_WARNING,
QUOTE(COMPONENT),
format["Invalid waypoint position for custom microDAGR waypoint: %1", _wpName],
[["name", _wpName], ["pos", _pos], ["object", _object]]] call EFUNC(common,log);
continue;
};
[_wpName, _realPos] call ace_microdagr_fnc_deviceAddWaypoint;
} forEach _customWaypoints;
}] call CBA_fnc_waitUntilAndExecute;
nil;

View File

@@ -7,11 +7,20 @@ player addEventHandler["Respawn",
params ["_unit", "_corpse"]; params ["_unit", "_corpse"];
private _killer = _corpse getVariable ["ace_medical_causeOfDeath", "#scripted"]; private _killer = _corpse getVariable ["ace_medical_causeOfDeath", "#scripted"];
if (_killer == "respawn_button") then { if (_killer == "respawn_button") then {
private _timeWentUnconscious = _unit getVariable [QGVARMAIN(lastTimeKnockedOut), -1];
private _durationSpentUnconscious = diag_tickTime - _timeWentUnconscious;
[ [
LEVEL_INFO, LEVEL_INFO,
QUOTE(COMPONENT), QUOTE(COMPONENT),
"RESPAWNED WHILE UNCONSCIOUS", "RESPAWNED WHILE UNCONSCIOUS",
[_unit] call EFUNC(common,addPlayerInfoToArray) [_unit, [[
"durationSpentUnconscious",
(if (_timeWentUnconscious > - 1) then {
_durationSpentUnconscious
} else {
-1
})
]]] call EFUNC(common,addPlayerInfoToArray)
] remoteExec [QEFUNC(common,log), 2]; ] remoteExec [QEFUNC(common,log), 2];
// format["%1 was unconscious then clicked the respawn button", name _unit] remoteExec["systemChat", 0]; // format["%1 was unconscious then clicked the respawn button", name _unit] remoteExec["systemChat", 0];
}; };

View File

@@ -0,0 +1,13 @@
#include "..\script_component.hpp"
if (!hasInterface) exitWith {};
["ace_medical_knockOut", { // local event that's also used directly by the ACE medical statemachine
private _unit = _this;
_this setVariable [QGVARMAIN(lastTimeKnockedOut), diag_tickTime];
}] call CBA_fnc_addEventHandler;
["ace_medical_WakeUp", { // local event that's also used directly by the ACE medical statemachine
private _unit = _this;
_this setVariable [QGVARMAIN(lastTimeKnockedOut), nil];
}] call CBA_fnc_addEventHandler;

View File

@@ -0,0 +1,23 @@
#include "..\script_component.hpp"
if (!hasInterface) exitWith {};
call FUNC(addMicroDAGRWaypoints);
call FUNC(addZenModules);
call FUNC(bindEventHandlers);
call FUNC(bindVehicleActions);
// add listener that tracks when the player goes unconscious and saves a variable with time
call FUNC(bindUnconsciousListener);
[
LEVEL_DEBUG,
QUOTE(COMPONENT),
"initClient complete",
[]
] call EFUNC(common,log);
localNamespace setVariable [QGVAR(complete), true];
nil;

View File

@@ -1,5 +1,7 @@
#include "..\script_component.hpp" #include "..\script_component.hpp"
if (!hasInterface) exitWith {};
[ [
"saveaar", "saveaar",
{ {

View File

@@ -1,17 +1,29 @@
#include "..\script_component.hpp" #include "..\script_component.hpp"
if (!hasInterface) exitWith {};
[ [
"respawn", "respawn",
{ {
_clientID = _thisArgs select 0; _clientID = _thisArgs select 0;
player setDamage 1; player setDamage 1;
private _timeWentUnconscious = player getVariable [QGVARMAIN(lastTimeKnockedOut), -1];
private _durationSpentUnconscious = diag_tickTime - _timeWentUnconscious;
// log to server RPT // log to server RPT
[ [
LEVEL_INFO, LEVEL_INFO,
QUOTE(COMPONENT), QUOTE(COMPONENT),
"CHAT COMMAND RESPAWN", "CHAT COMMAND RESPAWN",
[player] call EFUNC(common,addPlayerInfoToArray) [player, [[
"durationSpentUnconscious",
(if (_timeWentUnconscious > - 1) then {
_durationSpentUnconscious
} else {
-1
})
]]] call EFUNC(common,addPlayerInfoToArray)
] remoteExec [QEFUNC(common,log), 2]; ] remoteExec [QEFUNC(common,log), 2];
// systemChat to all remote machines // systemChat to all remote machines

View File

@@ -0,0 +1,41 @@
#include "..\script_component.hpp"
if (!hasInterface || !is3DENPreview) exitWith {};
private _warningText = [];
if (getText(missionConfigFile >> "author") in ["MISSION AUTHOR", ""]) then {
_warningText pushBack "<t font='EtelkaMonospacePro' size='0.7'>mission_settings\author</t> is blank or default!";
};
if (getText(missionConfigFile >> "onLoadName") in ["THIS APPEARS ON TOP OF THE LOADING SCREEN IMAGE", ""]) then {
_warningText pushBack "<t font='EtelkaMonospacePro' size='0.7'>mission_settings\onLoadName</t> is blank or default!";
};
if (getText(missionConfigFile >> "briefingName") in ["THIS IS THE NAME ON THE #MISSIONS LIST", ""]) then {
_warningText pushBack "<t font='EtelkaMonospacePro' size='0.7'>mission_settings\briefingName</t> is blank or default!";
};
if (getText(missionConfigFile >> "overviewText") in ["THIS IS WHERE YOU DESCRIBE THE MISSION IN THE #MISSION LIST", ""]) then {
_warningText pushBack "<t font='EtelkaMonospacePro' size='0.7'>mission_settings\overviewText</t> is blank or default!";
};
if (getText(missionConfigFile >> "missionSeries") in ["MY SERIES NAME", ""]) then {
_warningText pushBack "<t font='EtelkaMonospacePro' size='0.7'>mission_settings\missionSeries</t> is blank or default!";
};
if (count GVARMAIN(baseObjects) isEqualTo 0) then {
_warningText pushBack "No respawn points placed!";
};
if (count _warningText > 0) then {
[{
if (isNull (call BIS_fnc_displayMission)) exitWith {};
(_this#0) spawn {
[_this joinString "<br/>", "Issues found!", true, false] call BIS_fnc_guiMessage;
};
[_this#1] call CBA_fnc_removePerFrameHandler;
}, 1, _warningText] call CBA_fnc_addPerFrameHandler;
};
nil;

View File

@@ -1,6 +1,6 @@
#include "..\script_component.hpp" #include "..\script_component.hpp"
if ( !hasInterface ) exitWith {}; if (!hasInterface) exitWith {};
["milsim_logText", { ["milsim_logText", {
params [["_strArray", [""], [[]]]]; params [["_strArray", [""], [[]]]];
@@ -14,6 +14,13 @@ waitUntil {!isNil QGVARMAIN(complete)};
["InitializePlayer", [player, true]] call BIS_fnc_dynamicGroups; ["InitializePlayer", [player, true]] call BIS_fnc_dynamicGroups;
// run primary init functions
call FUNC(addAARChatHandler);
call FUNC(addRespawnChatHandler);
call FUNC(setDefaults);
call FUNC(checkMissionSettings);
// Initialize a holder for managing local diary records // Initialize a holder for managing local diary records
// store records in format: // store records in format:
// [subject, [ // [subject, [
@@ -23,6 +30,7 @@ EGVAR(common,diaryRecords) = createHashMap;
// initialize other modules // initialize other modules
call EFUNC(client,initClient);
call EFUNC(mapcopy,initClient); call EFUNC(mapcopy,initClient);
call EFUNC(reinsert,initClient); call EFUNC(reinsert,initClient);
call EFUNC(resupply,initClient); call EFUNC(resupply,initClient);
@@ -33,6 +41,8 @@ call EFUNC(fbcb2_main,initClient);
call EFUNC(fbcb2_assets,initClient); call EFUNC(fbcb2_assets,initClient);
call FUNC(checkMissionSettings);
[ [
LEVEL_DEBUG, LEVEL_DEBUG,
QUOTE(COMPONENT), QUOTE(COMPONENT),

View File

@@ -1,5 +1,7 @@
#include "..\script_component.hpp" #include "..\script_component.hpp"
if (!hasInterface) exitWith {};
enableSaving[false, false]; enableSaving[false, false];
enableRadio false; enableRadio false;

View File

@@ -1,5 +1,27 @@
#include "..\script_component.hpp" #include "..\script_component.hpp"
[
QGVAR(emptyGroupCleanup_enable),
"CHECKBOX",
"Empty Group Cleanup Enabled",
[QUOTE(SETTINGS_GROUP_NAME), QUOTE(COMPONENT_BEAUTIFIED)],
true,
true,
{
params ["_value"];
[
QGVAR(emptyGroupCleanup_enable),
_value
] call EFUNC(common,logSettingChanged);
if (!isNull (missionNamespace getVariable [QGVAR(emptyGroupCleanupPFH), locationNull])) then {
deleteLocation GVAR(emptyGroupCleanupPFH);
};
call FUNC(addEmptyGroupCleanupPFH);
}
] call CBA_fnc_addSetting;
//--------------------- //---------------------
// Server CPS // Server CPS
//--------------------- //---------------------

View File

@@ -7,7 +7,7 @@
[] []
] call EFUNC(common,log); ] call EFUNC(common,log);
_emptyGroupPFH = [ GVAR(emptyGroupCleanupPFH) = [
{ {
{ {
if (local _x) then { if (local _x) then {
@@ -19,7 +19,7 @@ _emptyGroupPFH = [
}, },
300, 300,
[], [],
{ { // on creation
[ [
LEVEL_INFO, LEVEL_INFO,
QUOTE(COMPONENT), QUOTE(COMPONENT),
@@ -27,15 +27,16 @@ _emptyGroupPFH = [
[] []
] call EFUNC(common,log); ] call EFUNC(common,log);
}, },
{ [ { // on deletion
[
LEVEL_INFO, LEVEL_INFO,
QUOTE(COMPONENT), QUOTE(COMPONENT),
"Empty group deletion PFH unloaded", "Empty group deletion PFH unloaded",
[] []
] call EFUNC(common,log); ] call EFUNC(common,log);
}, },
{ true }, { (missionNamespace getVariable [QGVAR(emptyGroupCleanup_enable), false]) },
{ false }, { not (missionNamespace getVariable [QGVAR(emptyGroupCleanup_enable), false]) },
[] []
] call CBA_fnc_createPerFrameHandlerObject; ] call CBA_fnc_createPerFrameHandlerObject;

View File

@@ -9,8 +9,21 @@ overviewText = "THIS IS WHERE YOU DESCRIBE THE MISSION IN THE #MISSION LIST";
// The name for the series of missions of your campaign. Used for organizational and search purposes // The name for the series of missions of your campaign. Used for organizational and search purposes
missionSeries = "MY SERIES NAME"; missionSeries = "MY SERIES NAME";
// activate via #ace-fortify west base 2000
// Add waypoints to players' MicroDAGR devices
// respawn locations (bases) are added by default, don't put them here
custom_microdagr_waypoints[] = {
// the first element is the waypoint name
// the second element is the position of the waypoint - you may use a string for map grid (up to 10 digit) or an array for {X, Y} coordinates
// the third element is optional - provide the variable name of an object if you want to use its initial position instead
// {"WAYPOINT NAME", {POSITION <[x,y]>}, OBJECT <objNull>},
// EXAMPLES:
// {"KAVALA HOSPITAL", {1234.56, 7890.12}, ""},
// {"CAMP TEMPEST", "03421460, ""},
// {"MY CUSTOM OBJECT", {}, "myCustomObject"}
};
// activate via #ace-fortify west base 2000
class ACEX_Fortify_Presets { class ACEX_Fortify_Presets {
class base { class base {
displayName = "Ken Custom"; displayName = "Ken Custom";