Compare commits

..

79 Commits

Author SHA1 Message Date
c45f778188 Merge pull request 'move-supply-crates-to-cfg' (#17) from move-supply-crates-to-cfg into develop
Reviewed-on: https://17th-gs.iceberg-gaming.com:5443/hizumi/MissionTemplate/pulls/17
2024-02-04 22:56:25 -06:00
7cc8d9aaca Merge branch 'develop' into move-supply-crates-to-cfg 2024-02-04 22:55:58 -06:00
311a4c4007 Merge pull request 'move-flags-to-config' (#18) from move-flags-to-config into develop
Reviewed-on: https://17th-gs.iceberg-gaming.com:5443/hizumi/MissionTemplate/pulls/18
2024-02-04 22:54:40 -06:00
d7b8e5186e tested local 2024-02-03 22:55:21 -08:00
94ccf0d80d adds scroll wheel spawning and setting, adds utils for getting cfg 2024-02-03 22:37:44 -08:00
09dcde7471 wip 2024-02-03 20:59:51 -08:00
7ef48ecaa2 move to cfg, update createbox, create /defines 2024-02-03 18:40:18 -08:00
6764186794 Merge remote-tracking branch 'origin/main' into update-asset-diary-entries 2024-02-03 18:39:11 -08:00
affc8ffb1f remove debug hint 2024-02-03 15:04:47 -08:00
b8b8f1de22 use netId in dairy entry link for dedicated to work 2024-02-03 13:53:28 -08:00
8d93bb5743 adds starting assets and assets at mission end to RPT 2024-02-02 15:13:45 -08:00
b67888f4f1 locally tested, adds more features. ready for dedi 2024-02-02 14:34:04 -08:00
3f5c6c5a59 WIP: add asset diary pages 2024-02-02 01:06:43 -08:00
hizumi
30e09b3bb7 Update CHANGELOG.md 2024-02-01 23:46:32 -06:00
hizumi
ca5ee22f04 Update README.md
document new folder structure
2024-02-01 23:27:15 -06:00
hizumi
75c13ce69b Update fn_initServer.sqf
update old no longer existing asset for fixed wing aircraft to currently used asset
2024-02-01 23:22:09 -06:00
29a04a1851 Merge pull request 'move-battalion-struct-to-missioncfg' (#15) from move-battalion-struct-to-missioncfg into main
Reviewed-on: https://17th-gs.iceberg-gaming.com:5443/hizumi/MissionTemplate/pulls/15
2024-02-01 23:19:35 -06:00
1e4a5a79a8 updates FBCB2, updates log fnc, adds comments 2024-02-01 20:52:10 -08:00
c7d9298987 Merge branch 'main' into move-battalion-struct-to-missioncfg 2024-02-01 15:20:25 -08:00
a7550d374e major updates to fbcb2 diary stuff 2024-02-01 15:19:30 -08:00
94b0d5becf Merge pull request 'inv_expan' (#13) from inv_expan into main
Reviewed-on: https://17th-gs.iceberg-gaming.com:5443/hizumi/MissionTemplate/pulls/13
2024-02-01 14:12:58 -06:00
bb388ecfb1 Merge branch 'main' into inv_expan 2024-02-01 14:12:10 -06:00
2d6fbcfcef defines battalion info, integrates FBCB2 freqs and callsigns 2024-02-01 01:23:21 -08:00
4677d54689 tested. moves defs to cfg where they should be, plus refactor of gather 2024-01-31 19:43:30 -08:00
dc33829751 changes logging, and eval inv on server only 2024-01-30 18:25:46 -08:00
8c40b107a5 update logging, add netId to player info, logmissioninfo 2024-01-30 18:24:55 -08:00
dbff8d31d4 Merge branch 'main' into inv_expan 2024-01-30 17:03:36 -08:00
ac9509244f Merge pull request 'reinsert-requests' (#14) from reinsert-requests into main
Reviewed-on: https://17th-gs.iceberg-gaming.com:5443/hizumi/MissionTemplate/pulls/14
2024-01-30 19:00:00 -06:00
53c1d3b18d change milsim_respawn to milsim_reinsert 2024-01-30 15:37:04 -08:00
9ec51a5e19 big refactor to isolate functionality. adds milsim_fnc_log. 2024-01-30 15:05:02 -08:00
f52011cbc4 adds getNearestBase, rework logging, use server diag_tickTime 2024-01-30 10:39:45 -08:00
3e4b0c76b9 Merge pull request 'improve inventory check performance and logging' (#10) from #7-inventory-compliance-message into inv_expan
Reviewed-on: https://17th-gs.iceberg-gaming.com:5443/hizumi/MissionTemplate/pulls/10
2024-01-29 23:37:07 -06:00
072975c99e Merge pull request 'change logPlayerInventory to return lines, which handlers send to CBA ev' (#12) from #11-inventory-processed-on-every-machine into #7-inventory-compliance-message
Reviewed-on: https://17th-gs.iceberg-gaming.com:5443/hizumi/MissionTemplate/pulls/12
2024-01-29 23:36:41 -06:00
cada98e15a change logPlayerInventory to return lines, which handlers send to CBA ev 2024-01-29 13:48:35 -08:00
2951e9cda9 structured logging 2024-01-29 13:26:44 -08:00
8d42fa4593 fixes error in respawn wait over threshold notification 2024-01-29 10:59:39 -08:00
f77e418ac8 simplifies log types 2024-01-29 10:35:24 -08:00
93204f7d36 rework for structured logging and improvements 2024-01-29 10:18:01 -08:00
49fb1bb7fa fixes '_restricted' var references, uses find to identify if any non0 2024-01-28 22:44:49 -08:00
b6189cc7f3 fixes reinsertion formatting and includes groups in diaglog 2024-01-28 22:38:38 -08:00
49fa0c39d2 makes supply boxes ignore weight restrictions for drag and carry 2024-01-28 21:14:22 -08:00
018255a9ab Merge pull request 'feature/reinsert-queue' (#9) from feature/reinsert-queue into main
Reviewed-on: https://17th-gs.iceberg-gaming.com:5443/hizumi/MissionTemplate/pulls/9
2024-01-28 22:52:45 -06:00
7f0431868d Merge branch 'main' into feature/reinsert-queue 2024-01-28 22:52:33 -06:00
801328dc6e Merge pull request 'feature/better-ammo-boxes' (#8) from feature/better-ammo-boxes into main
Reviewed-on: https://17th-gs.iceberg-gaming.com:5443/hizumi/MissionTemplate/pulls/8
2024-01-28 22:49:08 -06:00
fbbc699197 Merge branch 'main' into feature/better-ammo-boxes 2024-01-28 22:48:31 -06:00
9b7042cd7d add mortar resupply crates for mk6 and 60mm 2024-01-28 14:40:03 -08:00
1ac1664faf bug fixes 2024-01-28 13:46:56 -08:00
e395fa9c16 add forcedPilotCheck setting, some formatting changes 2024-01-26 21:22:35 -08:00
4ced508005 add global broadcast on players waiting longer than threshold, log 2024-01-26 21:06:47 -08:00
7e4af79fed locally tested. adds settings, fixes removal logic 2024-01-26 16:16:18 -08:00
754d7356e1 adds events, queue, auto-notifications, manual checks for pilots 2024-01-26 00:45:52 -08:00
d823ebeb26 fix icons for crate defs 2024-01-25 21:39:39 -08:00
e9fc5cfe21 update FBCB2 element callsigns 2024-01-25 21:24:14 -08:00
dcb8d2d0d6 fix cfgfunctions and add init declaration 2024-01-25 21:14:11 -08:00
ef4c5a63ad add general createBox fnc, adjust zen module, central definition 2024-01-25 21:08:37 -08:00
6eb598b660 Update fn_logPlayerInventory.sqf
Expanded the items arrays to check not only internal inventory items but primary slot inventory items.
2024-01-16 22:48:36 -06:00
7a1d0be6d6 Update 'functions/server/fn_logPlayerInventory.sqf'
Updated the fn_logPlayerInventory.sqf to do a check against a list of items that are "approved / rejected / restricted / and meme items in a players inventory
2024-01-15 21:44:40 -06:00
445cb5e75d Merge pull request 'Adjust Draw3D Triage Deceased Color to Dark Gray' (#5) from feature/triagestatus-draw3d into main
Reviewed-on: https://17th-gs.iceberg-gaming.com:5443/hizumi/MissionTemplate/pulls/5
2024-01-10 01:07:58 -06:00
09a800ab01 Merge branch 'main' into feature/triagestatus-draw3d 2024-01-10 01:05:46 -06:00
723aebcbf5 fix handler cleanup and make deceased a dark gray 2024-01-09 23:03:17 -08:00
Hizumi
6f5affd283 Update CHANGELOG.md
for release 3.1.3
2024-01-10 00:23:11 -06:00
dbe5473dad Merge pull request 'Draw 3D icons representing triage status of unconscious units (visible to medics only)' (#4) from feature/triagestatus-draw3d into main
Reviewed-on: https://17th-gs.iceberg-gaming.com:5443/hizumi/MissionTemplate/pulls/4
2024-01-10 00:19:15 -06:00
7630efeb4d fixes unit gather method, ready 2024-01-09 22:16:43 -08:00
12dd0fc83c Merge remote-tracking branch 'origin/main' into feature/triagestatus-draw3d 2024-01-09 21:29:56 -08:00
Hizumi
3b06fe717b Update CHANGELOG.md 2024-01-09 02:17:50 -06:00
Hizumi
d9dfee0c7b rewrite logic for inventory check 2024-01-09 02:15:53 -06:00
1f1552bd53 Merge pull request 'add exclusion whitelist for known vehicle models w/out flag proxies' (#3) from bug/update-flag-exclusions into main
Reviewed-on: https://17th-gs.iceberg-gaming.com:5443/hizumi/MissionTemplate/pulls/3
2024-01-08 15:02:21 -06:00
c912e730ac Merge branch 'main' into bug/update-flag-exclusions 2024-01-07 21:31:07 -06:00
0301758e28 add exclusion whitelist for known vehicle models w/out flag proxies 2024-01-07 19:28:38 -08:00
Hizumi
85e9af6a73 version 3.1.2 2024-01-04 01:12:14 -06:00
Hizumi
32d8589733 add medical overlay 2024-01-04 01:11:59 -06:00
Hizumi
bc9b20a89d version 3.1.1 2024-01-04 01:09:57 -06:00
61d3e2faf1 Merge pull request 'Fix flags applying to CAManBase' (#2) from bug/flags-apply-to-men into main
Reviewed-on: https://17th-gs.iceberg-gaming.com:5443/hizumi/MissionTemplate/pulls/2
2023-12-29 23:31:28 -06:00
544039efbf Merge branch 'main' into bug/flags-apply-to-men 2023-12-29 23:31:02 -06:00
15f7225a5f define parent classes to apply handler to 2023-12-29 21:21:19 -08:00
a3da783d06 Merge pull request 'fixes spelling of battalion' (#1) from bug/fixtypo into main
Reviewed-on: https://17th-gs.iceberg-gaming.com:5443/hizumi/MissionTemplate/pulls/1
2023-12-29 18:22:45 -06:00
18435194a7 fixes spelling of battalion 2023-12-29 11:21:57 -08:00
Hizumi
da3b45ccda version 3.1.0 2023-12-29 12:14:36 -06:00
9fc926619e initial, still encountering some issues with dead (never uncon) bodies 2023-12-17 21:07:47 -08:00
98 changed files with 4197 additions and 441 deletions

View File

@@ -4,6 +4,51 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project badly attempts [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [3.2] - 2024-02-01
### 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
## [3.1.2] - 2024-01-04
### Added
- Add forgotten code file file for medical overlay
### Changed
- Merge update-flag-exclusions branch to fix issues with vehicles not applying flag
## [3.1.1] - 2024-01-04
### Changed
- Spelling Fixes
- Update class binding for vehicle flag interaction
## [3.1.0] - 2023-12-17
### Added
- Vehicles now have an ace interaction to allow the mounting of flags onto them for identification. Contributed by IndigoFox
- Added inventory validation checks
- Added empty group removal code due to ownership issues on entity transfers
- Added medical card visibility to medics for triage purposes
## [3.0.2] - 2023-10-14
### Changed

View File

@@ -10,6 +10,7 @@ Once copied, the final structure should appear similar to the following:
├── images/
├── scripts/
├── sounds/
├── textures/
├── description.ext
├── mission.jpg
├── mission.sqm
@@ -52,3 +53,7 @@ This directory is for organizational purposes for any custom scripts you wish to
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

View File

@@ -0,0 +1,35 @@
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

View File

@@ -0,0 +1,37 @@
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.")

84
aaFrameworkUtils/test.csv Normal file
View File

@@ -0,0 +1,84 @@
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 box_config_name box_friendly_name box_class box_tooltip category item_class item_name quantity
2 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
3 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
4 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
5 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
6 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
7 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
8 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
9 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
10 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
11 MortarMk6Resupply Mortar MK6 Supply Crate Box_NATO_WpsSpecial_F A crate containing Mk6 mortar resupply (tubes) and tools. items ACE_artilleryTable Artillery Rangetable 2
12 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
13 MortarMk6Resupply Mortar MK6 Supply Crate Box_NATO_WpsSpecial_F A crate containing Mk6 mortar resupply (tubes) and tools. items ACE_microDAGR MicroDAGR GPS 2
14 MortarMk6Resupply Mortar MK6 Supply Crate Box_NATO_WpsSpecial_F A crate containing Mk6 mortar resupply (tubes) and tools. items ACE_MapTools Map Tools 2
15 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
16 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
17 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
18 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
19 MortarMk6Resupply Mortar MK6 Supply Crate Box_NATO_WpsSpecial_F A crate containing Mk6 mortar resupply (tubes) and tools. magazines acex_intelitems_notepad Notepad 2
20 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
21 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
22 AmmoSquad Squad Ammo Box_Syndicate_Ammo_F A crate containing general ammunition and equipment for an infantry squad. weapons rhs_weap_m72a7 M72A7 2
23 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
24 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
25 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
26 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
27 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
28 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
29 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
30 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
31 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
32 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
33 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
34 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
35 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
36 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
37 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
38 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
39 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
40 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
41 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
42 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
43 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
44 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
45 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
46 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
47 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
48 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
49 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
50 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
51 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
52 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
53 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
54 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
55 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
56 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
57 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
58 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
59 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
60 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
61 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
62 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
63 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
64 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
65 Launchers Launcher Crate Box_NATO_WpsLaunch_F A crate containing missile launchers and ammunition. weapons launch_NLAW_F NLAW 2
66 Launchers Launcher Crate Box_NATO_WpsLaunch_F A crate containing missile launchers and ammunition. weapons rhs_weap_fim92 FIM-92F 2
67 Launchers Launcher Crate Box_NATO_WpsLaunch_F A crate containing missile launchers and ammunition. magazines Titan_AA Titan AA Missile 6
68 Launchers Launcher Crate Box_NATO_WpsLaunch_F A crate containing missile launchers and ammunition. magazines Titan_AT Titan AT Missile 6
69 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
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
71 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
72 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
73 MedicalSupplies Medical Crate ACE_medicalSupplyCrate_advanced A crate containing medical supplies. items ACE_packingBandage Bandage (Packing) 100
74 MedicalSupplies Medical Crate ACE_medicalSupplyCrate_advanced A crate containing medical supplies. items ACE_elasticBandage Bandage (Elastic) 100
75 MedicalSupplies Medical Crate ACE_medicalSupplyCrate_advanced A crate containing medical supplies. items ACE_tourniquet Tourniquet (CAT) 48
76 MedicalSupplies Medical Crate ACE_medicalSupplyCrate_advanced A crate containing medical supplies. items ACE_splint Splint 48
77 MedicalSupplies Medical Crate ACE_medicalSupplyCrate_advanced A crate containing medical supplies. items ACE_morphine Morphine Autoinjector 50
78 MedicalSupplies Medical Crate ACE_medicalSupplyCrate_advanced A crate containing medical supplies. items ACE_epinephrine Epinephrine Autoinjector 50
79 MedicalSupplies Medical Crate ACE_medicalSupplyCrate_advanced A crate containing medical supplies. items ACE_bloodIV Blood IV (1000ml) 75
80 MedicalSupplies Medical Crate ACE_medicalSupplyCrate_advanced A crate containing medical supplies. items ACE_bloodIV_500 Blood IV (500ml) 50
81 MedicalSupplies Medical Crate ACE_medicalSupplyCrate_advanced A crate containing medical supplies. items ACE_bloodIV_250 Blood IV (250ml) 25
82 MedicalSupplies Medical Crate ACE_medicalSupplyCrate_advanced A crate containing medical supplies. items ACE_quikclot Bandage (QuikClot) 75
83 MedicalSupplies Medical Crate ACE_medicalSupplyCrate_advanced A crate containing medical supplies. items ACE_personalAidKit Personal Aid Kit 5
84 MedicalSupplies Medical Crate ACE_medicalSupplyCrate_advanced A crate containing medical supplies. items ACE_surgicalKit Surgical Kit 5

View File

@@ -0,0 +1,22 @@
// Lists approved fixed-wing and rotary vehicle types that mission makers can use in their missions.
class ApprovedAssets {
// Fixed-wing aircraft
class USAF_A10 {callsign = "Ares";};
class RHSGREF_A29B_HIDF {callsign = "Odyssey";};
class USAF_C130J {callsign = "Hercules";};
// Rotary aircraft
class RHS_MELB_MH6M {callsign = "Apollo";};
class RHS_MELB_AH6M {callsign = "Artemis";};
class RHS_MELB_H6M {callsign = "Icarus";};
class RHS_CH_47F {callsign = "Achilles";};
class ej_MH60MDAP4 {callsign = "Hades";};
class RHS_UH60M {callsign = "Griffin";};
class RHS_UH60M_MEV2 {callsign = "Dustoff";};
class B_T_VTOL_01_INFANTRY_F {callsign = "Pegasus";};
class B_T_VTOL_01_ARMED_F {callsign = "Spartan";};
class RHS_AH64D {callsign = "Orion";};
class RHS_AH1Z {callsign = "Athena";};
class RHS_UH1Y {callsign = "Homer";};
class rhsusf_CH53E_USMC {callsign = "Atlas";};
};

253
defines/BattalionInfo.hpp Normal file
View File

@@ -0,0 +1,253 @@
// BattalionInfo.hpp
// Defines the structure of the Battalion, allowing properties to be easily changed and updated
// This file is included in description.ext
// Define the callsigns for the Battalion
#define COMMAND_CALLSIGN SPARTAN
#define RRC_CALLSIGN TIGER
#define MEDIC_CALLSIGN LIFELINE
#define ALPHA_CALLSIGN BLACKJACK
#define ECHO_CALLSIGN ZOOMER
#define WPN_CALLSIGN BLACKFOOT
// Define the frequencies for the Battalion
#define FREQ_BATTALION 45
#define FREQ_BATTALION_MEDICAL_INTERCOM 91.1
#define FREQ_ALL_MEDICAL_SR 121.5
#define FREQ_ALPHA_COMPANY 40
#define FREQ_PLATOON1_SR 100
#define FREQ_PLATOON1_LR 41
#define FREQ_PLATOON1_RTO 101
#define FREQ_PLATOON2_SR 200
#define FREQ_PLATOON2_LR 42
#define FREQ_PLATOON2_RTO 201
#define FREQ_ECHO_FLIGHT_INTERCOM 30
#define FREQ_ECHO_FLIGHT_CAS 35
#define FREQ_ECHO_FLIGHT_LOGISTICS 35.1
#define FREQ_ECHO_GROUND 80
#define FREQ_ECHO_GROUND_LOGISTICS 81
#define FREQ_ECHO_ARTY 82
#define FREQ_ECHO_ARTY_INTERCOM 155
#define FREQ_CONVOY 50
// Define the text colors to appear in diary entries
#define LVL1_TEXT_COLOR "#7c887e"
#define LVL2_TEXT_COLOR "#bab79f"
#define LVL3_TEXT_COLOR "#91967f"
#define LVL4_TEXT_COLOR "#d3d2cd"
// All elements and subclasses should have the following properties:
// callsign: the callsign of the element
// textColor: the color of the text for the element
// frequencies: an array of frequencies for the element in the format:
// {roleWithinElement, {primarySR, additionalSR}, {primaryLR, additionalLR}}
// Battalion-level elements under Command should have the following additional properties:
// shortDescription: a short description of the element's place in the Battalion
// System macros
#define CALLSIGN_ELEMENT(callsign,element) callsign##element
class BattalionInfo {
class Command {
callsign = COMMAND_CALLSIGN;
shortDescription = "Battalion Command";
textColor = LVL1_TEXT_COLOR;
// frequencies are in format:
// {roleWithinElement, {primarySR, additionalSR}, {primaryLR, additionalLR}}
frequencies[] = {
{"Contact", {}, {FREQ_BATTALION}},
{"Actual", {}, {FREQ_BATTALION}},
{"Romeo", {}, {FREQ_BATTALION, FREQ_ECHO_FLIGHT_CAS}}
};
class RRC { // WIP
callsign = RRC_CALLSIGN;
shortDescription = "RRC";
textColor = LVL2_TEXT_COLOR;
frequencies[] = {
{"Contact", {}, {FREQ_BATTALION}},
{"Actual", {}, {FREQ_BATTALION, FREQ_ECHO_FLIGHT_CAS}}
};
};
class BattalionMedical { // WIP
callsign = MEDIC_CALLSIGN;
shortDescription = "Battalion Medical";
textColor = LVL2_TEXT_COLOR;
frequencies[] = {
{"Contact", {FREQ_ALL_MEDICAL_SR}, {FREQ_BATTALION}},
{"Actual", {FREQ_BATTALION_MEDICAL_INTERCOM, FREQ_ALL_MEDICAL_SR}, {FREQ_BATTALION, FREQ_ECHO_FLIGHT_LOGISTICS}},
{"General", {FREQ_BATTALION_MEDICAL_INTERCOM, FREQ_ALL_MEDICAL_SR}, {}}
};
};
class WeaponsSquad { // WIP
callsign = WPN_CALLSIGN;
shortDescription = "Special Weapons Squad";
textColor = LVL2_TEXT_COLOR;
frequencies[] = {
{"Contact", {}, {FREQ_BATTALION}}
};
};
class AlphaCompany {
callsign = ALPHA_CALLSIGN;
shortDescription = "Alpha Company";
textColor = LVL2_TEXT_COLOR;
frequencies[] = {
{"Contact", {}, {FREQ_ALPHA_COMPANY, FREQ_BATTALION}}
};
class Platoon1 {
callsign = CALLSIGN_ELEMENT(ALPHA_CALLSIGN, 1-6);
textColor = LVL3_TEXT_COLOR;
frequencies[] = {
{"Actual", {FREQ_PLATOON1_SR, FREQ_PLATOON1_RTO}, {FREQ_PLATOON1_LR, FREQ_ALPHA_COMPANY}},
{"Romeo", {}, {FREQ_BATTALION, FREQ_ECHO_FLIGHT_CAS, FREQ_ECHO_FLIGHT_LOGISTICS}}
};
class Squad1 {
callsign = CALLSIGN_ELEMENT(ALPHA_CALLSIGN, 1-1);
textColor = LVL4_TEXT_COLOR;
frequencies[] = {
{"Actual", {110, FREQ_PLATOON1_SR}, {FREQ_PLATOON1_LR}},
{"Alpha Team", {111, 110}, {}},
{"Bravo Team", {112, 110}, {}},
{"Medic", {110, FREQ_ALL_MEDICAL_SR}, {}}
};
};
class Squad2 {
callsign = CALLSIGN_ELEMENT(ALPHA_CALLSIGN, 1-2);
textColor = LVL4_TEXT_COLOR;
frequencies[] = {
{"Actual", {120, FREQ_PLATOON1_SR}, {FREQ_PLATOON1_LR}},
{"Alpha Team", {121, 120}, {}},
{"Bravo Team", {122, 120}, {}},
{"Medic", {120, FREQ_ALL_MEDICAL_SR}, {}}
};
};
class Squad3 {
callsign = CALLSIGN_ELEMENT(ALPHA_CALLSIGN, 1-3);
textColor = LVL4_TEXT_COLOR;
frequencies[] = {
{"Actual", {130, FREQ_PLATOON1_SR}, {FREQ_PLATOON1_LR}},
{"Alpha Team", {131, 130}, {}},
{"Bravo Team", {132, 130}, {}},
{"Medic", {130, FREQ_ALL_MEDICAL_SR}, {}}
};
};
};
class Platoon2 {
callsign = CALLSIGN_ELEMENT(ALPHA_CALLSIGN, 2-6);
textColor = LVL3_TEXT_COLOR;
frequencies[] = {
{"Actual", {FREQ_PLATOON2_SR, FREQ_PLATOON2_RTO}, {FREQ_PLATOON2_LR, FREQ_ALPHA_COMPANY}}
};
class Squad1 {
callsign = CALLSIGN_ELEMENT(ALPHA_CALLSIGN, 2-1);
textColor = LVL4_TEXT_COLOR;
frequencies[] = {
{"Actual", {210, FREQ_PLATOON2_SR}, {FREQ_PLATOON2_LR}},
{"Alpha Team", {211, 210}, {}},
{"Bravo Team", {212, 210}, {}},
{"Medic", {210, FREQ_ALL_MEDICAL_SR}, {}}
};
};
class Squad2 {
callsign = CALLSIGN_ELEMENT(ALPHA_CALLSIGN, 2-2);
textColor = LVL4_TEXT_COLOR;
frequencies[] = {
{"Actual", {220, FREQ_PLATOON2_SR}, {FREQ_PLATOON2_LR}},
{"Alpha Team", {221, 220}, {}},
{"Bravo Team", {222, 220}, {}},
{"Medic", {220, FREQ_ALL_MEDICAL_SR}, {}}
};
};
class Squad3 {
callsign = CALLSIGN_ELEMENT(ALPHA_CALLSIGN, 2-3);
textColor = LVL4_TEXT_COLOR;
frequencies[] = {
{"Actual", {230, FREQ_PLATOON2_SR}, {FREQ_PLATOON2_LR}},
{"Alpha Team", {231, 230}, {}},
{"Bravo Team", {232, 230}, {}},
{"Medic", {230, FREQ_ALL_MEDICAL_SR}, {}}
};
};
};
};
class EchoCompany {
callsign = ECHO_CALLSIGN;
shortDescription = "Echo Company";
textColor = LVL2_TEXT_COLOR;
frequencies[] = {
{"Contact", {}, {FREQ_BATTALION}},
{"Actual", {}, {FREQ_BATTALION}}
};
class Flight {
callsign = CALLSIGN_ELEMENT(ECHO_CALLSIGN, FLIGHT);
textColor = LVL3_TEXT_COLOR;
frequencies[] = {
{"Contact", {}, {FREQ_BATTALION}},
{"Actual", {}, {FREQ_ECHO_FLIGHT_INTERCOM, FREQ_BATTALION}},
{"CAS Support", {}, {FREQ_ECHO_FLIGHT_INTERCOM, FREQ_ECHO_FLIGHT_CAS}},
{"Logistics", {}, {FREQ_ECHO_FLIGHT_INTERCOM, FREQ_ECHO_FLIGHT_LOGISTICS}}
};
};
class Ground {
callsign = CALLSIGN_ELEMENT(ECHO_CALLSIGN, GROUND);
textColor = LVL3_TEXT_COLOR;
frequencies[] = {
{"Contact", {}, {FREQ_BATTALION}},
{"Actual", {}, {FREQ_ECHO_GROUND, FREQ_BATTALION}}
};
class Logistics {
callsign = CALLSIGN_ELEMENT(ECHO_CALLSIGN, LOGISTICS);
textColor = LVL4_TEXT_COLOR;
frequencies[] = {
{"Contact", {}, {FREQ_ECHO_GROUND}},
{"Actual", {}, {FREQ_ECHO_GROUND_LOGISTICS, FREQ_ECHO_GROUND}},
{"General", {}, {FREQ_ECHO_GROUND_LOGISTICS}},
{"Convoy", {}, {FREQ_CONVOY}}
};
};
class Attack {
callsign = CALLSIGN_ELEMENT(ECHO_CALLSIGN, ATTACK);
textColor = LVL4_TEXT_COLOR;
frequencies[] = {
{"Contact", {}, {FREQ_ECHO_GROUND, FREQ_ECHO_FLIGHT_CAS}},
{"Actual", {}, {FREQ_ECHO_GROUND}},
{"General", {}, {FREQ_ECHO_GROUND}},
{"Convoy", {}, {FREQ_CONVOY}}
};
};
class Artillery {
callsign = CALLSIGN_ELEMENT(ECHO_CALLSIGN, ARTILLERY);
textColor = LVL4_TEXT_COLOR;
frequencies[] = {
{"General", {FREQ_ECHO_ARTY_INTERCOM}, {FREQ_ECHO_GROUND, FREQ_ECHO_ARTY}}
};
};
};
};
};
};

View File

@@ -0,0 +1,223 @@
// To access these from SQF:
// to get an array of STRING with each subclass name:
// (missionConfigFile >> "DisallowedEquipment") call BIS_fnc_getCfgSubClasses
// To access a specific class' properties:
// (missionConfigFile >> "DisallowedEquipment" >> "blacklisted" >> "label") call BIS_fnc_getCfgData;
// (missionConfigFile >> "DisallowedEquipment" >> "blacklisted" >> "description") call BIS_fnc_getCfgData;
// (missionConfigFile >> "DisallowedEquipment" >> "blacklisted" >> "items") call BIS_fnc_getCfgDataArray;
class DisallowedEquipment {
class blacklisted {
label = "BLACKLISTED WEAPON OR ITEM";
description = "Items that NO member is allowed to use.";
items[] = {
"17BN_ANPVS14", // NVG AN/PVS-14
"ej_PVS15D", // NVG AN/PVS-15
"ej_VPS15", // NVG AN/PVS-15
"LMG_Mk200_black_F", //Mk200 Series
"LMG_Mk200_F", //Mk200 Series
"rhs_weap_g36c", // G36 Series
"rhs_weap_g36kv_ag36", // G36 Series
"rhs_weap_g36kv", // G36 Series
"rhs_weap_m14_d", // M14 Series
"rhs_weap_m14_fiberglass", // M14 Series
"rhs_weap_m14_rail_d", // M14 Series
"rhs_weap_m14_rail_fiberglass", // M14 Series
"rhs_weap_m14_rail_wd", // M14 Series
"rhs_weap_m14_rail", // M14 Series
"rhs_weap_m14_ris_d", // M14 Series
"rhs_weap_m14_ris_fiberglass", // M14 Series
"rhs_weap_m14_ris_wd", // M14 Series
"rhs_weap_m14_ris", // M14 Series
"rhs_weap_m14_socom_rail", // M14 Series
"rhs_weap_m14_socom", // M14 Series
"rhs_weap_m14_wd", // M14 Series
"rhs_weap_m14_weap_m14ebrri", // M14 Series
"rhs_weap_m14", // M14 Series
"rhs_weap_m16a4_carryhandle_M203", // M16 Series
"rhs_weap_m16a4_carryhandle", // M16 Series
"rhs_weap_m16a4_imod_M203", // M16 Series
"rhs_weap_m16a4_imod", // M16 Series
"rhs_weap_m16a4", // M16 Series
"rhs_weap_m27iar_grip", // M27 Series
"rhs_weap_m27iar", // M27 Series
"rhsusf_ANPVS_14", // NVG AN/PVS-14
"rhsusf_ANPVS_15", // NVG AN/PVS-15
"SMA_ACRREM", //Remington ACR 556+6.5
"SMA_ACRREMAFG", //Remington ACR 556+6.5
"SMA_ACRREMAFGblk", //Remington ACR 556+6.5
"SMA_ACRREMAFGCQB", //Remington ACR 556+6.5
"SMA_ACRREMAFGCQBblk", //Remington ACR 556+6.5
"SMA_ACRREMblk", //Remington ACR 556+6.5
"SMA_ACRREMCQBGL", //Remington ACR 556+6.5
"SMA_ACRREMGL_B", //Remington ACR 556+6.5
"SMA_ACRREMGL", //Remington ACR 556+6.5
"SMA_ACRREMMOE", //Remington ACR 556+6.5
"SMA_ACRREMMOEblk", //Remington ACR 556+6.5
"SMA_ACRREMMOECQB", //Remington ACR 556+6.5
"SMA_ACRREMMOECQBblk", //Remington ACR 556+6.5
"srifle_DMR_06_camo_F", // M14 Series
"srifle_DMR_06_hunter_F", // M14 Series
"srifle_DMR_06_olive_F", // M14 Series
"srifle_EBR_F", // Mk14 Series
"Tier1_SIG_CMX_115_Virtus_300BLK_Black", // MCX 300 Blackout
"Tier1_SIG_CMX_115_Virtus_300BLK_Desert", // MCX 300 Blackout
"Tier1_SIG_CMX_115_Virtus_300BLK_FDE", // MCX 300 Blackout
"Tier1_SIG_CMX_115_Virtus_300BLK", // MCX 300 Blackout
"UK3CB_AG36_MLIC", // G36 Series
"UK3CB_AG36_TAC_K", // G36 Series
"UK3CB_AG36A1", // G36 Series
"UK3CB_AG36E1", // G36 Series
"UK3CB_AG36V", // G36 Series
"UK3CB_FNFAL_FOREGRIP", // FN_FAL Series
"UK3CB_FNFAL_FULL_RAILS", // FN_FAL Series
"UK3CB_FNFAL_FULL", // FN_FAL Series
"UK3CB_FNFAL_OSW_GL", // FN_FAL Series
"UK3CB_FNFAL_OSW", // FN_FAL Series
"UK3CB_FNFAL_PARA_RAILS", // FN_FAL Series
"UK3CB_FNFAL_PARA", // FN_FAL Series
"UK3CB_FNFAL_STG58", // FN_FAL Series
"UK3CB_G36_KSK_K", // G36 Series
"UK3CB_G36_KSK", // G36 Series
"UK3CB_G36_LSW", // G36 Series
"UK3CB_G36_MLIC_C", // G36 Series
"UK3CB_G36_MLIC_K", // G36 Series
"UK3CB_G36_MLIC", // G36 Series
"UK3CB_G36_TAC_C", // G36 Series
"UK3CB_G36_TAC", // G36 Series
"UK3CB_G36A1_C", // G36 Series
"UK3CB_G36A1_K", // G36 Series
"UK3CB_G36A1", // G36 Series
"UK3CB_G36E1_C", // G36 Series
"UK3CB_G36E1_K", // G36 Series
"UK3CB_G36E1", // G36 Series
"UK3CB_G36V_C", // G36 Series
"UK3CB_G36V_K", // G36 Series
"UK3CB_G36V", // G36 Series
"UK3CB_M14_Railed", // M14 Series
"UK3CB_M14", // M14 Series
"UK3CB_M14DMR_BLK", // M14 Series
"UK3CB_M14DMR_Railed_BLK", // M14 Series
"UK3CB_M14DMR_Railed", // M14 Series
"UK3CB_M14DMR", // M14 Series
"UK3CB_M16_Carbine", // M16 Series
"UK3CB_M16A1_LSW", // M16 Series
"UK3CB_M16A1", // M16 Series
"UK3CB_M16A2_UGL", // M16 Series
"UK3CB_M16A2", // M16 Series
"UK3CB_M16A3", // M16 Series
"USP_PVS_14", // NVG AN/PVS-14
"USP_PVS_15" // NVG AN/PVS-15
};
};
class restrictedItems {
label = "RESTRICTED ITEM";
description = "Items that are allowed for specific USE Case (RRC / Marksman / etc.)";
items[] = {
"A3_GPNVG18_BLK_TI", // Thermal Quad
"A3_GPNVG18_REC_BLK_TI", // Thermal Quad
"A3_GPNVG18_REC_TI", // Thermal Quad
"A3_GPNVG18_TI", // Thermal Quad
"A3_GPNVG18b_BLK_TI", // Thermal Quad
"A3_GPNVG18b_REC_BLK_TI", // Thermal Quad
"A3_GPNVG18b_REC_TI", // Thermal Quad
"A3_GPNVG18b_TI", // Thermal Quad
"ACE_optic_LRPS_2D", //Nightforce Series Optic
"ACE_optic_LRPS_PIP", //Nightforce Series Optic
"NVGogglesB_blk_F", // ENVG
"NVGogglesB_grn_F", // ENVG
"NVGogglesB_gry_F", // ENVG
"optic_lrps_ghex_F", //Nightforce Series Optic
"optic_lrps_tna_F", //Nightforce Series Optic
"optic_lrps", //Nightforce Series Optic
"optic_Nightstalker", // Thermal Optic
"optic_tws_mg", // Thermal Optic
"optic_tws", // Thermal Optic
"rhsusf_acc_anpas13gv1", // Thermal Optic
"rhsusf_acc_anpvs27", // Thermal Optic
"Tier1_ANPVS10_Tan", // Thermal Optic
"Tier1_ATACR18_ADM_Black_Vanilla", //Nightforce Series Optic
"Tier1_ATACR18_ADM_Black", //Nightforce Series Optic
"Tier1_ATACR18_ADM_Desert_Vanilla", //Nightforce Series Optic
"Tier1_ATACR18_ADM_Desert", //Nightforce Series Optic
"Tier1_ATACR18_ADM_T1_Black_Vanilla", //Nightforce Series Optic
"Tier1_ATACR18_ADM_T1_Black", //Nightforce Series Optic
"Tier1_ATACR18_ADM_T1_Desert_Vanilla", //Nightforce Series Optic
"Tier1_ATACR18_ADM_T1_Desert", //Nightforce Series Optic
"Tier1_ATACR18_Geissele_Black_Vanilla", //Nightforce Series Optic
"Tier1_ATACR18_Geissele_Black", //Nightforce Series Optic
"Tier1_ATACR18_Geissele_Desert_Vanilla", //Nightforce Series Optic
"Tier1_ATACR18_Geissele_Desert", //Nightforce Series Optic
"Tier1_ATACR18_Geissele_Docter_Black_Vanilla", //Nightforce Series Optic
"Tier1_ATACR18_Geissele_Docter_Black", //Nightforce Series Optic
"Tier1_ATACR18_Geissele_Docter_Desert_Vanilla", //Nightforce Series Optic
"Tier1_ATACR18_Geissele_Docter_Desert" //Nightforce Series Optic
};
};
class tabbedItems { // Items that are allowed for individuals with Ranger Tab
label = "TABBED WEAPON";
description = "Items that are allowed for individuals with Ranger Tab.";
items[] = {
"arifle_MX_black_F", // MX Series
"arifle_MX_F", // MX Series
"arifle_MX_GL_black_F", // MX 3GL Series
"arifle_MX_GL_F", // MX 3GL Series
"arifle_MX_GL_khk_F", // MX 3GL Series
"arifle_MX_khk_F", // MX Series
"arifle_MX_SW_black_F", // MX LSW Series
"arifle_MX_SW_F", // MX LSW Series
"arifle_MX_SW_khk_F", // MX LSW Series
"arifle_MXC_black_F", // MXC Series
"arifle_MXC_F", // MXC Series
"arifle_MXC_khk_F", // MXC Series
"arifle_MXM_black_F", // MXM Series
"arifle_MXM_F", // MXM Series
"arifle_MXM_khk_F", // MXM Series
"arifle_SPAR_03_blk_F", // HK417 Series
"arifle_SPAR_03_khk_F", // HK417 Series
"arifle_SPAR_03_snd_F", // HK417 Series
"rhs_weap_SCARH_CQC", // Scar H Series
"rhs_weap_SCARH_FDE_CQC", // Scar H Series
"rhs_weap_SCARH_FDE_LB", // Scar H Series
"rhs_weap_SCARH_FDE_STD", // Scar H Series
"rhs_weap_SCARH_LB", // Scar H Series
"rhs_weap_SCARH_STD", // Scar H Series
"rhs_weap_SCARH_USA_CQC", // Scar H Series
"rhs_weap_SCARH_USA_LB", // Scar H Series
"rhs_weap_SCARH_USA_STD", // Scar H Series
"SMA_HK417_16in", // HK417 Series
"SMA_HK417", // HK417 Series
"SMA_HK417vfg", // HK417 Series
"SMA_Mk17_16_black", // Scar H Series
"SMA_Mk17_16_green", // Scar H Series
"SMA_Mk17_16", // Scar H Series
"SMA_Mk17_black", // Scar H Series
"SMA_Mk17_EGML_black", // Scar H Series
"SMA_Mk17_EGML_green", // Scar H Series
"SMA_Mk17_EGML", // Scar H Series
"SMA_Mk17_green", // Scar H Series
"SMA_Mk17", // Scar H Series
"Tier1_MK48_Mod0_Desert", // Mk48 Series
"Tier1_MK48_Mod0_Para_Desert", // Mk48 Series
"Tier1_MK48_Mod0_Para", // Mk48 Series
"Tier1_MK48_Mod0", // Mk48 Series
"Tier1_MK48_Mod1_Desert", // Mk48 Series
"Tier1_MK48_Mod1", // Mk48 Series
"Tier1_SR25_ec_tan", // SR-25 Series
"Tier1_SR25_ec", // SR-25 Series
"Tier1_SR25_tan", // SR-25 Series
"Tier1_SR25" // SR-25 Series
};
};
class memeItems {
label = "MEME ITEM";
description = "Items that serve no purpose other than to MEME.";
items[] = {
"ACE_Banana",
"UK3CB_Cocaine_Brick"
};
};
};

180
defines/SupplyCrates.hpp Normal file
View File

@@ -0,0 +1,180 @@
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",12},
{"rhs_mag_m67",12},
{"1Rnd_Smoke_Grenade_shell",24},
{"1Rnd_SmokeRed_Grenade_shell",24},
{"1Rnd_SmokeGreen_Grenade_shell",24},
{"1Rnd_SmokeYellow_Grenade_shell",12},
{"Tier1_30Rnd_556x45_M856A1_EMag",25},
{"Tier1_30Rnd_556x45_Mk318Mod0_EMag",75},
{"ACE_30Rnd_65_Creedmor_mag",25},
{"SMA_30Rnd_762x35_BLK_EPR",25},
{"Tier1_30Rnd_762x35_300BLK_SMK_PMAG",25},
{"SMA_30Rnd_68x43_SPC_FMJ",25},
{"SMA_30Rnd_68x43_SPC_FMJ_Tracer",25},
{"SMA_20Rnd_762x51mm_M80A1_EPR",25},
{"SMA_20Rnd_762x51mm_M80A1_EPR_Tracer",25},
{"SMA_20Rnd_762x51mm_Mk316_Mod_0_Special_Long_Range",25},
{"SMA_20Rnd_762x51mm_Mk316_Mod_0_Special_Long_Range_Tracer",25},
{"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},
{"Tier1_20Rnd_65x48_Creedmoor_SR25_Mag",25},
{"rhssaf_30rnd_556x45_EPR_G36", 25},
{"DemoCharge_Remote_Mag",16}
};
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[] = {};
magazines[] = {
{"MRAWS_HEAT_F",35},
{"MRAWS_HE_F",15},
{"Tier1_250Rnd_762x51_Belt_M993_AP",50},
{"Tier1_30Rnd_556x45_M856A1_EMag",25},
{"Tier1_30Rnd_556x45_Mk318Mod0_EMag",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_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 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[] = {};
magazines[] = {
{"twc_2inch_he_1rnd",70},
{"twc_2inch_smoke_1rnd",15},
{"twc_2inch_illum_1rnd",15},
{"Tier1_30Rnd_556x45_Mk318Mod0_EMag",20}
};
items[] = {};
};
};

129
defines/VehicleFlags.hpp Normal file
View File

@@ -0,0 +1,129 @@
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 GreenOctagon {
actionID = "flag_simpleshape_greenoctagon";
actionTitle = "Green Octagon";
texture = "textures\simple_shape\flag_simpleshape_greenoctagon_co.paa";
};
class BlueCircle {
actionID = "flag_simpleshape_bluecircle";
actionTitle = "Blue Circle";
texture = "textures\simple_shape\flag_simpleshape_bluecircle_co.paa";
};
class OrangeSquare {
actionID = "flag_simpleshape_orangesquare";
actionTitle = "Orange Square";
texture = "textures\simple_shape\flag_simpleshape_orangesquare_co.paa";
};
class PinkTriangle {
actionID = "flag_simpleshape_pinktriangle";
actionTitle = "Pink Triangle";
texture = "textures\simple_shape\flag_simpleshape_pinktriangle_co.paa";
};
class RedPentagon {
actionID = "flag_simpleshape_redpentagon";
actionTitle = "Red Pentagon";
texture = "textures\simple_shape\flag_simpleshape_redpentagon_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";
};
};
};
};

View File

@@ -1,4 +1,4 @@
//-------------------------------------------DESCRIPTION.EXT-----------------------------------------------------------------
//-------------------------------------------DESCRIPTION.EXT-----------------------------------------------------------------
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -17,6 +17,11 @@
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include "mission_settings.hpp"
#include "defines\ApprovedAssets.hpp"
#include "defines\BattalionInfo.hpp"
#include "defines\DisallowedEquipment.hpp"
#include "defines\SupplyCrates.hpp"
#include "defines\VehicleFlags.hpp"
//-------------------------------------------MISSION INFO--------------------------------------------------------------------
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

View File

@@ -15,15 +15,20 @@ class milsim
};
class fbcb2 {
class addFBCB2DiaryEntries { postInit = 1; };
class initFBCB2 { postInit = 1; };
class processFBCB2Callsigns {};
class processFBCB2FixedWingAssets {};
class processFBCB2RotaryAssets {};
class processFBCB2RadioFrequencies {};
class processFBCB2SmokeColors {};
class processFBCB2Environment {};
class messageFBCB2AssetStatus {};
class hintFBCB2AssetStatus {};
};
class fbcb2_util {
file = "functions\fbcb2\util";
class createOrUpdateDiaryRecord {};
};
class fbcb2_radioFrequencies {
file = "functions\fbcb2\radioFrequencies";
class formatRadioElementForDiary {};
class generateElementFrequencyRecordText {};
};
class client {
@@ -32,20 +37,17 @@ class milsim
class bindEventHandlers { postInit = 1; };
class bindVehicleActions { postInit = 1; };
class addClientStatsPFH {};
class addMedicalOverlayPFH { postInit = 1; };
class calculateClientStats {};
class bindEmptyGroupGarbageCleanup { postInit = 1; };
};
class server {
class addServerStatsPFH {};
class calculateServerStats {};
class logPlayerInventory {};
};
class resupply {
class createAmmoBox {};
class createWeaponsBox {};
class createMedicalBox {};
}
class ambience {
class flakInitVehicle {};
class flakEH {};
@@ -60,4 +62,84 @@ class milsim
class mapMarkerToString {}; //needs refactor
class stringToMapMarker {}; //needs refactor
};
class util
{
class logMissionInfo { postInit = 1; };
class addPlayerInfoToArray {};
class log {};
class padString {};
class recurseSubclasses {};
class getBattalionCfg {};
class getNameOfBase {};
class getNearestBase {};
};
};
class milsim_resupply {
class functions {
file = "functions\resupply";
class createAmmoBox {};
class createBox {};
class createCSWBox {};
class createLaunchersBox {};
class createMedicalBox {};
class createMortarBox {};
class createWeaponsBox {};
class getSupplyCratesCfg {};
class addArsenalObjectSpawnBoxActions {};
class addCBASettings {postInit=1;};
};
};
class milsim_fbcb2_assets {
class functions {
file = "functions\fbcb2\assets";
class updateAssetDiary {};
class removeAssetDiaryRecords {};
class getMagsForWeapon {};
class getWeaponry {};
class getInventory {};
class getVehicleData {};
};
class assetsByBase {
file = "functions\fbcb2\assets\byBase";
class getAssetsByBase {};
class getStartingAssetsByBase {};
class updateAssetsByBase {};
};
class markers {
file = "functions\fbcb2\assets\markers";
class showMarkersOnMap {};
class removeMarkersOnMap {};
}
};
class milsim_reinsert {
class server {
file = "functions\reinsert\server";
class initServer { postInit = 1; };
class addToQueue {};
class globalShowQueue {};
class removeFromQueue {};
class returnReinsertQueueNotification {};
class validateQueue {};
};
class client {
file = "functions\reinsert\client";
class initClient { postInit = 1; };
class addAceSelfActions {};
class addCheckQueueSelfAction {};
class requestShowQueue {};
};
};
class milsim_vehicleFlags {
class functions {
file = "functions\vehicleFlags";
class initVehicleFlags {postInit = 1};
class getActionsFlagCategories {};
class getVehicleFlagsCfg {};
class isClassExcluded{};
};
};

View File

@@ -8,7 +8,7 @@ _cpsPFH = [
},
"milsim_client_cps_interval" call CBA_settings_fnc_get,
[],
{ diag_log text format ["[MILSIM] (client) PFH loaded with interval %1 seconds", "milsim_client_cps_interval" call CBA_settings_fnc_get ], },
{ diag_log text format ["[MILSIM] (client) PFH loaded with interval %1 seconds", "milsim_client_cps_interval" call CBA_settings_fnc_get ] },
{ diag_log text format ["[MILSIM] (client) PFH unloaded"] },
{ "milsim_client_cps_enable" call CBA_settings_fnc_get },
{ false },

View File

@@ -0,0 +1,99 @@
/*
milsim_fnc_addMedicalOverlayPFH
Author: IndigoFox
Description:
Affects players with medical permissions. Will see a 3D colored dot over nearby (5-10m)
unconscious players who are not in a vehicle
which indicates their current ACE Triage Card status.
Designed to increase efficiency of CCPs.
*/
// Force setting if CBA doesn't work?
if (isNil "milsim_client_medState3D_enabled") then {
milsim_client_medState3D_enabled = true;
};
if (isNil "milsim_client_medState3D_drawRange") then {
milsim_client_medState3D_drawRange = 10;
};
// List of units to draw icons for
milsim_client_medState3D_drawTargets = [];
// ACE Triage colors, for consistency across UIs and functions
// #define TRIAGE_COLOR_NONE 0.5, 0.5, 0.5, 0.1
// #define TRIAGE_COLOR_MINIMAL 0, 0.5, 0, 0.9
// #define TRIAGE_COLOR_DELAYED 1, 0.84, 0, 0.9
// #define TRIAGE_COLOR_IMMEDIATE 1, 0, 0, 0.9
// #define TRIAGE_COLOR_DECEASED 0, 0, 0, 0.9
// ACE Triage colors, for consistency across UIs and functions
milsim_client_medState3D_colors = [
[0, 0.5, 0, 0.9], // TRIAGE_COLOR_MINIMAL
[1, 0.84, 0, 0.9], // TRIAGE_COLOR_DELAYED
[1, 0, 0, 0.9], // TRIAGE_COLOR_IMMEDIATE
[0.15, 0.15, 0.15, 0.9], // TRIAGE_COLOR_DECEASED
[0.5, 0.5, 0.5, 0] // TRIAGE_COLOR_NONE
];
// Per-frame handler to draw icons
// cleanup
if (!isNil "milsim_client_medState3D_pfh") then {
[milsim_client_medState3D_pfh] call CBA_fnc_removePerFrameHandler;
};
// add pfh
milsim_client_medState3D_pfh = [{
// if disabled, skip processing
if (!milsim_client_medState3D_enabled) exitWith {false};
// if no targets, skip processing
if (count milsim_client_medState3D_drawTargets == 0) exitWith {false};
if !([player] call ace_medical_treatment_fnc_isMedic) exitWith {false};
{
// distance within 10 meters
if (player distance _x > milsim_client_medState3D_drawRange) then {continue};
// check unit not null, not conscious, and not in a vehicle
if (
!(_x getVariable ["ACE_isUnconscious", false]) ||
!isNull (objectParent _x)
) then {continue};
// color based on triage level
private _triageLevel = _x getVariable ["ace_medical_triageLevel", -1];
if (_triageLevel == -1) then {continue};
private _color = milsim_client_medState3D_colors select (
(_x getVariable ["ace_medical_triageLevel", -1]) -1
);
// draw position, slightly above the prone unit
private _drawPos = (visiblePosition _x) vectorAdd [0, 0, 0.5];
// draw icon
drawIcon3D [
"\A3\ui_f\data\map\markers\military\dot_CA.paa", // icon texture
_color, // color
_drawPos, // position AGL
1, // width
1, // height
0 // angle
// further params optional, omitted
];
} forEach milsim_client_medState3D_drawTargets;
}, 0, []] call CBA_fnc_addPerFrameHandler;
// subroutine to gather nearest 50 units every 5 seconds and store in milsim_client_medState3D_drawTargets
// cleanup
if (!isNil "milsim_client_medState3D_drawTargetsPfh") then {
[milsim_client_medState3D_drawTargetsPfh] call CBA_fnc_removePerFrameHandler;
};
// add pfh
milsim_client_medState3D_drawTargetsPfh = [{
milsim_client_medState3D_drawTargets = (
(allUnits + allDeadMen) select {
_x isKindOf "CAManBase" &&
player distance _x < 50 &&
!isNull _x &&
player isNotEqualTo _x
}
);
}, 5, false] call CBA_fnc_addPerFrameHandler;

View File

@@ -5,35 +5,46 @@ if ( !hasInterface ) exitWith {};
"Create Resupply Box",
{
params [["_pos", [0,0,0], [[]], 3], ["_target", objNull, [objNull]]];
// get parent definition
private _supplyCratesCfg = call milsim_resupply_fnc_getSupplyCratesCfg;
// get the subclass names
private _boxTypesAvailable = _supplyCratesCfg call BIS_fnc_getCfgSubClasses;
_boxTypesAvailable sort true;
_comboOptions = _boxTypesAvailable apply {
[
// display name
[_supplyCratesCfg >> _x >> "displayName", "STRING", "ERROR"] call CBA_fnc_getConfigEntry,
// tooltip
[_supplyCratesCfg >> _x >> "tooltip", "STRING", "ERROR"] call CBA_fnc_getConfigEntry,
// icon
[_supplyCratesCfg >> _x >> "icon", "STRING", "ERROR"] call CBA_fnc_getConfigEntry
]
};
[
"Resupply Box Options",
[
[ "COMBO", "Box Type", [[1,2,3], [["Ammo"],["Weapons"],["Medical"]],0] ]
// [ "COMBO", "Box Type", [[1,2,3], [["Ammo"],["Weapons"],["Medical"]],0] ]
["COMBO", "Box Type", [_boxTypesAvailable, _comboOptions, 0]]
],
{
params ["_dialog", "_args"];
_dialog params ["_type"];
_args params ["_pos", "_target"];
_dialog params ["_typeOptionSelected"];
_args params ["_pos", "_target", "_keysSorted"];
switch (_type) do {
case 1: {
[_target, _pos] call milsim_fnc_createAmmoBox;
};
case 2: {
[_target, _pos] call milsim_fnc_createWeaponsBox;
};
case 3: {
[_target, _pos] call milsim_fnc_createMedicalBox;
};
private _box = [_target, _typeOptionSelected, _pos] call milsim_resupply_fnc_createBox;
if (isNull _box) exitWith {
["Resupply Box", "WARNING: Failed to locate or create box!"] call BIS_fnc_curatorHint;
};
["Resupply Box", format["Created box from class %1", _typeOptionSelected]] call BIS_fnc_curatorHint;
},
{},
[_pos, _target]
] call zen_dialog_fnc_create;
}
] call zen_custom_modules_fnc_register;

View File

@@ -0,0 +1,23 @@
diag_log text format ["[MILSIM] (client) initializing empty group deletion PFH"];
_emptyGroupPFH = [
{
{
if (local _x) then {
if ((count units _x) == 0) then {
deleteGroup _x;
};
};
} forEach allGroups;
},
300,
[],
{ diag_log text format ["[MILSIM] (client) Empty Group Deletion PFH loaded"] },
{ diag_log text format ["[MILSIM] (client) Empty Group Deletion"] },
{ true },
{ false },
[]
] call CBA_fnc_createPerFrameHandlerObject;

View File

@@ -3,9 +3,13 @@ if ( !hasInterface ) exitWith {};
player addEventHandler["Respawn",
{
params ["_unit", "_corpse"];
_killer = _corpse getVariable ["ace_medical_causeOfDeath", "#scripted"];
private _killer = _corpse getVariable ["ace_medical_causeOfDeath", "#scripted"];
if (_killer == "respawn_button") then {
format["[MILSIM] (client) %1 was unconscious then clicked the respawn button", name _unit] remoteExec["diag_log", 0];
[
"client",
"RESPAWNED WHILE UNCONSCIOUS",
[_unit] call milsim_fnc_addPlayerInfoToArray
] remoteExec ["milsim_fnc_log", 2];
// format["%1 was unconscious then clicked the respawn button", name _unit] remoteExec["systemChat", 0];
};
}
@@ -38,6 +42,14 @@ addMissionEventHandler ["HandleChatMessage",
];
["ace_arsenal_displayClosed", {
[player] remoteExec ["milsim_fnc_logPlayerInventory", 2];
}] call CBA_fnc_addEventHandler;
[missionNamespace, "arsenalClosed", {
[player] remoteExec ["milsim_fnc_logPlayerInventory", 2];
}] call BIS_fnc_addScriptedEventHandler;
diag_log text "[MILSIM] (client) event handlers bound";
nil;

View File

@@ -0,0 +1,4 @@
// return each base with its assets
milsim_baseObjects apply {
[_x, _x getVariable ["milsim_fbcb2_assets_assetsAtThisBase", []]]
};

View File

@@ -0,0 +1,4 @@
// return each base with its assets
milsim_baseObjects apply {
[_x, _x getVariable ["milsim_fbcb2_assets_assetsStartedAtThisBase", []]]
};

View File

@@ -0,0 +1,179 @@
params [
["_isInit", false, [false]],
["_logCurrentAssets", false, [false]]
];
if (!isServer) exitWith {};
// 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 _assetsAtThisBaseVar = "milsim_fbcb2_assets_assetsAtThisBase";
private _assetsStartedAtThisBaseVar = "milsim_fbcb2_assets_assetsStartedAtThisBase";
{
private _className = configName _x;
private _callsign = getText(_x >> "callsign");
private _found = _allVehicles select { typeOf _x == _className };
{
private _asset = _x;
// avoid duplicates
if (_asset in _allSaved) then {continue};
private _closestBase = [_asset] call milsim_fnc_getNearestBase;
if (isNull _closestBase) then {
// no base found
continue;
};
if (
_asset distance _closestBase >
milsim_fbcb2_assets_setting_detectionRangeFromBase
) then {
// not within range
continue;
};
_asset setVariable ["milsim_fbcb2_assets_callsign", _callsign, true];
// add to base's assets list
private _baseAssets = _closestBase getVariable [_assetsAtThisBaseVar, []];
_baseAssets pushBackUnique _asset;
// broadcast later so we're not spamming network
_closestBase setVariable [
_assetsAtThisBaseVar,
_baseAssets
];
// if this is the init, set the base's assets started at this base
if (_isInit) then {
// broadcast later so we're not spamming network
_closestBase setVariable [
_assetsStartedAtThisBaseVar,
_baseAssets
];
};
_allSaved pushBack _asset;
} forEach _found;
} forEach ((missionConfigFile >> "ApprovedAssets") call BIS_fnc_returnChildren);
// Add all ground vehicles (LandVehicle)
{
private _asset = _x;
// avoid duplicates
if (_asset in _allSaved) then {continue};
private _closestBase = [_asset] call milsim_fnc_getNearestBase;
if (isNull _closestBase) then {
// no base found
continue;
};
if (
_asset distance _closestBase >
milsim_fbcb2_assets_setting_detectionRangeFromBase
) then {
// not within range
continue;
};
// add to base's assets list
private _baseAssets = _closestBase getVariable [_assetsAtThisBaseVar, []];
_baseAssets pushBackUnique _asset;
// broadcast later so we're not spamming network
_closestBase setVariable [
_assetsAtThisBaseVar,
_baseAssets
];
// if this is the init, set the base's assets started at this base
if (_isInit) then {
// broadcast later so we're not spamming network
_closestBase setVariable [
_assetsStartedAtThisBaseVar,
_baseAssets
];
};
} forEach (_allVehicles select { _x isKindOf "LandVehicle" });
////////////////////////////////////////////////////////////////////////
// publish updated base variables
////////////////////////////////////////////////////////////////////////
{
private _base = _x;
// save current assets
private _baseAssets = _base getVariable [_assetsAtThisBaseVar, []];
_base setVariable [_assetsAtThisBaseVar, _baseAssets, true];
// if init, save starting assets
if (_isInit) then {
_base setVariable [_assetsStartedAtThisBaseVar, _baseAssets, true];
};
} forEach milsim_baseObjects;
////////////////////////////////////////////////////////////////////////
// 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 = _base getVariable [_assetsAtThisBaseVar, []];
// prepare key value for logging
private _baseAssetsHashesPrep = _baseAssets apply {
private _asset = _x;
[
["callsign", _asset getVariable [
"milsim_fbcb2_assets_callsign",
"N/A"
]],
["className", typeOf _asset],
["displayName", (configOf _asset) 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 {
{
[
"fbcb2_assets",
"CURRENT ASSETS",
[
["baseName", [[_base] call milsim_fnc_getNameOfBase]],
["asset", _x]
]
] call milsim_fnc_log;
} forEach _baseAssetsHashes;
};
// if init, log starting assets
if (_isInit) then {
{
[
"fbcb2_assets",
"STARTING ASSETS",
[
["baseName", [[_base] call milsim_fnc_getNameOfBase]],
["asset", _x]
]
] call milsim_fnc_log;
} forEach _baseAssetsHashes;
};
} forEach milsim_baseObjects;

View File

@@ -0,0 +1,123 @@
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;

View File

@@ -0,0 +1,80 @@
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
// ]);

View File

@@ -0,0 +1,166 @@
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["<font size='24' shadow='1' color='#e1701a' face='PuristaBold'>%1</font>", _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/>"
]];

View File

@@ -0,0 +1,55 @@
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;

View File

@@ -0,0 +1,16 @@
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 [
milsim_fbcb2_subjectAssetsFixedWingID,
milsim_fbcb2_subjectAssetsRotaryID,
milsim_fbcb2_subjectAssetsGroundID
];

View File

@@ -0,0 +1,185 @@
if (!hasInterface) exitWith {};
// create diary records
// remove any existing asset map markers
call milsim_fbcb2_assets_fnc_removeMarkersOnMap;
// remove existing asset records
call milsim_fbcb2_assets_fnc_removeAssetDiaryRecords;
// get all vehicles by base
private _vehiclesByBase = call milsim_fbcb2_assets_fnc_getAssetsByBase;
if (count _vehiclesByBase isEqualTo 0) exitWith {false};
// put vehicles from each base into a single array
private _vehicles = [];
{
_vehicles append (_x#1);
} forEach _vehiclesByBase;
if (count _vehicles isEqualTo 0) exitWith {false};
private _distinctVehiclesClassNames = [];
{
_distinctVehiclesClassNames pushBackUnique (typeOf _x);
} forEach _vehicles;
// ForEach unique vehicle class name, we'll find the first and gather its info
{
private _className = _x;
private _vehiclesOfThisKind = _vehicles select {typeOf _x isEqualTo _className};
// This should never happen, but...
if (count _vehiclesOfThisKind isEqualTo 0) then {continue};
// Take the first vehicle as a representative
private _representativeVehicle = _vehiclesOfThisKind#0;
private _vehicleCfg = configOf _representativeVehicle;
private _vehicleCallsign = toUpper (
_representativeVehicle getVariable [
"milsim_fbcb2_assets_callsign",
"NONE ASSIGNED"
]
);
// Process the vehicle for extended info
// Exclusion list for display names
if (
((configOf _representativeVehicle) call BIS_fnc_displayName)
in ["Helicopter"]
) then {continue};
// Get the vehicle data
private _processed = [_representativeVehicle] call milsim_fbcb2_assets_fnc_getVehicleData;
if (isNil "_processed") then {continue};
_processed params ["_vehicleCfg", "_displayName", "_diaryTextSections"];
_diaryTextSections params [
"_title",
"_image",
"_info",
"_capacity"
// "_weapons",
// "_pylonWeapons",
// "_inventory"
];
// Create the diary record
private _recordText = [];
// Add the title and image
_recordText pushBack _title;
_recordText pushBack _image;
_recordText pushBack "<br/>";
_recordText pushBack format[
"CALLSIGN: %1",
_vehicleCallsign
];
_recordText pushBack format[
"COUNT ACTIVE: %1",
count _vehiclesOfThisKind
];
// Here, we'll create a link to show markers on the map for all vehicles of this kind
private _randomColor = selectRandom [
["ColorRed", "#FF0000", "Red"],
["ColorGreen", "#00FF00", "Green"],
["ColorBlue", "#0000FF", "Blue"],
["ColorYellow", "#FFFF00", "Yellow"],
["ColorWhite", "#FFFFFF", "White"]
];
private _vehicleCfg = configFile >> "CfgVehicles" >> _className;
// get 'picture' for record
private _icon = getText(_vehicleCfg >> "picture");
// determine marker type
private _markerType = "mil_dot";
switch (true) do {
case (_representativeVehicle isKindOf "Helicopter"): {
_markerType = "loc_heli";
};
case (_representativeVehicle isKindOf "Air"): {
_markerType = "loc_plane";
};
case (_representativeVehicle isKindOf "Ship"): {
_markerType = "loc_boat";
};
case (_representativeVehicle isKindOf "Car"): {
_markerType = "loc_car";
};
default {
_markerType = "loc_truck";
};
};
// Link to show markers
private _showMarkersText = format[
"<execute expression='[""%1"",""%2"",""%3"",%4] call milsim_fbcb2_assets_fnc_showMarkersOnMap'>SHOW MARKERS at vehicle positions</execute> (in %5)",
_className,
_markerType,
_randomColor#0,
(_vehiclesOfThisKind apply {
format["%1", _x call BIS_fnc_netId]
}),
format["<font color='%1'>%2</font>", _randomColor#1, _randomColor#2]
];
_recordText pushBack _showMarkersText;
// Link to hide markers
_recordText pushBack "<execute expression=""call milsim_fbcb2_assets_fnc_removeMarkersOnMap"">REMOVE ALL MARKERS showing asset positions</execute>";
// Link to update asset diary entries
_recordText pushBack "<execute expression=""call milsim_fbcb2_assets_fnc_updateAssetDiary"">UPDATE ENTRIES for all assets</execute>";
_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 (~5 minutes at most)."
];
// Add info and capacity sections
_recordText pushBack _info;
_recordText pushBack _capacity;
private _subjectID = "";
switch (true) do {
case (_representativeVehicle isKindOf "Helicopter"): {
_subjectID = milsim_fbcb2_subjectAssetsRotaryID;
};
case (_representativeVehicle isKindOf "Air"): {
_subjectID = milsim_fbcb2_subjectAssetsFixedWingID;
};
default {
_subjectID = milsim_fbcb2_subjectAssetsGroundID;
};
};
[
_subjectID,
format[
"%1x %2",
count _vehiclesOfThisKind,
(configOf _representativeVehicle) call BIS_fnc_displayName
],
_recordText joinString "<br/>",
_icon
] call milsim_fnc_createOrUpdateDiaryRecord;
// "\A3\ui_f\data\igui\cfg\simpleTasks\types\car_ca.paa"
} forEach _distinctVehiclesClassNames;
// log to RPT
[
"fbcb2_assets",
"UPDATED ASSET DIARY",
[
["assetCount", count _vehicles],
["distinctAssetCount", count _distinctVehiclesClassNames]
]
] call milsim_fnc_log;
true;

View File

@@ -0,0 +1,25 @@
private _baseMarkerStoreVar = "milsim_fbcb2_assets_baseMarkerStore";
private _assetMarkerStoreVar = "milsim_fbcb2_assets_assetMarkerStore";
private _baseMarkerStore = localNamespace getVariable [
_baseMarkerStoreVar,
[]
];
private _assetMarkerStore = localNamespace getVariable [
_assetMarkerStoreVar,
[]
];
// delete markers
{
deleteMarkerLocal (_x#1);
} forEach (_baseMarkerStore + _assetMarkerStore);
localNamespace setVariable [
_baseMarkerStoreVar,
[]
];
localNamespace setVariable [
_assetMarkerStoreVar,
[]
];

View File

@@ -0,0 +1,106 @@
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 provided!"] call BIS_fnc_error;
};
private _baseMarkerStoreVar = "milsim_fbcb2_assets_baseMarkerStore";
private _assetMarkerStoreVar = "milsim_fbcb2_assets_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["milsim_fbcb2_assets_base_marker_%1", _forEachIndex + 1],
getPosASL _base
];
_newMarker setMarkerTypeLocal "mil_dot";
_newMarker setMarkerColorLocal "ColorGreen";
_newMarker setMarkerShapeLocal "ELLIPSE";
_newMarker setMarkerSizeLocal [
milsim_fbcb2_assets_setting_detectionRangeFromBase,
milsim_fbcb2_assets_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["milsim_fbcb2_assets_base_flag_marker_%1", _forEachIndex + 1],
getPosASL _base
];
_newMarker setMarkerTypeLocal "mil_flag";
_newMarker setMarkerColorLocal "ColorGreen";
_newMarker setMarkerSizeLocal [0.7, 0.7];
_newMarker setMarkerTextLocal ([_base] call milsim_fnc_getNameOfBase);
_baseMarkerStore pushBack [
_base,
_newMarker
];
} forEach milsim_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};
// create a marker for the asset
private _newMarker = createMarkerLocal [
format["milsim_fbcb2_assets_marker_%1", _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];

View File

@@ -1,10 +0,0 @@
if ( !hasInterface ) exitWith {};
player createDiarySubject["Status","FBCB2 - Status"];
player createDiarySubject["Intel","FBCB2 - Combat Msgs"];
player createDiarySubject["Messages","FBCB2 - Messages"];
diag_log text "[MILSIM] (fbcb2) diary entries added";
nil;

View File

@@ -11,7 +11,7 @@ _text = composeText [_text, parseText "<t align='left' size='2'>Asset</t><t alig
_assigned = _x select 2;
_available = 0; //count (getMarkerPos "respawn_west" nearEntities [ _asset, 2000] );
_homes = allMissionObjects "ModuleRespawnPosition_F";
_homes = allMissionObjects "ModuleRespawnPosition_F";
{
_home = _x;

View File

@@ -1,10 +1,39 @@
if ( !hasInterface ) exitWith {};
waitUntil { !isNil "milsim_complete" };
[] call milsim_fnc_processFBCB2Callsigns;
[] call milsim_fnc_processFBCB2FixedWingAssets;
[] call milsim_fnc_processFBCB2RotaryAssets;
milsim_fbcb2_recordTitleColor = "#ff6666";
milsim_fbcb2_recordTitleFont = "PuristaMedium";
milsim_fbcb2_recordTitleSize = 20;
milsim_fbcb2_recordTextHeaderSize = 16;
milsim_fbcb2_recordTextBodySize = 14;
milsim_fbcb2_subjectStatusID = "FBCB2_Status";
milsim_fbcb2_subjectIntelID = "FBCB2_Intel";
milsim_fbcb2_subjectMessagesID = "FBCB2_Messages";
milsim_fbcb2_subjectFrequenciesID = "FBCB2_Frequencies";
milsim_fbcb2_subjectAssetsFixedWingID = "FBCB2_Assets_FixedWing";
milsim_fbcb2_subjectAssetsRotaryID = "FBCB2_Assets_Rotary";
milsim_fbcb2_subjectAssetsGroundID = "FBCB2_Assets_Ground";
player createDiarySubject[milsim_fbcb2_subjectStatusID, "FBCB2 - Status"];
player createDiarySubject[milsim_fbcb2_subjectMessagesID, "FBCB2 - Messages"];
player createDiarySubject[milsim_fbcb2_subjectIntelID, "FBCB2 - Intel"];
player createDiarySubject[milsim_fbcb2_subjectFrequenciesID, "FBCB2 - Frequencies"];
player createDiarySubject[milsim_fbcb2_subjectAssetsFixedWingID, "FBCB2 - Assets Plane"];
player createDiarySubject[milsim_fbcb2_subjectAssetsRotaryID, "FBCB2 - Assets Rotary"];
player createDiarySubject[milsim_fbcb2_subjectAssetsGroundID, "FBCB2 - Assets Ground"];
// store records in format:
// [subject, [
// [title, diaryRecord]
// ]]
milsim_fbcb2_diaryRecords = createHashMap;
// populate diary
[] call milsim_fnc_processFBCB2RadioFrequencies;
[] call milsim_fnc_processFBCB2SmokeColors;
[] call milsim_fnc_processFBCB2Environment;
[] call milsim_fbcb2_assets_fnc_updateAssetDiary;

View File

@@ -1,22 +0,0 @@
_text = "
<font size='24' color='#ff0000'>=======------ Mission Data Set ------=======</font>
<br/><br/>
<font color='#00FF00' size='16'>RIPTIDE</font><br/>
Command
<br/><br/>
<font color='#00FF00' size='16'>ONI</font><br/>
Alpha Platoon
<br/><br/>
<font color='#00FF00' size='16'>GOLIATH</font><br/>
Echo
<br/><br/>
<font color='#00FF00' size='16'>TIGER</font><br/>
RRC
<br/><br/>
<font color='#00FF00' size='16'>BLACKFOOT/font><br/>
Weapons Squad
<br/><br/>
";
player createDiaryRecord ["Status", ["MDS - COMMAND - CALLSIGNS", _text]];

View File

@@ -1,16 +1,45 @@
_sunTimes = date call BIS_fnc_sunriseSunsetTime;
private _recordTitle = "MDS - INTEL - ENVIRONMENT";
_text = "
<font size='24' color='#ff0000'>=======------ Mission Data Set ------=======</font>
<br/><br/>
<font size='16' color='#4A86E8'>Local Sunrise</font>
<br/>
<font size='20' color='#FF0000'>" + ([_sunTimes select 0, "HH:MM"] call BIS_fnc_timeToString) + "</font>
<br/><br/>
<font size='16' color='#6AA84F'>Local Sunset</font>
<br/>
<font size='20' color='#FF0000'>" + ([_sunTimes select 1, "HH:MM"] call BIS_fnc_timeToString) + "</font>
<br/><br/>
";
private _text = [
format[
"<font size='%1' color='%2' face='%3'>%4</font><br/><br/>",
milsim_fbcb2_recordTitleSize,
milsim_fbcb2_recordTitleColor,
milsim_fbcb2_recordTitleFont,
_recordTitle
]
];
player createDiaryRecord ["Status", ["MDS - INTEL - ENVIRONMENT", _text]];
private _sunriseColor = "#4A86E8";
private _sunsetColor = "#6AA84F";
private _whiteColor = "#FFFFFF";
private _sunTimes = date call BIS_fnc_sunriseSunsetTime;
_text pushBack format[
"<font size='%1' color='%2'>Local Sunrise</font><br/>
<font size='%3' color='%4'>%5</font><br/><br/>",
milsim_fbcb2_recordTextHeaderSize,
_sunriseColor,
milsim_fbcb2_recordTextBodySize,
_whiteColor,
([_sunTimes select 0, "HH:MM"] call BIS_fnc_timeToString)
];
_text pushBack format[
"<font size='%1' color='%2'>Local Sunset</font><br/>
<font size='%3' color='%4'>%5</font><br/><br/>",
milsim_fbcb2_recordTextHeaderSize,
_sunsetColor,
milsim_fbcb2_recordTextBodySize,
_whiteColor,
([_sunTimes select 1, "HH:MM"] call BIS_fnc_timeToString)
];
_text = _text joinString "";
[
milsim_fbcb2_subjectIntelID,
_recordTitle,
_text
] call milsim_fnc_createOrUpdateDiaryRecord;

View File

@@ -1,19 +0,0 @@
_assetList = missionNamespace getVariable "milsim_var_fixedAssets";
_text = "<font size='24' color='#ff0000'>=======------ Mission Data Set ------=======</font>";
{
_callSign = _x select 0;
_asset = _x select 1;
_assigned = _x select 2;
_name = getText(configFile >> "CfgVehicles" >> _asset >> "displayName");
_data = "<t size='2'>Callsign: " + _callsign + "</t><br/><t size='1'>Asset: " + _name + "</t><br/><t size='1'>Assigned: " + str _assigned + "</t>";
_text = _text + "<br/><br/>" + _data;
} foreach _assetList;
_text = _text + "<br/><br/><execute expression='[missionNamespace getVariable ""milsim_var_fixedAssets""] call milsim_fnc_messageFBCB2AssetStatus'>Run Report on local node?</execute>";
player createDiaryRecord ["Status", ["MDS - ASSETS - FIXED", _text]];

View File

@@ -1,35 +1,50 @@
// updated 2024-02-01 by IndigoFox
// now reads from the battalion config structure to generate the diary entries
_text = "
<font size='24' color='#ff0000'>=======------ Mission Data Set ------=======</font>
<br/><br/>
<font size='16' color='#4A86E8'>EXODUS</font>
<br/>
<font color='#FF0000'>6 - 45</font>
<br/>
<font color='#FF0000'>RTO - 45 / 35</font>
<br/><br/>
<font size='16' color='#6AA84F'>RIPTIDE</font>
<br/>
<font color='#FF0000'>Actual - 45 / 100</font>
<br/>
<font color='#FF0000'>Romeo - 45 / 35</font>
<br/>
<font color='#FF0000'>1 - 110 / 100</font>
<br/>
<font color='#FF0000'>2 - 120 / 100</font>
<br/>
<font color='#FF0000'>3 - 130 / 110</font>
<br/>
<font color='#FF0000'>Blackfoot - 150 / 100</font>
<br/><br/>
<font size='16' color='#F1C232'>ECHO</font>
<br/>
<font color='#FF0000'>Impaler - 45 / 35</font>
<br/>
<font color='#FF0000'>JTAC - 35 / 82</font>
<br/>
<font color='#FF0000'>IDF - 82 / 100</font>
<br/><br/>
";
////////////////////////////////////////
// Get info from missionConfigFile
////////////////////////////////////////
private _battalionInfoCfg = call milsim_fnc_getBattalionCfg;
private _battalionElementCfgs = [_battalionInfoCfg >> "Command"] call BIS_fnc_returnChildren;
player createDiaryRecord ["Status", ["MDS - INTEL - RADIO FREQS", _text]];
////////////////////////////////////////
// Define formatting constants
////////////////////////////////////////
private _ELEMENT_NAME_SIZE = 10;
private _ELEMENT_NAME_FONT = "EtelkaMonospaceProBold";
private _ELEMENT_FREQ_SIZE = 9;
private _ELEMENT_FREQ_FONT = "EtelkaMonospacePro";
private _FREQ_INDENT_CONSTANT = 6;
private _FREQ_PAD_LENGTH = 17;
private _FREQ_TEXT_COLOR = "#CCCCCC";
// Note: Element colors are defined in the battalion config
////////////////////////////////////////
// ADD DIARY ENTRIES
////////////////////////////////////////
// First is all the battalion-level elements beneath command
// To have the records listed in the order they appear in the battalion config, we need to reverse the array
// Since each entry is added to the top of the list, this will result in the entries being added in the correct order
reverse _battalionElementCfgs;
{
// recursively generate diary text for all child elements of battalion-level elements
private _diaryTitleText = [_x, true] call milsim_fnc_generateElementFrequencyRecordText;
[
milsim_fbcb2_subjectFrequenciesID,
_diaryTitleText#0,
_diaryTitleText#1
] call milsim_fnc_createOrUpdateDiaryRecord;
} forEach _battalionElementCfgs;
// add the battalion command to the top of the list
// don't process child elements
private _diaryTitleText = [_battalionInfoCfg >> "Command", false] call milsim_fnc_generateElementFrequencyRecordText;
[
milsim_fbcb2_subjectFrequenciesID,
_diaryTitleText#0,
_diaryTitleText#1
] call milsim_fnc_createOrUpdateDiaryRecord;
true;

View File

@@ -1,19 +0,0 @@
_assetList = missionNamespace getVariable "milsim_var_rotaryAssets";
_text = "<font size='24' color='#ff0000'>=======------ Mission Data Set ------=======</font>";
{
_callSign = _x select 0;
_asset = _x select 1;
_assigned = _x select 2;
_name = getText(configFile >> "CfgVehicles" >> _asset >> "displayName");
_data = "<t size='2'>Callsign: " + _callsign + "</t><br/><t size='1'>Asset: " + _name + "</t><br/><t size='1'>Assigned: " + str _assigned + "</t>";
_text = _text + "<br/><br/>" + _data;
} foreach _assetList;
_text = _text + "<br/><br/><execute expression='[missionNamespace getVariable ""milsim_var_rotaryAssets""] call milsim_fnc_messageFBCB2AssetStatus'>Run Report on local node?</execute>";
player createDiaryRecord ["Status", ["MDS - ASSETS - ROTARY", _text]];

View File

@@ -1,30 +1,41 @@
private _recordTitle = "MDS - INTEL - SMOKES";
_text = "
<font size='24' color='#ff0000'>=======------ Mission Data Set ------=======</font>
<br/><br/>
Smoke is a Guideline Not a Rule
<br/><br/>
<font color='#FFFFFF' size='16'>WHITE</font><br/>
Concealment
<br/><br/>
<font color='#008800' size='16'>GREEN</font><br/>
Friendly Forces
<br/><br/>
<font color='#0000FF' size='16'>BLUE</font><br/>
LZ Markers
<br/><br/>
<font color='#FF0000' size='16'>RED</font><br/>
Enemy Location
<br/><br/>
<font color='#FFA500' size='16'>ORANGE</font><br/>
Resupply Marker
<br/><br/>
<font color='#FFFF00' size='16'>YELLOW</font><br/>
Medical Emergency
<br/><br/>
<font color='#800080' size='16'>PURPLE</font><br/>
Broken Arrow - 100m radius
<br/><br/>
";
private _text = [
// Title
format[
"<font size='%1' color='%2' face='%3'>%4</font>",
milsim_fbcb2_recordTitleSize,
milsim_fbcb2_recordTitleColor,
milsim_fbcb2_recordTitleFont,
_recordTitle
]
];
player createDiaryRecord ["Status", ["MDS - INTEL - SMOKES", _text]];
private _smokeColors = [
["#FFFFFF", "WHITE", "Concealment"],
["#008800", "GREEN", "Friendly Forces"],
["#0000FF", "BLUE", "LZ Markers"],
["#FF0000", "RED", "Enemy Location"],
["#FFA500", "ORANGE", "Resupply Marker"],
["#FFFF00", "YELLOW", "Medical Emergency"],
["#800080", "PURPLE", "Broken Arrow - 100m radius"]
];
{
_x params ["_color", "_name", "_description"];
_text pushBack format[
"<font size='%1'><font color='%2'>%3</font> - %4</font>",
milsim_fbcb2_recordTextHeaderSize,
_color,
_name,
_description
];
} forEach _smokeColors;
_text = _text joinString "<br/><br/>";
[
milsim_fbcb2_subjectIntelID,
_recordTitle,
_text
] call milsim_fnc_createOrUpdateDiaryRecord;

View File

@@ -0,0 +1,73 @@
// called from milsim_fnc_processFBCB2RadioFrequencies
params ["_cfg", ["_indentCount", 1, [5]]];
//////////////////////////////////////////////////////
// Define leading space/hyphenation for element name
//////////////////////////////////////////////////////
private _leadingSpace = [
format["<font size='%1' face='%2'>| ", _ELEMENT_NAME_SIZE, _ELEMENT_NAME_FONT]
];
for "_i" from 1 to _indentCount do {
_leadingSpace pushBack "-";
};
_leadingSpace pushBack " | </font>";
/////////////////////////////////////////////////////////
// Create the header line for the provided config entry
/////////////////////////////////////////////////////////
private _lines = [
format[
"<font color='%1'>%2%3</font>",
getText(_cfg >> "textColor"),
_leadingSpace joinString "",
getText (_cfg >> "callsign")
]
];
////////////////////////////////////////////////////////////
// Create the frequency lines for the provided config entry
////////////////////////////////////////////////////////////
// Generate leading space
private _freqLeadingSpace = [
format["<font size='%1' face='%2'>| ", _ELEMENT_NAME_SIZE, _ELEMENT_NAME_FONT]
];
for "_i" from 1 to _FREQ_INDENT_CONSTANT do {
_freqLeadingSpace pushBack " ";
};
_freqLeadingSpace pushBack "</font>";
_freqLeadingSpace = _freqLeadingSpace joinString "";
// Process config values for frequencies
{
_x params ["_role", "_sr", "_lr"];
private ["_srStr", "_lrStr"];
if (count _sr > 0) then {
_srStr = format["%1", _sr joinString " / "];
} else {
_srStr = "----";
};
if (count _lr > 0) then {
_lrStr = format["%1", _lr joinString " / "];
} else {
_lrStr = "----";
};
// Add formatted line to the array
_lines pushBack format[
"%1<font size='%2' face='%3' color='%4'>- %5%6%7</font>",
_freqLeadingSpace,
_ELEMENT_FREQ_SIZE,
_ELEMENT_FREQ_FONT,
_FREQ_TEXT_COLOR,
[_role, "right", " ", _FREQ_PAD_LENGTH] call milsim_fnc_padString,
[_srStr, "right", " ", _FREQ_PAD_LENGTH] call milsim_fnc_padString,
_lrStr
];
} forEach (getArray (_cfg >> "frequencies"));
// diag_log text (_lines joinString endl);
// Return the formatted lines in ARRAY format
_lines;

View File

@@ -0,0 +1,87 @@
// called from milsim_fnc_processFBCB2RadioFrequencies ONLY
// this function is called recursively to process all child elements of a battalion element in missionConfigFile
params [
["_elementCfg", configNull, [configNull]],
["_shouldProcessChildCfgs", true]
];
if (isNull _elementCfg) exitWith {
["_elementCfg parameter is NULL"] call BIS_fnc_error;
};
// change reference variable for clarity
private _battalionElement = _elementCfg;
// Generate title from callsign and shortDescription
private _recordTitle = format[
"%1 (%2)",
getText(_battalionElement >> "callsign"),
getText(_battalionElement >> "shortDescription")
];
// systemChat _recordTitle;
//////////////////////////////////////////////////////////
// Generate frequency table header line's leading space
//////////////////////////////////////////////////////////
private _freqLeadingSpace = [
format["<font size='%1' face='%2'>| ", _ELEMENT_NAME_SIZE, _ELEMENT_NAME_FONT]
];
for "_i" from 1 to _FREQ_INDENT_CONSTANT do {
_freqLeadingSpace pushBack " ";
};
_freqLeadingSpace pushBack "</font>";
_freqLeadingSpace = _freqLeadingSpace joinString "";
//////////////////////////////////////////////////////////
// Generate header line and frequency table header line
//////////////////////////////////////////////////////////
private _headers = [
format[
"<font size='%1' color='%2' face='%3'>%4</font>",
milsim_fbcb2_recordTitleSize,
milsim_fbcb2_recordTitleColor,
milsim_fbcb2_recordTitleFont,
_recordTitle
],
format[
"%1<font size='%2' face='%3' color='%4'>- %5%6%7</font>",
_freqLeadingSpace,
_ELEMENT_FREQ_SIZE,
_ELEMENT_FREQ_FONT,
_FREQ_TEXT_COLOR,
["ROLE", "right", " ", _FREQ_PAD_LENGTH] call milsim_fnc_padString,
["SR", "right", " ", _FREQ_PAD_LENGTH] call milsim_fnc_padString,
"LR"
]
];
//////////////////////////////////////////////////////////
// Generate the list of element headers and frequencies
//////////////////////////////////////////////////////////
private _allText = [];
// get all child elements recursively and format them
if (_shouldProcessChildCfgs) then {
[_battalionElement, {
params ["_cfg", "_recurseCounter"];
// add config
private _lines = [_cfg, _recurseCounter+1] call milsim_fnc_formatRadioElementForDiary;
// private _lines = [_cfg, _indentCount] call t;
_allText pushBack (_lines joinString "<br/>");
}] call milsim_fnc_recurseSubclasses;
} else {
// or if the param was false, just add the battalion element
private _lines = [_battalionElement, 1] call milsim_fnc_formatRadioElementForDiary;
// private _lines = [_cfg, _indentCount] call t;
_allText pushBack (_lines joinString "<br/>");
};
// add headers, add all other lines and format them as monospace
_allText = format[
"%1<br/><br/><font face='EtelkaMonospaceProBold'>%2</font>", _headers joinString "<br/>", _allText joinString "<br/><br/>"];
// return the title and all text
[_recordTitle, _allText];

View File

@@ -0,0 +1,28 @@
if (!hasInterface) exitWith {};
params [
["_subjectID", milsim_fbcb2_subjectStatusID, [""]],
["_recordTitle", "", [""]],
["_recordText", "", [""]],
["_recordIcon", "", [""]]
];
// Check if already created
private _subjectRecords = milsim_fbcb2_diaryRecords getOrDefault [_subjectID, createHashMap, true];
private _existingRecord = _subjectRecords getOrDefault [_recordTitle, diaryRecordNull, true];
if (!isNull _existingRecord) then {
player setDiaryRecordText [[_subjectID, _existingRecord], [_recordTitle, _recordText, _recordIcon]];
systemChat format ["Updated diary record: %1", _recordTitle];
} else {
private _new = player createDiaryRecord [
_subjectID,
[
_recordTitle,
_recordText,
_recordIcon
]
];
_subjectRecords set [_recordTitle, _new];
milsim_fbcb2_diaryRecords set [_subjectID, _subjectRecords];
};

View File

@@ -1,5 +1,25 @@
if ( !hasInterface ) exitWith {};
if (!isServer) then {
["milsim_logText", {
params [["_strArray", [""], [[]]]];
{
diag_log text _x;
} forEach _strArray;
}] call CBA_fnc_addEventHandler;
};
// 5 seconds after the client is loaded, add the resupply action to all arsenal boxes
[
{time > 5},
{
if (missionNamespace getVariable [
"milsim_resupply_setting_allowSupplyBoxScrollWheelSpawning",
false
]) then {call milsim_resupply_fnc_addSpawnBoxActions}
}
] call CBA_fnc_waitUntilAndExecute;
["InitializePlayer", [player, true]] call BIS_fnc_dynamicGroups;
nil;

View File

@@ -1,59 +1,33 @@
if (!isServer) exitWith {};
_fixedAssets = [
["Ares", "USAF_A10", 0],
["Odyssey", "RHSGREF_A29B_HIDF", 0],
["Hercules", "USAF_C130J", 0]
milsim_baseObjects = allMissionObjects "ModuleRespawnPosition_F";
publicVariable "milsim_baseObjects";
];
// init asset stores at bases
[true] call milsim_fbcb2_assets_fnc_updateAssetsByBase;
// starting 5 minutes after postInit, update asset stores every 5 minutes
[{
[
{[false] call milsim_fbcb2_assets_fnc_updateAssetsByBase;},
60*5
] call CBA_fnc_addPerFrameHandler;
}, 60*5] call CBA_fnc_waitAndExecute;
_rotaryAssets = [
["Apollo", "RHS_MELB_MH6M", 0],
["Artemis", "RHS_MELB_AH6M", 0],
["Icarus", "RHS_MELB_H6M", 0],
["Achilles", "RHS_CH_47F", 0],
["Hades", "ej_MH60MDAP4", 0],
["Griffin", "RHS_UH60M", 0],
["Dustoff", "RHS_UH60M_MEV2", 0],
["Pegasus", "B_T_VTOL_01_INFANTRY_F", 0],
["Spartan", "B_T_VTOL_01_ARMED_F", 0],
["Orion", "RHS_AH64D", 0],
["Athena", "RHS_AH1Z", 0],
["Homer", "RHS_UH1Y", 0],
["Atlas", "rhsusf_CH53E_USMC", 0]
];
_homes = allMissionObjects "ModuleRespawnPosition_F";
{
_home = _x;
{
_a = _home nearEntities [ _x select 1, 750];
_x set [2, (_x select 2) + count _a];
} forEach _fixedAssets;
} forEach _homes;
missionNamespace setVariable ["milsim_var_fixedAssets", _fixedAssets];
{
_home = _x;
{
_a = _home nearEntities [ _x select 1, 750];
_x set [2, (_x select 2) + count _a];
} forEach _rotaryAssets;
} forEach _homes;
missionNamespace setVariable ["milsim_var_rotaryAssets", _rotaryAssets];
publicVariable "milsim_var_fixedAssets";
publicVariable "milsim_var_rotaryAssets";
// add end mission EH
addMissionEventHandler ["MPEnded", {
// log the "current" asset counts to RPT
[false, true] call milsim_fbcb2_assets_fnc_updateAssetsByBase;
}];
// Initializes the Dynamic Groups framework and groups
["Initialize", [true]] call BIS_fnc_dynamicGroups;
["milsim_logText", {
params [["_strArray", [""], [[]]]];
{
diag_log text _x;
} forEach _strArray;
}] call CBA_fnc_addEventHandler;
missionNamespace setVariable ["milsim_complete", true];
diag_log text "[MILSIM] (initServer) milsim_complete: version 2.3";

View File

@@ -0,0 +1,67 @@
params ["_type"]; // string of the object's classname
if (!(_type isKindOf "CAManBase")) exitWith {};
if (
(localNamespace getVariable ["milsim_reinsert_fileForReinsertClassesAdded", []])
find _type != -1
) exitWith {};
private _fileForReinsertAction = [
"milsim_reinsert_fileReinsertRequest",
"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 milsim_fnc_getNearestBase;
private _baseName = [_base] call milsim_fnc_getNameOfBase;
// send event to server
["milsim_reinsert_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 milsim_fnc_getNearestBase;
private _baseDistance = _player distance _base;
private _maxRangeToReady = missionNamespace getVariable ["milsim_reinsert_setting_reinsertion_maxRangeToReady", 400];
private _existingQueue = missionNamespace getVariable ["milsim_reinsert_reinsertionQueue", []];
// check if module is enabled, player is near a base, and player is not already in the queue
// (serverTime - milsim_reinsert_missionStartServerTime) > 60*5 && // only allow after 15 minutes
missionNamespace getVariable ["milsim_reinsert_setting_reinsertion_enabled", true] &&
(_baseDistance < _maxRangeToReady) &&
not (_player in (_existingQueue apply {_x#0}))
}
] call ace_interact_menu_fnc_createAction;
[_type, 1, ["ACE_SelfActions"], _fileForReinsertAction, true] call ace_interact_menu_fnc_addActionToClass;
private _removeFileForReinsertAction = [
"milsim_reinsert_removeReinsertRequest",
"Remove Re-insert Request",
"\A3\ui_f\data\igui\cfg\simpleTasks\types\land_ca.paa",
{ // statement
params ["_target", "_player", "_params"];
// send event to server
["milsim_reinsert_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 ["milsim_reinsert_reinsertionQueue", []];
// check if module is enabled, player is in the queue
// (serverTime - milsim_reinsert_missionStartServerTime) > 60*5 && // only allow after 15 minutes
missionNamespace getVariable ["milsim_reinsert_setting_reinsertion_enabled", true] &&
(_player in (_existingQueue apply {_x#0}))
}
] call ace_interact_menu_fnc_createAction;
[_type, 1, ["ACE_SelfActions"], _removeFileForReinsertAction, true] call ace_interact_menu_fnc_addActionToClass;
private _classesActionsAddedTo = (localNamespace getVariable ["milsim_reinsert_fileForReinsertClassesAdded", []]);
_classesActionsAddedTo pushBackUnique _type;
localNamespace setVariable ["milsim_reinsert_fileForReinsertClassesAdded", _classesActionsAddedTo];

View File

@@ -0,0 +1,28 @@
params ["_type"]; // string of the object's classname
if (!(_type isKindOf "CAManBase")) exitWith {};
if (
(localNamespace getVariable ["milsim_reinsert_checkReinsertQueueClassesAdded", []])
find _type != -1
) exitWith {};
private _checkReinsertQueueAction = [
"milsim_reinsert_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 milsim_reinsert_fnc_requestShowQueue;
// reset last check time
localNamespace setVariable ["milsim_reinsert_lastReinsertQueueCheck", diag_tickTime];
},
{
missionNamespace getVariable ["milsim_reinsert_setting_reinsertion_enabled", true]
} // always allow
] call ace_interact_menu_fnc_createAction;
[_type, 1, ["ACE_SelfActions"], _checkReinsertQueueAction, true] call ace_interact_menu_fnc_addActionToClass;
private _classesActionsAddedTo = (localNamespace getVariable ["milsim_reinsert_checkReinsertQueueClassesAdded", []]);
_classesActionsAddedTo pushBackUnique _type;
localNamespace setVariable ["milsim_reinsert_checkReinsertQueueClassesAdded", _classesActionsAddedTo];

View File

@@ -0,0 +1,53 @@
if (!hasInterface) exitWith {};
// ACE SELF-INTERACTIONS FOR FILING AND RESCINDING REINSERT REQUESTS NEAR BASE - ALL PLAYERS
localNamespace setVariable ["milsim_reinsert_fileForReinsertClassesAdded", []];
// add actions to current class
[typeOf player] call milsim_reinsert_fnc_addAceSelfActions;
// add actions to future classes
["ace_interact_menu_newControllableObject", {
_this call milsim_reinsert_fnc_addAceSelfActions;
}] call CBA_fnc_addEventHandler;
/////////////////////////////////////////////////////
// PILOTS ONLY
// ACE SELF-INTERACTIONS FOR CHECKING REINSERT QUEUE - ONLY FOR PILOTS
if ((typeOf player) in ["B_Helipilot_F", "B_helicrew_F"]) then {
localNamespace setVariable ["milsim_reinsert_checkReinsertQueueClassesAdded", []];
localNamespace setVariable ["milsim_reinsert_lastReinsertQueueCheck", diag_tickTime];
// add actions to current class
[typeOf player] call milsim_reinsert_fnc_addCheckQueueSelfAction;
// add actions to future classes
["ace_interact_menu_newControllableObject", {
_this call milsim_reinsert_fnc_addCheckQueueSelfAction;
}] call CBA_fnc_addEventHandler;
};
/////////////////////////////////////////////////////
// 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 (
missionNamespace getVariable ["milsim_reinsert_setting_reinsertion_enabled", true] &&
missionNamespace getVariable ["milsim_reinsert_setting_reinsertion_pilotForcedCheckEnabled", true]
)) exitWith {};
// if last check was less than X minutes ago, skip
private _lastCheck = localNamespace getVariable ["milsim_reinsert_lastReinsertQueueCheck", diag_tickTime];
private _requiredCheckInterval = missionNamespace getVariable ["milsim_reinsert_setting_reinsertion_pilotForcedCheckInterval", 60*20];
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 ["milsim_reinsert_lastReinsertQueueCheck", diag_tickTime];
// request notification from the server
call milsim_reinsert_fnc_requestShowQueue;
}, 30] call CBA_fnc_addPerFrameHandler;
};
/////////////////////////////////////////////////////

View File

@@ -0,0 +1,3 @@
if (!hasInterface) exitWith {};
[] remoteExec ["milsim_reinsert_fnc_returnReinsertQueueNotification", 2];

View File

@@ -0,0 +1,56 @@
params [
["_player", objNull, [objNull]],
["_base", objNull, [objNull]],
["_timeFiled", diag_tickTime, [25]]
];
if (!isServer) exitWith {
[
"respawn_reinsertion",
"ATTEMPTED RUN ON CLIENT",
[
["player", _player],
["base", _base]
]
] call milsim_fnc_log;
};
if (
isNull _player ||
isNull _base
) exitWith {
[
"respawn_reinsertion",
"NULL PARAMETERS",
[
["player", _player],
["base", _base]
]
] call milsim_fnc_log;
};
private _maxRangeToReady = missionNamespace getVariable ["milsim_reinsert_setting_reinsertion_maxRangeToReady", 400];
// nearest base here is the same as the base sent
private _nearestBase = _base;
milsim_reinsert_reinsertionQueue pushBackUnique [
_player, _base, _timeFiled
];
// broadcast new list to all machines
publicVariable "milsim_reinsert_reinsertionQueue";
// log to rpt
private _logParams = [
["filedAtBase", [_base] call milsim_fnc_getNameOfBase],
["filedAtBaseDistance", _player distance _base],
["closestBase", [_nearestBase] call milsim_fnc_getNameOfBase],
["closestBaseDistance", _player distance _nearestBase],
["maxDistanceSetting", _maxRangeToReady],
["inQueueDuration", diag_tickTime - _timeFiled]
];
_logParams = [_player, _logParams] call milsim_fnc_addPlayerInfoToArray;
[
"respawn_reinsertion",
"PLAYER FILED REQUEST",
_logParams
] call milsim_fnc_log;

View File

@@ -0,0 +1,70 @@
if (!isServer) exitWith {};
// if at least 1 player in the queue has been waiting longer than the configured timeout, notify all players
private _timeout = missionNamespace getVariable ["milsim_reinsert_setting_reinsertion_max_wait", 60*20]; // default 20 minutes
private _timeoutPlayers = milsim_reinsert_reinsertionQueue select {
_x params ["_player", "_base", "_timeFiled"];
alive (_player) &&
(diag_tickTime - (_timeFiled)) > _timeout
};
if (count _timeoutPlayers > 0) then {
// GLOBAL CBA NOTIFY
private _playerLines = [["Players are still waiting for Re-insert!", 1.2, [1, 0.64, 0, 1]]];
private _maxRangeToReady = missionNamespace getVariable ["milsim_reinsert_setting_reinsertion_maxRangeToReady", 400];
// get base objects from queue
private _basesWithPeople = (missionNamespace getVariable ["milsim_reinsert_reinsertionQueue", []]) apply {_x#1};
// get unique base objects
private _basesWithPeople = _basesWithPeople arrayIntersect _basesWithPeople;
{
private _thisBase = _x;
// Add line for base name
_playerLines pushBack ([[_thisBase] call milsim_fnc_getNameOfBase, 1, [0,1,0,1]]);
// Get players under this base
private _thisBasePlayers = _timeoutPlayers select {_x#1 isEqualTo _thisBase};
// sort _timeoutPlayers by time in queue, descending
_thisBasePlayers = [_thisBasePlayers, [], {
_x params ["_player", "_base", "_timeFiled"];
_timeFiled;
}, "DESCEND"] call BIS_fnc_sortBy;
{ // for each player under this base, add a line
_x params ["_player", "_base", "_timeFiled"];
// get the closest base to the player
private _nearestBase = [_player] call milsim_fnc_getNearestBase;
// add player to array of players under bases
_playerLines pushBack ([format [
"%1: %2 [%3]",
groupID (group (_player)),
name (_player),
[diag_tickTime - (_timeFiled), "MM:SS"] call BIS_fnc_secondsToString
], 0.8, [0.8, 0.8, 0.8, 1]]);
// log to rpt
private _logParams = [
["filedAtBase", [_base] call milsim_fnc_getNameOfBase],
["filedAtBaseDistance", _player distance _base],
["closestBase", [_nearestBase] call milsim_fnc_getNameOfBase],
["closestBaseDistance", _player distance _nearestBase],
["maxDistanceSetting", _maxRangeToReady],
["inQueueDuration", diag_tickTime - _timeFiled]
];
_logParams = [_player, _logParams] call milsim_fnc_addPlayerInfoToArray;
[
"respawn_reinsertion",
"PLAYER WAITING OVER TIMEOUT",
_logParams
] call milsim_fnc_log;
} forEach _thisBasePlayers;
} forEach _basesWithPeople;
// SEND NOTIFY
_playerLines remoteExec ["CBA_fnc_notify", [0, -2] select isDedicated];
// RESET NOTIFICATION TIMER
milsim_reinsert_reinsertionOverTimeoutLastNotificationTime = diag_tickTime;
};

View File

@@ -0,0 +1,50 @@
// if a player files for reinsert using self-interaction
// they're added to the queue along with their nearest base location and the time they filed
// if a player's time in the queue exceeds the configured timeout, a message will be posted every 5 minutes on a cycle based around
// the player's time in the queue stating how long they have been waiting, their name, and their group's name
if (!isServer) exitWith {};
// array of all respawn modules in the mission, used as 'base' locations for reinsertion
milsim_baseObjects = allMissionObjects "ModuleRespawnPosition_F";
publicVariable "milsim_baseObjects";
// register queue
milsim_reinsert_reinsertionQueue = [];
publicVariable "milsim_reinsert_reinsertionQueue";
// server mission start time
milsim_reinsert_missionStartServerTime = serverTime;
// FILE REQUEST CBA HANDLER
["milsim_reinsert_fileReinsertRequest", {
params ["_player", "_base"];
[_player, _base] call milsim_reinsert_fnc_addToQueue;
}] call CBA_fnc_addEventHandler;
// REMOVE REQUEST CBA HANDLER
["milsim_reinsert_removeReinsertRequest", {
params ["_player"];
[_player] call milsim_reinsert_fnc_removeFromQueue;
}] call CBA_fnc_addEventHandler;
// automated wait threshold timer
milsim_reinsert_reinsertionOverTimeoutLastNotificationTime = 0;
[{ // every 60 seconds
// validate queue
call milsim_reinsert_fnc_validateQueue;
// check if last overTimeout notification was sent more than X minutes ago
if (
diag_tickTime - milsim_reinsert_reinsertionOverTimeoutLastNotificationTime > 60*5
) then {
// show global queue notification with any players that are over timeout
call milsim_reinsert_fnc_globalShowQueue;
};
}, 60] call CBA_fnc_addPerFrameHandler;

View File

@@ -0,0 +1,57 @@
params [["_player", objNull, [objNull]]];
if (!isServer) exitWith {
[
"respawn_reinsertion",
"ATTEMPTED RUN ON CLIENT",
[
["player", _player]
]
] call milsim_fnc_log;
};
if (isNull _player) exitWith {
[
"respawn_reinsertion",
"NULL PARAMETERS",
[
["player", _player]
]
] call milsim_fnc_log;
};
// get entries for this player from queue
private _unitArrs = milsim_reinsert_reinsertionQueue select {_x#0 isEqualTo _player};
// if player not in queue, skip
if (count _unitArrs isEqualTo 0) exitWith {};
private _maxRangeToReady = missionNamespace getVariable ["milsim_reinsert_setting_reinsertion_maxRangeToReady", 400];
// remove player from queue
milsim_reinsert_reinsertionQueue = milsim_reinsert_reinsertionQueue - _unitArrs;
// broadcast new list to all machines
publicVariable "milsim_reinsert_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 milsim_fnc_getNearestBase;
// log to rpt
private _logParams = [
["filedAtBase", [_base] call milsim_fnc_getNameOfBase],
["filedAtBaseDistance", _player distance _base],
["closestBase", [_nearestBase] call milsim_fnc_getNameOfBase],
["closestBaseDistance", _player distance _nearestBase],
["maxDistanceSetting", _maxRangeToReady],
["inQueueDuration", diag_tickTime - _timeFiled]
];
_logParams = [_player, _logParams] call milsim_fnc_addPlayerInfoToArray;
[
"respawn_reinsertion",
"PLAYER RESCINDED REQUEST",
_logParams
] call milsim_fnc_log;

View File

@@ -0,0 +1,109 @@
/*
Function: milsim_reinsert_fnc_showReinsertQueueNotification
Description:
Designed to be remoteExecuted on the server. Will show a CBA notification on the remoteExecutedOwner's screen with the current reinsertion queue and log this occurrence in the server RPT.
Author: IndigoFox
*/
if (not isRemoteExecuted) exitWith {
diag_log text format ["[milsim] (respawn_reinsertion) SHOW QUEUE NOT REMOTE EXECUTED"];
};
if (not isServer) exitWith {
diag_log text format ["[milsim] (respawn_reinsertion) SHOW QUEUE NOT RUN ON SERVER"];
};
private _users = allUsers apply {getUserInfo _x} select {count _x > 0};
private _userIndex = _users findIf {_x#1 isEqualTo remoteExecutedOwner};
if (_userIndex isEqualTo -1) exitWith {
diag_log text format ["[milsim] (respawn_reinsertion) SHOW QUEUE USER NOT FOUND"];
};
private _userObject = _users select _userIndex select 10;
if (isNull _userObject) exitWith {
diag_log text format ["[milsim] (respawn_reinsertion) SHOW QUEUE USER OBJECT NOT FOUND"];
};
// log to rpt
private _logParams = [_userObject, []] call milsim_fnc_addPlayerInfoToArray;
[
"respawn_reinsertion",
"SHOW QUEUE REQUESTED",
_logParams
] call milsim_fnc_log;
private _queue = missionNamespace getVariable ["milsim_reinsert_reinsertionQueue", []];
// get base objects from queue
private _basesWithPeople = (missionNamespace getVariable ["milsim_reinsert_reinsertionQueue", []]) apply {_x#1};
// get unique base objects
private _basesWithPeople = _basesWithPeople arrayIntersect _basesWithPeople;
// text array to use in notification
private _par = [["Players Awaiting Reinsert", 1.2, [1,0.64,0,1]]];
if (count _basesWithPeople isEqualTo 0) then {
_par pushBack ["[QUEUE EMPTY]", 1, [1,1,1,1]];
};
// forEach _basesWithPeople
{
private _thisBase = _x;
private _baseName = [_thisBase] call milsim_fnc_getNameOfBase;
// generate player lines for this base
private _playerLines = _queue select {
_x#1 isEqualTo _thisBase
} apply {
_x params ["_player", "_base", "_timeFiled"];
[
format [
"%1: %2 [%3]",
groupId (group _player),
name _player,
[diag_tickTime - _timeFiled, "MM:SS"] call BIS_fnc_secondsToString
],
0.8,
[1,1,1,1]
];
};
// determine suffix for player count based on count
private _playerCountText = "";
switch (count _playerLines) do {
case 0: {
_playerCountText = "No players";
};
case 1: {
_playerCountText = "1 player";
};
default {
_playerCountText = format ["%1 players", count _playerLines];
};
};
// add base name and player count to notification lines
_par pushBack [
format ["Location: %1 (%2)",
_baseName,
_playerCountText
],
1,
[0,1,0,1]
];
// sort by text (first piece of text is group name)
_playerLines = [
_playerLines,
[],
{_x#0}
] call BIS_fnc_sortBy;
// add to notification lines
{
_par pushBack _x;
} forEach _playerLines;
} forEach _basesWithPeople;
_par remoteExec ["CBA_fnc_notify", remoteExecutedOwner];
true;

View File

@@ -0,0 +1,57 @@
// revalidate any players in the queue
// compare their distance to the nearest base, and remove them if they're too far away (or dead)
private _stillValid = [];
private _maxRangeToReady = missionNamespace getVariable ["milsim_reinsert_setting_reinsertion_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 milsim_fnc_getNearestBase;
private _isCloseEnoughToAnyBase = (_player distance _nearestBase) < _maxRangeToReady;
if (not _isCloseEnoughToAnyBase || not (alive _player)) then {
// don't include player in updated queue
// log to rpt
private _logParams = [
["filedAtBase", [_base] call milsim_fnc_getNameOfBase],
["filedAtBaseDistance", _player distance _base],
["closestBase", [_nearestBase] call milsim_fnc_getNameOfBase],
["closestBaseDistance", _player distance _nearestBase],
["maxDistanceSetting", _maxRangeToReady],
["inQueueDuration", diag_tickTime - _timeFiled]
];
_logParams = [_player, _logParams] call milsim_fnc_addPlayerInfoToArray;
[
"respawn_reinsertion",
"PLAYER DEQUEUED AUTOMATICALLY",
_logParams
] call milsim_fnc_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 {
private _logParams = [
["filedAtBase", [_base] call milsim_fnc_getNameOfBase],
["filedAtBaseDistance", _player distance _base],
["closestBase", [_nearestBase] call milsim_fnc_getNameOfBase],
["closestBaseDistance", _player distance _nearestBase],
["maxDistanceSetting", _maxRangeToReady],
["inQueueDuration", diag_tickTime - _timeFiled]
];
_logParams = [_player, _logParams] call milsim_fnc_addPlayerInfoToArray;
[
"respawn_reinsertion",
"PLAYER BASE WAS UPDATED",
_logParams
] call milsim_fnc_log;
};
} forEach milsim_reinsert_reinsertionQueue;
// broadcast new list to all machines
milsim_reinsert_reinsertionQueue = _stillValid;
publicVariable "milsim_reinsert_reinsertionQueue";

View File

@@ -0,0 +1,31 @@
// 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 milsim_resupply_fnc_getSupplyCratesCfg;
private _supplyCrateTypesCfgs = _supplyCratesCfg call BIS_fnc_returnChildren;
{
// add scroll wheel action to spawn different supply box types
private _arsenalBox = _x;
{
private _cfg = _x;
private _supplyCrateDisplayName = (_cfg >> "displayName") call BIS_fnc_getCfgData;
_arsenalBox addAction [format ["<t color='#ffffff'>Spawn %1</t>", _supplyCrateDisplayName], {
params ["_target", "_caller", "_actionId", "_arguments"];
_arguments params ["_supplyCrateCfg"];
[
objNull,
configName _supplyCrateCfg,
getPos _target
] call milsim_resupply_fnc_createBox;
}, [_cfg], 0, false, true, "", ""];
} forEach _supplyCrateTypesCfgs;
} forEach _arsenalBoxes;

View File

@@ -0,0 +1,22 @@
[
"milsim_resupply_setting_allowSupplyBoxScrollWheelSpawning", // variable
"CHECKBOX", // type
["Enabled", "If true, adds scroll wheel options to arsenal boxes to spawn supply boxes"], // title
["17th Battalion", "Resupply"], // category
false, // default value
true, // global setting
{
params ["_value"];
[
"resupply",
"SETTING CHANGED",
[
[
"setting",
"milsim_resupply_setting_allowSupplyBoxScrollWheelSpawning"
],
["newValue", _value]
]
] call milsim_fnc_log;
}
] call CBA_fnc_addSetting;

View File

@@ -1,7 +1,7 @@
/*
* Author: Hizumi
*
* Create Ammo resupply box for the 17th Batallion
* Create Ammo resupply box for the 17th Battalion
*
* Arguments:
* 0: Vehicle - <OBJECT>
@@ -12,9 +12,19 @@
*
* Example:
* [box] call milsim_fnc_createAmmoBox; // create ammo box via init line of editor object
* [objNull, pos] call milsim_fnc_createAmmoBox // create ammo box via zeus module
* [objNull, pos] call milsim_fnc_createAmmoBox; // create 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]
]];
*/
@@ -23,89 +33,4 @@ params [
["_pos", [0,0,0], [[]], 3]
];
if (isNull _box) then {
_box = "Box_Syndicate_Ammo_F" createVehicle _pos;
};
clearBackpackCargoGlobal _box;
clearItemCargoGlobal _box;
clearMagazineCargoGlobal _box;
clearWeaponCargoGlobal _box;
_packs = [];
_items = [];
_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",12],
["rhs_mag_m67",12],
["1Rnd_Smoke_Grenade_shell",24],
["1Rnd_SmokeRed_Grenade_shell",24],
["1Rnd_SmokeGreen_Grenade_shell",24],
["1Rnd_SmokeYellow_Grenade_shell",12],
["Tier1_30Rnd_556x45_M856A1_EMag",25],
["Tier1_30Rnd_556x45_Mk318Mod0_EMag",75],
["ACE_30Rnd_65_Creedmor_mag",25],
["SMA_30Rnd_762x35_BLK_EPR",25],
["Tier1_30Rnd_762x35_300BLK_SMK_PMAG",25],
["SMA_30Rnd_68x43_SPC_FMJ",25],
["SMA_30Rnd_68x43_SPC_FMJ_Tracer",25],
["SMA_20Rnd_762x51mm_M80A1_EPR",25],
["SMA_20Rnd_762x51mm_M80A1_EPR_Tracer",25],
["SMA_20Rnd_762x51mm_Mk316_Mod_0_Special_Long_Range",25],
["SMA_20Rnd_762x51mm_Mk316_Mod_0_Special_Long_Range_Tracer",25],
["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],
["Tier1_20Rnd_65x48_Creedmoor_SR25_Mag",25],
["rhssaf_30rnd_556x45_EPR_G36", 25],
["DemoCharge_Remote_Mag",16]
];
_weapons = [
["rhs_weap_M136",4],
["rhs_weap_M136_hp",4],
["rhs_weap_m72a7",2]
];
{
_x params ["_class", "_qty"];
_box addBackpackCargoGlobal [_class, _qty]
} foreach _packs;
{
_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;
[_box,1] call ace_cargo_fnc_setSize;
true;
[_box, "AMMO LIGHT", _pos] call milsim_fnc_createBox;

View File

@@ -0,0 +1,167 @@
/*
* 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]
]];
*/
params [
["_box", objNull, [objNull]],
["_type", "", [""]],
["_pos", [0,0,0], [[]], 3]
];
// get defs class
private _supplyCratesCfg = call milsim_resupply_fnc_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_ignoreWeightCarry", true, true];
// Return the box
_box;

View File

@@ -0,0 +1,36 @@
/*
* Author: Hizumi & IndigoFox
*
* Create Ammo resupply box for the 17th Battalion
*
* Arguments:
* 0: Vehicle - <OBJECT>
* 1: Position - <ARRAY>
*
* Return Value:
* Function executed <BOOL>
*
* Example:
* [box] call milsim_fnc_createCSWBox; // create ammo box via init line of editor object
* [objNull, pos] call milsim_fnc_createCSWBox; // create 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]
]];
*/
params [
["_box", objNull, [objNull]],
["_pos", [0,0,0], [[]], 3]
];
[_box, "CSW", _pos] call milsim_fnc_createBox;

View File

@@ -0,0 +1,36 @@
/*
* Author: Hizumi & IndigoFox
*
* Create Ammo resupply box for the 17th Battalion
*
* Arguments:
* 0: Vehicle - <OBJECT>
* 1: Position - <ARRAY>
*
* Return Value:
* Function executed <BOOL>
*
* Example:
* [box] call milsim_fnc_createLaunchersBox; // create ammo box via init line of editor object
* [objNull, pos] call milsim_fnc_createLaunchersBox; // create 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]
]];
*/
params [
["_box", objNull, [objNull]],
["_pos", [0,0,0], [[]], 3]
];
[_box, "LAUNCHERS", _pos] call milsim_fnc_createBox;

View File

@@ -23,64 +23,4 @@ params [
["_pos", [0,0,0], [[]], 3]
];
if (isNull _box) then {
_box = "ACE_medicalSupplyCrate_advanced" createVehicle _pos;
};
clearBackpackCargoGlobal _box;
clearItemCargoGlobal _box;
clearMagazineCargoGlobal _box;
clearWeaponCargoGlobal _box;
_packs = [];
_items = [
["ACE_packingBandage",100],
["ACE_elasticBandage",100],
["ACE_tourniquet",48],
["ACE_splint",48],
["ACE_morphine",50],
["ACE_epinephrine",50],
["ACE_bloodIV",75],
["ACE_bloodIV_500",50],
["ACE_bloodIV_250",25],
["ACE_quikclot",75],
["ACE_personalAidKit", 5],
["ACE_surgicalKit", 5]
];
_magazines = [];
_weapons = [];
{
_x params ["_class", "_qty"];
_box addBackpackCargoGlobal [_class, _qty]
} foreach _packs;
{
_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;
[_box,1] call ace_cargo_fnc_setSize;
true;
[_box, "MEDICAL", _pos] call milsim_fnc_createBox;

View File

@@ -0,0 +1,36 @@
/*
* Author: Hizumi & IndigoFox
*
* Create Mortar resupply box for the 17th Battalion
*
* Arguments:
* 0: Vehicle - <OBJECT>
* 1: Position - <ARRAY>
*
* Return Value:
* Function executed <BOOL>
*
* Example:
* [box] call milsim_fnc_createMortarBox; // create mortar ammo box via init line of editor object
* [objNull, pos] call milsim_fnc_createMortarBox; // 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]
]];
*/
params [
["_box", objNull, [objNull]],
["_pos", [0,0,0], [[]], 3]
];
[_box, "AMMO MORTAR", _pos] call milsim_fnc_createBox;

View File

@@ -12,9 +12,19 @@
*
* Example:
* [box] call milsim_fnc_createWeaponsBox; // create ammo box via init line of editor object
* [objNull, pos] call milsim_fnc_createWeaponsBox // create ammo box via zeus module
* [objNull, pos] call milsim_fnc_createWeaponsBox; // create 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]
]];
*/
@@ -23,60 +33,4 @@ params [
["_pos", [0,0,0], [[]], 3]
];
if (isNull _box) then {
_box = "Box_NATO_Wps_F" createVehicle _pos;
};
clearBackpackCargoGlobal _box;
clearItemCargoGlobal _box;
clearMagazineCargoGlobal _box;
clearWeaponCargoGlobal _box;
_packs = [];
_items = [];
_magazines = [
["MRAWS_HEAT_F",35],
["MRAWS_HE_F",15],
["Tier1_250Rnd_762x51_Belt_M993_AP",50],
["Tier1_30Rnd_556x45_M856A1_EMag",25],
["Tier1_30Rnd_556x45_Mk318Mod0_EMag",50],
["Titan_AA",10],
["Titan_AT",10],
["200Rnd_65x39_cased_Box_Tracer_Red",50]
];
_weapons = [];
{
_x params ["_class", "_qty"];
_box addBackpackCargoGlobal [_class, _qty]
} foreach _packs;
{
_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;
[_box,1] call ace_cargo_fnc_setSize;
true;
[_box, "AMMO HEAVY", _pos] call milsim_fnc_createBox;

View File

@@ -0,0 +1 @@
(missionConfigFile >> "SupplyCrates");

View File

@@ -0,0 +1,144 @@
/*
Function: milsim_fnc_logPlayerInventory
Description:
Checks a player's inventory for non-compliant items and logs results to all machines.
Author: Hizumi, EagleTrooper, IndigoFox
Parameters:
0: _player - <OBJECT> - Player to check inventory of.
Returns:
<ARRAY> - Array of strings to be logged.
*/
params [
["_player", objNull, [objNull]]
];
if (!isPlayer _player) exitWith {
[
"logPlayerInventory",
"PARAM PLAYER IS NOT A PLAYER",
[["player", _player]]
] call milsim_fnc_log;
};
// testing
// test_old = compile preprocessFileLineNumbers "testold.sqf";
// test_new = compile preprocessFileLineNumbers "testnew.sqf";
// player addItem "A3_GPNVG18_BLK_TI";
// player addWeapon "SMA_HK417_16in";
// player addItem "ej_VPS15";
// player addItem "ACE_Banana";
// INSTANTIATE VARS
private _foundItemsKeyValue = [];
private _allFoundItemsSoFar = [];
// GET PLAYER ITEMS
private _playerItems = [
_player, // Unit
true, // Include weapons, attachments, loaded magazines
true, // Include items in backpack
true, // Include items in vest
true, // Include items in uniform
true, // Include assigned items
true // Include not loaded magazines
] call CBA_fnc_uniqueUnitItems;
_playerItems pushBack (headgear _player);
_playerItems pushBack (uniform _player);
[
"logPlayerInventory",
"CHECKING PLAYER INVENTORY",
[_player] call milsim_fnc_addPlayerInfoToArray
] call milsim_fnc_log;
////////////////////////////////////////
// HARDCODED DISALLOWED ITEMS - see functions/definitions/DisallowedEquipment.hpp
// Get parent class
private _disallowedEquipmentCfg = (missionConfigFile >> "DisallowedEquipment");
// Get all subclasses
private _definitionCfgs = (_disallowedEquipmentCfg call BIS_fnc_getCfgSubClasses) apply {
(_disallowedEquipmentCfg >> _x)
};
// diag_log text format["DEFINITION CFGS: %1", _definitionCfgs];
// Check all items
{ // forEach _subclassesCfgs
private _definitionCfg = _x;
private _definitionLabel = (_definitionCfg >> "label") call BIS_fnc_getCfgData;
private _definitionItems = (_definitionCfg >> "items") call BIS_fnc_getCfgDataArray;
// diag_log text format["DEF ITEMS: %1", _definitionItems];
{ // forEach _playerItems
private _playerItem = _x;
// diag_log text format["PLAYER ITEM: %1", _playerItem];
if (_playerItem in _definitionItems && not (_playerItem in _allFoundItemsSoFar)) then {
// add under def label
[_foundItemsKeyValue, _definitionLabel, _playerItem] call BIS_fnc_addToPairs;
// add to all found items
_allFoundItemsSoFar pushBackUnique _playerItem;
};
} forEach _playerItems;
} forEach _definitionCfgs;
////////////////////////////////////////
// UNLISTED THERMAL - Any item with thermal capabilities that is not already in the list
// Identify thermal items in the player list
private _thermalItems = _playerItems select {
private _playerItem = _x;
private _modes = getArray(configfile >> "CfgWeapons" >> _playerItem >> "visionMode");
private _subModes = [configfile >> "CfgWeapons" >> _playerItem >> "ItemInfo" >> "OpticsModes", 1] call BIS_fnc_returnChildren;
{
_modes append getArray( _x >> "visionMode" );
} forEach _subModes;
if ((count _modes) isNotEqualTo 0) then {
// if the item has thermal capabilities and is not in the list anywhere else, include it
"ti" in (_modes apply { toLower _x }) && not (_playerItem in _allFoundItemsSoFar);
} else {
false;
};
};
{
[_foundItemsKeyValue, "UNLISTED THERMAL", _x] call BIS_fnc_addToPairs;
} forEach _thermalItems;
// Only log compliance message if no non-compliant items were found
if (count _allFoundItemsSoFar isEqualTo 0) exitWith {
[
"logPlayerInventory",
"PLAYER INVENTORY IS COMPLIANT",
[_player] call milsim_fnc_addPlayerInfoToArray
] call milsim_fnc_log;
};
// Log all non-compliant items
{
_x params ["_categoryLabel", "_items"];
if (typeName _items isEqualTo "STRING") then {
_items = [_items];
};
{
private _itemClassName = _x;
private _itemConfig = _itemClassName call CBA_fnc_getItemConfig;
// Log to RPT
[
"logPlayerInventory",
"NON-COMPLIANT ITEM",
[_player, [
["category", _categoryLabel],
["className", _itemClassName],
["displayName", [_itemConfig] call BIS_fnc_displayName]
]] call milsim_fnc_addPlayerInfoToArray
] call milsim_fnc_log;
} forEach _items;
} forEach _foundItemsKeyValue;

View File

@@ -6,7 +6,7 @@
"milsim_sideChat",
"CHECKBOX",
"Side Chat Text Enabled",
["17th Batallion", "Side Chat"],
["17th Battalion", "Side Chat"],
false,
true,
{
@@ -25,7 +25,7 @@
"milsim_server_cps_enable",
"CHECKBOX",
"CPS Metrics Enabled",
["17th Batallion", "Server Metrics"],
["17th Battalion", "Server Metrics"],
true,
true,
{
@@ -40,7 +40,7 @@
"milsim_server_cps_interval",
"TIME",
"Metrics Interval",
["17th Batallion", "Server Metrics"],
["17th Battalion", "Server Metrics"],
[60,300,120],
true,
{
@@ -71,7 +71,7 @@
"milsim_client_cps_enable",
"CHECKBOX",
"CPS Metrics Enabled",
["17th Batallion", "Client Metrics"],
["17th Battalion", "Client Metrics"],
true,
true,
{
@@ -86,7 +86,7 @@
"milsim_client_cps_interval",
"TIME",
"CPS Metrics Interval",
["17th Batallion", "Client Metrics"],
["17th Battalion", "Client Metrics"],
[60,300,120],
true,
{
@@ -104,6 +104,169 @@
}
] call CBA_fnc_addSetting;
//---------------------
// Medical Overlay
//---------------------
[
"milsim_client_medState3D_enabled", // variable
"CHECKBOX", // type
["Enable 3D Triage Card State", "Draws a colored dot over units within 10m indicating current ACE Triage State"], // title
["17th Battalion", "Medical"], // category
true // default value
] call CBA_fnc_addSetting;
[
"milsim_client_medState3D_drawRange", // variable
"LIST", // type
["Range To Draw Icons", "Determines range at which dots are visible"], // title
["17th Battalion", "Medical"], // category
[[2, 4, 6, 8, 10], ["2", "4", "6", "8", "10"], 4] // option values, option labels, default index
] call CBA_fnc_addSetting;
//---------------------
// Respawn Settings
[
"milsim_reinsert_setting_reinsertion_enabled", // variable
"CHECKBOX", // type
["Enabled", "Whether or not players can file for reinsert and pilots can check the reinsert queue"], // title
["17th Battalion", "Re-insert Queue"], // category
true, // default value
true, // global setting
{
params ["_value"];
[
"respawn_reinsertion",
"SETTING CHANGED",
[
[
"setting",
"milsim_reinsert_setting_reinsertion_enabled"
],
["newValue", _value]
]
] call milsim_fnc_log;
}
] call CBA_fnc_addSetting;
[
"milsim_reinsert_setting_reinsertion_maxRangeToReady", // variable
"SLIDER", // type
["Max Request Filing Range", "Maximum distance from a respawn point a player can be to ready up"], // title
["17th Battalion", "Re-insert Queue"], // category
[0, 1000, 400, 0, false], // [_min, _max, _default, _trailingDecimals, _isPercentage]
true, // global setting
{
params ["_value"];
[
"respawn_reinsertion",
"SETTING CHANGED",
[
[
"setting",
"milsim_reinsert_setting_reinsertion_maxRangeToReady"
],
["newValue", _value]
]
] call milsim_fnc_log;
}
] call CBA_fnc_addSetting;
[
"milsim_reinsert_setting_reinsertion_pilotForcedCheckEnabled", // variable
"CHECKBOX", // type
["Enabled", "Whether or not pilots are forced to view the contents of the reinsertion queue per interval"], // title
["17th Battalion", "Re-insert Queue"], // category
true, // default value
true, // global setting
{
params ["_value"];
[
"respawn_reinsertion",
"SETTING CHANGED",
[
[
"setting",
"milsim_reinsert_setting_reinsertion_pilotForcedCheckEnabled"
],
["newValue", _value]
]
] call milsim_fnc_log;
}
] call CBA_fnc_addSetting;
[
"milsim_reinsert_setting_reinsertion_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
["17th Battalion", "Re-insert Queue"], // category
[60*5, 60*30, 60*10], // [_min, _max, _default]
true,
{
params ["_value"];
[
"respawn_reinsertion",
"SETTING CHANGED",
[
[
"setting",
"milsim_reinsert_setting_reinsertion_pilotForcedCheckInterval"
],
["newValue", _value]
]
] call milsim_fnc_log;
}
] call CBA_fnc_addSetting;
[
"milsim_reinsert_setting_reinsertion_max_wait", // variable
"TIME", // type
["Max Wait Threshold", "How long should at least one person be waiting before prompting a global notification."], // title
["17th Battalion", "Re-insert Queue"], // category
[60*5, 60*30, 60*20], // [_min, _max, _default]
true,
{
params ["_value"];
[
"respawn_reinsertion",
"SETTING CHANGED",
[
[
"setting",
"milsim_reinsert_setting_reinsertion_max_wait"
],
["newValue", _value]
]
] call milsim_fnc_log;
}
] call CBA_fnc_addSetting;
//---------------------
// Asset Diary and Markers Settings
[
"milsim_fbcb2_assets_setting_detectionRangeFromBase", // variable
"SLIDER", // type
["Detection Range From Base", "The range from a base that assets will be detected"], // title
["17th Battalion", "Asset Diary and Markers"], // category
[0, 1000, 750, 0, false], // [_min, _max, _default, _trailingDecimals, _isPercentage]
true, // global setting
{
params ["_value"];
[
"fbcb2_assets",
"SETTING CHANGED",
[
[
"setting",
"milsim_fbcb2_assets_setting_detectionRangeFromBase"
],
["newValue", _value]
]
] call milsim_fnc_log;
}
] call CBA_fnc_addSetting;
diag_log text "[MILSIM] (settings) Custom CBA settings initialized";

View File

@@ -3,7 +3,15 @@
{
_clientID = _thisArgs select 0;
player setDamage 1;
format["[MILSIM] (init) %1 claims they were glitched and respawned - %2", name player, netID player] remoteExec["diag_log", 2];
// log to server RPT
[
"init",
"CHAT COMMAND RESPAWN",
[player] call milsim_fnc_addPlayerInfoToArray
] remoteExec ["milsim_fnc_log", 2];
// systemChat to all remote machines
format["%1 claims they were glitched and respawned (%2)", name player, netID player] remoteExec["systemChat", -_clientID];
},
"all",

View File

@@ -0,0 +1,14 @@
params [["_playerObj", objNull], ["_arrayToModify", [], [[]]]];
if (isNull _playerObj) exitWith {_arrayToModify};
{
_arrayToModify = [_arrayToModify, _x#0, _x#1] call BIS_fnc_setToPairs;
} forEach [
["playerName", name _playerObj],
["playerUID", getPlayerUID _playerObj],
["playerGroup", groupId (group _playerObj)],
["playerNetID", [_playerObj] call BIS_fnc_netId]
];
_arrayToModify;

View File

@@ -0,0 +1 @@
(missionConfigFile >> "BattalionInfo")

View File

@@ -0,0 +1,17 @@
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;

View File

@@ -0,0 +1,10 @@
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;

28
functions/util/fn_log.sqf Normal file
View File

@@ -0,0 +1,28 @@
/*
Function: milsim_fnc_log
Description:
Used to log messages to the server RPT file.
Parameters:
0: STRING - component name.
1: STRING - message to log.
2: ARRAY - Key value pairs of data to log.
*/
params [
["_component", "", [""]],
["_message", "", [""]],
["_data", [], [[]]]
];
private _hash = createHashMapFromArray _data;
// Replace square brackets with round brackets to avoid parsing issues.
_message regexReplace ["\[", "("];
_message regexReplace ["\]", ")"];
private _json = [_hash] call CBA_fnc_encodeJSON;
_log = format ["[milsim] [%1] [%2] [%3] :: %4", _component, _fnc_scriptNameParent, _message, _json];
diag_log text _log;

View File

@@ -0,0 +1,23 @@
[
"init",
"MISSION INFO",
[
["serverName", serverName],
["worldName", worldName],
["missionSeries", getMissionConfigValue ["missionSeries", ""]],
["missionName", missionName],
["briefingName", briefingName],
["overviewText", getMissionConfigValue ["overviewText", ""]],
["onLoadName", getMissionConfigValue ["onLoadName", ""]],
["onLoadMission", getMissionConfigValue ["onLoadMission", ""]],
["missionAuthor", getMissionConfigValue ["author", ""]],
["unitSlots", createHashMapFromArray [
["EAST", playableSlotsNumber EAST], // 0 is EAST side
["WEST", playableSlotsNumber WEST], // 1 is WEST side
["RESISTANCE", playableSlotsNumber RESISTANCE], // 2 is RESISTANCE side
["CIVILIAN", playableSlotsNumber CIVILIAN], // 3 is CIVILIAN side
["SIDEUNKNOWN", 0], // 4 is SIDEUNKNOWN side
["LOGIC", playableSlotsNumber sideLogic] // 5 is LOGIC side
]]
]
] call milsim_fnc_log;

View File

@@ -0,0 +1,20 @@
params [
["_text", "", [""]],
["_padSide", "left", ["left", "right"]],
["_padChar", " ", [" "]],
["_padLength", 4, [4]]
];
// pad a string with a character to a certain length
if (_padSide == "left") then {
for "_i" from 1 to _padLength - count _text do {
_text = _padChar + _text;
};
};
if (_padSide == "right") then {
for "_i" from 1 to _padLength - count _text do {
_text = _text + _padChar;
};
};
_text

View File

@@ -0,0 +1,25 @@
params [
["_cfg", configNull, [configNull]],
["_code", {}, [{}]]
];
if (isNull _cfg) exitWith {["Provided config is null!"] call BIS_fnc_error};
private _recurseFnc = {
params ["_cfg", "_code", ["_recurseCounter", 0]];
[_cfg, _recurseCounter] call _code;
// get children and recurse
private _childCfgs = _cfg call BIS_fnc_returnChildren;
if (count _childCfgs isEqualTo 0) exitWith {false};
{
[_x, _code, _recurseCounter + 1] call _recurseFnc;
} forEach _childCfgs;
false;
};
private _continue = true;
while {_continue} do {
_continue = [_cfg, _code] call _recurseFnc;
};

View File

@@ -0,0 +1,90 @@
/*
Used to generate flag category and nested flag child options for the ACE3 interaction menu.
Parameters:
0: STRING - Parent action ID
1: ARRAY - Flag category configs
*/
params ["_rootActionID", "_flagCategoryCfgs"];
private _allCategoryActions = [];
{
// diag_log format ["NewFlagCategory: %1 %2", _flagCategory, _flagOptions];
private _flagCategoryCfg = _x;
private _flagCategoryActionID = getText(_flagCategoryCfg >> "actionID");
private _flagCategoryTitle = getText(_flagCategoryCfg >> "actionTitle");
private _flagSubclassesCfgs = _flagCategoryCfg call BIS_fnc_returnChildren;
private _flagCategoryAction = [
_rootActionID + "_" + _flagCategoryActionID, // id
_flagCategoryTitle, // displayed title
getText((_flagSubclassesCfgs#0) >> "texture"), // flag icon for category - use first flag option
{true}, // statement
{
params ["_target", "_player", "_params"];
alive _target;
// true;
}, // condition
{
// generate child code under category
// this is the level where actual flag options will be displayed
params ["_target", "_player", "_params"];
_params params ["_rootActionID", "_flagCategoryActionID", "_flagSubclassesCfgs"];
private _individualFlagActions = [];
{ // forEach _flagSubclassesCfgs;
private _flagOptionCfg = _x;
private _flagOptionID = getText(_flagOptionCfg >> "actionID");
private _flagOptionTitle = getText(_flagOptionCfg >> "actionTitle");
private _flagOptionTexture = getText(_flagOptionCfg >> "texture");
// if the texture doesn't exist at the config path, skip this flag option
if (not (fileExists _flagOptionTexture)) then {continue};
// diag_log format ["NewFlagOption: %1 %2", _flagOptionID, _flagOptionData];
private _newFlagOption = [
_rootActionID + "_" + _flagCategoryActionID + "_" + _flagOptionID, // id
_flagOptionTitle, // displayed title
_flagOptionTexture, // flag icon
{
params ["_target", "_player", "_params"];
_params params ["_flagOptionTexture"];
_target forceFlagTexture _flagOptionTexture;
}, // statement
{
params ["_target", "_player", "_params"];
alive _target;
// true;
}, // condition
nil, // child code
[_flagOptionTexture], // params
nil, // position
4, // distance
[false, false, false, false, false] // other params
] call ace_interact_menu_fnc_createAction;
// add flag option to category subactions
_individualFlagActions pushBack [_newFlagOption, [], _target];
} forEach _flagSubclassesCfgs;
// return the generated flag options to the category as child actions
_individualFlagActions;
}, // child code
[_rootActionID, _flagCategoryActionID, _flagSubclassesCfgs], // params
nil, // position
4, // distance
[false, false, false, false, false], // other params
nil // modifier function code
] call ace_interact_menu_fnc_createAction;
// add category to all category actions array
_allCategoryActions pushBack [_flagCategoryAction, [], _target];
} forEach _flagCategoryCfgs;
_allCategoryActions;

View File

@@ -0,0 +1 @@
(missionConfigFile >> "VehicleFlags");

View File

@@ -0,0 +1,101 @@
if (!hasInterface) exitWith {};
private _vehicleFlagsCfg = call milsim_vehicleFlags_fnc_getVehicleFlagsCfg;
if (!isClass _vehicleFlagsCfg) exitWith {
["WARNING: Vehicle Flags: Vehicle Flags config not found. Vehicle Flags will not be available."] call BIS_fnc_error;
};
private _baseClassesToApplyActionsFor =
(_vehicleFlagsCfg >> "baseClassesToApplyActionsFor") call BIS_fnc_getCfgDataArray;
private _flagCategoryCfgs = (_vehicleFlagsCfg >> "FlagCategories") call BIS_fnc_returnChildren;
{ // forEach _baseClassesToApplyActionsFor
private _parentClass = _x;
////////////////////////////////////////////////////////////////////////
// add CBA class event handler to add actions to vehicles after they are initialized
// all classes that inherit from the base classes will also have this applied
// an exclusion function is present for manually excluding specific classes
////////////////////////////////////////////////////////////////////////
[_parentClass, "InitPost", {
////////////////////////////////////////////////////////////////////////
// create the root action
////////////////////////////////////////////////////////////////////////
private _rootActionID = "SetVehicleFlag";
private _flagRootAction = [
_rootActionID, // id
"Set Vehicle Flag", // displayed title
"\A3\ui_f\data\map\markers\flags\nato_ca.paa", // flag icon
{true}, // statement
{
params ["_target", "_player", "_params"];
// _params params ["_parentActionID", "_flagCategories"];
// check if vehicle is excluded
private _excluded = [typeOf _target] call milsim_vehicleFlags_fnc_isClassExcluded;
if (_excluded || !alive _target) exitWith {false};
true;
}, // condition
{
////////////////////////////////////////////////////////////////////////
// create the flag category actions (with nested flag actions)
////////////////////////////////////////////////////////////////////////
params ["_target", "_player", "_params"];
_params params ["_rootActionID", "_flagCategoryCfgs"];
// return category child actions with individual flag actions nested as children
[_rootActionID, _flagCategoryCfgs] call milsim_vehicleFlags_fnc_getActionsFlagCategories;
}, // child code
[_rootActionID, _flagCategoryCfgs], // params
nil, // position
4, // distance
[false, false, false, false, false], // other params
nil // modifier function code
] call ace_interact_menu_fnc_createAction;
////////////////////////////////////////////////////////////////////////
// add root action to add flags
////////////////////////////////////////////////////////////////////////
[
(_this select 0), // object
0, // action 0 or self-action 1
["ACE_MainActions"], // parent
_flagRootAction // action
] call ace_interact_menu_fnc_addActionToObject;
////////////////////////////////////////////////////////////////////////
// add action to remove flag under the root action
////////////////////////////////////////////////////////////////////////
// create action
private _removeFlagAction = [
_rootActionID + "_removeflag", // id
"Remove Flag", // displayed title
"\A3\ui_f\data\map\markers\flags\nato_ca.paa", // flag icon
{
params ["_target", "_player", "_params"];
_target forceFlagTexture "";
}, // statement
{
params ["_target", "_player", "_params"];
alive _target && getForcedFlagTexture _target != "";
}, // condition
nil // child code
] call ace_interact_menu_fnc_createAction;
// add the action to the vehicle
// in this class event handler, this#0 will be the vehicle
[
(_this select 0), // object
0, // action 0 or self-action 1
["ACE_MainActions", _rootActionID], // parent
_removeFlagAction // action
] call ace_interact_menu_fnc_addActionToObject;
}, true, [], true] call CBA_fnc_addClassEventHandler;
} forEach _baseClassesToApplyActionsFor;
nil;

View File

@@ -0,0 +1,26 @@
/*
Used to read vehicle flags config and check provided classname against all present exclusion groups.
Author: IndigoFox
Parameter(s):
0: STRING - Classname of the vehicle to check
*/
if (!hasInterface) exitWith {};
params [["_className", "", [""]]];
if (_className == "") exitWith {false};
private _vehicleFlagsCfg = call milsim_vehicleFlags_fnc_getVehicleFlagsCfg;
private _excludedVehiclesClass = (_vehicleFlagsCfg >> "ExcludedVehicles");
private _exclusionGroups = configProperties [_vehicleFlagsCfg >> "ExcludedVehicles"];
{
// Check if the class doesn't have a flag proxy
private _excludedClasses = _x call BIS_fnc_getCfgDataArray;
if (_className in _excludedClasses) exitWith {true};
} forEach _exclusionGroups;
false;

View File

@@ -6,6 +6,8 @@ onLoadMission = "THIS APPEARS BELOW THE LOADING SCREEN IMAGE";
briefingName = "THIS IS THE NAME ON THE #MISSIONS LIST";
overviewText = "THIS IS WHERE YOU DESCRIBE THE MISSION IN THE #MISSION LIST";
missionSeries = "";
// activate via #ace-fortify west base 2000
class ACEX_Fortify_Presets {

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.