Compare commits

..

30 Commits

Author SHA1 Message Date
f3c95322e9 change respawn button use warning to use ace_killed CBA event
All checks were successful
Generate testing snapshot / Create testing release (push) Successful in 41s
2024-02-19 16:11:42 -08:00
7d10d2622d adds leaflet support and missionGroup param for missionProfileNamespace 2024-02-19 16:11:10 -08:00
a20f477ee0 add better custom script support
All checks were successful
Generate testing snapshot / Create testing release (push) Successful in 37s
2024-02-19 09:46:06 -08:00
c29e46d5f7 Merge branch 'develop' of https://gitea.iceberg-gaming.com/hizumi/MissionTemplate into develop
All checks were successful
Generate testing snapshot / Create testing release (push) Successful in 40s
2024-02-16 19:05:27 -08:00
de074b62f2 make sure last time knocked unconscious variable is visible to all 2024-02-16 19:05:14 -08:00
hizumi
57c012195a Update create-testing-snapshot.yaml
All checks were successful
Generate testing snapshot / Create testing release (push) Successful in 30s
2024-02-15 18:24:19 -06:00
hizumi
d71ba9e3bd Update create-testing-snapshot.yaml
Some checks failed
Generate testing snapshot / Create testing release (push) Failing after 11s
2024-02-15 18:11:41 -06:00
hizumi
32491da46f Update create-testing-snapshot.yaml
Some checks failed
Generate testing snapshot / Create testing release (push) Failing after 1s
2024-02-15 18:07:52 -06:00
hizumi
94814b6d07 Update create-testing-snapshot.yaml
Some checks failed
Generate testing snapshot / Create testing release (push) Failing after 1s
2024-02-15 18:06:55 -06:00
hizumi
d2a557dda1 Update create-testing-snapshot.yaml
Some checks failed
Generate testing snapshot / Create testing release (push) Failing after 1s
2024-02-15 18:04:15 -06:00
hizumi
81f4bb4d48 Update create-testing-snapshot.yaml
Some checks failed
Generate testing snapshot / Create testing release (push) Failing after 36s
2024-02-15 17:52:16 -06:00
hizumi
6f5a0ca523 Update create-testing-snapshot.yaml
Some checks failed
Generate testing snapshot / Create testing release (push) Failing after 29s
2024-02-15 17:49:13 -06:00
hizumi
4eae553c6d Update create-testing-snapshot.yaml
Some checks failed
Generate testing snapshot / Create testing release (push) Failing after 29s
2024-02-15 17:45:05 -06:00
hizumi
3194409192 Update create-testing-snapshot.yaml
Some checks failed
Generate testing snapshot / Create testing release (push) Failing after 30s
2024-02-15 17:43:54 -06:00
293a050027 Merge branch 'develop' of https://gitea.iceberg-gaming.com/hizumi/MissionTemplate into develop
All checks were successful
Generate testing snapshot / Create testing release (push) Successful in 33s
2024-02-15 15:13:22 -08:00
d2758b7570 adds drawicon3d wrapper from Hizumi and status for vflag use 2024-02-15 15:13:04 -08:00
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
4fb0ea9a15 rework PFH to client module, triageIcons and vehicleFlags point there 2024-02-15 13:54:10 -08: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
33 changed files with 802 additions and 341 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

39
custom_leaflets.hpp Normal file
View File

@@ -0,0 +1,39 @@
// This contains custom definitions for leaflets. It is not required to set this up, but you're welcome to if you want to use them.
// To use this, configure one or more of the below. Then use the pylon editor of a drone in EDEN to add the appropriate magazine type (like 1Rnd_Leaflets_Custom_01_F) to the drone. Then, when the drone is flying, do `drone1 fire "1Rnd_Leaflets_Custom_01_F";` to drop the leaflets. The leaflet will then be shown in the world, and can be picked up by players to read the text and see the image.
class Custom_01 // configuration for 1Rnd_Leaflets_Custom_01_F
{
text = "Leaflet text"; // text shown when previewing the leaflet full-screen. Ideally should be localized, so even player who cannot read the image can get the information
texture = "images\leaflets\leaflet_custom_01.paa"; // leaflet texture shown when previewing the leaflet full-screen
};
class Custom_02 // configuration for 1Rnd_Leaflets_Custom_02_F
{
text = "Leaflet text"; // text shown when previewing the leaflet full-screen. Ideally should be localized, so even player who cannot read the image can get the information
texture = "images\leaflets\leaflet_custom_02.paa"; // leaflet texture shown when previewing the leaflet full-screen
};
class Custom_03 // configuration for 1Rnd_Leaflets_Custom_03_F
{
text = "Leaflet text"; // text shown when previewing the leaflet full-screen. Ideally should be localized, so even player who cannot read the image can get the information
texture = "images\leaflets\leaflet_custom_03.paa"; // leaflet texture shown when previewing the leaflet full-screen
};
class Custom_04 // configuration for 1Rnd_Leaflets_Custom_04_F
{
text = "Leaflet text"; // text shown when previewing the leaflet full-screen. Ideally should be localized, so even player who cannot read the image can get the information
texture = "images\leaflets\leaflet_custom_04.paa"; // leaflet texture shown when previewing the leaflet full-screen
};
class Custom_05 // configuration for 1Rnd_Leaflets_Custom_05_F
{
text = "Leaflet text"; // text shown when previewing the leaflet full-screen. Ideally should be localized, so even player who cannot read the image can get the information
texture = "images\leaflets\leaflet_custom_05.paa"; // leaflet texture shown when previewing the leaflet full-screen
};
class Custom_06 // configuration for 1Rnd_Leaflets_Custom_06_F
{
text = "Leaflet text"; // text shown when previewing the leaflet full-screen. Ideally should be localized, so even player who cannot read the image can get the information
texture = "images\leaflets\leaflet_custom_06.paa"; // leaflet texture shown when previewing the leaflet full-screen
};

11
custom_scripts.hpp Normal file
View File

@@ -0,0 +1,11 @@
// This file's contents will be included in the mission's CfgFunctions section, and serves to give you a place to define custom functions from files you've placed in /scripts.
class milsim_scripts {
class functions {
file = "scripts";
// Add your custom functions here, like so:
// class init {postInit = 1;}; // refers to scripts/fn_init.sqf. postInit=1 means it will be run on each machine when they're done loading the mission.
// class customFunction1 {}; // refers to the file scripts/fn_customFunction1.sqf, and is called as milsim_scripts_fnc_customFunction1
// class customFunction2 {}; // refers to the file scripts/fn_customFunction2.sqf, and is called as milsim_scripts_fnc_customFunction2
};
};

View File

@@ -89,15 +89,16 @@ minPlayerDistance = 500;
//-------------------------------------------BASE SETTINGS---------------------------------------------------------------//
class Params
{
class Params {};
class CfgFunctions {
#include "framework\CfgFunctions.hpp"
#include "custom_scripts.hpp"
};
// CfgFunctions
#include "framework\CfgFunctions.hpp"
class CfgLeaflets {
#include "custom_leaflets.hpp"
};
class CfgDebriefingSections {
class acex_killTracker {

View File

@@ -1,56 +1,62 @@
#include "script_mod.hpp"
class CfgFunctions {
class DOUBLES(PREFIX,init) {
class DOUBLES(PREFIX,init) {
class functions {
file = "framework\init\functions";
class initServer { postInit = 1;};
class initClient { postInit = 1;};
class setDefaults { postInit = 1; };
class addAARChatHandler { postInit = 1; };
class addRespawnChatHandler { postInit = 1; };
};
class setDefaults {};
class addAARChatHandler {};
class addRespawnChatHandler {};
class checkMissionSettings {};
};
};
class PREFIX {
class PREFIX {
class ambience {
file = "framework\ambience";
class flakInitVehicle {};
class flakEH {};
};
};
};
class DOUBLES(PREFIX,client) {
class DOUBLES(PREFIX,client) {
class functions {
file = "framework\client\functions";
class bindEmptyGroupGarbageCleanup { postInit = 1; };
class bindEventHandlers { postInit = 1; };
class bindVehicleActions { postInit = 1; };
class addZenModules {postInit = 1;};
};
class initClient {};
class addMicroDAGRWaypoints {};
class addZenModules {};
class bindEventHandlers {};
class bindUnconsciousListener {};
class bindVehicleActions {};
class addGetNearMenPFH {};
class addDraw3DPFH {};
class registerPFHCode {};
class clearPFHCode {};
};
};
class DOUBLES(PREFIX,common) {
class DOUBLES(PREFIX,common) {
class functions {
file = "framework\common\functions";
class addCBASettings { preInit = 1; };
class logMissionInfo {};
class addPlayerInfoToArray {};
class checkPlayerInventory {};
class createOrUpdateDiaryRecord {};
class draw3DIconStatus {};
class getApprovedAssetsCfg {};
class getBattalionCfg {};
class getNameOfBase {};
class getNearestBase {};
class log {};
class checkPlayerInventory {};
class logMissionInfo {};
class logSettingChanged {};
class padString {};
class recurseSubclasses {};
};
};
};
class DOUBLES(PREFIX,fbcb2_assets) {
class DOUBLES(PREFIX,fbcb2_assets) {
class functions {
file = "framework\fbcb2_assets\functions";
class addCBASettings {preInit=1;};
@@ -72,9 +78,9 @@ class CfgFunctions {
class updateAssetDiary {};
class updateAssetsByBase {};
};
};
};
class DOUBLES(PREFIX,fbcb2_main) {
class DOUBLES(PREFIX,fbcb2_main) {
class functions {
file = "framework\fbcb2_main\functions";
class initClient {};
@@ -87,9 +93,9 @@ class CfgFunctions {
class formatRadioElementForDiary {};
class generateElementFrequencyRecordText {};
};
};
};
class DOUBLES(PREFIX,mapcopy) {
class DOUBLES(PREFIX,mapcopy) {
class functions {
file = "framework\mapcopy\functions";
class addCBASettings {preInit=1;};
@@ -99,23 +105,24 @@ class CfgFunctions {
class mapMarkerToString {};
class stringToMapMarker {};
};
};
};
class DOUBLES(PREFIX,performance) {
class DOUBLES(PREFIX,performance) {
class functions {
file = "framework\performance\functions";
class addCBASettings {preInit=1;};
class addDNI_PlayerFPS { postInit = 1; };
class addDNI_PlayerFPS {postInit = 1;};
// PFHs managed in addCBASettings onChange code
class addClientStatsPFH {};
class calculateClientStats {};
class addServerStatsPFH {};
class calculateServerStats {};
class addEmptyGroupCleanupPFH {};
};
};
};
class DOUBLES(PREFIX,reinsert) {
class DOUBLES(PREFIX,reinsert) {
class functions {
file = "framework\reinsert\functions";
class addCBASettings {preInit=1;};
@@ -136,9 +143,9 @@ class CfgFunctions {
class addCheckQueueSelfAction {};
class requestShowQueue {};
};
};
};
class DOUBLES(PREFIX,resupply) {
class DOUBLES(PREFIX,resupply) {
class functions {
file = "framework\resupply\functions";
class addCBASettings {preInit=1;};
@@ -147,34 +154,34 @@ class CfgFunctions {
class getSupplyCratesCfg {};
class addArsenalObjectSpawnBoxActions {};
};
};
};
class DOUBLES(PREFIX,triageIcons) {
class DOUBLES(PREFIX,triageIcons) {
class functions {
file = "framework\triageIcons\functions";
class addCBASettings {preInit=1;};
class initClient {};
class addDrawIconsPFH {};
class addGetEntitiesPFH {};
class draw3D {};
class updateColors {};
};
};
};
class DOUBLES(PREFIX,vehicleFlags) {
class DOUBLES(PREFIX,vehicleFlags) {
class functions {
file = "framework\vehicleFlags\functions";
class initClient {};
class addFlagActions {};
class draw3D {};
class getActionsFlagCategories {};
class getVehicleFlagsCfg {};
class isClassExcluded {};
};
};
};
class DOUBLES(PREFIX,zeus) {
class DOUBLES(PREFIX,zeus) {
class functions {
file = "framework\zeus\functions";
class initClient {};
class addZenModules {};
};
};
};

View File

@@ -0,0 +1,10 @@
#include "..\script_component.hpp"
if (!isNil QGVAR(draw3DPFH)) then {
[GVAR(draw3DPFH)] call CBA_fnc_removePerFrameHandler;
};
// add pfh that processes queued code
GVAR(draw3DPFH) = [{
{call _x; true;} count (localNamespace getVariable [QGVAR(pfhCode), []]);
}, 0] call CBA_fnc_addPerFrameHandler;

View File

@@ -0,0 +1,17 @@
#include "..\script_component.hpp"
// subroutine to gather nearest 50 units every 5 seconds and store in GVAR(nearMen)
// cleanup
if (!isNil QGVAR(getNearMenPFH)) then {
[GVAR(getNearMenPFH)] call CBA_fnc_removePerFrameHandler;
};
// add pfh
GVAR(getNearMenPFH) = [{
localNamespace setVariable [
QGVAR(nearMen),
(nearestObjects [player,["Man"],50,false]) select {
!isNull _x &&
player isNotEqualTo _x
}
];
}, 1] call CBA_fnc_addPerFrameHandler;

View File

@@ -0,0 +1,76 @@
#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 >= 2) then {
switch (typeName _pos) do {
case "ARRAY": {
// pos is provided as an array
_realPos = _pos select [0, 2];
_realPos set [2, getTerrainHeightASL _realPos];
};
case "STRING": {
// pos is provided as a string
_realPos = [_pos, true] call ACE_common_fnc_getMapPosFromGrid;
_realPos set [2, getTerrainHeightASL _realPos];
};
default {
[
LEVEL_WARNING,
QUOTE(COMPONENT),
format["Invalid position for custom microDAGR waypoint: %1", _wpName],
[["name", _wpName], ["pos", _pos], ["object", _object]]] call EFUNC(common,log);
continue;
};
};
};
// 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;
true;
} count _customWaypoints;
}] call CBA_fnc_waitUntilAndExecute;
nil;

View File

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

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, true];
}] 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, true];
}] call CBA_fnc_addEventHandler;

View File

@@ -0,0 +1,5 @@
#include "..\script_component.hpp"
localNamespace setVariable [QGVAR(pfhCode), []];
count [];

View File

@@ -0,0 +1,28 @@
#include "..\script_component.hpp"
if (!hasInterface) exitWith {};
call FUNC(addMicroDAGRWaypoints);
call FUNC(addZenModules);
call FUNC(bindEventHandlers);
call FUNC(bindVehicleActions);
localNamespace setVariable [QGVAR(nearMen), []];
call FUNC(addGetNearMenPFH);
localNamespace setVariable [QGVAR(pfhCode), []];
call FUNC(addDraw3DPFH);
// 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

@@ -0,0 +1,9 @@
#include "..\script_component.hpp"
params [["_code", {}, [{}]]];
private _pfhCode = localNamespace getVariable [QGVAR(pfhCode), []];
_pfhCode pushBack _code;
localNamespace setVariable [QGVAR(pfhCode), _pfhCode];
count _pfhCode;

View File

@@ -0,0 +1,54 @@
#include "..\script_component.hpp"
if (!hasInterface) exitWith {};
params [
["_drawTargets", [], [[]]],
["_icon", "", [""]],
["_text", "", [""]],
["_color", [], [[]]]
];
if (count _drawTargets isEqualTo 0) exitWith {};
_cameraPos = positionCameraToWorld [0,0,0];
_cameraPosASL = AGLToASL _cameraPos;
{
_target = _x;
_visible = [objNull, "VIEW"] checkVisibility [_cameraPosASL, eyePos _target];
if ( _visible isEqualTo 0 ) exitWith {};
_objectPos = (_target modelToWorldVisual (_target selectionPosition "pilot"));
_distance = (visiblePosition _target) vectorDiff _cameraPos;
_scale = 0;
_heightOffset = 0;
_heightScaling = 0.012;
if ( _icon isNotEqualTo "") then {
_heightOffset = 0.065;
_scale = 1;
_heightScaling = 0.075;
};
_drawPos = _objectPos vectorAdd [0, 0, (0.18 + _heightOffset) + (vectorMagnitude _distance * _heightScaling)];
drawIcon3D [
_icon,
_color,
_drawPos,
_scale,
_scale,
0,
_text,
2,
0.025
];
true;
} count _drawTargets;
nil

View File

@@ -24,10 +24,10 @@ if (_logLevel < DEBUG_MODE) exitWith {};
private _hash = createHashMapFromArray _data;
// Replace square brackets with round brackets to avoid parsing issues.
_message regexReplace ['(\[)', "("];
_message regexReplace ['(\])', ")"];
[_message, "]", ")"] call CBA_fnc_replace;
[_message, "[", "("] call CBA_fnc_replace;
private _json = [_hash] call CBA_fnc_encodeJSON;
_log = format ["[%1] [%2] [%3] [%4] :: %5", QUOTE(PREFIX), _component, _fnc_scriptNameParent, _message, _json];
private _log = format ["[%1] [%2] [%3] [%4] :: %5", QUOTE(PREFIX), _component, _fnc_scriptNameParent, _message, _json];
diag_log text _log;

View File

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

View File

@@ -1,17 +1,27 @@
#include "..\script_component.hpp"
if (!hasInterface) exitWith {};
[
"respawn",
{
_clientID = _thisArgs select 0;
player setDamage 1;
private _timeWentUnconscious = player getVariable [QGVARMAIN(lastTimeKnockedOut), -1];
private _durationSpentUnconscious = -1;
if (_timeWentUnconscious > - 1) then {
_durationSpentUnconscious = diag_tickTime - _timeWentUnconscious;
};
// log to server RPT
[
LEVEL_INFO,
QUOTE(COMPONENT),
"CHAT COMMAND RESPAWN",
[player] call EFUNC(common,addPlayerInfoToArray)
[player, [
["durationSpentUnconscious", _durationSpentUnconscious]
]] call EFUNC(common,addPlayerInfoToArray)
] remoteExec [QEFUNC(common,log), 2];
// 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,19 +1,17 @@
#include "..\script_component.hpp"
if ( !hasInterface ) exitWith {};
["milsim_logText", {
params [["_strArray", [""], [[]]]];
{
diag_log text _x;
} forEach _strArray;
}] call CBA_fnc_addEventHandler;
if (!hasInterface) exitWith {};
// make sure the server has finished init
waitUntil {!isNil QGVARMAIN(complete)};
["InitializePlayer", [player, true]] call BIS_fnc_dynamicGroups;
// run primary init functions
call FUNC(addAARChatHandler);
call FUNC(addRespawnChatHandler);
call FUNC(setDefaults);
// Initialize a holder for managing local diary records
// store records in format:
// [subject, [
@@ -23,6 +21,7 @@ EGVAR(common,diaryRecords) = createHashMap;
// initialize other modules
call EFUNC(client,initClient);
call EFUNC(mapcopy,initClient);
call EFUNC(reinsert,initClient);
call EFUNC(resupply,initClient);
@@ -33,6 +32,8 @@ call EFUNC(fbcb2_main,initClient);
call EFUNC(fbcb2_assets,initClient);
call FUNC(checkMissionSettings);
[
LEVEL_DEBUG,
QUOTE(COMPONENT),

View File

@@ -9,16 +9,6 @@ publicVariable QGVARMAIN(baseObjects);
// Initializes the Dynamic Groups framework and groups
["Initialize", [true]] call BIS_fnc_dynamicGroups;
if (isDedicated) then {
["milsim_logText", {
params [["_strArray", [""], [[]]]];
{
diag_log text _x;
} forEach _strArray;
}] call CBA_fnc_addEventHandler;
};
// initialize other modules
call EFUNC(common,logMissionInfo);
call EFUNC(fbcb2_assets,initServer);

View File

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

View File

@@ -10,6 +10,9 @@ private _mapCopyAction =
"\a3\ui_f\data\igui\cfg\actions\talk_ca.paa",
{
params ["_target", "_player", "_params"];
if (!isPlayer _target) exitWith {
format["%1 is not a player", name _target] call CBA_fnc_notify;
};
format["Copying map markers from %1", name _target] call CBA_fnc_notify;
[QGVAR(mapCopyRequest), _this, _target] call CBA_fnc_targetEvent;
},

View File

@@ -1,5 +1,27 @@
#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
//---------------------

View File

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

View File

@@ -1,18 +0,0 @@
#include "..\script_component.hpp"
// subroutine to gather nearest 50 units every 5 seconds and store in GVAR(drawTargets)
// cleanup
if (!isNil QGVAR(getEntitiesPFH)) then {
[GVAR(getEntitiesPFH)] call CBA_fnc_removePerFrameHandler;
};
// add pfh
GVAR(getEntitiesPFH) = [{
GVAR(drawTargets) = (
(allUnits + allDeadMen) select {
_x isKindOf "CAManBase" &&
player distance _x < 50 &&
!isNull _x &&
player isNotEqualTo _x
}
);
}, 10] call CBA_fnc_addPerFrameHandler;

View File

@@ -1,6 +1,6 @@
/*
milsim_fnc_addMedicalOverlayPFH
milsim_triageIcons_fnc_draw3D
Author: IndigoFox
@@ -14,29 +14,19 @@ Description:
#include "..\script_component.hpp"
if (!hasInterface) exitWith {};
// Per-frame handler to draw icons
// cleanup
if (!isNil QGVAR(drawIconsPfh)) then {
[GVAR(drawIconsPfh)] call CBA_fnc_removePerFrameHandler;
};
// add pfh
GVAR(drawIconsPfh) = [{
// adds codeblock to common array to be processed per frame
private _code = {
// if disabled, skip processing
if (!GVAR(setting_enabled)) exitWith {false};
// if no targets, skip processing
if (count GVAR(drawTargets) == 0) exitWith {false};
// if the player doesn't have medical perms, skip processing
if !([player] call ace_medical_treatment_fnc_isMedic) exitWith {false};
{
private _unit = _x;
// distance within X meters
if (player distance _unit > GVAR(setting_drawRange)) then {continue};
// check unit not null, not conscious, and not in a vehicle
if (
!(_unit getVariable ["ACE_isUnconscious", false]) ||
!isNull (objectParent _unit)
) then {continue};
// color based on triage level
private _triageLevel = _unit getVariable ["ace_medical_triageLevel", 4];
@@ -57,6 +47,17 @@ GVAR(drawIconsPfh) = [{
true // outline
// further params optional, omitted
];
} forEach GVAR(drawTargets);
}, 0, []] call CBA_fnc_addPerFrameHandler;
true;
} count (
(localNamespace getVariable [QEGVAR(client,nearMen), []]) select {
// is unconscious and is NOT in vehicle and is within draw range
(_x getVariable ["ACE_isUnconscious", false]) &&
isNull (objectParent _x) &&
player distance _x <= GVAR(setting_drawRange)
}
);
};
// add codeblock to common array
[_code] call EFUNC(client,registerPFHCode);

View File

@@ -1,7 +1,8 @@
#include "..\script_component.hpp"
// List of units to draw icons for
GVAR(drawTargets) = [];
if (!hasInterface) exitWith {};
call FUNC(draw3D);
[
LEVEL_DEBUG,

View File

@@ -0,0 +1,103 @@
#include "..\script_component.hpp"
private _vehicleFlagsCfg = call FUNC(getVehicleFlagsCfg);
if (!isClass _vehicleFlagsCfg) exitWith {
["WARNING: Vehicle Flags: Vehicle Flags config not found. Vehicle Flags will not be available."] call BIS_fnc_error;
};
private _baseClassesToApplyActionsFor =
(_vehicleFlagsCfg >> "baseClassesToApplyActionsFor") call BIS_fnc_getCfgDataArray;
private _flagCategoryCfgs = (_vehicleFlagsCfg >> "FlagCategories") call BIS_fnc_returnChildren;
{ // forEach _baseClassesToApplyActionsFor
private _parentClass = _x;
////////////////////////////////////////////////////////////////////////
// create the root action
////////////////////////////////////////////////////////////////////////
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
{
params ["_target", "_player", "_params"];
// set broadcasted variable of self to indicate we're looking at flags
_player setVariable [QGVAR(inFlagMenu), true, true];
[{_this setVariable [QGVAR(inFlagMenu), false, true];}, _player, 3] call CBA_fnc_waitAndExecute;
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, true, false], // other params - run on hover is true
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;

View File

@@ -0,0 +1,24 @@
#include "..\script_component.hpp"
// we'll use this to display status if nearby players are in the flag menu
// adds codeblock to common array to be processed per frame
private _code = {
private _unitsToDraw = (localNamespace getVariable [QEGVAR(client,nearMen), []]) select {
(_x getVariable [QGVAR(inFlagMenu), false]) && {
// distance within X meters
player distance _x <= 15 ||
// check unit not in a vehicle
isNull (objectParent _x)
}
};
[
_unitsToDraw,
"",
"Setting vehicle flag...",
[0.9, 0.9, 0.9, 1]
] call EFUNC(common,draw3dIconStatus);
};
// add codeblock to common array
[_code] call EFUNC(client,registerPFHCode);

View File

@@ -2,101 +2,8 @@
if (!hasInterface) exitWith {};
private _vehicleFlagsCfg = call FUNC(getVehicleFlagsCfg);
if (!isClass _vehicleFlagsCfg) exitWith {
["WARNING: Vehicle Flags: Vehicle Flags config not found. Vehicle Flags will not be available."] call BIS_fnc_error;
};
private _baseClassesToApplyActionsFor =
(_vehicleFlagsCfg >> "baseClassesToApplyActionsFor") call BIS_fnc_getCfgDataArray;
private _flagCategoryCfgs = (_vehicleFlagsCfg >> "FlagCategories") call BIS_fnc_returnChildren;
{ // forEach _baseClassesToApplyActionsFor
private _parentClass = _x;
////////////////////////////////////////////////////////////////////////
// create the root action
////////////////////////////////////////////////////////////////////////
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"];
// 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;
call FUNC(addFlagActions);
call FUNC(draw3D);
[
LEVEL_DEBUG,

2
images/leaflets/.gitkeep Normal file
View File

@@ -0,0 +1,2 @@
# Auto detect text files and perform LF normalization
* text=auto

Binary file not shown.

After

Width:  |  Height:  |  Size: 306 KiB

View File

@@ -1,4 +1,4 @@
author = "MISSION AUTHOR";
author = "MISSION AUTHOR";
onLoadName = "THIS APPEARS ON TOP OF THE LOADING SCREEN IMAGE";
loadScreen = "mission.jpg";
onLoadMission = "THIS APPEARS BELOW THE LOADING SCREEN IMAGE";
@@ -9,8 +9,28 @@ 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
missionSeries = "MY SERIES NAME";
// activate via #ace-fortify west base 2000
// What kind of mission is this? (Use only one)
missionGroup = "Saturday Op";
// missionGroup = "Friday Op";
// missionGroup = "Wednesday Op";
// missionGroup = "FTX";
// missionGroup = "Training";
// 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 base {
displayName = "Ken Custom";