Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
4cb8671
smoke: new component
BrettMayson Jan 7, 2026
307aa65
headers
BrettMayson Jan 7, 2026
c4ea58b
Apply suggestions from code review
BrettMayson Jan 7, 2026
e9e58b4
Apply suggestion from @PabstMirror
BrettMayson Jan 7, 2026
7dcb19e
compat: aegis
BrettMayson Jan 7, 2026
8a958b5
compat: cup
BrettMayson Jan 7, 2026
838ab18
fix default breathing protection
BrettMayson Jan 9, 2026
1fbd5cd
fix var assignment
BrettMayson Jan 9, 2026
28bdebc
use 500
BrettMayson Jan 10, 2026
db09e41
compat: ws
BrettMayson Jan 10, 2026
c7a5c5f
don't check inside vehicles
BrettMayson Jan 11, 2026
1fd6f2c
Apply suggestions from code review
BrettMayson Jan 25, 2026
2a60198
don't seVariable every run
BrettMayson Jan 25, 2026
3ad6102
reduce pfh frequency, fix detection in tight spaces
BrettMayson Jan 25, 2026
7ff70cc
5 times per second
BrettMayson Jan 25, 2026
729c5a4
don't apply in tanks
BrettMayson Jan 25, 2026
a3b0064
Merge remote-tracking branch 'upstream/master' into smoke
BrettMayson Feb 2, 2026
9d26334
better vehicle handling
BrettMayson Feb 2, 2026
f6cb458
full protection allows recovery
BrettMayson Feb 2, 2026
dc53019
reuse code, various tweaks
BrettMayson Feb 2, 2026
33001b1
improve vehicle logic
BrettMayson Feb 2, 2026
7399a22
change helicopter config
BrettMayson Feb 3, 2026
276a584
add back sky check
BrettMayson Feb 3, 2026
98feb6b
Update addons/smoke/functions/fnc_isOpenSeat.sqf
BrettMayson Feb 3, 2026
4c3feef
remove false positive when going prone in some environments
BrettMayson Feb 16, 2026
58a346a
Apply suggestions from code review
BrettMayson Feb 20, 2026
3c0a940
Apply suggestions from code review
BrettMayson Feb 20, 2026
2759bea
Apply suggestion from @PabstMirror
PabstMirror Feb 20, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 24 additions & 5 deletions .hemtt/launch.toml
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,18 @@ workshop = [
"450814997", # CBA_A3
]

[adt]
extends = "default"
workshop = [
"3499977893", # ADT
]

[zen]
extends = "default"
workshop = [
"1779063631", # ZEN
]

[rhs]
extends = "default"
workshop = [
Expand All @@ -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
]
41 changes: 41 additions & 0 deletions addons/compat_aegis/compat_aegis_smoke/CfgGlasses.hpp
Original file line number Diff line number Diff line change
@@ -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;
};
};
24 changes: 24 additions & 0 deletions addons/compat_aegis/compat_aegis_smoke/config.cpp
Original file line number Diff line number Diff line change
@@ -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"
3 changes: 3 additions & 0 deletions addons/compat_aegis/compat_aegis_smoke/script_component.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
#define SUBCOMPONENT smoke
#define SUBCOMPONENT_BEAUTIFIED Smoke
#include "..\script_component.hpp"
80 changes: 80 additions & 0 deletions addons/compat_cup_units/compat_cup_smoke/CfgGlasses.hpp
Original file line number Diff line number Diff line change
@@ -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);
};
23 changes: 23 additions & 0 deletions addons/compat_cup_units/compat_cup_smoke/config.cpp
Original file line number Diff line number Diff line change
@@ -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"
3 changes: 3 additions & 0 deletions addons/compat_cup_units/compat_cup_smoke/script_component.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
#define SUBCOMPONENT smoke
#define SUBCOMPONENT_BEAUTIFIED Smoke
#include "..\script_component.hpp"
11 changes: 11 additions & 0 deletions addons/compat_ws/compat_ws_smoke/CfgWeapons.hpp
Original file line number Diff line number Diff line change
@@ -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;
};
};
24 changes: 24 additions & 0 deletions addons/compat_ws/compat_ws_smoke/config.cpp
Original file line number Diff line number Diff line change
@@ -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"
3 changes: 3 additions & 0 deletions addons/compat_ws/compat_ws_smoke/script_component.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
#define SUBCOMPONENT smoke
#define SUBCOMPONENT_BEAUTIFIED Smoke
#include "..\script_component.hpp"
34 changes: 17 additions & 17 deletions addons/hearing/stringtable.xml
Original file line number Diff line number Diff line change
Expand Up @@ -491,36 +491,36 @@
<Ukrainian>ЕЛЕКТРОННИЙ</Ukrainian>
</Key>
<Key ID="STR_ACE_Hearing_statHearingLowerVolume">
<English>Volume muffling</English>
<Czech>Snížení hlasitosti</Czech>
<French>Atténuation du volume</French>
<Spanish>Atenuación de volumen</Spanish>
<Italian>Attenuazione del volume</Italian>
<Polish>Tłumienie głośności</Polish>
<Portuguese>Abafamento de Volume</Portuguese>
<Russian>Глушение звука</Russian>
<English>Volume Muffling</English>
<Czech>Snížení Hlasitosti</Czech>
<French>Atténuation Du Volume</French>
<Spanish>Atenuación De Volumen</Spanish>
<Italian>Attenuazione Del Volume</Italian>
<Polish>Tłumienie Głośności</Polish>
<Portuguese>Abafamento De Volume</Portuguese>
<Russian>Глушение Звука</Russian>
<German>Lautstärkedämpfung</German>
<Korean>소리 차음도</Korean>
<Japanese>音量の抑制</Japanese>
<Chinese>進低音量</Chinese>
<Chinesesimp>降低音量</Chinesesimp>
<Ukrainian>Глушіння звуку</Ukrainian>
<Ukrainian>Глушіння Звуку</Ukrainian>
</Key>
<Key ID="STR_ACE_Hearing_statHearingProtection">
<English>Hearing protection</English>
<Czech>Ochrana sluchu</Czech>
<French>Protection auditive</French>
<Spanish>Protección auditiva</Spanish>
<Italian>Protezione uditiva</Italian>
<Polish>Ochrona słuchu</Polish>
<English>Hearing Protection</English>
<Czech>Ochrana Sluchu</Czech>
<French>Protection Auditive</French>
<Spanish>Protección Auditiva</Spanish>
<Italian>Protezione Uditiva</Italian>
<Polish>Ochrona Słuchu</Polish>
<Portuguese>Proteção Auditiva</Portuguese>
<Russian>Защита слуха</Russian>
<Russian>Защита Слуха</Russian>
<German>Gehörschutz</German>
<Korean>청력 보호</Korean>
<Japanese>聴覚保護</Japanese>
<Chinese>聽力保護</Chinese>
<Chinesesimp>听力保护</Chinesesimp>
<Ukrainian>Захист слуху</Ukrainian>
<Ukrainian>Захист Слуху</Ukrainian>
</Key>
<Key ID="STR_ACE_Hearing_unconsciousnessVolume_Description">
<English>Volume when unconscious.</English>
Expand Down
6 changes: 5 additions & 1 deletion addons/medical_vitals/functions/fnc_addSpO2DutyFactor.sqf
Original file line number Diff line number Diff line change
Expand Up @@ -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];
1 change: 1 addition & 0 deletions addons/smoke/$PBOPREFIX$
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
z\ace\addons\smoke
20 changes: 20 additions & 0 deletions addons/smoke/ACE_Arsenal_Stats.hpp
Original file line number Diff line number Diff line change
@@ -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}, {}};
};
};
15 changes: 15 additions & 0 deletions addons/smoke/CfgEventHandlers.hpp
Original file line number Diff line number Diff line change
@@ -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));
};
};
Loading