Compare commits
20 Commits
5d3c28b807
...
emp
| Author | SHA1 | Date | |
|---|---|---|---|
|
d946170831
|
|||
|
ba708a8aa9
|
|||
|
032377d7f6
|
|||
|
e0e06eff5e
|
|||
|
|
2c733f77df | ||
| 8ed6b8a5c6 | |||
| 1d7e1ede37 | |||
| 363016d778 | |||
|
442cb0b0b2
|
|||
|
2db018103c
|
|||
|
fba423e38d
|
|||
|
7268d8fd50
|
|||
|
3217ec487d
|
|||
|
7c903d1021
|
|||
|
|
bbe798734a | ||
|
|
e372563e58 | ||
|
|
8283f19b77 | ||
| 644de22b32 | |||
|
dfd79c0d70
|
|||
| 02e97b3e0e |
37
CHANGELOG.md
37
CHANGELOG.md
@@ -4,7 +4,32 @@ All notable changes to this project will be documented in this file.
|
||||
|
||||
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project badly attempts [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||
|
||||
## [3.2] - 2024-02-01
|
||||
## [4.0.0] - 2024-02-07
|
||||
|
||||
Version 4 marks a massive rewrite due in whole to @IndigoFox by updating the internals of the framework into CBA macros and functions.
|
||||
|
||||
### Added
|
||||
|
||||
- Added ability for FBCB2 Assets to locate themselves on player local map
|
||||
- Added various framework utitily functions
|
||||
- Added ability for mission maker to allow spawning of resupply boxes from arsenal boxes
|
||||
- Added CBA settings for resupply box spawning
|
||||
|
||||
### Changed
|
||||
|
||||
- Documented purpose of `missionSeries` parameter in `mission_settings.hpp`
|
||||
- Moved internal functions into new framework directory structure
|
||||
- Moved FBCB2 internal data structure into multiple defintion files
|
||||
- Moved resupply boxes internal data structures into their own definiton file
|
||||
- Moved player inventory internal data structure into its own defintion file
|
||||
- Moved vehicle flags internal data structure into its own defitinion file
|
||||
- Use player's preferred ACE color settings for medical triage icons
|
||||
|
||||
### Deleted
|
||||
|
||||
- Leftover resupply box code from before version 3.2.0 update
|
||||
|
||||
## [3.2.0] - 2024-02-01
|
||||
|
||||
### Added
|
||||
|
||||
@@ -62,7 +87,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
||||
- Lowered garbage collection times and range for dead bodies
|
||||
|
||||
|
||||
## [3.0] - 2023-05-03
|
||||
## [3.0.0] - 2023-05-03
|
||||
|
||||
### Added
|
||||
|
||||
@@ -79,7 +104,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
||||
|
||||
- Remove `CfgRemoteExec` from `description.ext` as it has been deprecated as of Arma v1.54
|
||||
|
||||
## [2.2] - 2023-04-23
|
||||
## [2.2.0] - 2023-04-23
|
||||
|
||||
### Added
|
||||
|
||||
@@ -93,7 +118,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
||||
|
||||
- Force `sideChat` CBA setting to 'disabled' on mission start by default
|
||||
|
||||
## [2.1] - 2023-04-12
|
||||
## [2.1.0] - 2023-04-12
|
||||
|
||||
### Added
|
||||
|
||||
@@ -103,7 +128,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
||||
- Allow `#admin` to enable or disable `sideChat` via CBA setting on a per mission file basis.
|
||||
`Escape -> Configure -> Addon Options -> Server -> 17th Battalion -> Enable Side Chat`
|
||||
|
||||
## [2.0] -2023-04-12
|
||||
## [2.0.0] -2023-04-12
|
||||
|
||||
### Added
|
||||
|
||||
@@ -113,7 +138,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
||||
|
||||
- mission.jpg to correct dimensions and optimize
|
||||
|
||||
## [1.9] - 2023-03-07
|
||||
## [1.9.0] - 2023-03-07
|
||||
|
||||
### Added
|
||||
|
||||
|
||||
62
README.md
62
README.md
@@ -20,7 +20,7 @@ Once copied, the final structure should appear similar to the following:
|
||||
├── mission.sqm
|
||||
```
|
||||
|
||||
If you're building a mission for use in an op, please delete "aaFrameworkUtils" and "framework\x". These are for the purposes of development and add size bloat to the mission download when players connect to your mission.
|
||||
> **Note:** If you're building a mission for use and not actively developing code, the `aaFrameworkUtils` and `framework\x` directories **should be deleted**. *These are for the purposes of development and add size bloat to the mission download when players connect to your mission.*
|
||||
|
||||
After the requisite configuration file edits have been made, your mission is ready to be packed into a pbo for deployment.
|
||||
|
||||
@@ -45,6 +45,14 @@ The contents of the lower half of the file are where the mission maker is able t
|
||||
This file will be displayed the client mission loading screen.
|
||||
File should remain small *(under 300KiB)* and should optimally be `1024px by 512px` in resolution
|
||||
|
||||
## defines/
|
||||
|
||||
This directory contains the definition files use by the framework in various places. *Contents should not be edited*
|
||||
|
||||
## framework/
|
||||
|
||||
This directory contains the code for the mission framework. **Contents must not be edited.**
|
||||
|
||||
## images/
|
||||
|
||||
This directory is for organizational purposes for any images you wish to use in your mission
|
||||
@@ -52,7 +60,7 @@ This directory is for organizational purposes for any images you wish to use in
|
||||
## scripts/
|
||||
|
||||
This directory is for organizational purposes for any custom scripts you wish to use in your mission.
|
||||
> **Note**: Scripts may need to be edited to account for their new location
|
||||
> **Note:** Scripts may need to be edited to account for their new location
|
||||
|
||||
## sounds/
|
||||
|
||||
@@ -63,10 +71,56 @@ This directory is for organizational purposes for any custom scripts you wish to
|
||||
|
||||
This directory is for organizational purposes for textures files used by mission scripts.
|
||||
|
||||
## DEV NOTES
|
||||
|
||||
# Development Notes
|
||||
|
||||
All modules are broken apart as such in /framework. Client and server inits are managed in /framework/init.
|
||||
|
||||
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";
|
||||
};
|
||||
};
|
||||
|
||||
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
|
||||
#include "framework\CfgFunctions.hpp"
|
||||
class CfgFunctions {
|
||||
#include "framework\CfgFunctions.hpp"
|
||||
};
|
||||
|
||||
class CfgSounds {
|
||||
#include "framework\emp\CfgSounds.hpp"
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,180 +1,200 @@
|
||||
#include "script_mod.hpp"
|
||||
|
||||
class CfgFunctions {
|
||||
|
||||
class DOUBLES(PREFIX,init) {
|
||||
class functions {
|
||||
file = "framework\init\functions";
|
||||
class initServer { postInit = 1;};
|
||||
class initClient { postInit = 1;};
|
||||
class setDefaults { postInit = 1; };
|
||||
class addAARChatHandler { postInit = 1; };
|
||||
class addRespawnChatHandler { postInit = 1; };
|
||||
};
|
||||
class DOUBLES(PREFIX,init) {
|
||||
class functions {
|
||||
file = "framework\init\functions";
|
||||
class initServer { postInit = 1;};
|
||||
class initClient { postInit = 1;};
|
||||
class setDefaults { postInit = 1; };
|
||||
class addAARChatHandler { postInit = 1; };
|
||||
class addRespawnChatHandler { postInit = 1; };
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
class PREFIX {
|
||||
class ambience {
|
||||
file = "framework\ambience";
|
||||
class flakInitVehicle {};
|
||||
class flakEH {};
|
||||
};
|
||||
|
||||
class map {
|
||||
file = "framework\map";
|
||||
class initMapCopy { postInit = 1; };
|
||||
class copyMapFromPlayer {}; //needs refactor
|
||||
class getPlayerMapMarkers {}; //needs refactor
|
||||
class loadMapMarkers {}; //needs refactor
|
||||
class mapMarkerToString {}; //needs refactor
|
||||
class stringToMapMarker {}; //needs refactor
|
||||
};
|
||||
class PREFIX {
|
||||
class ambience {
|
||||
file = "framework\ambience";
|
||||
class flakInitVehicle {};
|
||||
class flakEH {};
|
||||
};
|
||||
};
|
||||
|
||||
class DOUBLES(PREFIX,client) {
|
||||
class functions {
|
||||
file = "framework\client\functions";
|
||||
class bindEmptyGroupGarbageCleanup { postInit = 1; };
|
||||
class bindEventHandlers { postInit = 1; };
|
||||
class bindVehicleActions { postInit = 1; };
|
||||
class addZenModules {postInit = 1;};
|
||||
};
|
||||
class DOUBLES(PREFIX,client) {
|
||||
class functions {
|
||||
file = "framework\client\functions";
|
||||
class bindEmptyGroupGarbageCleanup { postInit = 1; };
|
||||
class bindEventHandlers { postInit = 1; };
|
||||
class bindVehicleActions { postInit = 1; };
|
||||
class addZenModules {postInit = 1;};
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
class DOUBLES(PREFIX,common) {
|
||||
class functions {
|
||||
file = "framework\common\functions";
|
||||
class addCBASettings { preInit = 1; };
|
||||
class logMissionInfo {};
|
||||
class addPlayerInfoToArray {};
|
||||
class getApprovedAssetsCfg {};
|
||||
class getBattalionCfg {};
|
||||
class getNameOfBase {};
|
||||
class getNearestBase {};
|
||||
class log {};
|
||||
class checkPlayerInventory {};
|
||||
class logSettingChanged {};
|
||||
class padString {};
|
||||
class recurseSubclasses {};
|
||||
};
|
||||
class DOUBLES(PREFIX,common) {
|
||||
class functions {
|
||||
file = "framework\common\functions";
|
||||
class addCBASettings { preInit = 1; };
|
||||
class logMissionInfo {};
|
||||
class addPlayerInfoToArray {};
|
||||
class createOrUpdateDiaryRecord {};
|
||||
class getApprovedAssetsCfg {};
|
||||
class getBattalionCfg {};
|
||||
class getNameOfBase {};
|
||||
class getNearestBase {};
|
||||
class log {};
|
||||
class checkPlayerInventory {};
|
||||
class logSettingChanged {};
|
||||
class padString {};
|
||||
class recurseSubclasses {};
|
||||
};
|
||||
};
|
||||
|
||||
class DOUBLES(PREFIX,fbcb2_assets) {
|
||||
class functions {
|
||||
file = "framework\fbcb2_assets\functions";
|
||||
class addCBASettings {preInit=1;};
|
||||
class initServer {};
|
||||
class initClient {};
|
||||
class getCallsignFromClassname {};
|
||||
class getCurrentAssetsByBase {};
|
||||
class getInventory {};
|
||||
class getMagsForWeapon {};
|
||||
class getStartingAndCurrentAssets {};
|
||||
class getStartingAssetsByBase {};
|
||||
class getVehicleData {};
|
||||
class getWeaponry {};
|
||||
class hintAllApprovedAssets {};
|
||||
class isAssetInRangeOfBase {};
|
||||
class removeAssetDiaryRecords {};
|
||||
class removeMarkersOnMap {};
|
||||
class showMarkersOnMap {};
|
||||
class updateAssetDiary {};
|
||||
class updateAssetsByBase {};
|
||||
};
|
||||
class DOUBLES(PREFIX,emp) {
|
||||
class functions {
|
||||
file = "framework\emp\functions";
|
||||
// class addCBASettings {preInit=1;};
|
||||
class init {};
|
||||
class addACEActions {};
|
||||
|
||||
class applyLocalObjectEffects {};
|
||||
class applyLocalGroupEffects {};
|
||||
class applyGlobalObjectEffects {};
|
||||
class applyServerObjectEffects {};
|
||||
|
||||
class deploy {};
|
||||
class getObjectsAndGroupsToAffect {};
|
||||
class playLocalEffects {};
|
||||
class playLocalEffectsForObject {};
|
||||
|
||||
class isItemElectronic {};
|
||||
class removeUnitElectricInventoryItems {};
|
||||
class removeVehicleElectricInventoryItems {};
|
||||
};
|
||||
};
|
||||
|
||||
class DOUBLES(PREFIX,fbcb2_main) {
|
||||
class functions {
|
||||
file = "framework\fbcb2_main\functions";
|
||||
class initClient {};
|
||||
class addEnvironmentRecord {};
|
||||
class addFrequenciesRecord {};
|
||||
class addSignalColorsRecord {};
|
||||
};
|
||||
class util {
|
||||
file = "framework\fbcb2_main\util";
|
||||
class createOrUpdateDiaryRecord {};
|
||||
class formatRadioElementForDiary {};
|
||||
class generateElementFrequencyRecordText {};
|
||||
};
|
||||
class DOUBLES(PREFIX,fbcb2_assets) {
|
||||
class functions {
|
||||
file = "framework\fbcb2_assets\functions";
|
||||
class addCBASettings {preInit=1;};
|
||||
class initServer {};
|
||||
class initClient {};
|
||||
class getCallsignFromClassname {};
|
||||
class getCurrentAssetsByBase {};
|
||||
class getInventory {};
|
||||
class getMagsForWeapon {};
|
||||
class getStartingAndCurrentAssets {};
|
||||
class getStartingAssetsByBase {};
|
||||
class getVehicleData {};
|
||||
class getWeaponry {};
|
||||
class hintAllApprovedAssets {};
|
||||
class isAssetInRangeOfBase {};
|
||||
class removeAssetDiaryRecords {};
|
||||
class removeMarkersOnMap {};
|
||||
class showMarkersOnMap {};
|
||||
class updateAssetDiary {};
|
||||
class updateAssetsByBase {};
|
||||
};
|
||||
};
|
||||
|
||||
class DOUBLES(PREFIX,performance) {
|
||||
class functions {
|
||||
file = "framework\performance\functions";
|
||||
class addCBASettings {preInit=1;};
|
||||
class addDNI_PlayerFPS { postInit = 1; };
|
||||
|
||||
// PFHs managed in addCBASettings onChange code
|
||||
class addClientStatsPFH {};
|
||||
class calculateClientStats {};
|
||||
class addServerStatsPFH {};
|
||||
class calculateServerStats {};
|
||||
};
|
||||
class DOUBLES(PREFIX,fbcb2_main) {
|
||||
class functions {
|
||||
file = "framework\fbcb2_main\functions";
|
||||
class initClient {};
|
||||
class addEnvironmentRecord {};
|
||||
class addFrequenciesRecord {};
|
||||
class addSignalColorsRecord {};
|
||||
};
|
||||
|
||||
class DOUBLES(PREFIX,reinsert) {
|
||||
class functions {
|
||||
file = "framework\reinsert\functions";
|
||||
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 util {
|
||||
file = "framework\fbcb2_main\util";
|
||||
class formatRadioElementForDiary {};
|
||||
class generateElementFrequencyRecordText {};
|
||||
};
|
||||
};
|
||||
|
||||
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,mapcopy) {
|
||||
class functions {
|
||||
file = "framework\mapcopy\functions";
|
||||
class addCBASettings {preInit=1;};
|
||||
class initClient {};
|
||||
class getMapMarkers {};
|
||||
class loadMapMarkers {};
|
||||
class mapMarkerToString {};
|
||||
class stringToMapMarker {};
|
||||
};
|
||||
};
|
||||
|
||||
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,performance) {
|
||||
class functions {
|
||||
file = "framework\performance\functions";
|
||||
class addCBASettings {preInit=1;};
|
||||
class addDNI_PlayerFPS { postInit = 1; };
|
||||
|
||||
// PFHs managed in addCBASettings onChange code
|
||||
class addClientStatsPFH {};
|
||||
class calculateClientStats {};
|
||||
class addServerStatsPFH {};
|
||||
class calculateServerStats {};
|
||||
};
|
||||
};
|
||||
|
||||
class DOUBLES(PREFIX,vehicleFlags) {
|
||||
class functions {
|
||||
file = "framework\vehicleFlags\functions";
|
||||
class initClient {};
|
||||
class getActionsFlagCategories {};
|
||||
class getVehicleFlagsCfg {};
|
||||
class isClassExcluded {};
|
||||
};
|
||||
class DOUBLES(PREFIX,reinsert) {
|
||||
class functions {
|
||||
file = "framework\reinsert\functions";
|
||||
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,zeus) {
|
||||
class functions {
|
||||
file = "framework\zeus\functions";
|
||||
class initClient {};
|
||||
class addZenModules {};
|
||||
};
|
||||
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 {};
|
||||
};
|
||||
};
|
||||
@@ -3,12 +3,21 @@
|
||||
if (!hasInterface) exitWith {};
|
||||
|
||||
params [
|
||||
["_subjectID", GVAR(subjectStatusID), [""]],
|
||||
["_subjectID", "", [""]],
|
||||
["_recordTitle", "", [""]],
|
||||
["_recordText", "", [""]],
|
||||
["_recordIcon", "", [""]]
|
||||
];
|
||||
|
||||
// Check if all parameters are provided
|
||||
if (
|
||||
count _subjectID isEqualTo 0 ||
|
||||
count _recordTitle isEqualTo 0 ||
|
||||
count _recordText isEqualTo 0
|
||||
) exitWith {
|
||||
[LEVEL_ERROR, QUOTE(COMPONENT), "Not all parameters provided"] call EFUNC(common,log);
|
||||
};
|
||||
|
||||
// Check if already created
|
||||
private _subjectRecords = GVAR(diaryRecords) getOrDefault [_subjectID, createHashMap, true];
|
||||
private _existingRecord = _subjectRecords getOrDefault [_recordTitle, diaryRecordNull, true];
|
||||
@@ -27,7 +27,16 @@ private _hash = createHashMapFromArray _data;
|
||||
_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;
|
||||
_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;
|
||||
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,
|
||||
QUOTE(COMPONENT),
|
||||
"postInit complete",
|
||||
"initClient complete",
|
||||
[]
|
||||
] call EFUNC(common,log);
|
||||
|
||||
|
||||
@@ -241,7 +241,7 @@ private _randomColors = [
|
||||
],
|
||||
_recordText joinString "<br/>",
|
||||
_icon
|
||||
] call EFUNC(fbcb2_main,createOrUpdateDiaryRecord);
|
||||
] call EFUNC(common,createOrUpdateDiaryRecord);
|
||||
|
||||
// "\A3\ui_f\data\igui\cfg\simpleTasks\types\car_ca.paa"
|
||||
} forEach _distinctVehiclesClassNames;
|
||||
|
||||
@@ -109,4 +109,4 @@ _text = _text joinString "<br/>";
|
||||
GVAR(subjectIntelID),
|
||||
_recordTitle,
|
||||
_text
|
||||
] call FUNC(createOrUpdateDiaryRecord);
|
||||
] call EFUNC(common,createOrUpdateDiaryRecord);
|
||||
@@ -62,7 +62,7 @@ reverse _battalionElementCfgs;
|
||||
GVAR(subjectFrequenciesID),
|
||||
_diaryTitleText#0,
|
||||
_diaryTitleText#1
|
||||
] call FUNC(createOrUpdateDiaryRecord);
|
||||
] call EFUNC(common,createOrUpdateDiaryRecord);
|
||||
} forEach _battalionElementCfgs;
|
||||
|
||||
// add the battalion command to the top of the list
|
||||
@@ -72,6 +72,6 @@ private _diaryTitleText = [_battalionInfoCfg >> "Command", false] call FUNC(gene
|
||||
GVAR(subjectFrequenciesID),
|
||||
_diaryTitleText#0,
|
||||
_diaryTitleText#1
|
||||
] call FUNC(createOrUpdateDiaryRecord);
|
||||
] call EFUNC(common,createOrUpdateDiaryRecord);
|
||||
|
||||
true;
|
||||
@@ -56,4 +56,4 @@ _text = _text joinString "<br/><br/>";
|
||||
GVAR(subjectIntelID),
|
||||
_recordTitle,
|
||||
_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(subjectAssetsGroundID), "FBCB2 Ground"];
|
||||
|
||||
// store records in format:
|
||||
// [subject, [
|
||||
// [title, diaryRecord]
|
||||
// ]]
|
||||
GVAR(diaryRecords) = createHashMap;
|
||||
|
||||
// run main inits
|
||||
[] call FUNC(addFrequenciesRecord);
|
||||
[] call FUNC(addSignalColorsRecord);
|
||||
@@ -47,7 +41,7 @@ GVAR(diaryRecords) = createHashMap;
|
||||
[
|
||||
LEVEL_DEBUG,
|
||||
QUOTE(COMPONENT),
|
||||
"postInit complete",
|
||||
"initClient complete",
|
||||
[]
|
||||
] call EFUNC(common,log);
|
||||
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
[
|
||||
LEVEL_INFO,
|
||||
QUOTE(COMPONENT),
|
||||
"Respawn chat handler registered",
|
||||
"respawn chat handler registered",
|
||||
[player] call EFUNC(common,addPlayerInfoToArray)
|
||||
] call EFUNC(common,log);
|
||||
|
||||
|
||||
@@ -2,20 +2,22 @@
|
||||
|
||||
if ( !hasInterface ) exitWith {};
|
||||
|
||||
["milsim_logText", {
|
||||
params [["_strArray", [""], [[]]]];
|
||||
{
|
||||
diag_log text _x;
|
||||
} forEach _strArray;
|
||||
}] call CBA_fnc_addEventHandler;
|
||||
|
||||
// make sure the server has finished init
|
||||
waitUntil {!isNil QGVARMAIN(complete)};
|
||||
|
||||
["InitializePlayer", [player, true]] call BIS_fnc_dynamicGroups;
|
||||
|
||||
// Initialize a holder for managing local diary records
|
||||
// store records in format:
|
||||
// [subject, [
|
||||
// [title, diaryRecord]
|
||||
// ]]
|
||||
EGVAR(common,diaryRecords) = createHashMap;
|
||||
|
||||
|
||||
// initialize other modules
|
||||
call EFUNC(emp,init);
|
||||
call EFUNC(mapcopy,initClient);
|
||||
call EFUNC(reinsert,initClient);
|
||||
call EFUNC(resupply,initClient);
|
||||
call EFUNC(triageIcons,initClient);
|
||||
@@ -28,7 +30,7 @@ call EFUNC(fbcb2_assets,initClient);
|
||||
[
|
||||
LEVEL_DEBUG,
|
||||
QUOTE(COMPONENT),
|
||||
"postInit complete",
|
||||
"initClient complete",
|
||||
[]
|
||||
] call EFUNC(common,log);
|
||||
|
||||
|
||||
@@ -9,20 +9,11 @@ publicVariable QGVARMAIN(baseObjects);
|
||||
// Initializes the Dynamic Groups framework and groups
|
||||
["Initialize", [true]] call BIS_fnc_dynamicGroups;
|
||||
|
||||
if (isDedicated) then {
|
||||
["milsim_logText", {
|
||||
params [["_strArray", [""], [[]]]];
|
||||
{
|
||||
diag_log text _x;
|
||||
} forEach _strArray;
|
||||
}] call CBA_fnc_addEventHandler;
|
||||
};
|
||||
|
||||
|
||||
// initialize other modules
|
||||
call EFUNC(common,logMissionInfo);
|
||||
call EFUNC(fbcb2_assets,initServer);
|
||||
call EFUNC(reinsert,initServer);
|
||||
call EFUNC(emp,init);
|
||||
|
||||
// declare init complete to other modules
|
||||
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"
|
||||
|
||||
params ["_type"]; // string of the object's classname
|
||||
if (!(_type isKindOf "CAManBase")) exitWith {};
|
||||
params [
|
||||
["_types", [], [[]]], // classnames to assign these action to
|
||||
["_useInheritance", false, [false]]
|
||||
];
|
||||
|
||||
if (
|
||||
(localNamespace getVariable [QGVAR(fileForReinsertClassesAdded), []])
|
||||
find _type != -1
|
||||
) exitWith {};
|
||||
{ // forEach _types
|
||||
private _classToAddActionsTo = _x;
|
||||
|
||||
private _fileForReinsertAction = [
|
||||
QGVAR(fileReinsertRequestAction),
|
||||
"File Re-insert Request",
|
||||
"\A3\ui_f\data\igui\cfg\simpleTasks\types\takeoff_ca.paa",
|
||||
{ // statement
|
||||
params ["_target", "_player", "_params"];
|
||||
// find nearest base or location
|
||||
private _base = [_player] call EFUNC(common,getNearestBase);
|
||||
private _baseName = [_base] call EFUNC(common,getNameOfBase);
|
||||
// send event to server
|
||||
[QGVAR(fileReinsertRequest), [_player, _base]] call CBA_fnc_serverEvent;
|
||||
// notify player their request was filed
|
||||
[["Re-insert Request Filed"], [format["Location: %1", _baseName]]] call CBA_fnc_notify;
|
||||
},
|
||||
{ // condition
|
||||
params ["_target", "_player", "_params"];
|
||||
// find nearest base or location
|
||||
private _base = [_player] call EFUNC(common,getNearestBase);
|
||||
private _baseDistance = _player distance _base;
|
||||
private _fileForReinsertAction = [
|
||||
QGVAR(fileReinsertRequestAction),
|
||||
"File Re-insert Request",
|
||||
"\A3\ui_f\data\igui\cfg\simpleTasks\types\takeoff_ca.paa",
|
||||
{ // statement
|
||||
params ["_target", "_player", "_params"];
|
||||
// find nearest base or location
|
||||
private _base = [_player] call EFUNC(common,getNearestBase);
|
||||
private _baseName = [_base] call EFUNC(common,getNameOfBase);
|
||||
// send event to server
|
||||
[QGVAR(fileReinsertRequest), [_player, _base]] call CBA_fnc_serverEvent;
|
||||
// notify player their request was filed
|
||||
[["Re-insert Request Filed"], [format["Location: %1", _baseName]]] call CBA_fnc_notify;
|
||||
},
|
||||
{ // condition
|
||||
params ["_target", "_player", "_params"];
|
||||
// find nearest base or location
|
||||
private _base = [_player] call EFUNC(common,getNearestBase);
|
||||
private _baseDistance = _player distance _base;
|
||||
|
||||
private _maxRangeToReady = missionNamespace getVariable [QGVAR(setting_maxRangeToReady), 400];
|
||||
private _existingQueue = missionNamespace getVariable [QGVAR(reinsertionQueue), []];
|
||||
private _maxRangeToReady = [QGVAR(setting_maxRangeToReady)] call CBA_settings_fnc_get;
|
||||
private _existingQueue = missionNamespace getVariable [QGVAR(reinsertionQueue), []];
|
||||
|
||||
// check if module is enabled, player is near a base, and player is not already in the queue
|
||||
// (serverTime - GVAR(missionStartServerTime)) > 60*5 && // only allow after 15 minutes
|
||||
missionNamespace getVariable ["milsim_reinsert_setting_reinsertion_enabled", true] &&
|
||||
(_baseDistance < _maxRangeToReady) &&
|
||||
not (_player in (_existingQueue apply {_x#0}))
|
||||
}
|
||||
] call ace_interact_menu_fnc_createAction;
|
||||
[_type, 1, ["ACE_SelfActions"], _fileForReinsertAction, true] call ace_interact_menu_fnc_addActionToClass;
|
||||
// check if module is enabled, player is near a base, and player is not already in the queue
|
||||
// (serverTime - GVAR(missionStartServerTime)) > 60*5 && // only allow after 15 minutes
|
||||
[QGVAR(setting_enabled)] call CBA_settings_fnc_get &&
|
||||
(_baseDistance < _maxRangeToReady) &&
|
||||
not (_player in (_existingQueue apply {_x#0}))
|
||||
}
|
||||
] call ace_interact_menu_fnc_createAction;
|
||||
[_classToAddActionsTo, 1, ["ACE_SelfActions"], _fileForReinsertAction, _useInheritance] call ace_interact_menu_fnc_addActionToClass;
|
||||
|
||||
private _removeFileForReinsertAction = [
|
||||
QGVAR(removeReinsertRequestAction),
|
||||
"Remove Re-insert Request",
|
||||
"\A3\ui_f\data\igui\cfg\simpleTasks\types\land_ca.paa",
|
||||
{ // statement
|
||||
params ["_target", "_player", "_params"];
|
||||
// send event to server
|
||||
[QGVAR(removeReinsertRequest), [_player]] call CBA_fnc_serverEvent;
|
||||
// notify player their request was rescinded
|
||||
"Re-insert Request Rescinded" call CBA_fnc_notify;
|
||||
},
|
||||
{ // condition
|
||||
params ["_target", "_player", "_params"];
|
||||
private _existingQueue = missionNamespace getVariable [QGVAR(reinsertionQueue), []];
|
||||
|
||||
// check if module is enabled, player is in the queue
|
||||
// (serverTime - GVAR(missionStartServerTime)) > 60*5 && // only allow after 15 minutes
|
||||
missionNamespace getVariable ["milsim_reinsert_setting_reinsertion_enabled", true] &&
|
||||
(_player in (_existingQueue apply {_x#0}))
|
||||
}
|
||||
] call ace_interact_menu_fnc_createAction;
|
||||
[_type, 1, ["ACE_SelfActions"], _removeFileForReinsertAction, true] call ace_interact_menu_fnc_addActionToClass;
|
||||
|
||||
private _classesActionsAddedTo = (localNamespace getVariable [QGVAR(fileForReinsertClassesAdded), []]);
|
||||
_classesActionsAddedTo pushBackUnique _type;
|
||||
localNamespace setVariable [QGVAR(fileForReinsertClassesAdded), _classesActionsAddedTo];
|
||||
private _removeFileForReinsertAction = [
|
||||
QGVAR(removeReinsertRequestAction),
|
||||
"Remove Re-insert Request",
|
||||
"\A3\ui_f\data\igui\cfg\simpleTasks\types\land_ca.paa",
|
||||
{ // statement
|
||||
params ["_target", "_player", "_params"];
|
||||
// send event to server
|
||||
[QGVAR(removeReinsertRequest), [_player]] call CBA_fnc_serverEvent;
|
||||
// notify player their request was rescinded
|
||||
"Re-insert Request Rescinded" call CBA_fnc_notify;
|
||||
},
|
||||
{ // condition
|
||||
params ["_target", "_player", "_params"];
|
||||
private _existingQueue = missionNamespace getVariable [QGVAR(reinsertionQueue), []];
|
||||
|
||||
// check if module is enabled, player is in the queue
|
||||
// (serverTime - GVAR(missionStartServerTime)) > 60*5 && // only allow after 15 minutes
|
||||
[QGVAR(setting_enabled)] call CBA_settings_fnc_get &&
|
||||
(_player in (_existingQueue apply {_x#0}))
|
||||
}
|
||||
] call ace_interact_menu_fnc_createAction;
|
||||
[_classToAddActionsTo, 1, ["ACE_SelfActions"], _removeFileForReinsertAction, _useInheritance] call ace_interact_menu_fnc_addActionToClass;
|
||||
} forEach _types;
|
||||
@@ -1,30 +1,28 @@
|
||||
#include "..\script_component.hpp"
|
||||
|
||||
params ["_type"]; // string of the object's classname
|
||||
if (!(_type isKindOf "CAManBase")) exitWith {};
|
||||
params [
|
||||
["_types", [], [[]]], // classnames to assign these action to
|
||||
["_useInheritance", false, [false]]
|
||||
];
|
||||
|
||||
if (
|
||||
(localNamespace getVariable [QGVAR(checkReinsertQueueClassesAdded), []])
|
||||
find _type != -1
|
||||
) exitWith {};
|
||||
{ // forEach _types
|
||||
private _classToAddActionsTo = _x;
|
||||
|
||||
private _checkReinsertQueueAction = [
|
||||
QGVAR(checkReinsertQueue),
|
||||
"[PILOT] Check Re-insert Queue",
|
||||
"\A3\ui_f\data\igui\cfg\simpleTasks\types\land_ca.paa",
|
||||
{
|
||||
params ["_target", "_player", "_params"];
|
||||
// request notification from the server
|
||||
call FUNC(requestShowQueue);
|
||||
// reset last check time
|
||||
localNamespace setVariable [QGVAR(lastReinsertQueueCheck), diag_tickTime];
|
||||
},
|
||||
{
|
||||
missionNamespace getVariable [QGVAR(setting_enabled), true]
|
||||
} // always allow
|
||||
] call ace_interact_menu_fnc_createAction;
|
||||
[_type, 1, ["ACE_SelfActions"], _checkReinsertQueueAction, true] call ace_interact_menu_fnc_addActionToClass;
|
||||
private _checkReinsertQueueAction = [
|
||||
QGVAR(checkReinsertQueue),
|
||||
"[PILOT] Check Re-insert Queue",
|
||||
"\A3\ui_f\data\igui\cfg\simpleTasks\types\land_ca.paa",
|
||||
{
|
||||
params ["_target", "_player", "_params"];
|
||||
// request notification from the server
|
||||
call FUNC(requestShowQueue);
|
||||
// reset last check time
|
||||
localNamespace setVariable [QGVAR(lastReinsertQueueCheck), diag_tickTime];
|
||||
},
|
||||
{
|
||||
GVAR(setting_enabled);
|
||||
} // condition
|
||||
] call ace_interact_menu_fnc_createAction;
|
||||
[_classToAddActionsTo, 1, ["ACE_SelfActions"], _checkReinsertQueueAction, _useInheritance] call ace_interact_menu_fnc_addActionToClass;
|
||||
|
||||
private _classesActionsAddedTo = (localNamespace getVariable [QGVAR(checkReinsertQueueClassesAdded), []]);
|
||||
_classesActionsAddedTo pushBackUnique _type;
|
||||
localNamespace setVariable [QGVAR(checkReinsertQueueClassesAdded), _classesActionsAddedTo];
|
||||
} forEach _types;
|
||||
@@ -5,26 +5,16 @@ if (!hasInterface) exitWith {};
|
||||
// ACE SELF-INTERACTIONS FOR FILING AND RESCINDING REINSERT REQUESTS NEAR BASE - ALL PLAYERS
|
||||
localNamespace setVariable [QGVAR(fileForReinsertClassesAdded), []];
|
||||
// add actions to current class
|
||||
[typeOf player] call FUNC(addAceSelfActions);
|
||||
// add actions to future classes
|
||||
["ace_interact_menu_newControllableObject", {
|
||||
_this call FUNC(addAceSelfActions);
|
||||
}] call CBA_fnc_addEventHandler;
|
||||
[["CAManBase"], true] call FUNC(addAceSelfActions);
|
||||
|
||||
/////////////////////////////////////////////////////
|
||||
// PILOTS ONLY
|
||||
// ACE SELF-INTERACTIONS FOR CHECKING REINSERT QUEUE - ONLY FOR PILOTS
|
||||
if ((typeOf player) in ["B_Helipilot_F", "B_helicrew_F"]) then {
|
||||
localNamespace setVariable [QGVAR(checkReinsertQueueClassesAdded), []];
|
||||
localNamespace setVariable [QGVAR(lastReinsertQueueCheck), diag_tickTime];
|
||||
localNamespace setVariable [QGVAR(checkReinsertQueueClassesAdded), []];
|
||||
localNamespace setVariable [QGVAR(lastReinsertQueueCheck), diag_tickTime];
|
||||
|
||||
// add actions to current class
|
||||
[typeOf player] call FUNC(addCheckQueueSelfAction);
|
||||
// add actions to future classes
|
||||
["ace_interact_menu_newControllableObject", {
|
||||
_this call FUNC(addCheckQueueSelfAction);
|
||||
}] call CBA_fnc_addEventHandler;
|
||||
};
|
||||
// add actions to pilot classes, and don't apply to child classes
|
||||
[["B_Helipilot_F", "B_helicrew_F"], false] call FUNC(addCheckQueueSelfAction);
|
||||
/////////////////////////////////////////////////////
|
||||
|
||||
|
||||
@@ -33,13 +23,13 @@ if ((typeOf player) in ["B_Helipilot_F", "B_helicrew_F"]) then {
|
||||
[{
|
||||
// if module not enabled and pilot forced check not enabled, exit
|
||||
if (not (
|
||||
missionNamespace getVariable [QGVAR(setting_enabled), true] &&
|
||||
missionNamespace getVariable [QGVAR(setting_pilotForcedCheckEnabled), true]
|
||||
[QGVAR(setting_enabled)] call CBA_settings_fnc_get and
|
||||
[QGVAR(setting_pilotForcedCheckEnabled)] call CBA_settings_fnc_get
|
||||
)) exitWith {};
|
||||
|
||||
// if last check was less than X minutes ago, skip
|
||||
private _lastCheck = localNamespace getVariable [QGVAR(lastReinsertQueueCheck), diag_tickTime];
|
||||
private _requiredCheckInterval = missionNamespace getVariable [QGVAR(setting_pilotForcedCheckInterval), 60*20];
|
||||
private _requiredCheckInterval = [QGVAR(setting_pilotForcedCheckInterval)] call CBA_settings_fnc_get;
|
||||
if (
|
||||
diag_tickTime - _lastCheck <
|
||||
_requiredCheckInterval
|
||||
@@ -57,6 +47,8 @@ if ((typeOf player) in ["B_Helipilot_F", "B_helicrew_F"]) then {
|
||||
[
|
||||
LEVEL_DEBUG,
|
||||
QUOTE(COMPONENT),
|
||||
"postInit complete",
|
||||
"initClient complete",
|
||||
[]
|
||||
] call EFUNC(common,log);
|
||||
] call EFUNC(common,log);
|
||||
|
||||
localNamespace setVariable [QGVAR(complete), true];
|
||||
@@ -35,9 +35,7 @@ private _supplyCrateTypesCfgs = _supplyCratesCfg call BIS_fnc_returnChildren;
|
||||
private _cfg = _x;
|
||||
private _supplyCrateDisplayName = (_cfg >> "displayName") call BIS_fnc_getCfgData;
|
||||
|
||||
|
||||
|
||||
|
||||
// add action to spawn supply crate
|
||||
private _actionID = _arsenalBox addAction [format ["<t color='#ffffff'>Spawn %1</t>", _supplyCrateDisplayName], {
|
||||
params ["_target", "_caller", "_actionId", "_arguments"];
|
||||
_arguments params ["_supplyCrateCfg"];
|
||||
@@ -46,13 +44,16 @@ private _supplyCrateTypesCfgs = _supplyCratesCfg call BIS_fnc_returnChildren;
|
||||
configName _supplyCrateCfg,
|
||||
getPos _target
|
||||
] call FUNC(createBox);
|
||||
|
||||
// log action use in server RPT
|
||||
private _supplyCrateDisplayName = (_supplyCrateCfg >> "displayName") call BIS_fnc_getCfgData;
|
||||
[
|
||||
LEVEL_INFO,
|
||||
QUOTE(COMPONENT),
|
||||
"Supply crate spawned",
|
||||
[player, [
|
||||
["supplyCrateType", _supplyCrateDisplayName],
|
||||
["supplyCrateDisplayName", _supplyCrateDisplayName],
|
||||
["supplyCrateCfgName", configName _supplyCrateCfg],
|
||||
["position", getPos _target]
|
||||
]] call EFUNC(common,addPlayerInfoToArray)
|
||||
] remoteExec [QEFUNC(common,log), 2];
|
||||
|
||||
@@ -7,7 +7,8 @@ call FUNC(addArsenalObjectSpawnBoxActions);
|
||||
[
|
||||
LEVEL_DEBUG,
|
||||
QUOTE(COMPONENT),
|
||||
"postInit complete",
|
||||
"initClient complete",
|
||||
[]
|
||||
] call EFUNC(common,log);
|
||||
|
||||
localNamespace setVariable [QGVAR(complete), true];
|
||||
@@ -6,9 +6,9 @@
|
||||
#define VERSION_STR 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 1 // INFO
|
||||
// #define DEBUG_MODE 1 // INFO
|
||||
// #define DEBUG_MODE 2 // WARNING
|
||||
// #define DEBUG_MODE 3 // ERROR
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
#define MAJOR 3
|
||||
#define MINOR 2
|
||||
#define PATCHLVL 1
|
||||
#define MAJOR 4
|
||||
#define MINOR 0
|
||||
#define PATCHLVL 0
|
||||
#define BUILD 0
|
||||
|
||||
@@ -6,7 +6,8 @@ GVAR(drawTargets) = [];
|
||||
[
|
||||
LEVEL_DEBUG,
|
||||
QUOTE(COMPONENT),
|
||||
"postInit complete",
|
||||
"initClient complete",
|
||||
[]
|
||||
] call EFUNC(common,log);
|
||||
|
||||
localNamespace setVariable [QGVAR(complete), true];
|
||||
@@ -1,7 +1,7 @@
|
||||
if (!hasInterface) exitWith {};
|
||||
|
||||
#include "..\script_component.hpp"
|
||||
|
||||
if (!hasInterface) exitWith {};
|
||||
|
||||
private _vehicleFlagsCfg = call FUNC(getVehicleFlagsCfg);
|
||||
|
||||
if (!isClass _vehicleFlagsCfg) exitWith {
|
||||
@@ -16,94 +16,95 @@ private _flagCategoryCfgs = (_vehicleFlagsCfg >> "FlagCategories") call BIS_fnc_
|
||||
private _parentClass = _x;
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
// add CBA class event handler to add actions to vehicles after they are initialized
|
||||
// all classes that inherit from the base classes will also have this applied
|
||||
// an exclusion function is present for manually excluding specific classes
|
||||
// create the root action
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
[_parentClass, "InitPost", {
|
||||
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
// create the root action
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
private _rootActionID = "SetVehicleFlag";
|
||||
private _flagRootAction = [
|
||||
_rootActionID, // id
|
||||
"Set Vehicle Flag", // displayed title
|
||||
"\A3\ui_f\data\map\markers\flags\nato_ca.paa", // flag icon
|
||||
{true}, // statement
|
||||
{
|
||||
params ["_target", "_player", "_params"];
|
||||
// _params params ["_parentActionID", "_flagCategories"];
|
||||
|
||||
// check if vehicle is excluded
|
||||
private _excluded = [typeOf _target] call FUNC(isClassExcluded);
|
||||
if (_excluded || !alive _target) exitWith {false};
|
||||
|
||||
true;
|
||||
}, // condition
|
||||
{
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
// create the flag category actions (with nested flag actions)
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
params ["_target", "_player", "_params"];
|
||||
_params params ["_rootActionID"];
|
||||
|
||||
private _vehicleFlagsCfg = call FUNC(getVehicleFlagsCfg);
|
||||
if (isNull _vehicleFlagsCfg) exitWith {[]};
|
||||
private _flagCategoryCfgs = (_vehicleFlagsCfg >> "FlagCategories") call BIS_fnc_returnChildren;
|
||||
|
||||
// return category child actions with individual flag actions nested as children
|
||||
[_rootActionID, _flagCategoryCfgs] call FUNC(getActionsFlagCategories);
|
||||
|
||||
}, // child code
|
||||
[_rootActionID], // params
|
||||
nil, // position
|
||||
4, // distance
|
||||
[false, false, false, false, false], // other params
|
||||
nil // modifier function code
|
||||
] call ace_interact_menu_fnc_createAction;
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
// add root action to add flags
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
[
|
||||
(_this select 0), // object
|
||||
0, // action 0 or self-action 1
|
||||
["ACE_MainActions"], // parent
|
||||
_flagRootAction // action
|
||||
] call ace_interact_menu_fnc_addActionToObject;
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
// add action to remove flag under the root action
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
// create action
|
||||
private _removeFlagAction = [
|
||||
_rootActionID + "_removeflag", // id
|
||||
"Remove Flag", // displayed title
|
||||
"\A3\ui_f\data\map\markers\flags\nato_ca.paa", // flag icon
|
||||
{
|
||||
params ["_target", "_player", "_params"];
|
||||
_target forceFlagTexture "";
|
||||
}, // statement
|
||||
{
|
||||
params ["_target", "_player", "_params"];
|
||||
alive _target && getForcedFlagTexture _target != "";
|
||||
}, // condition
|
||||
nil // child code
|
||||
] call ace_interact_menu_fnc_createAction;
|
||||
|
||||
// add the action to the vehicle
|
||||
// in this class event handler, this#0 will be the vehicle
|
||||
[
|
||||
(_this select 0), // object
|
||||
0, // action 0 or self-action 1
|
||||
["ACE_MainActions", _rootActionID], // parent
|
||||
_removeFlagAction // action
|
||||
] call ace_interact_menu_fnc_addActionToObject;
|
||||
private _rootActionID = QGVAR(SetVehicleFlagAction);
|
||||
private _flagRootAction = [
|
||||
_rootActionID, // id
|
||||
"Set Vehicle Flag", // displayed title
|
||||
"\A3\ui_f\data\map\markers\flags\nato_ca.paa", // flag icon
|
||||
{true}, // statement
|
||||
{
|
||||
params ["_target", "_player", "_params"];
|
||||
// _params params ["_parentActionID", "_flagCategories"];
|
||||
|
||||
}, true, [], true] call CBA_fnc_addClassEventHandler;
|
||||
// check if vehicle is excluded
|
||||
private _excluded = [typeOf _target] call FUNC(isClassExcluded);
|
||||
if (_excluded || !alive _target) exitWith {false};
|
||||
|
||||
true;
|
||||
}, // condition
|
||||
{
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
// create the flag category actions (with nested flag actions)
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
params ["_target", "_player", "_params"];
|
||||
_params params ["_rootActionID"];
|
||||
|
||||
private _vehicleFlagsCfg = call FUNC(getVehicleFlagsCfg);
|
||||
if (isNull _vehicleFlagsCfg) exitWith {[]};
|
||||
private _flagCategoryCfgs = (_vehicleFlagsCfg >> "FlagCategories") call BIS_fnc_returnChildren;
|
||||
|
||||
// return category child actions with individual flag actions nested as children
|
||||
[_rootActionID, _flagCategoryCfgs] call FUNC(getActionsFlagCategories);
|
||||
|
||||
}, // child code
|
||||
[_rootActionID], // params
|
||||
nil, // position
|
||||
4, // distance
|
||||
[false, false, false, false, false], // other params
|
||||
nil // modifier function code
|
||||
] call ace_interact_menu_fnc_createAction;
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
// add root action to add flags
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
[
|
||||
_parentClass, // parent classname
|
||||
0, // action 0 or self-action 1
|
||||
["ACE_MainActions"], // parent
|
||||
_flagRootAction, // action
|
||||
true // apply to child classes
|
||||
] call ace_interact_menu_fnc_addActionToClass;
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
// add action to remove flag under the root action
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
// create action
|
||||
private _removeFlagAction = [
|
||||
_rootActionID + "_removeflag", // id
|
||||
"Remove Flag", // displayed title
|
||||
"\A3\ui_f\data\map\markers\flags\nato_ca.paa", // flag icon
|
||||
{
|
||||
params ["_target", "_player", "_params"];
|
||||
_target forceFlagTexture "";
|
||||
}, // statement
|
||||
{
|
||||
params ["_target", "_player", "_params"];
|
||||
alive _target && getForcedFlagTexture _target != "";
|
||||
}, // condition
|
||||
nil // child code
|
||||
] call ace_interact_menu_fnc_createAction;
|
||||
|
||||
// add the action to the vehicle
|
||||
// in this class event handler, this#0 will be the vehicle
|
||||
[
|
||||
_parentClass, // parent classname
|
||||
0, // action 0 or self-action 1
|
||||
["ACE_MainActions", _rootActionID], // parent
|
||||
_removeFlagAction, // action
|
||||
true // apply to child classes
|
||||
] call ace_interact_menu_fnc_addActionToClass;
|
||||
|
||||
} forEach _baseClassesToApplyActionsFor;
|
||||
|
||||
[
|
||||
LEVEL_DEBUG,
|
||||
QUOTE(COMPONENT),
|
||||
"initClient complete",
|
||||
[]
|
||||
] call EFUNC(common,log);
|
||||
|
||||
localNamespace setVariable [QGVAR(complete), true];
|
||||
|
||||
nil;
|
||||
@@ -6,21 +6,30 @@
|
||||
Parameter(s):
|
||||
0: STRING - Classname of the vehicle to check
|
||||
*/
|
||||
|
||||
#include "..\script_component.hpp"
|
||||
|
||||
if (!hasInterface) exitWith {};
|
||||
|
||||
params [["_className", "", [""]]];
|
||||
if (_className == "") exitWith {false};
|
||||
|
||||
private _vehicleFlagsCfg = call milsim_vehicleFlags_fnc_getVehicleFlagsCfg;
|
||||
private _vehicleFlagsCfg = call FUNC(getVehicleFlagsCfg);
|
||||
private _excludedVehiclesClass = (_vehicleFlagsCfg >> "ExcludedVehicles");
|
||||
private _exclusionGroups = configProperties [_vehicleFlagsCfg >> "ExcludedVehicles"];
|
||||
|
||||
private _isExcluded = false;
|
||||
{
|
||||
// Check if the class doesn't have a flag proxy
|
||||
// Check if the class is directly excluded
|
||||
private _excludedClasses = _x call BIS_fnc_getCfgDataArray;
|
||||
if (_className in _excludedClasses) exitWith {true};
|
||||
if (_className in _excludedClasses) exitWith {
|
||||
_isExcluded = true;
|
||||
};
|
||||
{
|
||||
if (_className isKindOf _x) exitWith {
|
||||
_isExcluded = true;
|
||||
};
|
||||
} forEach _excludedClasses;
|
||||
if (_isExcluded) exitWith {};
|
||||
} forEach _exclusionGroups;
|
||||
|
||||
false;
|
||||
_isExcluded;
|
||||
|
||||
@@ -6,7 +6,8 @@ onLoadMission = "THIS APPEARS BELOW THE LOADING SCREEN IMAGE";
|
||||
briefingName = "THIS IS THE NAME ON THE #MISSIONS LIST";
|
||||
overviewText = "THIS IS WHERE YOU DESCRIBE THE MISSION IN THE #MISSION LIST";
|
||||
|
||||
missionSeries = "";
|
||||
// The name for the series of missions of your campaign. Used for organizational and search purposes
|
||||
missionSeries = "MY SERIES NAME";
|
||||
|
||||
// activate via #ace-fortify west base 2000
|
||||
|
||||
|
||||
Reference in New Issue
Block a user