Compare commits
17 Commits
bbe798734a
...
emp
| Author | SHA1 | Date | |
|---|---|---|---|
|
d946170831
|
|||
|
ba708a8aa9
|
|||
|
032377d7f6
|
|||
|
e0e06eff5e
|
|||
|
|
2c733f77df | ||
| 8ed6b8a5c6 | |||
| 1d7e1ede37 | |||
| 363016d778 | |||
|
442cb0b0b2
|
|||
|
2db018103c
|
|||
|
fba423e38d
|
|||
|
7268d8fd50
|
|||
|
3217ec487d
|
|||
|
7c903d1021
|
|||
| 644de22b32 | |||
|
dfd79c0d70
|
|||
|
5d3c28b807
|
47
README.md
47
README.md
@@ -78,4 +78,49 @@ All modules are broken apart as such in /framework. Client and server inits are
|
|||||||
|
|
||||||
Pay attention to framework/script_mod.hpp prior to deployment of releases, as the debug settings within will determine what is logged during prod missions.
|
Pay attention to framework/script_mod.hpp prior to deployment of releases, as the debug settings within will determine what is logged during prod missions.
|
||||||
|
|
||||||
CfgFunctions is sensitive to the folder/script_component.hpp of each module.
|
CfgFunctions is sensitive to the folder/script_component.hpp of each module.
|
||||||
|
|
||||||
|
### `defines` Directory
|
||||||
|
|
||||||
|
This directory contains a number of hpp files used to define constants throughout the framework. These should ONLY be edited by or with the supervision of a developer to reflect format battalion-wide changes.
|
||||||
|
|
||||||
|
- `ApprovedAssets.hpp`: Contains subclasses for approved aerial assets with their assigned callsigns. Used primarily in `fbcb2_assets`.
|
||||||
|
- `BattalionInfo.hpp`: Used for representing Battalion structure, element callsigns, and radio frequency assignments. Used primarily in `fbcb2_main`.
|
||||||
|
- `DisallowedEquipment.hpp`: Contains flagged item classnames by category that players may not use, or may use only in specific roles. Used to monitor and enforce equipment restrictions.
|
||||||
|
- `SignalColors.hpp`: Contains smoke/flare/chemlight colors and what they represent in the field. Used primarily in `fbcb2_main` for the Signal Colors diary record.
|
||||||
|
- `SupplyCrates.hpp`: Contains the types, contents, and metadata for all supply crate types in the `resupply` module.
|
||||||
|
- `VehicleFlags.hpp`: Defines system information, flag categories, and flag options used to populate ACE3 interaction menus for vehicles. Used by the `vehicleFlags` module.
|
||||||
|
|
||||||
|
|
||||||
|
### Modules List
|
||||||
|
|
||||||
|
*Within `framework`:*
|
||||||
|
|
||||||
|
- `ambience`:
|
||||||
|
- Adds ambient flak capabilities.
|
||||||
|
- `client`:
|
||||||
|
- Contains core client-side event handlers and actions that don't fit into other modules.
|
||||||
|
- `common`:
|
||||||
|
- Contains common functions and variables used by multiple modules.
|
||||||
|
- `fbcb2_main`:
|
||||||
|
- Contains the main FBCB2 functionality and initialization code. Populates the briefing/diary with mission information.
|
||||||
|
- `fbcb2_assets`:
|
||||||
|
- A subcomponent of `fbcb2_main`. Used to gather, display, and manage diary records as intel for assets near known bases.
|
||||||
|
- `init`:
|
||||||
|
- Contains core initialization functions. Both server and client inits across all modules are managed here.
|
||||||
|
- `mapcopy`:
|
||||||
|
- Gives players the ability to copy each other's maps.
|
||||||
|
- `performance`:
|
||||||
|
- Contains functionality for monitoring and logging performance data.
|
||||||
|
- `reinsert`:
|
||||||
|
- Provides a reinsertion queue system for players and pilots to maximize efficiency of the reinsertion process.
|
||||||
|
- `resupply`:
|
||||||
|
- Provides a Zeus module and standalone function to spawn pre-equipped supply crates onto the battlefield.
|
||||||
|
- Supply crate definitions are stored in `defines/SupplyCrates.hpp`.
|
||||||
|
- Optionally, allows players to spawn supply crates from arsenal boxes.
|
||||||
|
- `triageIcons`:
|
||||||
|
- For those with medical permissions (`ace_medical`), provides a configurable 3D icon over unconscious units indicating their current ACE Triage Card status.
|
||||||
|
- `vehicleFlags`:
|
||||||
|
- Provides an ACE3 interaction menu that allows players to attach and remove flags from vehicles.
|
||||||
|
- Flags are defined in `defines/VehicleFlags.hpp`.
|
||||||
|
|
||||||
|
|||||||
@@ -125,5 +125,40 @@ class VehicleFlags {
|
|||||||
texture = "textures\flags_misc\flag_redcross_co.paa";
|
texture = "textures\flags_misc\flag_redcross_co.paa";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class BuiltIn {
|
||||||
|
actionID = "flag_builtin";
|
||||||
|
actionTitle = "Built-In";
|
||||||
|
class BlueFlag {
|
||||||
|
actionID = "flag_builtin_blue";
|
||||||
|
actionTitle = "Blue Flag";
|
||||||
|
texture = "\A3\Data_F\Flags\flag_blue_CO.paa";
|
||||||
|
};
|
||||||
|
class GreenFlag {
|
||||||
|
actionID = "flag_builtin_green";
|
||||||
|
actionTitle = "Green Flag";
|
||||||
|
texture = "\A3\Data_F\Flags\flag_green_CO.paa";
|
||||||
|
};
|
||||||
|
class RedFlag {
|
||||||
|
actionID = "flag_builtin_red";
|
||||||
|
actionTitle = "Red Flag";
|
||||||
|
texture = "\A3\Data_F\Flags\flag_red_CO.paa";
|
||||||
|
};
|
||||||
|
class WhiteFlag {
|
||||||
|
actionID = "flag_builtin_white";
|
||||||
|
actionTitle = "White Flag";
|
||||||
|
texture = "\A3\Data_F\Flags\flag_white_CO.paa";
|
||||||
|
};
|
||||||
|
class NATOFlag {
|
||||||
|
actionID = "flag_builtin_nato";
|
||||||
|
actionTitle = "NATO Flag";
|
||||||
|
texture = "\A3\Data_F\Flags\flag_NATO_CO.paa";
|
||||||
|
};
|
||||||
|
class UNFlag {
|
||||||
|
actionID = "flag_builtin_un";
|
||||||
|
actionTitle = "UN Flag";
|
||||||
|
texture = "\A3\Data_F\Flags\Flag_uno_CO.paa";
|
||||||
|
};
|
||||||
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
@@ -95,7 +95,13 @@ class Params
|
|||||||
|
|
||||||
|
|
||||||
// CfgFunctions
|
// CfgFunctions
|
||||||
#include "framework\CfgFunctions.hpp"
|
class CfgFunctions {
|
||||||
|
#include "framework\CfgFunctions.hpp"
|
||||||
|
};
|
||||||
|
|
||||||
|
class CfgSounds {
|
||||||
|
#include "framework\emp\CfgSounds.hpp"
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,172 +1,200 @@
|
|||||||
#include "script_mod.hpp"
|
#include "script_mod.hpp"
|
||||||
|
|
||||||
class CfgFunctions {
|
class DOUBLES(PREFIX,init) {
|
||||||
|
class functions {
|
||||||
class DOUBLES(PREFIX,init) {
|
file = "framework\init\functions";
|
||||||
class functions {
|
class initServer { postInit = 1;};
|
||||||
file = "framework\init\functions";
|
class initClient { postInit = 1;};
|
||||||
class initServer { postInit = 1;};
|
class setDefaults { postInit = 1; };
|
||||||
class initClient { postInit = 1;};
|
class addAARChatHandler { postInit = 1; };
|
||||||
class setDefaults { postInit = 1; };
|
class addRespawnChatHandler { postInit = 1; };
|
||||||
class addAARChatHandler { postInit = 1; };
|
|
||||||
class addRespawnChatHandler { postInit = 1; };
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
class PREFIX {
|
||||||
class PREFIX {
|
class ambience {
|
||||||
class ambience {
|
file = "framework\ambience";
|
||||||
file = "framework\ambience";
|
class flakInitVehicle {};
|
||||||
class flakInitVehicle {};
|
class flakEH {};
|
||||||
class flakEH {};
|
|
||||||
};
|
|
||||||
|
|
||||||
class map {
|
|
||||||
file = "framework\map";
|
|
||||||
class initMapCopy { postInit = 1; };
|
|
||||||
class copyMapFromPlayer {}; //needs refactor
|
|
||||||
class getPlayerMapMarkers {}; //needs refactor
|
|
||||||
class loadMapMarkers {}; //needs refactor
|
|
||||||
class mapMarkerToString {}; //needs refactor
|
|
||||||
class stringToMapMarker {}; //needs refactor
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
};
|
||||||
|
|
||||||
class DOUBLES(PREFIX,client) {
|
class DOUBLES(PREFIX,client) {
|
||||||
class functions {
|
class functions {
|
||||||
file = "framework\client\functions";
|
file = "framework\client\functions";
|
||||||
class addZenModules { postInit = 1; };
|
class bindEmptyGroupGarbageCleanup { postInit = 1; };
|
||||||
class bindEmptyGroupGarbageCleanup { postInit = 1; };
|
class bindEventHandlers { postInit = 1; };
|
||||||
class bindEventHandlers { postInit = 1; };
|
class bindVehicleActions { postInit = 1; };
|
||||||
class bindVehicleActions { postInit = 1; };
|
class addZenModules {postInit = 1;};
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
class DOUBLES(PREFIX,common) {
|
||||||
class DOUBLES(PREFIX,common) {
|
class functions {
|
||||||
class functions {
|
file = "framework\common\functions";
|
||||||
file = "framework\common\functions";
|
class addCBASettings { preInit = 1; };
|
||||||
class addCBASettings { preInit = 1; };
|
class logMissionInfo {};
|
||||||
class logMissionInfo {};
|
class addPlayerInfoToArray {};
|
||||||
class addPlayerInfoToArray {};
|
class createOrUpdateDiaryRecord {};
|
||||||
class getApprovedAssetsCfg {};
|
class getApprovedAssetsCfg {};
|
||||||
class getBattalionCfg {};
|
class getBattalionCfg {};
|
||||||
class getNameOfBase {};
|
class getNameOfBase {};
|
||||||
class getNearestBase {};
|
class getNearestBase {};
|
||||||
class log {};
|
class log {};
|
||||||
class checkPlayerInventory {};
|
class checkPlayerInventory {};
|
||||||
class logSettingChanged {};
|
class logSettingChanged {};
|
||||||
class padString {};
|
class padString {};
|
||||||
class recurseSubclasses {};
|
class recurseSubclasses {};
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
};
|
||||||
|
|
||||||
class DOUBLES(PREFIX,fbcb2_assets) {
|
class DOUBLES(PREFIX,emp) {
|
||||||
class functions {
|
class functions {
|
||||||
file = "framework\fbcb2_assets\functions";
|
file = "framework\emp\functions";
|
||||||
class addCBASettings {preInit=1;};
|
// class addCBASettings {preInit=1;};
|
||||||
class initServer {};
|
class init {};
|
||||||
class initClient {};
|
class addACEActions {};
|
||||||
class getCallsignFromClassname {};
|
|
||||||
class getCurrentAssetsByBase {};
|
class applyLocalObjectEffects {};
|
||||||
class getInventory {};
|
class applyLocalGroupEffects {};
|
||||||
class getMagsForWeapon {};
|
class applyGlobalObjectEffects {};
|
||||||
class getStartingAndCurrentAssets {};
|
class applyServerObjectEffects {};
|
||||||
class getStartingAssetsByBase {};
|
|
||||||
class getVehicleData {};
|
class deploy {};
|
||||||
class getWeaponry {};
|
class getObjectsAndGroupsToAffect {};
|
||||||
class hintAllApprovedAssets {};
|
class playLocalEffects {};
|
||||||
class isAssetInRangeOfBase {};
|
class playLocalEffectsForObject {};
|
||||||
class removeAssetDiaryRecords {};
|
|
||||||
class removeMarkersOnMap {};
|
class isItemElectronic {};
|
||||||
class showMarkersOnMap {};
|
class removeUnitElectricInventoryItems {};
|
||||||
class updateAssetDiary {};
|
class removeVehicleElectricInventoryItems {};
|
||||||
class updateAssetsByBase {};
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
};
|
||||||
|
|
||||||
class DOUBLES(PREFIX,fbcb2_main) {
|
class DOUBLES(PREFIX,fbcb2_assets) {
|
||||||
class functions {
|
class functions {
|
||||||
file = "framework\fbcb2_main\functions";
|
file = "framework\fbcb2_assets\functions";
|
||||||
class initClient {};
|
class addCBASettings {preInit=1;};
|
||||||
class addEnvironmentRecord {};
|
class initServer {};
|
||||||
class addFrequenciesRecord {};
|
class initClient {};
|
||||||
class addSignalColorsRecord {};
|
class getCallsignFromClassname {};
|
||||||
};
|
class getCurrentAssetsByBase {};
|
||||||
class util {
|
class getInventory {};
|
||||||
file = "framework\fbcb2_main\util";
|
class getMagsForWeapon {};
|
||||||
class createOrUpdateDiaryRecord {};
|
class getStartingAndCurrentAssets {};
|
||||||
class formatRadioElementForDiary {};
|
class getStartingAssetsByBase {};
|
||||||
class generateElementFrequencyRecordText {};
|
class getVehicleData {};
|
||||||
};
|
class getWeaponry {};
|
||||||
|
class hintAllApprovedAssets {};
|
||||||
|
class isAssetInRangeOfBase {};
|
||||||
|
class removeAssetDiaryRecords {};
|
||||||
|
class removeMarkersOnMap {};
|
||||||
|
class showMarkersOnMap {};
|
||||||
|
class updateAssetDiary {};
|
||||||
|
class updateAssetsByBase {};
|
||||||
};
|
};
|
||||||
|
};
|
||||||
|
|
||||||
class DOUBLES(PREFIX,performance) {
|
class DOUBLES(PREFIX,fbcb2_main) {
|
||||||
class functions {
|
class functions {
|
||||||
file = "framework\performance\functions";
|
file = "framework\fbcb2_main\functions";
|
||||||
class addCBASettings {preInit=1;};
|
class initClient {};
|
||||||
class addDNI_PlayerFPS { postInit = 1; };
|
class addEnvironmentRecord {};
|
||||||
|
class addFrequenciesRecord {};
|
||||||
// PFHs managed in addCBASettings onChange code
|
class addSignalColorsRecord {};
|
||||||
class addClientStatsPFH {};
|
|
||||||
class calculateClientStats {};
|
|
||||||
class addServerStatsPFH {};
|
|
||||||
class calculateServerStats {};
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
class util {
|
||||||
class DOUBLES(PREFIX,reinsert) {
|
file = "framework\fbcb2_main\util";
|
||||||
class functions {
|
class formatRadioElementForDiary {};
|
||||||
file = "framework\reinsert\functions";
|
class generateElementFrequencyRecordText {};
|
||||||
class addCBASettings {preInit=1;};
|
|
||||||
};
|
|
||||||
class server {
|
|
||||||
file = "framework\reinsert\server";
|
|
||||||
class initServer {};
|
|
||||||
class addToQueue {};
|
|
||||||
class globalShowQueue {};
|
|
||||||
class removeFromQueue {};
|
|
||||||
class returnReinsertQueueNotification {};
|
|
||||||
class validateQueue {};
|
|
||||||
};
|
|
||||||
class client {
|
|
||||||
file = "framework\reinsert\client";
|
|
||||||
class initClient {};
|
|
||||||
class addAceSelfActions {};
|
|
||||||
class addCheckQueueSelfAction {};
|
|
||||||
class requestShowQueue {};
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
};
|
||||||
|
|
||||||
class DOUBLES(PREFIX,resupply) {
|
class DOUBLES(PREFIX,mapcopy) {
|
||||||
class functions {
|
class functions {
|
||||||
file = "framework\resupply\functions";
|
file = "framework\mapcopy\functions";
|
||||||
class addCBASettings {preInit=1;};
|
class addCBASettings {preInit=1;};
|
||||||
class initClient {};
|
class initClient {};
|
||||||
class createBox {};
|
class getMapMarkers {};
|
||||||
class getSupplyCratesCfg {};
|
class loadMapMarkers {};
|
||||||
class addArsenalObjectSpawnBoxActions {};
|
class mapMarkerToString {};
|
||||||
};
|
class stringToMapMarker {};
|
||||||
};
|
};
|
||||||
|
};
|
||||||
|
|
||||||
class DOUBLES(PREFIX,triageIcons) {
|
class DOUBLES(PREFIX,performance) {
|
||||||
class functions {
|
class functions {
|
||||||
file = "framework\triageIcons\functions";
|
file = "framework\performance\functions";
|
||||||
class addCBASettings {preInit=1;};
|
class addCBASettings {preInit=1;};
|
||||||
class initClient {};
|
class addDNI_PlayerFPS { postInit = 1; };
|
||||||
class addDrawIconsPFH {};
|
|
||||||
class addGetEntitiesPFH {};
|
// PFHs managed in addCBASettings onChange code
|
||||||
class updateColors {};
|
class addClientStatsPFH {};
|
||||||
};
|
class calculateClientStats {};
|
||||||
|
class addServerStatsPFH {};
|
||||||
|
class calculateServerStats {};
|
||||||
};
|
};
|
||||||
|
};
|
||||||
|
|
||||||
class DOUBLES(PREFIX,vehicleFlags) {
|
class DOUBLES(PREFIX,reinsert) {
|
||||||
class functions {
|
class functions {
|
||||||
file = "framework\vehicleFlags\functions";
|
file = "framework\reinsert\functions";
|
||||||
class initClient {};
|
class addCBASettings {preInit=1;};
|
||||||
class getActionsFlagCategories {};
|
};
|
||||||
class getVehicleFlagsCfg {};
|
class server {
|
||||||
class isClassExcluded {};
|
file = "framework\reinsert\server";
|
||||||
};
|
class initServer {};
|
||||||
|
class addToQueue {};
|
||||||
|
class globalShowQueue {};
|
||||||
|
class removeFromQueue {};
|
||||||
|
class returnReinsertQueueNotification {};
|
||||||
|
class validateQueue {};
|
||||||
|
};
|
||||||
|
class client {
|
||||||
|
file = "framework\reinsert\client";
|
||||||
|
class initClient {};
|
||||||
|
class addAceSelfActions {};
|
||||||
|
class addCheckQueueSelfAction {};
|
||||||
|
class requestShowQueue {};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
class DOUBLES(PREFIX,resupply) {
|
||||||
|
class functions {
|
||||||
|
file = "framework\resupply\functions";
|
||||||
|
class addCBASettings {preInit=1;};
|
||||||
|
class initClient {};
|
||||||
|
class createBox {};
|
||||||
|
class getSupplyCratesCfg {};
|
||||||
|
class addArsenalObjectSpawnBoxActions {};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
class DOUBLES(PREFIX,triageIcons) {
|
||||||
|
class functions {
|
||||||
|
file = "framework\triageIcons\functions";
|
||||||
|
class addCBASettings {preInit=1;};
|
||||||
|
class initClient {};
|
||||||
|
class addDrawIconsPFH {};
|
||||||
|
class addGetEntitiesPFH {};
|
||||||
|
class updateColors {};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
class DOUBLES(PREFIX,vehicleFlags) {
|
||||||
|
class functions {
|
||||||
|
file = "framework\vehicleFlags\functions";
|
||||||
|
class initClient {};
|
||||||
|
class getActionsFlagCategories {};
|
||||||
|
class getVehicleFlagsCfg {};
|
||||||
|
class isClassExcluded {};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
class DOUBLES(PREFIX,zeus) {
|
||||||
|
class functions {
|
||||||
|
file = "framework\zeus\functions";
|
||||||
|
class initClient {};
|
||||||
|
class addZenModules {};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
@@ -2,61 +2,6 @@
|
|||||||
|
|
||||||
if ( !hasInterface ) exitWith {};
|
if ( !hasInterface ) exitWith {};
|
||||||
|
|
||||||
[
|
|
||||||
QUOTE(MODULE_CATEGORY_NAME),
|
|
||||||
"Create Resupply Box",
|
|
||||||
{
|
|
||||||
params [["_pos", [0,0,0], [[]], 3], ["_target", objNull, [objNull]]];
|
|
||||||
// get parent definition
|
|
||||||
private _supplyCratesCfg = call EFUNC(resupply,getSupplyCratesCfg);
|
|
||||||
// get the subclass names
|
|
||||||
private _boxTypesAvailable = _supplyCratesCfg call BIS_fnc_getCfgSubClasses;
|
|
||||||
|
|
||||||
_boxTypesAvailable sort true;
|
|
||||||
_comboOptions = _boxTypesAvailable apply {
|
|
||||||
[
|
|
||||||
// display name
|
|
||||||
[_supplyCratesCfg >> _x >> "displayName", "STRING", "ERROR"] call CBA_fnc_getConfigEntry,
|
|
||||||
// tooltip
|
|
||||||
[_supplyCratesCfg >> _x >> "tooltip", "STRING", "ERROR"] call CBA_fnc_getConfigEntry,
|
|
||||||
// icon
|
|
||||||
[_supplyCratesCfg >> _x >> "icon", "STRING", "ERROR"] call CBA_fnc_getConfigEntry
|
|
||||||
]
|
|
||||||
};
|
|
||||||
|
|
||||||
[
|
|
||||||
"Resupply Box Options",
|
|
||||||
[
|
|
||||||
// [ "COMBO", "Box Type", [[1,2,3], [["Ammo"],["Weapons"],["Medical"]],0] ]
|
|
||||||
["COMBO", "Box Type", [_boxTypesAvailable, _comboOptions, 0]]
|
|
||||||
],
|
|
||||||
{
|
|
||||||
|
|
||||||
params ["_dialog", "_args"];
|
|
||||||
|
|
||||||
_dialog params ["_typeOptionSelected"];
|
|
||||||
_args params ["_pos", "_target", "_keysSorted"];
|
|
||||||
|
|
||||||
|
|
||||||
private _box = [_target, _typeOptionSelected, _pos] call EFUNC(resupply,createBox);
|
|
||||||
if (isNull _box) exitWith {
|
|
||||||
["Resupply Box", "WARNING: Failed to locate or create box!"] call BIS_fnc_curatorHint;
|
|
||||||
};
|
|
||||||
[
|
|
||||||
"Resupply Box",
|
|
||||||
format[
|
|
||||||
"Created %1",
|
|
||||||
getText((call EFUNC(resupply,getSupplyCratesCfg)) >> _typeOptionSelected >> "displayName")
|
|
||||||
]
|
|
||||||
] call BIS_fnc_curatorHint;
|
|
||||||
},
|
|
||||||
{},
|
|
||||||
[_pos, _target]
|
|
||||||
] call zen_dialog_fnc_create;
|
|
||||||
}
|
|
||||||
] call zen_custom_modules_fnc_register;
|
|
||||||
|
|
||||||
|
|
||||||
[
|
[
|
||||||
QUOTE(MODULE_CATEGORY_NAME),
|
QUOTE(MODULE_CATEGORY_NAME),
|
||||||
"Grounds Cleanup",
|
"Grounds Cleanup",
|
||||||
|
|||||||
@@ -3,12 +3,21 @@
|
|||||||
if (!hasInterface) exitWith {};
|
if (!hasInterface) exitWith {};
|
||||||
|
|
||||||
params [
|
params [
|
||||||
["_subjectID", GVAR(subjectStatusID), [""]],
|
["_subjectID", "", [""]],
|
||||||
["_recordTitle", "", [""]],
|
["_recordTitle", "", [""]],
|
||||||
["_recordText", "", [""]],
|
["_recordText", "", [""]],
|
||||||
["_recordIcon", "", [""]]
|
["_recordIcon", "", [""]]
|
||||||
];
|
];
|
||||||
|
|
||||||
|
// Check if all parameters are provided
|
||||||
|
if (
|
||||||
|
count _subjectID isEqualTo 0 ||
|
||||||
|
count _recordTitle isEqualTo 0 ||
|
||||||
|
count _recordText isEqualTo 0
|
||||||
|
) exitWith {
|
||||||
|
[LEVEL_ERROR, QUOTE(COMPONENT), "Not all parameters provided"] call EFUNC(common,log);
|
||||||
|
};
|
||||||
|
|
||||||
// Check if already created
|
// Check if already created
|
||||||
private _subjectRecords = GVAR(diaryRecords) getOrDefault [_subjectID, createHashMap, true];
|
private _subjectRecords = GVAR(diaryRecords) getOrDefault [_subjectID, createHashMap, true];
|
||||||
private _existingRecord = _subjectRecords getOrDefault [_recordTitle, diaryRecordNull, true];
|
private _existingRecord = _subjectRecords getOrDefault [_recordTitle, diaryRecordNull, true];
|
||||||
@@ -27,7 +27,16 @@ private _hash = createHashMapFromArray _data;
|
|||||||
_message regexReplace ['(\[)', "("];
|
_message regexReplace ['(\[)', "("];
|
||||||
_message regexReplace ['(\])', ")"];
|
_message regexReplace ['(\])', ")"];
|
||||||
|
|
||||||
|
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", QUOTE(PREFIX), _component, _fnc_scriptNameParent, _message, _json];
|
_log = format ["[%1] [%2] [%3] [%4] [%5] :: %6", QUOTE(PREFIX), _component, _fnc_scriptNameParent, _levelText, _message, _json];
|
||||||
|
|
||||||
diag_log text _log;
|
diag_log text _log;
|
||||||
37
framework/emp/CfgSounds.hpp
Normal file
37
framework/emp/CfgSounds.hpp
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
#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,""};
|
||||||
|
};
|
||||||
38
framework/emp/functions/fn_addACEActions.sqf
Normal file
38
framework/emp/functions/fn_addACEActions.sqf
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
#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;
|
||||||
35
framework/emp/functions/fn_applyGlobalObjectEffects.sqf
Normal file
35
framework/emp/functions/fn_applyGlobalObjectEffects.sqf
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
#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];
|
||||||
9
framework/emp/functions/fn_applyLocalGroupEffects.sqf
Normal file
9
framework/emp/functions/fn_applyLocalGroupEffects.sqf
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
#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;
|
||||||
28
framework/emp/functions/fn_applyLocalObjectEffects.sqf
Normal file
28
framework/emp/functions/fn_applyLocalObjectEffects.sqf
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
#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;
|
||||||
13
framework/emp/functions/fn_applyServerObjectEffects.sqf
Normal file
13
framework/emp/functions/fn_applyServerObjectEffects.sqf
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
#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];
|
||||||
31
framework/emp/functions/fn_deploy.sqf
Normal file
31
framework/emp/functions/fn_deploy.sqf
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
#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;
|
||||||
68
framework/emp/functions/fn_getObjectsAndGroupsToAffect.sqf
Normal file
68
framework/emp/functions/fn_getObjectsAndGroupsToAffect.sqf
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
#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];
|
||||||
280
framework/emp/functions/fn_init.sqf
Normal file
280
framework/emp/functions/fn_init.sqf
Normal file
@@ -0,0 +1,280 @@
|
|||||||
|
#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;
|
||||||
38
framework/emp/functions/fn_isItemElectronic.sqf
Normal file
38
framework/emp/functions/fn_isItemElectronic.sqf
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
#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;
|
||||||
101
framework/emp/functions/fn_playLocalEffects.sqf
Normal file
101
framework/emp/functions/fn_playLocalEffects.sqf
Normal file
@@ -0,0 +1,101 @@
|
|||||||
|
#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;
|
||||||
79
framework/emp/functions/fn_playLocalEffectsForObject.sqf
Normal file
79
framework/emp/functions/fn_playLocalEffectsForObject.sqf
Normal file
@@ -0,0 +1,79 @@
|
|||||||
|
#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;
|
||||||
|
|
||||||
|
|
||||||
@@ -0,0 +1,53 @@
|
|||||||
|
#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;
|
||||||
|
};
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
#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
|
||||||
6
framework/emp/readme.md
Normal file
6
framework/emp/readme.md
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
# 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)
|
||||||
3
framework/emp/script_component.hpp
Normal file
3
framework/emp/script_component.hpp
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
#define COMPONENT emp
|
||||||
|
#define COMPONENT_BEAUTIFIED EMP
|
||||||
|
#include "../script_mod.hpp"
|
||||||
BIN
framework/emp/sounds/echo3.wss
Normal file
BIN
framework/emp/sounds/echo3.wss
Normal file
Binary file not shown.
BIN
framework/emp/sounds/ecou.wss
Normal file
BIN
framework/emp/sounds/ecou.wss
Normal file
Binary file not shown.
BIN
framework/emp/sounds/electric_explsion_impact_large.wss
Normal file
BIN
framework/emp/sounds/electric_explsion_impact_large.wss
Normal file
Binary file not shown.
BIN
framework/emp/sounds/zap1.wss
Normal file
BIN
framework/emp/sounds/zap1.wss
Normal file
Binary file not shown.
BIN
framework/emp/sounds/zap2.wss
Normal file
BIN
framework/emp/sounds/zap2.wss
Normal file
Binary file not shown.
BIN
framework/emp/sounds/zap3.wss
Normal file
BIN
framework/emp/sounds/zap3.wss
Normal file
Binary file not shown.
BIN
framework/emp/sounds/zap4.wss
Normal file
BIN
framework/emp/sounds/zap4.wss
Normal file
Binary file not shown.
@@ -21,7 +21,7 @@ call FUNC(updateAssetDiary);
|
|||||||
[
|
[
|
||||||
LEVEL_DEBUG,
|
LEVEL_DEBUG,
|
||||||
QUOTE(COMPONENT),
|
QUOTE(COMPONENT),
|
||||||
"postInit complete",
|
"initClient complete",
|
||||||
[]
|
[]
|
||||||
] call EFUNC(common,log);
|
] call EFUNC(common,log);
|
||||||
|
|
||||||
|
|||||||
@@ -241,7 +241,7 @@ private _randomColors = [
|
|||||||
],
|
],
|
||||||
_recordText joinString "<br/>",
|
_recordText joinString "<br/>",
|
||||||
_icon
|
_icon
|
||||||
] call EFUNC(fbcb2_main,createOrUpdateDiaryRecord);
|
] call EFUNC(common,createOrUpdateDiaryRecord);
|
||||||
|
|
||||||
// "\A3\ui_f\data\igui\cfg\simpleTasks\types\car_ca.paa"
|
// "\A3\ui_f\data\igui\cfg\simpleTasks\types\car_ca.paa"
|
||||||
} forEach _distinctVehiclesClassNames;
|
} forEach _distinctVehiclesClassNames;
|
||||||
|
|||||||
@@ -109,4 +109,4 @@ _text = _text joinString "<br/>";
|
|||||||
GVAR(subjectIntelID),
|
GVAR(subjectIntelID),
|
||||||
_recordTitle,
|
_recordTitle,
|
||||||
_text
|
_text
|
||||||
] call FUNC(createOrUpdateDiaryRecord);
|
] call EFUNC(common,createOrUpdateDiaryRecord);
|
||||||
@@ -62,7 +62,7 @@ reverse _battalionElementCfgs;
|
|||||||
GVAR(subjectFrequenciesID),
|
GVAR(subjectFrequenciesID),
|
||||||
_diaryTitleText#0,
|
_diaryTitleText#0,
|
||||||
_diaryTitleText#1
|
_diaryTitleText#1
|
||||||
] call FUNC(createOrUpdateDiaryRecord);
|
] call EFUNC(common,createOrUpdateDiaryRecord);
|
||||||
} forEach _battalionElementCfgs;
|
} forEach _battalionElementCfgs;
|
||||||
|
|
||||||
// add the battalion command to the top of the list
|
// add the battalion command to the top of the list
|
||||||
@@ -72,6 +72,6 @@ private _diaryTitleText = [_battalionInfoCfg >> "Command", false] call FUNC(gene
|
|||||||
GVAR(subjectFrequenciesID),
|
GVAR(subjectFrequenciesID),
|
||||||
_diaryTitleText#0,
|
_diaryTitleText#0,
|
||||||
_diaryTitleText#1
|
_diaryTitleText#1
|
||||||
] call FUNC(createOrUpdateDiaryRecord);
|
] call EFUNC(common,createOrUpdateDiaryRecord);
|
||||||
|
|
||||||
true;
|
true;
|
||||||
@@ -56,4 +56,4 @@ _text = _text joinString "<br/><br/>";
|
|||||||
GVAR(subjectIntelID),
|
GVAR(subjectIntelID),
|
||||||
_recordTitle,
|
_recordTitle,
|
||||||
_text
|
_text
|
||||||
] call FUNC(createOrUpdateDiaryRecord);
|
] call EFUNC(common,createOrUpdateDiaryRecord);
|
||||||
@@ -25,12 +25,6 @@ player createDiarySubject[GVAR(subjectAssetsFixedWingID), "FBCB2 Planes"];
|
|||||||
player createDiarySubject[GVAR(subjectAssetsRotaryID), "FBCB2 Helicopters"];
|
player createDiarySubject[GVAR(subjectAssetsRotaryID), "FBCB2 Helicopters"];
|
||||||
player createDiarySubject[GVAR(subjectAssetsGroundID), "FBCB2 Ground"];
|
player createDiarySubject[GVAR(subjectAssetsGroundID), "FBCB2 Ground"];
|
||||||
|
|
||||||
// store records in format:
|
|
||||||
// [subject, [
|
|
||||||
// [title, diaryRecord]
|
|
||||||
// ]]
|
|
||||||
GVAR(diaryRecords) = createHashMap;
|
|
||||||
|
|
||||||
// run main inits
|
// run main inits
|
||||||
[] call FUNC(addFrequenciesRecord);
|
[] call FUNC(addFrequenciesRecord);
|
||||||
[] call FUNC(addSignalColorsRecord);
|
[] call FUNC(addSignalColorsRecord);
|
||||||
@@ -47,7 +41,7 @@ GVAR(diaryRecords) = createHashMap;
|
|||||||
[
|
[
|
||||||
LEVEL_DEBUG,
|
LEVEL_DEBUG,
|
||||||
QUOTE(COMPONENT),
|
QUOTE(COMPONENT),
|
||||||
"postInit complete",
|
"initClient complete",
|
||||||
[]
|
[]
|
||||||
] call EFUNC(common,log);
|
] call EFUNC(common,log);
|
||||||
|
|
||||||
|
|||||||
@@ -24,7 +24,7 @@
|
|||||||
[
|
[
|
||||||
LEVEL_INFO,
|
LEVEL_INFO,
|
||||||
QUOTE(COMPONENT),
|
QUOTE(COMPONENT),
|
||||||
"Respawn chat handler registered",
|
"respawn chat handler registered",
|
||||||
[player] call EFUNC(common,addPlayerInfoToArray)
|
[player] call EFUNC(common,addPlayerInfoToArray)
|
||||||
] call EFUNC(common,log);
|
] call EFUNC(common,log);
|
||||||
|
|
||||||
|
|||||||
@@ -2,24 +2,27 @@
|
|||||||
|
|
||||||
if ( !hasInterface ) exitWith {};
|
if ( !hasInterface ) exitWith {};
|
||||||
|
|
||||||
["milsim_logText", {
|
|
||||||
params [["_strArray", [""], [[]]]];
|
|
||||||
{
|
|
||||||
diag_log text _x;
|
|
||||||
} forEach _strArray;
|
|
||||||
}] call CBA_fnc_addEventHandler;
|
|
||||||
|
|
||||||
// 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;
|
||||||
|
|
||||||
|
// Initialize a holder for managing local diary records
|
||||||
|
// store records in format:
|
||||||
|
// [subject, [
|
||||||
|
// [title, diaryRecord]
|
||||||
|
// ]]
|
||||||
|
EGVAR(common,diaryRecords) = createHashMap;
|
||||||
|
|
||||||
|
|
||||||
// initialize other modules
|
// initialize other modules
|
||||||
|
call EFUNC(emp,init);
|
||||||
|
call EFUNC(mapcopy,initClient);
|
||||||
call EFUNC(reinsert,initClient);
|
call EFUNC(reinsert,initClient);
|
||||||
call EFUNC(resupply,initClient);
|
call EFUNC(resupply,initClient);
|
||||||
call EFUNC(triageIcons,initClient);
|
call EFUNC(triageIcons,initClient);
|
||||||
call EFUNC(vehicleFlags,initClient);
|
call EFUNC(vehicleFlags,initClient);
|
||||||
|
call EFUNC(zeus,initClient);
|
||||||
call EFUNC(fbcb2_main,initClient);
|
call EFUNC(fbcb2_main,initClient);
|
||||||
call EFUNC(fbcb2_assets,initClient);
|
call EFUNC(fbcb2_assets,initClient);
|
||||||
|
|
||||||
@@ -27,8 +30,10 @@ call EFUNC(fbcb2_assets,initClient);
|
|||||||
[
|
[
|
||||||
LEVEL_DEBUG,
|
LEVEL_DEBUG,
|
||||||
QUOTE(COMPONENT),
|
QUOTE(COMPONENT),
|
||||||
"postInit complete",
|
"initClient complete",
|
||||||
[]
|
[]
|
||||||
] call EFUNC(common,log);
|
] call EFUNC(common,log);
|
||||||
|
|
||||||
|
localNamespace setVariable [QGVAR(complete), true];
|
||||||
|
|
||||||
nil;
|
nil;
|
||||||
@@ -9,20 +9,11 @@ publicVariable QGVARMAIN(baseObjects);
|
|||||||
// Initializes the Dynamic Groups framework and groups
|
// Initializes the Dynamic Groups framework and groups
|
||||||
["Initialize", [true]] call BIS_fnc_dynamicGroups;
|
["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
|
// initialize other modules
|
||||||
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 +0,0 @@
|
|||||||
params ["_sourcePlayer","_destinationPlayer"];
|
|
||||||
|
|
||||||
hint format["Copying map markers from %1", name _sourcePlayer];
|
|
||||||
|
|
||||||
[_destinationPlayer] remoteExecCall ["milsim_fnc_getPlayerMapMarkers",_sourcePlayer];
|
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
params ["_destinationPlayer"];
|
|
||||||
|
|
||||||
_markerData = [];
|
|
||||||
|
|
||||||
hint format["Your map is being copied by %1", name _destinationPlayer];
|
|
||||||
|
|
||||||
{
|
|
||||||
_marker = toArray _x;
|
|
||||||
_marker resize 15;
|
|
||||||
if ( toString _marker == "_USER_DEFINED #" ) then {
|
|
||||||
_marker = _x call milsim_fnc_mapMarkerToString;
|
|
||||||
_markerData pushBack _marker;
|
|
||||||
};
|
|
||||||
} forEach allMapMarkers;
|
|
||||||
|
|
||||||
[_markerData] remoteExecCall ["milsim_fnc_loadMapMarkers",_destinationPlayer];
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
_map_copy_condition =
|
|
||||||
{
|
|
||||||
('ItemMap' in (assignedItems _player)) && ('ItemMap' in (assignedItems _target)) && ([_player, _target, []] call ace_common_fnc_canInteractWith)
|
|
||||||
};
|
|
||||||
|
|
||||||
_map_copy_action =
|
|
||||||
[
|
|
||||||
"MilSimCopyMap",
|
|
||||||
"Copy Map",
|
|
||||||
"\a3\ui_f\data\igui\cfg\actions\talk_ca.paa",
|
|
||||||
{
|
|
||||||
[_target,_player] call milsim_fnc_copyMapFromPlayer
|
|
||||||
},
|
|
||||||
_map_copy_condition
|
|
||||||
] call ace_interact_menu_fnc_createAction;
|
|
||||||
|
|
||||||
["Man", 0, ["ACE_MainActions"], _map_copy_action, true] call ace_interact_menu_fnc_addActionToClass;
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
params ["_markerList"];
|
|
||||||
|
|
||||||
if ('ItemMap' in (assignedItems player)) then {
|
|
||||||
{
|
|
||||||
_x call milsim_fnc_stringToMapMarker;
|
|
||||||
} foreach _markerList;
|
|
||||||
hint format["Map copied!"];
|
|
||||||
} else {
|
|
||||||
hint format["You need a map to copy onto!"];
|
|
||||||
};
|
|
||||||
24
framework/mapcopy/functions/fn_addCBASettings.sqf
Normal file
24
framework/mapcopy/functions/fn_addCBASettings.sqf
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
#include "..\script_component.hpp"
|
||||||
|
|
||||||
|
[
|
||||||
|
QGVAR(setting_enable),
|
||||||
|
"CHECKBOX",
|
||||||
|
"Allow Map Copying",
|
||||||
|
[QUOTE(SETTINGS_GROUP_NAME), QUOTE(COMPONENT_BEAUTIFIED)],
|
||||||
|
true, // default value
|
||||||
|
true, // is global
|
||||||
|
{
|
||||||
|
params ["_value"];
|
||||||
|
[
|
||||||
|
QGVAR(setting_enable),
|
||||||
|
_value
|
||||||
|
] call EFUNC(common,logSettingChanged);
|
||||||
|
}
|
||||||
|
] call CBA_fnc_addSetting;
|
||||||
|
|
||||||
|
[
|
||||||
|
LEVEL_INFO,
|
||||||
|
QUOTE(COMPONENT),
|
||||||
|
"CREATED SETTINGS",
|
||||||
|
[]
|
||||||
|
] call EFUNC(common,log);
|
||||||
15
framework/mapcopy/functions/fn_getMapMarkers.sqf
Normal file
15
framework/mapcopy/functions/fn_getMapMarkers.sqf
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
#include "..\script_component.hpp"
|
||||||
|
// serializes markers on local machine and returns them as array
|
||||||
|
|
||||||
|
_markerData = [];
|
||||||
|
|
||||||
|
{
|
||||||
|
_marker = toArray _x;
|
||||||
|
_marker resize 15;
|
||||||
|
if ( toString _marker == "_USER_DEFINED #" ) then {
|
||||||
|
_marker = _x call FUNC(mapMarkerToString);
|
||||||
|
_markerData pushBack _marker;
|
||||||
|
};
|
||||||
|
} forEach allMapMarkers;
|
||||||
|
|
||||||
|
_markerData;
|
||||||
57
framework/mapcopy/functions/fn_initClient.sqf
Normal file
57
framework/mapcopy/functions/fn_initClient.sqf
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
#include "..\script_component.hpp"
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Create action to copy map markers on all inheritors of CAManBase
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
private _mapCopyAction =
|
||||||
|
[
|
||||||
|
QGVAR(actionID),
|
||||||
|
"Copy Map",
|
||||||
|
"\a3\ui_f\data\igui\cfg\actions\talk_ca.paa",
|
||||||
|
{
|
||||||
|
params ["_target", "_player", "_params"];
|
||||||
|
format["Copying map markers from %1", name _target] call CBA_fnc_notify;
|
||||||
|
[QGVAR(mapCopyRequest), _this, _target] call CBA_fnc_targetEvent;
|
||||||
|
},
|
||||||
|
{
|
||||||
|
params ["_target", "_player", "_params"];
|
||||||
|
[QGVAR(setting_enable)] call CBA_settings_fnc_get && {
|
||||||
|
('ItemMap' in (assignedItems _player)) &&
|
||||||
|
('ItemMap' in (assignedItems _target)) &&
|
||||||
|
([_player, _target, []] call ace_common_fnc_canInteractWith)
|
||||||
|
};
|
||||||
|
}
|
||||||
|
] call ace_interact_menu_fnc_createAction;
|
||||||
|
["CAManBase", 0, ["ACE_MainActions"], _mapCopyAction, true] call ace_interact_menu_fnc_addActionToClass;
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Create CBA event to receive requests
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
[QGVAR(mapCopyRequest), {
|
||||||
|
params ["_me", "_requester", "_params"];
|
||||||
|
format["Your map is being copied by %1", name _requester] call CBA_fnc_notify;
|
||||||
|
private _myMarkers = _this call FUNC(getMapMarkers);
|
||||||
|
[QGVAR(mapCopyResponse), [_me, _myMarkers], _requester] call CBA_fnc_targetEvent;
|
||||||
|
}] call CBA_fnc_addEventHandler;
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Create CBA event to receive responses
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
[QGVAR(mapCopyResponse), {
|
||||||
|
params [["_responder", objNull, [objNull]], ["_markerList", [], [[]]]];
|
||||||
|
if ('ItemMap' in (assignedItems player)) then {
|
||||||
|
[_markerList] call FUNC(loadMapMarkers);
|
||||||
|
format["Copied %1 markers from %2", count _markerList, name _responder] call CBA_fnc_notify;
|
||||||
|
} else {
|
||||||
|
format["You need a map to copy onto!"] call CBA_fnc_notify;
|
||||||
|
};
|
||||||
|
}] call CBA_fnc_addEventHandler;
|
||||||
|
|
||||||
|
[
|
||||||
|
LEVEL_DEBUG,
|
||||||
|
QUOTE(COMPONENT),
|
||||||
|
"initClient complete",
|
||||||
|
[]
|
||||||
|
] call EFUNC(common,log);
|
||||||
|
|
||||||
|
localNamespace setVariable [QGVAR(complete), true];
|
||||||
8
framework/mapcopy/functions/fn_loadMapMarkers.sqf
Normal file
8
framework/mapcopy/functions/fn_loadMapMarkers.sqf
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
#include "..\script_component.hpp"
|
||||||
|
// accepts an array of serialized markers and adds them to local map
|
||||||
|
|
||||||
|
params [["_markerList", [], [[]]]];
|
||||||
|
|
||||||
|
{
|
||||||
|
_x call FUNC(stringToMapMarker);
|
||||||
|
} foreach _markerList;
|
||||||
3
framework/mapcopy/script_component.hpp
Normal file
3
framework/mapcopy/script_component.hpp
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
#define COMPONENT mapcopy
|
||||||
|
#define COMPONENT_BEAUTIFIED Map Copy
|
||||||
|
#include "../script_mod.hpp"
|
||||||
@@ -1,69 +1,65 @@
|
|||||||
#include "..\script_component.hpp"
|
#include "..\script_component.hpp"
|
||||||
|
|
||||||
params ["_type"]; // string of the object's classname
|
params [
|
||||||
if (!(_type isKindOf "CAManBase")) exitWith {};
|
["_types", [], [[]]], // classnames to assign these action to
|
||||||
|
["_useInheritance", false, [false]]
|
||||||
|
];
|
||||||
|
|
||||||
if (
|
{ // forEach _types
|
||||||
(localNamespace getVariable [QGVAR(fileForReinsertClassesAdded), []])
|
private _classToAddActionsTo = _x;
|
||||||
find _type != -1
|
|
||||||
) exitWith {};
|
|
||||||
|
|
||||||
private _fileForReinsertAction = [
|
private _fileForReinsertAction = [
|
||||||
QGVAR(fileReinsertRequestAction),
|
QGVAR(fileReinsertRequestAction),
|
||||||
"File Re-insert Request",
|
"File Re-insert Request",
|
||||||
"\A3\ui_f\data\igui\cfg\simpleTasks\types\takeoff_ca.paa",
|
"\A3\ui_f\data\igui\cfg\simpleTasks\types\takeoff_ca.paa",
|
||||||
{ // statement
|
{ // statement
|
||||||
params ["_target", "_player", "_params"];
|
params ["_target", "_player", "_params"];
|
||||||
// find nearest base or location
|
// find nearest base or location
|
||||||
private _base = [_player] call EFUNC(common,getNearestBase);
|
private _base = [_player] call EFUNC(common,getNearestBase);
|
||||||
private _baseName = [_base] call EFUNC(common,getNameOfBase);
|
private _baseName = [_base] call EFUNC(common,getNameOfBase);
|
||||||
// send event to server
|
// send event to server
|
||||||
[QGVAR(fileReinsertRequest), [_player, _base]] call CBA_fnc_serverEvent;
|
[QGVAR(fileReinsertRequest), [_player, _base]] call CBA_fnc_serverEvent;
|
||||||
// notify player their request was filed
|
// notify player their request was filed
|
||||||
[["Re-insert Request Filed"], [format["Location: %1", _baseName]]] call CBA_fnc_notify;
|
[["Re-insert Request Filed"], [format["Location: %1", _baseName]]] call CBA_fnc_notify;
|
||||||
},
|
},
|
||||||
{ // condition
|
{ // condition
|
||||||
params ["_target", "_player", "_params"];
|
params ["_target", "_player", "_params"];
|
||||||
// find nearest base or location
|
// find nearest base or location
|
||||||
private _base = [_player] call EFUNC(common,getNearestBase);
|
private _base = [_player] call EFUNC(common,getNearestBase);
|
||||||
private _baseDistance = _player distance _base;
|
private _baseDistance = _player distance _base;
|
||||||
|
|
||||||
private _maxRangeToReady = missionNamespace getVariable [QGVAR(setting_maxRangeToReady), 400];
|
private _maxRangeToReady = [QGVAR(setting_maxRangeToReady)] call CBA_settings_fnc_get;
|
||||||
private _existingQueue = missionNamespace getVariable [QGVAR(reinsertionQueue), []];
|
private _existingQueue = missionNamespace getVariable [QGVAR(reinsertionQueue), []];
|
||||||
|
|
||||||
// check if module is enabled, player is near a base, and player is not already in the queue
|
// check if module is enabled, player is near a base, and player is not already in the queue
|
||||||
// (serverTime - GVAR(missionStartServerTime)) > 60*5 && // only allow after 15 minutes
|
// (serverTime - GVAR(missionStartServerTime)) > 60*5 && // only allow after 15 minutes
|
||||||
missionNamespace getVariable ["milsim_reinsert_setting_reinsertion_enabled", true] &&
|
[QGVAR(setting_enabled)] call CBA_settings_fnc_get &&
|
||||||
(_baseDistance < _maxRangeToReady) &&
|
(_baseDistance < _maxRangeToReady) &&
|
||||||
not (_player in (_existingQueue apply {_x#0}))
|
not (_player in (_existingQueue apply {_x#0}))
|
||||||
}
|
}
|
||||||
] call ace_interact_menu_fnc_createAction;
|
] call ace_interact_menu_fnc_createAction;
|
||||||
[_type, 1, ["ACE_SelfActions"], _fileForReinsertAction, true] call ace_interact_menu_fnc_addActionToClass;
|
[_classToAddActionsTo, 1, ["ACE_SelfActions"], _fileForReinsertAction, _useInheritance] call ace_interact_menu_fnc_addActionToClass;
|
||||||
|
|
||||||
private _removeFileForReinsertAction = [
|
private _removeFileForReinsertAction = [
|
||||||
QGVAR(removeReinsertRequestAction),
|
QGVAR(removeReinsertRequestAction),
|
||||||
"Remove Re-insert Request",
|
"Remove Re-insert Request",
|
||||||
"\A3\ui_f\data\igui\cfg\simpleTasks\types\land_ca.paa",
|
"\A3\ui_f\data\igui\cfg\simpleTasks\types\land_ca.paa",
|
||||||
{ // statement
|
{ // statement
|
||||||
params ["_target", "_player", "_params"];
|
params ["_target", "_player", "_params"];
|
||||||
// send event to server
|
// send event to server
|
||||||
[QGVAR(removeReinsertRequest), [_player]] call CBA_fnc_serverEvent;
|
[QGVAR(removeReinsertRequest), [_player]] call CBA_fnc_serverEvent;
|
||||||
// notify player their request was rescinded
|
// notify player their request was rescinded
|
||||||
"Re-insert Request Rescinded" call CBA_fnc_notify;
|
"Re-insert Request Rescinded" call CBA_fnc_notify;
|
||||||
},
|
},
|
||||||
{ // condition
|
{ // condition
|
||||||
params ["_target", "_player", "_params"];
|
params ["_target", "_player", "_params"];
|
||||||
private _existingQueue = missionNamespace getVariable [QGVAR(reinsertionQueue), []];
|
private _existingQueue = missionNamespace getVariable [QGVAR(reinsertionQueue), []];
|
||||||
|
|
||||||
// check if module is enabled, player is in the queue
|
|
||||||
// (serverTime - GVAR(missionStartServerTime)) > 60*5 && // only allow after 15 minutes
|
|
||||||
missionNamespace getVariable ["milsim_reinsert_setting_reinsertion_enabled", true] &&
|
|
||||||
(_player in (_existingQueue apply {_x#0}))
|
|
||||||
}
|
|
||||||
] call ace_interact_menu_fnc_createAction;
|
|
||||||
[_type, 1, ["ACE_SelfActions"], _removeFileForReinsertAction, true] call ace_interact_menu_fnc_addActionToClass;
|
|
||||||
|
|
||||||
private _classesActionsAddedTo = (localNamespace getVariable [QGVAR(fileForReinsertClassesAdded), []]);
|
|
||||||
_classesActionsAddedTo pushBackUnique _type;
|
|
||||||
localNamespace setVariable [QGVAR(fileForReinsertClassesAdded), _classesActionsAddedTo];
|
|
||||||
|
|
||||||
|
// check if module is enabled, player is in the queue
|
||||||
|
// (serverTime - GVAR(missionStartServerTime)) > 60*5 && // only allow after 15 minutes
|
||||||
|
[QGVAR(setting_enabled)] call CBA_settings_fnc_get &&
|
||||||
|
(_player in (_existingQueue apply {_x#0}))
|
||||||
|
}
|
||||||
|
] call ace_interact_menu_fnc_createAction;
|
||||||
|
[_classToAddActionsTo, 1, ["ACE_SelfActions"], _removeFileForReinsertAction, _useInheritance] call ace_interact_menu_fnc_addActionToClass;
|
||||||
|
} forEach _types;
|
||||||
@@ -1,30 +1,28 @@
|
|||||||
#include "..\script_component.hpp"
|
#include "..\script_component.hpp"
|
||||||
|
|
||||||
params ["_type"]; // string of the object's classname
|
params [
|
||||||
if (!(_type isKindOf "CAManBase")) exitWith {};
|
["_types", [], [[]]], // classnames to assign these action to
|
||||||
|
["_useInheritance", false, [false]]
|
||||||
|
];
|
||||||
|
|
||||||
if (
|
{ // forEach _types
|
||||||
(localNamespace getVariable [QGVAR(checkReinsertQueueClassesAdded), []])
|
private _classToAddActionsTo = _x;
|
||||||
find _type != -1
|
|
||||||
) exitWith {};
|
|
||||||
|
|
||||||
private _checkReinsertQueueAction = [
|
private _checkReinsertQueueAction = [
|
||||||
QGVAR(checkReinsertQueue),
|
QGVAR(checkReinsertQueue),
|
||||||
"[PILOT] Check Re-insert Queue",
|
"[PILOT] Check Re-insert Queue",
|
||||||
"\A3\ui_f\data\igui\cfg\simpleTasks\types\land_ca.paa",
|
"\A3\ui_f\data\igui\cfg\simpleTasks\types\land_ca.paa",
|
||||||
{
|
{
|
||||||
params ["_target", "_player", "_params"];
|
params ["_target", "_player", "_params"];
|
||||||
// request notification from the server
|
// request notification from the server
|
||||||
call FUNC(requestShowQueue);
|
call FUNC(requestShowQueue);
|
||||||
// reset last check time
|
// reset last check time
|
||||||
localNamespace setVariable [QGVAR(lastReinsertQueueCheck), diag_tickTime];
|
localNamespace setVariable [QGVAR(lastReinsertQueueCheck), diag_tickTime];
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
missionNamespace getVariable [QGVAR(setting_enabled), true]
|
GVAR(setting_enabled);
|
||||||
} // always allow
|
} // condition
|
||||||
] call ace_interact_menu_fnc_createAction;
|
] call ace_interact_menu_fnc_createAction;
|
||||||
[_type, 1, ["ACE_SelfActions"], _checkReinsertQueueAction, true] call ace_interact_menu_fnc_addActionToClass;
|
[_classToAddActionsTo, 1, ["ACE_SelfActions"], _checkReinsertQueueAction, _useInheritance] call ace_interact_menu_fnc_addActionToClass;
|
||||||
|
|
||||||
private _classesActionsAddedTo = (localNamespace getVariable [QGVAR(checkReinsertQueueClassesAdded), []]);
|
} forEach _types;
|
||||||
_classesActionsAddedTo pushBackUnique _type;
|
|
||||||
localNamespace setVariable [QGVAR(checkReinsertQueueClassesAdded), _classesActionsAddedTo];
|
|
||||||
@@ -5,26 +5,16 @@ if (!hasInterface) exitWith {};
|
|||||||
// ACE SELF-INTERACTIONS FOR FILING AND RESCINDING REINSERT REQUESTS NEAR BASE - ALL PLAYERS
|
// ACE SELF-INTERACTIONS FOR FILING AND RESCINDING REINSERT REQUESTS NEAR BASE - ALL PLAYERS
|
||||||
localNamespace setVariable [QGVAR(fileForReinsertClassesAdded), []];
|
localNamespace setVariable [QGVAR(fileForReinsertClassesAdded), []];
|
||||||
// add actions to current class
|
// add actions to current class
|
||||||
[typeOf player] call FUNC(addAceSelfActions);
|
[["CAManBase"], true] call FUNC(addAceSelfActions);
|
||||||
// add actions to future classes
|
|
||||||
["ace_interact_menu_newControllableObject", {
|
|
||||||
_this call FUNC(addAceSelfActions);
|
|
||||||
}] call CBA_fnc_addEventHandler;
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////
|
||||||
// PILOTS ONLY
|
// PILOTS ONLY
|
||||||
// ACE SELF-INTERACTIONS FOR CHECKING REINSERT QUEUE - ONLY FOR PILOTS
|
// ACE SELF-INTERACTIONS FOR CHECKING REINSERT QUEUE - ONLY FOR PILOTS
|
||||||
if ((typeOf player) in ["B_Helipilot_F", "B_helicrew_F"]) then {
|
localNamespace setVariable [QGVAR(checkReinsertQueueClassesAdded), []];
|
||||||
localNamespace setVariable [QGVAR(checkReinsertQueueClassesAdded), []];
|
localNamespace setVariable [QGVAR(lastReinsertQueueCheck), diag_tickTime];
|
||||||
localNamespace setVariable [QGVAR(lastReinsertQueueCheck), diag_tickTime];
|
|
||||||
|
|
||||||
// add actions to current class
|
// add actions to pilot classes, and don't apply to child classes
|
||||||
[typeOf player] call FUNC(addCheckQueueSelfAction);
|
[["B_Helipilot_F", "B_helicrew_F"], false] call FUNC(addCheckQueueSelfAction);
|
||||||
// add actions to future classes
|
|
||||||
["ace_interact_menu_newControllableObject", {
|
|
||||||
_this call FUNC(addCheckQueueSelfAction);
|
|
||||||
}] call CBA_fnc_addEventHandler;
|
|
||||||
};
|
|
||||||
/////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
|
||||||
@@ -33,13 +23,13 @@ if ((typeOf player) in ["B_Helipilot_F", "B_helicrew_F"]) then {
|
|||||||
[{
|
[{
|
||||||
// if module not enabled and pilot forced check not enabled, exit
|
// if module not enabled and pilot forced check not enabled, exit
|
||||||
if (not (
|
if (not (
|
||||||
missionNamespace getVariable [QGVAR(setting_enabled), true] &&
|
[QGVAR(setting_enabled)] call CBA_settings_fnc_get and
|
||||||
missionNamespace getVariable [QGVAR(setting_pilotForcedCheckEnabled), true]
|
[QGVAR(setting_pilotForcedCheckEnabled)] call CBA_settings_fnc_get
|
||||||
)) exitWith {};
|
)) exitWith {};
|
||||||
|
|
||||||
// if last check was less than X minutes ago, skip
|
// if last check was less than X minutes ago, skip
|
||||||
private _lastCheck = localNamespace getVariable [QGVAR(lastReinsertQueueCheck), diag_tickTime];
|
private _lastCheck = localNamespace getVariable [QGVAR(lastReinsertQueueCheck), diag_tickTime];
|
||||||
private _requiredCheckInterval = missionNamespace getVariable [QGVAR(setting_pilotForcedCheckInterval), 60*20];
|
private _requiredCheckInterval = [QGVAR(setting_pilotForcedCheckInterval)] call CBA_settings_fnc_get;
|
||||||
if (
|
if (
|
||||||
diag_tickTime - _lastCheck <
|
diag_tickTime - _lastCheck <
|
||||||
_requiredCheckInterval
|
_requiredCheckInterval
|
||||||
@@ -57,6 +47,8 @@ if ((typeOf player) in ["B_Helipilot_F", "B_helicrew_F"]) then {
|
|||||||
[
|
[
|
||||||
LEVEL_DEBUG,
|
LEVEL_DEBUG,
|
||||||
QUOTE(COMPONENT),
|
QUOTE(COMPONENT),
|
||||||
"postInit complete",
|
"initClient complete",
|
||||||
[]
|
[]
|
||||||
] call EFUNC(common,log);
|
] call EFUNC(common,log);
|
||||||
|
|
||||||
|
localNamespace setVariable [QGVAR(complete), true];
|
||||||
@@ -35,9 +35,7 @@ private _supplyCrateTypesCfgs = _supplyCratesCfg call BIS_fnc_returnChildren;
|
|||||||
private _cfg = _x;
|
private _cfg = _x;
|
||||||
private _supplyCrateDisplayName = (_cfg >> "displayName") call BIS_fnc_getCfgData;
|
private _supplyCrateDisplayName = (_cfg >> "displayName") call BIS_fnc_getCfgData;
|
||||||
|
|
||||||
|
// add action to spawn supply crate
|
||||||
|
|
||||||
|
|
||||||
private _actionID = _arsenalBox addAction [format ["<t color='#ffffff'>Spawn %1</t>", _supplyCrateDisplayName], {
|
private _actionID = _arsenalBox addAction [format ["<t color='#ffffff'>Spawn %1</t>", _supplyCrateDisplayName], {
|
||||||
params ["_target", "_caller", "_actionId", "_arguments"];
|
params ["_target", "_caller", "_actionId", "_arguments"];
|
||||||
_arguments params ["_supplyCrateCfg"];
|
_arguments params ["_supplyCrateCfg"];
|
||||||
@@ -46,13 +44,16 @@ private _supplyCrateTypesCfgs = _supplyCratesCfg call BIS_fnc_returnChildren;
|
|||||||
configName _supplyCrateCfg,
|
configName _supplyCrateCfg,
|
||||||
getPos _target
|
getPos _target
|
||||||
] call FUNC(createBox);
|
] call FUNC(createBox);
|
||||||
|
|
||||||
// log action use in server RPT
|
// log action use in server RPT
|
||||||
|
private _supplyCrateDisplayName = (_supplyCrateCfg >> "displayName") call BIS_fnc_getCfgData;
|
||||||
[
|
[
|
||||||
LEVEL_INFO,
|
LEVEL_INFO,
|
||||||
QUOTE(COMPONENT),
|
QUOTE(COMPONENT),
|
||||||
"Supply crate spawned",
|
"Supply crate spawned",
|
||||||
[player, [
|
[player, [
|
||||||
["supplyCrateType", _supplyCrateDisplayName],
|
["supplyCrateDisplayName", _supplyCrateDisplayName],
|
||||||
|
["supplyCrateCfgName", configName _supplyCrateCfg],
|
||||||
["position", getPos _target]
|
["position", getPos _target]
|
||||||
]] call EFUNC(common,addPlayerInfoToArray)
|
]] call EFUNC(common,addPlayerInfoToArray)
|
||||||
] remoteExec [QEFUNC(common,log), 2];
|
] remoteExec [QEFUNC(common,log), 2];
|
||||||
|
|||||||
@@ -7,7 +7,8 @@ call FUNC(addArsenalObjectSpawnBoxActions);
|
|||||||
[
|
[
|
||||||
LEVEL_DEBUG,
|
LEVEL_DEBUG,
|
||||||
QUOTE(COMPONENT),
|
QUOTE(COMPONENT),
|
||||||
"postInit complete",
|
"initClient complete",
|
||||||
[]
|
[]
|
||||||
] call EFUNC(common,log);
|
] call EFUNC(common,log);
|
||||||
|
|
||||||
localNamespace setVariable [QGVAR(complete), true];
|
localNamespace setVariable [QGVAR(complete), true];
|
||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -6,7 +6,8 @@ GVAR(drawTargets) = [];
|
|||||||
[
|
[
|
||||||
LEVEL_DEBUG,
|
LEVEL_DEBUG,
|
||||||
QUOTE(COMPONENT),
|
QUOTE(COMPONENT),
|
||||||
"postInit complete",
|
"initClient complete",
|
||||||
[]
|
[]
|
||||||
] call EFUNC(common,log);
|
] call EFUNC(common,log);
|
||||||
|
|
||||||
localNamespace setVariable [QGVAR(complete), true];
|
localNamespace setVariable [QGVAR(complete), true];
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
if (!hasInterface) exitWith {};
|
|
||||||
|
|
||||||
#include "..\script_component.hpp"
|
#include "..\script_component.hpp"
|
||||||
|
|
||||||
|
if (!hasInterface) exitWith {};
|
||||||
|
|
||||||
private _vehicleFlagsCfg = call FUNC(getVehicleFlagsCfg);
|
private _vehicleFlagsCfg = call FUNC(getVehicleFlagsCfg);
|
||||||
|
|
||||||
if (!isClass _vehicleFlagsCfg) exitWith {
|
if (!isClass _vehicleFlagsCfg) exitWith {
|
||||||
@@ -16,94 +16,95 @@ private _flagCategoryCfgs = (_vehicleFlagsCfg >> "FlagCategories") call BIS_fnc_
|
|||||||
private _parentClass = _x;
|
private _parentClass = _x;
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////
|
||||||
// add CBA class event handler to add actions to vehicles after they are initialized
|
// create the root action
|
||||||
// all classes that inherit from the base classes will also have this applied
|
|
||||||
// an exclusion function is present for manually excluding specific classes
|
|
||||||
////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////
|
||||||
[_parentClass, "InitPost", {
|
private _rootActionID = QGVAR(SetVehicleFlagAction);
|
||||||
|
private _flagRootAction = [
|
||||||
|
_rootActionID, // id
|
||||||
|
"Set Vehicle Flag", // displayed title
|
||||||
////////////////////////////////////////////////////////////////////////
|
"\A3\ui_f\data\map\markers\flags\nato_ca.paa", // flag icon
|
||||||
// create the root action
|
{true}, // statement
|
||||||
////////////////////////////////////////////////////////////////////////
|
{
|
||||||
private _rootActionID = "SetVehicleFlag";
|
params ["_target", "_player", "_params"];
|
||||||
private _flagRootAction = [
|
// _params params ["_parentActionID", "_flagCategories"];
|
||||||
_rootActionID, // id
|
|
||||||
"Set Vehicle Flag", // displayed title
|
|
||||||
"\A3\ui_f\data\map\markers\flags\nato_ca.paa", // flag icon
|
|
||||||
{true}, // statement
|
|
||||||
{
|
|
||||||
params ["_target", "_player", "_params"];
|
|
||||||
// _params params ["_parentActionID", "_flagCategories"];
|
|
||||||
|
|
||||||
// check if vehicle is excluded
|
|
||||||
private _excluded = [typeOf _target] call FUNC(isClassExcluded);
|
|
||||||
if (_excluded || !alive _target) exitWith {false};
|
|
||||||
|
|
||||||
true;
|
|
||||||
}, // condition
|
|
||||||
{
|
|
||||||
////////////////////////////////////////////////////////////////////////
|
|
||||||
// create the flag category actions (with nested flag actions)
|
|
||||||
////////////////////////////////////////////////////////////////////////
|
|
||||||
params ["_target", "_player", "_params"];
|
|
||||||
_params params ["_rootActionID"];
|
|
||||||
|
|
||||||
private _vehicleFlagsCfg = call FUNC(getVehicleFlagsCfg);
|
|
||||||
if (isNull _vehicleFlagsCfg) exitWith {[]};
|
|
||||||
private _flagCategoryCfgs = (_vehicleFlagsCfg >> "FlagCategories") call BIS_fnc_returnChildren;
|
|
||||||
|
|
||||||
// return category child actions with individual flag actions nested as children
|
|
||||||
[_rootActionID, _flagCategoryCfgs] call FUNC(getActionsFlagCategories);
|
|
||||||
|
|
||||||
}, // child code
|
|
||||||
[_rootActionID], // params
|
|
||||||
nil, // position
|
|
||||||
4, // distance
|
|
||||||
[false, false, false, false, false], // other params
|
|
||||||
nil // modifier function code
|
|
||||||
] call ace_interact_menu_fnc_createAction;
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////
|
|
||||||
// add root action to add flags
|
|
||||||
////////////////////////////////////////////////////////////////////////
|
|
||||||
[
|
|
||||||
(_this select 0), // object
|
|
||||||
0, // action 0 or self-action 1
|
|
||||||
["ACE_MainActions"], // parent
|
|
||||||
_flagRootAction // action
|
|
||||||
] call ace_interact_menu_fnc_addActionToObject;
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////
|
|
||||||
// add action to remove flag under the root action
|
|
||||||
////////////////////////////////////////////////////////////////////////
|
|
||||||
// create action
|
|
||||||
private _removeFlagAction = [
|
|
||||||
_rootActionID + "_removeflag", // id
|
|
||||||
"Remove Flag", // displayed title
|
|
||||||
"\A3\ui_f\data\map\markers\flags\nato_ca.paa", // flag icon
|
|
||||||
{
|
|
||||||
params ["_target", "_player", "_params"];
|
|
||||||
_target forceFlagTexture "";
|
|
||||||
}, // statement
|
|
||||||
{
|
|
||||||
params ["_target", "_player", "_params"];
|
|
||||||
alive _target && getForcedFlagTexture _target != "";
|
|
||||||
}, // condition
|
|
||||||
nil // child code
|
|
||||||
] call ace_interact_menu_fnc_createAction;
|
|
||||||
|
|
||||||
// add the action to the vehicle
|
|
||||||
// in this class event handler, this#0 will be the vehicle
|
|
||||||
[
|
|
||||||
(_this select 0), // object
|
|
||||||
0, // action 0 or self-action 1
|
|
||||||
["ACE_MainActions", _rootActionID], // parent
|
|
||||||
_removeFlagAction // action
|
|
||||||
] call ace_interact_menu_fnc_addActionToObject;
|
|
||||||
|
|
||||||
}, true, [], true] call CBA_fnc_addClassEventHandler;
|
// check if vehicle is excluded
|
||||||
|
private _excluded = [typeOf _target] call FUNC(isClassExcluded);
|
||||||
|
if (_excluded || !alive _target) exitWith {false};
|
||||||
|
|
||||||
|
true;
|
||||||
|
}, // condition
|
||||||
|
{
|
||||||
|
////////////////////////////////////////////////////////////////////////
|
||||||
|
// create the flag category actions (with nested flag actions)
|
||||||
|
////////////////////////////////////////////////////////////////////////
|
||||||
|
params ["_target", "_player", "_params"];
|
||||||
|
_params params ["_rootActionID"];
|
||||||
|
|
||||||
|
private _vehicleFlagsCfg = call FUNC(getVehicleFlagsCfg);
|
||||||
|
if (isNull _vehicleFlagsCfg) exitWith {[]};
|
||||||
|
private _flagCategoryCfgs = (_vehicleFlagsCfg >> "FlagCategories") call BIS_fnc_returnChildren;
|
||||||
|
|
||||||
|
// return category child actions with individual flag actions nested as children
|
||||||
|
[_rootActionID, _flagCategoryCfgs] call FUNC(getActionsFlagCategories);
|
||||||
|
|
||||||
|
}, // child code
|
||||||
|
[_rootActionID], // params
|
||||||
|
nil, // position
|
||||||
|
4, // distance
|
||||||
|
[false, false, false, false, false], // other params
|
||||||
|
nil // modifier function code
|
||||||
|
] call ace_interact_menu_fnc_createAction;
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////
|
||||||
|
// add root action to add flags
|
||||||
|
////////////////////////////////////////////////////////////////////////
|
||||||
|
[
|
||||||
|
_parentClass, // parent classname
|
||||||
|
0, // action 0 or self-action 1
|
||||||
|
["ACE_MainActions"], // parent
|
||||||
|
_flagRootAction, // action
|
||||||
|
true // apply to child classes
|
||||||
|
] call ace_interact_menu_fnc_addActionToClass;
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////////
|
||||||
|
// add action to remove flag under the root action
|
||||||
|
////////////////////////////////////////////////////////////////////////
|
||||||
|
// create action
|
||||||
|
private _removeFlagAction = [
|
||||||
|
_rootActionID + "_removeflag", // id
|
||||||
|
"Remove Flag", // displayed title
|
||||||
|
"\A3\ui_f\data\map\markers\flags\nato_ca.paa", // flag icon
|
||||||
|
{
|
||||||
|
params ["_target", "_player", "_params"];
|
||||||
|
_target forceFlagTexture "";
|
||||||
|
}, // statement
|
||||||
|
{
|
||||||
|
params ["_target", "_player", "_params"];
|
||||||
|
alive _target && getForcedFlagTexture _target != "";
|
||||||
|
}, // condition
|
||||||
|
nil // child code
|
||||||
|
] call ace_interact_menu_fnc_createAction;
|
||||||
|
|
||||||
|
// add the action to the vehicle
|
||||||
|
// in this class event handler, this#0 will be the vehicle
|
||||||
|
[
|
||||||
|
_parentClass, // parent classname
|
||||||
|
0, // action 0 or self-action 1
|
||||||
|
["ACE_MainActions", _rootActionID], // parent
|
||||||
|
_removeFlagAction, // action
|
||||||
|
true // apply to child classes
|
||||||
|
] call ace_interact_menu_fnc_addActionToClass;
|
||||||
|
|
||||||
} forEach _baseClassesToApplyActionsFor;
|
} forEach _baseClassesToApplyActionsFor;
|
||||||
|
|
||||||
|
[
|
||||||
|
LEVEL_DEBUG,
|
||||||
|
QUOTE(COMPONENT),
|
||||||
|
"initClient complete",
|
||||||
|
[]
|
||||||
|
] call EFUNC(common,log);
|
||||||
|
|
||||||
|
localNamespace setVariable [QGVAR(complete), true];
|
||||||
|
|
||||||
nil;
|
nil;
|
||||||
@@ -6,21 +6,30 @@
|
|||||||
Parameter(s):
|
Parameter(s):
|
||||||
0: STRING - Classname of the vehicle to check
|
0: STRING - Classname of the vehicle to check
|
||||||
*/
|
*/
|
||||||
|
#include "..\script_component.hpp"
|
||||||
|
|
||||||
if (!hasInterface) exitWith {};
|
if (!hasInterface) exitWith {};
|
||||||
|
|
||||||
params [["_className", "", [""]]];
|
params [["_className", "", [""]]];
|
||||||
if (_className == "") exitWith {false};
|
if (_className == "") exitWith {false};
|
||||||
|
|
||||||
private _vehicleFlagsCfg = call milsim_vehicleFlags_fnc_getVehicleFlagsCfg;
|
private _vehicleFlagsCfg = call FUNC(getVehicleFlagsCfg);
|
||||||
private _excludedVehiclesClass = (_vehicleFlagsCfg >> "ExcludedVehicles");
|
private _excludedVehiclesClass = (_vehicleFlagsCfg >> "ExcludedVehicles");
|
||||||
private _exclusionGroups = configProperties [_vehicleFlagsCfg >> "ExcludedVehicles"];
|
private _exclusionGroups = configProperties [_vehicleFlagsCfg >> "ExcludedVehicles"];
|
||||||
|
|
||||||
|
private _isExcluded = false;
|
||||||
{
|
{
|
||||||
// Check if the class doesn't have a flag proxy
|
// Check if the class is directly excluded
|
||||||
private _excludedClasses = _x call BIS_fnc_getCfgDataArray;
|
private _excludedClasses = _x call BIS_fnc_getCfgDataArray;
|
||||||
if (_className in _excludedClasses) exitWith {true};
|
if (_className in _excludedClasses) exitWith {
|
||||||
|
_isExcluded = true;
|
||||||
|
};
|
||||||
|
{
|
||||||
|
if (_className isKindOf _x) exitWith {
|
||||||
|
_isExcluded = true;
|
||||||
|
};
|
||||||
|
} forEach _excludedClasses;
|
||||||
|
if (_isExcluded) exitWith {};
|
||||||
} forEach _exclusionGroups;
|
} forEach _exclusionGroups;
|
||||||
|
|
||||||
false;
|
_isExcluded;
|
||||||
|
|||||||
294
framework/zeus/functions/fn_addZenModules.sqf
Normal file
294
framework/zeus/functions/fn_addZenModules.sqf
Normal file
@@ -0,0 +1,294 @@
|
|||||||
|
#include "..\script_component.hpp"
|
||||||
|
|
||||||
|
if ( !hasInterface ) exitWith {};
|
||||||
|
|
||||||
|
// Create Resupply Box
|
||||||
|
[
|
||||||
|
QUOTE(MODULE_CATEGORY_NAME),
|
||||||
|
"Create Resupply Box",
|
||||||
|
{
|
||||||
|
// module placement
|
||||||
|
params [["_pos", [0,0,0], [[]], 3], ["_target", objNull, [objNull]]];
|
||||||
|
// get parent definition
|
||||||
|
private _supplyCratesCfg = call EFUNC(resupply,getSupplyCratesCfg);
|
||||||
|
// get the subclass names
|
||||||
|
private _boxTypesAvailable = _supplyCratesCfg call BIS_fnc_getCfgSubClasses;
|
||||||
|
|
||||||
|
_boxTypesAvailable sort true;
|
||||||
|
_comboOptions = _boxTypesAvailable apply {
|
||||||
|
[
|
||||||
|
// display name
|
||||||
|
[_supplyCratesCfg >> _x >> "displayName", "STRING", "ERROR"] call CBA_fnc_getConfigEntry,
|
||||||
|
// tooltip
|
||||||
|
[_supplyCratesCfg >> _x >> "tooltip", "STRING", "ERROR"] call CBA_fnc_getConfigEntry,
|
||||||
|
// icon
|
||||||
|
[_supplyCratesCfg >> _x >> "icon", "STRING", "ERROR"] call CBA_fnc_getConfigEntry
|
||||||
|
]
|
||||||
|
};
|
||||||
|
|
||||||
|
[ // create the dialog
|
||||||
|
"Resupply Box Options",
|
||||||
|
[
|
||||||
|
// [ "COMBO", "Box Type", [[1,2,3], [["Ammo"],["Weapons"],["Medical"]],0] ]
|
||||||
|
["COMBO", "Box Type", [_boxTypesAvailable, _comboOptions, 0]]
|
||||||
|
],
|
||||||
|
{
|
||||||
|
|
||||||
|
params ["_dialog", "_args"];
|
||||||
|
|
||||||
|
_dialog params ["_typeOptionSelected"];
|
||||||
|
_args params ["_pos", "_target", "_keysSorted"];
|
||||||
|
|
||||||
|
|
||||||
|
private _box = [_target, _typeOptionSelected, _pos] call EFUNC(resupply,createBox);
|
||||||
|
if (isNull _box) exitWith {
|
||||||
|
["Resupply Box", "WARNING: Failed to locate or create box!"] call BIS_fnc_curatorHint;
|
||||||
|
};
|
||||||
|
[
|
||||||
|
"Resupply Box",
|
||||||
|
format[
|
||||||
|
"Created %1",
|
||||||
|
getText((call EFUNC(resupply,getSupplyCratesCfg)) >> _typeOptionSelected >> "displayName")
|
||||||
|
]
|
||||||
|
] call BIS_fnc_curatorHint;
|
||||||
|
},
|
||||||
|
{},
|
||||||
|
[_pos, _target]
|
||||||
|
] call zen_dialog_fnc_create;
|
||||||
|
}
|
||||||
|
] call zen_custom_modules_fnc_register;
|
||||||
|
|
||||||
|
// Manage wheels in a vehicle's ACE cargo
|
||||||
|
[
|
||||||
|
QUOTE(MODULE_CATEGORY_NAME),
|
||||||
|
"Manage Wheels in Vehicle",
|
||||||
|
{
|
||||||
|
// module placement
|
||||||
|
params [["_pos", [0,0,0], [[]], 3], ["_target", objNull, [objNull]]];
|
||||||
|
|
||||||
|
if (isNull _target) exitWith {
|
||||||
|
["Manage Wheels in Vehicle", "WARNING: No vehicle selected!"] call BIS_fnc_curatorHint;
|
||||||
|
};
|
||||||
|
|
||||||
|
if (_target isKindOf "CAManBase") exitWith {
|
||||||
|
["Manage Wheels in Vehicle", "WARNING: Cannot add wheels/tracks to a person!"] call BIS_fnc_curatorHint;
|
||||||
|
};
|
||||||
|
|
||||||
|
if (_target isKindOf "Static") exitWith {
|
||||||
|
["Manage Wheels in Vehicle", "WARNING: Cannot add wheels/tracks to a static object!"] call BIS_fnc_curatorHint;
|
||||||
|
};
|
||||||
|
|
||||||
|
// get loaded details
|
||||||
|
private _loadedItems = _target getVariable ["ace_cargo_loaded", []];
|
||||||
|
private _loadedItemsObjects = _loadedItems select { _x isEqualType objNull };
|
||||||
|
private _loadedItemsVirtual = _loadedItems select { _x isEqualType "" };
|
||||||
|
private _spaceLeft = _target getVariable ["ace_cargo_space", 0];
|
||||||
|
|
||||||
|
private _wheels = _loadedItemsVirtual select { _x isEqualTo "ACE_Wheel" };
|
||||||
|
_wheels append (_loadedItemsObjects select { typeOf _x isEqualTo "ACE_Wheel" });
|
||||||
|
|
||||||
|
|
||||||
|
private _maxWheels = floor ((_spaceLeft + count _loadedItems) / ("ACE_Wheel" call ace_cargo_fnc_getSizeItem));
|
||||||
|
private _currentWheels = count _wheels;
|
||||||
|
|
||||||
|
private _comboOptions = [[], [], _currentWheels];
|
||||||
|
for "_i" from 0 to _maxWheels do {
|
||||||
|
_comboOptions#0 pushBack _i;
|
||||||
|
_comboOptions#1 pushBack format["%1", _i];
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
[ // create the dialog
|
||||||
|
"Manage Wheels in Vehicle",
|
||||||
|
[
|
||||||
|
// [ "COMBO", "Box Type", [[1,2,3], [["Ammo"],["Weapons"],["Medical"]],0] ]
|
||||||
|
["TOOLBOX", "Existing Data", [
|
||||||
|
0, // default value
|
||||||
|
2, // num rows
|
||||||
|
2, // num columns
|
||||||
|
[
|
||||||
|
format["Loaded Items: %1", count _loadedItems],
|
||||||
|
format["Space Left: %1", _spaceLeft],
|
||||||
|
format["Loaded Wheels: %1", count _wheels]
|
||||||
|
]
|
||||||
|
]],
|
||||||
|
["COMBO", "Desired ACE Wheels Count", _comboOptions, true]
|
||||||
|
],
|
||||||
|
{
|
||||||
|
|
||||||
|
params ["_dialogValues", "_args"];
|
||||||
|
|
||||||
|
_dialogValues params ["_listItem", "_desiredWheelsCount"];
|
||||||
|
_args params ["_pos", "_target", "_currentWheelsCount"];
|
||||||
|
|
||||||
|
// MANAGE WHEELS
|
||||||
|
if (_desiredWheelsCount > _currentWheelsCount) then {
|
||||||
|
// add wheels
|
||||||
|
private _wheelsToAdd = _desiredWheelsCount - _currentWheelsCount;
|
||||||
|
systemChat format["Adding %1 wheels...", _wheelsToAdd];
|
||||||
|
for "_i" from 1 to _wheelsToAdd do {
|
||||||
|
if (
|
||||||
|
["ACE_Wheel", _target] call ace_cargo_fnc_canLoadItemIn
|
||||||
|
) then {
|
||||||
|
["ACE_Wheel", _target] call ace_cargo_fnc_addCargoItem;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
if (_desiredWheelsCount < _currentWheelsCount) then {
|
||||||
|
// remove wheels
|
||||||
|
private _wheelsToRemove = _currentWheelsCount - _desiredWheelsCount;
|
||||||
|
systemChat format["Removing %1 wheels...", _wheelsToRemove];
|
||||||
|
["ACE_Wheel", _target, _wheelsToRemove] call ace_cargo_fnc_removeCargoItem;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// get loaded details
|
||||||
|
private _loadedItems = _target getVariable ["ace_cargo_loaded", []];
|
||||||
|
private _loadedItemsObjects = _loadedItems select { _x isEqualType objNull };
|
||||||
|
private _loadedItemsVirtual = _loadedItems select { _x isEqualType "" };
|
||||||
|
private _spaceLeft = _target getVariable ["ace_cargo_space", 0];
|
||||||
|
|
||||||
|
private _wheels = _loadedItemsVirtual select { _x isEqualTo "ACE_Wheel" };
|
||||||
|
_wheels append (_loadedItemsObjects select { typeOf _x isEqualTo "ACE_Wheel" });
|
||||||
|
|
||||||
|
|
||||||
|
private _maxWheels = floor ((_spaceLeft + count _loadedItems) / ("ACE_Wheel" call ace_cargo_fnc_getSizeItem));
|
||||||
|
private _currentWheels = count _wheels;
|
||||||
|
|
||||||
|
[
|
||||||
|
"Manage Wheels in Vehicle",
|
||||||
|
format[
|
||||||
|
"Updated count of wheels in vehicle: %1",
|
||||||
|
_currentWheels
|
||||||
|
]
|
||||||
|
] call BIS_fnc_curatorHint;
|
||||||
|
true;
|
||||||
|
},
|
||||||
|
{},
|
||||||
|
[_pos, _target, count _wheels, count _tracks]
|
||||||
|
] call zen_dialog_fnc_create;
|
||||||
|
}
|
||||||
|
] call zen_custom_modules_fnc_register;
|
||||||
|
|
||||||
|
|
||||||
|
// Manage tracks in a vehicle's ACE cargo
|
||||||
|
[
|
||||||
|
QUOTE(MODULE_CATEGORY_NAME),
|
||||||
|
"Manage Tracks in Vehicle",
|
||||||
|
{
|
||||||
|
// module placement
|
||||||
|
params [["_pos", [0,0,0], [[]], 3], ["_target", objNull, [objNull]]];
|
||||||
|
|
||||||
|
if (isNull _target) exitWith {
|
||||||
|
["Manage Tracks in Vehicle", "WARNING: No vehicle selected!"] call BIS_fnc_curatorHint;
|
||||||
|
};
|
||||||
|
|
||||||
|
if (_target isKindOf "CAManBase") exitWith {
|
||||||
|
["Manage Tracks in Vehicle", "WARNING: Cannot add wheels/tracks to a person!"] call BIS_fnc_curatorHint;
|
||||||
|
};
|
||||||
|
|
||||||
|
if (_target isKindOf "Static") exitWith {
|
||||||
|
["Manage Tracks in Vehicle", "WARNING: Cannot add wheels/tracks to a static object!"] call BIS_fnc_curatorHint;
|
||||||
|
};
|
||||||
|
|
||||||
|
// get loaded details
|
||||||
|
private _loadedItems = _target getVariable ["ace_cargo_loaded", []];
|
||||||
|
private _loadedItemsObjects = _loadedItems select { _x isEqualType objNull };
|
||||||
|
private _loadedItemsVirtual = _loadedItems select { _x isEqualType "" };
|
||||||
|
private _spaceLeft = _target getVariable ["ace_cargo_space", 0];
|
||||||
|
|
||||||
|
private _tracks = _loadedItemsVirtual select { _x isEqualTo "ACE_Track" };
|
||||||
|
_tracks append (_loadedItemsObjects select { typeOf _x isEqualTo "ACE_Track" });
|
||||||
|
|
||||||
|
private _maxTracks = floor ((_spaceLeft + count _loadedItems) / ("ACE_Track" call ace_cargo_fnc_getSizeItem));
|
||||||
|
private _currentTracks = count _tracks;
|
||||||
|
|
||||||
|
private _comboOptions = [[], [], _currentTracks];
|
||||||
|
for "_i" from 0 to _maxTracks do {
|
||||||
|
_comboOptions#0 pushBack _i;
|
||||||
|
_comboOptions#1 pushBack format["%1", _i];
|
||||||
|
};
|
||||||
|
|
||||||
|
[ // create the dialog
|
||||||
|
"Manage Tracks in Vehicle",
|
||||||
|
[
|
||||||
|
// [ "COMBO", "Box Type", [[1,2,3], [["Ammo"],["Weapons"],["Medical"]],0] ]
|
||||||
|
["TOOLBOX", "Existing Data", [
|
||||||
|
0, // default value
|
||||||
|
2, // num rows
|
||||||
|
2, // num columns
|
||||||
|
[
|
||||||
|
format["Loaded Items: %1", count _loadedItems],
|
||||||
|
format["Space Left: %1", _spaceLeft],
|
||||||
|
format["Loaded Tracks: %1", count _tracks]
|
||||||
|
]
|
||||||
|
]],
|
||||||
|
["COMBO", "Desired ACE Tracks Count", _comboOptions, true]
|
||||||
|
],
|
||||||
|
{
|
||||||
|
|
||||||
|
params ["_dialogValues", "_args"];
|
||||||
|
|
||||||
|
_dialogValues params ["_listItem", "_desiredTracksCount"];
|
||||||
|
_args params ["_pos", "_target", "_currentTracksCount"];
|
||||||
|
|
||||||
|
// MANAGE TRACKS
|
||||||
|
if (_desiredTracksCount > _currentTracksCount) then {
|
||||||
|
// add tracks
|
||||||
|
private _tracksToAdd = _desiredTracksCount - _currentTracksCount;
|
||||||
|
systemChat format["Adding %1 tracks...", _tracksToAdd];
|
||||||
|
for "_i" from 1 to _tracksToAdd do {
|
||||||
|
if (
|
||||||
|
["ACE_Track", _target] call ace_cargo_fnc_canLoadItemIn
|
||||||
|
) then {
|
||||||
|
["ACE_Track", _target] call ace_cargo_fnc_addCargoItem;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
if (_desiredTracksCount < _currentTracksCount) then {
|
||||||
|
// remove tracks
|
||||||
|
private _tracksToRemove = _currentTracksCount - _desiredTracksCount;
|
||||||
|
systemChat format["Removing %1 tracks...", _tracksToRemove];
|
||||||
|
["ACE_Track", _target, _tracksToRemove] call ace_cargo_fnc_removeCargoItem;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// get loaded details
|
||||||
|
private _loadedItems = _target getVariable ["ace_cargo_loaded", []];
|
||||||
|
private _loadedItemsObjects = _loadedItems select { _x isEqualType objNull };
|
||||||
|
private _loadedItemsVirtual = _loadedItems select { _x isEqualType "" };
|
||||||
|
private _spaceLeft = _target getVariable ["ace_cargo_space", 0];
|
||||||
|
|
||||||
|
private _tracks = _loadedItemsVirtual select { _x isEqualTo "ACE_Track" };
|
||||||
|
_tracks append (_loadedItemsObjects select { typeOf _x isEqualTo "ACE_Track" });
|
||||||
|
|
||||||
|
private _maxTracks = floor ((_spaceLeft + count _loadedItems) / ("ACE_Track" call ace_cargo_fnc_getSizeItem));
|
||||||
|
private _currentTracks = count _tracks;
|
||||||
|
|
||||||
|
[
|
||||||
|
"Manage Tracks in Vehicle",
|
||||||
|
format[
|
||||||
|
"Updated count of tracks in vehicle: %1",
|
||||||
|
_currentTracks
|
||||||
|
]
|
||||||
|
] call BIS_fnc_curatorHint;
|
||||||
|
true;
|
||||||
|
},
|
||||||
|
{},
|
||||||
|
[_pos, _target, _currentTracks]
|
||||||
|
] call zen_dialog_fnc_create;
|
||||||
|
}
|
||||||
|
] call zen_custom_modules_fnc_register;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
[
|
||||||
|
LEVEL_INFO,
|
||||||
|
QUOTE(COMPONENT),
|
||||||
|
"ZEUS ENHANCED MODULES ADDED",
|
||||||
|
[]
|
||||||
|
] call EFUNC(common,log);
|
||||||
|
|
||||||
|
nil;
|
||||||
14
framework/zeus/functions/fn_initClient.sqf
Normal file
14
framework/zeus/functions/fn_initClient.sqf
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
#include "..\script_component.hpp"
|
||||||
|
|
||||||
|
if (!hasInterface) exitWith {};
|
||||||
|
|
||||||
|
call FUNC(addZenModules);
|
||||||
|
|
||||||
|
[
|
||||||
|
LEVEL_DEBUG,
|
||||||
|
QUOTE(COMPONENT),
|
||||||
|
"postInit complete",
|
||||||
|
[]
|
||||||
|
] call EFUNC(common,log);
|
||||||
|
|
||||||
|
localNamespace setVariable [QGVAR(complete), true];
|
||||||
3
framework/zeus/script_component.hpp
Normal file
3
framework/zeus/script_component.hpp
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
#define COMPONENT zeus
|
||||||
|
#define COMPONENT_BEAUTIFIED Zeus Utilities
|
||||||
|
#include "../script_mod.hpp"
|
||||||
Reference in New Issue
Block a user