diff --git a/.hemtt/launch.toml b/.hemtt/launch.toml
index ff6bdadd3b9..22ca0704a1d 100644
--- a/.hemtt/launch.toml
+++ b/.hemtt/launch.toml
@@ -3,6 +3,18 @@ workshop = [
"450814997", # CBA_A3
]
+[adt]
+extends = "default"
+workshop = [
+ "3499977893", # ADT
+]
+
+[zen]
+extends = "default"
+workshop = [
+ "1779063631", # ZEN
+]
+
[rhs]
extends = "default"
workshop = [
@@ -26,22 +38,29 @@ workshop = [
"1369691841", # Community Factions Project
]
-[wardrobe]
+[aegis]
extends = "default"
+workshop = [
+ "949252631", # Aegis
+]
+dlc = [
+ "ws", # Western Sahara
+]
+
+[wardrobe]
+extends = "adt"
mission = "Wardrobe.VR"
workshop = [
- "3499977893", # Advanced Developer Tools
"1779063631", # ZEN
# "751965892", # ACRE
-# "623475643", # eden enhanced
+# "623475643", # 3den Enhanced
]
[sogns]
-extends = "default"
+extends = "adt"
dlc = ["vn"]
workshop = [
"623475643", # 3den Enhanced
- "3499977893", # Advanced Developer Tools
"3083451905", # S.O.G. Nickel Steel
"1779063631", # Zeus Enhanced
]
diff --git a/addons/compat_aegis/compat_aegis_smoke/CfgGlasses.hpp b/addons/compat_aegis/compat_aegis_smoke/CfgGlasses.hpp
new file mode 100644
index 00000000000..86bb1af563b
--- /dev/null
+++ b/addons/compat_aegis/compat_aegis_smoke/CfgGlasses.hpp
@@ -0,0 +1,41 @@
+class CfgGlasses {
+ class None;
+
+ class G_Combat_Goggles_blk_F: None {
+ ace_smoke_eyes_protection = 1;
+ };
+
+ class G_Balaclava_light_blk_F: None {
+ ace_smoke_breathing_protection = 0.4;
+ };
+ class G_Balaclava_light_G_blk_F: G_Balaclava_light_blk_F {
+ ace_smoke_eyes_protection = 1;
+ };
+ class G_Balaclava_light_eaf_F;
+ class G_Balaclava_light_G_eaf_F: G_Balaclava_light_eaf_F {
+ ace_smoke_eyes_protection = 1;
+ };
+ class G_Balaclava_light_mtp_F;
+ class G_Balaclava_light_G_mtp_F: G_Balaclava_light_mtp_F {
+ ace_smoke_eyes_protection = 1;
+ };
+ class G_Balaclava_light_tropic_F;
+ class G_Balaclava_light_G_tropic_F: G_Balaclava_light_tropic_F {
+ ace_smoke_eyes_protection = 1;
+ };
+ class G_Balaclava_light_wdl_F;
+ class G_Balaclava_light_G_wdl_F: G_Balaclava_light_wdl_F {
+ ace_smoke_eyes_protection = 1;
+ };
+
+ class G_Balaclava_TI_blk_F: None {
+ ace_smoke_breathing_protection = 0.4;
+ };
+ class G_Balaclava_TI_G_blk_F: G_Balaclava_TI_blk_F {
+ ace_smoke_eyes_protection = 1;
+ };
+ class G_Balaclava_TI_tna_F;
+ class G_Balaclava_TI_G_tna_F: G_Balaclava_TI_tna_F {
+ ace_smoke_eyes_protection = 1;
+ };
+};
diff --git a/addons/compat_aegis/compat_aegis_smoke/config.cpp b/addons/compat_aegis/compat_aegis_smoke/config.cpp
new file mode 100644
index 00000000000..be9c09f88c5
--- /dev/null
+++ b/addons/compat_aegis/compat_aegis_smoke/config.cpp
@@ -0,0 +1,24 @@
+#include "script_component.hpp"
+
+class CfgPatches {
+ class SUBADDON {
+ name = COMPONENT_NAME;
+ units[] = {};
+ weapons[] = {};
+ requiredVersion = REQUIRED_VERSION;
+ requiredAddons[] = {
+ "A3_Aegis_Characters_F_Aegis_Facewear",
+ "ace_smoke",
+ };
+ skipWhenMissingDependencies = 1;
+ author = ECSTRING(common,ACETeam);
+ authors[] = {"BrettMayson"};
+ url = ECSTRING(main,URL);
+ VERSION_CONFIG;
+
+ // this prevents any patched class from requiring this addon
+ addonRootClass = "A3_Characters_F";
+ };
+};
+
+#include "CfgGlasses.hpp"
diff --git a/addons/compat_aegis/compat_aegis_smoke/script_component.hpp b/addons/compat_aegis/compat_aegis_smoke/script_component.hpp
new file mode 100644
index 00000000000..cafc3b0288d
--- /dev/null
+++ b/addons/compat_aegis/compat_aegis_smoke/script_component.hpp
@@ -0,0 +1,3 @@
+#define SUBCOMPONENT smoke
+#define SUBCOMPONENT_BEAUTIFIED Smoke
+#include "..\script_component.hpp"
diff --git a/addons/compat_cup_units/compat_cup_smoke/CfgGlasses.hpp b/addons/compat_cup_units/compat_cup_smoke/CfgGlasses.hpp
new file mode 100644
index 00000000000..3b9c71bf637
--- /dev/null
+++ b/addons/compat_cup_units/compat_cup_smoke/CfgGlasses.hpp
@@ -0,0 +1,80 @@
+#define PROTECT(var1,eyes,breathing) class var1: None { \
+ ace_smoke_eyes_protection = eyes; \
+ ace_smoke_breathing_protection = breathing; \
+}
+
+class CfgGlasses {
+ class None;
+
+ class CUP_RUS_Balaclava_blk: None {
+ ace_smoke_breathing_protection = 0.4;
+ };
+
+ class CUP_G_Ratnik_Balaclava_base: None {
+ ace_smoke_breathing_protection = 0.4;
+ };
+
+ PROTECT(CUP_G_ESS_BLK_Dark,1,0);
+ PROTECT(CUP_G_ESS_BLK_Ember,1,0);
+ PROTECT(CUP_G_ESS_BLK,1,0);
+ PROTECT(CUP_G_ESS_CBR_Dark,1,0);
+ PROTECT(CUP_G_ESS_CBR_Ember,1,0);
+ PROTECT(CUP_G_ESS_CBR,1,0);
+ PROTECT(CUP_G_ESS_RGR_Dark,1,0);
+ PROTECT(CUP_G_ESS_RGR_Ember,1,0);
+ PROTECT(CUP_G_ESS_RGR,1,0);
+ PROTECT(CUP_G_ESS_KHK_Dark,1,0);
+ PROTECT(CUP_G_ESS_KHK_Ember,1,0);
+ PROTECT(CUP_G_ESS_KHK,1,0);
+ PROTECT(CUP_G_ESS_BLK_Facewrap_Black,1,0.4);
+ PROTECT(CUP_G_ESS_RGR_Facewrap_Ranger,1,0.4);
+ PROTECT(CUP_G_ESS_CBR_Facewrap_Red,1,0.4);
+ PROTECT(CUP_G_ESS_RGR_Facewrap_Skull,1,0.4);
+ PROTECT(CUP_G_ESS_KHK_Facewrap_Tan,1,0.4);
+ PROTECT(CUP_G_ESS_RGR_Facewrap_Tropical,1,0.4);
+ PROTECT(CUP_G_ESS_KHK_Facewrap_White,1,0.4);
+ PROTECT(CUP_G_ESS_BLK_Facewrap_Black_GPS,1,0.4);
+ PROTECT(CUP_G_ESS_BLK_Scarf_Blk,1,0);
+ PROTECT(CUP_G_ESS_BLK_Scarf_Grn,1,0);
+ PROTECT(CUP_G_ESS_BLK_Scarf_Red,1,0);
+ PROTECT(CUP_G_ESS_KHK_Scarf_Tan,1,0);
+ PROTECT(CUP_G_ESS_BLK_Scarf_White,1,0);
+ PROTECT(CUP_G_ESS_BLK_Scarf_Face_Blk,1,0.4);
+ PROTECT(CUP_G_ESS_BLK_Scarf_Face_Grn,1,0.4);
+ PROTECT(CUP_G_ESS_BLK_Scarf_Face_Red,1,0.4);
+ PROTECT(CUP_G_ESS_KHK_Scarf_Face_Tan,1,0.4);
+ PROTECT(CUP_G_ESS_BLK_Scarf_Face_White,1,0.4);
+ PROTECT(CUP_G_ESS_BLK_Scarf_Blk_Beard,1,0);
+ PROTECT(CUP_G_ESS_BLK_Scarf_Blk_Beard_Blonde,1,0);
+ PROTECT(CUP_G_ESS_BLK_Scarf_Grn_Beard,1,0);
+ PROTECT(CUP_G_ESS_BLK_Scarf_Grn_Beard_Blonde,1,0);
+ PROTECT(CUP_G_ESS_BLK_Scarf_Red_Beard,1,0);
+ PROTECT(CUP_G_ESS_BLK_Scarf_Red_Beard_Blonde,1,0);
+ PROTECT(CUP_G_ESS_KHK_Scarf_Tan_Beard,1,0);
+ PROTECT(CUP_G_ESS_KHK_Scarf_Tan_Beard_Blonde,1,0);
+ PROTECT(CUP_G_ESS_BLK_Scarf_White_Beard,1,0);
+ PROTECT(CUP_G_ESS_BLK_Scarf_White_Beard_Blonde,1,0);
+ PROTECT(CUP_G_ESS_BLK_Scarf_Grn_GPS,1,0);
+ PROTECT(CUP_G_ESS_KHK_Scarf_Tan_GPS,1,0);
+ PROTECT(CUP_G_ESS_BLK_Scarf_White_GPS,1,0);
+ PROTECT(CUP_G_ESS_BLK_Scarf_Face_Grn_GPS,1,0.4);
+ PROTECT(CUP_G_ESS_KHK_Scarf_Face_Tan_GPS,1,0.4);
+ PROTECT(CUP_G_ESS_BLK_Scarf_Face_White_GPS,1,0.4);
+ PROTECT(CUP_G_ESS_BLK_Scarf_Grn_GPS_Beard,1,0);
+ PROTECT(CUP_G_ESS_BLK_Scarf_Grn_GPS_Beard_Blonde,1,0);
+ PROTECT(CUP_G_ESS_KHK_Scarf_Tan_GPS_Beard,1,0);
+ PROTECT(CUP_G_ESS_KHK_Scarf_Tan_GPS_Beard_Blonde,1,0);
+ PROTECT(CUP_G_ESS_BLK_Scarf_White_GPS_Beard,1,0);
+ PROTECT(CUP_G_ESS_BLK_Scarf_White_GPS_Beard_Blonde,1,0);
+ PROTECT(CUP_G_PMC_Facewrap_Black_Glasses_Dark_Headset,0,0.4);
+ PROTECT(CUP_G_PMC_Facewrap_Black_Glasses_Dark,0,0.4);
+ PROTECT(CUP_PMC_Facewrap_Black,0,0.4);
+ PROTECT(CUP_G_PMC_Facewrap_Tan_Glasses_Dark_Headset,0,0.4);
+ PROTECT(CUP_G_PMC_Facewrap_Tropical_Glasses_Dark_Headset,0,0.4);
+ PROTECT(CUP_G_PMC_Facewrap_Winter_Glasses_Dark_Headset,0,0.4);
+ PROTECT(CUP_G_Scarf_Face_Blk,0,0.4);
+ PROTECT(CUP_G_Scarf_Face_Grn,0,0.4);
+ PROTECT(CUP_G_Scarf_Face_Red,0,0.4);
+ PROTECT(CUP_G_Scarf_Face_Tan,0,0.4);
+ PROTECT(CUP_G_Scarf_Face_White,0,0.4);
+};
diff --git a/addons/compat_cup_units/compat_cup_smoke/config.cpp b/addons/compat_cup_units/compat_cup_smoke/config.cpp
new file mode 100644
index 00000000000..6f833154da5
--- /dev/null
+++ b/addons/compat_cup_units/compat_cup_smoke/config.cpp
@@ -0,0 +1,23 @@
+#include "script_component.hpp"
+
+class CfgPatches {
+ class SUBADDON {
+ name = COMPONENT_NAME;
+ units[] = {};
+ weapons[] = {};
+ requiredVersion = REQUIRED_VERSION;
+ requiredAddons[] = {
+ "ace_smoke",
+ "CUP_Creatures_Military_RussiaModern_Headgear",
+ "CUP_Creatures_Military_USArmy",
+ };
+ skipWhenMissingDependencies = 1;
+ author = ECSTRING(common,ACETeam);
+ authors[] = {"BrettMayson"};
+ url = ECSTRING(main,URL);
+ VERSION_CONFIG;
+ addonRootClass = QUOTE(ADDON);
+ };
+};
+
+#include "CfgGlasses.hpp"
diff --git a/addons/compat_cup_units/compat_cup_smoke/script_component.hpp b/addons/compat_cup_units/compat_cup_smoke/script_component.hpp
new file mode 100644
index 00000000000..cafc3b0288d
--- /dev/null
+++ b/addons/compat_cup_units/compat_cup_smoke/script_component.hpp
@@ -0,0 +1,3 @@
+#define SUBCOMPONENT smoke
+#define SUBCOMPONENT_BEAUTIFIED Smoke
+#include "..\script_component.hpp"
diff --git a/addons/compat_ws/compat_ws_smoke/CfgWeapons.hpp b/addons/compat_ws/compat_ws_smoke/CfgWeapons.hpp
new file mode 100644
index 00000000000..2a3303d8713
--- /dev/null
+++ b/addons/compat_ws/compat_ws_smoke/CfgWeapons.hpp
@@ -0,0 +1,11 @@
+class CfgWeapons {
+ class lxWS_H_turban_01_black;
+ class lxWS_H_turban_03_black: lxWS_H_turban_01_black {
+ ace_smoke_breathing_protection = 0.4;
+ };
+
+ class H_Shemag_khk;
+ class H_turban_02_mask_black_lxws: H_Shemag_khk {
+ ace_smoke_breathing_protection = 0.4;
+ };
+};
diff --git a/addons/compat_ws/compat_ws_smoke/config.cpp b/addons/compat_ws/compat_ws_smoke/config.cpp
new file mode 100644
index 00000000000..61a8c70dfcc
--- /dev/null
+++ b/addons/compat_ws/compat_ws_smoke/config.cpp
@@ -0,0 +1,24 @@
+#include "script_component.hpp"
+
+class CfgPatches {
+ class SUBADDON {
+ name = COMPONENT_NAME;
+ units[] = {};
+ weapons[] = {};
+ requiredVersion = REQUIRED_VERSION;
+ requiredAddons[] = {
+ "data_f_lxWS_Loadorder",
+ "ace_smoke",
+ };
+ skipWhenMissingDependencies = 1;
+ author = ECSTRING(common,ACETeam);
+ authors[] = {"BrettMayson"};
+ url = ECSTRING(main,URL);
+ VERSION_CONFIG;
+
+ // this prevents any patched class from requiring this addon
+ addonRootClass = "A3_Characters_F";
+ };
+};
+
+#include "CfgWeapons.hpp"
diff --git a/addons/compat_ws/compat_ws_smoke/script_component.hpp b/addons/compat_ws/compat_ws_smoke/script_component.hpp
new file mode 100644
index 00000000000..cafc3b0288d
--- /dev/null
+++ b/addons/compat_ws/compat_ws_smoke/script_component.hpp
@@ -0,0 +1,3 @@
+#define SUBCOMPONENT smoke
+#define SUBCOMPONENT_BEAUTIFIED Smoke
+#include "..\script_component.hpp"
diff --git a/addons/hearing/stringtable.xml b/addons/hearing/stringtable.xml
index 9eab8e109cb..3ced27a2450 100644
--- a/addons/hearing/stringtable.xml
+++ b/addons/hearing/stringtable.xml
@@ -491,36 +491,36 @@
ЕЛЕКТРОННИЙ
- Volume muffling
- Snížení hlasitosti
- Atténuation du volume
- Atenuación de volumen
- Attenuazione del volume
- Tłumienie głośności
- Abafamento de Volume
- Глушение звука
+ Volume Muffling
+ Snížení Hlasitosti
+ Atténuation Du Volume
+ Atenuación De Volumen
+ Attenuazione Del Volume
+ Tłumienie Głośności
+ Abafamento De Volume
+ Глушение Звука
Lautstärkedämpfung
소리 차음도
音量の抑制
進低音量
降低音量
- Глушіння звуку
+ Глушіння Звуку
- Hearing protection
- Ochrana sluchu
- Protection auditive
- Protección auditiva
- Protezione uditiva
- Ochrona słuchu
+ Hearing Protection
+ Ochrana Sluchu
+ Protection Auditive
+ Protección Auditiva
+ Protezione Uditiva
+ Ochrona Słuchu
Proteção Auditiva
- Защита слуха
+ Защита Слуха
Gehörschutz
청력 보호
聴覚保護
聽力保護
听力保护
- Захист слуху
+ Захист Слуху
Volume when unconscious.
diff --git a/addons/medical_vitals/functions/fnc_addSpO2DutyFactor.sqf b/addons/medical_vitals/functions/fnc_addSpO2DutyFactor.sqf
index 0c85ae3fa55..69573b9dff9 100644
--- a/addons/medical_vitals/functions/fnc_addSpO2DutyFactor.sqf
+++ b/addons/medical_vitals/functions/fnc_addSpO2DutyFactor.sqf
@@ -16,6 +16,10 @@
* Public: No
*/
params [["_id", "", [""]], ["_factor", 1, [0, {}]]];
-if (_id == "" || {_factor isEqualTo 1}) exitWith {};
+if (_id == "") exitWith {};
+
+if (_factor isEqualTo 1) exitWith {
+ [_id] call FUNC(removeSpO2DutyFactor);
+};
GVAR(spo2DutyList) set [_id, _factor];
diff --git a/addons/smoke/$PBOPREFIX$ b/addons/smoke/$PBOPREFIX$
new file mode 100644
index 00000000000..830debaa3c8
--- /dev/null
+++ b/addons/smoke/$PBOPREFIX$
@@ -0,0 +1 @@
+z\ace\addons\smoke
diff --git a/addons/smoke/ACE_Arsenal_Stats.hpp b/addons/smoke/ACE_Arsenal_Stats.hpp
new file mode 100644
index 00000000000..313b9f6ee11
--- /dev/null
+++ b/addons/smoke/ACE_Arsenal_Stats.hpp
@@ -0,0 +1,20 @@
+class EGVAR(arsenal,stats) {
+ class statBase;
+ class GVAR(breathing_protection): statBase {
+ scope = 2;
+ displayName = CSTRING(statBreatingProtection);
+ showBar = 1;
+ condition = QUOTE(getNumber (_this select 1 >> QQGVAR(Breathing_Protection)) > 0);
+ barStatement = QUOTE(getNumber (_this select 1 >> QQGVAR(Breathing_Protection)));
+ tabs[] = {{6,7}, {}};
+ };
+
+ class GVAR(eyes_protection): statBase {
+ scope = 2;
+ displayName = CSTRING(statEyesProtection);
+ showBar = 1;
+ condition = QUOTE(getNumber (_this select 1 >> QQGVAR(Eyes_Protection)) > 0);
+ barStatement = QUOTE(getNumber (_this select 1 >> QQGVAR(Eyes_Protection)));
+ tabs[] = {{6,7}, {}};
+ };
+};
diff --git a/addons/smoke/CfgEventHandlers.hpp b/addons/smoke/CfgEventHandlers.hpp
new file mode 100644
index 00000000000..e90bed419e7
--- /dev/null
+++ b/addons/smoke/CfgEventHandlers.hpp
@@ -0,0 +1,15 @@
+class Extended_PreStart_EventHandlers {
+ class ADDON {
+ init = QUOTE(call COMPILE_FILE(XEH_preStart));
+ };
+};
+class Extended_PreInit_EventHandlers {
+ class ADDON {
+ init = QUOTE(call COMPILE_FILE(XEH_preInit));
+ };
+};
+class Extended_PostInit_EventHandlers {
+ class ADDON {
+ init = QUOTE(call COMPILE_FILE(XEH_postInit));
+ };
+};
diff --git a/addons/smoke/CfgGlasses.hpp b/addons/smoke/CfgGlasses.hpp
new file mode 100644
index 00000000000..d7ee9a1f65d
--- /dev/null
+++ b/addons/smoke/CfgGlasses.hpp
@@ -0,0 +1,53 @@
+class CfgGlasses {
+ class None;
+
+ class G_AirPurifyingRespirator_01_base_F: None {
+ GVAR(Eyes_Protection) = 1;
+ GVAR(Breathing_Protection) = 1;
+ };
+
+ class G_Balaclava_blk: None {
+ GVAR(Breathing_Protection) = 0.2;
+ };
+ class G_Balaclava_combat: G_Balaclava_blk {
+ GVAR(Eyes_Protection) = 1;
+ };
+ class G_Balaclava_lowprofile: G_Balaclava_blk {
+ GVAR(Eyes_Protection) = 1;
+ };
+
+ class G_Combat: None {
+ GVAR(Eyes_Protection) = 1;
+ };
+ class G_Lowprofile: None {
+ GVAR(Eyes_Protection) = 1;
+ };
+
+ class G_RegulatorMask_base_F: None {
+ GVAR(Eyes_Protection) = 1;
+ GVAR(Breathing_Protection) = 1;
+ };
+
+ class G_Respirator_base_F: None {
+ GVAR(Breathing_Protection) = 0.8;
+ };
+
+ class G_EyeProtectors_base_F: None {
+ GVAR(Eyes_Protection) = 0.2;
+ };
+
+ class G_Balaclava_TI_blk_F: None {
+ GVAR(Breathing_Protection) = 0.4;
+ };
+ class G_Balaclava_TI_G_blk_F: G_Balaclava_TI_blk_F {
+ GVAR(Eyes_Protection) = 1;
+ };
+ class G_Balaclava_TI_tna_F;
+ class G_Balaclava_TI_G_tna_F: G_Balaclava_TI_tna_F {
+ GVAR(Eyes_Protection) = 1;
+ };
+
+ class G_Blindfold_01_base_F: None {
+ GVAR(Eyes_Protection) = 0.6;
+ };
+};
diff --git a/addons/smoke/CfgVehicles.hpp b/addons/smoke/CfgVehicles.hpp
new file mode 100644
index 00000000000..a19a9caa88b
--- /dev/null
+++ b/addons/smoke/CfgVehicles.hpp
@@ -0,0 +1,67 @@
+class CfgVehicles {
+ class Truck_01_base_F;
+ class B_Truck_01_transport_F: Truck_01_base_F {
+ ace_smoke_seats[] = {
+ {0}, // Driver is enclosed
+ {1, 1}, // Gunners are exposed
+ {0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}
+ };
+ };
+
+ class Heli_Transport_04_base_F;
+ class O_Heli_Transport_04_bench_F: Heli_Transport_04_base_F {
+ ace_smoke_seats[] = {
+ {0}, // Pilot is enclosed
+ {0, 0, 1, 1, 1, 1, 1, 1, 1, 1}, // Crew is enclosed, passengers are exposed
+ };
+ };
+
+ class Heli_light_03_base_F;
+ class Heli_light_03_unarmed_base_F: Heli_light_03_base_F {
+ ace_smoke_seats[] = {0}; // All seats are enclosed
+ };
+
+ class Heli_Light_02_base_F;
+ class Heli_Light_02_dynamicLoadout_base_F: Heli_Light_02_base_F {
+ ace_smoke_seats[] = {0}; // All seats are enclosed
+ };
+
+ class Heli_Attack_01_base_F;
+ class Heli_Attack_01_dynamicLoadout_base_F: Heli_Attack_01_base_F {
+ ace_smoke_seats[] = {0}; // All seats are enclosed
+ };
+
+ class Helicopter_Base_H;
+ class Heli_Transport_02_base_F: Helicopter_Base_H {
+ ace_smoke_seats[] = {0}; // All seats are enclosed
+ };
+
+ class Car_F;
+ class Offroad_01_base_F: Car_F {
+ ace_smoke_seats[] = {1}; // All seats are exposed
+ };
+ class Hatchback_01_base_F: Car_F {
+ ace_smoke_seats[] = {1};
+ };
+ class SUV_01_base_F: Car_F {
+ ace_smoke_seats[] = {1};
+ };
+ class Van_01_base_F: Car_F {
+ ace_smoke_seats[] = {1};
+ };
+ class Van_02_base_F: Car_F {
+ ace_smoke_seats[] = {1};
+ };
+ class Tractor_01_base_F: Car_F {
+ ace_smoke_seats[] = {1};
+ };
+
+ class Truck_02_base_F;
+ class C_Truck_02_covered_F: Truck_02_base_F {
+ ace_smoke_seats[] = {
+ {0}, // Driver is enclosed
+ {1, 1}, // Gunners are exposed
+ {0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}
+ };
+ };
+};
diff --git a/addons/smoke/CfgWeapons.hpp b/addons/smoke/CfgWeapons.hpp
new file mode 100644
index 00000000000..74fc3494864
--- /dev/null
+++ b/addons/smoke/CfgWeapons.hpp
@@ -0,0 +1,17 @@
+class CfgWeapons {
+ class H_HelmetB;
+ class H_HelmetO_ViperSP_hex_F: H_HelmetB {
+ GVAR(Eyes_Protection) = 1;
+ };
+
+ class H_PilotHelmetFighter_B: H_HelmetB {
+ GVAR(Breathing_Protection) = 1;
+ GVAR(Eyes_Protection) = 1;
+ };
+
+ class H_HelmetB_camo;
+ class H_RacingHelmet_1_F: H_HelmetB_camo {
+ GVAR(Breathing_Protection) = 0.3;
+ GVAR(Eyes_Protection) = 0.7;
+ };
+};
diff --git a/addons/smoke/XEH_PREP.hpp b/addons/smoke/XEH_PREP.hpp
new file mode 100644
index 00000000000..059e0c6264b
--- /dev/null
+++ b/addons/smoke/XEH_PREP.hpp
@@ -0,0 +1,4 @@
+PREP(isInSmoke);
+PREP(isOpenVehicle);
+PREP(isOpenSeat);
+PREP(pfh);
diff --git a/addons/smoke/XEH_postInit.sqf b/addons/smoke/XEH_postInit.sqf
new file mode 100644
index 00000000000..4fa37ee6348
--- /dev/null
+++ b/addons/smoke/XEH_postInit.sqf
@@ -0,0 +1,17 @@
+#include "script_component.hpp"
+
+if (!hasInterface) exitWith {};
+GVAR(ppHandleDynamicBlur) = ppEffectCreate ["DynamicBlur", 500];
+GVAR(ppHandleColorCorrections) = ppEffectCreate ["ColorCorrections", 1500];
+GVAR(ppHandleDynamicBlur) ppEffectEnable GVAR(enabled);
+GVAR(ppHandleColorCorrections) ppEffectEnable GVAR(enabled);
+
+["loadout", {
+ params ["_unit"];
+ if !(local _unit) exitWith {};
+ private _config = configFile >> "CfgGlasses" >> goggles _unit;
+ private _breathing = getNumber (_config >> QGVAR(Breathing_Protection));
+ _unit setVariable [QGVAR(breathingProtection), _breathing, true];
+ private _eyes = getNumber (_config >> QGVAR(Eyes_Protection));
+ _unit setVariable [QGVAR(eyesProtection), _eyes, true];
+}, true] call CBA_fnc_addPlayerEventHandler;
diff --git a/addons/smoke/XEH_preInit.sqf b/addons/smoke/XEH_preInit.sqf
new file mode 100644
index 00000000000..61eb91c6dc1
--- /dev/null
+++ b/addons/smoke/XEH_preInit.sqf
@@ -0,0 +1,13 @@
+#include "script_component.hpp"
+
+ADDON = false;
+
+#include "XEH_PREP.hpp"
+
+#include "initSettings.inc.sqf"
+
+GVAR(pfh) = -1;
+GVAR(openVehicleCache) = createHashMap;
+GVAR(openSeatCache) = createHashMap;
+
+ADDON = true;
diff --git a/addons/smoke/XEH_preStart.sqf b/addons/smoke/XEH_preStart.sqf
new file mode 100644
index 00000000000..a51262a37b9
--- /dev/null
+++ b/addons/smoke/XEH_preStart.sqf
@@ -0,0 +1,2 @@
+#include "script_component.hpp"
+#include "XEH_PREP.hpp"
diff --git a/addons/smoke/config.cpp b/addons/smoke/config.cpp
new file mode 100644
index 00000000000..bfe59b1f77e
--- /dev/null
+++ b/addons/smoke/config.cpp
@@ -0,0 +1,18 @@
+#include "script_component.hpp"
+
+class CfgPatches {
+ class ADDON {
+ name = QUOTE(COMPONENT);
+ units[] = {};
+ weapons[] = {};
+ requiredVersion = REQUIRED_VERSION;
+ requiredAddons[] = {"ace_main"};
+ VERSION_CONFIG;
+ };
+};
+
+#include "ACE_Arsenal_Stats.hpp"
+#include "CfgEventHandlers.hpp"
+#include "CfgGlasses.hpp"
+#include "CfgVehicles.hpp"
+#include "CfgWeapons.hpp"
diff --git a/addons/smoke/functions/fnc_isInSmoke.sqf b/addons/smoke/functions/fnc_isInSmoke.sqf
new file mode 100644
index 00000000000..d9d9fc09860
--- /dev/null
+++ b/addons/smoke/functions/fnc_isInSmoke.sqf
@@ -0,0 +1,47 @@
+#include "..\script_component.hpp"
+/*
+ * Author: BrettMayson
+ * Check if a unit is in smoke (or any thick particle effect that has `blockAIVisibility`)
+ *
+ * Arguments:
+ * 0: Unit