Compare commits
30 Commits
emp
...
a20f477ee0
| Author | SHA1 | Date | |
|---|---|---|---|
|
a20f477ee0
|
|||
|
c29e46d5f7
|
|||
|
de074b62f2
|
|||
|
|
57c012195a | ||
|
|
d71ba9e3bd | ||
|
|
32491da46f | ||
|
|
94814b6d07 | ||
|
|
d2a557dda1 | ||
|
|
81f4bb4d48 | ||
|
|
6f5a0ca523 | ||
|
|
4eae553c6d | ||
|
|
3194409192 | ||
|
293a050027
|
|||
|
d2758b7570
|
|||
|
|
1bdbdd1273 | ||
|
|
d4c01c6554 | ||
|
|
2866153654 | ||
|
|
23dc0656a6 | ||
|
4fb0ea9a15
|
|||
| ef83d41a32 | |||
| e76da62b7f | |||
|
|
aaad8675a6 | ||
| c00f1b0e17 | |||
|
9f89ec12d5
|
|||
|
e55c9a0751
|
|||
|
5114ae334f
|
|||
|
296f945ea3
|
|||
|
fdcf70b713
|
|||
|
|
1e5d50828b | ||
| f8af54aa06 |
71
.gitea/workflows/create-testing-snapshot.yaml
Normal file
71
.gitea/workflows/create-testing-snapshot.yaml
Normal 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
|
||||||
@@ -14,6 +14,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|||||||
- Added various framework utitily functions
|
- Added various framework utitily functions
|
||||||
- Added ability for mission maker to allow spawning of resupply boxes from arsenal boxes
|
- Added ability for mission maker to allow spawning of resupply boxes from arsenal boxes
|
||||||
- Added CBA settings for resupply box spawning
|
- Added CBA settings for resupply box spawning
|
||||||
|
- Added additional vehicle flags
|
||||||
|
- Addded Zeus module to fill vehicle ace cargo inventory with tracks/tires
|
||||||
|
|
||||||
### Changed
|
### Changed
|
||||||
|
|
||||||
|
|||||||
11
custom_scripts.hpp
Normal file
11
custom_scripts.hpp
Normal 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
|
||||||
|
};
|
||||||
|
};
|
||||||
@@ -97,10 +97,7 @@ class Params
|
|||||||
// CfgFunctions
|
// CfgFunctions
|
||||||
class CfgFunctions {
|
class CfgFunctions {
|
||||||
#include "framework\CfgFunctions.hpp"
|
#include "framework\CfgFunctions.hpp"
|
||||||
};
|
#include "custom_scripts.hpp"
|
||||||
|
|
||||||
class CfgSounds {
|
|
||||||
#include "framework\emp\CfgSounds.hpp"
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -5,9 +5,10 @@ class DOUBLES(PREFIX,init) {
|
|||||||
file = "framework\init\functions";
|
file = "framework\init\functions";
|
||||||
class initServer { postInit = 1;};
|
class initServer { postInit = 1;};
|
||||||
class initClient { postInit = 1;};
|
class initClient { postInit = 1;};
|
||||||
class setDefaults { postInit = 1; };
|
class setDefaults {};
|
||||||
class addAARChatHandler { postInit = 1; };
|
class addAARChatHandler {};
|
||||||
class addRespawnChatHandler { postInit = 1; };
|
class addRespawnChatHandler {};
|
||||||
|
class checkMissionSettings {};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -22,10 +23,16 @@ class PREFIX {
|
|||||||
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 addGetNearMenPFH {};
|
||||||
|
class addDraw3DPFH {};
|
||||||
|
class registerPFHCode {};
|
||||||
|
class clearPFHCode {};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -33,44 +40,22 @@ 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 addPlayerInfoToArray {};
|
class addPlayerInfoToArray {};
|
||||||
|
class checkPlayerInventory {};
|
||||||
class createOrUpdateDiaryRecord {};
|
class createOrUpdateDiaryRecord {};
|
||||||
|
class draw3DIconStatus {};
|
||||||
class getApprovedAssetsCfg {};
|
class getApprovedAssetsCfg {};
|
||||||
class getBattalionCfg {};
|
class getBattalionCfg {};
|
||||||
class getNameOfBase {};
|
class getNameOfBase {};
|
||||||
class getNearestBase {};
|
class getNearestBase {};
|
||||||
class log {};
|
class log {};
|
||||||
class checkPlayerInventory {};
|
class logMissionInfo {};
|
||||||
class logSettingChanged {};
|
class logSettingChanged {};
|
||||||
class padString {};
|
class padString {};
|
||||||
class recurseSubclasses {};
|
class recurseSubclasses {};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
class DOUBLES(PREFIX,emp) {
|
|
||||||
class functions {
|
|
||||||
file = "framework\emp\functions";
|
|
||||||
// class addCBASettings {preInit=1;};
|
|
||||||
class init {};
|
|
||||||
class addACEActions {};
|
|
||||||
|
|
||||||
class applyLocalObjectEffects {};
|
|
||||||
class applyLocalGroupEffects {};
|
|
||||||
class applyGlobalObjectEffects {};
|
|
||||||
class applyServerObjectEffects {};
|
|
||||||
|
|
||||||
class deploy {};
|
|
||||||
class getObjectsAndGroupsToAffect {};
|
|
||||||
class playLocalEffects {};
|
|
||||||
class playLocalEffectsForObject {};
|
|
||||||
|
|
||||||
class isItemElectronic {};
|
|
||||||
class removeUnitElectricInventoryItems {};
|
|
||||||
class removeVehicleElectricInventoryItems {};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
class DOUBLES(PREFIX,fbcb2_assets) {
|
class DOUBLES(PREFIX,fbcb2_assets) {
|
||||||
class functions {
|
class functions {
|
||||||
file = "framework\fbcb2_assets\functions";
|
file = "framework\fbcb2_assets\functions";
|
||||||
@@ -126,13 +111,14 @@ class DOUBLES(PREFIX,performance) {
|
|||||||
class functions {
|
class functions {
|
||||||
file = "framework\performance\functions";
|
file = "framework\performance\functions";
|
||||||
class addCBASettings {preInit=1;};
|
class addCBASettings {preInit=1;};
|
||||||
class addDNI_PlayerFPS { postInit = 1; };
|
class addDNI_PlayerFPS {postInit = 1;};
|
||||||
|
|
||||||
// PFHs managed in addCBASettings onChange code
|
// PFHs managed in addCBASettings onChange code
|
||||||
class addClientStatsPFH {};
|
class addClientStatsPFH {};
|
||||||
class calculateClientStats {};
|
class calculateClientStats {};
|
||||||
class addServerStatsPFH {};
|
class addServerStatsPFH {};
|
||||||
class calculateServerStats {};
|
class calculateServerStats {};
|
||||||
|
class addEmptyGroupCleanupPFH {};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -175,8 +161,7 @@ class DOUBLES(PREFIX,triageIcons) {
|
|||||||
file = "framework\triageIcons\functions";
|
file = "framework\triageIcons\functions";
|
||||||
class addCBASettings {preInit=1;};
|
class addCBASettings {preInit=1;};
|
||||||
class initClient {};
|
class initClient {};
|
||||||
class addDrawIconsPFH {};
|
class draw3D {};
|
||||||
class addGetEntitiesPFH {};
|
|
||||||
class updateColors {};
|
class updateColors {};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
@@ -185,6 +170,8 @@ class DOUBLES(PREFIX,vehicleFlags) {
|
|||||||
class functions {
|
class functions {
|
||||||
file = "framework\vehicleFlags\functions";
|
file = "framework\vehicleFlags\functions";
|
||||||
class initClient {};
|
class initClient {};
|
||||||
|
class addFlagActions {};
|
||||||
|
class draw3D {};
|
||||||
class getActionsFlagCategories {};
|
class getActionsFlagCategories {};
|
||||||
class getVehicleFlagsCfg {};
|
class getVehicleFlagsCfg {};
|
||||||
class isClassExcluded {};
|
class isClassExcluded {};
|
||||||
|
|||||||
10
framework/client/functions/fn_addDraw3DPFH.sqf
Normal file
10
framework/client/functions/fn_addDraw3DPFH.sqf
Normal 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;
|
||||||
17
framework/client/functions/fn_addGetNearMenPFH.sqf
Normal file
17
framework/client/functions/fn_addGetNearMenPFH.sqf
Normal 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;
|
||||||
76
framework/client/functions/fn_addMicroDAGRWaypoints.sqf
Normal file
76
framework/client/functions/fn_addMicroDAGRWaypoints.sqf
Normal 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;
|
||||||
@@ -7,11 +7,19 @@ 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 = _corpse getVariable [QGVARMAIN(lastTimeKnockedOut), -1];
|
||||||
|
private _durationSpentUnconscious = -1;
|
||||||
|
if (_timeWentUnconscious > -1) then {
|
||||||
|
_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", _durationSpentUnconscious]
|
||||||
|
]] 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];
|
||||||
};
|
};
|
||||||
|
|||||||
13
framework/client/functions/fn_bindUnconsciousListener.sqf
Normal file
13
framework/client/functions/fn_bindUnconsciousListener.sqf
Normal 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;
|
||||||
5
framework/client/functions/fn_clearPFHCode.sqf
Normal file
5
framework/client/functions/fn_clearPFHCode.sqf
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
#include "..\script_component.hpp"
|
||||||
|
|
||||||
|
localNamespace setVariable [QGVAR(pfhCode), []];
|
||||||
|
|
||||||
|
count [];
|
||||||
28
framework/client/functions/fn_initClient.sqf
Normal file
28
framework/client/functions/fn_initClient.sqf
Normal 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;
|
||||||
9
framework/client/functions/fn_registerPFHCode.sqf
Normal file
9
framework/client/functions/fn_registerPFHCode.sqf
Normal 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;
|
||||||
54
framework/common/functions/fn_draw3DIconStatus.sqf
Normal file
54
framework/common/functions/fn_draw3DIconStatus.sqf
Normal 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
|
||||||
|
|
||||||
@@ -24,19 +24,10 @@ if (_logLevel < DEBUG_MODE) exitWith {};
|
|||||||
private _hash = createHashMapFromArray _data;
|
private _hash = createHashMapFromArray _data;
|
||||||
|
|
||||||
// Replace square brackets with round brackets to avoid parsing issues.
|
// Replace square brackets with round brackets to avoid parsing issues.
|
||||||
_message regexReplace ['(\[)', "("];
|
[_message, "]", ")"] call CBA_fnc_replace;
|
||||||
_message regexReplace ['(\])', ")"];
|
[_message, "[", "("] call CBA_fnc_replace;
|
||||||
|
|
||||||
private _levelText = switch (_logLevel) do {
|
|
||||||
case (_logLevel isEqualTo -1) : {"TRACE"};
|
|
||||||
case (_logLevel isEqualTo 0) : {"DEBUG"};
|
|
||||||
case (_logLevel isEqualTo 1) : {"INFO"};
|
|
||||||
case (_logLevel isEqualTo 2) : {"WARN"};
|
|
||||||
case (_logLevel isEqualTo 3) : {"ERROR"};
|
|
||||||
default {"INFO"};
|
|
||||||
};
|
|
||||||
|
|
||||||
private _json = [_hash] call CBA_fnc_encodeJSON;
|
private _json = [_hash] call CBA_fnc_encodeJSON;
|
||||||
_log = format ["[%1] [%2] [%3] [%4] [%5] :: %6", QUOTE(PREFIX), _component, _fnc_scriptNameParent, _levelText, _message, _json];
|
private _log = format ["[%1] [%2] [%3] [%4] :: %5", QUOTE(PREFIX), _component, _fnc_scriptNameParent, _message, _json];
|
||||||
|
|
||||||
diag_log text _log;
|
diag_log text _log;
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
#include "script_component.hpp"
|
|
||||||
|
|
||||||
class GVAR(sound_zap1) {
|
|
||||||
name = QGVAR(sound_zap1);
|
|
||||||
sound[] = {"framework\emp\sounds\zap1.wss", db+10, 1};
|
|
||||||
titles[] = {};
|
|
||||||
};
|
|
||||||
class GVAR(sound_zap2) {
|
|
||||||
name = QGVAR(sound_zap2);
|
|
||||||
sound[] = {"framework\emp\sounds\zap2.wss", db+10, 1};
|
|
||||||
titles[] = {};
|
|
||||||
};
|
|
||||||
class GVAR(sound_zap3) {
|
|
||||||
name = QGVAR(sound_zap3);
|
|
||||||
sound[] = {"framework\emp\sounds\zap3.wss", db+10, 1};
|
|
||||||
titles[] = {};
|
|
||||||
};
|
|
||||||
class GVAR(sound_zap4) {
|
|
||||||
name = QGVAR(sound_zap4);
|
|
||||||
sound[] = {"framework\emp\sounds\zap4.wss", db+10, 1};
|
|
||||||
titles[] = {};
|
|
||||||
};
|
|
||||||
class GVAR(sound_electric_explsion_impact_large) {
|
|
||||||
name = QGVAR(sound_electric_explsion_impact_large);
|
|
||||||
sound[] = {"framework\emp\sounds\electric_explsion_impact_large.wss", db+750, 1};
|
|
||||||
titles[] = {};
|
|
||||||
};
|
|
||||||
class GVAR(sound_echo3) {
|
|
||||||
name = QGVAR(sound_echo3);
|
|
||||||
sound[] = {"framework\emp\sounds\echo3.wss", db+500, 1};
|
|
||||||
titles[] = {1,""};
|
|
||||||
};
|
|
||||||
class GVAR(sound_ecou) {
|
|
||||||
name = QGVAR(sound_ecou);
|
|
||||||
sound[] = {"framework\emp\sounds\ecou.wss", db+100, 1};
|
|
||||||
titles[] = {1,""};
|
|
||||||
};
|
|
||||||
@@ -1,38 +0,0 @@
|
|||||||
#include "..\script_component.hpp"
|
|
||||||
|
|
||||||
if (!hasInterface) exitWith {};
|
|
||||||
|
|
||||||
private _rootAction = [
|
|
||||||
QGVAR(action_deploy),
|
|
||||||
"Deploy EMP Device",
|
|
||||||
"",
|
|
||||||
{
|
|
||||||
params ["_target", "_player", "_params"];
|
|
||||||
true;
|
|
||||||
},
|
|
||||||
{true},
|
|
||||||
{
|
|
||||||
params ["_target", "_player", "_params"];
|
|
||||||
private _childActions = [];
|
|
||||||
{
|
|
||||||
private _radius = _x;
|
|
||||||
private _action = [
|
|
||||||
format["%1_%2", QGVAR(action_deploy), _radius],
|
|
||||||
format["Deploy EMP Device (%1m)", _radius],
|
|
||||||
"",
|
|
||||||
{
|
|
||||||
params ["_target", "_player", "_params"];
|
|
||||||
_params params ["_radius"];
|
|
||||||
[GVAR(empDevice1), _radius] call FUNC(deploy);
|
|
||||||
},
|
|
||||||
{!isNull (missionNamespace getVariable [QGVAR(empDevice1), objNull]);},
|
|
||||||
nil,
|
|
||||||
[_radius]
|
|
||||||
] call ace_interact_menu_fnc_createAction;
|
|
||||||
_childActions pushBack [_action, [], _target];
|
|
||||||
false
|
|
||||||
} count [100,500,3000];
|
|
||||||
_childActions;
|
|
||||||
}
|
|
||||||
] call ace_interact_menu_fnc_createAction;
|
|
||||||
["CAManBase", 1, ["ACE_SelfActions"], _rootAction, true] call ace_interact_menu_fnc_addActionToClass;
|
|
||||||
@@ -1,35 +0,0 @@
|
|||||||
#include "..\script_component.hpp"
|
|
||||||
|
|
||||||
// Executed on all machines - global argument, local effect
|
|
||||||
// The effects must be applied on all machines
|
|
||||||
|
|
||||||
params [["_object", objNull, [objNull]]];
|
|
||||||
if (isNull _object) exitWith {};
|
|
||||||
|
|
||||||
_object setHitPointDamage ["hitturret",1];
|
|
||||||
_object setHitPointDamage ["hitcomturret",1];
|
|
||||||
_object setHitPointDamage ["hitcomgun",1];
|
|
||||||
_object setHitPointDamage ["#light_hitpoint",1];
|
|
||||||
_object setHitPointDamage ["HitBatteries",1];
|
|
||||||
_object setHitPointDamage ["HitLight",1];
|
|
||||||
_object setHitPointDamage ["#light_l",1];
|
|
||||||
_object setHitPointDamage ["#light_r",1];
|
|
||||||
_object setHitPointDamage ["#light_l_flare",1];
|
|
||||||
_object setHitPointDamage ["#light_r_flare",1];
|
|
||||||
_object setHitPointDamage ["light_l",1];
|
|
||||||
_object setHitPointDamage ["light_r",1];
|
|
||||||
_object setHitPointDamage ["light_l2",1];
|
|
||||||
_object setHitPointDamage ["light_r2",1];
|
|
||||||
_object setHitPointDamage ["hitEngine",1];
|
|
||||||
_object setHitPointDamage ["hitengine",1];
|
|
||||||
_object setHitPointDamage ["hitengine1",1];
|
|
||||||
_object setHitPointDamage ["hitengine2",1];
|
|
||||||
_object setHitPointDamage ["hitengine3",1];
|
|
||||||
_object setHitPointDamage ["HitEngine2",1];
|
|
||||||
_object setHitPointDamage ["HitAvionics",1];
|
|
||||||
_object setHitPointDamage ["HitHRotor",1];
|
|
||||||
_object setHitPointDamage ["HitVRotor",1];
|
|
||||||
_object setHitPointDamage ["HitHydraulics",1];
|
|
||||||
_object setHitPointDamage ["HitHStabilizerL1",1];
|
|
||||||
_object setHitPointDamage ["HitHStabilizerR1",1];
|
|
||||||
_object setHitPointDamage ["HitVStabilizer1",1];
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
#include "..\script_component.hpp"
|
|
||||||
|
|
||||||
params [["_group", grpNull, [grpNull]]];
|
|
||||||
if (isNull _group) exitWith {};
|
|
||||||
if !(local _group) exitWith {};
|
|
||||||
|
|
||||||
//set gunlight status
|
|
||||||
_group enableGunLights "forceOff";
|
|
||||||
_group enableIRLasers true;
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
#include "..\script_component.hpp"
|
|
||||||
|
|
||||||
// Executed on all clients, only continue if object is local.
|
|
||||||
// Local argument, global effect (the object owner broadcasts new state)
|
|
||||||
|
|
||||||
params [["_object", objNull, [objNull]]];
|
|
||||||
if (isNull _object) exitWith {};
|
|
||||||
if !(local _object) exitWith {};
|
|
||||||
|
|
||||||
_object disableAI "LIGHTS";
|
|
||||||
_object setPilotLight false;
|
|
||||||
_object setCollisionLight false;
|
|
||||||
|
|
||||||
if (_object isKindOf "CAManBase") then {
|
|
||||||
[_object] call FUNC(removeUnitElectricInventoryItems);
|
|
||||||
} else {
|
|
||||||
[_object] call FUNC(removeVehicleElectricInventoryItems);
|
|
||||||
};
|
|
||||||
|
|
||||||
[{ // once flicker effects are done, permanently disable lights
|
|
||||||
private _flickerHandle = _object getVariable QGVAR(flickerHandle);
|
|
||||||
!isNil "_flickerHandle" && {scriptDone _flickerHandle}
|
|
||||||
}, {
|
|
||||||
_object setHit ["light_1_hitpoint", 0.97]; //all possible light hitpoints
|
|
||||||
_object setHit ["light_2_hitpoint", 0.97]; //no lights escape this
|
|
||||||
_object setHit ["light_3_hitpoint", 0.97];
|
|
||||||
_object setHit ["light_4_hitpoint", 0.97];
|
|
||||||
}] call CBA_fnc_waitUntilAndExecute;
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
#include "..\script_component.hpp"
|
|
||||||
|
|
||||||
// Executed on server only, global argument and global effect
|
|
||||||
// The server makes the change and broadcasts new state to all clients
|
|
||||||
|
|
||||||
if (!isServer) exitWith {};
|
|
||||||
|
|
||||||
params [["_object", objNull, [objNull]]];
|
|
||||||
if (isNull _object) exitWith {};
|
|
||||||
|
|
||||||
_object disableTIEquipment true;
|
|
||||||
_object disableNVGEquipment true;
|
|
||||||
_object setVariable ["A3TI_Disable", true, true];
|
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
#include "..\script_component.hpp"
|
|
||||||
|
|
||||||
// This function is used to deploy an EMP device and trigger the EMP effects on all machines
|
|
||||||
// The EMP effect is triggered by the global event "QGVAR(event_empDeployed)"
|
|
||||||
// This function should be called on the server
|
|
||||||
|
|
||||||
if (!isServer) exitWith {};
|
|
||||||
|
|
||||||
//get center and radius
|
|
||||||
params [["_origin", objNull, [[], objNull]],["_radius",1500, [300]]];
|
|
||||||
|
|
||||||
if (_origin isEqualType []) then {
|
|
||||||
if (count _origin != 3) exitWith {
|
|
||||||
["Invalid origin position provided (%1)", _origin] call BIS_fnc_error;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
if (_origin isEqualType objNull) then {
|
|
||||||
if (isNull _origin) exitWith {
|
|
||||||
["No origin object or position provided (%1)", _origin] call BIS_fnc_error;
|
|
||||||
};
|
|
||||||
_origin = getPosASL _origin;
|
|
||||||
};
|
|
||||||
|
|
||||||
[QGVAR(event_empDeployedPreCheck), [
|
|
||||||
random 100000,
|
|
||||||
_origin,
|
|
||||||
_radius
|
|
||||||
]] call CBA_fnc_globalEvent;
|
|
||||||
|
|
||||||
true;
|
|
||||||
@@ -1,68 +0,0 @@
|
|||||||
#include "..\script_component.hpp"
|
|
||||||
|
|
||||||
// This function will gather objects to be affected by the EMP blast
|
|
||||||
// It will return an array of objects within the radius of the EMP blast
|
|
||||||
|
|
||||||
params [["_origin", objNull, [[], objNull]],["_radius",1500]];
|
|
||||||
|
|
||||||
if (_origin isEqualType []) then {
|
|
||||||
if (count _origin != 3) exitWith {
|
|
||||||
["Invalid origin position provided (%1)", _origin] call BIS_fnc_error;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
if (_origin isEqualType objNull) then {
|
|
||||||
if (isNull _origin) exitWith {
|
|
||||||
["No origin object or position provided (%1)", _origin] call BIS_fnc_error;
|
|
||||||
};
|
|
||||||
_origin = getPosASL _origin;
|
|
||||||
};
|
|
||||||
|
|
||||||
//search for and return objects
|
|
||||||
private _objectsToAffect = nearestObjects [
|
|
||||||
_origin,
|
|
||||||
[
|
|
||||||
"Car",
|
|
||||||
"Motorcycle",
|
|
||||||
"UAV",
|
|
||||||
"Tank",
|
|
||||||
"Air",
|
|
||||||
"Ship",
|
|
||||||
"StreetLamp",
|
|
||||||
"Lamps_base_F", //These are all the lights' base classes
|
|
||||||
"PowerLines_base_F",
|
|
||||||
"PowerLines_Small_base_F",
|
|
||||||
"Land_TTowerBig_1_F",
|
|
||||||
"Land_TTowerBig_2_F",
|
|
||||||
"Land_fs_roof_F",
|
|
||||||
"Land_NavigLight",
|
|
||||||
"PowerLines_Wires_base_F",
|
|
||||||
"Land_PowerPoleWooden_L_F",
|
|
||||||
"Land_Runway_PAPI",
|
|
||||||
"Land_fs_sign_F",
|
|
||||||
"Land_FuelStation_01_roof_malevil_F",
|
|
||||||
"Land_FuelStation_01_roof_F",
|
|
||||||
"Lamps",
|
|
||||||
"Helicopter",
|
|
||||||
"Plane",
|
|
||||||
"Autonomous",
|
|
||||||
"Armored",
|
|
||||||
"Land_MobileRadar_01_radar_F",
|
|
||||||
"Land_Camping_Light_F",
|
|
||||||
"Land_PowLines_WoodL",
|
|
||||||
"Land_A_GeneralStore_01",
|
|
||||||
"Land_A_GeneralStore_01a",
|
|
||||||
"Land_Mil_Guardhouse",
|
|
||||||
"Land_NAV_Lighthouse",
|
|
||||||
"Land_Mil_House",
|
|
||||||
"Land_LightHouse_F",
|
|
||||||
"Land_Hospital_side2_F"
|
|
||||||
],
|
|
||||||
_radius
|
|
||||||
];
|
|
||||||
|
|
||||||
private _affectedLocalGroups = _objectsToAffect apply {group _x};
|
|
||||||
_affectedLocalGroups = _affectedLocalGroups arrayIntersect _affectedLocalGroups;
|
|
||||||
_affectedLocalGroups = _affectedLocalGroups select {local _x} select {!isPlayer (leader _x)};
|
|
||||||
|
|
||||||
[_objectsToAffect, _affectedLocalGroups];
|
|
||||||
@@ -1,280 +0,0 @@
|
|||||||
#include "..\script_component.hpp"
|
|
||||||
|
|
||||||
GVAR(maxBrightDelay) = 3.25;
|
|
||||||
|
|
||||||
GVAR(zapSounds) = createHashMap;
|
|
||||||
{
|
|
||||||
private _cfg = missionConfigFile >> "CfgSounds" >> _x;
|
|
||||||
private _dataArr = getArray(_cfg >> "sound");
|
|
||||||
GVAR(zapSounds) set [_x, createHashMapFromArray [
|
|
||||||
["filename", _dataArr#0],
|
|
||||||
["volume", _dataArr#1],
|
|
||||||
["pitch", _dataArr#2]
|
|
||||||
]];
|
|
||||||
true;
|
|
||||||
} count [QGVAR(sound_zap1),QGVAR(sound_zap2),QGVAR(sound_zap3),QGVAR(sound_zap4)];
|
|
||||||
|
|
||||||
GVAR(echoSounds) = createHashMap;
|
|
||||||
{
|
|
||||||
private _cfg = missionConfigFile >> "CfgSounds" >> _x;
|
|
||||||
private _dataArr = getArray(_cfg >> "sound");
|
|
||||||
GVAR(echoSounds) set [_x, createHashMapFromArray [
|
|
||||||
["filename", _dataArr#0],
|
|
||||||
["volume", _dataArr#1],
|
|
||||||
["pitch", _dataArr#2]
|
|
||||||
]];
|
|
||||||
true;
|
|
||||||
} count [QGVAR(sound_ecou),QGVAR(sound_echo3)];
|
|
||||||
|
|
||||||
|
|
||||||
private _lgExplosionCfg = missionConfigFile >> "CfgSounds" >> QGVAR(sound_electric_explsion_impact_large);
|
|
||||||
private _lgExplosionDataArray = getArray(_lgExplosionCfg >> "sound");
|
|
||||||
GVAR(sound_electric_explsion_impact_large) = createHashMapFromArray [
|
|
||||||
["filename", _lgExplosionDataArray#0],
|
|
||||||
["volume", _lgExplosionDataArray#1],
|
|
||||||
["pitch", _lgExplosionDataArray#2]
|
|
||||||
];
|
|
||||||
|
|
||||||
if (hasInterface) then {
|
|
||||||
call FUNC(addACEActions);
|
|
||||||
};
|
|
||||||
GVAR(activeEMPs) = createHashMap;
|
|
||||||
|
|
||||||
// this precheck is sent to all clients from FUNC(deploy)
|
|
||||||
// machines will precache affected objects and signal they're ready in return
|
|
||||||
[QGVAR(event_empDeployedPreCheck), {
|
|
||||||
params ["_id", "_origin", "_radius"];
|
|
||||||
|
|
||||||
([_origin, _radius] call FUNC(getObjectsAndGroupsToAffect)) params ["_affectedObjects", "_affectedLocalGroups"];
|
|
||||||
GVAR(activeEMPs) set [_id, createHashMapFromArray [
|
|
||||||
["origin", _origin],
|
|
||||||
["radius", _radius],
|
|
||||||
["objects", _affectedObjects],
|
|
||||||
["localGroups", _affectedLocalGroups],
|
|
||||||
["machinesReady", []]
|
|
||||||
]];
|
|
||||||
|
|
||||||
[
|
|
||||||
LEVEL_DEBUG,
|
|
||||||
QUOTE(COMPONENT),
|
|
||||||
"EMP deployed precheck",
|
|
||||||
[
|
|
||||||
["id", _id],
|
|
||||||
["origin", _origin],
|
|
||||||
["radius", _radius],
|
|
||||||
["affectedObjects", count _affectedObjects],
|
|
||||||
["affectedLocalGroups", count _affectedLocalGroups]
|
|
||||||
]
|
|
||||||
] call EFUNC(common,log);
|
|
||||||
|
|
||||||
// notify the server we're ready to play effects
|
|
||||||
[QGVAR(event_readyForEmpEffects), [_id, clientOwner]] call CBA_fnc_serverEvent;
|
|
||||||
|
|
||||||
if (isServer) then {
|
|
||||||
// on the server, create a waiter for all machines to be ready
|
|
||||||
[{
|
|
||||||
_this params ["_id"];
|
|
||||||
private _empData = GVAR(activeEMPs) get _id;
|
|
||||||
count (_empData get "machinesReady") isEqualTo (count allUsers);
|
|
||||||
}, {
|
|
||||||
// when all machines are ready, play effects
|
|
||||||
_this params ["_id"];
|
|
||||||
private _empData = GVAR(activeEMPs) get _id;
|
|
||||||
|
|
||||||
[
|
|
||||||
LEVEL_DEBUG,
|
|
||||||
QUOTE(COMPONENT),
|
|
||||||
"Initiating EMP effects",
|
|
||||||
[
|
|
||||||
["id", _id],
|
|
||||||
["readyCount", count (_empData get "machinesReady")],
|
|
||||||
["allUsers", count allUsers]
|
|
||||||
]
|
|
||||||
] call EFUNC(common,log);
|
|
||||||
|
|
||||||
[QGVAR(event_initiateEMPEffects), [_id]] call CBA_fnc_globalEvent;
|
|
||||||
}, [_id]] call CBA_fnc_waitUntilAndExecute;
|
|
||||||
};
|
|
||||||
}] call CBA_fnc_addEventHandler;
|
|
||||||
|
|
||||||
// when a machine is ready to play effects, they'll trigger this on the server
|
|
||||||
if (isServer) then {
|
|
||||||
[QGVAR(event_readyForEmpEffects), {
|
|
||||||
params ["_id", "_machineID"];
|
|
||||||
private _empData = GVAR(activeEMPs) get _id;
|
|
||||||
private _machinesReady = _empData get "machinesReady";
|
|
||||||
if (!(_machineID in _machinesReady)) then {
|
|
||||||
_machinesReady pushBack _machineID;
|
|
||||||
_empData set ["machinesReady", _machinesReady];
|
|
||||||
[
|
|
||||||
LEVEL_DEBUG,
|
|
||||||
QUOTE(COMPONENT),
|
|
||||||
"Machine ready for EMP effects",
|
|
||||||
[
|
|
||||||
["id", _id],
|
|
||||||
["machineID", _machineID],
|
|
||||||
["readyCount", count _machinesReady]
|
|
||||||
]
|
|
||||||
] call EFUNC(common,log);
|
|
||||||
};
|
|
||||||
}] call CBA_fnc_addEventHandler;
|
|
||||||
};
|
|
||||||
|
|
||||||
// when all machines are ready, the server will trigger this on all machines to start effects
|
|
||||||
[QGVAR(event_initiateEMPEffects), {
|
|
||||||
params ["_id"];
|
|
||||||
private _empData = GVAR(activeEMPs) get _id;
|
|
||||||
private _origin = _empData get "origin";
|
|
||||||
private _affectedObjects = _empData get "objects";
|
|
||||||
private _affectedLocalGroups = _empData get "localGroups";
|
|
||||||
|
|
||||||
if (hasInterface) then {
|
|
||||||
[
|
|
||||||
LEVEL_DEBUG,
|
|
||||||
QUOTE(COMPONENT),
|
|
||||||
"Initiating EMP effects",
|
|
||||||
[
|
|
||||||
["id", _id],
|
|
||||||
["origin", _origin],
|
|
||||||
["affectedObjects", count _affectedObjects],
|
|
||||||
["affectedLocalGroups", count _affectedLocalGroups]
|
|
||||||
]
|
|
||||||
] call EFUNC(common,log);
|
|
||||||
|
|
||||||
[_origin] call FUNC(playLocalEffects);
|
|
||||||
|
|
||||||
// when emp effects reach max brightness, execute object effects
|
|
||||||
[{
|
|
||||||
params ["_affectedObjects", "_affectedLocalGroups"];
|
|
||||||
private _countLocalObjectEffectsPlayed = { // play effects on this machine
|
|
||||||
try {
|
|
||||||
[_x] call FUNC(playLocalEffectsForObject);
|
|
||||||
} catch {
|
|
||||||
[
|
|
||||||
LEVEL_WARNING,
|
|
||||||
QUOTE(COMPONENT),
|
|
||||||
"Failed to play local EMP effects for object",
|
|
||||||
[
|
|
||||||
["object", typeOf _x],
|
|
||||||
["error", _exception]
|
|
||||||
]
|
|
||||||
] call EFUNC(common,log);
|
|
||||||
};
|
|
||||||
true;
|
|
||||||
} count _affectedObjects;
|
|
||||||
|
|
||||||
[
|
|
||||||
LEVEL_DEBUG,
|
|
||||||
QUOTE(COMPONENT),
|
|
||||||
"Played EMP effects",
|
|
||||||
[
|
|
||||||
["localObjectEffectsPlayed", _countLocalObjectEffectsPlayed]
|
|
||||||
]
|
|
||||||
] call EFUNC(common,log);
|
|
||||||
}, [_affectedObjects, _affectedLocalGroups], GVAR(maxBrightDelay)] call CBA_fnc_waitAndExecute;
|
|
||||||
};
|
|
||||||
|
|
||||||
// around peak brightness
|
|
||||||
[{
|
|
||||||
params ["_affectedObjects", "_affectedLocalGroups"];
|
|
||||||
|
|
||||||
private _countLocalObjectEffectsApplied = { // apply affects to objects owned by this machine, start propagation to other machines
|
|
||||||
try {
|
|
||||||
[_x] call FUNC(applyLocalObjectEffects);
|
|
||||||
} catch {
|
|
||||||
[
|
|
||||||
LEVEL_WARNING,
|
|
||||||
QUOTE(COMPONENT),
|
|
||||||
"Failed to apply local EMP effects for object",
|
|
||||||
[
|
|
||||||
["object", typeOf _x],
|
|
||||||
["error", _exception]
|
|
||||||
]
|
|
||||||
] call EFUNC(common,log);
|
|
||||||
};
|
|
||||||
true;
|
|
||||||
} count (_affectedObjects select {local _x});
|
|
||||||
private _countLocalGroupEffectsApplied = { // apply affects to groups owned by this machine, start propagation to other machines
|
|
||||||
try {
|
|
||||||
[_x] call FUNC(applyLocalGroupEffects);
|
|
||||||
} catch {
|
|
||||||
[
|
|
||||||
LEVEL_WARNING,
|
|
||||||
QUOTE(COMPONENT),
|
|
||||||
"Failed to apply local EMP effects for group",
|
|
||||||
[
|
|
||||||
["group", _x],
|
|
||||||
["error", _exception]
|
|
||||||
]
|
|
||||||
] call EFUNC(common,log);
|
|
||||||
};
|
|
||||||
true;
|
|
||||||
} count _affectedLocalGroups;
|
|
||||||
|
|
||||||
if (isServer) then {
|
|
||||||
private _countServerObjectEffectsApplied = {
|
|
||||||
try {
|
|
||||||
[_x] call FUNC(applyServerObjectEffects);
|
|
||||||
} catch {
|
|
||||||
[
|
|
||||||
LEVEL_WARNING,
|
|
||||||
QUOTE(COMPONENT),
|
|
||||||
"Failed to apply server EMP effects for object",
|
|
||||||
[
|
|
||||||
["object", typeOf _x],
|
|
||||||
["error", _exception]
|
|
||||||
]
|
|
||||||
] call EFUNC(common,log);
|
|
||||||
};
|
|
||||||
true;
|
|
||||||
} count _affectedObjects;
|
|
||||||
};
|
|
||||||
|
|
||||||
private _countGlobalObjectEffectsApplied = {
|
|
||||||
try {
|
|
||||||
[_x] call FUNC(applyGlobalObjectEffects);
|
|
||||||
} catch {
|
|
||||||
[
|
|
||||||
LEVEL_WARNING,
|
|
||||||
QUOTE(COMPONENT),
|
|
||||||
"Failed to apply global EMP effects for object",
|
|
||||||
[
|
|
||||||
["object", typeOf _x],
|
|
||||||
["error", _exception]
|
|
||||||
]
|
|
||||||
] call EFUNC(common,log);
|
|
||||||
};
|
|
||||||
true;
|
|
||||||
} count _affectedObjects;
|
|
||||||
|
|
||||||
[
|
|
||||||
LEVEL_DEBUG,
|
|
||||||
QUOTE(COMPONENT),
|
|
||||||
"Applied EMP effects",
|
|
||||||
[
|
|
||||||
["localObjectEffects", _countLocalObjectEffectsApplied],
|
|
||||||
["localGroupEffects", _countLocalGroupEffectsApplied],
|
|
||||||
["serverObjectEffects", _countServerObjectEffectsApplied],
|
|
||||||
["globalObjectEffects", _countGlobalObjectEffectsApplied]
|
|
||||||
]
|
|
||||||
] call EFUNC(common,log);
|
|
||||||
}, [_affectedObjects, _affectedLocalGroups], GVAR(maxBrightDelay)] call CBA_fnc_waitAndExecute;
|
|
||||||
|
|
||||||
|
|
||||||
// clear EMP data after 30 seconds
|
|
||||||
[{
|
|
||||||
params ["_id"];
|
|
||||||
private _empData = GVAR(activeEMPs) get _id;
|
|
||||||
[
|
|
||||||
LEVEL_DEBUG,
|
|
||||||
QUOTE(COMPONENT),
|
|
||||||
"EMP effects finished",
|
|
||||||
[
|
|
||||||
["id", _id],
|
|
||||||
["affectedObjects", count (_empData get "objects")],
|
|
||||||
["affectedLocalGroups", count (_empData get "localGroups")]
|
|
||||||
]
|
|
||||||
] call EFUNC(common,log);
|
|
||||||
GVAR(activeEMPs) deleteAt _id;
|
|
||||||
}, [_id], 30] call CBA_fnc_waitAndExecute;
|
|
||||||
}] call CBA_fnc_addEventHandler;
|
|
||||||
@@ -1,38 +0,0 @@
|
|||||||
#include "..\script_component.hpp"
|
|
||||||
|
|
||||||
params [
|
|
||||||
["_itemClassname", "", [""]]
|
|
||||||
];
|
|
||||||
|
|
||||||
if (_itemClassname isEqualTo "") exitWith {
|
|
||||||
["Param _itemClassname is empty", ""] call BIS_fnc_error;
|
|
||||||
false
|
|
||||||
};
|
|
||||||
|
|
||||||
private _isTFARRadio = if (isClass (configFile >> "CfgPatches" >> "tfar_core")) then {_itemClassname call TFAR_fnc_isRadio} else {false};
|
|
||||||
if (_isTFARRadio) exitWith {true};
|
|
||||||
|
|
||||||
private _matchedSpecificClassnames = {(toLower _x) in (toLower _className)} count [
|
|
||||||
"ACE_microDAGR",
|
|
||||||
"Vector21",
|
|
||||||
"MineDetector",
|
|
||||||
"GPS"
|
|
||||||
];
|
|
||||||
|
|
||||||
if (_matchedSpecificClassnames > 0) exitWith {true};
|
|
||||||
|
|
||||||
// find items with NVG or TI capabilities
|
|
||||||
private _cfg = _className call CBA_fnc_getItemConfig;
|
|
||||||
private _modes = getArray(configfile >> "CfgWeapons" >> _className >> "visionMode");
|
|
||||||
private _subModes = [configfile >> "CfgWeapons" >> _className >> "ItemInfo" >> "OpticsModes", 1] call BIS_fnc_returnChildren;
|
|
||||||
{
|
|
||||||
_modes append getArray( _x >> "visionMode" );
|
|
||||||
} forEach _subModes;
|
|
||||||
|
|
||||||
private _hasTI = "ti" in (_modes apply { toLower _x });
|
|
||||||
private _hasNVG = "nvg" in (_modes apply { toLower _x });
|
|
||||||
|
|
||||||
if (_hasTI || _hasNVG) exitWith {true};
|
|
||||||
|
|
||||||
|
|
||||||
false;
|
|
||||||
@@ -1,101 +0,0 @@
|
|||||||
#include "..\script_component.hpp"
|
|
||||||
|
|
||||||
// Executed on all machines with an interface
|
|
||||||
// This plays the effects of the EMP itself going off
|
|
||||||
|
|
||||||
if (!hasInterface) exitWith {};
|
|
||||||
|
|
||||||
params [["_origin", [], [[]]]];
|
|
||||||
if (count _origin isEqualTo 0) exitWith {};
|
|
||||||
|
|
||||||
private _e_static3 = "#particlesource" createVehicleLocal (ASLToAGL _origin);
|
|
||||||
_e_static3 setParticleCircle [0, [0, 0, 0]];
|
|
||||||
_e_static3 setParticleRandom [0.2, [0,0,0], [0.175, 0.175, 0.175], 0.25, 0.15, [0, 0, 0, 1], 1, 0];
|
|
||||||
_e_static3 setParticleParams [["\A3\data_f\blesk1", 1, 0, 1], "", "SpaceObject", 1, 0.75, [0, 0, 1], [0, 0, 0], 0, 10, 7.9,0, [0, 0.2], [[1, 1, 0.1, 1], [1, 1, 1, 1]], [0.01], 1, 0, "", "", objNull,0,false,-1,[[100,100,100,1],[1,1,1,1]]];
|
|
||||||
_e_static3 setDropInterval 0.15;
|
|
||||||
|
|
||||||
private _ripple2 = "#particlesource" createVehicleLocal (ASLToAGL _origin);
|
|
||||||
_ripple2 setParticleCircle [0,[0,0,0]];
|
|
||||||
_ripple2 setParticleRandom [0.1,[0,0,0],[0,0,0],25,1,[0,0,0,0.1],0,0];
|
|
||||||
_ripple2 setParticleParams [["\A3\data_f\ParticleEffects\Universal\Refract.p3d",1,0,1], "", "Billboard", 1, 1, [0, 0, 1], [0, 0, 0],0,10,7.9,0, [5,0], [[1, 1, 1, 1], [1, 1, 1, 1]], [0.05], 1, 0, "", "", objNull];
|
|
||||||
_ripple2 setDropInterval 0.05;
|
|
||||||
|
|
||||||
private _light_emp = "#lightpoint" createVehiclelocal (ASLToAGL _origin);
|
|
||||||
// _light_emp lightAttachObject [objNull, [0,0,0.5]];
|
|
||||||
_light_emp setLightAmbient [0.1,0.1,1];
|
|
||||||
_light_emp setLightColor [0.1,0.1,1];
|
|
||||||
_light_emp setLightBrightness 0;
|
|
||||||
_light_emp setLightUseFlare true;
|
|
||||||
_light_emp setLightFlareSize 1;
|
|
||||||
_light_emp setLightFlareMaxDistance 2500;
|
|
||||||
_light_emp setLightDayLight true;
|
|
||||||
_light_emp setLightAttenuation [5,1,1,1,5,1000];
|
|
||||||
_brit = 0;
|
|
||||||
|
|
||||||
|
|
||||||
private _explSoundData = GVAR(sound_electric_explsion_impact_large);
|
|
||||||
// local only, last param
|
|
||||||
playSound3D [_explSoundData get "filename", nil, false, _origin, _explSoundData get "volume", _explSoundData get "pitch", 3500, 0, true];
|
|
||||||
|
|
||||||
[_light_emp, _brit, _ripple2] spawn {
|
|
||||||
params ["_light_emp", "_brit", "_ripple2"];
|
|
||||||
while {_brit < 6.5} do {
|
|
||||||
// takes ~1.73 seconds to reach full brightness
|
|
||||||
_light_emp setLightBrightness _brit;
|
|
||||||
_brit = _brit+0.02; //timing for next stage
|
|
||||||
sleep 0.01;
|
|
||||||
};
|
|
||||||
deleteVehicle _ripple2;
|
|
||||||
};
|
|
||||||
|
|
||||||
[{
|
|
||||||
params ["_origin", "_light_emp"];
|
|
||||||
private _e_static2 = "#particlesource" createVehicleLocal (ASLToAGL _origin);
|
|
||||||
_e_static2 setParticleCircle [0, [0, 0, 0]];
|
|
||||||
_e_static2 setParticleRandom [0.2, [0,0,0], [0, 0, 0], 0.25, 1.05, [0, 0, 0, 1], 1, 0];
|
|
||||||
_e_static2 setParticleParams [["\A3\data_f\blesk1", 1, 0, 1], "", "SpaceObject", 1, 0.75, [0, 0, 0], [0, 0, 1], 0, 10, 7.9,0, [0,0.5], [[1, 1, 0.1, 1], [1, 1, 1, 1]], [0.08], 1, 0, "", "", objNull,0,false,-1,[[100,100,100,1],[0,0,1,0.01]]];
|
|
||||||
_e_static2 setDropInterval 0.05;
|
|
||||||
|
|
||||||
private _wave = "#particlesource" createVehicleLocal (ASLToAGL _origin);
|
|
||||||
_wave setParticleCircle [0,[0,0,0]];
|
|
||||||
_wave setParticleRandom [0,[0,0,0],[0,0,0],10,0.25,[0,0,0,0.1],0,0];
|
|
||||||
_wave setParticleParams [["\A3\data_f\kouleSvetlo",1,0,1], "", "Billboard", 1, 3, [0, 0, 1], [0, 0, 0],0,10,7.9,0, [0,75], [[0,0,1,1],[0,0,0.25,0]], [0.01], 1, 0, "", "", objNull,0,false,-1,[[0,0,3,0.75],[0,0,1,0.01]]];
|
|
||||||
_wave setDropInterval 30;
|
|
||||||
|
|
||||||
private _ripple = "#particlesource" createVehicleLocal (ASLToAGL _origin);
|
|
||||||
_ripple setParticleCircle [0,[0,0,0]];
|
|
||||||
_ripple setParticleRandom [0,[0,0,0],[0,0,0],0,0.25,[0,0,0,0.1],0,0];
|
|
||||||
_ripple setParticleParams [["\A3\data_f\ParticleEffects\Universal\Refract.p3d",1,0,1], "", "Billboard", 1, 1.5, [0, 0, 1], [0, 0, 0],0,10,7.9,0, [0,500], [[1, 1, 1, 1], [1, 1, 1, 1]], [0.05], 1, 0, "", "", objNull];
|
|
||||||
_ripple setDropInterval 10;
|
|
||||||
|
|
||||||
[{deleteVehicle _this}, _ripple, 0.65] call CBA_fnc_waitAndExecute;
|
|
||||||
|
|
||||||
[{
|
|
||||||
params ["_e_static2", "_e_static3", "_brit", "_light_emp", "_wave"];
|
|
||||||
{
|
|
||||||
deleteVehicle _x;
|
|
||||||
} forEach [_e_static2, _e_static3];
|
|
||||||
|
|
||||||
[_light_emp, _brit, _wave] spawn {
|
|
||||||
params ["_light_emp", "_brit", "_wave"];
|
|
||||||
while {_brit > 0} do {
|
|
||||||
_light_emp setLightBrightness _brit;
|
|
||||||
_brit = _brit-2;
|
|
||||||
sleep 0.01;
|
|
||||||
};
|
|
||||||
deleteVehicle _light_emp;
|
|
||||||
deleteVehicle _wave;
|
|
||||||
};
|
|
||||||
}, [[_e_static2, _e_static3, 6.5, _light_emp, _wave]], 0.85] call CBA_fnc_waitAndExecute;
|
|
||||||
}, [_origin, _light_emp], GVAR(maxBrightDelay)] call CBA_fnc_waitAndExecute;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
[{
|
|
||||||
params ["_origin"];
|
|
||||||
private _echosound = selectRandom (keys GVAR(echoSounds));
|
|
||||||
private _echoSoundData = GVAR(echoSounds) get _echosound;
|
|
||||||
// local only, last param
|
|
||||||
playSound3D [_echoSoundData get "filename", nil, false, _origin, _echoSoundData get "volume", _echoSoundData get "pitch", 4000, 0, true];
|
|
||||||
}, [_origin], GVAR(maxBrightDelay) + 0.65 + 2] call CBA_fnc_waitAndExecute;
|
|
||||||
@@ -1,79 +0,0 @@
|
|||||||
#include "..\script_component.hpp"
|
|
||||||
|
|
||||||
// executed on all clients with an interface
|
|
||||||
// flickers lights for light props/streetlamps and plays a spark sound
|
|
||||||
|
|
||||||
if (!hasInterface) exitWith {};
|
|
||||||
|
|
||||||
params [["_object", objNull, [objNull]]];
|
|
||||||
if (isNull _object) exitWith {};
|
|
||||||
|
|
||||||
// flicker the lights
|
|
||||||
private _flickerHandle = [_object] spawn {
|
|
||||||
params ["_object"];
|
|
||||||
for "_i" from 1 to 3 do {
|
|
||||||
_object switchLight "OFF";
|
|
||||||
sleep (random 0.3);
|
|
||||||
_object switchLight "ON";
|
|
||||||
sleep (random 0.3);
|
|
||||||
};
|
|
||||||
// always finish by shutting off
|
|
||||||
_object switchLight "OFF";
|
|
||||||
};
|
|
||||||
|
|
||||||
_object setVariable [QGVAR(flickerHandle), _flickerHandle];
|
|
||||||
|
|
||||||
[{scriptDone (_this getVariable QGVAR(flickerHandle));}, {
|
|
||||||
private _object = _this;
|
|
||||||
|
|
||||||
// sound
|
|
||||||
// private _spark_sound = selectRandom (keys GVAR(zapSounds));
|
|
||||||
// private _sparkSoundData = GVAR(zapSounds) get _spark_sound;
|
|
||||||
// playSound3D [_sparkSoundData get "filename", _object, false, getPosASL _object, _sparkSoundData get "volume", _sparkSoundData get "pitch", 75, 0, true];
|
|
||||||
|
|
||||||
// // particle effect, large blue spark
|
|
||||||
// private _e_static = "#particlesource" createVehicleLocal (getPosATL _object);
|
|
||||||
// _e_static setParticleCircle [1, [0, 0, 0]];
|
|
||||||
// _e_static setParticleRandom [0.2, [1.5,1.5,0], [0.175, 0.175, 0], 0.15, 0.2, [0, 0, 0, 1], 1, 0];
|
|
||||||
// _e_static setParticleParams [["\A3\data_f\blesk1", 1, 0, 1], "", "SpaceObject", 1, 0.05, [0, 0, 0], [0, 0, 0], 0, 10, 7.9,0, [0.01, 0.02, 0.01], [[1, 1, 0.1, 1], [1, 1, 1, 1]], [0.025], 1, 0, "", "", _object,0,false,-1,[[100,100,100,1],[0,0,1,0.01]]];
|
|
||||||
// _e_static setDropInterval 0.025;
|
|
||||||
|
|
||||||
// [{deleteVehicle _this;}, _e_static, 1] call CBA_fnc_waitAndExecute;
|
|
||||||
|
|
||||||
|
|
||||||
// play additional spark
|
|
||||||
_bbr = boundingBoxReal vehicle _object;
|
|
||||||
_p1 = _bbr select 0;
|
|
||||||
_p2 = _bbr select 1;
|
|
||||||
_maxHeight = abs ((_p2 select 2) - (_p1 select 2));
|
|
||||||
|
|
||||||
//_spark_poz_rel = [getPos _lamp select 0,getPos _lamp select 1,_maxHeight-0.5];
|
|
||||||
private _spark_poz_rel = (_maxHeight/2)-0.45;
|
|
||||||
|
|
||||||
private _spark_type = ["white","orange"] call BIS_fnc_selectRandom;
|
|
||||||
private _drop = 0.001+(random 0.05);
|
|
||||||
private _scantei_spark = "#particlesource" createVehicleLocal (getPosATL _object);
|
|
||||||
|
|
||||||
if (_spark_type=="orange") then
|
|
||||||
{
|
|
||||||
_scantei_spark setParticleCircle [0, [0, 0, 0]];
|
|
||||||
_scantei_spark setParticleRandom [1, [0.1, 0.1, 0.1], [0, 0, 0], 0, 0.25, [0, 0, 0, 0], 0, 0];
|
|
||||||
_scantei_spark setParticleParams [["\A3\data_f\proxies\muzzle_flash\muzzle_flash_silencer.p3d", 1, 0, 1], "", "SpaceObject", 1, 1, [0, 0,_spark_poz_rel], [0, 0, 0], 0, 15, 7.9, 0, [0.5,0.5,0.05], [[1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 0]], [0.08], 1, 0, "", "", _object,0,true,0.3,[[1,1,1,1]]];
|
|
||||||
_scantei_spark setDropInterval _drop;
|
|
||||||
} else
|
|
||||||
{
|
|
||||||
//hint "alb";
|
|
||||||
_scantei_spark setParticleCircle [0, [0, 0, 0]];
|
|
||||||
_scantei_spark setParticleRandom [1, [0.05, 0.05, 0.1], [5, 5, 3], 0, 0.0025, [0, 0, 0, 0], 0, 0];
|
|
||||||
_scantei_spark setParticleParams [["\A3\data_f\proxies\muzzle_flash\muzzle_flash_silencer.p3d", 1, 0, 1], "", "SpaceObject", 1, 1, [0, 0,_spark_poz_rel], [0, 0, 0], 0, 20, 7.9, 0, [0.5,0.5,0.05], [[1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 0]], [0.08], 1, 0, "", "", _object,0,true,0.3,[[5,5,3,1]]];
|
|
||||||
_scantei_spark setDropInterval 0.001;
|
|
||||||
};
|
|
||||||
|
|
||||||
private _spark_sound = selectRandom (keys GVAR(zapSounds));
|
|
||||||
private _sparkSoundData = GVAR(zapSounds) get _spark_sound;
|
|
||||||
playSound3D [_sparkSoundData get "filename", _object, false, getPosASL _object, _sparkSoundData get "volume", _sparkSoundData get "pitch", 75, 0, true];
|
|
||||||
|
|
||||||
[{deleteVehicle _this;}, _scantei_spark, 0.4 + (random 0.7)] call CBA_fnc_waitAndExecute;
|
|
||||||
}, _object] call CBA_fnc_waitUntilAndExecute;
|
|
||||||
|
|
||||||
|
|
||||||
@@ -1,53 +0,0 @@
|
|||||||
#include "..\script_component.hpp"
|
|
||||||
|
|
||||||
// Executed where object is local and removes electronics from inventory
|
|
||||||
|
|
||||||
params [["_object", objNull, [objNull]]];
|
|
||||||
if (isNull _object) exitWith {};
|
|
||||||
if (not (_object isKindOf "CAManBase")) exitWith {["Param _object is not a unit", _object] call BIS_fnc_error};
|
|
||||||
|
|
||||||
// process unit inventory
|
|
||||||
{
|
|
||||||
_object unassignItem _x;
|
|
||||||
_object removeItem _x;
|
|
||||||
} forEach ((items _object) + (assignedItems _object)) select {[_x] call FUNC(isItemElectronic)};
|
|
||||||
|
|
||||||
// replace backpack radio with base and restore items
|
|
||||||
if (isClass (configFile >> "CfgPatches" >> "tfar_core")) then {
|
|
||||||
private _backpackRadio = _object call TFAR_fnc_backpackLR;
|
|
||||||
if (!isNil "_backpackRadio") then {
|
|
||||||
_backpackRadio params ["_actualBackpack", "settings"];
|
|
||||||
private _baseBackpack = _actualBackpack call BIS_fnc_basicBackpack;
|
|
||||||
private _backpackItems = backpackItems _object;
|
|
||||||
|
|
||||||
removeBackpack _object;
|
|
||||||
_object addBackpack _baseBackpack;
|
|
||||||
|
|
||||||
{
|
|
||||||
_object addItemToBackpack _x;
|
|
||||||
} forEach _backpackItems;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
//for player units
|
|
||||||
if (isPlayer _object) then {
|
|
||||||
_object action ["IRLaserOff", _object];
|
|
||||||
_object action ["nvGogglesOff", _object];
|
|
||||||
};
|
|
||||||
|
|
||||||
// remove flashlights/pointers on weapons
|
|
||||||
private _primaryFlashlightOrPointer = (primaryWeaponItems _object)#1;
|
|
||||||
if (_primaryFlashlightOrPointer != "") then {
|
|
||||||
_object removePrimaryWeaponItem _primaryFlashlightOrPointer;
|
|
||||||
_object removeItem _primaryFlashlightOrPointer;
|
|
||||||
};
|
|
||||||
private _secondaryFlashlightOrPointer = (secondaryWeaponItems _object)#1;
|
|
||||||
if (_secondaryFlashlightOrPointer != "") then {
|
|
||||||
_object removeSecondaryWeaponItem _secondaryFlashlightOrPointer;
|
|
||||||
_object removeItem _secondaryFlashlightOrPointer;
|
|
||||||
};
|
|
||||||
private _handgunFlashlightOrPointer = (handgunItems _object)#1;
|
|
||||||
if (_handgunFlashlightOrPointer != "") then {
|
|
||||||
_object removeHandgunItem _handgunFlashlightOrPointer;
|
|
||||||
_object removeItem _handgunFlashlightOrPointer;
|
|
||||||
};
|
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
#include "..\script_component.hpp"
|
|
||||||
|
|
||||||
// Executed where object is local and removes electronics from inventory
|
|
||||||
|
|
||||||
params [["_object", objNull, [objNull]]];
|
|
||||||
if (isNull _object) exitWith {};
|
|
||||||
if (_object isKindOf "CAManBase") exitWith {["Param _object is not a vehicle: %1", _object] call BIS_fnc_error};
|
|
||||||
|
|
||||||
|
|
||||||
// get all items in vehicle that are electronic
|
|
||||||
private _vehicleItems = itemCargo _object;
|
|
||||||
// filter array to identify electronic items
|
|
||||||
_vehicleItems = _vehicleItems select {[_x] call FUNC(isItemElectronic)};
|
|
||||||
{
|
|
||||||
// remove item from vehicle
|
|
||||||
_object addItemCargoGlobal [_x, -1];
|
|
||||||
true;
|
|
||||||
} count _vehicleItems;
|
|
||||||
|
|
||||||
{ // forEach everyContainer _object - process vests, uniforms, backpacks in a vehicle
|
|
||||||
_x params ["_containerClass", "_containerObject"];
|
|
||||||
private _subItemsOfContainer = itemCargo _containerObject;
|
|
||||||
// filter array to identify electronic items
|
|
||||||
_subItemsOfContainer = _subItemsOfContainer select {[_x] call FUNC(isItemElectronic)};
|
|
||||||
{
|
|
||||||
// remove item from container
|
|
||||||
_subContainer addItemCargoGlobal [_x, -1];
|
|
||||||
true;
|
|
||||||
} count _subItemsOfContainer;
|
|
||||||
} forEach (everyContainer _object);
|
|
||||||
|
|
||||||
|
|
||||||
// vehicle is now empty of electronics
|
|
||||||
// built-in vehicle radios cannot be removed and are left in place
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
# EMP Module
|
|
||||||
|
|
||||||
Adapted from:
|
|
||||||
|
|
||||||
- KE_EB EMP Mission Script (unknown author, found by Sherman)
|
|
||||||
- EMP Systems (Murphy, Wenza) on [Steam Workshop](https://steamcommunity.com/sharedfiles/filedetails/?id=2225040619)
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
#define COMPONENT emp
|
|
||||||
#define COMPONENT_BEAUTIFIED EMP
|
|
||||||
#include "../script_mod.hpp"
|
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1,5 +1,7 @@
|
|||||||
#include "..\script_component.hpp"
|
#include "..\script_component.hpp"
|
||||||
|
|
||||||
|
if (!hasInterface) exitWith {};
|
||||||
|
|
||||||
[
|
[
|
||||||
"saveaar",
|
"saveaar",
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,17 +1,27 @@
|
|||||||
#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 = -1;
|
||||||
|
if (_timeWentUnconscious > - 1) then {
|
||||||
|
_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", _durationSpentUnconscious]
|
||||||
|
]] call EFUNC(common,addPlayerInfoToArray)
|
||||||
] remoteExec [QEFUNC(common,log), 2];
|
] remoteExec [QEFUNC(common,log), 2];
|
||||||
|
|
||||||
// systemChat to all remote machines
|
// systemChat to all remote machines
|
||||||
|
|||||||
41
framework/init/functions/fn_checkMissionSettings.sqf
Normal file
41
framework/init/functions/fn_checkMissionSettings.sqf
Normal 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;
|
||||||
@@ -1,12 +1,17 @@
|
|||||||
#include "..\script_component.hpp"
|
#include "..\script_component.hpp"
|
||||||
|
|
||||||
if ( !hasInterface ) exitWith {};
|
if (!hasInterface) exitWith {};
|
||||||
|
|
||||||
// make sure the server has finished init
|
// make sure the server has finished init
|
||||||
waitUntil {!isNil QGVARMAIN(complete)};
|
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);
|
||||||
|
|
||||||
// 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, [
|
||||||
@@ -16,7 +21,7 @@ EGVAR(common,diaryRecords) = createHashMap;
|
|||||||
|
|
||||||
|
|
||||||
// initialize other modules
|
// initialize other modules
|
||||||
call EFUNC(emp,init);
|
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);
|
||||||
@@ -27,6 +32,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),
|
||||||
|
|||||||
@@ -13,7 +13,6 @@ publicVariable QGVARMAIN(baseObjects);
|
|||||||
call EFUNC(common,logMissionInfo);
|
call EFUNC(common,logMissionInfo);
|
||||||
call EFUNC(fbcb2_assets,initServer);
|
call EFUNC(fbcb2_assets,initServer);
|
||||||
call EFUNC(reinsert,initServer);
|
call EFUNC(reinsert,initServer);
|
||||||
call EFUNC(emp,init);
|
|
||||||
|
|
||||||
// declare init complete to other modules
|
// declare init complete to other modules
|
||||||
missionNamespace setVariable [QGVARMAIN(complete), true, true];
|
missionNamespace setVariable [QGVARMAIN(complete), true, true];
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -10,6 +10,9 @@ private _mapCopyAction =
|
|||||||
"\a3\ui_f\data\igui\cfg\actions\talk_ca.paa",
|
"\a3\ui_f\data\igui\cfg\actions\talk_ca.paa",
|
||||||
{
|
{
|
||||||
params ["_target", "_player", "_params"];
|
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;
|
format["Copying map markers from %1", name _target] call CBA_fnc_notify;
|
||||||
[QGVAR(mapCopyRequest), _this, _target] call CBA_fnc_targetEvent;
|
[QGVAR(mapCopyRequest), _this, _target] call CBA_fnc_targetEvent;
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -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
|
||||||
//---------------------
|
//---------------------
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|
||||||
@@ -6,9 +6,9 @@
|
|||||||
#define VERSION_STR MAJOR.MINOR.PATCHLVL
|
#define VERSION_STR MAJOR.MINOR.PATCHLVL
|
||||||
#define VERSION_AR MAJOR,MINOR,PATCHLVL
|
#define VERSION_AR MAJOR,MINOR,PATCHLVL
|
||||||
|
|
||||||
#define DEBUG_MODE -1 // TRACE
|
// #define DEBUG_MODE -1 // TRACE
|
||||||
// #define DEBUG_MODE 0 // DEBUG
|
// #define DEBUG_MODE 0 // DEBUG
|
||||||
// #define DEBUG_MODE 1 // INFO
|
#define DEBUG_MODE 1 // INFO
|
||||||
// #define DEBUG_MODE 2 // WARNING
|
// #define DEBUG_MODE 2 // WARNING
|
||||||
// #define DEBUG_MODE 3 // ERROR
|
// #define DEBUG_MODE 3 // ERROR
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
|
|
||||||
milsim_fnc_addMedicalOverlayPFH
|
milsim_triageIcons_fnc_draw3D
|
||||||
|
|
||||||
Author: IndigoFox
|
Author: IndigoFox
|
||||||
|
|
||||||
@@ -14,30 +14,20 @@ Description:
|
|||||||
|
|
||||||
#include "..\script_component.hpp"
|
#include "..\script_component.hpp"
|
||||||
|
|
||||||
|
if (!hasInterface) exitWith {};
|
||||||
|
|
||||||
// Per-frame handler to draw icons
|
|
||||||
// cleanup
|
// adds codeblock to common array to be processed per frame
|
||||||
if (!isNil QGVAR(drawIconsPfh)) then {
|
private _code = {
|
||||||
[GVAR(drawIconsPfh)] call CBA_fnc_removePerFrameHandler;
|
|
||||||
};
|
|
||||||
// add pfh
|
|
||||||
GVAR(drawIconsPfh) = [{
|
|
||||||
// if disabled, skip processing
|
// if disabled, skip processing
|
||||||
if (!GVAR(setting_enabled)) exitWith {false};
|
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 the player doesn't have medical perms, skip processing
|
||||||
if !([player] call ace_medical_treatment_fnc_isMedic) exitWith {false};
|
if !([player] call ace_medical_treatment_fnc_isMedic) exitWith {false};
|
||||||
|
|
||||||
{
|
{
|
||||||
private _unit = _x;
|
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
|
// color based on triage level
|
||||||
private _triageLevel = _unit getVariable ["ace_medical_triageLevel", 4];
|
private _triageLevel = _unit getVariable ["ace_medical_triageLevel", 4];
|
||||||
if (_triageLevel == -1) then {continue};
|
if (_triageLevel == -1) then {continue};
|
||||||
@@ -57,6 +47,17 @@ GVAR(drawIconsPfh) = [{
|
|||||||
true // outline
|
true // outline
|
||||||
// further params optional, omitted
|
// 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);
|
||||||
@@ -1,7 +1,8 @@
|
|||||||
#include "..\script_component.hpp"
|
#include "..\script_component.hpp"
|
||||||
|
|
||||||
// List of units to draw icons for
|
if (!hasInterface) exitWith {};
|
||||||
GVAR(drawTargets) = [];
|
|
||||||
|
call FUNC(draw3D);
|
||||||
|
|
||||||
[
|
[
|
||||||
LEVEL_DEBUG,
|
LEVEL_DEBUG,
|
||||||
|
|||||||
103
framework/vehicleFlags/functions/fn_addFlagActions.sqf
Normal file
103
framework/vehicleFlags/functions/fn_addFlagActions.sqf
Normal 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;
|
||||||
24
framework/vehicleFlags/functions/fn_draw3D.sqf
Normal file
24
framework/vehicleFlags/functions/fn_draw3D.sqf
Normal 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);
|
||||||
@@ -2,101 +2,8 @@
|
|||||||
|
|
||||||
if (!hasInterface) exitWith {};
|
if (!hasInterface) exitWith {};
|
||||||
|
|
||||||
private _vehicleFlagsCfg = call FUNC(getVehicleFlagsCfg);
|
call FUNC(addFlagActions);
|
||||||
|
call FUNC(draw3D);
|
||||||
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;
|
|
||||||
|
|
||||||
[
|
[
|
||||||
LEVEL_DEBUG,
|
LEVEL_DEBUG,
|
||||||
|
|||||||
@@ -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";
|
||||||
|
|||||||
Reference in New Issue
Block a user