Compare commits
1 Commits
4.2.1
...
dab96b8813
| Author | SHA1 | Date | |
|---|---|---|---|
|
dab96b8813
|
@@ -1,37 +0,0 @@
|
||||
name: Bug Report
|
||||
about: File a bug report to help us improve
|
||||
title: ""
|
||||
labels: "Kind/Bug"
|
||||
ref: main
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
Thanks for taking the time to fill out this bug report!
|
||||
- type: textarea
|
||||
id: what-happened
|
||||
attributes:
|
||||
label: Describe the bug!
|
||||
description: What did you see, and what did you expect to happen.
|
||||
render: markdown
|
||||
value: "A bug happened!"
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: reproduce-steps
|
||||
attributes:
|
||||
label: How can we reproduce this?
|
||||
description: "Steps to reproduce the behavior, and attach full log here if needed."
|
||||
value: |
|
||||
1. Go to '...'
|
||||
2. Click on '....'
|
||||
3. Scroll down to '....'
|
||||
4. See error
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: logs
|
||||
attributes:
|
||||
label: Relevant log output?
|
||||
description: Please copy and paste any relevant log output. This will be automatically formatted into code.
|
||||
render: shell
|
||||
@@ -1 +0,0 @@
|
||||
blank_issues_enabled: true
|
||||
@@ -1,34 +0,0 @@
|
||||
name: Feature Request
|
||||
about: Suggest an idea for this project
|
||||
title: ""
|
||||
labels: "Kind/Feature"
|
||||
ref: main
|
||||
body:
|
||||
- type: markdown
|
||||
attributes:
|
||||
value: |
|
||||
Thanks for taking the time to suggest an idea to us!
|
||||
- type: textarea
|
||||
id: feature-description
|
||||
attributes:
|
||||
label: Is your feature request related to a problem?
|
||||
description: A clear and concise description of what the problem is.
|
||||
render: markdown
|
||||
value: " I'm always frustrated when [...]"
|
||||
- type: textarea
|
||||
id: feature-solution
|
||||
attributes:
|
||||
label: Describe the solution you would like.
|
||||
description: "A clear and concise description of what you want to happen. Context and screenshots welcome!"
|
||||
value: |
|
||||
1. Go to '...'
|
||||
2. Look at '....'
|
||||
3. Change to '....'
|
||||
validations:
|
||||
required: true
|
||||
- type: textarea
|
||||
id: feature-references
|
||||
attributes:
|
||||
label: Describe the alternatives you have considered.
|
||||
description: "A clear and concise description of any alternative solutions or features you've considered."
|
||||
render: markdown
|
||||
@@ -1,71 +0,0 @@
|
||||
name: Generate testing snapshot
|
||||
on:
|
||||
push:
|
||||
branches: [develop]
|
||||
|
||||
jobs:
|
||||
Clean:
|
||||
name: Create testing release
|
||||
runs-on: windows
|
||||
steps:
|
||||
- name: Diagnostics
|
||||
run: |
|
||||
echo "repository: ${{ gitea.repository }}"
|
||||
echo "ref: ${{ gitea.ref }}"
|
||||
echo "ref_name: ${{ gitea.ref_name }}"
|
||||
echo "sha: ${{ gitea.sha }}"
|
||||
echo "api_url: ${{ gitea.api_url }}"
|
||||
echo "workflow: ${{ gitea.workflow }}"
|
||||
|
||||
- name: Checkout framework
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
path: MissionFramework
|
||||
|
||||
- name: Clean framework
|
||||
run: |
|
||||
Remove-Item -Recurse MissionFramework\aaFrameworkUtils
|
||||
Remove-Item -Recurse MissionFramework\framework\x
|
||||
Remove-Item -Recurse MissionFramework\.git*
|
||||
|
||||
- name: Backup artifacts from runner
|
||||
uses: actions/upload-artifact@v3
|
||||
with:
|
||||
name: framework-test-snapshot
|
||||
path: MissionFramework
|
||||
|
||||
- name: Create archive
|
||||
run: Compress-Archive MissionFramework framework-test-snapshot.zip
|
||||
|
||||
- name: Delete old testing-release release
|
||||
run: |
|
||||
$headers = @{
|
||||
"accept" = "application/json"
|
||||
"Authorization" = "token ${{ gitea.token }}"
|
||||
}
|
||||
Invoke-WebRequest -Uri "${{ gitea.api_url }}/repos/${{ gitea.repository }}/releases/tags/testing-release" -Method Delete -Headers $headers
|
||||
|
||||
- name: Delete old testing-release tag
|
||||
run: |
|
||||
$headers = @{
|
||||
"accept" = "application/json"
|
||||
"Authorization" = "token ${{ gitea.token }}"
|
||||
}
|
||||
Invoke-WebRequest -Uri "${{ gitea.api_url }}/repos/${{ gitea.repository }}/tags/testing-release" -Method Delete -Headers $headers
|
||||
|
||||
- name: Create new testing-release tag
|
||||
run: |
|
||||
$headers = @{
|
||||
"accept" = "application/json"
|
||||
"Authorization" = "token ${{ gitea.token }}"
|
||||
}
|
||||
Invoke-WebRequest -Uri "${{ gitea.api_url }}/repos/${{ gitea.repository }}/tags" -Method Post -Headers $headers -ContentType "application/json" -Body "{`"message`": `"testing-release`", `"tag_name`": `"testing-release`", `"target`": `"${{ gitea.sha }}`"}"
|
||||
|
||||
- name: Create new testing-release
|
||||
uses: https://gitea.com/actions/gitea-release-action@v1.3.0
|
||||
with:
|
||||
tag_name: 'testing-release'
|
||||
name: 'testing-release'
|
||||
prerelease: true
|
||||
files: |-
|
||||
framework-test-snapshot.zip
|
||||
@@ -1,70 +0,0 @@
|
||||
name: Pack Release files
|
||||
on:
|
||||
release:
|
||||
types: [published]
|
||||
|
||||
jobs:
|
||||
DispatchZGMBuild:
|
||||
name: Dispatch MissionZGM build job
|
||||
runs-on: windows
|
||||
steps:
|
||||
- name: Diagnostics
|
||||
run: |
|
||||
echo "repository: ${{ gitea.repository }}"
|
||||
echo "ref: ${{ gitea.ref }}"
|
||||
echo "ref_name: ${{ gitea.ref_name }}"
|
||||
echo "sha: ${{ gitea.sha }}"
|
||||
echo "api_url: ${{ gitea.api_url }}"
|
||||
echo "workflow: ${{ gitea.workflow }}"
|
||||
|
||||
- name: Publish remote issue
|
||||
run: |
|
||||
$headers = @{
|
||||
"accept" = "application/json"
|
||||
"Authorization" = "token ${{ secrets.RUNNER_ISSUE_TOKEN }}"
|
||||
}
|
||||
$response = Invoke-RestMethod -Uri "${{ gitea.api_url }}/repos/17th-Ranger-Battalion-ORG/MissionsForZGM/issues" -Method Post -Headers $headers -ContentType "application/json" -Body "{`"title`": `"publish-release`"}"
|
||||
|
||||
CreateRelease:
|
||||
name: Publish cleaned template
|
||||
runs-on: windows
|
||||
steps:
|
||||
- name: Diagnostics
|
||||
run: |
|
||||
echo "repository: ${{ gitea.repository }}"
|
||||
echo "ref: ${{ gitea.ref }}"
|
||||
echo "ref_name: ${{ gitea.ref_name }}"
|
||||
echo "sha: ${{ gitea.sha }}"
|
||||
echo "api_url: ${{ gitea.api_url }}"
|
||||
echo "workflow: ${{ gitea.workflow }}"
|
||||
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v3
|
||||
with:
|
||||
fetch-depth: 0
|
||||
ref: 'main'
|
||||
path: release
|
||||
|
||||
- name: Prepare template
|
||||
run: |
|
||||
mkdir MissionTemplate
|
||||
cd MissionTemplate
|
||||
Get-ChildItem ..\release\ | Copy-Item -Recurse
|
||||
Remove-Item -Recurse aaFrameworkUtils
|
||||
Remove-Item -Recurse framework\x
|
||||
Remove-Item -Recurse .git*
|
||||
Get-ChildItem
|
||||
|
||||
- name: Create archive
|
||||
run: |
|
||||
cd release
|
||||
$revision = git rev-parse --short=10 HEAD
|
||||
$tag = git describe --abbrev=0 --tags
|
||||
cd ..
|
||||
Compress-Archive MissionTemplate mission-maker-template-v$tag-$revision.zip
|
||||
|
||||
- name: Add archive to release
|
||||
uses: https://gitea.com/actions/gitea-release-action@v1.3.0
|
||||
with:
|
||||
files: |-
|
||||
mission-maker-template*.zip
|
||||
2
.gitignore
vendored
2
.gitignore
vendored
@@ -2,5 +2,3 @@
|
||||
# Notepad++ backups #
|
||||
*.bak
|
||||
|
||||
|
||||
.vscode/
|
||||
|
||||
121
CHANGELOG.md
121
CHANGELOG.md
@@ -4,118 +4,9 @@ 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).
|
||||
|
||||
## [4.2.1] - 2024-06-23
|
||||
|
||||
### Changed
|
||||
|
||||
- Allowed Equipment Definition typo
|
||||
|
||||
## [4.2.0] - 2024-06-20
|
||||
|
||||
### Added
|
||||
|
||||
- Custom remainsCollector script to replace and supplement the built in arma remainsCollector function
|
||||
- New Resupply Boxes
|
||||
- Ability to spawn spare tires and tracks at the arsenal and via Zeus module
|
||||
|
||||
### Changed
|
||||
|
||||
- Split vehicle flags into colors and shapes for additional options
|
||||
- Battalion Callsigns
|
||||
- Allowed Equipment Definitions
|
||||
- Resupply Box Contents
|
||||
- Fixed incorrect ace carry variable setting
|
||||
|
||||
### Removed
|
||||
|
||||
- SMA mod references
|
||||
- Extraneous server performance calculation broadcast to all clients
|
||||
- Ability for pilots to check re-insertion queue
|
||||
|
||||
## [4.1.2] - 2024-04-25
|
||||
|
||||
### Changed
|
||||
|
||||
- Fix internal versioning
|
||||
- Swap resupply box 5.56 magazines due to mod conflict
|
||||
- Group deletion handler now properly processes empty groups and logs errors
|
||||
|
||||
## [4.1.1] - 2024-04-19
|
||||
|
||||
### Added
|
||||
|
||||
- Function to remove lightning bolt from zeus
|
||||
|
||||
### Changed
|
||||
|
||||
- Alpha Callsign
|
||||
- Allowed Equipment Definitions
|
||||
|
||||
### Removed
|
||||
|
||||
- Custom tire patch code
|
||||
- Extraneous server performance calculation broadcast to all clients
|
||||
|
||||
## [4.1.0] - 2024-03-01
|
||||
|
||||
### Added
|
||||
|
||||
- Added ability for mission maker to use custom leaflets
|
||||
- Added ability for mission maker to define points of interested to be automatically added as MicroDAGR waypoints
|
||||
- Added `missionGroup` variable in `description.ext` for backend grouping of mission
|
||||
- Added custom script support via `CfgFunctions`
|
||||
- Added 5 second invulnerability on ejection of air vehicle when parachute equipped
|
||||
|
||||
### Changed
|
||||
|
||||
- Track unconsciousness time
|
||||
|
||||
## [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
|
||||
- Added additional vehicle flags
|
||||
- Addded Zeus module to fill vehicle ace cargo inventory with tracks/tires
|
||||
|
||||
### 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
|
||||
|
||||
- Custom logging function to allow for external scripts to parse framework messages
|
||||
- Transport request system for respawned players
|
||||
- CBA settings for transport request enable/disable and timeout durations
|
||||
- Added zeus mortar resupply boxes
|
||||
- Added battalion layout definition file for use in FBCB2 system
|
||||
|
||||
### Changed
|
||||
|
||||
- Update fixed wing asset class type
|
||||
- Update contents of zeus resupply boxes
|
||||
- Update player inventory check functions
|
||||
- Update FBCB2 callsign and radio frequency pages
|
||||
|
||||
## [3.1.3] - 2024-01-10
|
||||
|
||||
|
||||
### Changed
|
||||
- Merge triage-status-draw3d to fix draw overlay for medics
|
||||
|
||||
@@ -155,7 +46,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.0] - 2023-05-03
|
||||
## [3.0] - 2023-05-03
|
||||
|
||||
### Added
|
||||
|
||||
@@ -172,7 +63,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.0] - 2023-04-23
|
||||
## [2.2] - 2023-04-23
|
||||
|
||||
### Added
|
||||
|
||||
@@ -186,7 +77,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.0] - 2023-04-12
|
||||
## [2.1] - 2023-04-12
|
||||
|
||||
### Added
|
||||
|
||||
@@ -196,7 +87,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.0] -2023-04-12
|
||||
## [2.0] -2023-04-12
|
||||
|
||||
### Added
|
||||
|
||||
@@ -206,7 +97,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.0] - 2023-03-07
|
||||
## [1.9] - 2023-03-07
|
||||
|
||||
### Added
|
||||
|
||||
|
||||
98
README.md
98
README.md
@@ -1,30 +1,21 @@
|
||||
# Installation Instructions
|
||||
|
||||
The only file which should be pre-existing in your mission folder is `mission.sqm`, once freshly saved from Arma 3's EDEN Editor.
|
||||
Once your mission has been created and saved in the Arma 3 Eden Editor, download the latest mission template zip and copy its contents to the folder where your mission file lives.
|
||||
|
||||
Download the latest mission template zip from the [latest release](https://gitea.iceberg-gaming.com/17th-Ranger-Battalion-ORG/MissionTemplate/releases/latest) and copy its contents to the folder where your mission file lives.
|
||||
The only file which should be pre-existing in your mission folder is `mission.sqm`
|
||||
|
||||
Once copied, the final structure should appear similar to the following:
|
||||
```
|
||||
├── defines/
|
||||
├── framework/
|
||||
```markdown
|
||||
├── functions/
|
||||
├── images/
|
||||
├── scripts/
|
||||
├── sounds/
|
||||
├── textures/
|
||||
├── CHANGELOG.md
|
||||
├── custom_leaflets.hpp
|
||||
├── custom_scripts.hpp
|
||||
├── CHANGELOG.md
|
||||
├── description.ext
|
||||
├── mission.jpg
|
||||
├── mission.sqm
|
||||
├── mission_settings.hpp
|
||||
├── README.md
|
||||
```
|
||||
|
||||
> **Note:** If you're building a mission for use and not actively developing code, you should download the `mission-maker-template` zip file which is a cleaned version of this framework. The `aaFrameworkUtils` and `framework\x` directories in the source tree are for the purposes of development and would only 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.
|
||||
|
||||
# Files
|
||||
@@ -41,98 +32,23 @@ Almost none of the template files should be edited in anyway as they have been f
|
||||
|
||||
The contents of this file must be edited to reflect the naming of your mission for display purposes. All variables are self-documented inside the file to clearly identify the purpose of each piece of required text
|
||||
|
||||
The contents of the lower half of the file contain templated declaration blocks where the mission maker can define custom waypoints to be automatically added to the ACE MicroDAGR, and define/edit the custom built in `#ace-fortify` preset.
|
||||
The contents of the lower half of the file are where the mission maker is able to add/replace/modify the built in `#ace-fortify` preset
|
||||
|
||||
## mission.jpg
|
||||
|
||||
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
|
||||
|
||||
## custom_leaflets.hpp
|
||||
|
||||
This file contains the temeplate block for declaring custom leaflets to be used within missions.
|
||||
|
||||
## custom_scripts.hpp
|
||||
|
||||
This file contains an accessbile `CfgFunctions` declaration block for custom functions which require setup in this manner.
|
||||
|
||||
## 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
|
||||
|
||||
## 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
|
||||
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
|
||||
|
||||
## sounds/
|
||||
|
||||
This directory is for organizational purposes for any custom scripts you wish to use in your mission.
|
||||
> **Note:** Using custom sounds require adding the proper CfgSounds codeblock into mission_settings.hpp
|
||||
|
||||
## textures/
|
||||
|
||||
This directory is for organizational purposes for textures files used by mission scripts.
|
||||
|
||||
|
||||
# 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.
|
||||
|
||||
### `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`.
|
||||
|
||||
c
|
||||
@@ -1,35 +0,0 @@
|
||||
private _supplyCratesCfg = call milsim_resupply_fnc_getSupplyCratesCfg;
|
||||
|
||||
private _properties = [];
|
||||
{
|
||||
_properties append ((configProperties [_x]) apply {configName _x});
|
||||
} forEach (_supplyCratesCfg call BIS_fnc_returnChildren);
|
||||
|
||||
_properties = _properties arrayIntersect _properties;
|
||||
|
||||
private _cfgVals = [];
|
||||
{
|
||||
private _cfg = _x;
|
||||
private _cfgName = configName _x;
|
||||
_vals = createHashMap;
|
||||
|
||||
{
|
||||
_vals set [_x, (_cfg >> _x) call BIS_fnc_getCfgData];
|
||||
} forEach _properties;
|
||||
|
||||
{
|
||||
private _arr = _vals get _x;
|
||||
private _newArr = [];
|
||||
{
|
||||
_x params ["_class", "_count"];
|
||||
private _cfg = _class call CBA_fnc_getItemConfig;
|
||||
private _name = [_cfg] call BIS_fnc_displayName;
|
||||
_newArr pushBack [_class, _name, _count];
|
||||
} forEach _arr;
|
||||
_vals set [_x, _newArr];
|
||||
} forEach ["backpacks", "weapons", "items", "magazines"];
|
||||
|
||||
_cfgVals pushBack [_cfgName, _vals];
|
||||
} forEach (_supplyCratesCfg call BIS_fnc_returnChildren);
|
||||
|
||||
text ([createHashMapFromArray _cfgVals] call CBA_fnc_encodeJSON);
|
||||
File diff suppressed because one or more lines are too long
@@ -1,37 +0,0 @@
|
||||
import sys
|
||||
import json
|
||||
import csv
|
||||
|
||||
|
||||
def parseSupplyCratesJSONToCSV(jsonFile, csvFile):
|
||||
with open(jsonFile, 'r') as file:
|
||||
supply_boxes = json.load(file)
|
||||
|
||||
headers = ["box_config_name", "box_friendly_name", "box_class", "box_tooltip", "category", "item_class", "item_name", "quantity"]
|
||||
all_rows = []
|
||||
for supply_box_name in supply_boxes.keys():
|
||||
supply_box_data = supply_boxes[supply_box_name]
|
||||
|
||||
display_name = supply_box_data['displayName']
|
||||
tooltip = supply_box_data['tooltip']
|
||||
box_class = supply_box_data['boxClass']
|
||||
for category in ["items", "backpacks", "weapons", "magazines"]:
|
||||
for item in supply_box_data[category]:
|
||||
item_class = item[0]
|
||||
item_name = item[1]
|
||||
item_quantity = item[2]
|
||||
row = [supply_box_name, display_name, box_class, tooltip, category, item_class, item_name, item_quantity]
|
||||
all_rows.append(row)
|
||||
|
||||
|
||||
with open(csvFile, 'w', newline='', encoding='utf-8') as file:
|
||||
writer = csv.writer(file)
|
||||
writer.writerow(headers)
|
||||
writer.writerows(all_rows)
|
||||
|
||||
if __name__ == "__main__":
|
||||
jsonFile = sys.argv[1]
|
||||
csvFile = sys.argv[2]
|
||||
parseSupplyCratesJSONToCSV(jsonFile, csvFile)
|
||||
print(f"Done! {csvFile} created.")
|
||||
|
||||
@@ -1,84 +0,0 @@
|
||||
box_config_name,box_friendly_name,box_class,box_tooltip,category,item_class,item_name,quantity
|
||||
CrewServedWeapons,CSW Crate,Box_NATO_Equip_F,A crate containing backpacks that assemble into static weapons.,backpacks,RHS_M2_Gun_Bag,M2 Gun Bag,2
|
||||
CrewServedWeapons,CSW Crate,Box_NATO_Equip_F,A crate containing backpacks that assemble into static weapons.,backpacks,RHS_M2_Tripod_Bag,M2 Tripod Bag,2
|
||||
CrewServedWeapons,CSW Crate,Box_NATO_Equip_F,A crate containing backpacks that assemble into static weapons.,backpacks,RHS_M2_MiniTripod_Bag,M3 Minitripod Bag,2
|
||||
CrewServedWeapons,CSW Crate,Box_NATO_Equip_F,A crate containing backpacks that assemble into static weapons.,backpacks,rhs_Tow_Gun_Bag,TOW Gun Bag,2
|
||||
CrewServedWeapons,CSW Crate,Box_NATO_Equip_F,A crate containing backpacks that assemble into static weapons.,backpacks,rhs_TOW_Tripod_Bag,TOW Tripod Bag,2
|
||||
CrewServedWeapons,CSW Crate,Box_NATO_Equip_F,A crate containing backpacks that assemble into static weapons.,backpacks,UK3CB_Static_M240_Elcan_Gun_Bag,M240 w/Elcan Gun Bag,2
|
||||
CrewServedWeapons,CSW Crate,Box_NATO_Equip_F,A crate containing backpacks that assemble into static weapons.,backpacks,UK3CB_B_Static_M240_Elcan_Tripod_Low_Bag_US_D,M240 w/Elcan Tripod Bag (Low),2
|
||||
CrewServedWeapons,CSW Crate,Box_NATO_Equip_F,A crate containing backpacks that assemble into static weapons.,backpacks,RHS_Mk19_Gun_Bag,Mk19 Gun Bag,2
|
||||
CrewServedWeapons,CSW Crate,Box_NATO_Equip_F,A crate containing backpacks that assemble into static weapons.,backpacks,RHS_Mk19_Tripod_Bag,Mk19 Tripod Bag,2
|
||||
MortarMk6Resupply,Mortar MK6 Supply Crate,Box_NATO_WpsSpecial_F,A crate containing Mk6 mortar resupply (tubes) and tools.,items,ACE_artilleryTable,Artillery Rangetable,2
|
||||
MortarMk6Resupply,Mortar MK6 Supply Crate,Box_NATO_WpsSpecial_F,A crate containing Mk6 mortar resupply (tubes) and tools.,items,ACE_RangeTable_82mm,82mm Rangetable,2
|
||||
MortarMk6Resupply,Mortar MK6 Supply Crate,Box_NATO_WpsSpecial_F,A crate containing Mk6 mortar resupply (tubes) and tools.,items,ACE_microDAGR,MicroDAGR GPS,2
|
||||
MortarMk6Resupply,Mortar MK6 Supply Crate,Box_NATO_WpsSpecial_F,A crate containing Mk6 mortar resupply (tubes) and tools.,items,ACE_MapTools,Map Tools,2
|
||||
MortarMk6Resupply,Mortar MK6 Supply Crate,Box_NATO_WpsSpecial_F,A crate containing Mk6 mortar resupply (tubes) and tools.,backpacks,B_Mortar_01_support_F,Folded Mk6 Mortar Bipod [NATO],3
|
||||
MortarMk6Resupply,Mortar MK6 Supply Crate,Box_NATO_WpsSpecial_F,A crate containing Mk6 mortar resupply (tubes) and tools.,backpacks,B_Mortar_01_weapon_F,Folded Mk6 Mortar Tube [NATO],6
|
||||
MortarMk6Resupply,Mortar MK6 Supply Crate,Box_NATO_WpsSpecial_F,A crate containing Mk6 mortar resupply (tubes) and tools.,backpacks,UK3CB_LSM_B_B_CARRYALL_RADIO_TIG_STRIPE_01,Carryall Backpack RT1523g (Tiger Stripe 01),1
|
||||
MortarMk6Resupply,Mortar MK6 Supply Crate,Box_NATO_WpsSpecial_F,A crate containing Mk6 mortar resupply (tubes) and tools.,weapons,ACE_Vector,Vector 21 Nite,2
|
||||
MortarMk6Resupply,Mortar MK6 Supply Crate,Box_NATO_WpsSpecial_F,A crate containing Mk6 mortar resupply (tubes) and tools.,magazines,acex_intelitems_notepad,Notepad,2
|
||||
AmmoSquad,Squad Ammo,Box_Syndicate_Ammo_F,A crate containing general ammunition and equipment for an infantry squad.,weapons,rhs_weap_M136,M136 (HEAT),4
|
||||
AmmoSquad,Squad Ammo,Box_Syndicate_Ammo_F,A crate containing general ammunition and equipment for an infantry squad.,weapons,rhs_weap_M136_hp,M136 (HP),4
|
||||
AmmoSquad,Squad Ammo,Box_Syndicate_Ammo_F,A crate containing general ammunition and equipment for an infantry squad.,weapons,rhs_weap_m72a7,M72A7,2
|
||||
AmmoSquad,Squad Ammo,Box_Syndicate_Ammo_F,A crate containing general ammunition and equipment for an infantry squad.,magazines,1Rnd_SmokePurple_Grenade_shell,Smoke Round (Purple),12
|
||||
AmmoSquad,Squad Ammo,Box_Syndicate_Ammo_F,A crate containing general ammunition and equipment for an infantry squad.,magazines,1Rnd_SmokeBlue_Grenade_shell,Smoke Round (Blue),24
|
||||
AmmoSquad,Squad Ammo,Box_Syndicate_Ammo_F,A crate containing general ammunition and equipment for an infantry squad.,magazines,1Rnd_SmokeOrange_Grenade_shell,Smoke Round (Orange),12
|
||||
AmmoSquad,Squad Ammo,Box_Syndicate_Ammo_F,A crate containing general ammunition and equipment for an infantry squad.,magazines,rhs_mag_M441_HE,M441 HE Grenade Round,25
|
||||
AmmoSquad,Squad Ammo,Box_Syndicate_Ammo_F,A crate containing general ammunition and equipment for an infantry squad.,magazines,rhs_mag_M433_HEDP,M433 HEDP Grenade Round,15
|
||||
AmmoSquad,Squad Ammo,Box_Syndicate_Ammo_F,A crate containing general ammunition and equipment for an infantry squad.,magazines,ACE_40mm_Flare_ir,M992 Illumination Flare (IR),12
|
||||
AmmoSquad,Squad Ammo,Box_Syndicate_Ammo_F,A crate containing general ammunition and equipment for an infantry squad.,magazines,rhsusf_200Rnd_556x45_mixed_soft_pouch_coyote,200rnd M249 Softpack M855A1 (Mixed),25
|
||||
AmmoSquad,Squad Ammo,Box_Syndicate_Ammo_F,A crate containing general ammunition and equipment for an infantry squad.,magazines,rhsusf_20Rnd_762x51_m993_Mag,20rnd M14 M993 AP,25
|
||||
AmmoSquad,Squad Ammo,Box_Syndicate_Ammo_F,A crate containing general ammunition and equipment for an infantry squad.,magazines,SmokeShell,M83 Smoke Grenade (White),12
|
||||
AmmoSquad,Squad Ammo,Box_Syndicate_Ammo_F,A crate containing general ammunition and equipment for an infantry squad.,magazines,rhs_mag_m67,M67 Fragmentation Grenade,12
|
||||
AmmoSquad,Squad Ammo,Box_Syndicate_Ammo_F,A crate containing general ammunition and equipment for an infantry squad.,magazines,1Rnd_Smoke_Grenade_shell,Smoke Round (White),24
|
||||
AmmoSquad,Squad Ammo,Box_Syndicate_Ammo_F,A crate containing general ammunition and equipment for an infantry squad.,magazines,1Rnd_SmokeRed_Grenade_shell,Smoke Round (Red),24
|
||||
AmmoSquad,Squad Ammo,Box_Syndicate_Ammo_F,A crate containing general ammunition and equipment for an infantry squad.,magazines,1Rnd_SmokeGreen_Grenade_shell,Smoke Round (Green),24
|
||||
AmmoSquad,Squad Ammo,Box_Syndicate_Ammo_F,A crate containing general ammunition and equipment for an infantry squad.,magazines,1Rnd_SmokeYellow_Grenade_shell,Smoke Round (Yellow),12
|
||||
AmmoSquad,Squad Ammo,Box_Syndicate_Ammo_F,A crate containing general ammunition and equipment for an infantry squad.,magazines,Tier1_30Rnd_556x45_M856A1_EMag,30rnd EMAG M856A1 (Tracer),25
|
||||
AmmoSquad,Squad Ammo,Box_Syndicate_Ammo_F,A crate containing general ammunition and equipment for an infantry squad.,magazines,Tier1_30Rnd_556x45_Mk318Mod0_EMag,30rnd EMAG Mk318 Mod 0,75
|
||||
AmmoSquad,Squad Ammo,Box_Syndicate_Ammo_F,A crate containing general ammunition and equipment for an infantry squad.,magazines,ACE_30Rnd_65_Creedmor_mag,6.5 mm Creedmor 30Rnd Sand Mag,25
|
||||
AmmoSquad,Squad Ammo,Box_Syndicate_Ammo_F,A crate containing general ammunition and equipment for an infantry squad.,magazines,SMA_30Rnd_762x35_BLK_EPR,30 Round .300 Blackout EPR,25
|
||||
AmmoSquad,Squad Ammo,Box_Syndicate_Ammo_F,A crate containing general ammunition and equipment for an infantry squad.,magazines,Tier1_30Rnd_762x35_300BLK_SMK_PMAG,30rnd PMAG .300 Custom Combat TAC-TX,25
|
||||
AmmoSquad,Squad Ammo,Box_Syndicate_Ammo_F,A crate containing general ammunition and equipment for an infantry squad.,magazines,SMA_30Rnd_68x43_SPC_FMJ,SPC FMJ 6.8x43 30rnd Mag,25
|
||||
AmmoSquad,Squad Ammo,Box_Syndicate_Ammo_F,A crate containing general ammunition and equipment for an infantry squad.,magazines,SMA_30Rnd_68x43_SPC_FMJ_Tracer,SPC FMJ 6.8x43 30rnd Tracer Mag,25
|
||||
AmmoSquad,Squad Ammo,Box_Syndicate_Ammo_F,A crate containing general ammunition and equipment for an infantry squad.,magazines,SMA_20Rnd_762x51mm_M80A1_EPR,M80A1 EPR 762x51mm 20rnd Mag,25
|
||||
AmmoSquad,Squad Ammo,Box_Syndicate_Ammo_F,A crate containing general ammunition and equipment for an infantry squad.,magazines,SMA_20Rnd_762x51mm_M80A1_EPR_Tracer,M80A1 EPR 762x51mm 20rnd Tracer Mag,25
|
||||
AmmoSquad,Squad Ammo,Box_Syndicate_Ammo_F,A crate containing general ammunition and equipment for an infantry squad.,magazines,SMA_20Rnd_762x51mm_Mk316_Mod_0_Special_Long_Range,Mk316 Mod 0 762x51mm SBLR 20rnd Mag,25
|
||||
AmmoSquad,Squad Ammo,Box_Syndicate_Ammo_F,A crate containing general ammunition and equipment for an infantry squad.,magazines,SMA_20Rnd_762x51mm_Mk316_Mod_0_Special_Long_Range_Tracer,Mk316 Mod 0 762x51mm SBLR 20rnd Tracer Mag,25
|
||||
AmmoSquad,Squad Ammo,Box_Syndicate_Ammo_F,A crate containing general ammunition and equipment for an infantry squad.,magazines,Tier1_250Rnd_762x51_Belt_M993_AP,250rnd Ammo Belt M993 AP,15
|
||||
AmmoSquad,Squad Ammo,Box_Syndicate_Ammo_F,A crate containing general ammunition and equipment for an infantry squad.,magazines,ACE_20Rnd_762x51_Mag_Tracer,7.62 mm 20Rnd Mag (Tracer),25
|
||||
AmmoSquad,Squad Ammo,Box_Syndicate_Ammo_F,A crate containing general ammunition and equipment for an infantry squad.,magazines,ACE_20Rnd_762x51_M993_AP_Mag,7.62 mm 20Rnd Mag (M993 AP),25
|
||||
AmmoSquad,Squad Ammo,Box_Syndicate_Ammo_F,A crate containing general ammunition and equipment for an infantry squad.,magazines,rhsusf_20Rnd_762x51_SR25_m993_Mag,20rnd SR-25 M993 AP,25
|
||||
AmmoSquad,Squad Ammo,Box_Syndicate_Ammo_F,A crate containing general ammunition and equipment for an infantry squad.,magazines,Tier1_20Rnd_762x51_M993_SR25_Mag,20rnd SR-25/M110 M993 AP,25
|
||||
AmmoSquad,Squad Ammo,Box_Syndicate_Ammo_F,A crate containing general ammunition and equipment for an infantry squad.,magazines,Tier1_20Rnd_65x48_Creedmoor_SR25_Mag,20rnd SR-25/M110 6.5mm Creedmoor,25
|
||||
AmmoSquad,Squad Ammo,Box_Syndicate_Ammo_F,A crate containing general ammunition and equipment for an infantry squad.,magazines,rhssaf_30rnd_556x45_EPR_G36,30rnd G36 M855A1,25
|
||||
AmmoSquad,Squad Ammo,Box_Syndicate_Ammo_F,A crate containing general ammunition and equipment for an infantry squad.,magazines,DemoCharge_Remote_Mag,M112 Demolition Block,16
|
||||
AmmoHeavy,Heavy Ammo,Box_NATO_Wps_F,"A crate containing mixed ammo for rifles, ARs, MAT, and HAT.",magazines,MRAWS_HEAT_F,MAAWS HEAT 75 Round,35
|
||||
AmmoHeavy,Heavy Ammo,Box_NATO_Wps_F,"A crate containing mixed ammo for rifles, ARs, MAT, and HAT.",magazines,MRAWS_HE_F,MAAWS HE 44 Round,15
|
||||
AmmoHeavy,Heavy Ammo,Box_NATO_Wps_F,"A crate containing mixed ammo for rifles, ARs, MAT, and HAT.",magazines,Tier1_250Rnd_762x51_Belt_M993_AP,250rnd Ammo Belt M993 AP,50
|
||||
AmmoHeavy,Heavy Ammo,Box_NATO_Wps_F,"A crate containing mixed ammo for rifles, ARs, MAT, and HAT.",magazines,Tier1_30Rnd_556x45_M856A1_EMag,30rnd EMAG M856A1 (Tracer),25
|
||||
AmmoHeavy,Heavy Ammo,Box_NATO_Wps_F,"A crate containing mixed ammo for rifles, ARs, MAT, and HAT.",magazines,Tier1_30Rnd_556x45_Mk318Mod0_EMag,30rnd EMAG Mk318 Mod 0,50
|
||||
AmmoHeavy,Heavy Ammo,Box_NATO_Wps_F,"A crate containing mixed ammo for rifles, ARs, MAT, and HAT.",magazines,Titan_AA,Titan AA Missile,10
|
||||
AmmoHeavy,Heavy Ammo,Box_NATO_Wps_F,"A crate containing mixed ammo for rifles, ARs, MAT, and HAT.",magazines,Titan_AT,Titan AT Missile,10
|
||||
AmmoHeavy,Heavy Ammo,Box_NATO_Wps_F,"A crate containing mixed ammo for rifles, ARs, MAT, and HAT.",magazines,200Rnd_65x39_cased_Box_Tracer_Red,6.5mm 200Rnd Belt Tracer (Red),50
|
||||
Launchers,Launcher Crate,Box_NATO_WpsLaunch_F,A crate containing missile launchers and ammunition.,weapons,launch_B_Titan_short_F,Titan MPRL Compact (Sand),2
|
||||
Launchers,Launcher Crate,Box_NATO_WpsLaunch_F,A crate containing missile launchers and ammunition.,weapons,launch_NLAW_F,NLAW,2
|
||||
Launchers,Launcher Crate,Box_NATO_WpsLaunch_F,A crate containing missile launchers and ammunition.,weapons,rhs_weap_fim92,FIM-92F,2
|
||||
Launchers,Launcher Crate,Box_NATO_WpsLaunch_F,A crate containing missile launchers and ammunition.,magazines,Titan_AA,Titan AA Missile,6
|
||||
Launchers,Launcher Crate,Box_NATO_WpsLaunch_F,A crate containing missile launchers and ammunition.,magazines,Titan_AT,Titan AT Missile,6
|
||||
Mortar60mmCommandoResupply,Mortar 60mm Commando Supply Crate,Box_NATO_WpsSpecial_F,A crate containing COMMANDO 60mm mortar shells and some STANAGs.,magazines,twc_2inch_he_1rnd,60mm COMMANDO 1Rnd HE,70
|
||||
Mortar60mmCommandoResupply,Mortar 60mm Commando Supply Crate,Box_NATO_WpsSpecial_F,A crate containing COMMANDO 60mm mortar shells and some STANAGs.,magazines,twc_2inch_smoke_1rnd,60mm COMMANDO 1Rnd Smoke,15
|
||||
Mortar60mmCommandoResupply,Mortar 60mm Commando Supply Crate,Box_NATO_WpsSpecial_F,A crate containing COMMANDO 60mm mortar shells and some STANAGs.,magazines,twc_2inch_illum_1rnd,60mm COMMANDO 1Rnd Illum,15
|
||||
Mortar60mmCommandoResupply,Mortar 60mm Commando Supply Crate,Box_NATO_WpsSpecial_F,A crate containing COMMANDO 60mm mortar shells and some STANAGs.,magazines,Tier1_30Rnd_556x45_Mk318Mod0_EMag,30rnd EMAG Mk318 Mod 0,20
|
||||
MedicalSupplies,Medical Crate,ACE_medicalSupplyCrate_advanced,A crate containing medical supplies.,items,ACE_packingBandage,Bandage (Packing),100
|
||||
MedicalSupplies,Medical Crate,ACE_medicalSupplyCrate_advanced,A crate containing medical supplies.,items,ACE_elasticBandage,Bandage (Elastic),100
|
||||
MedicalSupplies,Medical Crate,ACE_medicalSupplyCrate_advanced,A crate containing medical supplies.,items,ACE_tourniquet,Tourniquet (CAT),48
|
||||
MedicalSupplies,Medical Crate,ACE_medicalSupplyCrate_advanced,A crate containing medical supplies.,items,ACE_splint,Splint,48
|
||||
MedicalSupplies,Medical Crate,ACE_medicalSupplyCrate_advanced,A crate containing medical supplies.,items,ACE_morphine,Morphine Autoinjector,50
|
||||
MedicalSupplies,Medical Crate,ACE_medicalSupplyCrate_advanced,A crate containing medical supplies.,items,ACE_epinephrine,Epinephrine Autoinjector,50
|
||||
MedicalSupplies,Medical Crate,ACE_medicalSupplyCrate_advanced,A crate containing medical supplies.,items,ACE_bloodIV,Blood IV (1000ml),75
|
||||
MedicalSupplies,Medical Crate,ACE_medicalSupplyCrate_advanced,A crate containing medical supplies.,items,ACE_bloodIV_500,Blood IV (500ml),50
|
||||
MedicalSupplies,Medical Crate,ACE_medicalSupplyCrate_advanced,A crate containing medical supplies.,items,ACE_bloodIV_250,Blood IV (250ml),25
|
||||
MedicalSupplies,Medical Crate,ACE_medicalSupplyCrate_advanced,A crate containing medical supplies.,items,ACE_quikclot,Bandage (QuikClot),75
|
||||
MedicalSupplies,Medical Crate,ACE_medicalSupplyCrate_advanced,A crate containing medical supplies.,items,ACE_personalAidKit,Personal Aid Kit,5
|
||||
MedicalSupplies,Medical Crate,ACE_medicalSupplyCrate_advanced,A crate containing medical supplies.,items,ACE_surgicalKit,Surgical Kit,5
|
||||
|
@@ -1,39 +0,0 @@
|
||||
// This contains custom definitions for leaflets. It is not required to set this up, but you're welcome to if you want to use them.
|
||||
|
||||
// To use this, configure one or more of the below. Then use the pylon editor of a drone in EDEN to add the appropriate magazine type (like 1Rnd_Leaflets_Custom_01_F) to the drone. Then, when the drone is flying, do `drone1 fire "1Rnd_Leaflets_Custom_01_F";` to drop the leaflets. The leaflet will then be shown in the world, and can be picked up by players to read the text and see the image.
|
||||
|
||||
class Custom_01 // configuration for 1Rnd_Leaflets_Custom_01_F
|
||||
{
|
||||
text = "Leaflet text"; // text shown when previewing the leaflet full-screen. Ideally should be localized, so even player who cannot read the image can get the information
|
||||
texture = "images\leaflets\leaflet_custom_01.paa"; // leaflet texture shown when previewing the leaflet full-screen
|
||||
};
|
||||
|
||||
class Custom_02 // configuration for 1Rnd_Leaflets_Custom_02_F
|
||||
{
|
||||
text = "Leaflet text"; // text shown when previewing the leaflet full-screen. Ideally should be localized, so even player who cannot read the image can get the information
|
||||
texture = "images\leaflets\leaflet_custom_02.paa"; // leaflet texture shown when previewing the leaflet full-screen
|
||||
};
|
||||
|
||||
class Custom_03 // configuration for 1Rnd_Leaflets_Custom_03_F
|
||||
{
|
||||
text = "Leaflet text"; // text shown when previewing the leaflet full-screen. Ideally should be localized, so even player who cannot read the image can get the information
|
||||
texture = "images\leaflets\leaflet_custom_03.paa"; // leaflet texture shown when previewing the leaflet full-screen
|
||||
};
|
||||
|
||||
class Custom_04 // configuration for 1Rnd_Leaflets_Custom_04_F
|
||||
{
|
||||
text = "Leaflet text"; // text shown when previewing the leaflet full-screen. Ideally should be localized, so even player who cannot read the image can get the information
|
||||
texture = "images\leaflets\leaflet_custom_04.paa"; // leaflet texture shown when previewing the leaflet full-screen
|
||||
};
|
||||
|
||||
class Custom_05 // configuration for 1Rnd_Leaflets_Custom_05_F
|
||||
{
|
||||
text = "Leaflet text"; // text shown when previewing the leaflet full-screen. Ideally should be localized, so even player who cannot read the image can get the information
|
||||
texture = "images\leaflets\leaflet_custom_05.paa"; // leaflet texture shown when previewing the leaflet full-screen
|
||||
};
|
||||
|
||||
class Custom_06 // configuration for 1Rnd_Leaflets_Custom_06_F
|
||||
{
|
||||
text = "Leaflet text"; // text shown when previewing the leaflet full-screen. Ideally should be localized, so even player who cannot read the image can get the information
|
||||
texture = "images\leaflets\leaflet_custom_06.paa"; // leaflet texture shown when previewing the leaflet full-screen
|
||||
};
|
||||
@@ -1,11 +0,0 @@
|
||||
// This file's contents will be included in the mission's CfgFunctions section, and serves to give you a place to define custom functions from files you've placed in /scripts.
|
||||
|
||||
class milsim_scripts {
|
||||
class functions {
|
||||
file = "scripts";
|
||||
// Add your custom functions here, like so:
|
||||
// class init {postInit = 1;}; // refers to scripts/fn_init.sqf. postInit=1 means it will be run on each machine when they're done loading the mission.
|
||||
// class customFunction1 {}; // refers to the file scripts/fn_customFunction1.sqf, and is called as milsim_scripts_fnc_customFunction1
|
||||
// class customFunction2 {}; // refers to the file scripts/fn_customFunction2.sqf, and is called as milsim_scripts_fnc_customFunction2
|
||||
};
|
||||
};
|
||||
@@ -1,8 +0,0 @@
|
||||
|
||||
// EXAMPLE
|
||||
// class uncon_alarm
|
||||
// {
|
||||
// name = "uncon_alarm";
|
||||
// sound[] = {"AJ_CBRN_V2\sounds\AJ_warning_1.ogg", 0.9, 1, 5}; //directory, volume, pitch, range
|
||||
// titles[]={};
|
||||
// };
|
||||
@@ -1,74 +0,0 @@
|
||||
// Lists approved fixed-wing and rotary vehicle types that mission makers can use in their missions.
|
||||
|
||||
class ApprovedAssets {
|
||||
// APC
|
||||
class rhsusf_stryker_m1126_m2_d {callsign = "Katana"; category = "APC";};
|
||||
class rhsusf_stryker_m1126_mk19_d {callsign = "Katana"; category = "APC";};
|
||||
class rhsusf_stryker_m1127_m2_wd {callsign = "Katana"; category = "APC";};
|
||||
class rhsusf_stryker_m1132_m2_wd {callsign = "Katana"; category = "APC";};
|
||||
class rhsusf_stryker_m1134_wd {callsign = "Katana"; category = "APC";};
|
||||
class B_APC_Wheeled_01_cannon_F {callsign = "Rapier"; category = "APC";};
|
||||
class B_APC_Tracked_01_CRV_F {callsign = "DuctTape"; category = "APC";};
|
||||
// Rotary
|
||||
class TF373_SOAR_MH47G_No_Rear_Guns {callsign = "Achilles"; category = "Rotary";};
|
||||
class TF373_SOAR_MH47G_No_Rear_Guns_EasyActions {callsign = "Achilles"; category = "Rotary";};
|
||||
class TF373_SOAR_MH47G {callsign = "Achilles"; category = "Rotary";};
|
||||
class TF373_SOAR_MH47G_EasyActions {callsign = "Achilles"; category = "Rotary";};
|
||||
class RHS_CH_47F_10 {callsign = "Achilles"; category = "Rotary";};
|
||||
class RHS_MELB_AH6M {callsign = "Artemis"; category = "Rotary";};
|
||||
class RHS_MELB_MH6M {callsign = "Apollo"; category = "Rotary";};
|
||||
class RHS_MELB_H6M {callsign = "Icarus"; category = "Rotary";};
|
||||
class RHS_UH60M {callsign = "Griffin"; category = "Rotary";};
|
||||
class RHS_UH60M2 {callsign = "Griffin"; category = "Rotary";};
|
||||
class RHS_UH60M_MEV {callsign = "Dustoff"; category = "Rotary";};
|
||||
class ej_MH60MDAP {callsign = "Hades"; category = "Rotary";};
|
||||
class ej_MH60MDAP16H {callsign = "Hades"; category = "Rotary";};
|
||||
class ej_MH60MDAP8H {callsign = "Hades"; category = "Rotary";};
|
||||
class ej_MH60MDAP4 {callsign = "Hades"; category = "Rotary";};
|
||||
class RHS_AH64DGrey {callsign = "Orion"; category = "Rotary";};
|
||||
// Air
|
||||
// Truck
|
||||
class rhsusf_M1078A1R_SOV_M2_D_fmtv_socom {callsign = "DuctTape"; category = "Truck";};
|
||||
class rhsusf_M1084A1R_SOV_M2_D_fmtv_socom {callsign = "DuctTape"; category = "Truck";};
|
||||
class rhsusf_M1078A1P2_B_WD_CP_fmtv_usarmy {callsign = ""; category = "Truck";};
|
||||
// Boats
|
||||
class rhsusf_mkvsoc {callsign = "Poseidon"; category = "Boats";};
|
||||
class B_Boat_Armed_01_minigun_F {callsign = "Neptune"; category = "Boats";};
|
||||
// MRAP
|
||||
class rhsusf_M1238A1_M2_socom_d {callsign = "Tanto"; category = "MRAP";};
|
||||
class rhsusf_M1238A1_Mk19_socom_d {callsign = "Tanto"; category = "MRAP";};
|
||||
class rhsusf_M1239_M2_socom_d {callsign = "DuctTape"; category = "MRAP";};
|
||||
class rhsusf_M1239_MK19_socom_d {callsign = "DuctTape"; category = "MRAP";};
|
||||
class rhsusf_m1245_m2crows_socom_d {callsign = "Dagger"; category = "MRAP";};
|
||||
class rhsusf_m1245_mk19crows_socom_d {callsign = "Dagger"; category = "MRAP";};
|
||||
class rhsusf_M1239_M2_Deploy_socom_d {callsign = "DuctTape"; category = "MRAP";};
|
||||
// TiltRotor
|
||||
class B_T_VTOL_01_infantry_F {callsign = "Pegasus"; category = "TiltRotor";};
|
||||
class B_T_VTOL_01_armed_F {callsign = "Chimera"; category = "TiltRotor";};
|
||||
// Water
|
||||
// Ground Vehicle
|
||||
// Cars
|
||||
class rhsusf_m1165a1_gmv_m134d_m240_socom_d {callsign = "Dagger"; category = "Cars";};
|
||||
class rhsusf_m1165a1_gmv_m2_m240_socom_d {callsign = "Dagger"; category = "Cars";};
|
||||
class rhsusf_m1165a1_gmv_mk19_m240_socom_d {callsign = "Dagger"; category = "Cars";};
|
||||
class rhsusf_mrzr4_d {callsign = ""; category = "Cars";};
|
||||
class UK3CB_B_M1030_NATO {callsign = ""; category = "Cars";};
|
||||
class B_T_LSV_01_AT_F {callsign = ""; category = "Cars";};
|
||||
class B_T_LSV_01_armed_F {callsign = ""; category = "Cars";};
|
||||
class C_Quadbike_01_F {callsign = ""; category = "Cars";};
|
||||
// Fixed-Wing
|
||||
class B_Plane_CAS_01_dynamicLoadout_F {callsign = "Ares"; category = "Fixed-Wing";};
|
||||
class RHS_A10 {callsign = "Ares"; category = "Fixed-Wing";};
|
||||
class USAF_AC130U {callsign = "Odin"; category = "Fixed-Wing";};
|
||||
class USAF_C130J {callsign = "Hercules"; category = "Fixed-Wing";};
|
||||
class B_Plane_Fighter_01_F {callsign = "Xerxes"; category = "Fixed-Wing";};
|
||||
// Artillery
|
||||
class rhsusf_M142_usarmy_WD {callsign = "Halberd"; category = "Artillery";};
|
||||
class UK3CB_B_M270_MLRS_HE_DES {callsign = "Halberd"; category = "Artillery";};
|
||||
class rhsusf_m109d_usarmy {callsign = "Glaive"; category = "Artillery";};
|
||||
class RHS_M119_D {callsign = "Mailman"; category = "Artillery";};
|
||||
class B_Mortar_01_F {callsign = "Hammer"; category = "Artillery";};
|
||||
// Armor
|
||||
class B_AFV_Wheeled_01_cannon_F {callsign = "Gladius"; category = "Armor";};
|
||||
class B_AFV_Wheeled_01_up_cannon_F {callsign = "Gladius"; category = "Armor";};
|
||||
};
|
||||
@@ -1,44 +0,0 @@
|
||||
class SignalColors {
|
||||
class White {
|
||||
name = "White";
|
||||
hexCode = "#FFFFFF";
|
||||
usage = "Concealment, Light";
|
||||
itemExamples[] = {"SmokeShell", "1Rnd_Smoke_Grenade_shell", "ACE_Chemlight_White"};
|
||||
};
|
||||
class Green {
|
||||
name = "Green";
|
||||
hexCode = "#00FF00";
|
||||
usage = "Friendly Forces";
|
||||
itemExamples[] = {"SmokeShellGreen", "1Rnd_SmokeGreen_Grenade_shell", "Chemlight_green"};
|
||||
};
|
||||
class Blue {
|
||||
name = "Blue";
|
||||
hexCode = "#0000FF";
|
||||
usage = "LZ Marking";
|
||||
itemExamples[] = {"SmokeShellBlue", "1Rnd_SmokeBlue_Grenade_shell", "Chemlight_blue"};
|
||||
};
|
||||
class Red {
|
||||
name = "Red";
|
||||
hexCode = "#FF0000";
|
||||
usage = "Enemy Location";
|
||||
itemExamples[] = {"SmokeShellRed", "1Rnd_SmokeRed_Grenade_shell", "Chemlight_red"};
|
||||
};
|
||||
class Orange {
|
||||
name = "Orange";
|
||||
hexCode = "#FFA500";
|
||||
usage = "Resupply Marker";
|
||||
itemExamples[] = {"SmokeShellOrange", "1Rnd_SmokeOrange_Grenade_shell", "ACE_Chemlight_Orange"};
|
||||
};
|
||||
class Yellow {
|
||||
name = "Yellow";
|
||||
hexCode = "#FFFF00";
|
||||
usage = "Medical Emergency";
|
||||
itemExamples[] = {"SmokeShellYellow", "1Rnd_SmokeYellow_Grenade_shell", "Chemlight_yellow"};
|
||||
};
|
||||
class Purple {
|
||||
name = "Purple";
|
||||
hexCode = "#800080";
|
||||
usage = "Broken Arrow - 100m radius";
|
||||
itemExamples[] = {"SmokeShellPurple", "1Rnd_SmokePurple_Grenade_shell"};
|
||||
};
|
||||
};
|
||||
@@ -1,237 +0,0 @@
|
||||
class SupplyCrates {
|
||||
class AmmoSquad {
|
||||
boxClass = "Box_Syndicate_Ammo_F";
|
||||
displayName = "Squad Ammo Crate";
|
||||
tooltip = "A crate containing general ammunition and equipment for an infantry squad.";
|
||||
icon = "\A3\ui_f\data\map\vehicleicons\iconCrateAmmo_ca.paa";
|
||||
|
||||
backpacks[] = {};
|
||||
weapons[] = {
|
||||
{"rhs_weap_M136",4},
|
||||
{"rhs_weap_M136_hp",4},
|
||||
{"rhs_weap_m72a7",2}
|
||||
};
|
||||
magazines[] = {
|
||||
{"1Rnd_SmokePurple_Grenade_shell",12},
|
||||
{"1Rnd_SmokeBlue_Grenade_shell",24},
|
||||
{"1Rnd_SmokeOrange_Grenade_shell",12},
|
||||
{"rhs_mag_M441_HE",25},
|
||||
{"rhs_mag_M433_HEDP",15},
|
||||
{"ACE_40mm_Flare_ir",12},
|
||||
{"rhsusf_200Rnd_556x45_mixed_soft_pouch_coyote",25},
|
||||
{"rhsusf_20Rnd_762x51_m993_Mag",25},
|
||||
{"SmokeShell",24},
|
||||
{"ACE_M84",24},
|
||||
{"rhs_mag_m67",24},
|
||||
{"1Rnd_Smoke_Grenade_shell",24},
|
||||
{"1Rnd_SmokeRed_Grenade_shell",24},
|
||||
{"1Rnd_SmokeGreen_Grenade_shell",24},
|
||||
{"1Rnd_SmokeYellow_Grenade_shell",12},
|
||||
{"rhs_mag_30Rnd_556x45_M855A1_Stanag",25},
|
||||
{"ACE_30Rnd_556x45_Stanag_M995_AP_mag",75},
|
||||
{"Tier1_250Rnd_762x51_Belt_M993_AP",15},
|
||||
{"ACE_20Rnd_762x51_Mag_Tracer",25},
|
||||
{"ACE_20Rnd_762x51_M993_AP_Mag",25},
|
||||
{"rhsusf_20Rnd_762x51_SR25_m993_Mag",25},
|
||||
{"Tier1_20Rnd_762x51_M993_SR25_Mag",25},
|
||||
{"KAR_20Rnd_Fury_blk",25},
|
||||
{"rhsusf_m112_mag",25},
|
||||
};
|
||||
items[] = {};
|
||||
};
|
||||
|
||||
class AmmoHeavy {
|
||||
boxClass = "Box_NATO_Wps_F";
|
||||
displayName = "Heavy Ammo Crate";
|
||||
tooltip = "A crate containing mixed ammo for rifles, ARs, MAT, and HAT.";
|
||||
icon = "\A3\ui_f\data\map\vehicleicons\iconCrateWpns_ca.paa";
|
||||
|
||||
backpacks[] = {};
|
||||
weapons[] = {
|
||||
{"launch_MRAWS_green_F",2}
|
||||
};
|
||||
magazines[] = {
|
||||
{"MRAWS_HEAT_F",35},
|
||||
{"MRAWS_HE_F",15},
|
||||
{"Tier1_250Rnd_762x51_Belt_M993_AP",50},
|
||||
{"rhs_mag_30Rnd_556x45_M855A1_Stanag",25},
|
||||
{"ACE_30Rnd_556x45_Stanag_M995_AP_mag",50},
|
||||
{"Titan_AA",10},
|
||||
{"Titan_AT",10},
|
||||
{"200Rnd_65x39_cased_Box_Tracer_Red",50}
|
||||
};
|
||||
items[] = {};
|
||||
};
|
||||
|
||||
class MedicalSupplies {
|
||||
boxClass = "ACE_medicalSupplyCrate_advanced";
|
||||
displayName = "Medical Crate";
|
||||
tooltip = "A crate containing medical supplies.";
|
||||
icon = "\A3\ui_f\data\map\vehicleicons\pictureHeal_ca.paa";
|
||||
|
||||
backpacks[] = {};
|
||||
weapons[] = {};
|
||||
magazines[] = {};
|
||||
items[] = {
|
||||
{"ACE_packingBandage",100},
|
||||
{"ACE_elasticBandage",100},
|
||||
{"ACE_tourniquet",48},
|
||||
{"ACE_splint",48},
|
||||
{"ACE_morphine",50},
|
||||
{"ACE_epinephrine",50},
|
||||
{"ACE_painkillers",20},
|
||||
{"ACE_bloodIV",75},
|
||||
{"ACE_bloodIV_500",50},
|
||||
{"ACE_bloodIV_250",25},
|
||||
{"ACE_quikclot",75},
|
||||
{"ACE_personalAidKit", 5},
|
||||
{"ACE_surgicalKit", 5}
|
||||
};
|
||||
};
|
||||
|
||||
class Launchers {
|
||||
boxClass = "Box_NATO_WpsLaunch_F";
|
||||
displayName = "Launcher Crate";
|
||||
tooltip = "A crate containing missile launchers and ammunition.";
|
||||
icon = "\A3\ui_f\data\map\vehicleicons\iconCrateLong_ca.paa";
|
||||
|
||||
backpacks[] = {};
|
||||
weapons[] = {
|
||||
{"launch_B_Titan_short_F",2},
|
||||
{"launch_NLAW_F",2},
|
||||
{"rhs_weap_fim92",2}
|
||||
};
|
||||
magazines[] = {
|
||||
{"Titan_AA",6},
|
||||
{"Titan_AT",6}
|
||||
};
|
||||
items[] = {};
|
||||
};
|
||||
|
||||
class CrewServedWeapons {
|
||||
boxClass = "Box_NATO_Equip_F";
|
||||
displayName = "CSW Crate";
|
||||
tooltip = "A crate containing backpacks that assemble into static weapons.";
|
||||
icon = "\A3\ui_f\data\igui\cfg\simpleTasks\types\defend_ca.paa";
|
||||
|
||||
backpacks[] = {
|
||||
{"RHS_M2_Gun_Bag",2},
|
||||
{"RHS_M2_Tripod_Bag",2},
|
||||
{"RHS_M2_MiniTripod_Bag",2},
|
||||
{"rhs_Tow_Gun_Bag",2},
|
||||
{"rhs_TOW_Tripod_Bag",2},
|
||||
{"UK3CB_Static_M240_Elcan_Gun_Bag",2},
|
||||
{"UK3CB_B_Static_M240_Elcan_Tripod_Low_Bag_US_D",2},
|
||||
{"RHS_Mk19_Gun_Bag",2},
|
||||
{"RHS_Mk19_Tripod_Bag",2}
|
||||
};
|
||||
weapons[] = {};
|
||||
magazines[] = {};
|
||||
items[] = {};
|
||||
};
|
||||
|
||||
class SquadUtility {
|
||||
boxClass = "Box_Syndicate_Ammo_F";
|
||||
displayName = "Squad Utility Supply Crate";
|
||||
tooltip = "A crate containing Flairs, Smokes, Breaching Charges";
|
||||
icon = "\A3\ui_f\data\map\vehicleicons\iconCrateAmmo_ca.paa";
|
||||
|
||||
backpacks[] = {};
|
||||
weapons[] = {};
|
||||
magazines[] = {};
|
||||
items[] = {
|
||||
{"ACE_Chemlight_HiYellow",20},
|
||||
{"ACE_Chemlight_HiBlue",20},
|
||||
{"ACE_Chemlight_HiGreen",20},
|
||||
{"ACE_Chemlight_HiRed",20},
|
||||
{"ACE_Chemlight_UltraHiOrange",20},
|
||||
{"ACE_HandFlare_Yellow",20},
|
||||
{"ACE_HandFlare_White",20},
|
||||
{"ACE_HandFlare_Red",20},
|
||||
{"ACE_HandFlare_Green",20},
|
||||
{"ACE_Chemlight_IR",20},
|
||||
{"ACE_IR_Strobe_Item",20},
|
||||
{"SmokeShellYellow",20},
|
||||
{"SmokeShellBlue",20},
|
||||
{"SmokeShellPurple",20},
|
||||
{"SmokeShellOrange",20},
|
||||
{"SmokeShellGreen",20},
|
||||
{"SmokeShellRed",20},
|
||||
{"tsp_popperCharge_auto_mag",10},
|
||||
{"tsp_frameCharge_mag",20},
|
||||
{"tsp_stickCharge_auto_mag",10},
|
||||
{"ACE_CableTie",25},
|
||||
{"DemoCharge_Remote_Mag",15},
|
||||
{"TFAR_anprc152",3},
|
||||
};
|
||||
};
|
||||
|
||||
class MortarMk6Resupply {
|
||||
boxClass = "Box_NATO_WpsSpecial_F";
|
||||
displayName = "Mortar MK6 Supply Crate";
|
||||
tooltip = "A crate containing Mk6 mortar resupply (tubes) and tools.";
|
||||
icon = "\A3\ui_f\data\map\vehicleicons\iconStaticMortar_ca.paa";
|
||||
|
||||
backpacks[] = {
|
||||
{"B_Mortar_01_support_F",3},
|
||||
{"B_Mortar_01_weapon_F",6},
|
||||
{"UK3CB_LSM_B_B_CARRYALL_RADIO_TIG_STRIPE_01",1}
|
||||
};
|
||||
weapons[] = {
|
||||
{"ACE_Vector",2}
|
||||
};
|
||||
magazines[] = {
|
||||
{"acex_intelitems_notepad",2}
|
||||
};
|
||||
items[] = {
|
||||
{"ACE_artilleryTable",2},
|
||||
{"ACE_RangeTable_82mm",2},
|
||||
{"ACE_microDAGR",2},
|
||||
{"ACE_MapTools",2}
|
||||
};
|
||||
};
|
||||
|
||||
class Mortar60mmCommandoResupply {
|
||||
boxClass = "Box_NATO_WpsSpecial_F";
|
||||
displayName = "Mortar 60mm Commando Supply Crate";
|
||||
tooltip = "A crate containing COMMANDO 60mm mortar shells and some STANAGs.";
|
||||
icon = "\A3\ui_f\data\igui\cfg\simpleTasks\types\scout_ca.paa";
|
||||
|
||||
backpacks[] = {};
|
||||
weapons[] = {
|
||||
{"rhs_weap_M136",2},
|
||||
{"twc_2inch_bag",3}
|
||||
};
|
||||
magazines[] = {
|
||||
{"twc_2inch_he_1rnd",70},
|
||||
{"twc_2inch_smoke_1rnd",15},
|
||||
{"twc_2inch_illum_1rnd",15},
|
||||
{"ACE_30Rnd_556x45_Stanag_M995_AP_mag",20}
|
||||
};
|
||||
items[] = {};
|
||||
};
|
||||
|
||||
class ResupplyTire {
|
||||
boxClass = "ACE_Wheel";
|
||||
displayName = "Vehicle Tire";
|
||||
tooltip = "A single tire for replacement";
|
||||
icon = "A3\ui_f\data\igui\cfg\simpletasks\types\repair_ca.paa";
|
||||
|
||||
backpacks[] = {};
|
||||
weapons[] = {};
|
||||
magazines[] = {};
|
||||
items[] = {};
|
||||
};
|
||||
|
||||
class ResupplyTrack {
|
||||
boxClass = "ACE_Track";
|
||||
displayName = "Vehicle Track";
|
||||
tooltip = "A single track for replacement";
|
||||
icon = "z\ace\addons\repair\ui\patch_ca.paa";
|
||||
|
||||
backpacks[] = {};
|
||||
weapons[] = {};
|
||||
magazines[] = {};
|
||||
items[] = {};
|
||||
};
|
||||
};
|
||||
@@ -1,293 +0,0 @@
|
||||
class VehicleFlags {
|
||||
|
||||
texturePBOName = "textures";
|
||||
baseClassesToApplyActionsFor[] = {
|
||||
"LandVehicle",
|
||||
"Helicopter"
|
||||
};
|
||||
|
||||
class ExcludedVehicles {
|
||||
classesWithoutFlagProxies[] = {
|
||||
"TF373_SOAR_MH47G_Base", // MH-47G Chinook
|
||||
"RHS_MELB_base", // MELB AH-6M/MH-6M/H-6M Little Bird
|
||||
"USAF_C17", // C17 Globemaster III
|
||||
"USAF_C130J", // C130J Super Hercules
|
||||
"USAF_AC130U", // AC130 Spooky II
|
||||
"ej_UH60M_base", // UH-60M Black Hawk + DAP variants
|
||||
"rhsusf_fmtv_base" // M1083A1P2 variants + SOV SOCOM variants
|
||||
};
|
||||
};
|
||||
|
||||
class FlagCategories {
|
||||
class ChevronNumbers {
|
||||
actionID = "flag_chevron_numbers";
|
||||
actionTitle = "Chevron Numbers";
|
||||
|
||||
class Chevron1 {
|
||||
actionID = "flag_chevron_id1";
|
||||
actionTitle = "Flag 1";
|
||||
texture = "textures\flag_number\flag_id_1_co.paa";
|
||||
};
|
||||
class Chevron2 {
|
||||
actionID = "flag_chevron_id2";
|
||||
actionTitle = "Flag 2";
|
||||
texture = "textures\flag_number\flag_id_2_co.paa";
|
||||
};
|
||||
class Chevron3 {
|
||||
actionID = "flag_chevron_id3";
|
||||
actionTitle = "Flag 3";
|
||||
texture = "textures\flag_number\flag_id_3_co.paa";
|
||||
};
|
||||
class Chevron4 {
|
||||
actionID = "flag_chevron_id4";
|
||||
actionTitle = "Flag 4";
|
||||
texture = "textures\flag_number\flag_id_4_co.paa";
|
||||
};
|
||||
class Chevron5 {
|
||||
actionID = "flag_chevron_id5";
|
||||
actionTitle = "Flag 5";
|
||||
texture = "textures\flag_number\flag_id_5_co.paa";
|
||||
};
|
||||
class Chevron6 {
|
||||
actionID = "flag_chevron_id6";
|
||||
actionTitle = "Flag 6";
|
||||
texture = "textures\flag_number\flag_id_6_co.paa";
|
||||
};
|
||||
class Chevron7 {
|
||||
actionID = "flag_chevron_id7";
|
||||
actionTitle = "Flag 7";
|
||||
texture = "textures\flag_number\flag_id_7_co.paa";
|
||||
};
|
||||
class Chevron8 {
|
||||
actionID = "flag_chevron_id8";
|
||||
actionTitle = "Flag 8";
|
||||
texture = "textures\flag_number\flag_id_8_co.paa";
|
||||
};
|
||||
class Chevron9 {
|
||||
actionID = "flag_chevron_id9";
|
||||
actionTitle = "Flag 9";
|
||||
texture = "textures\flag_number\flag_id_9_co.paa";
|
||||
};
|
||||
class Chevron10 {
|
||||
actionID = "flag_chevron_id10";
|
||||
actionTitle = "Flag 10";
|
||||
texture = "textures\flag_number\flag_id_10_co.paa";
|
||||
};
|
||||
class ChevronHQ {
|
||||
actionID = "flag_chevron_hq";
|
||||
actionTitle = "Flag HQ";
|
||||
texture = "textures\flag_number\flag_id_hq_co.paa";
|
||||
};
|
||||
};
|
||||
|
||||
class SimpleShapes {
|
||||
actionID = "flag_simpleshape";
|
||||
actionTitle = "Simple Shapes";
|
||||
|
||||
class Blue {
|
||||
actionID = "flags_simpleshape_blue";
|
||||
actionTitle = "Blue";
|
||||
|
||||
class BlueCircle {
|
||||
actionID = "flag_simpleshape_bluecircle";
|
||||
actionTitle = "Blue Circle";
|
||||
texture = "textures\simple_shape\flag_simpleshape_bluecircle_co.paa";
|
||||
};
|
||||
class BlueOctagon {
|
||||
actionID = "flag_simpleshape_blueoctagon";
|
||||
actionTitle = "Blue Octagon";
|
||||
texture = "textures\simple_shape\flag_simpleshape_blueoctagon_co.paa";
|
||||
};
|
||||
class BluePentagon {
|
||||
actionID = "flag_simpleshape_bluepentagon";
|
||||
actionTitle = "Blue Pentagon";
|
||||
texture = "textures\simple_shape\flag_simpleshape_bluepentagon_co.paa";
|
||||
};
|
||||
class BlueSquare {
|
||||
actionID = "flag_simpleshape_bluesquare";
|
||||
actionTitle = "Blue Square";
|
||||
texture = "textures\simple_shape\flag_simpleshape_bluesquare_co.paa";
|
||||
};
|
||||
class BlueTriangle {
|
||||
actionID = "flag_simpleshape_bluetriangle";
|
||||
actionTitle = "Blue Triangle";
|
||||
texture = "textures\simple_shape\flag_simpleshape_bluetriangle_co.paa";
|
||||
};
|
||||
};
|
||||
|
||||
class Green {
|
||||
actionID = "flags_simpleshape_green";
|
||||
actionTitle = "Green";
|
||||
|
||||
class GreenCircle {
|
||||
actionID = "flag_simpleshape_greencircle";
|
||||
actionTitle = "Green Circle";
|
||||
texture = "textures\simple_shape\flag_simpleshape_greencircle_co.paa";
|
||||
};
|
||||
class GreenOctagon {
|
||||
actionID = "flag_simpleshape_greenoctagon";
|
||||
actionTitle = "Green Octagon";
|
||||
texture = "textures\simple_shape\flag_simpleshape_greenoctagon_co.paa";
|
||||
};
|
||||
class GreenPentagon {
|
||||
actionID = "flag_simpleshape_greenpentagon";
|
||||
actionTitle = "Green Pentagon";
|
||||
texture = "textures\simple_shape\flag_simpleshape_greenpentagon_co.paa";
|
||||
};
|
||||
class GreenSquare {
|
||||
actionID = "flag_simpleshape_greensquare";
|
||||
actionTitle = "Green Square";
|
||||
texture = "textures\simple_shape\flag_simpleshape_greensquare_co.paa";
|
||||
};
|
||||
class GreenTriangle {
|
||||
actionID = "flag_simpleshape_greentriangle";
|
||||
actionTitle = "Green Triangle";
|
||||
texture = "textures\simple_shape\flag_simpleshape_greentriangle_co.paa";
|
||||
};
|
||||
};
|
||||
|
||||
class Orange {
|
||||
actionID = "flags_simpleshape_orange";
|
||||
actionTitle = "Orange";
|
||||
|
||||
class OrangeCircle {
|
||||
actionID = "flag_simpleshape_orangecircle";
|
||||
actionTitle = "Orange Circle";
|
||||
texture = "textures\simple_shape\flag_simpleshape_orangecircle_co.paa";
|
||||
};
|
||||
class OrangeOctagon {
|
||||
actionID = "flag_simpleshape_orangeoctagon";
|
||||
actionTitle = "Orange Octagon";
|
||||
texture = "textures\simple_shape\flag_simpleshape_orangeoctagon_co.paa";
|
||||
};
|
||||
class OrangePentagon {
|
||||
actionID = "flag_simpleshape_orangepentagon";
|
||||
actionTitle = "Orange Pentagon";
|
||||
texture = "textures\simple_shape\flag_simpleshape_orangepentagon_co.paa";
|
||||
};
|
||||
class OrangeSquare {
|
||||
actionID = "flag_simpleshape_orangesquare";
|
||||
actionTitle = "Orange Square";
|
||||
texture = "textures\simple_shape\flag_simpleshape_orangesquare_co.paa";
|
||||
};
|
||||
class OrangeTriangle {
|
||||
actionID = "flag_simpleshape_orangetriangle";
|
||||
actionTitle = "Orange Triangle";
|
||||
texture = "textures\simple_shape\flag_simpleshape_orangetriangle_co.paa";
|
||||
};
|
||||
};
|
||||
|
||||
class Pink {
|
||||
actionID = "flags_simpleshape_pink";
|
||||
actionTitle = "Pink";
|
||||
|
||||
class PinkCircle {
|
||||
actionID = "flag_simpleshape_pinkcircle";
|
||||
actionTitle = "Pink Circle";
|
||||
texture = "textures\simple_shape\flag_simpleshape_pinkcircle_co.paa";
|
||||
};
|
||||
class PinkOctagon {
|
||||
actionID = "flag_simpleshape_pinkoctagon";
|
||||
actionTitle = "Pink Octagon";
|
||||
texture = "textures\simple_shape\flag_simpleshape_pinkoctagon_co.paa";
|
||||
};
|
||||
class PinkPentagon {
|
||||
actionID = "flag_simpleshape_pinkpentagon";
|
||||
actionTitle = "Pink Pentagon";
|
||||
texture = "textures\simple_shape\flag_simpleshape_pinkpentagon_co.paa";
|
||||
};
|
||||
class PinkSquare {
|
||||
actionID = "flag_simpleshape_pinksquare";
|
||||
actionTitle = "Pink Square";
|
||||
texture = "textures\simple_shape\flag_simpleshape_pinksquare_co.paa";
|
||||
};
|
||||
class PinkTriangle {
|
||||
actionID = "flag_simpleshape_pinktriangle";
|
||||
actionTitle = "Pink Triangle";
|
||||
texture = "textures\simple_shape\flag_simpleshape_pinktriangle_co.paa";
|
||||
};
|
||||
};
|
||||
|
||||
class Red {
|
||||
actionID = "flags_simpleshape_red";
|
||||
actionTitle = "Red";
|
||||
|
||||
class RedCircle {
|
||||
actionID = "flag_simpleshape_redcircle";
|
||||
actionTitle = "Red Circle";
|
||||
texture = "textures\simple_shape\flag_simpleshape_redcircle_co.paa";
|
||||
};
|
||||
class RedOctagon {
|
||||
actionID = "flag_simpleshape_redoctagon";
|
||||
actionTitle = "Red Octagon";
|
||||
texture = "textures\simple_shape\flag_simpleshape_redoctagon_co.paa";
|
||||
};
|
||||
class RedPentagon {
|
||||
actionID = "flag_simpleshape_redpentagon";
|
||||
actionTitle = "Red Pentagon";
|
||||
texture = "textures\simple_shape\flag_simpleshape_redpentagon_co.paa";
|
||||
};
|
||||
class RedSquare {
|
||||
actionID = "flag_simpleshape_redsquare";
|
||||
actionTitle = "Red Square";
|
||||
texture = "textures\simple_shape\flag_simpleshape_redsquare_co.paa";
|
||||
};
|
||||
class RedTriangle {
|
||||
actionID = "flag_simpleshape_redtriangle";
|
||||
actionTitle = "Red Triangle";
|
||||
texture = "textures\simple_shape\flag_simpleshape_redtriangle_co.paa";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
class Miscellaneous {
|
||||
actionID = "flag_misc";
|
||||
actionTitle = "Miscellaneous";
|
||||
class BattalionEmblem {
|
||||
actionID = "flag_17th_emblem";
|
||||
actionTitle = "17th Emblem";
|
||||
texture = "textures\flags_misc\flag_17th_emblem_co.paa";
|
||||
};
|
||||
class RedCross {
|
||||
actionID = "flag_redcross";
|
||||
actionTitle = "Red Cross";
|
||||
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";
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
@@ -17,13 +17,8 @@
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "mission_settings.hpp"
|
||||
#include "framework\script_mod.hpp"
|
||||
#include "defines\ApprovedAssets.hpp"
|
||||
#include "defines\BattalionInfo.hpp"
|
||||
#include "defines\DisallowedEquipment.hpp"
|
||||
#include "defines\SupplyCrates.hpp"
|
||||
#include "defines\VehicleFlags.hpp"
|
||||
#include "defines\SignalColors.hpp"
|
||||
#include "functions\definitions\DisallowedEquipment.hpp"
|
||||
#include "functions\definitions\BattalionInfo.hpp"
|
||||
|
||||
//-------------------------------------------MISSION INFO--------------------------------------------------------------------
|
||||
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
@@ -89,20 +84,16 @@ minPlayerDistance = 500;
|
||||
|
||||
//-------------------------------------------BASE SETTINGS---------------------------------------------------------------//
|
||||
|
||||
class Params {};
|
||||
|
||||
class CfgFunctions {
|
||||
#include "framework\CfgFunctions.hpp"
|
||||
#include "custom_scripts.hpp"
|
||||
class Params
|
||||
{
|
||||
};
|
||||
|
||||
class CfgSounds {
|
||||
#include "custom_sounds.hpp"
|
||||
|
||||
class cfgFunctions
|
||||
{
|
||||
#include "functions\CfgFunctions.hpp"
|
||||
};
|
||||
|
||||
class CfgLeaflets {
|
||||
#include "custom_leaflets.hpp"
|
||||
};
|
||||
|
||||
class CfgDebriefingSections {
|
||||
class acex_killTracker {
|
||||
|
||||
@@ -1,191 +0,0 @@
|
||||
#include "script_mod.hpp"
|
||||
|
||||
class DOUBLES(PREFIX,init) {
|
||||
class functions {
|
||||
file = "framework\init\functions";
|
||||
class initServer { postInit = 1;};
|
||||
class initClient { postInit = 1;};
|
||||
class setDefaults {};
|
||||
class addAARChatHandler {};
|
||||
class addRespawnChatHandler {};
|
||||
class checkMissionSettings {};
|
||||
};
|
||||
};
|
||||
|
||||
class PREFIX {
|
||||
class ambience {
|
||||
file = "framework\ambience";
|
||||
class flakInitVehicle {};
|
||||
class flakEH {};
|
||||
};
|
||||
};
|
||||
|
||||
class DOUBLES(PREFIX,client) {
|
||||
class functions {
|
||||
file = "framework\client\functions";
|
||||
class initClient {};
|
||||
class addDraw3DPFH {};
|
||||
class addGetNearMenPFH {};
|
||||
class addMicroDAGRWaypoints {};
|
||||
class addZenModules {};
|
||||
class bindEventHandlers {};
|
||||
class bindVehicleActions {};
|
||||
class clearPFHCode {};
|
||||
class logRespawnButtonUse {};
|
||||
class registerPFHCode {};
|
||||
class staticLineProtection {};
|
||||
};
|
||||
};
|
||||
|
||||
class DOUBLES(PREFIX,common) {
|
||||
class functions {
|
||||
file = "framework\common\functions";
|
||||
class addCBASettings { preInit = 1; };
|
||||
class addPlayerInfoToArray {};
|
||||
class checkPlayerInventory {};
|
||||
class createOrUpdateDiaryRecord {};
|
||||
class draw3DIconStatus {};
|
||||
class getApprovedAssetsCfg {};
|
||||
class getBattalionCfg {};
|
||||
class getNameOfBase {};
|
||||
class getNearestBase {};
|
||||
class log {};
|
||||
class logMissionInfo {};
|
||||
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,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 formatRadioElementForDiary {};
|
||||
class generateElementFrequencyRecordText {};
|
||||
};
|
||||
};
|
||||
|
||||
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,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 addEmptyGroupCleanupPFH {};
|
||||
class addDeadUnitCleanupPFH {};
|
||||
};
|
||||
};
|
||||
|
||||
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,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 draw3D {};
|
||||
class updateColors {};
|
||||
};
|
||||
};
|
||||
|
||||
class DOUBLES(PREFIX,vehicleFlags) {
|
||||
class functions {
|
||||
file = "framework\vehicleFlags\functions";
|
||||
class initClient {};
|
||||
class addFlagActions {};
|
||||
class draw3D {};
|
||||
class getActionsFlagCategories {};
|
||||
class compileFlagAction {};
|
||||
class compileFlagCategoryAction {};
|
||||
class getVehicleFlagsCfg {};
|
||||
class isClassExcluded {};
|
||||
};
|
||||
};
|
||||
|
||||
class DOUBLES(PREFIX,zeus) {
|
||||
class functions {
|
||||
file = "framework\zeus\functions";
|
||||
class initClient {};
|
||||
class addZenModules {};
|
||||
};
|
||||
};
|
||||
@@ -1,10 +0,0 @@
|
||||
#include "..\script_component.hpp"
|
||||
|
||||
|
||||
if (!isNil QGVAR(draw3DPFH)) then {
|
||||
[GVAR(draw3DPFH)] call CBA_fnc_removePerFrameHandler;
|
||||
};
|
||||
// add pfh that processes queued code
|
||||
GVAR(draw3DPFH) = [{
|
||||
{call _x; true;} count (localNamespace getVariable [QGVAR(pfhCode), []]);
|
||||
}, 0] call CBA_fnc_addPerFrameHandler;
|
||||
@@ -1,17 +0,0 @@
|
||||
#include "..\script_component.hpp"
|
||||
|
||||
// subroutine to gather nearest 50 units every 5 seconds and store in GVAR(nearMen)
|
||||
// cleanup
|
||||
if (!isNil QGVAR(getNearMenPFH)) then {
|
||||
[GVAR(getNearMenPFH)] call CBA_fnc_removePerFrameHandler;
|
||||
};
|
||||
// add pfh
|
||||
GVAR(getNearMenPFH) = [{
|
||||
localNamespace setVariable [
|
||||
QGVAR(nearMen),
|
||||
(nearestObjects [player,["Man"],50,false]) select {
|
||||
!isNull _x &&
|
||||
player isNotEqualTo _x
|
||||
}
|
||||
];
|
||||
}, 1] call CBA_fnc_addPerFrameHandler;
|
||||
@@ -1,76 +0,0 @@
|
||||
#include "..\script_component.hpp"
|
||||
|
||||
// adds default base locations to players' microDAGR as waypoints
|
||||
|
||||
if (!hasInterface) exitWith {};
|
||||
|
||||
[{!isNull player}, {
|
||||
|
||||
// add base locations (respawn modules)
|
||||
{
|
||||
private _wpName = [_x] call EFUNC(common,getNameOfBase);
|
||||
private _posASL = getPosASL _x;
|
||||
[_wpName, _posASL] call ace_microdagr_fnc_deviceAddWaypoint;
|
||||
} forEach GVARMAIN(baseObjects);
|
||||
|
||||
// add custom waypoints from mission_settings.hpp
|
||||
private _customWaypoints = [missionConfigFile >> "custom_microdagr_waypoints", "ARRAY", []] call CBA_fnc_getConfigEntry;
|
||||
{
|
||||
_x params [
|
||||
["_wpName", ""],
|
||||
["_pos", [0, 0, 0], [[], ""]],
|
||||
["_object", "", [""]]
|
||||
];
|
||||
private _realPos = nil;
|
||||
// if pos was provided, process
|
||||
if (count _pos >= 2) then {
|
||||
switch (typeName _pos) do {
|
||||
case "ARRAY": {
|
||||
// pos is provided as an array
|
||||
_realPos = _pos select [0, 2];
|
||||
_realPos set [2, getTerrainHeightASL _realPos];
|
||||
};
|
||||
case "STRING": {
|
||||
// pos is provided as a string
|
||||
_realPos = [_pos, true] call ACE_common_fnc_getMapPosFromGrid;
|
||||
_realPos set [2, getTerrainHeightASL _realPos];
|
||||
};
|
||||
default {
|
||||
[
|
||||
LEVEL_WARNING,
|
||||
QUOTE(COMPONENT),
|
||||
format["Invalid position for custom microDAGR waypoint: %1", _wpName],
|
||||
[["name", _wpName], ["pos", _pos], ["object", _object]]] call EFUNC(common,log);
|
||||
continue;
|
||||
};
|
||||
};
|
||||
};
|
||||
// if object was provided, process and override any pos
|
||||
if (count _object > 0) then {
|
||||
// object is provided as a string variable name
|
||||
private _realObject = missionNamespace getVariable _object;
|
||||
if (isNull _realObject) then {
|
||||
[
|
||||
LEVEL_WARNING,
|
||||
QUOTE(COMPONENT),
|
||||
format["Invalid object for custom microDAGR waypoint: %1", _wpName],
|
||||
[["name", _wpName], ["pos", _pos], ["object", _object]]] call EFUNC(common,log);
|
||||
continue;
|
||||
};
|
||||
_realPos = getPosASL (missionNamespace getVariable _object);
|
||||
};
|
||||
if (isNil "_realPos") then {
|
||||
[
|
||||
LEVEL_WARNING,
|
||||
QUOTE(COMPONENT),
|
||||
format["Invalid waypoint position for custom microDAGR waypoint: %1", _wpName],
|
||||
[["name", _wpName], ["pos", _pos], ["object", _object]]] call EFUNC(common,log);
|
||||
continue;
|
||||
};
|
||||
|
||||
[_wpName, _realPos] call ace_microdagr_fnc_deviceAddWaypoint;
|
||||
true;
|
||||
} count _customWaypoints;
|
||||
}] call CBA_fnc_waitUntilAndExecute;
|
||||
|
||||
nil;
|
||||
@@ -1,41 +0,0 @@
|
||||
#include "..\script_component.hpp"
|
||||
|
||||
if ( !hasInterface ) exitWith {};
|
||||
|
||||
[
|
||||
QUOTE(MODULE_CATEGORY_NAME),
|
||||
"Grounds Cleanup",
|
||||
{
|
||||
params [["_pos", [0,0,0], [[]], 3], ["_target", objNull, [objNull]]];
|
||||
|
||||
_pos = [_pos#0, _pos#1, 0];
|
||||
|
||||
[
|
||||
"Cleanup Area",
|
||||
[
|
||||
[ "SLIDER:RADIUS", "Radius (meters)", [50, 500, 100, 0, _pos, [0.8, 0.2, 0.2, 1.0]], true ]
|
||||
],
|
||||
{
|
||||
|
||||
params ["_dialog", "_args"];
|
||||
|
||||
_dialog params ["_radius"];
|
||||
_args params ["_pos", "_target"];
|
||||
|
||||
_objects = _pos nearObjects ["GroundWeaponHolder", _radius];
|
||||
{
|
||||
deleteVehicle _x;
|
||||
} forEach _objects
|
||||
|
||||
},
|
||||
{},
|
||||
[_pos, _target]
|
||||
] call zen_dialog_fnc_create;
|
||||
|
||||
}
|
||||
] call zen_custom_modules_fnc_register;
|
||||
|
||||
|
||||
diag_log text "[MILSIM] (client) zeus modules added";
|
||||
|
||||
nil;
|
||||
@@ -1,34 +0,0 @@
|
||||
if ( !hasInterface ) exitWith {};
|
||||
|
||||
_checkFuel =
|
||||
[
|
||||
"CheckFuel",
|
||||
"Check Fuel",
|
||||
"",
|
||||
{
|
||||
hint format ["Fuel: %1%2", floor (fuel _target *100), "%"];
|
||||
},
|
||||
{true}
|
||||
] call ace_interact_menu_fnc_createAction;
|
||||
|
||||
["LandVehicle", 0, ["ACE_MainActions"], _checkFuel, true] call ace_interact_menu_fnc_addActionToClass;
|
||||
|
||||
|
||||
_unflip =
|
||||
[
|
||||
"Unfuck",
|
||||
"Flip Vehicle",
|
||||
"",
|
||||
{
|
||||
_target setpos [(getpos _target) select 0,(getpos _target) select 1, 0.5];
|
||||
_target setVectorUp surfaceNormal position _target;
|
||||
},
|
||||
{true}
|
||||
] call ace_interact_menu_fnc_createAction;
|
||||
|
||||
["LandVehicle", 0, ["ACE_MainActions"], _unflip, true] call ace_interact_menu_fnc_addActionToClass;
|
||||
|
||||
|
||||
diag_log text "[MILSIM] (client) vehicle actions bound";
|
||||
|
||||
nil;
|
||||
@@ -1,5 +0,0 @@
|
||||
#include "..\script_component.hpp"
|
||||
|
||||
localNamespace setVariable [QGVAR(pfhCode), []];
|
||||
|
||||
count [];
|
||||
@@ -1,32 +0,0 @@
|
||||
#include "..\script_component.hpp"
|
||||
|
||||
|
||||
if (!hasInterface) exitWith {};
|
||||
|
||||
call FUNC(addMicroDAGRWaypoints);
|
||||
call FUNC(addZenModules);
|
||||
call FUNC(bindEventHandlers);
|
||||
call FUNC(bindVehicleActions);
|
||||
|
||||
// add core getNearMenPFH handler
|
||||
localNamespace setVariable [QGVAR(nearMen), []];
|
||||
call FUNC(addGetNearMenPFH);
|
||||
// add core draw3dPFH handler
|
||||
localNamespace setVariable [QGVAR(pfhCode), []];
|
||||
call FUNC(addDraw3DPFH);
|
||||
|
||||
// add listener that tracks using the respawn button while unconscious
|
||||
call FUNC(logRespawnButtonUse);
|
||||
// add conditional eject-from-vehicle handler to apply temp invincibility when static line jumping
|
||||
call FUNC(staticLineProtection);
|
||||
|
||||
[
|
||||
LEVEL_DEBUG,
|
||||
QUOTE(COMPONENT),
|
||||
"initClient complete",
|
||||
[]
|
||||
] call EFUNC(common,log);
|
||||
|
||||
localNamespace setVariable [QGVAR(complete), true];
|
||||
|
||||
nil;
|
||||
@@ -1,56 +0,0 @@
|
||||
#include "..\script_component.hpp"
|
||||
|
||||
if ( !hasInterface ) exitWith {};
|
||||
|
||||
["ace_killed", {
|
||||
params ["_unit", "_causeOfDeath", "_killer", "_instigator"];
|
||||
|
||||
if (not (local _unit)) exitWith {};
|
||||
|
||||
private _causeOfDeath = _unit getVariable ["ace_medical_causeOfDeath", "#scripted"];
|
||||
|
||||
if (_causeOfDeath != "respawn_button") exitWith {};
|
||||
private _timeWentUnconscious = _unit getVariable [QGVARMAIN(lastTimeKnockedOut), -1];
|
||||
private _durationSpentUnconscious = -1;
|
||||
if (_timeWentUnconscious isEqualTo -1) exitWith {};
|
||||
|
||||
_durationSpentUnconscious = diag_tickTime - _timeWentUnconscious;
|
||||
|
||||
[
|
||||
LEVEL_INFO,
|
||||
QUOTE(COMPONENT),
|
||||
"RESPAWNED WHILE UNCONSCIOUS",
|
||||
[_unit, [
|
||||
["durationSpentUnconscious", _durationSpentUnconscious]
|
||||
]] call EFUNC(common,addPlayerInfoToArray)
|
||||
] remoteExec [QEFUNC(common,log), 2];
|
||||
// format["%1 was unconscious then clicked the respawn button", name _unit] remoteExec["systemChat", 0];
|
||||
}] call CBA_fnc_addEventHandler;
|
||||
|
||||
|
||||
["ace_medical_knockOut", { // local event for module & epi event
|
||||
// systemChat format["ace_medical_knockOut: %1", _this];
|
||||
private _unit = _this;
|
||||
if (not (local _unit)) exitWith {};
|
||||
_this setVariable [QGVARMAIN(lastTimeKnockedOut), diag_tickTime];
|
||||
}] call CBA_fnc_addEventHandler;
|
||||
|
||||
["ace_medical_WakeUp", { // local event for module & epi event
|
||||
// systemChat format["ace_medical_WakeUp: %1", _this];
|
||||
private _unit = _this;
|
||||
if (not (local _unit)) exitWith {};
|
||||
_this setVariable [QGVARMAIN(lastTimeKnockedOut), nil];
|
||||
}] call CBA_fnc_addEventHandler;
|
||||
|
||||
["ace_unconscious", { // used when applying damage
|
||||
params ["_unit", "_isUnconscious"];
|
||||
if (not (local _unit)) exitWith {};
|
||||
|
||||
if (_isUnconscious && isNil {_unit getVariable QGVARMAIN(lastTimeKnockedOut)}) then {
|
||||
// systemChat format["%1 is unconscious", _unit];
|
||||
_unit setVariable [QGVARMAIN(lastTimeKnockedOut), diag_tickTime];
|
||||
} else {
|
||||
// systemChat format["%1 is conscious", _unit];
|
||||
_unit setVariable [QGVARMAIN(lastTimeKnockedOut), nil];
|
||||
};
|
||||
}] call CBA_fnc_addEventHandler;
|
||||
@@ -1,9 +0,0 @@
|
||||
#include "..\script_component.hpp"
|
||||
|
||||
params [["_code", {}, [{}]]];
|
||||
|
||||
private _pfhCode = localNamespace getVariable [QGVAR(pfhCode), []];
|
||||
_pfhCode pushBack _code;
|
||||
localNamespace setVariable [QGVAR(pfhCode), _pfhCode];
|
||||
|
||||
count _pfhCode;
|
||||
@@ -1,40 +0,0 @@
|
||||
#include "..\script_component.hpp"
|
||||
|
||||
if ( !hasInterface ) exitWith {};
|
||||
|
||||
// Add GetOutMan event handler to grant temporary invincibility to players ejecting from vehicles
|
||||
// Only for players who have "hooked up" using VS static line
|
||||
// and are ejecting from a plane or helicopter above 100m
|
||||
player addEventHandler ["GetOutMan", {
|
||||
params ["_unit", "_role", "_vehicle", "_turret", "_isEject"];
|
||||
if (!isEject) exitWith {};
|
||||
if (isNil {_unit getVariable "VS_Jump"}) exitWith {};
|
||||
if (
|
||||
not (_vehicle isKindOf "Plane" || _vehicle isKindOf "Helicopter") ||
|
||||
((getPosATL _vehicle)#2) < 100
|
||||
) exitWith {};
|
||||
|
||||
// disable damage for the unit to avoid collision damage
|
||||
_unit allowDamage false;
|
||||
// tested - vehicle _unit is the _unit, as this EH runs when they have left the vehicle
|
||||
|
||||
|
||||
[
|
||||
{!isNull (objectParent _this)}, // condition - wait until player re-enters vehicle (chute)
|
||||
{
|
||||
// if they enter a chute within 5 seconds, disable chute damage
|
||||
(vehicle _this) allowDamage false;
|
||||
// then wait X seconds and re-enable damage for both
|
||||
[{
|
||||
_this allowDamage true;
|
||||
(vehicle _this) allowDamage true;
|
||||
}, _this, 5] call CBA_fnc_waitAndExecute;
|
||||
},
|
||||
_unit, // args
|
||||
2, // timeout
|
||||
{ // run on timeout, if for some reason they don't enter a chute
|
||||
// re-enable damage for unit
|
||||
_this allowDamage true;
|
||||
}
|
||||
] call CBA_fnc_waitUntilAndExecute;
|
||||
}];
|
||||
@@ -1,3 +0,0 @@
|
||||
#define COMPONENT client
|
||||
#define COMPONENT_BEAUTIFIED Client
|
||||
#include "../script_mod.hpp"
|
||||
@@ -1,27 +0,0 @@
|
||||
#include "..\script_component.hpp"
|
||||
|
||||
//---------------------
|
||||
// Side Chat
|
||||
//---------------------
|
||||
|
||||
[
|
||||
QGVARMAIN(sideChat),
|
||||
"CHECKBOX",
|
||||
"Side Chat Text Enabled",
|
||||
[QUOTE(SETTINGS_GROUP_NAME), QUOTE(COMPONENT_BEAUTIFIED)],
|
||||
false, // default value
|
||||
true, // requires restart
|
||||
{
|
||||
params ["_value"];
|
||||
[
|
||||
QGVARMAIN(sideChat),
|
||||
_value
|
||||
] call EFUNC(common,logSettingChanged);
|
||||
}
|
||||
] call CBA_fnc_addSetting;
|
||||
|
||||
[QGVARMAIN(sideChat), false] call CBA_settings_fnc_set;
|
||||
|
||||
diag_log text "[MILSIM] (settings) Custom CBA settings initialized";
|
||||
|
||||
nil;
|
||||
@@ -1,58 +0,0 @@
|
||||
#include "../script_component.hpp"
|
||||
|
||||
if (!hasInterface) exitWith {};
|
||||
|
||||
params [
|
||||
["_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];
|
||||
|
||||
if (!isNull _existingRecord) then {
|
||||
player setDiaryRecordText [[_subjectID, _existingRecord], [_recordTitle, _recordText, _recordIcon]];
|
||||
|
||||
[
|
||||
LEVEL_DEBUG,
|
||||
QUOTE(COMPONENT),
|
||||
format ["Updated diary record: %1", _recordTitle],
|
||||
[
|
||||
["subjectID", _subjectID],
|
||||
["recordTitle", _recordTitle]
|
||||
]
|
||||
] call EFUNC(common,log);
|
||||
} else {
|
||||
private _new = player createDiaryRecord [
|
||||
_subjectID,
|
||||
[
|
||||
_recordTitle,
|
||||
_recordText,
|
||||
_recordIcon
|
||||
]
|
||||
];
|
||||
_subjectRecords set [_recordTitle, _new];
|
||||
GVAR(diaryRecords) set [_subjectID, _subjectRecords];
|
||||
|
||||
[
|
||||
LEVEL_DEBUG,
|
||||
QUOTE(COMPONENT),
|
||||
format ["Created diary record: %1", _recordTitle],
|
||||
[
|
||||
["subjectID", _subjectID],
|
||||
["recordTitle", _recordTitle]
|
||||
]
|
||||
] call EFUNC(common,log);
|
||||
};
|
||||
@@ -1,54 +0,0 @@
|
||||
#include "..\script_component.hpp"
|
||||
|
||||
if (!hasInterface) exitWith {};
|
||||
|
||||
params [
|
||||
["_drawTargets", [], [[]]],
|
||||
["_icon", "", [""]],
|
||||
["_text", "", [""]],
|
||||
["_color", [], [[]]]
|
||||
];
|
||||
|
||||
if (count _drawTargets isEqualTo 0) exitWith {};
|
||||
|
||||
_cameraPos = positionCameraToWorld [0,0,0];
|
||||
_cameraPosASL = AGLToASL _cameraPos;
|
||||
|
||||
{
|
||||
_target = _x;
|
||||
_visible = [objNull, "VIEW"] checkVisibility [_cameraPosASL, eyePos _target];
|
||||
|
||||
if ( _visible isEqualTo 0 ) exitWith {};
|
||||
|
||||
_objectPos = (_target modelToWorldVisual (_target selectionPosition "pilot"));
|
||||
_distance = (visiblePosition _target) vectorDiff _cameraPos;
|
||||
|
||||
_scale = 0;
|
||||
_heightOffset = 0;
|
||||
_heightScaling = 0.012;
|
||||
|
||||
if ( _icon isNotEqualTo "") then {
|
||||
_heightOffset = 0.065;
|
||||
_scale = 1;
|
||||
_heightScaling = 0.075;
|
||||
};
|
||||
|
||||
_drawPos = _objectPos vectorAdd [0, 0, (0.18 + _heightOffset) + (vectorMagnitude _distance * _heightScaling)];
|
||||
|
||||
drawIcon3D [
|
||||
_icon,
|
||||
_color,
|
||||
_drawPos,
|
||||
_scale,
|
||||
_scale,
|
||||
0,
|
||||
_text,
|
||||
2,
|
||||
0.025
|
||||
];
|
||||
|
||||
true;
|
||||
} count _drawTargets;
|
||||
|
||||
nil
|
||||
|
||||
@@ -1,15 +0,0 @@
|
||||
#include "../script_component.hpp"
|
||||
|
||||
private _approvedAssetsCfg = (missionConfigFile >> "ApprovedAssets");
|
||||
|
||||
if (!IS_CONFIG(_approvedAssetsCfg) || {!isClass _approvedAssetsCfg}) exitWith {
|
||||
[
|
||||
LEVEL_ERROR,
|
||||
QUOTE(COMPONENT),
|
||||
"ERROR: Approved assets config not found. Check that the config is present and correctly named in the mission config file. See defines/ApprovedAssets.hpp and framework/util/functions/getApprovedAssetsCfg.sqf.",
|
||||
[]
|
||||
] call EFUNC(common,log);
|
||||
configNull;
|
||||
};
|
||||
|
||||
_approvedAssetsCfg;
|
||||
@@ -1,15 +0,0 @@
|
||||
#include "../script_component.hpp"
|
||||
|
||||
private _battalionInfoCfg = (missionConfigFile >> "BattalionInfo");
|
||||
|
||||
if (!IS_CONFIG(_battalionInfoCfg) || {!isClass _battalionInfoCfg}) exitWith {
|
||||
[
|
||||
LEVEL_ERROR,
|
||||
QUOTE(COMPONENT),
|
||||
"ERROR: Battalion config not found. Check that the battalion config is present and correctly named in the mission config file. See defines/BattalionInfo.hpp and framework/util/functions/getBattalionCfg.sqf.",
|
||||
[]
|
||||
] call EFUNC(common,log);
|
||||
configNull;
|
||||
};
|
||||
|
||||
_battalionInfoCfg;
|
||||
@@ -1,19 +0,0 @@
|
||||
#include "..\script_component.hpp"
|
||||
|
||||
params [["_base", objNull, [objNull]]];
|
||||
if (_base == objNull) exitWith {""};
|
||||
|
||||
// get base name
|
||||
private _baseName = _base getVariable ["name", ""];
|
||||
// if (_baseName == "") then {
|
||||
// _baseName = format[
|
||||
// "near %1",
|
||||
// text (nearestLocation [_base, ["NameCity", "NameLocal"]])
|
||||
// ]
|
||||
// };
|
||||
|
||||
if (_baseName == "") then {
|
||||
_baseName = _base call BIS_fnc_locationDescription;
|
||||
};
|
||||
|
||||
_baseName;
|
||||
@@ -1,12 +0,0 @@
|
||||
#include "..\script_component.hpp"
|
||||
|
||||
params [["_object", objNull, [objNull]]];
|
||||
if (isNull _object) exitWith {objNull};
|
||||
|
||||
private _bases = missionNamespace getVariable ["milsim_baseObjects", []];
|
||||
if (count _bases == 0) exitWith {objNull};
|
||||
|
||||
// get nearest base (Module_Respawn_F)
|
||||
private _closestBase = [_bases, _object] call BIS_fnc_nearestPosition;
|
||||
if (isNull _closestBase) exitWith {objNull};
|
||||
_closestBase;
|
||||
@@ -1,33 +0,0 @@
|
||||
/*
|
||||
Function: milsim_common_fnc_log
|
||||
|
||||
Description:
|
||||
Used to log messages to the server RPT file.
|
||||
|
||||
Parameters:
|
||||
0: NUMBER - log level.
|
||||
1: STRING - component name.
|
||||
2: STRING - message to log.
|
||||
3: ARRAY - key value pairs of data to log.
|
||||
*/
|
||||
#include "..\script_component.hpp"
|
||||
|
||||
params [
|
||||
["_logLevel", 1, [-1,0,1,2,3]], // script_mod.hpp
|
||||
["_component", "", [""]],
|
||||
["_message", "", [""]],
|
||||
["_data", [], [[]]]
|
||||
];
|
||||
|
||||
if (_logLevel < DEBUG_MODE) exitWith {};
|
||||
|
||||
private _hash = createHashMapFromArray _data;
|
||||
|
||||
// Replace square brackets with round brackets to avoid parsing issues.
|
||||
[_message, "]", ")"] call CBA_fnc_replace;
|
||||
[_message, "[", "("] call CBA_fnc_replace;
|
||||
|
||||
private _json = [_hash] call CBA_fnc_encodeJSON;
|
||||
private _log = format ["[%1] [%2] [%3] [%4] :: %5", QUOTE(PREFIX), _component, _fnc_scriptNameParent, _message, _json];
|
||||
|
||||
diag_log text _log;
|
||||
@@ -1,16 +0,0 @@
|
||||
#include "..\script_component.hpp"
|
||||
|
||||
params [
|
||||
["_settingName", "", [""]],
|
||||
"_newValue"
|
||||
];
|
||||
|
||||
[
|
||||
LEVEL_INFO,
|
||||
QUOTE(COMPONENT),
|
||||
"SETTING CHANGED",
|
||||
[
|
||||
["setting", _settingName],
|
||||
["newValue", _value]
|
||||
]
|
||||
] call EFUNC(common,log);
|
||||
@@ -1,3 +0,0 @@
|
||||
#define COMPONENT common
|
||||
#define COMPONENT_BEAUTIFIED Common
|
||||
#include "../script_mod.hpp"
|
||||
@@ -1,27 +0,0 @@
|
||||
#include "..\script_component.hpp"
|
||||
|
||||
//---------------------
|
||||
// Asset Diary and Markers Settings
|
||||
|
||||
[
|
||||
QGVAR(setting_detectionRangeFromBase), // variable
|
||||
"SLIDER", // type
|
||||
["Detection Range From Base", "The range from a base that assets will be detected"], // title
|
||||
[QUOTE(SETTINGS_GROUP_NAME), QUOTE(COMPONENT_BEAUTIFIED)], // category
|
||||
[0, 1000, 750, 0, false], // [_min, _max, _default, _trailingDecimals, _isPercentage]
|
||||
true, // global setting
|
||||
{
|
||||
params ["_value"];
|
||||
[
|
||||
QGVAR(setting_detectionRangeFromBase),
|
||||
_value
|
||||
] call EFUNC(common,logSettingChanged);
|
||||
}
|
||||
] call CBA_fnc_addSetting;
|
||||
|
||||
[
|
||||
LEVEL_INFO,
|
||||
QUOTE(COMPONENT),
|
||||
"CREATED SETTINGS",
|
||||
[]
|
||||
] call EFUNC(common,log);
|
||||
@@ -1,15 +0,0 @@
|
||||
#include "..\script_component.hpp"
|
||||
|
||||
params [
|
||||
["_className", "", [""]]
|
||||
];
|
||||
|
||||
// Get the approved assets config
|
||||
private _approvedAssetsCfg = call EFUNC(common,getApprovedAssetsCfg);
|
||||
if (isNull _approvedAssetsCfg) exitWith {""};
|
||||
|
||||
// Get the asset definition
|
||||
private _assetDef = (_approvedAssetsCfg >> _className);
|
||||
if (isClass _assetDef) exitWith {getText(_assetDef >> "callsign")};
|
||||
|
||||
"";
|
||||
@@ -1,6 +0,0 @@
|
||||
#include "../script_component.hpp"
|
||||
|
||||
// return each base with its assets
|
||||
GVARMAIN(baseObjects) apply {
|
||||
[_x, _x getVariable [QGVAR(assetsAtThisBase), []]]
|
||||
};
|
||||
@@ -1,123 +0,0 @@
|
||||
params ["_vic"];
|
||||
|
||||
|
||||
_vicDispName = configOf _vic call BIS_fnc_displayName;
|
||||
private _thisArr = [];
|
||||
|
||||
// _thisArr pushBack getItemCargo _vic;
|
||||
// _thisArr pushBack getBackpackCargo _vic;
|
||||
// _thisArr pushBack getMagazineCargo _vic;
|
||||
// _thisArr pushBack getWeaponCargo _vic;
|
||||
|
||||
private _ItemCargo = [];
|
||||
private _MagazineCargo = [];
|
||||
private _WeaponCargo = [];
|
||||
private _BackpackCargo = [];
|
||||
|
||||
{
|
||||
private _config = _x call CBA_fnc_getItemConfig;
|
||||
_ItemCargo pushBack [
|
||||
getText (_config >> "displayName"),
|
||||
getText (_config >> "picture")
|
||||
];
|
||||
} forEach ItemCargo _vic;
|
||||
{
|
||||
private _config = _x call CBA_fnc_getItemConfig;
|
||||
_MagazineCargo pushBack [
|
||||
getText (_config >> "displayName"),
|
||||
getText (_config >> "picture")
|
||||
];
|
||||
} forEach MagazineCargo _vic;
|
||||
{
|
||||
// private _config = _x call CBA_fnc_getObjectConfig;
|
||||
_WeaponCargo pushBack [
|
||||
getText (configFile >> "CfgWeapons" >> _x >> "displayName"),
|
||||
getText (configFile >> "CfgWeapons" >> _x >> "picture")
|
||||
];
|
||||
} forEach WeaponCargo _vic;
|
||||
{
|
||||
private _config = _x call CBA_fnc_getObjectConfig;
|
||||
_BackpackCargo pushBack [
|
||||
getText (_config >> "displayName"),
|
||||
getText (_config >> "picture")
|
||||
];
|
||||
} forEach BackpackCargo _vic;
|
||||
|
||||
private _sortedItemCargo = ([_ItemCargo call BIS_fnc_consolidateArray, [], {_x # 0 # 0}] call BIS_fnc_sortBy) select {!(_x # 0 # 0 isEqualTo "")};
|
||||
private _sortedMagazineCargo = ([_MagazineCargo call BIS_fnc_consolidateArray, [], {_x # 0 # 0}] call BIS_fnc_sortBy) select {!(_x # 0 # 0 isEqualTo "")};
|
||||
private _sortedWeaponCargo = ([_WeaponCargo call BIS_fnc_consolidateArray, [], {_x # 0 # 0}] call BIS_fnc_sortBy) select {!(_x # 0 # 0 isEqualTo "")};
|
||||
private _sortedBackpackCargo = ([_BackpackCargo call BIS_fnc_consolidateArray, [], {_x # 0 # 0}] call BIS_fnc_sortBy) select {!(_x # 0 # 0 isEqualTo "")};
|
||||
|
||||
// "debug_console" callExtension(str _sortedItemCargo + "~0100");
|
||||
// "debug_console" callExtension(str _sortedMagazineCargo + "~0100");
|
||||
// "debug_console" callExtension(str _sortedWeaponCargo + "~0100");
|
||||
// "debug_console" callExtension(str _sortedBackpackCargo + "~0100");
|
||||
|
||||
if (count _sortedItemCargo > 0) then {
|
||||
_thisArr pushBack format["<font color='#ffffff' size='12' face='PuristaMedium'>Items:</font>"];
|
||||
private _itemCargoOut = [];
|
||||
{
|
||||
private _name = _x # 0 # 0;
|
||||
private _pic = _x # 0 # 1;
|
||||
private _count = _x # 1;
|
||||
if (_pic == "") then {
|
||||
_itemCargoOut pushBack format["<font color='#ffffff' size='12' face='EtelkaMonospacePro'><execute expression='systemChat ""%3"";'>%3 x%2</execute></font>", _pic, _count, _name];
|
||||
} else {
|
||||
_itemCargoOut pushBack format["<img height='30' image='%1'/><font color='#ffffff' size='10' face='EtelkaMonospacePro'><execute expression='systemChat ""%3"";'>x%2</execute></font>", _pic, _count, _name];
|
||||
};
|
||||
if ((_forEachIndex + 1) mod 6 == 0) then {_itemCargoOut pushBack "<br/>"};
|
||||
} forEach _sortedItemCargo;
|
||||
_thisArr pushBack (_itemCargoOut joinString "");
|
||||
};
|
||||
if (count _sortedMagazineCargo > 0) then {
|
||||
_thisArr pushBack format["<font color='#ffffff' size='12' face='PuristaMedium'>Magazines:</font>"];
|
||||
private _magCargoOut = [];
|
||||
{
|
||||
private _name = _x # 0 # 0;
|
||||
private _pic = _x # 0 # 1;
|
||||
private _count = _x # 1;
|
||||
if (_pic == "") then {
|
||||
_magCargoOut pushBack format["<font color='#ffffff' size='12' face='EtelkaMonospacePro'><execute expression='systemChat ""%3"";'>%3 x%2</execute></font>", _pic, _count, _name];
|
||||
} else {
|
||||
_magCargoOut pushBack format["<img height='30' image='%1'/><font color='#ffffff' size='10' face='EtelkaMonospacePro'><execute expression='systemChat ""%3"";'>x%2</execute></font>", _pic, _count, _name];
|
||||
};
|
||||
if ((_forEachIndex + 1) mod 6 == 0) then {_magCargoOut pushBack "<br/>"};
|
||||
} forEach _sortedMagazineCargo;
|
||||
_thisArr pushBack (_magCargoOut joinString "");
|
||||
};
|
||||
if (count _sortedWeaponCargo > 0) then {
|
||||
_thisArr pushBack format["<font color='#ffffff' size='12' face='PuristaMedium'>Weapons:</font>"];
|
||||
private _weaponCargoOut = [];
|
||||
{
|
||||
private _name = _x # 0 # 0;
|
||||
private _pic = _x # 0 # 1;
|
||||
private _count = _x # 1;
|
||||
if (_pic == "") then {
|
||||
_weaponCargoOut pushBack format["<font color='#ffffff' size='12' face='EtelkaMonospacePro'><execute expression='systemChat ""%3"";'>%3 x%2</execute></font>", _pic, _count, _name];
|
||||
} else {
|
||||
_weaponCargoOut pushBack format["<img height='50' image='%1'/><font color='#ffffff' size='10' face='EtelkaMonospacePro'><execute expression='systemChat ""%3"";'>x%2</execute></font>", _pic, _count, _name];
|
||||
};
|
||||
if ((_forEachIndex + 1) mod 3 == 0) then {_weaponCargoOut pushBack "<br/>"};
|
||||
} forEach _sortedWeaponCargo;
|
||||
_thisArr pushBack (_weaponCargoOut joinString "");
|
||||
};
|
||||
if (count _sortedBackpackCargo > 0) then {
|
||||
_thisArr pushBack format["<font color='#ffffff' size='12' face='PuristaMedium'>Backpacks:</font>"];
|
||||
private _backpackCargoOut = [];
|
||||
{
|
||||
private _name = _x # 0 # 0;
|
||||
private _pic = _x # 0 # 1;
|
||||
private _count = _x # 1;
|
||||
if (_pic == "") then {
|
||||
_backpackCargoOut pushBack format["<font color='#ffffff' size='12' face='EtelkaMonospacePro'><execute expression='systemChat ""%3"";'>%3 x%2</execute></font>", _pic, _count, _name];
|
||||
} else {
|
||||
_backpackCargoOut pushBack format["<img height='50' image='%1'/><font color='#ffffff' size='10' face='EtelkaMonospacePro'><execute expression='systemChat ""%3"";'>x%2</execute></font>", _pic, _count, _name];
|
||||
};
|
||||
if ((_forEachIndex + 1) mod 4 == 0) then {_backpackCargoOut pushBack "<br/>"};
|
||||
} forEach _sortedBackpackCargo;
|
||||
_thisArr pushBack (_backpackCargoOut joinString "");
|
||||
// "debug_console" callExtension(str _backpackCargoOut + "~0100");
|
||||
};
|
||||
|
||||
// "debug_console" callExtension(str _thisArr + "~1100");
|
||||
_thisArr;
|
||||
@@ -1,80 +0,0 @@
|
||||
params ["_vic", "_path", "_wep", "_magsHere", "_pylons"];
|
||||
|
||||
if (_path isEqualTo []) then {_path = [-1]};
|
||||
// "debug_console" callExtension (_wep + "#0100");
|
||||
if (_wep in [
|
||||
"rhs_weap_MASTERSAFE",
|
||||
"rhs_weap_fcs_ammo",
|
||||
"rhs_weap_laserDesignator_AI",
|
||||
"rhs_weap_fcs_ah64",
|
||||
"rhs_weap_DummyLauncher",
|
||||
"rhs_weap_fcs_nolrf_ammo",
|
||||
"rhsusf_weap_duke",
|
||||
"TruckHorn",
|
||||
"TruckHorn2",
|
||||
"TruckHorn3"
|
||||
]) exitWith {[[]]};
|
||||
|
||||
private _thisArr = [];
|
||||
_wepConfig = (configFile >> "CfgWeapons" >> _wep);
|
||||
_wepDisp = [(_wepConfig >> "displayName"), "STRING", "Weapon"] call CBA_fnc_getConfigEntry;
|
||||
if (_wep == "rhs_weap_smokegen") then {_wepDisp = "Smoke Generator"};
|
||||
if (_wepDisp isEqualTo "") exitWith {[[]]};
|
||||
|
||||
// "debug_console" callExtension (_wepDisp + "#0100");
|
||||
_magsToCheck = (_vic magazinesTurret _path);
|
||||
|
||||
|
||||
// See if the first default magazine in the config of this weapon is meant to be used on a pylon. If so, process differently
|
||||
// _mag1pylonWeapon = "";
|
||||
// _magsConfigArr = [(_wepConfig >> "magazines"), "ARRAY", []] call CBA_fnc_getConfigEntry;
|
||||
// if (_magsConfigArr isEqualTo []) then {
|
||||
// _mag1pylonWeapon = "";
|
||||
// } else {
|
||||
// _mag1Name = _magsConfigArr # 0;
|
||||
// _mag1pylonWeapon = [(configFile >> "CfgMagazines" >> _mag1Name >> "pylonWeapon"), "STRING", ""] call CBA_fnc_getConfigEntry;
|
||||
// };
|
||||
|
||||
_pylonMagNames = _pylons apply {_x # 3};
|
||||
|
||||
_compatMagsRef = [_wepConfig, true] call CBA_fnc_compatibleMagazines;
|
||||
_magsFound = _compatMagsRef select {_magsToCheck find _x != -1};
|
||||
|
||||
private _magsArr = [];
|
||||
|
||||
if (!((_magsFound # 0) in _pylonMagNames)) then {
|
||||
// Not a pylon weapon, so check mags in turret storage
|
||||
_thisArr pushBack format[" <font color='#87ffbb' face='PuristaSemiBold'>%1</font>", _wepDisp];
|
||||
{
|
||||
_thisMag = _x;
|
||||
_magAmmo = _vic magazineTurretAmmo [_x, _path];
|
||||
_magCount = (_magsHere select {_x # 0 == _thisMag} apply {_x # 1}) # 0;
|
||||
|
||||
private _magConfig = (configFile >> "CfgMagazines" >> _thisMag);
|
||||
private _magName = [(_magConfig >> "displayName"), "STRING", "Magazine"] call CBA_fnc_getConfigEntry;
|
||||
if (_magName isEqualTo "") then {_magName = "Magazine"};
|
||||
|
||||
|
||||
|
||||
_magsArr pushBack format[
|
||||
" + <font color='#4de4ff' size='12' face='PuristaMedium'><font color='#ffffff'>%1</font> <font color='#c2c2c2'>|</font> %2 <font color='#c2c2c2'>rounds</font> <font color='#c2c2c2'>|</font> %3 <font color='#c2c2c2'>mags</font></font>",
|
||||
_magName,
|
||||
_magAmmo,
|
||||
_magCount
|
||||
];
|
||||
} forEach _magsFound;
|
||||
} else {
|
||||
// This is a pylon weapon, so make a unique entry and directly check ammo on pylon
|
||||
_thisArr pushBack format[" <font color='#87ffbb' face='PuristaSemiBold'>%1</font> <font face='PuristaMedium'>[Pylon]</font>", _wepDisp];
|
||||
};
|
||||
|
||||
_thisArr pushBack _magsArr;
|
||||
// "debug_console" callExtension (str _magsArr + "#0100");
|
||||
_thisArr;
|
||||
// _thisArr;
|
||||
// "debug_console" callExtension (format[
|
||||
// " %1 | %2 rounds | %3 mags#0110",
|
||||
// getText(configFile >> "CfgMagazines" >> _thisMag >> "displayName"),
|
||||
// _magAmmo,
|
||||
// _magCount
|
||||
// ]);
|
||||
@@ -1,17 +0,0 @@
|
||||
#include "..\script_component.hpp"
|
||||
|
||||
// get all starting assets at each base and combine to array
|
||||
private _startingAssetsByBase = call FUNC(getStartingAssetsByBase);
|
||||
private _startingAssets = [];
|
||||
{
|
||||
_startingAssets append (_x#1);
|
||||
} forEach _startingAssetsByBase;
|
||||
|
||||
// get all current assets at each base and combine to array
|
||||
private _assetsByBase = call FUNC(getCurrentAssetsByBase);
|
||||
private _assets = [];
|
||||
{
|
||||
_assets append (_x#1);
|
||||
} forEach _assetsByBase;
|
||||
|
||||
[_startingAssets, _assets];
|
||||
@@ -1,6 +0,0 @@
|
||||
#include "../script_component.hpp"
|
||||
|
||||
// return each base with its assets
|
||||
GVARMAIN(baseObjects) apply {
|
||||
[_x, _x getVariable [QGVAR(assetsStartedAtThisBase), []]]
|
||||
};
|
||||
@@ -1,166 +0,0 @@
|
||||
params ["_vic"];
|
||||
|
||||
private _title = [];
|
||||
private _image = [];
|
||||
private _info = [];
|
||||
private _capacity = [];
|
||||
|
||||
// Excluded 2024-02-01
|
||||
// private _weapons = [];
|
||||
// private _pylonWeapons = [];
|
||||
// private _inventory = [];
|
||||
|
||||
|
||||
private _vicConfig = configOf _vic;
|
||||
private _class = configName _vicConfig;
|
||||
private _objType = (_vic call BIS_fnc_objectType) select 1;
|
||||
private _dispName = getText(_vicConfig >> 'displayName');
|
||||
|
||||
// "debug_console" callExtension (format["VehicleName = %1", _dispName] + "#0110");
|
||||
|
||||
private _cat = getText(_vicConfig >> 'category');
|
||||
private _fac = getText(_vicConfig >> 'faction');
|
||||
private _side = [getNumber(_vicConfig >> 'side')] call BIS_fnc_sideName;
|
||||
private _canFloat = (_vicConfig >> "canFloat") call BIS_fnc_getCfgDataBool;
|
||||
|
||||
private _totalSeats = [_class, true] call BIS_fnc_crewCount; // Number of total seats: crew + non-FFV cargo/passengers + FFV cargo/passengers
|
||||
private _crewSeats = [_class, false] call BIS_fnc_crewCount; // Number of crew seats only
|
||||
private _driverSeats = fullcrew [_vic, "driver", true];
|
||||
private _gunnerSeats = fullCrew [_vic, "gunner", true];
|
||||
private _commanderSeats = fullCrew [_vic, "commander", true];
|
||||
// _cargoSeats = fullCrew [_vic, "cargo", true];
|
||||
private _cargoSeats = _totalSeats - _crewSeats; // Number of total cargo/passenger seats: non-FFV + FFV
|
||||
private _turretSeatsRaw = fullCrew [_vic, "turret", true];
|
||||
private _turretSeats = _turretSeatsRaw select {(_x # 4) isEqualTo false};
|
||||
private _ffvSeats = _turretSeatsRaw select {(_x # 4) isEqualTo true};
|
||||
|
||||
private _pylons = getAllPylonsInfo _vic;
|
||||
|
||||
///////////////////////////////////////////////
|
||||
// WRITE TITLE
|
||||
///////////////////////////////////////////////
|
||||
_title pushBack format["%1", _dispName];
|
||||
|
||||
///////////////////////////////////////////////
|
||||
// WRITE IMAGE
|
||||
///////////////////////////////////////////////
|
||||
// Editor preview image
|
||||
_image pushBack format["<img width='200' image='%1'/>", getText(_vicConfig >> 'editorPreview')];
|
||||
_image pushBack linebreak;
|
||||
// Thumbnail image
|
||||
// _image pushBack format["<img width='128' height='64' image='%1'/>", getText(_vicConfig >> 'picture')];
|
||||
// _image pushBack linebreak;
|
||||
|
||||
///////////////////////////////////////////////
|
||||
// WRITE INFO
|
||||
///////////////////////////////////////////////
|
||||
_info pushBack format["<font size='14' color='#e1701a' face='PuristaBold'>INFO</font>"];
|
||||
_info pushBack format["<font face='PuristaMedium'> Classname: %1", _class];
|
||||
_info pushBack format[" Side: %1", _side];
|
||||
_info pushBack format[" Category: %1", _objType];
|
||||
_info pushBack format[" Faction: %1", _fac];
|
||||
_info pushBack format[" Can Float: %1", _canFloat];
|
||||
|
||||
///////////////////////////////////////////////
|
||||
// WRITE CAPACITY
|
||||
///////////////////////////////////////////////
|
||||
_capacity pushBack format["<font size='14' color='#e1701a' face='PuristaBold'>CAPACITY: %1</font>", _totalSeats];
|
||||
_capacity pushBack format["<font face='PuristaMedium'> Driver Seats: %1", count _driverSeats];
|
||||
_capacity pushBack format[" Gunner Seats: %1", count _gunnerSeats];
|
||||
_capacity pushBack format[" Commander Seats: %1", count _commanderSeats];
|
||||
_capacity pushBack format[" Turret Seats: %1", count _turretSeats];
|
||||
_capacity pushBack format[" Cargo Seats: %1", _cargoSeats];
|
||||
_capacity pushBack format[" FFV Seats: %1</font>", count _ffvSeats];
|
||||
|
||||
///////////////////////////////////////////////
|
||||
// GATHER WEAPONS AVAILABLE TO SEATS AND TURRETS
|
||||
// EXCLUDED 2024-02-01
|
||||
///////////////////////////////////////////////
|
||||
// _weapons pushBack format["<font size='14' color='#e1701a' face='PuristaBold'>WEAPONS</font>"];
|
||||
// // DRIVER
|
||||
// [_driverSeats apply {_x # 3}, "DRIVER/PILOT", _weapons] call milsim_fbcb2_assets_fnc_getWeaponry;
|
||||
|
||||
// //GUNNER
|
||||
// [_gunnerSeats apply {_x # 3}, "GUNNER/COPILOT", _weapons] call milsim_fbcb2_assets_fnc_getWeaponry;
|
||||
|
||||
// // COMMANDER
|
||||
// // "debug_console" callExtension ("COMMANDER" + "#1100");
|
||||
// [_commanderSeats apply {_x # 3}, "COMMANDER", _weapons] call milsim_fbcb2_assets_fnc_getWeaponry;
|
||||
|
||||
// // TURRETS
|
||||
// [_turretSeats apply {_x # 3}, "TURRET", _weapons] call milsim_fbcb2_assets_fnc_getWeaponry;
|
||||
|
||||
///////////////////////////////////////////////
|
||||
// GATHER PYLON WEAPONS WITH AMMO
|
||||
// EXCLUDED 2024-02-01
|
||||
///////////////////////////////////////////////
|
||||
|
||||
// _pilotWeps = [];
|
||||
// _otherWeps = [];
|
||||
|
||||
// _parsePylonWeapons = {
|
||||
// params ["_input"];
|
||||
// _input params ["_index", "_name", "_turretPath", "_magazine","_ammoCount","_id"];
|
||||
// // "debug_console" callExtension (str _turretPath + "~0000");
|
||||
|
||||
// _magName = getText(configFile >> "CfgMagazines" >> _magazine >> "displayName");
|
||||
// if (_magName isEqualTo "") exitWith {};
|
||||
|
||||
// if (_turretPath isEqualTo [-1]) then {
|
||||
// _pilotWeps pushBack format[
|
||||
// " <font color='#87ffbb' face='PuristaSemiBold'>%1</font> <font face='PuristaMedium'><font color='#c2c2c2'>|</font> <font color='#4de4ff'>%2</font> <font color='#c2c2c2'>rounds</font></font>",
|
||||
// _magName,
|
||||
// _ammoCount
|
||||
// ];
|
||||
// } else {
|
||||
// _otherWeps pushBack format[
|
||||
// " <font color='#87ffbb' face='PuristaSemiBold'>%1</font> <font face='PuristaMedium'><font color='#c2c2c2'>|</font> <font color='#4de4ff'>%2</font> <font color='#c2c2c2'>rounds</font></font>",
|
||||
// _magName,
|
||||
// _ammoCount
|
||||
// ];
|
||||
// };
|
||||
// };
|
||||
|
||||
///////////////////////////////////////////////
|
||||
// WRITE PYLON WEAPONS
|
||||
///////////////////////////////////////////////
|
||||
|
||||
// if (count _pylons > 0) then {
|
||||
// _pylonWeapons pushBack format["<font size='14' color='#e1701a' face='PuristaBold'>PYLON WEAPONS</font>"];
|
||||
// {
|
||||
// [_x] call _parsePylonWeapons;
|
||||
// } forEach _pylons;
|
||||
// _pylonWeapons pushBack format[" <font color='#f6dcbf' face='PuristaSemiBold'>PILOT</font>"];
|
||||
// {
|
||||
// _pylonWeapons pushBack _x;
|
||||
// } forEach _pilotWeps;
|
||||
// _pylonWeapons pushBack format[" <font color='#f6dcbf' face='PuristaSemiBold'>GUNNER</font>"];
|
||||
// {
|
||||
// _pylonWeapons pushBack _x;
|
||||
// } forEach _otherWeps;
|
||||
// };
|
||||
|
||||
///////////////////////////////////////////////
|
||||
// GATHER INVENTORY
|
||||
// EXCLUDED 2024-02-01
|
||||
///////////////////////////////////////////////
|
||||
// _invLines = [_vic] call milsim_fbcb2_assets_fnc_getInventory;
|
||||
// if (count _invLines > 0) then {
|
||||
// _inventory pushBack format["<font size='14' color='#e1701a' face='PuristaBold'>INVENTORY</font>"];
|
||||
// _inventory append _invLines;
|
||||
// };
|
||||
|
||||
|
||||
///////////////////////////////////////////////
|
||||
// CLOSE AND RETURN
|
||||
///////////////////////////////////////////////
|
||||
|
||||
[_vicConfig, _dispName, [
|
||||
_title joinString "<br/>",
|
||||
_image joinString "<br/>",
|
||||
_info joinString "<br/>",
|
||||
_capacity joinString "<br/>"
|
||||
// _weapons joinString "<br/>",
|
||||
// _pylonWeapons joinString "<br/>",
|
||||
// _inventory joinString "<br/>"
|
||||
]];
|
||||
@@ -1,55 +0,0 @@
|
||||
params ["_turretPaths", "_seatCategory", "_outArr"];
|
||||
{
|
||||
_path = _x;
|
||||
if (_path isEqualTo []) then {_path = [-1]};
|
||||
_weps = _vic weaponsTurret _path;
|
||||
private _thisArr = [];
|
||||
if (count _weps isNotEqualTo 0) then {
|
||||
_magsHere = _vic magazinesTurret _path call BIS_fnc_consolidateArray;
|
||||
|
||||
private _wepMags = [];
|
||||
{
|
||||
private _wepDet = [_vic, _path, _x, _magsHere, _pylons] call milsim_fbcb2_assets_fnc_getMagsForWeapon;
|
||||
if (!(_wepDet isEqualTo [[]])) then {
|
||||
_wepMags pushBack _wepDet;
|
||||
};
|
||||
} forEach _weps;
|
||||
|
||||
if (count _wepMags > 0) then {
|
||||
// "debug_console" callExtension (format["_wepMags Driver = %1", [_wepMags] call CBA_fnc_encodeJSON] + "#1100");
|
||||
{
|
||||
_thisArr pushBack _x # 0;
|
||||
if (count _x > 1) then {
|
||||
{
|
||||
_thisArr pushBack _x;
|
||||
} forEach (_x # 1);
|
||||
}
|
||||
} forEach _wepMags;
|
||||
};
|
||||
};// else {
|
||||
// "debug_console" callExtension (format["Running Mags Only."] + "#1100");
|
||||
// "debug_console" callExtension (format["Vic: %1",_vic] + "#1100");
|
||||
// "debug_console" callExtension (format["Path: %1", _path] + "#1100");
|
||||
// _mags = ([_vic, _path] call _getMags);
|
||||
|
||||
// if (count _mags > 0) then {
|
||||
// {
|
||||
// _thisArr pushBack _x;
|
||||
// } forEach _mags;
|
||||
// };
|
||||
// };
|
||||
|
||||
if (count _thisArr > 0) then {
|
||||
private _turretConfig = [_vic, _x] call BIS_fnc_turretConfig;
|
||||
private _turretDisplayName = [_turretConfig] call BIS_fnc_displayName;
|
||||
if (_turretDisplayName != "") then {
|
||||
_outArr pushBack format[" <font color='#f6dcbf' face='PuristaSemiBold'>%1 (""%2"")</font>", _seatCategory, _turretDisplayName];
|
||||
} else {
|
||||
_outArr pushBack format[" <font color='#f6dcbf' face='PuristaSemiBold'>%1</font>", _seatCategory];
|
||||
};
|
||||
|
||||
{
|
||||
_outArr pushBack _x;
|
||||
} forEach _thisArr;
|
||||
}
|
||||
} forEach _turretPaths;
|
||||
@@ -1,94 +0,0 @@
|
||||
#include "..\script_component.hpp"
|
||||
|
||||
// get vehicles the mission started with at base locations
|
||||
(call FUNC(getStartingAndCurrentAssets)) params [
|
||||
"_startingAssets",
|
||||
"_currentAssets"
|
||||
];
|
||||
|
||||
// get distinct classnames to group by
|
||||
private _distinctStartingAssetsClassNames = [];
|
||||
{
|
||||
_x params ["_netId", "_cfg"];
|
||||
private _className = configName _cfg;
|
||||
_distinctStartingAssetsClassNames pushBackUnique _className;
|
||||
} forEach _startingAssets;
|
||||
|
||||
// get the approved assets config to identify callsigns
|
||||
private _approvedAssetsCfg = call EFUNC(common,getApprovedAssetsCfg);
|
||||
if (isNull _approvedAssetsCfg) exitWith {
|
||||
[
|
||||
LEVEL_ERROR,
|
||||
QUOTE(COMPONENT),
|
||||
"No approved assets defined.",
|
||||
[]
|
||||
] call EFUNC(common,log);
|
||||
[
|
||||
"ERROR: No approved assets defined. See defines/ApprovedAssets.hpp"
|
||||
] call BIS_fnc_error;
|
||||
};
|
||||
|
||||
_text = parseText "<t size='4'>MESSAGE</t>";
|
||||
_text = composeText [_text, lineBreak ];
|
||||
|
||||
_text = composeText [_text, parseText "<t align='left' size='2'>Asset</t><t align='right' size='2'>Available</t>", lineBreak ];
|
||||
|
||||
{
|
||||
private _className = _x;
|
||||
// only approved assets
|
||||
if (!isClass (_approvedAssetsCfg >> _className)) then {continue};
|
||||
|
||||
private _callsign = [_className] call FUNC(getCallsignFromClassname);
|
||||
|
||||
private _startingAssetsOfThisType = _startingAssets select {
|
||||
// select all starting assets of this type
|
||||
_x params ["_netId", "_cfg"];
|
||||
_className isEqualTo (configName _cfg);
|
||||
};
|
||||
private _currentAssetsOfThisType = _currentAssets select {
|
||||
_x params ["_netId", "_cfg"];
|
||||
private _object = _netId call BIS_fnc_objectFromNetId;
|
||||
// objNull if deleted, then check classname and if alive
|
||||
!isNull _object && {
|
||||
_className isEqualTo (typeOf _object) &&
|
||||
alive _object
|
||||
};
|
||||
};
|
||||
|
||||
(_startingAssetsOfThisType#0) params [
|
||||
"_assetNetId",
|
||||
"_assetCfg"
|
||||
];
|
||||
|
||||
_assigned = count _startingAssetsOfThisType;
|
||||
_available = count _currentAssetsOfThisType;
|
||||
// count (getMarkerPos "respawn_west" nearEntities [ _asset, 2000] );
|
||||
|
||||
|
||||
_image = getText(_assetCfg >> "picture");
|
||||
|
||||
_name = getText(_assetCfg >> "displayName") select [0, 22];
|
||||
private _data = format[
|
||||
"<img size='1' align='left' image='%1'/><t size='1' align='left'> %2</t><t size='1' align='right'>%3 [ %4 ]</t>",
|
||||
_image,
|
||||
_name,
|
||||
_available,
|
||||
_assigned
|
||||
];
|
||||
|
||||
// private _data = format[
|
||||
// "<img size='1' align='left' image='%1'/>
|
||||
// <t size='1' align='left'> %2</t>
|
||||
// <t size='1' align='middle'>%3</t>
|
||||
// <t size='1' align='right'>%4</t>",
|
||||
// _image,
|
||||
// _name,
|
||||
// _assigned,
|
||||
// _available
|
||||
// ];
|
||||
_text = composeText[ _text, parseText _data, lineBreak ];
|
||||
|
||||
|
||||
} foreach _distinctStartingAssetsClassNames;
|
||||
|
||||
hint _text;
|
||||
@@ -1,28 +0,0 @@
|
||||
#include "..\script_component.hpp"
|
||||
|
||||
if (!hasInterface) exitWith {};
|
||||
|
||||
call FUNC(updateAssetDiary);
|
||||
|
||||
// once the server has published that assets have been gathered and distributed to bases (respawn modules),
|
||||
// we can update the asset diary on our end using that data
|
||||
[QGVAR(assetsGathered), {
|
||||
[
|
||||
LEVEL_DEBUG,
|
||||
QUOTE(COMPONENT),
|
||||
"Received gathered base asset data from server",
|
||||
[]
|
||||
] call EFUNC(common,log);
|
||||
|
||||
// update the asset diary with the data we've received
|
||||
FUNC(updateAssetDiary);
|
||||
}] call CBA_fnc_addEventHandlerArgs;
|
||||
|
||||
[
|
||||
LEVEL_DEBUG,
|
||||
QUOTE(COMPONENT),
|
||||
"initClient complete",
|
||||
[]
|
||||
] call EFUNC(common,log);
|
||||
|
||||
localNamespace setVariable [QGVAR(complete), true];
|
||||
@@ -1,29 +0,0 @@
|
||||
#include "..\script_component.hpp"
|
||||
|
||||
if (!isServer) exitWith {};
|
||||
|
||||
// init asset stores at bases
|
||||
[true] call FUNC(updateAssetsByBase);
|
||||
|
||||
// starting 5 minutes after postInit, update asset stores every 5 minutes
|
||||
[{
|
||||
[
|
||||
{[false] call FUNC(updateAssetsByBase);},
|
||||
60*5
|
||||
] call CBA_fnc_addPerFrameHandler;
|
||||
}, 60*5] call CBA_fnc_waitAndExecute;
|
||||
|
||||
|
||||
// add end mission EH
|
||||
addMissionEventHandler ["MPEnded", {
|
||||
// log the "current" asset counts to RPT
|
||||
[false, true] call FUNC(updateAssetsByBase);
|
||||
}];
|
||||
|
||||
|
||||
[
|
||||
LEVEL_DEBUG,
|
||||
QUOTE(COMPONENT),
|
||||
"postInit complete",
|
||||
[]
|
||||
] call EFUNC(common,log);
|
||||
@@ -1,8 +0,0 @@
|
||||
#include "..\script_component.hpp"
|
||||
|
||||
params [["_asset", objNull, [objNull]]];
|
||||
|
||||
private _closestBase = [_asset] call EFUNC(common,getNearestBase);
|
||||
if (isNull _closestBase) exitWith {false};
|
||||
|
||||
(_asset distance2D _closestBase) <= GVAR(setting_detectionRangeFromBase)
|
||||
@@ -1,18 +0,0 @@
|
||||
#include "..\script_component.hpp"
|
||||
|
||||
if (!hasInterface) exitWith {};
|
||||
|
||||
{
|
||||
private _diarySubject = _x;
|
||||
private _records = player allDiaryRecords _diarySubject;
|
||||
if (count _records isEqualTo 0) then {continue};
|
||||
|
||||
{
|
||||
private _diaryRecord = _x select -1;
|
||||
player removeDiaryRecord [_diarySubject, _diaryRecord];
|
||||
} forEach _records;
|
||||
} forEach [
|
||||
EGVAR(fbcb2_main,subjectAssetsFixedWingID),
|
||||
EGVAR(fbcb2_main,subjectAssetsRotaryID),
|
||||
EGVAR(fbcb2_main,subjectAssetsGroundID)
|
||||
];
|
||||
@@ -1,24 +0,0 @@
|
||||
#include "..\script_component.hpp"
|
||||
|
||||
private _baseMarkerStore = localNamespace getVariable [
|
||||
QGVAR(baseMarkerStore),
|
||||
[]
|
||||
];
|
||||
private _assetMarkerStore = localNamespace getVariable [
|
||||
QGVAR(assetMarkerStore),
|
||||
[]
|
||||
];
|
||||
|
||||
// delete markers
|
||||
{
|
||||
deleteMarkerLocal (_x#1);
|
||||
} forEach (_baseMarkerStore + _assetMarkerStore);
|
||||
|
||||
localNamespace setVariable [
|
||||
QGVAR(baseMarkerStore),
|
||||
[]
|
||||
];
|
||||
localNamespace setVariable [
|
||||
QGVAR(assetMarkerStore),
|
||||
[]
|
||||
];
|
||||
@@ -1,111 +0,0 @@
|
||||
#include "..\script_component.hpp"
|
||||
|
||||
params [
|
||||
["_className", "", [""]],
|
||||
["_markerType", "hd_dot", [""]],
|
||||
["_markerColor", "", [""]],
|
||||
["_assetObjects", [], []]
|
||||
];
|
||||
|
||||
if (count _className isEqualTo 0) exitWith {
|
||||
["No class name provided!"] call BIS_fnc_error;
|
||||
};
|
||||
if (count _markerColor isEqualTo 0) exitWith {
|
||||
["No marker color provided!"] call BIS_fnc_error;
|
||||
};
|
||||
if (count _assetObjects isEqualTo 0) exitWith {
|
||||
["No vehicles to draw markers for!"] call BIS_fnc_error;
|
||||
};
|
||||
|
||||
private _baseMarkerStoreVar = QGVAR(baseMarkerStore);
|
||||
private _assetMarkerStoreVar = QGVAR(assetMarkerStore);
|
||||
|
||||
private _baseMarkerStore = localNamespace getVariable [
|
||||
_baseMarkerStoreVar,
|
||||
[]
|
||||
];
|
||||
private _assetMarkerStore = localNamespace getVariable [
|
||||
_assetMarkerStoreVar,
|
||||
[]
|
||||
];
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// Create base markers if not already present
|
||||
if (not (count _baseMarkerStore > 0)) then {
|
||||
{ // milsim_baseObjects is accessed directly, so are valid objects
|
||||
private _base = _x;
|
||||
|
||||
// create a circle marker with range as the detection range of assets
|
||||
_newMarker = createMarkerLocal [
|
||||
format["%1_%2", QGVAR(baseCircleMarker), _forEachIndex + 1],
|
||||
getPosASL _base
|
||||
];
|
||||
_newMarker setMarkerTypeLocal "mil_dot";
|
||||
_newMarker setMarkerColorLocal "ColorGreen";
|
||||
_newMarker setMarkerShapeLocal "ELLIPSE";
|
||||
_newMarker setMarkerSizeLocal [
|
||||
GVAR(setting_detectionRangeFromBase),
|
||||
GVAR(setting_detectionRangeFromBase)
|
||||
];
|
||||
_newMarker setMarkerAlphaLocal 0.5;
|
||||
_newMarker setMarkerTextLocal str(_forEachIndex + 1);
|
||||
|
||||
_baseMarkerStore pushBack [
|
||||
_base,
|
||||
_newMarker
|
||||
];
|
||||
|
||||
// create a flag marker at base position
|
||||
_newMarker = createMarkerLocal [
|
||||
format["%1_%2", QGVAR(baseFlagMarker), _forEachIndex + 1],
|
||||
getPosASL _base
|
||||
];
|
||||
_newMarker setMarkerTypeLocal "mil_flag";
|
||||
_newMarker setMarkerColorLocal "ColorGreen";
|
||||
_newMarker setMarkerSizeLocal [0.7, 0.7];
|
||||
_newMarker setMarkerTextLocal ([_base] call EFUNC(common,getNameOfBase));
|
||||
|
||||
_baseMarkerStore pushBack [
|
||||
_base,
|
||||
_newMarker
|
||||
];
|
||||
} forEach GVARMAIN(baseObjects);
|
||||
|
||||
localNamespace setVariable [_baseMarkerStoreVar, _baseMarkerStore];
|
||||
};
|
||||
|
||||
|
||||
private _start = (count _assetMarkerStore) + 1;
|
||||
{ // _assetObjects is a serialized parameter, so we pass the netIds (strings)
|
||||
private _assetNetIdStr = _x;
|
||||
private _asset = _assetNetIdStr call BIS_fnc_objectFromNetId;
|
||||
// if asset was removed since last update
|
||||
if (isNull _asset) then {continue};
|
||||
// check if a marker is already placed for this asset
|
||||
if (
|
||||
(_assetMarkerStore findIf { _x select 0 isEqualTo _asset })
|
||||
> -1
|
||||
) then {continue};
|
||||
|
||||
// check if the asset is within base detection range
|
||||
if (not ([_asset] call FUNC(isAssetInRangeOfBase))) then {continue};
|
||||
|
||||
// create a marker for the asset
|
||||
private _newMarker = createMarkerLocal [
|
||||
format["%1_%2", QGVAR(assetMarker), _start],
|
||||
getPosASL _asset
|
||||
];
|
||||
_newMarker setMarkerAlphaLocal 1;
|
||||
_newMarker setMarkerTypeLocal _markerType;
|
||||
_newMarker setMarkerColorLocal _markerColor;
|
||||
// _newMarker setMarkerTextLocal ([configOf _asset] call BIS_fnc_displayName);
|
||||
|
||||
_assetMarkerStore pushBack [
|
||||
_asset,
|
||||
_newMarker
|
||||
];
|
||||
_start = _start + 1;
|
||||
} forEach _assetObjects;
|
||||
|
||||
// update store var
|
||||
localNamespace setVariable [_assetMarkerStoreVar, _assetMarkerStore];
|
||||
@@ -1,261 +0,0 @@
|
||||
#include "..\script_component.hpp"
|
||||
|
||||
if (!hasInterface) exitWith {};
|
||||
|
||||
// create diary records
|
||||
|
||||
// remove any existing asset map markers
|
||||
call FUNC(removeMarkersOnMap);
|
||||
|
||||
// remove existing asset records
|
||||
call FUNC(removeAssetDiaryRecords);
|
||||
|
||||
(call FUNC(getStartingAndCurrentAssets)) params [
|
||||
"_startingAssets",
|
||||
"_currentAssets"
|
||||
];
|
||||
|
||||
// get distinct vehicle class names
|
||||
private _distinctVehiclesClassNames = [];
|
||||
{
|
||||
_x params ["_netId", "_cfg"];
|
||||
private _className = configName _cfg;
|
||||
_distinctVehiclesClassNames pushBackUnique _className;
|
||||
} forEach _startingAssets;
|
||||
|
||||
|
||||
// for random color cycling
|
||||
private _colorSelectionIndex = 0;
|
||||
private _randomColors = [
|
||||
["ColorRed", "#FF0000", "Red"],
|
||||
["ColorGreen", "#00FF00", "Green"],
|
||||
["ColorBlue", "#0000FF", "Blue"],
|
||||
["ColorYellow", "#FFFF00", "Yellow"],
|
||||
["ColorWhite", "#FFFFFF", "White"]
|
||||
];
|
||||
|
||||
// ForEach unique vehicle class name, we'll find the first and gather its info
|
||||
{
|
||||
private _className = _x;
|
||||
private _vehicleCallsign = toUpper (
|
||||
[_className] call FUNC(getCallsignFromClassname)
|
||||
);
|
||||
|
||||
// Get all starting assets of this type
|
||||
private _startingAssetsOfThisType = _startingAssets select {
|
||||
_x params ["_netId", "_cfg"];
|
||||
_className isEqualTo (configName _cfg);
|
||||
};
|
||||
// Get all current assets of this type
|
||||
private _currentAssetsOfThisType = _currentAssets select {
|
||||
_x params ["_netId", "_cfg"];
|
||||
private _object = _netId call BIS_fnc_objectFromNetId;
|
||||
// objNull if deleted, then check classname and if alive
|
||||
!isNull _object && {_className isEqualTo (typeOf _object) && alive _object};
|
||||
};
|
||||
// This should never happen, but...
|
||||
if (count _startingAssetsOfThisType isEqualTo 0) then {continue};
|
||||
|
||||
// Try to find a not null vehicle that can be processed
|
||||
private _exampleVehicleToProcess = objNull;
|
||||
private _assetCfg = configNull;
|
||||
|
||||
private _exampleVehicleToProcessIndex = _startingAssetsOfThisType findIf {
|
||||
_x params ["_netId", "_cfg"];
|
||||
!isNull (_netId call BIS_fnc_objectFromNetId);
|
||||
};
|
||||
// If found, get the data
|
||||
if (_exampleVehicleToProcessIndex > -1) then {
|
||||
private _exampleData = _startingAssetsOfThisType select _exampleVehicleToProcessIndex;
|
||||
_assetNetId = _exampleData#0;
|
||||
_assetCfg = _exampleData#1;
|
||||
_exampleVehicleToProcess = _assetNetId call BIS_fnc_objectFromNetId;
|
||||
} else {
|
||||
// otherwise, we only have the config to work with
|
||||
private _exampleData = _startingAssetsOfThisType#0;
|
||||
_assetCfg = _exampleData#1;
|
||||
};
|
||||
|
||||
private _parentClassNames = [_assetCfg, true] call BIS_fnc_returnParents;
|
||||
|
||||
|
||||
|
||||
// Process the vehicle for extended info
|
||||
// Exclusion list for display names
|
||||
if (
|
||||
[_assetCfg] call BIS_fnc_displayName
|
||||
in ["Helicopter"]
|
||||
) then {continue};
|
||||
|
||||
// Get the vehicle data
|
||||
private _processed = [configNull, "", []];
|
||||
if (!isNull _exampleVehicleToProcess) then {
|
||||
_processed = [_exampleVehicleToProcess] call FUNC(getVehicleData);
|
||||
};
|
||||
_processed params ["_processedVehicleCfg", "_displayName", "_diaryTextSections"];
|
||||
_diaryTextSections params [
|
||||
["_title", "", [""]],
|
||||
["_image", "", [""]],
|
||||
["_info", "", [""]],
|
||||
["_capacity", "", [""]]
|
||||
// ["_weapons", "", [""]],
|
||||
// ["_pylonWeapons", "", [""]],
|
||||
// ["_inventory", "", [""]]
|
||||
];
|
||||
|
||||
// Get what we can from the vehicle cfg
|
||||
|
||||
// Create the diary record
|
||||
private _recordText = [];
|
||||
// Add the title and image
|
||||
if (count _title isEqualTo 0) then {
|
||||
_title = format["%1", [_assetCfg] call BIS_fnc_displayName];
|
||||
};
|
||||
_recordText pushBack format[
|
||||
"<font size='24' shadow='1' color='#e1701a' face='PuristaBold'>%1</font>",
|
||||
_title
|
||||
];
|
||||
if (count _image isEqualTo 0) then {
|
||||
_image = format["<img width='200' image='%1'/>", getText(_assetCfg >> 'editorPreview')];
|
||||
};
|
||||
_recordText pushBack _image;
|
||||
_recordText pushBack "<br/>";
|
||||
_recordText pushBack format[
|
||||
"CALLSIGN: %1",
|
||||
_vehicleCallsign
|
||||
];
|
||||
_recordText pushBack format[
|
||||
"COUNT STARTED: %1",
|
||||
count _startingAssetsOfThisType
|
||||
];
|
||||
_recordText pushBack format[
|
||||
"COUNT ACTIVE: %1",
|
||||
count _currentAssetsOfThisType
|
||||
];
|
||||
|
||||
// Here, we'll create a link to show markers on the map for all vehicles of this kind
|
||||
// get 'picture' for record
|
||||
private _icon = getText(_assetCfg >> "picture");
|
||||
// determine marker type
|
||||
private _markerType = "mil_dot";
|
||||
switch (true) do {
|
||||
case ("Helicopter" in _parentClassNames): {
|
||||
_markerType = "loc_heli";
|
||||
};
|
||||
case ("Air" in _parentClassNames): {
|
||||
_markerType = "loc_plane";
|
||||
};
|
||||
case ("Ship" in _parentClassNames): {
|
||||
_markerType = "loc_boat";
|
||||
};
|
||||
case ("Car" in _parentClassNames): {
|
||||
_markerType = "loc_car";
|
||||
};
|
||||
default {
|
||||
_markerType = "loc_truck";
|
||||
};
|
||||
};
|
||||
|
||||
private "_randomColor";
|
||||
if (_colorSelectionIndex < count _randomColors) then {
|
||||
_randomColor = _randomColors select _colorSelectionIndex;
|
||||
INC(_colorSelectionIndex);
|
||||
} else {
|
||||
_colorSelectionIndex = 0;
|
||||
_randomColor = _randomColors select _colorSelectionIndex;
|
||||
};
|
||||
|
||||
// Link to show markers
|
||||
private _showMarkersText = format[
|
||||
"<execute expression='[""%1"",""%2"",""%3"",%4] call %5'>SHOW MARKERS for vehicles at base</execute> (in %6)",
|
||||
_className,
|
||||
_markerType,
|
||||
_randomColor#0,
|
||||
(_currentAssetsOfThisType apply {
|
||||
_x params ["_netId", "_cfg"];
|
||||
_netId;
|
||||
}),
|
||||
QFUNC(showMarkersOnMap),
|
||||
format["<font color='%1'>%2</font>", _randomColor#1, _randomColor#2]
|
||||
];
|
||||
_recordText pushBack _showMarkersText;
|
||||
|
||||
// Link to hide markers
|
||||
_recordText pushBack format[
|
||||
"<execute expression=""call %1"">REMOVE ALL MARKERS showing asset positions</execute>",
|
||||
QFUNC(removeMarkersOnMap)
|
||||
];
|
||||
|
||||
// Link to update asset diary entries
|
||||
_recordText pushBack format[
|
||||
"<execute expression=""call %1"">UPDATE ENTRIES for all assets</execute>",
|
||||
QFUNC(updateAssetDiary)
|
||||
];
|
||||
|
||||
// link to display hint with all assets
|
||||
_recordText pushBack format[
|
||||
"<execute expression=""call %1"">SHOW APPROVED ASSET COUNTS via hint</execute>",
|
||||
QFUNC(hintAllApprovedAssets)
|
||||
];
|
||||
|
||||
_recordText pushBack format[
|
||||
"<font size='10' color='#777777'>%1</font>",
|
||||
"Notes:<br/>
|
||||
- Markers are only displayed on your local machine.<br/>
|
||||
- The REMOVE ALL option will remove all assets' markers from the map.<br/>
|
||||
- UPDATE ENTRIES will update the asset diary with the latest information.<br/>
|
||||
- Markers will only be displayed for assets that are within a certain distance of a base."
|
||||
];
|
||||
|
||||
|
||||
|
||||
// Add info and capacity sections - exclude if no living examples were found
|
||||
if (count _info > 0) then {
|
||||
_recordText pushBack _info;
|
||||
};
|
||||
if (count _capacity > 0) then {
|
||||
_recordText pushBack _capacity;
|
||||
};
|
||||
|
||||
|
||||
private _subjectID = "";
|
||||
switch (true) do {
|
||||
case ("Helicopter" in _parentClassNames): {
|
||||
_subjectID = EGVAR(fbcb2_main,subjectAssetsRotaryID);
|
||||
};
|
||||
case ("Air" in _parentClassNames): {
|
||||
_subjectID = EGVAR(fbcb2_main,subjectAssetsFixedWingID);
|
||||
};
|
||||
default {
|
||||
_subjectID = EGVAR(fbcb2_main,subjectAssetsGroundID);
|
||||
};
|
||||
};
|
||||
|
||||
[
|
||||
_subjectID,
|
||||
format[
|
||||
"[%1/%2] %3",
|
||||
count _currentAssetsOfThisType,
|
||||
count _startingAssetsOfThisType,
|
||||
(_assetCfg) call BIS_fnc_displayName
|
||||
],
|
||||
_recordText joinString "<br/>",
|
||||
_icon
|
||||
] call EFUNC(common,createOrUpdateDiaryRecord);
|
||||
|
||||
// "\A3\ui_f\data\igui\cfg\simpleTasks\types\car_ca.paa"
|
||||
} forEach _distinctVehiclesClassNames;
|
||||
|
||||
// log to RPT
|
||||
[
|
||||
LEVEL_INFO,
|
||||
QUOTE(COMPONENT),
|
||||
"UPDATED ASSET DIARY",
|
||||
[
|
||||
["startingAssetCount", count _startingAssets],
|
||||
["startingAssetCountDistinct", count _distinctVehiclesClassNames],
|
||||
["currentassetCount", count _currentAssets]
|
||||
]
|
||||
] call EFUNC(common,log);
|
||||
|
||||
true;
|
||||
@@ -1,141 +0,0 @@
|
||||
#include "..\script_component.hpp"
|
||||
|
||||
params [
|
||||
["_isInit", false, [false]],
|
||||
["_logCurrentAssets", false, [false]]
|
||||
];
|
||||
|
||||
if (!isServer) exitWith {};
|
||||
|
||||
GVARMAIN(baseObjects) = allMissionObjects "ModuleRespawnPosition_F";
|
||||
|
||||
// Get all approved assets on map, find the closest base
|
||||
// Then determine if it's within range
|
||||
// If it is, add it to the base's assets list
|
||||
// This is to ensure bases with overlapping detection range don't have duplicate assets
|
||||
private _allVehicles = vehicles;
|
||||
private _allSaved = [];
|
||||
|
||||
private _assetsStartedAtThisBaseVar = QGVAR(assetsStartedAtThisBase);
|
||||
private _assetsAtThisBaseVar = QGVAR(assetsAtThisBase);
|
||||
|
||||
private _approvedAssetsCfg = call EFUNC(common,getApprovedAssetsCfg);
|
||||
if (isNull _approvedAssetsCfg) exitWith {};
|
||||
|
||||
private _currentBaseAssetsGathered = GVARMAIN(baseObjects) apply {[_x, []]};;
|
||||
|
||||
{
|
||||
private _className = configName _x;
|
||||
private _callsign = getText(_x >> "callsign");
|
||||
private _found = _allVehicles select { typeOf _x == _className };
|
||||
{
|
||||
private _asset = _x;
|
||||
|
||||
// ignore assets beyond the range of bases
|
||||
if (not ([_asset] call FUNC(isAssetInRangeOfBase))) then {continue};
|
||||
|
||||
|
||||
// add to base's assets list
|
||||
private _closestBase = [_asset] call EFUNC(common,getNearestBase);
|
||||
private _closestBaseCurrentAssets = (_currentBaseAssetsGathered select { _x select 0 isEqualTo _closestBase })#0#1;
|
||||
_closestBaseCurrentAssets pushBackUnique [
|
||||
_asset call BIS_fnc_netId,
|
||||
configOf _asset
|
||||
];
|
||||
} forEach _found;
|
||||
} forEach (_approvedAssetsCfg call BIS_fnc_returnChildren);
|
||||
|
||||
// Add all ground vehicles (LandVehicle)
|
||||
{
|
||||
private _asset = _x;
|
||||
|
||||
// ignore assets beyond the range of bases
|
||||
if (not ([_asset] call FUNC(isAssetInRangeOfBase))) then {continue};
|
||||
|
||||
// add to base's assets list
|
||||
private _closestBase = [_asset] call EFUNC(common,getNearestBase);
|
||||
private _closestBaseCurrentAssets = (_currentBaseAssetsGathered select { _x select 0 isEqualTo _closestBase })#0#1;
|
||||
_closestBaseCurrentAssets pushBackUnique [
|
||||
_asset call BIS_fnc_netId,
|
||||
configOf _asset
|
||||
];
|
||||
} forEach (_allVehicles select { _x isKindOf "LandVehicle" });
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
// publish updated base variables
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
{
|
||||
private _base = _x;
|
||||
|
||||
private _thisBaseCurrentAssets = (_currentBaseAssetsGathered select { _x select 0 isEqualTo _base })#0#1;
|
||||
_base setVariable [_assetsAtThisBaseVar, _thisBaseCurrentAssets, true];
|
||||
|
||||
if (_isInit) then {
|
||||
_base setVariable [_assetsStartedAtThisBaseVar, _thisBaseCurrentAssets, true];
|
||||
};
|
||||
} forEach GVARMAIN(baseObjects);
|
||||
|
||||
// send a CBA event to let other scripts know that assets have been gathered
|
||||
[{[QGVAR(assetsGathered)] call CBA_fnc_globalEvent;}, 2] call CBA_fnc_waitAndExecute;
|
||||
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
// log starting assets if init
|
||||
// log current assets if requested (for end of mission counts)
|
||||
////////////////////////////////////////////////////////////////////////
|
||||
if !(_isInit || _logCurrentAssets) exitWith {};
|
||||
|
||||
{
|
||||
private _base = _x;
|
||||
|
||||
// get current assets
|
||||
private _baseAssets = (_currentBaseAssetsGathered select { _x select 0 isEqualTo _base })#0#1;
|
||||
|
||||
// prepare key value for logging
|
||||
private _baseAssetsHashesPrep = _baseAssets apply {
|
||||
_x params ["_netId", "_cfg"];
|
||||
[
|
||||
["callsign", [configName _cfg] call FUNC(getCallsignFromClassname)],
|
||||
["className", configName _cfg],
|
||||
["displayName", [_cfg] call BIS_fnc_displayName]
|
||||
];
|
||||
};
|
||||
|
||||
_baseAssetsHashesPrep = _baseAssetsHashesPrep call BIS_fnc_consolidateArray;
|
||||
|
||||
private _baseAssetsHashes = [];
|
||||
{
|
||||
private _out = createHashMapFromArray (_x#0);
|
||||
_out set ["count", _x#1];
|
||||
_baseAssetsHashes pushBack _out;
|
||||
} forEach _baseAssetsHashesPrep;
|
||||
|
||||
// if logging current assets
|
||||
if (_logCurrentAssets) then {
|
||||
{
|
||||
[
|
||||
LEVEL_INFO,
|
||||
QUOTE(COMPONENT),
|
||||
"CURRENT ASSETS",
|
||||
[
|
||||
["baseName", [[_base] call EFUNC(common,getNameOfBase)]],
|
||||
["asset", _x]
|
||||
]
|
||||
] call EFUNC(common,log);
|
||||
} forEach _baseAssetsHashes;
|
||||
};
|
||||
|
||||
// if init, log starting assets
|
||||
if (_isInit) then {
|
||||
{
|
||||
[
|
||||
LEVEL_INFO,
|
||||
QUOTE(COMPONENT),
|
||||
"STARTING ASSETS",
|
||||
[
|
||||
["baseName", [[_base] call EFUNC(common,getNameOfBase)]],
|
||||
["asset", _x]
|
||||
]
|
||||
] call EFUNC(common,log);
|
||||
} forEach _baseAssetsHashes;
|
||||
};
|
||||
} forEach GVARMAIN(baseObjects);
|
||||
@@ -1,3 +0,0 @@
|
||||
#define COMPONENT fbcb2_assets
|
||||
#define COMPONENT_BEAUTIFIED FBCB2 - Assets
|
||||
#include "../script_mod.hpp"
|
||||
@@ -1,112 +0,0 @@
|
||||
#include "..\script_component.hpp"
|
||||
|
||||
private _recordTitle = "ENVIRONMENTAL CONDITIONS";
|
||||
|
||||
private _text = [
|
||||
format[
|
||||
"<font size='%1' color='%2' face='%3'>%4</font>",
|
||||
GVAR(recordTitleSize),
|
||||
GVAR(recordTitleColor),
|
||||
GVAR(recordTitleFont),
|
||||
_recordTitle
|
||||
]
|
||||
];
|
||||
|
||||
private _sunriseColor = "#4A86E8";
|
||||
private _sunsetColor = "#6AA84F";
|
||||
private _whiteColor = "#FFFFFF";
|
||||
|
||||
private _sunTimes = date call BIS_fnc_sunriseSunsetTime;
|
||||
private _nearestBase = [player] call EFUNC(common,getNearestBase);
|
||||
|
||||
if (isNull _nearestBase) exitWith {
|
||||
[
|
||||
LEVEL_WARNING,
|
||||
QUOTE(COMPONENT),
|
||||
"WARNING: No bases found nearby to report weather!",
|
||||
[player, [
|
||||
["position", getPos player]
|
||||
]] call EFUNC(common,addPlayerInfoToArray)
|
||||
] call EFUNC(common,log);
|
||||
["WARNING: No bases found nearby to report weather!"] call BIS_fnc_error;
|
||||
};
|
||||
|
||||
_text pushBack format[
|
||||
"<font size='%1'>Current conditions at nearest weather station: %2</font><br/>",
|
||||
GVAR(recordTextBodySize),
|
||||
[_nearestBase] call EFUNC(common,getNameOfBase)
|
||||
];
|
||||
|
||||
private _weatherData = [];
|
||||
|
||||
if (isClass (configFile >> "CfgPatches" >> "ace_weather")) then {
|
||||
// get ace_weather data
|
||||
private _barometricPressure = ((getPosASL _nearestBase)#2) call ace_weather_fnc_calculateBarometricPressure;
|
||||
private _relHumidity = missionNamespace getVariable ["ace_weather_currentHumidity", 0.5];
|
||||
private _temperature = ((getPosASL _nearestBase)#2) call ace_weather_fnc_calculateTemperatureAtHeight;
|
||||
private _dewPoint = [_temperature, _relHumidity] call ace_weather_fnc_calculateDewPoint;
|
||||
private _windSpeed = [getPosASL _nearestBase, false, false, false] call ace_weather_fnc_calculateWindSpeed;
|
||||
private _windChill = [_temperature, _windSpeed] call ace_weather_fnc_calculateWindChill;
|
||||
private _heatIndex = [_temperature, _relHumidity] call ace_weather_fnc_calculateHeatIndex;
|
||||
|
||||
toFixed 2;
|
||||
private _aceData = [
|
||||
["Temperature", format["%1°C / %2°F", _temperature, _temperature * (9/5) + 32]],
|
||||
["Wind Chill", format["%1°C / %2°F", _windChill, _windChill * (9/5) + 32]],
|
||||
["Heat Index", format["%1°C / %2°F", _heatIndex, _heatIndex * (9/5) + 32]],
|
||||
["Dew Point", format["%1°C / %2°F", _dewPoint, _dewPoint * (9/5) + 32]],
|
||||
["Wind Speed", format["%1mph / %2kph / %3kts", _windSpeed * 2.237, _windSpeed * 3.6, _windSpeed * 1.944]],
|
||||
["Wind Direction", ""],
|
||||
["Barometric Pressure", format["%1 hPA", _barometricPressure]],
|
||||
["Relative Humidity", format["%1%2", _relHumidity * 100, "%"]],
|
||||
["Fog Cover", ""],
|
||||
["Rain", ""],
|
||||
["Overcast", ""]
|
||||
];
|
||||
toFixed -1;
|
||||
|
||||
{
|
||||
_x params ["_name", "_value"];
|
||||
[_weatherData, _name, _value] call BIS_fnc_setToPairs;
|
||||
} forEach _aceData;
|
||||
};
|
||||
|
||||
// always add built-in weather
|
||||
toFixed 2;
|
||||
private _vanillaData = [
|
||||
["Temperature", format["%1°C", (ambientTemperature)#0]],
|
||||
["Fog Cover", format["%1%2", fog * 100, "%"]],
|
||||
["Overcast", format["%1%2", overcast * 100, "%"]],
|
||||
["Rain", format["%1%2", rain * 100, "%"]],
|
||||
["Wind Speed", format["%1m/s", windStr]],
|
||||
["Wind Direction", format["%1°", windDir]]
|
||||
];
|
||||
toFixed -1;
|
||||
|
||||
_vanillaData pushBack ["Sunrise", ([_sunTimes select 0, "HH:MM"] call BIS_fnc_timeToString)];
|
||||
_vanillaData pushBack ["Sunset", ([_sunTimes select 1, "HH:MM"] call BIS_fnc_timeToString)];
|
||||
|
||||
// override or set keys for vanilla data into weather data
|
||||
{
|
||||
_x params ["_name", "_value"];
|
||||
[_weatherData, _name, _value] call BIS_fnc_setToPairs;
|
||||
} forEach _vanillaData;
|
||||
|
||||
// write lines
|
||||
{
|
||||
_x params ["_name", "_value"];
|
||||
_text pushBack format[
|
||||
"<font size='%1' face='EtelkaMonospacePro'>%2%3</font>",
|
||||
GVAR(recordTextBodySize)-4,
|
||||
[_name, "right", " ", 23] call EFUNC(common,padString),
|
||||
_value
|
||||
];
|
||||
} forEach _weatherData;
|
||||
|
||||
_text = _text joinString "<br/>";
|
||||
|
||||
[
|
||||
GVAR(subjectIntelID),
|
||||
_recordTitle,
|
||||
_text
|
||||
] call EFUNC(common,createOrUpdateDiaryRecord);
|
||||
@@ -1,59 +0,0 @@
|
||||
#include "../script_component.hpp"
|
||||
|
||||
private _recordTitle = "SIGNAL COLORS";
|
||||
|
||||
private _text = [
|
||||
// Title
|
||||
format[
|
||||
"<font size='%1' color='%2' face='%3'>%4</font>",
|
||||
GVAR(recordTitleSize),
|
||||
GVAR(recordTitleColor),
|
||||
GVAR(recordTitleFont),
|
||||
_recordTitle
|
||||
]
|
||||
];
|
||||
|
||||
private _signalColorDefs = (missionConfigFile >> "SignalColors") call BIS_fnc_returnChildren;
|
||||
|
||||
{
|
||||
private _cfg = _x;
|
||||
private _color = getText(_cfg >> "hexCode");
|
||||
private _name = getText(_cfg >> "name");
|
||||
private _usage = getText(_cfg >> "usage");
|
||||
private _itemExamples = getArray(_cfg >> "itemExamples");
|
||||
|
||||
private _thisText = [];
|
||||
|
||||
_thisText pushBack format[
|
||||
"<font size='%1'><font color='%2'>%3</font> - %4</font>",
|
||||
GVAR(recordTextHeaderSize),
|
||||
_color,
|
||||
_name,
|
||||
_usage
|
||||
];
|
||||
|
||||
private _imagesLine = [];
|
||||
|
||||
{
|
||||
private _itemClassname = _x;
|
||||
private _itemCfg = [_itemClassname] call CBA_fnc_getItemConfig;
|
||||
private _itemName = getText(_itemCfg >> "displayName");
|
||||
private _itemImage = getText(_itemCfg >> "picture");
|
||||
_imagesLine pushBack format[
|
||||
"<img height='32' src='%1' title='%2'/>",
|
||||
_itemImage,
|
||||
_itemName
|
||||
];
|
||||
} forEach _itemExamples;
|
||||
|
||||
_thisText pushBack (_imagesLine joinString " ");
|
||||
_text pushBack (_thisText joinString "<br/>");
|
||||
} forEach _signalColorDefs;
|
||||
|
||||
_text = _text joinString "<br/><br/>";
|
||||
|
||||
[
|
||||
GVAR(subjectIntelID),
|
||||
_recordTitle,
|
||||
_text
|
||||
] call EFUNC(common,createOrUpdateDiaryRecord);
|
||||
@@ -1,48 +0,0 @@
|
||||
#include "../script_component.hpp"
|
||||
|
||||
if ( !hasInterface ) exitWith {};
|
||||
|
||||
GVAR(recordTitleColor) = "#ff6666";
|
||||
GVAR(recordTitleFont) = "PuristaMedium";
|
||||
GVAR(recordTitleSize) = 20;
|
||||
|
||||
GVAR(recordTextHeaderSize) = 16;
|
||||
GVAR(recordTextBodySize) = 14;
|
||||
|
||||
GVAR(subjectStatusID) = "FBCB2_Status";
|
||||
GVAR(subjectIntelID) = "FBCB2_Intel";
|
||||
GVAR(subjectMessagesID) = "FBCB2_Messages";
|
||||
GVAR(subjectFrequenciesID) = "FBCB2_Frequencies";
|
||||
GVAR(subjectAssetsFixedWingID) = "FBCB2_Assets_FixedWing";
|
||||
GVAR(subjectAssetsRotaryID) = "FBCB2_Assets_Rotary";
|
||||
GVAR(subjectAssetsGroundID) = "FBCB2_Assets_Ground";
|
||||
|
||||
player createDiarySubject[GVAR(subjectStatusID), "FBCB2 Status"];
|
||||
player createDiarySubject[GVAR(subjectMessagesID), "FBCB2 Messages"];
|
||||
player createDiarySubject[GVAR(subjectIntelID), "FBCB2 Intel"];
|
||||
player createDiarySubject[GVAR(subjectFrequenciesID), "FBCB2 Frequencies"];
|
||||
player createDiarySubject[GVAR(subjectAssetsFixedWingID), "FBCB2 Planes"];
|
||||
player createDiarySubject[GVAR(subjectAssetsRotaryID), "FBCB2 Helicopters"];
|
||||
player createDiarySubject[GVAR(subjectAssetsGroundID), "FBCB2 Ground"];
|
||||
|
||||
// run main inits
|
||||
[] call FUNC(addFrequenciesRecord);
|
||||
[] call FUNC(addSignalColorsRecord);
|
||||
[] call FUNC(addEnvironmentRecord);
|
||||
|
||||
// starting 5 minutes after postInit, update weather diary record every 5 minutes
|
||||
[{
|
||||
[
|
||||
{call FUNC(addEnvironmentRecord);},
|
||||
60*5
|
||||
] call CBA_fnc_addPerFrameHandler;
|
||||
}, 60*5] call CBA_fnc_waitAndExecute;
|
||||
|
||||
[
|
||||
LEVEL_DEBUG,
|
||||
QUOTE(COMPONENT),
|
||||
"initClient complete",
|
||||
[]
|
||||
] call EFUNC(common,log);
|
||||
|
||||
localNamespace setVariable [QGVAR(complete), true];
|
||||
@@ -1,3 +0,0 @@
|
||||
#define COMPONENT fbcb2_main
|
||||
#define COMPONENT_BEAUTIFIED FBCB2 - Main
|
||||
#include "../script_mod.hpp"
|
||||
@@ -1,20 +0,0 @@
|
||||
#include "..\script_component.hpp"
|
||||
|
||||
if (!hasInterface) exitWith {};
|
||||
|
||||
[
|
||||
"saveaar",
|
||||
{
|
||||
[] remoteExec["ocap_fnc_exportData", 2];
|
||||
},
|
||||
"admin"
|
||||
] call CBA_fnc_registerChatCommand;
|
||||
|
||||
[
|
||||
LEVEL_INFO,
|
||||
QUOTE(COMPONENT),
|
||||
"OCAP chat handler registered",
|
||||
[player] call EFUNC(common,addPlayerInfoToArray)
|
||||
] call EFUNC(common,log);
|
||||
|
||||
nil;
|
||||
@@ -1,41 +0,0 @@
|
||||
#include "..\script_component.hpp"
|
||||
|
||||
if (!hasInterface) exitWith {};
|
||||
|
||||
[
|
||||
"respawn",
|
||||
{
|
||||
_clientID = _thisArgs select 0;
|
||||
player setDamage 1;
|
||||
|
||||
private _timeWentUnconscious = player getVariable [QGVARMAIN(lastTimeKnockedOut), -1];
|
||||
private _durationSpentUnconscious = -1;
|
||||
if (_timeWentUnconscious > - 1) then {
|
||||
_durationSpentUnconscious = diag_tickTime - _timeWentUnconscious;
|
||||
};
|
||||
|
||||
// log to server RPT
|
||||
[
|
||||
LEVEL_INFO,
|
||||
QUOTE(COMPONENT),
|
||||
"CHAT COMMAND RESPAWN",
|
||||
[player, [
|
||||
["durationSpentUnconscious", _durationSpentUnconscious]
|
||||
]] call EFUNC(common,addPlayerInfoToArray)
|
||||
] remoteExec [QEFUNC(common,log), 2];
|
||||
|
||||
// systemChat to all remote machines
|
||||
format["%1 claims they were glitched and respawned (%2)", name player, netID player] remoteExec["systemChat", -_clientID];
|
||||
},
|
||||
"all",
|
||||
[clientOwner]
|
||||
] call CBA_fnc_registerChatCommand;
|
||||
|
||||
[
|
||||
LEVEL_INFO,
|
||||
QUOTE(COMPONENT),
|
||||
"respawn chat handler registered",
|
||||
[player] call EFUNC(common,addPlayerInfoToArray)
|
||||
] call EFUNC(common,log);
|
||||
|
||||
nil;
|
||||
@@ -1,41 +0,0 @@
|
||||
#include "..\script_component.hpp"
|
||||
|
||||
if (!hasInterface || !is3DENPreview) exitWith {};
|
||||
|
||||
private _warningText = [];
|
||||
|
||||
if (getText(missionConfigFile >> "author") in ["MISSION AUTHOR", ""]) then {
|
||||
_warningText pushBack "<t font='EtelkaMonospacePro' size='0.7'>mission_settings\author</t> is blank or default!";
|
||||
};
|
||||
if (getText(missionConfigFile >> "onLoadName") in ["THIS APPEARS ON TOP OF THE LOADING SCREEN IMAGE", ""]) then {
|
||||
_warningText pushBack "<t font='EtelkaMonospacePro' size='0.7'>mission_settings\onLoadName</t> is blank or default!";
|
||||
};
|
||||
|
||||
if (getText(missionConfigFile >> "briefingName") in ["THIS IS THE NAME ON THE #MISSIONS LIST", ""]) then {
|
||||
_warningText pushBack "<t font='EtelkaMonospacePro' size='0.7'>mission_settings\briefingName</t> is blank or default!";
|
||||
};
|
||||
if (getText(missionConfigFile >> "overviewText") in ["THIS IS WHERE YOU DESCRIBE THE MISSION IN THE #MISSION LIST", ""]) then {
|
||||
_warningText pushBack "<t font='EtelkaMonospacePro' size='0.7'>mission_settings\overviewText</t> is blank or default!";
|
||||
};
|
||||
|
||||
if (getText(missionConfigFile >> "missionSeries") in ["MY SERIES NAME", ""]) then {
|
||||
_warningText pushBack "<t font='EtelkaMonospacePro' size='0.7'>mission_settings\missionSeries</t> is blank or default!";
|
||||
};
|
||||
|
||||
if (count GVARMAIN(baseObjects) isEqualTo 0) then {
|
||||
_warningText pushBack "No respawn points placed!";
|
||||
};
|
||||
|
||||
if (count _warningText > 0) then {
|
||||
[{
|
||||
if (isNull (call BIS_fnc_displayMission)) exitWith {};
|
||||
|
||||
(_this#0) spawn {
|
||||
[_this joinString "<br/>", "Issues found!", true, false] call BIS_fnc_guiMessage;
|
||||
};
|
||||
[_this#1] call CBA_fnc_removePerFrameHandler;
|
||||
|
||||
}, 1, _warningText] call CBA_fnc_addPerFrameHandler;
|
||||
};
|
||||
|
||||
nil;
|
||||
@@ -1,46 +0,0 @@
|
||||
#include "..\script_component.hpp"
|
||||
|
||||
if (!hasInterface) exitWith {};
|
||||
|
||||
// make sure the server has finished init
|
||||
waitUntil {!isNil QGVARMAIN(complete)};
|
||||
|
||||
["InitializePlayer", [player, true]] call BIS_fnc_dynamicGroups;
|
||||
|
||||
// run primary init functions
|
||||
call FUNC(addAARChatHandler);
|
||||
call FUNC(addRespawnChatHandler);
|
||||
call FUNC(setDefaults);
|
||||
|
||||
// Initialize a holder for managing local diary records
|
||||
// store records in format:
|
||||
// [subject, [
|
||||
// [title, diaryRecord]
|
||||
// ]]
|
||||
EGVAR(common,diaryRecords) = createHashMap;
|
||||
|
||||
|
||||
// initialize other modules
|
||||
call EFUNC(client,initClient);
|
||||
call EFUNC(mapcopy,initClient);
|
||||
call EFUNC(reinsert,initClient);
|
||||
call EFUNC(resupply,initClient);
|
||||
call EFUNC(triageIcons,initClient);
|
||||
call EFUNC(vehicleFlags,initClient);
|
||||
call EFUNC(zeus,initClient);
|
||||
call EFUNC(fbcb2_main,initClient);
|
||||
call EFUNC(fbcb2_assets,initClient);
|
||||
|
||||
|
||||
call FUNC(checkMissionSettings);
|
||||
|
||||
[
|
||||
LEVEL_DEBUG,
|
||||
QUOTE(COMPONENT),
|
||||
"initClient complete",
|
||||
[]
|
||||
] call EFUNC(common,log);
|
||||
|
||||
localNamespace setVariable [QGVAR(complete), true];
|
||||
|
||||
nil;
|
||||
@@ -1,70 +0,0 @@
|
||||
#include "..\script_component.hpp"
|
||||
|
||||
if (!isServer) exitWith {};
|
||||
|
||||
// array of all respawn modules in the mission representing "bases"
|
||||
GVARMAIN(baseObjects) = allMissionObjects "ModuleRespawnPosition_F";
|
||||
publicVariable QGVARMAIN(baseObjects);
|
||||
|
||||
// Initializes the Dynamic Groups framework and groups
|
||||
["Initialize", [true]] call BIS_fnc_dynamicGroups;
|
||||
|
||||
// initialize other modules
|
||||
call EFUNC(common,logMissionInfo);
|
||||
call EFUNC(fbcb2_assets,initServer);
|
||||
call EFUNC(reinsert,initServer);
|
||||
|
||||
// globally disable zeus lightning bolt functionality
|
||||
_curators = allMissionObjects "ModuleCurator_F";
|
||||
{
|
||||
_x removeCuratorAddons ["CuratorOnly_Modules_F_Curator_Lightning"];
|
||||
_x removeCuratorAddons ["A3_Modules_F_Curator_Lightning"];
|
||||
} foreach _curators;
|
||||
|
||||
// add dead unit time marking for custom garbage cleanup function
|
||||
addMissionEventHandler ["EntityKilled", {
|
||||
params ["_unit", "_killer", "_instigator", "_useEffects"];
|
||||
|
||||
if not (_unit isKindOf "CAManBase") exitWith {};
|
||||
|
||||
_unit setVariable["milsim_death_time", time];
|
||||
|
||||
_unit addEventHandler ["Deleted", {
|
||||
params ["_entity"];
|
||||
_remainsCollector = _entity getVariable["milsim_garbage_collected", false];
|
||||
_decayTime = time - (_entity getVariable ["milsim_death_time", time]);
|
||||
|
||||
_i = allUsers select { (getUserInfo _x)#1 isEqualTo _ownerId;};
|
||||
_owner = if ( _i isEqualTo []) then [ { "server" }, { (getUserInfo (_i#0))#3 }];
|
||||
|
||||
diag_log format["isServer: %5, deleted object owned by: %1 via remainsCollector: %2 after %3 seconds of type: %4", _owner, str (not _remainsCollector), _decayTime, _entity, isServer];
|
||||
}];
|
||||
}];
|
||||
|
||||
|
||||
// add zeus deletion logging to curator objects
|
||||
{
|
||||
_x addEventHandler ["CuratorObjectDeleted", {
|
||||
params ["_curator", "_entity"];
|
||||
|
||||
_decayTime = time - (_entity getVariable ["milsim_death_time", time]);
|
||||
diag_log format["deleted object: %1 via curator: %2 after %3 seconds", _entity, name _curator, _decayTime];
|
||||
}];
|
||||
} foreach _curators;
|
||||
|
||||
// declare init complete to other modules
|
||||
missionNamespace setVariable [QGVARMAIN(complete), true, true];
|
||||
|
||||
[
|
||||
LEVEL_INFO,
|
||||
QUOTE(COMPONENT),
|
||||
format["%1: version %2", QGVARMAIN(complete), QUOTE(VERSION_STR)],
|
||||
[["version", QUOTE(VERSION_STR)]]
|
||||
] call EFUNC(common,log);
|
||||
|
||||
[
|
||||
LEVEL_DEBUG,
|
||||
QUOTE(COMPONENT),
|
||||
"postInit complete",
|
||||
[]
|
||||
] call EFUNC(common,log);
|
||||
@@ -1,36 +0,0 @@
|
||||
#include "..\script_component.hpp"
|
||||
|
||||
if (!hasInterface) exitWith {};
|
||||
|
||||
enableSaving[false, false];
|
||||
|
||||
enableRadio false;
|
||||
enableSentences false;
|
||||
|
||||
missionNamespace setVariable ["ACE_maxWeightDrag", 2400];
|
||||
missionNamespace setVariable ["ACE_maxWeightCarry", 1800];
|
||||
|
||||
if(isClass(configfile >> "CfgPatches" >> "rhs_main")) then {
|
||||
rhs_vehicleRadioChatter = 0;
|
||||
};
|
||||
|
||||
waitUntil {time > 0};
|
||||
|
||||
enableEnvironment[false, true];
|
||||
|
||||
[
|
||||
LEVEL_INFO,
|
||||
QUOTE(COMPONENT),
|
||||
"Defaults set",
|
||||
[
|
||||
["enableSaving", [false, false]],
|
||||
["enableRadio", false],
|
||||
["enableSentences", false],
|
||||
["ACE_maxWeightDrag", 2400],
|
||||
["ACE_maxWeightCarry", 1800],
|
||||
["rhs_vehicleRadioChatter", 0],
|
||||
["enableEnvironment", [false, true]]
|
||||
]
|
||||
] call EFUNC(common,log);
|
||||
|
||||
nil;
|
||||
@@ -1,3 +0,0 @@
|
||||
#define COMPONENT init
|
||||
#define COMPONENT_BEAUTIFIED Init
|
||||
#include "../script_mod.hpp"
|
||||
@@ -1,24 +0,0 @@
|
||||
#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);
|
||||
@@ -1,15 +0,0 @@
|
||||
#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;
|
||||
@@ -1,60 +0,0 @@
|
||||
#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"];
|
||||
if (!isPlayer _target) exitWith {
|
||||
format["%1 is not a player", name _target] call CBA_fnc_notify;
|
||||
};
|
||||
format["Copying map markers from %1", name _target] call CBA_fnc_notify;
|
||||
[QGVAR(mapCopyRequest), _this, _target] call CBA_fnc_targetEvent;
|
||||
},
|
||||
{
|
||||
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];
|
||||
@@ -1,8 +0,0 @@
|
||||
#include "..\script_component.hpp"
|
||||
// accepts an array of serialized markers and adds them to local map
|
||||
|
||||
params [["_markerList", [], [[]]]];
|
||||
|
||||
{
|
||||
_x call FUNC(stringToMapMarker);
|
||||
} foreach _markerList;
|
||||
@@ -1,3 +0,0 @@
|
||||
#define COMPONENT mapcopy
|
||||
#define COMPONENT_BEAUTIFIED Map Copy
|
||||
#include "../script_mod.hpp"
|
||||
@@ -1,153 +0,0 @@
|
||||
#include "..\script_component.hpp"
|
||||
|
||||
//---------------------
|
||||
// Garbage Collection
|
||||
//---------------------
|
||||
|
||||
[
|
||||
QGVAR(emptyGroupCleanup_enable),
|
||||
"CHECKBOX",
|
||||
"Empty Group Cleanup Enabled",
|
||||
[QUOTE(SETTINGS_GROUP_NAME), QUOTE(COMPONENT_BEAUTIFIED)],
|
||||
true,
|
||||
true,
|
||||
{
|
||||
params ["_value"];
|
||||
[
|
||||
QGVAR(emptyGroupCleanup_enable),
|
||||
_value
|
||||
] call EFUNC(common,logSettingChanged);
|
||||
|
||||
if (!isNull (missionNamespace getVariable [QGVAR(emptyGroupCleanupPFH), locationNull])) then {
|
||||
deleteLocation GVAR(emptyGroupCleanupPFH);
|
||||
};
|
||||
|
||||
call FUNC(addEmptyGroupCleanupPFH);
|
||||
}
|
||||
] call CBA_fnc_addSetting;
|
||||
|
||||
[
|
||||
QGVAR(deadUnitCleanup_enable),
|
||||
"CHECKBOX",
|
||||
"Dead Unit Cleanup Enabled",
|
||||
[QUOTE(SETTINGS_GROUP_NAME), QUOTE(COMPONENT_BEAUTIFIED)],
|
||||
true,
|
||||
true,
|
||||
{
|
||||
params ["_value"];
|
||||
[
|
||||
QGVAR(deadUnitCleanup_enable),
|
||||
_value
|
||||
] call EFUNC(common,logSettingChanged);
|
||||
|
||||
if (!isNull (missionNamespace getVariable [QGVAR(deadUnitCleanupPFH), locationNull])) then {
|
||||
deleteLocation GVAR(deadUnitCleanupPFH);
|
||||
};
|
||||
|
||||
call FUNC(addDeadUnitCleanupPFH);
|
||||
}
|
||||
] call CBA_fnc_addSetting;
|
||||
|
||||
//---------------------
|
||||
// Server CPS
|
||||
//---------------------
|
||||
|
||||
[
|
||||
QGVAR(server_cps_enable),
|
||||
"CHECKBOX",
|
||||
"Server CPS Metrics Enabled",
|
||||
[QUOTE(SETTINGS_GROUP_NAME), QUOTE(COMPONENT_BEAUTIFIED)],
|
||||
true,
|
||||
true,
|
||||
{
|
||||
params ["_value"];
|
||||
[
|
||||
QGVAR(cps_enable),
|
||||
_value
|
||||
] call EFUNC(common,logSettingChanged);
|
||||
}
|
||||
] call CBA_fnc_addSetting;
|
||||
|
||||
[QGVAR(cps_enable), true] call CBA_settings_fnc_set;
|
||||
|
||||
[
|
||||
QGVAR(server_cps_interval),
|
||||
"TIME",
|
||||
"Server CPS Metrics Interval",
|
||||
[QUOTE(SETTINGS_GROUP_NAME), QUOTE(COMPONENT_BEAUTIFIED)],
|
||||
[60,300,120],
|
||||
true,
|
||||
{
|
||||
if (!isServer) exitWith {};
|
||||
|
||||
params ["_value"];
|
||||
|
||||
[
|
||||
QGVAR(cps_interval),
|
||||
_value
|
||||
] call EFUNC(common,logSettingChanged);
|
||||
|
||||
_cpsPFH = missionNamespace getVariable [QGVAR(server_cps_handler), ObjNull];
|
||||
if (!isNull _cpsPFH) then {
|
||||
_cpsPFH call CBA_fnc_deletePerFrameHandlerObject;
|
||||
};
|
||||
|
||||
[] call FUNC(addServerStatsPFH);
|
||||
}
|
||||
] call CBA_fnc_addSetting;
|
||||
|
||||
|
||||
//---------------------
|
||||
// Client CPS
|
||||
//---------------------
|
||||
|
||||
[
|
||||
QGVAR(client_cps_enable),
|
||||
"CHECKBOX",
|
||||
"Client CPS Metrics Enabled",
|
||||
[QUOTE(SETTINGS_GROUP_NAME), QUOTE(COMPONENT_BEAUTIFIED)],
|
||||
true,
|
||||
true,
|
||||
{
|
||||
params ["_value"];
|
||||
[
|
||||
QGVAR(client_cps_enable),
|
||||
_value
|
||||
] call EFUNC(common,logSettingChanged);
|
||||
}
|
||||
] call CBA_fnc_addSetting;
|
||||
|
||||
[QGVAR(client_cps_enable), true] call CBA_settings_fnc_set;
|
||||
|
||||
[
|
||||
QGVAR(client_cps_interval),
|
||||
"TIME",
|
||||
"Client CPS Metrics Interval",
|
||||
[QUOTE(SETTINGS_GROUP_NAME), QUOTE(COMPONENT_BEAUTIFIED)],
|
||||
[60,300,120],
|
||||
true,
|
||||
{
|
||||
if (!hasInterface) exitWith {};
|
||||
|
||||
params ["_value"];
|
||||
|
||||
[
|
||||
QGVAR(client_cps_interval),
|
||||
_value
|
||||
] call EFUNC(common,logSettingChanged);
|
||||
|
||||
_cpsPFH = player getVariable [QGVAR(client_cps_handler), ObjNull];
|
||||
if (!isNull _cpsPFH) then {
|
||||
_cpsPFH call CBA_fnc_deletePerFrameHandlerObject;
|
||||
};
|
||||
|
||||
[] call FUNC(addClientStatsPFH);
|
||||
}
|
||||
] call CBA_fnc_addSetting;
|
||||
|
||||
[
|
||||
LEVEL_INFO,
|
||||
QUOTE(COMPONENT),
|
||||
"CREATED SETTINGS",
|
||||
[]
|
||||
] call EFUNC(common,log);
|
||||
@@ -1,38 +0,0 @@
|
||||
#include "..\script_component.hpp"
|
||||
|
||||
if (!hasInterface) exitWith {};
|
||||
|
||||
[
|
||||
LEVEL_INFO,
|
||||
QUOTE(COMPONENT),
|
||||
"Initializing client stats PFH",
|
||||
[]
|
||||
] call EFUNC(common,log);
|
||||
|
||||
_cpsPFH = [
|
||||
{
|
||||
[] call FUNC(calculateClientStats);
|
||||
},
|
||||
QGVAR(client_cps_interval) call CBA_settings_fnc_get,
|
||||
[],
|
||||
{
|
||||
[
|
||||
LEVEL_INFO,
|
||||
QUOTE(COMPONENT),
|
||||
"Client PFH loaded",
|
||||
[["pfhInterval", QGVAR(client_cps_interval) call CBA_settings_fnc_get]]
|
||||
] call EFUNC(common,log);
|
||||
},
|
||||
{ [
|
||||
LEVEL_INFO,
|
||||
QUOTE(COMPONENT),
|
||||
"Client PFH unloaded",
|
||||
[]
|
||||
] call EFUNC(common,log);
|
||||
},
|
||||
{ QGVAR(client_cps_enable) call CBA_settings_fnc_get },
|
||||
{ false },
|
||||
[]
|
||||
] call CBA_fnc_createPerFrameHandlerObject;
|
||||
|
||||
player setVariable [QGVAR(client_cps_handler), _cpsPFH];
|
||||
@@ -1,55 +0,0 @@
|
||||
#include "..\script_component.hpp"
|
||||
|
||||
[
|
||||
LEVEL_INFO,
|
||||
QUOTE(COMPONENT),
|
||||
"Initializing dead unit deletion PFH",
|
||||
[]
|
||||
] call EFUNC(common,log);
|
||||
|
||||
GVAR(deadUnitCleanupPFH) = [
|
||||
{
|
||||
_maxTime = getMissionConfigValue ["corpseRemovalMaxTime", 300] * 1.5;
|
||||
_maxDead = getMissionConfigValue ["corpseLimit", 80];
|
||||
|
||||
// _dead = allDead select { (_x isKindOf "CAManBase") and ( ( (time - (_x getVariable ["milsim_death_time", time] ) ) > (_maxTime * 1.5) ) ) };
|
||||
// _dead = _dead apply { [ (time - (_x getVariable ["milsim_death_time", time] ) ), _x ] };
|
||||
|
||||
_dead = [];
|
||||
{
|
||||
if not (_x isKindOf "CAManBase") then { continue };
|
||||
if not (isInRemainsCollector _x) then { continue };
|
||||
_dead pushBack [time - (_x getVariable ["milsim_death_time", time] ), _x];
|
||||
} forEach allDead;
|
||||
|
||||
_dead sort false;
|
||||
_toDelete = 0 max ( (count _dead ) - _maxDead );
|
||||
_dead = _dead select [0, _toDelete];
|
||||
{
|
||||
_unit = _x#1;
|
||||
_unit setVariable ["milsim_garbage_collected", true];
|
||||
deleteVehicle (_unit);
|
||||
} foreach _dead;
|
||||
},
|
||||
450,
|
||||
[],
|
||||
{ // on creation
|
||||
[
|
||||
LEVEL_INFO,
|
||||
QUOTE(COMPONENT),
|
||||
"dead unit deletion PFH loaded",
|
||||
[]
|
||||
] call EFUNC(common,log);
|
||||
},
|
||||
{ // on deletion
|
||||
[
|
||||
LEVEL_INFO,
|
||||
QUOTE(COMPONENT),
|
||||
"dead unit deletion PFH unloaded",
|
||||
[]
|
||||
] call EFUNC(common,log);
|
||||
},
|
||||
{ (missionNamespace getVariable [QGVAR(deadUnitCleanup_enable), false]) },
|
||||
{ false },
|
||||
[]
|
||||
] call CBA_fnc_createPerFrameHandlerObject;
|
||||
@@ -1,71 +0,0 @@
|
||||
#include "..\script_component.hpp"
|
||||
|
||||
[
|
||||
LEVEL_INFO,
|
||||
QUOTE(COMPONENT),
|
||||
"Initializing empty group deletion PFH",
|
||||
[]
|
||||
] call EFUNC(common,log);
|
||||
|
||||
GVAR(emptyGroupCleanupPFH) = [
|
||||
{
|
||||
{
|
||||
if ((count units _x) == 0) then {
|
||||
if (local _x) then {
|
||||
[
|
||||
LEVEL_INFO,
|
||||
QUOTE(COMPONENT),
|
||||
"DELETING EMPTY GROUP",
|
||||
[
|
||||
["groupId", groupId _x],
|
||||
["netId", netId _x]
|
||||
]
|
||||
] call EFUNC(common,log);
|
||||
deleteGroup _x;
|
||||
} else {
|
||||
if (isServer) then {
|
||||
[
|
||||
LEVEL_INFO,
|
||||
QUOTE(COMPONENT),
|
||||
"NON LOCAL EMPTY GROUP",
|
||||
[
|
||||
["groupId", groupId _x],
|
||||
["groupOwner", groupOwner _x]
|
||||
]
|
||||
] call EFUNC(common,log);
|
||||
} else {
|
||||
[
|
||||
LEVEL_INFO,
|
||||
QUOTE(COMPONENT),
|
||||
"EMPTY REMOTE GROUP",
|
||||
[
|
||||
["groupId", groupId _x]
|
||||
]
|
||||
] call EFUNC(common,log);
|
||||
};
|
||||
};
|
||||
};
|
||||
} forEach allGroups;
|
||||
},
|
||||
300,
|
||||
[],
|
||||
{ // on creation
|
||||
[
|
||||
LEVEL_INFO,
|
||||
QUOTE(COMPONENT),
|
||||
"Empty group deletion PFH loaded",
|
||||
[]
|
||||
] call EFUNC(common,log);
|
||||
},
|
||||
{ // on deletion
|
||||
[
|
||||
LEVEL_INFO,
|
||||
QUOTE(COMPONENT),
|
||||
"Empty group deletion PFH unloaded",
|
||||
[]
|
||||
] call EFUNC(common,log);
|
||||
},
|
||||
{ (missionNamespace getVariable [QGVAR(emptyGroupCleanup_enable), false]) },
|
||||
{ not (missionNamespace getVariable [QGVAR(emptyGroupCleanup_enable), false]) },
|
||||
[]
|
||||
] call CBA_fnc_createPerFrameHandlerObject;
|
||||
@@ -1,52 +0,0 @@
|
||||
#include "..\script_component.hpp"
|
||||
|
||||
[] spawn {
|
||||
// warning: while loop without suspension executes multiple times per frame
|
||||
private _counter = 0;
|
||||
private _endTime = diag_tickTime + 5;
|
||||
private _frameNo = diag_frameNo;
|
||||
while { diag_tickTime < _endTime } do
|
||||
{
|
||||
_counter = _counter + 1;
|
||||
};
|
||||
|
||||
private _rawCPS = _counter / (diag_frameNo - _frameNo);
|
||||
missionNamespace setVariable [QGVAR(server_raw_cps), _rawCPS];
|
||||
|
||||
// with suspension
|
||||
private _counter = 0;
|
||||
private _endTime = diag_tickTime + 5;
|
||||
private _frameNo = diag_frameNo;
|
||||
while { diag_tickTime < _endTime } do
|
||||
{
|
||||
_counter = _counter + 1;
|
||||
uiSleep 0.001; // waits at least 1 frame
|
||||
};
|
||||
|
||||
private _serverCPS = _counter / (diag_frameNo - _frameNo);
|
||||
missionNamespace setVariable [QGVAR(server_cps), _counter / (diag_frameNo - _frameNo)];
|
||||
|
||||
// log to RPT
|
||||
[
|
||||
|
||||
{_this call EFUNC(common,log);},
|
||||
[
|
||||
LEVEL_INFO,
|
||||
QUOTE(COMPONENT),
|
||||
format ["Average Server Execution: %1 times per frame", _serverCPS],
|
||||
[
|
||||
["serverRawCPS", _rawCPS],
|
||||
["serverCPS", _serverCPS]
|
||||
]
|
||||
]
|
||||
] call CBA_fnc_directCall;
|
||||
|
||||
[QGVARMAIN(serverEfficiency), [
|
||||
[
|
||||
["float", QGVARMAIN(raw_cps), missionNamespace getVariable [QGVAR(server_raw_cps), -1]],
|
||||
["float", QGVARMAIN(cps), missionNamespace getVariable [QGVAR(server_cps), -1]]
|
||||
]
|
||||
]] call CBA_fnc_localEvent;
|
||||
};
|
||||
|
||||
nil;
|
||||
@@ -1,3 +0,0 @@
|
||||
#define COMPONENT performance
|
||||
#define COMPONENT_BEAUTIFIED Performance Monitoring
|
||||
#include "../script_mod.hpp"
|
||||
@@ -1,65 +0,0 @@
|
||||
#include "..\script_component.hpp"
|
||||
|
||||
params [
|
||||
["_types", [], [[]]], // classnames to assign these action to
|
||||
["_useInheritance", false, [false]]
|
||||
];
|
||||
|
||||
{ // 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 _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
|
||||
[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
|
||||
[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,28 +0,0 @@
|
||||
#include "..\script_component.hpp"
|
||||
|
||||
params [
|
||||
["_types", [], [[]]], // classnames to assign these action to
|
||||
["_useInheritance", false, [false]]
|
||||
];
|
||||
|
||||
{ // 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];
|
||||
},
|
||||
{
|
||||
GVAR(setting_enabled);
|
||||
} // condition
|
||||
] call ace_interact_menu_fnc_createAction;
|
||||
[_classToAddActionsTo, 1, ["ACE_SelfActions"], _checkReinsertQueueAction, _useInheritance] call ace_interact_menu_fnc_addActionToClass;
|
||||
|
||||
} forEach _types;
|
||||
@@ -1,54 +0,0 @@
|
||||
#include "..\script_component.hpp"
|
||||
|
||||
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
|
||||
[["CAManBase"], true] call FUNC(addAceSelfActions);
|
||||
|
||||
/////////////////////////////////////////////////////
|
||||
// PILOTS ONLY
|
||||
// ACE SELF-INTERACTIONS FOR CHECKING REINSERT QUEUE - ONLY FOR PILOTS
|
||||
localNamespace setVariable [QGVAR(checkReinsertQueueClassesAdded), []];
|
||||
localNamespace setVariable [QGVAR(lastReinsertQueueCheck), diag_tickTime];
|
||||
|
||||
// add actions to pilot classes, and don't apply to child classes
|
||||
// [["B_Helipilot_F", "B_helicrew_F"], false] call FUNC(addCheckQueueSelfAction);
|
||||
/////////////////////////////////////////////////////
|
||||
|
||||
|
||||
// ADD TIMER FOR PILOTS - IF REINSERT LIST NOT CHECKED FOR 20 MINUTES, SHOW NOTIFICATION AUTOMATICALLY
|
||||
if ((typeOf player) in ["B_Helipilot_F", "B_helicrew_F"]) then {
|
||||
[{
|
||||
// if module not enabled and pilot forced check not enabled, exit
|
||||
if (not (
|
||||
[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 = [QGVAR(setting_pilotForcedCheckInterval)] call CBA_settings_fnc_get;
|
||||
if (
|
||||
diag_tickTime - _lastCheck <
|
||||
_requiredCheckInterval
|
||||
) exitWith {}; // if last check was less than X minutes ago, skip
|
||||
|
||||
// last check was greater than X minutes ago
|
||||
// reset last check time
|
||||
localNamespace setVariable [QGVAR(lastReinsertQueueCheck), diag_tickTime];
|
||||
// request notification from the server
|
||||
call FUNC(requestShowQueue);
|
||||
}, 30] call CBA_fnc_addPerFrameHandler;
|
||||
};
|
||||
/////////////////////////////////////////////////////
|
||||
|
||||
[
|
||||
LEVEL_DEBUG,
|
||||
QUOTE(COMPONENT),
|
||||
"initClient complete",
|
||||
[]
|
||||
] call EFUNC(common,log);
|
||||
|
||||
localNamespace setVariable [QGVAR(complete), true];
|
||||
@@ -1,5 +0,0 @@
|
||||
#include "..\script_component.hpp"
|
||||
|
||||
if (!hasInterface) exitWith {};
|
||||
|
||||
[] remoteExec [QFUNC(returnReinsertQueueNotification), 2];
|
||||
@@ -1,83 +0,0 @@
|
||||
#include "..\script_component.hpp"
|
||||
|
||||
//---------------------
|
||||
// Respawn Settings
|
||||
[
|
||||
QGVAR(setting_enabled), // variable
|
||||
"CHECKBOX", // type
|
||||
["Enabled", "Whether or not players can file for reinsert and pilots can check the reinsert queue"], // title
|
||||
[QUOTE(SETTINGS_GROUP_NAME), QUOTE(COMPONENT_BEAUTIFIED)], // category
|
||||
true, // default value
|
||||
true, // global setting
|
||||
{
|
||||
params ["_value"];
|
||||
[
|
||||
QGVAR(setting_enabled),
|
||||
_value
|
||||
] call EFUNC(common,logSettingChanged);
|
||||
}
|
||||
] call CBA_fnc_addSetting;
|
||||
|
||||
[
|
||||
QGVAR(setting_maxRangeToReady), // variable
|
||||
"SLIDER", // type
|
||||
["Max Request Filing Range", "Maximum distance from a respawn point a player can be to ready up"], // title
|
||||
[QUOTE(SETTINGS_GROUP_NAME), QUOTE(COMPONENT_BEAUTIFIED)], // category
|
||||
[0, 1000, 400, 0, false], // [_min, _max, _default, _trailingDecimals, _isPercentage]
|
||||
true, // global setting
|
||||
{
|
||||
params ["_value"];
|
||||
[
|
||||
QGVAR(setting_maxRangeToReady),
|
||||
_value
|
||||
] call EFUNC(common,logSettingChanged);
|
||||
}
|
||||
] call CBA_fnc_addSetting;
|
||||
|
||||
[
|
||||
QGVAR(setting_maxWait), // variable
|
||||
"TIME", // type
|
||||
["Max Wait Before Global Notify", "How long should at least one person be waiting before prompting a global notification."], // title
|
||||
[QUOTE(SETTINGS_GROUP_NAME), QUOTE(COMPONENT_BEAUTIFIED)], // category
|
||||
[60*5, 60*30, 60*20], // [_min, _max, _default]
|
||||
true,
|
||||
{
|
||||
params ["_value"];
|
||||
[
|
||||
QGVAR(setting_maxWait),
|
||||
_value
|
||||
] call EFUNC(common,logSettingChanged);
|
||||
}
|
||||
] call CBA_fnc_addSetting;
|
||||
|
||||
[
|
||||
QGVAR(setting_pilotForcedCheckEnabled), // variable
|
||||
"CHECKBOX", // type
|
||||
["Force Queue Checks for Pilots", "Whether or not pilots are forced to view the contents of the reinsertion queue per interval"], // title
|
||||
[QUOTE(SETTINGS_GROUP_NAME), QUOTE(COMPONENT_BEAUTIFIED)], // category
|
||||
false, // default value
|
||||
true, // global setting
|
||||
{
|
||||
params ["_value"];
|
||||
[
|
||||
QGVAR(setting_pilotForcedCheckEnabled),
|
||||
_value
|
||||
] call EFUNC(common,logSettingChanged);
|
||||
}
|
||||
] call CBA_fnc_addSetting;
|
||||
|
||||
[
|
||||
QGVAR(setting_pilotForcedCheckInterval), // variable
|
||||
"TIME", // type
|
||||
["Pilot Forced Check Interval", "Pilots will be force shown the queue if they haven't checked it in X seconds"], // title
|
||||
[QUOTE(SETTINGS_GROUP_NAME), QUOTE(COMPONENT_BEAUTIFIED)], // category
|
||||
[60*5, 60*30, 60*10], // [_min, _max, _default]
|
||||
true,
|
||||
{
|
||||
params ["_value"];
|
||||
[
|
||||
QGVAR(setting_pilotForcedCheckInterval),
|
||||
_value
|
||||
] call EFUNC(common,logSettingChanged);
|
||||
}
|
||||
] call CBA_fnc_addSetting;
|
||||
@@ -1,3 +0,0 @@
|
||||
#define COMPONENT reinsert
|
||||
#define COMPONENT_BEAUTIFIED Reinsertion
|
||||
#include "../script_mod.hpp"
|
||||
@@ -1,61 +0,0 @@
|
||||
#include "..\script_component.hpp"
|
||||
|
||||
params [
|
||||
["_player", objNull, [objNull]],
|
||||
["_base", objNull, [objNull]],
|
||||
["_timeFiled", diag_tickTime, [25]]
|
||||
];
|
||||
|
||||
if (!isServer) exitWith {
|
||||
[
|
||||
LEVEL_ERROR,
|
||||
QUOTE(COMPONENT),
|
||||
"ATTEMPTED RUN ON CLIENT",
|
||||
[
|
||||
["player", _player],
|
||||
["base", _base]
|
||||
]
|
||||
] call EFUNC(common,log);
|
||||
["ATTEMPTED RUN ON CLIENT"] call BIS_fnc_error;
|
||||
};
|
||||
if (
|
||||
isNull _player ||
|
||||
isNull _base
|
||||
) exitWith {
|
||||
[
|
||||
LEVEL_ERROR,
|
||||
QUOTE(COMPONENT),
|
||||
"NULL PARAMETERS",
|
||||
[
|
||||
["player", _player],
|
||||
["base", _base]
|
||||
]
|
||||
] call EFUNC(common,log);
|
||||
["NULL PARAMETERS"] call BIS_fnc_error;
|
||||
};
|
||||
|
||||
|
||||
private _maxRangeToReady = missionNamespace getVariable [QGVAR(setting_maxRangeToReady), 400];
|
||||
// nearest base here is the same as the base sent
|
||||
private _nearestBase = _base;
|
||||
|
||||
GVAR(reinsertionQueue) pushBackUnique [
|
||||
_player, _base, _timeFiled
|
||||
];
|
||||
// broadcast new list to all machines
|
||||
publicVariable QGVAR(reinsertionQueue);
|
||||
|
||||
// log to rpt
|
||||
[
|
||||
LEVEL_INFO,
|
||||
QUOTE(COMPONENT),
|
||||
"PLAYER FILED REQUEST",
|
||||
[_player, [
|
||||
["filedAtBase", [_base] call EFUNC(common,getNameOfBase)],
|
||||
["filedAtBaseDistance", _player distance _base],
|
||||
["closestBase", [_nearestBase] call EFUNC(common,getNameOfBase)],
|
||||
["closestBaseDistance", _player distance _nearestBase],
|
||||
["maxDistanceSetting", _maxRangeToReady],
|
||||
["inQueueDuration", diag_tickTime - _timeFiled]
|
||||
]] call EFUNC(common,addPlayerInfoToArray)
|
||||
] call EFUNC(common,log);
|
||||
@@ -1,60 +0,0 @@
|
||||
#include "..\script_component.hpp"
|
||||
|
||||
params [["_player", objNull, [objNull]]];
|
||||
|
||||
if (!isServer) exitWith {
|
||||
[
|
||||
LEVEL_ERROR,
|
||||
QUOTE(COMPONENT),
|
||||
"ATTEMPTED RUN ON CLIENT",
|
||||
[
|
||||
["player", _player]
|
||||
]
|
||||
] call EFUNC(common,log);
|
||||
};
|
||||
if (isNull _player) exitWith {
|
||||
[
|
||||
LEVEL_ERROR,
|
||||
QUOTE(COMPONENT),
|
||||
"NULL PARAMETERS",
|
||||
[
|
||||
["player", _player]
|
||||
]
|
||||
] call EFUNC(common,log);
|
||||
};
|
||||
|
||||
// get entries for this player from queue
|
||||
private _unitArrs = GVAR(reinsertionQueue) select {_x#0 isEqualTo _player};
|
||||
// if player not in queue, skip
|
||||
if (count _unitArrs isEqualTo 0) exitWith {};
|
||||
|
||||
private _maxRangeToReady = missionNamespace getVariable [QGVAR(setting_maxRangeToReady), 400];
|
||||
|
||||
// remove player from queue
|
||||
GVAR(reinsertionQueue) = GVAR(reinsertionQueue) - _unitArrs;
|
||||
// broadcast new list to all machines
|
||||
publicVariable QGVAR(reinsertionQueue);
|
||||
|
||||
// sort _unitArrs by time in queue, descending, to get longest wait (if for some reason there's a duplicate)
|
||||
[_unitArrs, [], {
|
||||
_x#2
|
||||
}, "DESCEND"] call BIS_fnc_sortBy;
|
||||
|
||||
// get first entry (longest wait)
|
||||
(_unitArrs#0) params ["_player", "_base", "_timeFiled"]; // _unitArr = [unit, base, timeInQueue]
|
||||
// get the closest base to the player
|
||||
private _nearestBase = [_player] call EFUNC(common,getNearestBase);
|
||||
// log to rpt
|
||||
[
|
||||
LEVEL_INFO,
|
||||
QUOTE(COMPONENT),
|
||||
"PLAYER RESCINDED REQUEST",
|
||||
[_player, [
|
||||
["filedAtBase", [_base] call EFUNC(common,getNameOfBase)],
|
||||
["filedAtBaseDistance", _player distance _base],
|
||||
["closestBase", [_nearestBase] call EFUNC(common,getNameOfBase)],
|
||||
["closestBaseDistance", _player distance _nearestBase],
|
||||
["maxDistanceSetting", _maxRangeToReady],
|
||||
["inQueueDuration", diag_tickTime - _timeFiled]
|
||||
]] call EFUNC(common,addPlayerInfoToArray)
|
||||
] call EFUNC(common,log);
|
||||
@@ -1,57 +0,0 @@
|
||||
// revalidate any players in the queue
|
||||
// compare their distance to the nearest base, and remove them if they're too far away (or dead)
|
||||
#include "..\script_component.hpp"
|
||||
|
||||
private _stillValid = [];
|
||||
private _maxRangeToReady = missionNamespace getVariable [QGVAR(setting_maxRangeToReady), 400];
|
||||
{
|
||||
_x params ["_player", "_base", "_timeFiled"]; // _unitArr = [unit, baseName, timeInQueue]
|
||||
|
||||
private _distanceToOriginalBase = _player distance _base;
|
||||
// get the closest base to the player
|
||||
private _nearestBase = [_player] call EFUNC(common,getNearestBase);
|
||||
private _isCloseEnoughToAnyBase = (_player distance _nearestBase) < _maxRangeToReady;
|
||||
|
||||
if (not _isCloseEnoughToAnyBase || not (alive _player)) then {
|
||||
// don't include player in updated queue
|
||||
// log to rpt
|
||||
[
|
||||
LEVEL_INFO,
|
||||
QUOTE(COMPONENT),
|
||||
"PLAYER DEQUEUED AUTOMATICALLY",
|
||||
[_player, [
|
||||
["filedAtBase", [_base] call EFUNC(common,getNameOfBase)],
|
||||
["filedAtBaseDistance", _player distance _base],
|
||||
["closestBase", [_nearestBase] call EFUNC(common,getNameOfBase)],
|
||||
["closestBaseDistance", _player distance _nearestBase],
|
||||
["maxDistanceSetting", _maxRangeToReady],
|
||||
["inQueueDuration", diag_tickTime - _timeFiled]
|
||||
]] call EFUNC(common,addPlayerInfoToArray)
|
||||
] call EFUNC(common,log);
|
||||
// continue loop
|
||||
continue
|
||||
};
|
||||
|
||||
// include player in updated queue, and update their location to nearest base
|
||||
_stillValid pushBackUnique [_player, _nearestBase, _timeFiled];
|
||||
// if player's base has changed, log to rpt
|
||||
if (_base != _nearestBase) then {
|
||||
[
|
||||
LEVEL_INFO,
|
||||
QUOTE(COMPONENT),
|
||||
"PLAYER BASE WAS UPDATED",
|
||||
[_player, [
|
||||
["filedAtBase", [_base] call EFUNC(common,getNameOfBase)],
|
||||
["filedAtBaseDistance", _player distance _base],
|
||||
["closestBase", [_nearestBase] call EFUNC(common,getNameOfBase)],
|
||||
["closestBaseDistance", _player distance _nearestBase],
|
||||
["maxDistanceSetting", _maxRangeToReady],
|
||||
["inQueueDuration", diag_tickTime - _timeFiled]
|
||||
]] call EFUNC(common,addPlayerInfoToArray)
|
||||
] call EFUNC(common,log);
|
||||
};
|
||||
} forEach GVAR(reinsertionQueue);
|
||||
|
||||
// broadcast new list to all machines
|
||||
GVAR(reinsertionQueue) = _stillValid;
|
||||
publicVariable QGVAR(reinsertionQueue);
|
||||
@@ -1,63 +0,0 @@
|
||||
#include "..\script_component.hpp"
|
||||
|
||||
// adds a scroll wheel action to all arsenal boxes to spawn different supply crate types
|
||||
|
||||
private _arsenalBoxClassName = "Land_PaperBox_open_full_F";
|
||||
|
||||
// get all instances of the arsenal item
|
||||
private _arsenalBoxes = (allMissionObjects _arsenalBoxClassName) select {
|
||||
// only select the ones that already have user actions attached
|
||||
count (actionIDs _x) > 0;
|
||||
};
|
||||
|
||||
private _supplyCratesCfg = call FUNC(getSupplyCratesCfg);
|
||||
private _supplyCrateTypesCfgs = _supplyCratesCfg call BIS_fnc_returnChildren;
|
||||
|
||||
{
|
||||
// add scroll wheel action to spawn different supply box types
|
||||
private _arsenalBox = _x;
|
||||
|
||||
// always remove old actions if they exist
|
||||
private _actionIDs = _arsenalBox getVariable [QGVAR(supplyCrateActionIDs), []];
|
||||
{
|
||||
_arsenalBox removeAction _x;
|
||||
} forEach _actionIDs;
|
||||
_arsenalBox setVariable [QGVAR(supplyCrateActionIDs), []];
|
||||
|
||||
|
||||
// if setting disabled, skip adding actions
|
||||
if (not (
|
||||
[QGVAR(setting_allowSupplyBoxScrollWheelSpawning)] call CBA_settings_fnc_get
|
||||
)) then {continue};
|
||||
|
||||
|
||||
{ // add an action for each supply crate type
|
||||
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"];
|
||||
[
|
||||
objNull,
|
||||
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, [
|
||||
["supplyCrateDisplayName", _supplyCrateDisplayName],
|
||||
["supplyCrateCfgName", configName _supplyCrateCfg],
|
||||
["position", getPos _target]
|
||||
]] call EFUNC(common,addPlayerInfoToArray)
|
||||
] remoteExec [QEFUNC(common,log), 2];
|
||||
}, [_cfg], 0, false, true, "", ""];
|
||||
(_arsenalBox getVariable [QGVAR(supplyCrateActionIDs), []]) pushBack _actionID;
|
||||
} forEach _supplyCrateTypesCfgs;
|
||||
} forEach _arsenalBoxes;
|
||||
@@ -1,29 +0,0 @@
|
||||
#include "..\script_component.hpp"
|
||||
|
||||
[
|
||||
QGVAR(setting_allowSupplyBoxScrollWheelSpawning), // variable
|
||||
"CHECKBOX", // type
|
||||
["Allow Spawning Boxes from Arsenal Box", "If true, adds scroll wheel options to arsenal boxes to spawn supply boxes"], // title
|
||||
[QUOTE(SETTINGS_GROUP_NAME), QUOTE(COMPONENT_BEAUTIFIED)], // category
|
||||
false, // default value
|
||||
true, // global setting
|
||||
{
|
||||
params ["_value"];
|
||||
[
|
||||
QGVAR(setting_allowSupplyBoxScrollWheelSpawning),
|
||||
_value
|
||||
] call EFUNC(common,logSettingChanged);
|
||||
|
||||
if (_value && hasInterface && time > 0) then {
|
||||
[] call FUNC(addArsenalObjectSpawnBoxActions);
|
||||
};
|
||||
},
|
||||
true // requires mission restart
|
||||
] call CBA_fnc_addSetting;
|
||||
|
||||
[
|
||||
LEVEL_INFO,
|
||||
QUOTE(COMPONENT),
|
||||
"CREATED SETTINGS",
|
||||
[]
|
||||
] call EFUNC(common,log);
|
||||
@@ -1,168 +0,0 @@
|
||||
/*
|
||||
* Author: Hizumi & IndigoFox
|
||||
*
|
||||
* Create Mortar resupply box for the 17th Battalion. Primarily called from milsim_fnc_addZenModules
|
||||
*
|
||||
* Arguments:
|
||||
* 0: Vehicle - <OBJECT>
|
||||
* 1: Type - <STRING>
|
||||
* 2: Position - <ARRAY>
|
||||
*
|
||||
* Return Value:
|
||||
* Function executed <BOOL>
|
||||
*
|
||||
* Example:
|
||||
* [box, "AmmoSquad"] call milsim_fnc_createBox; // create mortar ammo box via init line of editor object
|
||||
* [objNull, "AmmoHeavy", pos] call milsim_fnc_createBox; // create mortar ammo box via zeus module
|
||||
*
|
||||
* Public: Yes
|
||||
*
|
||||
* Note: For gathering:
|
||||
formatText ["%1", [
|
||||
["containerClassname", typeOf cursorObject],
|
||||
["backpack", (backpackCargo cursorObject) call BIS_fnc_consolidateArray],
|
||||
["item", (itemCargo cursorObject) call BIS_fnc_consolidateArray],
|
||||
["magazine", (magazineCargo cursorObject) call BIS_fnc_consolidateArray],
|
||||
["magazineAmmo", magazinesAmmoCargo cursorObject],
|
||||
["weapon", (weaponCargo cursorObject) call BIS_fnc_consolidateArray]
|
||||
]];
|
||||
*/
|
||||
|
||||
#include "..\script_component.hpp"
|
||||
|
||||
params [
|
||||
["_box", objNull, [objNull]],
|
||||
["_type", "", [""]],
|
||||
["_pos", [0,0,0], [[]], 3]
|
||||
];
|
||||
|
||||
// get defs class
|
||||
private _supplyCratesCfg = call FUNC(getSupplyCratesCfg);
|
||||
if (!isClass _supplyCratesCfg) exitWith {
|
||||
["Resupply Boxes: Failed to load crate definitions, possibly a bad edit?"] call BIS_fnc_error;
|
||||
objNull;
|
||||
};
|
||||
|
||||
// get the subclass names
|
||||
private _boxTypesAvailable = _supplyCratesCfg call BIS_fnc_getCfgSubClasses;
|
||||
|
||||
// if no type is provided, show the available types
|
||||
if (_type isEqualTo "") exitWith {
|
||||
[
|
||||
"%1 | %2 %3",
|
||||
"Resupply Boxes: [_boxObject, _type, _pos] call milsim_fnc_createBox",
|
||||
"No type provided. Please use one of the following types for _type:",
|
||||
_boxTypesAvailable joinString ", "
|
||||
] call BIS_fnc_error;
|
||||
objNull;
|
||||
};
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// get the box definition class
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
private _boxDef = (_supplyCratesCfg >> _type);
|
||||
// validate it exists
|
||||
if (!isClass _boxDef) exitWith {
|
||||
[
|
||||
"%1 | %2 %3",
|
||||
"Resupply Boxes: [_boxObject, _type, _pos] call milsim_fnc_createBox",
|
||||
"Invalid type provided. Please use one of the following types for _type:",
|
||||
_boxTypesAvailable joinString ", "
|
||||
] call BIS_fnc_error;
|
||||
objNull;
|
||||
};
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// Create box if one wasn't provided in parameters
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
if (isNull _box) then {
|
||||
private _neededBoxType = getText(_boxDef >> "boxClass");
|
||||
if (_neededBoxType isEqualTo "") exitWith {
|
||||
[
|
||||
"Resupply Boxes: Failed to create box. No boxClass defined in the box definition."
|
||||
] call BIS_fnc_error;
|
||||
objNull;
|
||||
};
|
||||
_box = _neededBoxType createVehicle _pos;
|
||||
};
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// Clear box
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
clearBackpackCargoGlobal _box;
|
||||
clearItemCargoGlobal _box;
|
||||
clearMagazineCargoGlobal _box;
|
||||
clearWeaponCargoGlobal _box;
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// Get [item, quantity] arrays from definition
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
private _backpacks = ([_boxDef >> "backpacks"] call BIS_fnc_getCfgDataArray);
|
||||
if (isNil "_backpacks") exitWith {
|
||||
[
|
||||
"Resupply Boxes: Failed to create box. No backpacks defined in the box definition."
|
||||
] call BIS_fnc_error;
|
||||
objNull;
|
||||
};
|
||||
|
||||
private _weapons = ([_boxDef >> "weapons"] call BIS_fnc_getCfgDataArray);
|
||||
if (isNil "_weapons") exitWith {
|
||||
[
|
||||
"Resupply Boxes: Failed to create box. No weapons defined in the box definition."
|
||||
] call BIS_fnc_error;
|
||||
objNull;
|
||||
};
|
||||
|
||||
private _magazines = ([_boxDef >> "magazines"] call BIS_fnc_getCfgDataArray);
|
||||
if (isNil "_magazines") exitWith {
|
||||
[
|
||||
"Resupply Boxes: Failed to create box. No magazines defined in the box definition."
|
||||
] call BIS_fnc_error;
|
||||
objNull;
|
||||
};
|
||||
|
||||
private _items = ([_boxDef >> "items"] call BIS_fnc_getCfgDataArray);
|
||||
if (isNil "_items") exitWith {
|
||||
[
|
||||
"Resupply Boxes: Failed to create box. No items defined in the box definition."
|
||||
] call BIS_fnc_error;
|
||||
objNull;
|
||||
};
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// Add stuff to box
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
{
|
||||
_x params ["_class", "_qty"];
|
||||
_box addBackpackCargoGlobal [_class, _qty]
|
||||
} foreach _backpacks;
|
||||
|
||||
{
|
||||
_x params ["_class", "_qty"];
|
||||
_box addItemCargoGlobal [_class, _qty]
|
||||
} foreach _items;
|
||||
|
||||
{
|
||||
_x params ["_class", "_qty"];
|
||||
_box addMagazineCargoGlobal [_class, _qty]
|
||||
} foreach _magazines;
|
||||
|
||||
{
|
||||
_x params ["_class", "_qty"];
|
||||
_box addWeaponCargoGlobal [_class, _qty]
|
||||
} foreach _weapons;
|
||||
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// Adjust ACE settings
|
||||
//////////////////////////////////////////////////////////////////////////
|
||||
// set box size
|
||||
[_box,1] call ace_cargo_fnc_setSize;
|
||||
|
||||
// ignore weight restrictions for carry/drag
|
||||
_box setVariable ["ace_dragging_ignoreWeightCarry", true, true];
|
||||
|
||||
// Return the box
|
||||
_box;
|
||||
@@ -1,2 +0,0 @@
|
||||
#include "..\script_component.hpp"
|
||||
(missionConfigFile >> "SupplyCrates");
|
||||
@@ -1,14 +0,0 @@
|
||||
#include "..\script_component.hpp"
|
||||
|
||||
if (!hasInterface) exitWith {};
|
||||
|
||||
call FUNC(addArsenalObjectSpawnBoxActions);
|
||||
|
||||
[
|
||||
LEVEL_DEBUG,
|
||||
QUOTE(COMPONENT),
|
||||
"initClient complete",
|
||||
[]
|
||||
] call EFUNC(common,log);
|
||||
|
||||
localNamespace setVariable [QGVAR(complete), true];
|
||||
@@ -1,3 +0,0 @@
|
||||
#define COMPONENT resupply
|
||||
#define COMPONENT_BEAUTIFIED Resupply
|
||||
#include "../script_mod.hpp"
|
||||
@@ -1,11 +0,0 @@
|
||||
// all text before cba include
|
||||
#define SETTINGS_GROUP_NAME 17th Battalion
|
||||
#define MODULE_CATEGORY_NAME 17th Battalion
|
||||
|
||||
#define LEVEL_TRACE -1
|
||||
#define LEVEL_DEBUG 0
|
||||
#define LEVEL_INFO 1
|
||||
#define LEVEL_WARNING 2
|
||||
#define LEVEL_ERROR 3
|
||||
|
||||
#include "\x\cba\addons\main\script_macros_mission.hpp"
|
||||
@@ -1,17 +0,0 @@
|
||||
#define PREFIX milsim
|
||||
|
||||
#include "script_version.hpp"
|
||||
|
||||
#define VERSION MAJOR.MINOR.PATCHLVL
|
||||
#define VERSION_STR MAJOR.MINOR.PATCHLVL
|
||||
#define VERSION_AR MAJOR,MINOR,PATCHLVL
|
||||
|
||||
// #define DEBUG_MODE -1 // TRACE
|
||||
// #define DEBUG_MODE 0 // DEBUG
|
||||
#define DEBUG_MODE 1 // INFO
|
||||
// #define DEBUG_MODE 2 // WARNING
|
||||
// #define DEBUG_MODE 3 // ERROR
|
||||
|
||||
|
||||
// should always be last
|
||||
#include "script_macros.hpp"
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user