diff --git a/addons/nightvision/CfgWeapons.hpp b/addons/nightvision/CfgWeapons.hpp
index 3c9a98ad530..a19e1e1a462 100644
--- a/addons/nightvision/CfgWeapons.hpp
+++ b/addons/nightvision/CfgWeapons.hpp
@@ -33,6 +33,18 @@ class CfgWeapons {
modelOptics = "";
displayName = CSTRING(NVG_Gen3_black);
};
+ class Integrated_NVG_F: NVGoggles {
+ GVAR(border) = "";
+ GVAR(generation) = -1;
+ };
+ class Integrated_NVG_TI_0_F: NVGoggles {
+ GVAR(border) = "";
+ GVAR(generation) = -1;
+ };
+ class Integrated_NVG_TI_1_F: NVGoggles {
+ GVAR(border) = "";
+ GVAR(generation) = -1;
+ };
class ACE_NVGoggles_OPFOR_WP: NVGoggles_OPFOR {
displayName = CSTRING(NVG_Gen3_black_WP);
descriptionShort = CSTRING(NVG_WP_desc);
@@ -142,6 +154,44 @@ class CfgWeapons {
};
+ class ACE_Integrated_NVG_WP : Integrated_NVG_F {
+ NVG_WHITE_PRESET;
+ };
+ class ACE_Integrated_NVG_TI_0_WP : Integrated_NVG_TI_0_F {
+ NVG_WHITE_PRESET;
+ };
+ class ACE_Integrated_NVG_TI_1_WP : Integrated_NVG_TI_1_F {
+ NVG_WHITE_PRESET;
+ };
+
+ class H_PilotHelmetFighter_B;
+ class H_PilotHelmetFighter_I;
+ class H_PilotHelmetFighter_O;
+ class ACE_H_PilotHelmetFighter_B_WP : H_PilotHelmetFighter_B {
+ displayName = CSTRING(H_PilotHelmetFighter_B_WP);
+ subItems[] = {"ACE_Integrated_NVG_WP"};
+ };
+ class ACE_H_PilotHelmetFighter_I_WP : H_PilotHelmetFighter_I {
+ displayName = CSTRING(H_PilotHelmetFighter_I_WP);
+ subItems[] = {"ACE_Integrated_NVG_WP"};
+ };
+ class ACE_H_PilotHelmetFighter_O_WP : H_PilotHelmetFighter_O {
+ displayName = CSTRING(H_PilotHelmetFighter_O_WP);
+ subItems[] = {"ACE_Integrated_NVG_WP"};
+ };
+
+ class H_HelmetO_ViperSP_hex_F;
+ class H_HelmetO_ViperSP_ghex_F;
+ class ACE_H_HelmetO_ViperSP_hex_WP : H_HelmetO_ViperSP_hex_F {
+ displayName = CSTRING(H_HelmetO_ViperSP_hex_WP);
+ subItems[] = {"ACE_Integrated_NVG_TI_1_WP"};
+ };
+ class ACE_H_HelmetO_ViperSP_ghex_WP : H_HelmetO_ViperSP_ghex_F {
+ displayName = CSTRING(H_HelmetO_ViperSP_ghex_WP);
+ subItems[] = {"ACE_Integrated_NVG_TI_1_WP"};
+ };
+
+
// Examples of different goggle effect types (scope=1)
// These all function differently, but we have no models to go with them
class ACE_NVG_Biocular: NVGoggles {
diff --git a/addons/nightvision/XEH_postInit.sqf b/addons/nightvision/XEH_postInit.sqf
index 442e3ca0795..ce54ae3487b 100644
--- a/addons/nightvision/XEH_postInit.sqf
+++ b/addons/nightvision/XEH_postInit.sqf
@@ -38,6 +38,18 @@ GVAR(isUsingMagnification) = false;
["unit", {
// Call manually to update existing value
GVAR(playerHMD) = hmd ace_player;
+ if ((hmd ace_player) isEqualTo "") then {
+ if (headgear ace_player isNotEqualTo "") then {
+ private _subItems = getArray (configFile >> "CfgWeapons" >> (headgear ace_player) >> "subItems");
+ if (_subItems isEqualTo []) exitWith {};
+ private _nvg = _subItems findIf { "nvg" in (toLower _x) };
+ if (_nvg isEqualTo -1) exitWith {};
+ [{
+ GVAR(playerHMD) = (_this select 0);
+ [] call FUNC(refreshGoggleType);
+ },[(_subItems select _nvg)]] call CBA_fnc_execNextFrame;
+ };
+ };
// Fix overlay not being present when switching units
if (GVAR(running)) then {
diff --git a/addons/nightvision/config.cpp b/addons/nightvision/config.cpp
index 9f83f090eaa..5c53133a85c 100644
--- a/addons/nightvision/config.cpp
+++ b/addons/nightvision/config.cpp
@@ -26,7 +26,12 @@ class CfgPatches {
"ACE_NVGoggles_INDEP_WP",
"ACE_NVG_Wide_Black_WP",
"ACE_NVG_Wide_WP",
- "ACE_NVG_Wide_Green_WP"
+ "ACE_NVG_Wide_Green_WP",
+ "ACE_H_PilotHelmetFighter_B_WP",
+ "ACE_H_PilotHelmetFighter_I_WP",
+ "ACE_H_PilotHelmetFighter_O_WP",
+ "ACE_H_HelmetO_ViperSP_hex_WP",
+ "ACE_H_HelmetO_ViperSP_ghex_WP"
};
requiredVersion = REQUIRED_VERSION;
requiredAddons[] = {"ace_common"};
diff --git a/addons/nightvision/functions/fnc_onSlotItemChanged.sqf b/addons/nightvision/functions/fnc_onSlotItemChanged.sqf
index 3a11c1ea3fd..bd82f80405e 100644
--- a/addons/nightvision/functions/fnc_onSlotItemChanged.sqf
+++ b/addons/nightvision/functions/fnc_onSlotItemChanged.sqf
@@ -21,7 +21,22 @@
params ["_unit", "_item", "_slot", "_assign"];
TRACE_4("onSlotItemChanged",_unit,_item,_slot,_assign);
-if (_slot != TYPE_HMD) exitWith {};
+if (_slot != TYPE_HMD) exitWith {
+ if (_slot != TYPE_HEADGEAR && {(hmd _unit) isEqualTo ""}) exitWith {};
+ if (!_assign) exitWith {
+ if ((hmd _unit) isEqualTo "") exitWith {
+ GVAR(playerHMD) = "";
+ };
+ };
+ private _subItems = getArray (configFile >> "CfgWeapons" >> _item >> "subItems");
+ if (_subItems isEqualTo []) exitWith {};
+ private _nvg = _subItems findIf { "nvg" in (toLower _x) };
+ if (_nvg isEqualTo -1) exitWith {};
+ [{
+ GVAR(playerHMD) = (_this select 0);
+ [] call FUNC(refreshGoggleType);
+ },[(_subItems select _nvg)]] call CBA_fnc_execNextFrame;
+};
if (!_assign) exitWith {
GVAR(playerHMD) = "";
diff --git a/addons/nightvision/functions/fnc_pfeh.sqf b/addons/nightvision/functions/fnc_pfeh.sqf
index f6bc8ebc360..03536694332 100644
--- a/addons/nightvision/functions/fnc_pfeh.sqf
+++ b/addons/nightvision/functions/fnc_pfeh.sqf
@@ -66,14 +66,16 @@ if (IS_MAGNIFIED isNotEqualTo GVAR(isUsingMagnification)) then {
};
if (CBA_missionTime < GVAR(nextEffectsUpdate)) then {
- // Update radial blur as it depends on zoom level, so should be changed each frame like the border/hex
- if (GVAR(ppeffectRadialBlur) != -1) then {
- GVAR(ppeffectRadialBlur) ppEffectAdjust [.005, .005, _scale * GVAR(nvgBlurRadius), _scale * .16];
- GVAR(ppeffectRadialBlur) ppEffectCommit 0;
- };
- // Need to rapidly update fog or it will try to resync from the server
- if (GVAR(fogScaling) > 0) then {
- 0 setFog GVAR(nvgFog);
+ if (GVAR(nvgGeneration) > -1) then {
+ // Update radial blur as it depends on zoom level, so should be changed each frame like the border/hex
+ if (GVAR(ppeffectRadialBlur) != -1) then {
+ GVAR(ppeffectRadialBlur) ppEffectAdjust [.005, .005, _scale * GVAR(nvgBlurRadius), _scale * .16];
+ GVAR(ppeffectRadialBlur) ppEffectCommit 0;
+ };
+ // Need to rapidly update fog or it will try to resync from the server
+ if (GVAR(fogScaling) > 0) then {
+ 0 setFog GVAR(nvgFog);
+ };
};
} else {
// Redo full effects less often
@@ -120,24 +122,54 @@ if (CBA_missionTime < GVAR(nextEffectsUpdate)) then {
// Setup all effects
// This is hacky but... works. This prevents the effects from being cancelled by various things - alt-tabbing, resizing, going into AT sights, etc. A nicer method would be welcome but I don't have time to spend on it. TODO.
- // FilmGrain - Electronic Noise
- // Params: [intensity(0..1), sharpness(0..20), grainsize(1..8), intensityX0, intensityX1, monochromatic(bool)]
- GVAR(ppeffectGrain) = ppEffectCreate ["FilmGrain", 200];
- GVAR(ppeffectGrain) ppEffectAdjust [_grainIntensityFinal, _noiseSharpnessFinal, _grainFinal, 0.3, 0.3];
- // OldNVG: [0.25, 2.5, 2.5, _grainSetting, _grainSetting, false]
- GVAR(ppeffectGrain) ppEffectCommit 0;
- GVAR(ppeffectGrain) ppEffectForceInNVG true;
- GVAR(ppeffectGrain) ppEffectEnable true;
-
- // RadialBlur - Blurs closer to the edge nvg border (radius based on GVAR(bluRadius) config; e.g. larger for quadtube)
- // Note: "Will not do anything if RADIAL BLUR is disabled in Video Options." - So should try to keep this effect to a minimum to prevent balance issues
- // Params: [powerX, powerY, offsetX, offsetY]
- if (GVAR(nvgBlurRadius) != -1) then {
- GVAR(ppeffectRadialBlur) = ppEffectCreate ["RadialBlur", 451];
- GVAR(ppeffectRadialBlur) ppEffectAdjust [_radialBlurPower, _radialBlurPower, _scale * GVAR(nvgBlurRadius), _scale * .16];
- GVAR(ppeffectRadialBlur) ppEffectCommit 0;
- GVAR(ppeffectRadialBlur) ppEffectForceInNVG true;
- GVAR(ppeffectRadialBlur) ppEffectEnable true;
+
+ if (GVAR(nvgGeneration) > -1) then {
+ // FilmGrain - Electronic Noise
+ // Params: [intensity(0..1), sharpness(0..20), grainsize(1..8), intensityX0, intensityX1, monochromatic(bool)]
+ GVAR(ppeffectGrain) = ppEffectCreate ["FilmGrain", 200];
+ GVAR(ppeffectGrain) ppEffectAdjust [_grainIntensityFinal, _noiseSharpnessFinal, _grainFinal, 0.3, 0.3];
+ // OldNVG: [0.25, 2.5, 2.5, _grainSetting, _grainSetting, false]
+ GVAR(ppeffectGrain) ppEffectCommit 0;
+ GVAR(ppeffectGrain) ppEffectForceInNVG true;
+ GVAR(ppeffectGrain) ppEffectEnable true;
+
+ // RadialBlur - Blurs closer to the edge nvg border (radius based on GVAR(bluRadius) config; e.g. larger for quadtube)
+ // Note: "Will not do anything if RADIAL BLUR is disabled in Video Options." - So should try to keep this effect to a minimum to prevent balance issues
+ // Params: [powerX, powerY, offsetX, offsetY]
+ if (GVAR(nvgBlurRadius) != -1) then {
+ GVAR(ppeffectRadialBlur) = ppEffectCreate ["RadialBlur", 451];
+ GVAR(ppeffectRadialBlur) ppEffectAdjust [_radialBlurPower, _radialBlurPower, _scale * GVAR(nvgBlurRadius), _scale * .16];
+ GVAR(ppeffectRadialBlur) ppEffectCommit 0;
+ GVAR(ppeffectRadialBlur) ppEffectForceInNVG true;
+ GVAR(ppeffectRadialBlur) ppEffectEnable true;
+ };
+
+ // DynamicBlur - Increases overall screen blur when aiming down sights (which would be hard/impossible with NVG)
+ // Params: [value(0..inf)]
+ GVAR(ppeffectBlur) = ppEffectCreate ["DynamicBlur", 190];
+ GVAR(ppeffectBlur) ppEffectAdjust [_blurFinal];
+ GVAR(ppeffectBlur) ppEffectCommit 0;
+ GVAR(ppeffectBlur) ppEffectForceInNVG true;
+ GVAR(ppeffectBlur) ppEffectEnable true;
+
+
+ // Modify local fog:
+ if (GVAR(fogScaling) > 0) then {
+ private _vehicle = vehicle _unit;
+
+ if (_vehicle != _unit && {_vehicle isKindOf "Air"}) then { // For flying in particular, can refine nicer later.
+ _fogApply = _fogApply * ST_NVG_AIR_FOG_MULTIPLIER;
+ };
+
+ _fogApply = linearConversion [0, 1, GVAR(priorFog) select 0, (GVAR(fogScaling) * _fogApply), 1]; // mix in old fog if present
+ GVAR(nvgFog) = fogParams;
+ GVAR(nvgFog) set [0, _fogApply];
+
+ 0 setFog GVAR(nvgFog)
+ };
+ } else {
+ _brightFinal = ST_NVG_BRIGHT_MAX + (_playerBrightSetting / 20);
+ _contrastFinal = 1;
};
// ColorCorrections - Changes brightness, contrast and "green" color of nvg
@@ -148,30 +180,6 @@ if (CBA_missionTime < GVAR(nextEffectsUpdate)) then {
GVAR(ppeffectColorCorrect) ppEffectForceInNVG true;
GVAR(ppeffectColorCorrect) ppEffectEnable true;
- // DynamicBlur - Increases overall screen blur when aiming down sights (which would be hard/impossible with NVG)
- // Params: [value(0..inf)]
- GVAR(ppeffectBlur) = ppEffectCreate ["DynamicBlur", 190];
- GVAR(ppeffectBlur) ppEffectAdjust [_blurFinal];
- GVAR(ppeffectBlur) ppEffectCommit 0;
- GVAR(ppeffectBlur) ppEffectForceInNVG true;
- GVAR(ppeffectBlur) ppEffectEnable true;
-
-
- // Modify local fog:
- if (GVAR(fogScaling) > 0) then {
- private _vehicle = vehicle _unit;
-
- if (_vehicle != _unit && {_vehicle isKindOf "Air"}) then { // For flying in particular, can refine nicer later.
- _fogApply = _fogApply * ST_NVG_AIR_FOG_MULTIPLIER;
- };
-
- _fogApply = linearConversion [0, 1, GVAR(priorFog) select 0, (GVAR(fogScaling) * _fogApply), 1]; // mix in old fog if present
- GVAR(nvgFog) = fogParams;
- GVAR(nvgFog) set [0, _fogApply];
-
- 0 setFog GVAR(nvgFog)
- };
-
#ifdef DEBUG_MODE_FULL
private _aceAmbient = [] call EFUNC(common,ambientBrightness);
hintSilent format [
diff --git a/addons/nightvision/stringtable.xml b/addons/nightvision/stringtable.xml
index 38f8c0ed02d..3914e7b99f7 100644
--- a/addons/nightvision/stringtable.xml
+++ b/addons/nightvision/stringtable.xml
@@ -519,6 +519,21 @@
夜视仪(宽,绿色, 白磷)
ПНБ (Широкий, Зелений, БФ)
+
+ Pilot Helmet [NATO, WP]
+
+
+ Pilot Helmet [AAF, WP]
+
+
+ Pilot Helmet [CSAT, WP]
+
+
+ Special Purpose Helmet (Hex, WP)
+
+
+ Special Purpose Helmet (Green Hex, WP)
+
Night Vision Generation
Génération de jumelles de vision nocturne