mirror of
https://github.com/acemod/ACE3.git
synced 2024-08-30 18:23:18 +00:00
ST Nightvision Effects (#4694)
* Merge ST Nightvision * Cleanup * Header cleanup * Add ace setting for fog * Cleanup debug * Manual merge refuel changes * Add new setting for effect scaling * Cleanup * Use ace_common_fnc_getZoom * Fix compat inheritance changes * Fix stringtable * Add category * Tidy function headers * Replace global event with remote event
This commit is contained in:
parent
b1f5caacbb
commit
4b42eb4385
@ -5,6 +5,7 @@
|
|||||||
* - Curator
|
* - Curator
|
||||||
* - ACE Spectator
|
* - ACE Spectator
|
||||||
* - Arsenal camera (BIS_fnc_arsenal)
|
* - Arsenal camera (BIS_fnc_arsenal)
|
||||||
|
* - Nexus Spectator (BIS_fnc_EGSpectator)
|
||||||
* - Establishing shot (BIS_fnc_establishingShot)
|
* - Establishing shot (BIS_fnc_establishingShot)
|
||||||
* - Splendid camera (BIS_fnc_camera)
|
* - Splendid camera (BIS_fnc_camera)
|
||||||
* - Animation viewer (BIS_fnc_animViewer)
|
* - Animation viewer (BIS_fnc_animViewer)
|
||||||
@ -26,6 +27,7 @@
|
|||||||
!(
|
!(
|
||||||
isNull curatorCamera && // Curator
|
isNull curatorCamera && // Curator
|
||||||
{!(GETMVAR(EGVAR(spectator,isSet),false))} && // ACE Spectator
|
{!(GETMVAR(EGVAR(spectator,isSet),false))} && // ACE Spectator
|
||||||
|
{isNull (GETMVAR(BIS_EGSpectatorCamera_camera, objNull))} && // BIS Nexus Spectator
|
||||||
{isNull (GETUVAR(BIS_fnc_arsenal_cam, objNull))} && // Arsenal camera
|
{isNull (GETUVAR(BIS_fnc_arsenal_cam, objNull))} && // Arsenal camera
|
||||||
{isNull (GETMVAR(BIS_fnc_establishingShot_fakeUAV, objNull))} && // Establishing shot camera
|
{isNull (GETMVAR(BIS_fnc_establishingShot_fakeUAV, objNull))} && // Establishing shot camera
|
||||||
{isNull (GETMVAR(BIS_fnc_camera_cam, objNull))} && // Splendid camera
|
{isNull (GETMVAR(BIS_fnc_camera_cam, objNull))} && // Splendid camera
|
||||||
|
@ -1,8 +1,23 @@
|
|||||||
class ACE_Settings {
|
class ACE_Settings {
|
||||||
class GVAR(disableNVGsWithSights) {
|
class GVAR(disableNVGsWithSights) {
|
||||||
|
category = CSTRING(Category);
|
||||||
displayName = CSTRING(DisableNVGsWithSights_DisplayName);
|
displayName = CSTRING(DisableNVGsWithSights_DisplayName);
|
||||||
description = CSTRING(DisableNVGsWithSights_description);
|
description = CSTRING(DisableNVGsWithSights_description);
|
||||||
typeName = "BOOL";
|
typeName = "BOOL";
|
||||||
value = 0;
|
value = 0;
|
||||||
};
|
};
|
||||||
|
class GVAR(fogScaling) {
|
||||||
|
category = CSTRING(Category);
|
||||||
|
displayName = CSTRING(fogScaling_DisplayName);
|
||||||
|
description = CSTRING(fogScaling_Description);
|
||||||
|
typeName = "SCALAR";
|
||||||
|
value = 1;
|
||||||
|
};
|
||||||
|
class GVAR(effectScaling) {
|
||||||
|
category = CSTRING(Category);
|
||||||
|
displayName = CSTRING(effectScaling_DisplayName);
|
||||||
|
description = CSTRING(effectScaling_Description);
|
||||||
|
typeName = "SCALAR";
|
||||||
|
value = 1;
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
@ -1,30 +1,15 @@
|
|||||||
|
|
||||||
class Extended_PreStart_EventHandlers {
|
class Extended_PreStart_EventHandlers {
|
||||||
class ADDON {
|
class ADDON {
|
||||||
init = QUOTE(call COMPILE_FILE(XEH_preStart));
|
init = QUOTE(call COMPILE_FILE(XEH_preStart));
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
class Extended_PreInit_EventHandlers {
|
class Extended_PreInit_EventHandlers {
|
||||||
class ADDON {
|
class ADDON {
|
||||||
init = QUOTE(call COMPILE_FILE(XEH_preInit));
|
init = QUOTE(call COMPILE_FILE(XEH_preInit));
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
class Extended_PostInit_EventHandlers {
|
class Extended_PostInit_EventHandlers {
|
||||||
class ADDON {
|
class ADDON {
|
||||||
clientInit = QUOTE(call COMPILE_FILE(XEH_postInitClient));
|
init = QUOTE(call COMPILE_FILE(XEH_postInit));
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
class Extended_DisplayLoad_EventHandlers {
|
|
||||||
class RscDisplayCurator {
|
|
||||||
ADDON = QUOTE(_this call FUNC(updatePPEffects));
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
class Extended_DisplayUnload_EventHandlers {
|
|
||||||
class RscDisplayCurator {
|
|
||||||
ADDON = QUOTE(displayNull call FUNC(updatePPEffects)); // emulate zeus display being deleted
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
@ -1,9 +1,4 @@
|
|||||||
class CfgVehicles {
|
class CfgVehicles {
|
||||||
class All {
|
|
||||||
ACE_NightVision_grain = 0.75;
|
|
||||||
ACE_NightVision_blur = 0.055;
|
|
||||||
};
|
|
||||||
|
|
||||||
class Box_NATO_Support_F;
|
class Box_NATO_Support_F;
|
||||||
class ACE_Box_Misc: Box_NATO_Support_F {
|
class ACE_Box_Misc: Box_NATO_Support_F {
|
||||||
class TransportItems {
|
class TransportItems {
|
||||||
|
@ -2,55 +2,85 @@ class CfgWeapons {
|
|||||||
class Binocular;
|
class Binocular;
|
||||||
class NVGoggles: Binocular {
|
class NVGoggles: Binocular {
|
||||||
displayName = CSTRING(NVG_Gen3_brown);
|
displayName = CSTRING(NVG_Gen3_brown);
|
||||||
ACE_NightVision_grain = 0.75;
|
modelOptics = "";
|
||||||
ACE_NightVision_blur = 0.055;
|
GVAR(border) = QPATHTOF(data\nvg_mask_binos_4096.paa);
|
||||||
ACE_NightVision_radBlur = 0.001;
|
GVAR(bluRadius) = 0.15;
|
||||||
|
};
|
||||||
|
class O_NVGoggles_hex_F: NVGoggles { // APEX NVG with multiple lenses (spider eyes)
|
||||||
|
modelOptics = "";
|
||||||
|
GVAR(border) = QPATHTOF(data\nvg_mask_quad_4096.paa); // Use quad tube mask
|
||||||
|
GVAR(bluRadius) = 0.26;
|
||||||
|
};
|
||||||
|
class NVGogglesB_grn_F: NVGoggles { // APEX NVG/Thermal
|
||||||
|
modelOptics = "\A3\weapons_f\reticle\optics_night"; // use vanilla modelOptics so it will show in IR mode
|
||||||
};
|
};
|
||||||
class NVGoggles_OPFOR: NVGoggles {
|
class NVGoggles_OPFOR: NVGoggles {
|
||||||
|
modelOptics = "";
|
||||||
displayName = CSTRING(NVG_Gen3_black);
|
displayName = CSTRING(NVG_Gen3_black);
|
||||||
};
|
};
|
||||||
class NVGoggles_INDEP: NVGoggles {
|
class NVGoggles_INDEP: NVGoggles {
|
||||||
|
modelOptics = "";
|
||||||
displayName = CSTRING(NVG_Gen3_green);
|
displayName = CSTRING(NVG_Gen3_green);
|
||||||
};
|
};
|
||||||
|
|
||||||
class ACE_NVG_Gen1: NVGoggles_OPFOR {
|
class ACE_NVG_Gen1: NVGoggles_OPFOR {
|
||||||
author = ECSTRING(common,ACETeam);
|
author = ECSTRING(common,ACETeam);
|
||||||
modelOptics = "\A3\weapons_f\reticle\optics_night";
|
|
||||||
displayName = CSTRING(NVG_Gen1);
|
displayName = CSTRING(NVG_Gen1);
|
||||||
ACE_NightVision_grain = 2.25;
|
GVAR(generation) = 1;
|
||||||
ACE_NightVision_blur = 0.22;
|
|
||||||
ACE_NightVision_radBlur = 0.004;
|
|
||||||
};
|
};
|
||||||
class ACE_NVG_Gen2: NVGoggles_INDEP {
|
class ACE_NVG_Gen2: NVGoggles_INDEP {
|
||||||
author = ECSTRING(common,ACETeam);
|
author = ECSTRING(common,ACETeam);
|
||||||
modelOptics = "\A3\weapons_f\reticle\optics_night";
|
|
||||||
displayName = CSTRING(NVG_Gen2);
|
displayName = CSTRING(NVG_Gen2);
|
||||||
ACE_NightVision_grain = 1.5;
|
GVAR(generation) = 2;
|
||||||
ACE_NightVision_blur = 0.11;
|
|
||||||
ACE_NightVision_radBlur = 0.002;
|
|
||||||
};
|
};
|
||||||
/*class ACE_NVG_Gen3: NVGoggles {
|
|
||||||
author = ECSTRING(common,ACETeam);
|
|
||||||
modelOptics = "\A3\weapons_f\reticle\optics_night";
|
|
||||||
displayName = CSTRING(NVG_Gen3);
|
|
||||||
ACE_NightVision_grain = 0.75;
|
|
||||||
ACE_NightVision_blur = 0.055;
|
|
||||||
ACE_NightVision_radBlur = 0.001;
|
|
||||||
};*/
|
|
||||||
class ACE_NVG_Gen4: NVGoggles {
|
class ACE_NVG_Gen4: NVGoggles {
|
||||||
author = ECSTRING(common,ACETeam);
|
author = ECSTRING(common,ACETeam);
|
||||||
modelOptics = "\A3\weapons_f\reticle\optics_night";
|
|
||||||
displayName = CSTRING(NVG_Gen4);
|
displayName = CSTRING(NVG_Gen4);
|
||||||
ACE_NightVision_grain = 0.0;
|
GVAR(generation) = 4;
|
||||||
ACE_NightVision_blur = 0.0;
|
|
||||||
ACE_NightVision_radBlur = 0.0;
|
|
||||||
};
|
};
|
||||||
class ACE_NVG_Wide: NVGoggles {
|
class ACE_NVG_Wide: NVGoggles {
|
||||||
author = ECSTRING(common,ACETeam);
|
author = ECSTRING(common,ACETeam);
|
||||||
modelOptics = QPATHTOF(models\ACE_nvg_wide_optics);
|
modelOptics = QPATHTOF(models\ACE_nvg_wide_optics);
|
||||||
displayName = CSTRING(NVG_FullScreen);
|
displayName = CSTRING(NVG_FullScreen);
|
||||||
ACE_NightVision_grain = 0.75;
|
};
|
||||||
ACE_NightVision_blur = 0.055;
|
|
||||||
ACE_NightVision_radBlur = 0.001;
|
|
||||||
|
// 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 {
|
||||||
|
scope = 1;
|
||||||
|
modelOptics = "";
|
||||||
|
author = ECSTRING(common,ACETeam);
|
||||||
|
descriptionShort = "Biocular nightvision goggles";
|
||||||
|
displayName = "NV Goggles (Bio)";
|
||||||
|
GVAR(border) = QPATHTOF(data\nvg_mask_4096.paa);
|
||||||
|
GVAR(bluRadius) = 0.13;
|
||||||
|
GVAR(eyeCups) = 1;
|
||||||
|
};
|
||||||
|
class ACE_NVG_Monocular: NVGoggles {
|
||||||
|
scope = 1;
|
||||||
|
modelOptics = "";
|
||||||
|
author = ECSTRING(common,ACETeam);
|
||||||
|
descriptionShort = "Monocular nightvision goggles";
|
||||||
|
displayName = "NV Goggles (Mono)";
|
||||||
|
GVAR(border) = QPATHTOF(data\nvg_mask_4096.paa);
|
||||||
|
GVAR(bluRadius) = 0.13;
|
||||||
|
};
|
||||||
|
class ACE_NVG_Binocular: NVGoggles {
|
||||||
|
scope = 1;
|
||||||
|
modelOptics = "";
|
||||||
|
author = ECSTRING(common,ACETeam);
|
||||||
|
descriptionShort = "Binocular nightvision goggles";
|
||||||
|
displayName = "NV Goggles (Bino)";
|
||||||
|
GVAR(border) = QPATHTOF(data\nvg_mask_binos_4096.paa);
|
||||||
|
GVAR(bluRadius) = 0.15;
|
||||||
|
};
|
||||||
|
class ACE_NVG_Quadocular: NVGoggles {
|
||||||
|
scope = 1;
|
||||||
|
modelOptics = "";
|
||||||
|
author = ECSTRING(common,ACETeam);
|
||||||
|
descriptionShort = "Quadocular nightvision goggles";
|
||||||
|
displayName = "NV Goggles (Quad)";
|
||||||
|
GVAR(border) = QPATHTOF(data\nvg_mask_quad_4096.paa);
|
||||||
|
GVAR(bluRadius) = 0.26;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
41
addons/nightvision/RscTitles.hpp
Normal file
41
addons/nightvision/RscTitles.hpp
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
class RscPicture;
|
||||||
|
class RscText;
|
||||||
|
|
||||||
|
class RscTitles {
|
||||||
|
class GVAR(title) {
|
||||||
|
idd = 10777;
|
||||||
|
movingEnable = 1;
|
||||||
|
enableSimulation = 1;
|
||||||
|
enableDisplay = 1;
|
||||||
|
|
||||||
|
onLoad = QUOTE(with uiNamespace do {GVAR(titleDisplay) = _this select 0};);
|
||||||
|
onunLoad = "";
|
||||||
|
|
||||||
|
duration = 999999;
|
||||||
|
fadein = 0;
|
||||||
|
fadeout = 0;
|
||||||
|
|
||||||
|
class controls {
|
||||||
|
class Hexes: RscPicture {
|
||||||
|
idc = 1000;
|
||||||
|
};
|
||||||
|
class Mask: RscPicture {
|
||||||
|
idc = 1001;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Add blinders for side monitors for tripple monitors (mask won't cover them)
|
||||||
|
class trippleHeadLeft: RscPicture {
|
||||||
|
idc = 1002;
|
||||||
|
text = "#(argb,8,8,3)color(0,0,0,1)";
|
||||||
|
x = "safeZoneXAbs";
|
||||||
|
Y = "safezoneY";
|
||||||
|
W = "(safezoneX - safeZoneXAbs) * ((getResolution select 4)/(16/3))";
|
||||||
|
H = "safeZoneH";
|
||||||
|
};
|
||||||
|
class trippleHeadRight: trippleHeadLeft {
|
||||||
|
idc = 1003;
|
||||||
|
x = "safeZoneXAbs + safeZoneWAbs - (safezoneX - safeZoneXABS) * ((getResolution select 4)/(16/3))";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
@ -1,7 +1,12 @@
|
|||||||
|
|
||||||
PREP(blending);
|
|
||||||
PREP(changeNVGBrightness);
|
PREP(changeNVGBrightness);
|
||||||
PREP(initModule);
|
PREP(initModule);
|
||||||
|
PREP(nonDedicatedFix);
|
||||||
PREP(onCameraViewChanged);
|
PREP(onCameraViewChanged);
|
||||||
|
PREP(onFiredPlayer);
|
||||||
|
PREP(onLoadoutChanged);
|
||||||
PREP(onVisionModeChanged);
|
PREP(onVisionModeChanged);
|
||||||
PREP(updatePPEffects);
|
PREP(pfeh);
|
||||||
|
PREP(refreshGoggleType);
|
||||||
|
PREP(scaleCtrl);
|
||||||
|
PREP(setupDisplayEffects);
|
||||||
|
94
addons/nightvision/XEH_postInit.sqf
Normal file
94
addons/nightvision/XEH_postInit.sqf
Normal file
@ -0,0 +1,94 @@
|
|||||||
|
#include "script_component.hpp"
|
||||||
|
|
||||||
|
if (!hasInterface) exitWith {};
|
||||||
|
|
||||||
|
GVAR(PFID) = -1;
|
||||||
|
GVAR(running) = false;
|
||||||
|
GVAR(nextEffectsUpdate) = -1;
|
||||||
|
|
||||||
|
GVAR(playerHMD) = "#";
|
||||||
|
|
||||||
|
GVAR(priorFog) = nil;
|
||||||
|
GVAR(nvgFog) = [0,0,0];
|
||||||
|
|
||||||
|
GVAR(nvgBlurRadius) = -1;
|
||||||
|
GVAR(nvgGeneration) = -1;
|
||||||
|
GVAR(defaultPositionBorder) = [];
|
||||||
|
GVAR(defaultPositionHex) = [];
|
||||||
|
|
||||||
|
GVAR(ppeffectGrain) = -1;
|
||||||
|
GVAR(ppeffectRadialBlur) = -1;
|
||||||
|
GVAR(ppeffectColorCorrect) = -1;
|
||||||
|
GVAR(ppeffectBlur) = -1;
|
||||||
|
GVAR(ppEffectCCMuzzleFlash) = -1;
|
||||||
|
|
||||||
|
|
||||||
|
["ace_settingsInitialized", {
|
||||||
|
TRACE_3("settingsInitialized",GVAR(disableNVGsWithSights),GVAR(fogScaling),GVAR(effectScaling));
|
||||||
|
|
||||||
|
// Disable ALL effects if ace_nightvision_effectScaling is zero
|
||||||
|
if (GVAR(effectScaling) == 0) exitWith {};
|
||||||
|
|
||||||
|
["loadout", LINKFUNC(onLoadoutChanged), true] call CBA_fnc_addPlayerEventHandler;
|
||||||
|
["visionMode", LINKFUNC(onVisionModeChanged), false] call CBA_fnc_addPlayerEventHandler;
|
||||||
|
["cameraView", LINKFUNC(onCameraViewChanged), true] call CBA_fnc_addPlayerEventHandler;
|
||||||
|
["vehicle", LINKFUNC(refreshGoggleType), false] call CBA_fnc_addPlayerEventHandler;
|
||||||
|
["turret", LINKFUNC(refreshGoggleType), true] call CBA_fnc_addPlayerEventHandler;
|
||||||
|
|
||||||
|
["ace_firedPlayer", LINKFUNC(onFiredPlayer)] call CBA_fnc_addEventHandler;
|
||||||
|
["ace_firedPlayerVehicle", LINKFUNC(onFiredPlayer)] call CBA_fnc_addEventHandler;
|
||||||
|
|
||||||
|
|
||||||
|
addMissionEventHandler ["Loaded", { // Restart UI vars on mission load
|
||||||
|
if (GVAR(running)) then {
|
||||||
|
TRACE_1("restarting effects",CBA_missionTime);
|
||||||
|
[false] call FUNC(setupDisplayEffects);
|
||||||
|
[true] call FUNC(setupDisplayEffects);
|
||||||
|
};
|
||||||
|
}];
|
||||||
|
}] call CBA_fnc_addEventHandler;
|
||||||
|
|
||||||
|
|
||||||
|
// Handle an edge case for non-dedicated servers were the server running the fog effect would sync fog to other clients
|
||||||
|
[QGVAR(nonDedicatedFix), LINKFUNC(nonDedicatedFix)] call CBA_fnc_addEventHandler;
|
||||||
|
if (!isNil QGVAR(serverPriorFog)) then {[] call FUNC(nonDedicatedFix);}; // If var is defined, run it now (we must be a jip)
|
||||||
|
|
||||||
|
|
||||||
|
// Add keybinds
|
||||||
|
["ACE3 Equipment", QGVAR(IncreaseNVGBrightness), localize LSTRING(IncreaseNVGBrightness), {
|
||||||
|
// Conditions: canInteract
|
||||||
|
if !([ACE_player, objNull, ["isNotEscorting", "isNotInside", "isNotSitting", "isNotRefueling"]] call EFUNC(common,canInteractWith)) exitWith {false};
|
||||||
|
// Conditions: specific
|
||||||
|
if ((currentVisionMode ACE_player != 1)) exitWith {false};
|
||||||
|
|
||||||
|
// Statement
|
||||||
|
[ACE_player, 1] call FUNC(changeNVGBrightness);
|
||||||
|
true
|
||||||
|
}, {false}, [201, [false, false, true]], false] call CBA_fnc_addKeybind; //PageUp + ALT
|
||||||
|
|
||||||
|
["ACE3 Equipment", QGVAR(DecreaseNVGBrightness), localize LSTRING(DecreaseNVGBrightness), {
|
||||||
|
// Conditions: canInteract
|
||||||
|
if !([ACE_player, objNull, ["isNotEscorting", "isNotInside", "isNotSitting", "isNotRefueling"]] call EFUNC(common,canInteractWith)) exitWith {false};
|
||||||
|
// Conditions: specific
|
||||||
|
if ((currentVisionMode ACE_player != 1)) exitWith {false};
|
||||||
|
|
||||||
|
// Statement
|
||||||
|
[ACE_player, -1] call FUNC(changeNVGBrightness);
|
||||||
|
true
|
||||||
|
}, {false}, [209, [false, false, true]], false] call CBA_fnc_addKeybind; //PageDown + ALT
|
||||||
|
|
||||||
|
#ifdef DEBUG_MODE_FULL
|
||||||
|
WARNING("Debug mouse wheel action enabled, this should NOT be in a final release");
|
||||||
|
["MouseZChanged", {
|
||||||
|
GVAR(nextEffectsUpdate) = 0;
|
||||||
|
if (cba_events_shift) then {
|
||||||
|
GVAR(effectScaling) = ((GVAR(effectScaling) + ((_this select 1) / 20)) max 0) min 1;
|
||||||
|
systemChat format ["%1: %2", QGVAR(effectScaling), GVAR(effectScaling)];
|
||||||
|
};
|
||||||
|
if (cba_events_control) then {
|
||||||
|
GVAR(fogScaling) = ((GVAR(fogScaling) + ((_this select 1) / 20)) max 0) min 1;
|
||||||
|
systemChat format ["%1: %2", QGVAR(fogScaling), GVAR(fogScaling)];
|
||||||
|
};
|
||||||
|
}] call CBA_fnc_addDisplayHandler;
|
||||||
|
#endif
|
||||||
|
|
@ -1,65 +0,0 @@
|
|||||||
// by commy2
|
|
||||||
#include "script_component.hpp"
|
|
||||||
|
|
||||||
if (!hasInterface) exitWith {};
|
|
||||||
|
|
||||||
GVAR(ppEffectBlur) = ppEffectCreate ["dynamicBlur", 1234];
|
|
||||||
GVAR(ppEffectBlur) ppEffectForceInNVG true;
|
|
||||||
GVAR(ppEffectBlur) ppEffectAdjust [0];
|
|
||||||
GVAR(ppEffectBlur) ppEffectCommit 0;
|
|
||||||
|
|
||||||
GVAR(ppEffectRadialBlur) = ppEffectCreate ["radialBlur", 1238];
|
|
||||||
GVAR(ppEffectRadialBlur) ppEffectForceInNVG true;
|
|
||||||
GVAR(ppEffectRadialBlur) ppEffectAdjust [0, 0, 0, 0];
|
|
||||||
GVAR(ppEffectRadialBlur) ppEffectCommit 0;
|
|
||||||
|
|
||||||
GVAR(ppEffectFilmGrain) = ppEffectCreate ["FilmGrain", 1235];
|
|
||||||
GVAR(ppEffectFilmGrain) ppEffectAdjust [0.25, 2.5, 2.5, 2.5*0.3, 2.5*0.3, false];
|
|
||||||
GVAR(ppEffectFilmGrain) ppEffectCommit 0;
|
|
||||||
|
|
||||||
GVAR(ppEffectNVGBrightness) = ppEffectCreate ["ColorCorrections", 1236];
|
|
||||||
GVAR(ppEffectNVGBrightness) ppEffectForceInNVG true;
|
|
||||||
GVAR(ppEffectNVGBrightness) ppEffectAdjust [1, 1, 0, [0, 0, 0, 0], [0, 0, 0, 1], [0, 0, 0, 1]];
|
|
||||||
GVAR(ppEffectNVGBrightness) ppEffectCommit 0;
|
|
||||||
|
|
||||||
GVAR(ppEffectMuzzleFlash) = ppEffectCreate ["ColorCorrections", 1237];
|
|
||||||
GVAR(ppEffectMuzzleFlash) ppEffectEnable true;
|
|
||||||
GVAR(ppEffectMuzzleFlash) ppEffectForceInNVG true;
|
|
||||||
GVAR(ppEffectMuzzleFlash) ppEffectAdjust [1, 1, 0, [0, 0, 0, 0], [0, 0, 0, 1], [0, 0, 0, 1]];
|
|
||||||
GVAR(ppEffectMuzzleFlash) ppEffectCommit 0;
|
|
||||||
|
|
||||||
// Setup the event handlers
|
|
||||||
["loadout", FUNC(updatePPEffects)] call CBA_fnc_addPlayerEventHandler;
|
|
||||||
["visionMode", FUNC(updatePPEffects)] call CBA_fnc_addPlayerEventHandler;
|
|
||||||
["visionMode", FUNC(onVisionModeChanged)] call CBA_fnc_addPlayerEventHandler;
|
|
||||||
["cameraView", FUNC(updatePPEffects)] call CBA_fnc_addPlayerEventHandler;
|
|
||||||
["cameraView", FUNC(onCameraViewChanged)] call CBA_fnc_addPlayerEventHandler;
|
|
||||||
["vehicle", FUNC(updatePPEffects)] call CBA_fnc_addPlayerEventHandler;
|
|
||||||
["turret", FUNC(updatePPEffects)] call CBA_fnc_addPlayerEventHandler;
|
|
||||||
|
|
||||||
// Add keybinds
|
|
||||||
["ACE3 Equipment", QGVAR(IncreaseNVGBrightness), localize LSTRING(IncreaseNVGBrightness), {
|
|
||||||
// Conditions: canInteract
|
|
||||||
if !([ACE_player, objNull, ["isNotEscorting", "isNotInside", "isNotSitting", "isNotRefueling"]] call EFUNC(common,canInteractWith)) exitWith {false};
|
|
||||||
// Conditions: specific
|
|
||||||
if ((currentVisionMode ACE_player != 1)) exitWith {false};
|
|
||||||
|
|
||||||
// Statement
|
|
||||||
[ACE_player, 1] call FUNC(changeNVGBrightness);
|
|
||||||
true
|
|
||||||
}, {false}, [201, [false, false, true]], false] call CBA_fnc_addKeybind; //PageUp + ALT
|
|
||||||
|
|
||||||
["ACE3 Equipment", QGVAR(DecreaseNVGBrightness), localize LSTRING(DecreaseNVGBrightness), {
|
|
||||||
// Conditions: canInteract
|
|
||||||
if !([ACE_player, objNull, ["isNotEscorting", "isNotInside", "isNotSitting", "isNotRefueling"]] call EFUNC(common,canInteractWith)) exitWith {false};
|
|
||||||
// Conditions: specific
|
|
||||||
if ((currentVisionMode ACE_player != 1)) exitWith {false};
|
|
||||||
|
|
||||||
// Statement
|
|
||||||
[ACE_player, -1] call FUNC(changeNVGBrightness);
|
|
||||||
true
|
|
||||||
}, {false}, [209, [false, false, true]], false] call CBA_fnc_addKeybind; //PageDown + ALT
|
|
||||||
|
|
||||||
// Register fire event handler
|
|
||||||
["ace_firedPlayer", DFUNC(blending)] call CBA_fnc_addEventHandler;
|
|
||||||
["ace_firedPlayerVehicle", DFUNC(blending)] call CBA_fnc_addEventHandler;
|
|
@ -18,3 +18,4 @@ class CfgPatches {
|
|||||||
#include "CfgVehicles.hpp"
|
#include "CfgVehicles.hpp"
|
||||||
#include "CfgWeapons.hpp"
|
#include "CfgWeapons.hpp"
|
||||||
#include "ACE_Settings.hpp"
|
#include "ACE_Settings.hpp"
|
||||||
|
#include "RscTitles.hpp"
|
||||||
|
BIN
addons/nightvision/data/nvg_mask_2048.paa
Normal file
BIN
addons/nightvision/data/nvg_mask_2048.paa
Normal file
Binary file not shown.
BIN
addons/nightvision/data/nvg_mask_4096.paa
Normal file
BIN
addons/nightvision/data/nvg_mask_4096.paa
Normal file
Binary file not shown.
BIN
addons/nightvision/data/nvg_mask_binos_2048.paa
Normal file
BIN
addons/nightvision/data/nvg_mask_binos_2048.paa
Normal file
Binary file not shown.
BIN
addons/nightvision/data/nvg_mask_binos_4096.paa
Normal file
BIN
addons/nightvision/data/nvg_mask_binos_4096.paa
Normal file
Binary file not shown.
BIN
addons/nightvision/data/nvg_mask_hexes.paa
Normal file
BIN
addons/nightvision/data/nvg_mask_hexes.paa
Normal file
Binary file not shown.
BIN
addons/nightvision/data/nvg_mask_hexes_thin.paa
Normal file
BIN
addons/nightvision/data/nvg_mask_hexes_thin.paa
Normal file
Binary file not shown.
BIN
addons/nightvision/data/nvg_mask_quad_2048.paa
Normal file
BIN
addons/nightvision/data/nvg_mask_quad_2048.paa
Normal file
Binary file not shown.
BIN
addons/nightvision/data/nvg_mask_quad_4096.paa
Normal file
BIN
addons/nightvision/data/nvg_mask_quad_4096.paa
Normal file
Binary file not shown.
@ -1,70 +0,0 @@
|
|||||||
/*
|
|
||||||
* Author: commy2
|
|
||||||
* Change the blending when the player fires??. Called from the unified fired EH only for the local player and his vehicle.
|
|
||||||
*
|
|
||||||
* Arguments:
|
|
||||||
* None. Parameters inherited from EFUNC(common,firedEH)
|
|
||||||
*
|
|
||||||
* Return Value:
|
|
||||||
* Noneg
|
|
||||||
*
|
|
||||||
* Example:
|
|
||||||
* [clientFiredBIS-XEH] call ace_nightvision_fnc_blending
|
|
||||||
*
|
|
||||||
* Public: No
|
|
||||||
*/
|
|
||||||
#include "script_component.hpp"
|
|
||||||
|
|
||||||
//IGNORE_PRIVATE_WARNING ["_unit", "_weapon", "_muzzle", "_mode", "_ammo", "_magazine", "_projectile", "_vehicle", "_gunner", "_turret"];
|
|
||||||
TRACE_10("firedEH:",_unit, _weapon, _muzzle, _mode, _ammo, _magazine, _projectile, _vehicle, _gunner, _turret);
|
|
||||||
|
|
||||||
private _player = ACE_player;
|
|
||||||
|
|
||||||
//If we're not in NVG mode, or it's a grenade, exit
|
|
||||||
if (currentVisionMode _player != 1 || {toLower _weapon in ["throw", "put"]}) exitWith {};
|
|
||||||
|
|
||||||
private _silencer = _player weaponAccessories _weapon select 0;
|
|
||||||
|
|
||||||
private _visibleFireCoef = 1;
|
|
||||||
private _visibleFireTimeCoef = 1;
|
|
||||||
|
|
||||||
if (_silencer != "") then {
|
|
||||||
_visibleFireCoef = getNumber (configFile >> "CfgWeapons" >> _silencer >> "ItemInfo" >> "AmmoCoef" >> "visibleFire");
|
|
||||||
_visibleFireTimeCoef = getNumber (configFile >> "CfgWeapons" >> _silencer >> "ItemInfo" >> "AmmoCoef" >> "visibleFireTime");
|
|
||||||
};
|
|
||||||
|
|
||||||
private _visibleFire = getNumber (configFile >> "CfgAmmo" >> _ammo >> "visibleFire");
|
|
||||||
private _visibleFireTime = getNumber (configFile >> "CfgAmmo" >> _ammo >> "visibleFireTime");
|
|
||||||
|
|
||||||
private _fnc_isTracer = {
|
|
||||||
if (getNumber (configFile >> "CfgAmmo" >> _ammo >> "nvgOnly") > 0) exitWith {false};
|
|
||||||
|
|
||||||
private _indexShot = (_player ammo _weapon) + 1;
|
|
||||||
|
|
||||||
private _lastRoundsTracer = getNumber (configFile >> "CfgMagazines" >> _magazine >> "lastRoundsTracer");
|
|
||||||
if (_indexShot <= _lastRoundsTracer) exitWith {true};
|
|
||||||
|
|
||||||
private _tracersEvery = getNumber (configFile >> "CfgMagazines" >> _magazine >> "tracersEvery");
|
|
||||||
if (_tracersEvery == 0) exitWith {false};
|
|
||||||
|
|
||||||
(_indexShot - _lastRoundsTracer) % _tracersEvery == 0
|
|
||||||
};
|
|
||||||
|
|
||||||
if (call _fnc_isTracer) then {
|
|
||||||
_visibleFire = _visibleFire + 2;
|
|
||||||
_visibleFireTime = _visibleFireTime + 2;
|
|
||||||
};
|
|
||||||
|
|
||||||
private _darkness = 1 - (call EFUNC(common,ambientBrightness));
|
|
||||||
private _nvgBrightnessCoef = 1 + (_player getVariable [QGVAR(NVGBrightness), 0]) / 4;
|
|
||||||
|
|
||||||
_visibleFire = _darkness * _visibleFireCoef * _visibleFire * _nvgBrightnessCoef / 10 min 1;
|
|
||||||
_visibleFireTime = _darkness * _visibleFireTimeCoef * _visibleFireTime * _nvgBrightnessCoef / 10 min 0.5;
|
|
||||||
|
|
||||||
TRACE_2("Player Shot, Adjusting NVG Effect", _visibleFire, _visibleFireTime);
|
|
||||||
|
|
||||||
GVAR(ppEffectMuzzleFlash) ppEffectAdjust [1, 1, _visibleFire, [0, 0, 0, 0], [0, 0, 0, 1], [0, 0, 0, 1]];
|
|
||||||
GVAR(ppEffectMuzzleFlash) ppEffectCommit 0;
|
|
||||||
|
|
||||||
GVAR(ppEffectMuzzleFlash) ppEffectAdjust [1, 1, 0, [0, 0, 0, 0], [0, 0, 0, 1], [0, 0, 0, 1]];
|
|
||||||
GVAR(ppEffectMuzzleFlash) ppEffectCommit _visibleFireTime;
|
|
@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* Author: commy2
|
* Author: commy2
|
||||||
* Change the brightness of the unit's NVG
|
* Change the brightness of the unit's NVG.
|
||||||
*
|
*
|
||||||
* Arguments:
|
* Arguments:
|
||||||
* 0: The Unit <OBJECT>
|
* 0: The Unit <OBJECT>
|
||||||
@ -17,18 +17,16 @@
|
|||||||
#include "script_component.hpp"
|
#include "script_component.hpp"
|
||||||
|
|
||||||
params ["_player", "_changeInBrightness"];
|
params ["_player", "_changeInBrightness"];
|
||||||
TRACE_2("params",_player,_changeInBrightness);
|
TRACE_2("changeNVGBrightness",_player,_changeInBrightness);
|
||||||
|
|
||||||
if (!hasInterface) exitWith {};
|
|
||||||
|
|
||||||
private _brightness = _player getVariable [QGVAR(NVGBrightness), 0];
|
private _brightness = _player getVariable [QGVAR(NVGBrightness), 0];
|
||||||
|
|
||||||
_brightness = ((round (10 * _brightness + _changeInBrightness) / 10) min 0.5) max -0.5;
|
_brightness = ((_brightness + _changeInBrightness) min 0) max -6;
|
||||||
|
|
||||||
_player setVariable [QGVAR(NVGBrightness), _brightness, false];
|
_player setVariable [QGVAR(NVGBrightness), _brightness, false];
|
||||||
|
|
||||||
GVAR(ppEffectNVGBrightness) ppEffectAdjust [1, (_brightness + 1), 0, [0, 0, 0, 0], [0, 0, 0, 1], [0, 0, 0, 1]];
|
[format [(localize LSTRING(NVGBrightness)), _brightness]] call EFUNC(common,displayTextStructured);
|
||||||
GVAR(ppEffectNVGBrightness) ppEffectCommit 0;
|
|
||||||
|
|
||||||
[format [(localize LSTRING(NVGBrightness)), (_brightness * 10)]] call EFUNC(common,displayTextStructured);
|
|
||||||
playSound "ACE_Sound_Click";
|
playSound "ACE_Sound_Click";
|
||||||
|
|
||||||
|
// Trigger full ppEffects update next time run in the PFEH:
|
||||||
|
GVAR(nextEffectsUpdate) = -1;
|
||||||
|
@ -17,5 +17,6 @@
|
|||||||
#include "script_component.hpp"
|
#include "script_component.hpp"
|
||||||
|
|
||||||
params ["_module"];
|
params ["_module"];
|
||||||
|
TRACE_1("initModule",_module);
|
||||||
|
|
||||||
[_module, QGVAR(disableNVGsWithSights), "disableNVGsWithSights"] call EFUNC(common,readSettingFromModule);
|
[_module, QGVAR(disableNVGsWithSights), "disableNVGsWithSights"] call EFUNC(common,readSettingFromModule);
|
||||||
|
30
addons/nightvision/functions/fnc_nonDedicatedFix.sqf
Normal file
30
addons/nightvision/functions/fnc_nonDedicatedFix.sqf
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
/*
|
||||||
|
* Author: PabstMirror
|
||||||
|
* Handles the client who is the non-dedicated server turning on the fog effects.
|
||||||
|
*
|
||||||
|
* Arguments:
|
||||||
|
* 0: Module <OBJECT>
|
||||||
|
*
|
||||||
|
* Return Value:
|
||||||
|
* None
|
||||||
|
*
|
||||||
|
* Example:
|
||||||
|
* [] call ace_nightvision_fnc_nonDedicatedFix
|
||||||
|
*
|
||||||
|
* Public: No
|
||||||
|
*/
|
||||||
|
#include "script_component.hpp"
|
||||||
|
|
||||||
|
TRACE_1("Starting PFEH to handling non-dedicated server running effect",GVAR(serverPriorFog));
|
||||||
|
|
||||||
|
if (isServer) exitWith {};
|
||||||
|
|
||||||
|
[{
|
||||||
|
if (isNil QGVAR(serverPriorFog)) exitWith {
|
||||||
|
TRACE_1("Ending PFEH to handling non-dedicated server running effect",_this);
|
||||||
|
[_this select 1] call CBA_fnc_removePerFrameHandler;
|
||||||
|
};
|
||||||
|
if (!GVAR(running)) then { // If we aren't running the effect ourselves, then use the server's old fog value
|
||||||
|
0 setFog GVAR(serverPriorFog);
|
||||||
|
};
|
||||||
|
}, 0, []] call CBA_fnc_addPerFrameHandler;
|
@ -14,10 +14,13 @@
|
|||||||
*
|
*
|
||||||
* Public: No
|
* Public: No
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "script_component.hpp"
|
#include "script_component.hpp"
|
||||||
|
|
||||||
params ["_unit", "_cameraView"];
|
params ["_unit", "_cameraView"];
|
||||||
|
TRACE_2("onCameraViewChanged",_unit,_cameraView);
|
||||||
|
|
||||||
|
// Refresh goggle effect (e.g. switching to vehicle's NVG)
|
||||||
|
[] call FUNC(refreshGoggleType);
|
||||||
|
|
||||||
if (GVAR(disableNVGsWithSights) && {(hmd _unit) != ""}) then {
|
if (GVAR(disableNVGsWithSights) && {(hmd _unit) != ""}) then {
|
||||||
if ((vehicle _unit == _unit)
|
if ((vehicle _unit == _unit)
|
||||||
|
66
addons/nightvision/functions/fnc_onFiredPlayer.sqf
Normal file
66
addons/nightvision/functions/fnc_onFiredPlayer.sqf
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
/*
|
||||||
|
* Author: commy2, Dslyecxi, PabstMirror
|
||||||
|
* Change the blending when the player fires. Called from the unified fired EH only for the local player and his vehicle.
|
||||||
|
*
|
||||||
|
* Arguments:
|
||||||
|
* None. Parameters inherited from EFUNC(common,firedEH)
|
||||||
|
*
|
||||||
|
* Return Value:
|
||||||
|
* None
|
||||||
|
*
|
||||||
|
* Example:
|
||||||
|
* [clientFiredBIS-XEH] call ace_nightvision_fnc_onFiredPlayer
|
||||||
|
*
|
||||||
|
* Public: No
|
||||||
|
*/
|
||||||
|
#include "script_component.hpp"
|
||||||
|
|
||||||
|
//IGNORE_PRIVATE_WARNING ["_unit", "_weapon", "_muzzle", "_mode", "_ammo", "_magazine", "_projectile"];
|
||||||
|
TRACE_7("firedEH:",_unit, _weapon, _muzzle, _mode, _ammo, _magazine, _projectile);
|
||||||
|
|
||||||
|
if ((!GVAR(running)) || {_weapon == "throw"} || {_weapon == "put"}) exitWith {};
|
||||||
|
|
||||||
|
private _visibleFireCoef = 1;
|
||||||
|
if (_unit == ace_player) then {
|
||||||
|
private _silencer = (_unit weaponAccessories _weapon) select 0;
|
||||||
|
if (_silencer != "") then {
|
||||||
|
_visibleFireCoef = getNumber (configFile >> "CfgWeapons" >> _silencer >> "ItemInfo" >> "AmmoCoef" >> "visibleFire");
|
||||||
|
TRACE_1("muzzle attachement",_visibleFireCoef);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
private _visibleFire = getNumber (configFile >> "CfgAmmo" >> _ammo >> "visibleFire");
|
||||||
|
|
||||||
|
private _isTracer = call {
|
||||||
|
if (getNumber (configFile >> "CfgAmmo" >> _ammo >> "nvgOnly") > 0) exitWith {false};
|
||||||
|
private _indexShot = (_unit ammo _weapon) + 1;
|
||||||
|
private _lastRoundsTracer = getNumber (configFile >> "CfgMagazines" >> _magazine >> "lastRoundsTracer");
|
||||||
|
if (_indexShot <= _lastRoundsTracer) exitWith {true};
|
||||||
|
private _tracersEvery = getNumber (configFile >> "CfgMagazines" >> _magazine >> "tracersEvery");
|
||||||
|
if (_tracersEvery == 0) exitWith {false};
|
||||||
|
(_indexShot - _lastRoundsTracer) % _tracersEvery == 0
|
||||||
|
};
|
||||||
|
|
||||||
|
TRACE_3("",_ammo,_visibleFire,_isTracer);
|
||||||
|
if ( _isTracer) then {
|
||||||
|
_visibleFire = _visibleFire + 2;
|
||||||
|
};
|
||||||
|
|
||||||
|
_visibleFire = _visibleFireCoef * _visibleFire;
|
||||||
|
if (_ammo isKindOf "BulletBase") then {
|
||||||
|
_visibleFire = _visibleFire min 5; // Prevent every shot from triggering with HMG
|
||||||
|
};
|
||||||
|
TRACE_1("final", _visibleFire);
|
||||||
|
|
||||||
|
if (_visibleFire <= 1.5) exitWith {};
|
||||||
|
if ((random (linearConversion [1, 4, GVAR(nvgGeneration), 10, 20])) > _visibleFire) exitWith {};
|
||||||
|
|
||||||
|
GVAR(ppEffectCCMuzzleFlash) = ppEffectCreate ["ColorCorrections", 1237];
|
||||||
|
GVAR(ppEffectCCMuzzleFlash) ppEffectEnable true;
|
||||||
|
GVAR(ppEffectCCMuzzleFlash) ppEffectForceInNVG true;
|
||||||
|
|
||||||
|
GVAR(ppEffectCCMuzzleFlash) ppEffectAdjust [1, 1, -1, [0, 0, 0, 0], [0, 0, 0, 1], [0, 0, 0, 1]];
|
||||||
|
GVAR(ppEffectCCMuzzleFlash) ppEffectCommit 0;
|
||||||
|
|
||||||
|
GVAR(ppEffectCCMuzzleFlash) ppEffectAdjust [1, 1, 0, [0, 0, 0, 0], [0, 0, 0, 1], [0, 0, 0, 1]];
|
||||||
|
GVAR(ppEffectCCMuzzleFlash) ppEffectCommit 0.07;
|
25
addons/nightvision/functions/fnc_onLoadoutChanged.sqf
Normal file
25
addons/nightvision/functions/fnc_onLoadoutChanged.sqf
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
/*
|
||||||
|
* Author: Dslyecxi, PabstMirror
|
||||||
|
* Refreshes nvg effect if switching NVG goggles.
|
||||||
|
*
|
||||||
|
* Arguments:
|
||||||
|
* 0: Player <OBJECT>
|
||||||
|
*
|
||||||
|
* Return Value:
|
||||||
|
* None
|
||||||
|
*
|
||||||
|
* Example:
|
||||||
|
* [player] call ace_nightvision_fnc_onLoadoutChange
|
||||||
|
*
|
||||||
|
* Public: No
|
||||||
|
*/
|
||||||
|
#include "script_component.hpp"
|
||||||
|
|
||||||
|
params ["_player"];
|
||||||
|
TRACE_1("onLoadoutChange",_player);
|
||||||
|
|
||||||
|
private _newHMD = hmd _player;
|
||||||
|
if (_newHMD != GVAR(playerHMD)) then {
|
||||||
|
GVAR(playerHMD) = _newHMD;
|
||||||
|
[] call FUNC(refreshGoggleType);
|
||||||
|
};
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Author: BaerMitUmlaut
|
* Author: BaerMitUmlaut, Dslyecxi, PabstMirror
|
||||||
* Disables turning on NVGs while the player aims down his sight.
|
* Disables turning on NVGs while the player aims down his sight.
|
||||||
*
|
*
|
||||||
* Arguments:
|
* Arguments:
|
||||||
@ -14,11 +14,25 @@
|
|||||||
*
|
*
|
||||||
* Public: No
|
* Public: No
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "script_component.hpp"
|
#include "script_component.hpp"
|
||||||
|
|
||||||
params ["_unit", "_visionMode"];
|
params ["_unit", "_visionMode"];
|
||||||
|
TRACE_2("onVisionModeChanged",_unit,_visionMode);
|
||||||
|
|
||||||
|
// Start PFEH when entering night vision mode:
|
||||||
|
if (_visionMode == 1) then {
|
||||||
|
if (GVAR(PFID) == -1) then {
|
||||||
|
GVAR(running) = true;
|
||||||
|
[true] call FUNC(setupDisplayEffects);
|
||||||
|
[] call FUNC(refreshGoggleType);
|
||||||
|
GVAR(PFID) = [LINKFUNC(pfeh), 0, []] call CBA_fnc_addPerFrameHandler;
|
||||||
|
|
||||||
|
// Fade in from black when turning nvg on
|
||||||
|
QGVAR(turnOnEffect) cutText ["", "BLACK IN", 2.5];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
// Handle disableNVGsWithSights setting:
|
||||||
if (GVAR(disableNVGsWithSights) && {(hmd _unit) != ""}) then {
|
if (GVAR(disableNVGsWithSights) && {(hmd _unit) != ""}) then {
|
||||||
if ((vehicle _unit == _unit)
|
if ((vehicle _unit == _unit)
|
||||||
|| {isTurnedOut _unit}
|
|| {isTurnedOut _unit}
|
||||||
|
160
addons/nightvision/functions/fnc_pfeh.sqf
Normal file
160
addons/nightvision/functions/fnc_pfeh.sqf
Normal file
@ -0,0 +1,160 @@
|
|||||||
|
/*
|
||||||
|
* Author: Dslyecxi, PabstMirror
|
||||||
|
* PFEH to handle refreshing effects.
|
||||||
|
* Updates UI scale on every frame, effects are updated less often.
|
||||||
|
*
|
||||||
|
* Arguments:
|
||||||
|
* 1: PFEH ID <NUMBER>
|
||||||
|
*
|
||||||
|
* Return Value:
|
||||||
|
* None
|
||||||
|
*
|
||||||
|
* Example:
|
||||||
|
* [[], 1] call ace_nightvision_fnc_pfeh
|
||||||
|
*
|
||||||
|
* Public: No
|
||||||
|
*/
|
||||||
|
#include "script_component.hpp"
|
||||||
|
|
||||||
|
if ((currentVisionMode ACE_player) != 1) exitWith {
|
||||||
|
GVAR(running) = false;
|
||||||
|
[false] call FUNC(setupDisplayEffects);
|
||||||
|
[GVAR(PFID)] call CBA_fnc_removePerFrameHandler;
|
||||||
|
GVAR(PFID) = -1;
|
||||||
|
};
|
||||||
|
if (EGVAR(common,OldIsCamera)) exitWith {
|
||||||
|
if (GVAR(running)) then {
|
||||||
|
TRACE_2("pausing NVG for scripted camera",alive ACE_player,EGVAR(common,OldIsCamera));
|
||||||
|
GVAR(running) = false;
|
||||||
|
[false] call FUNC(setupDisplayEffects);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
if (!GVAR(running)) then {
|
||||||
|
TRACE_1("Un-Pausing", GVAR(paused));
|
||||||
|
GVAR(running) = true;
|
||||||
|
[true] call FUNC(setupDisplayEffects);
|
||||||
|
[] call FUNC(refreshGoggleType);
|
||||||
|
};
|
||||||
|
|
||||||
|
// Scale Border / Hex
|
||||||
|
BEGIN_COUNTER(borderScaling);
|
||||||
|
private _scale = (call EFUNC(common,getZoom)) * 1.12513;
|
||||||
|
if (!(GVAR(defaultPositionBorder) isEqualTo [])) then {
|
||||||
|
// Prevents issues when "zooming out" on ultra wide monitors - The square mask would be narrower than the screen
|
||||||
|
if (((GVAR(defaultPositionBorder) select 2) * _scale) < safeZoneW) then {
|
||||||
|
_scale = safeZoneW / (GVAR(defaultPositionBorder) select 2);
|
||||||
|
};
|
||||||
|
[(uiNamespace getVariable QGVAR(titleDisplay)) displayCtrl 1000, GVAR(defaultPositionHex), _scale] call FUNC(scaleCtrl);
|
||||||
|
[(uiNamespace getVariable QGVAR(titleDisplay)) displayCtrl 1001, GVAR(defaultPositionBorder), _scale] call FUNC(scaleCtrl);
|
||||||
|
// Fade out hexes with high zoom (optics are doing the magnifying, not the player "focusing in")
|
||||||
|
((uiNamespace getVariable QGVAR(titleDisplay)) displayCtrl 1000) ctrlSetFade (linearConversion [4, 6, _scale, 0.2, 1, true]);
|
||||||
|
};
|
||||||
|
END_COUNTER(borderScaling);
|
||||||
|
|
||||||
|
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);
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
// Redo full effects less often
|
||||||
|
BEGIN_COUNTER(updateAllEffects);
|
||||||
|
GVAR(nextEffectsUpdate) = CBA_missionTime + 5;
|
||||||
|
|
||||||
|
// Detecting the efficiency of the nightvision.
|
||||||
|
private _lightFinal = 0 max (moonIntensity - ((overcast * .8) min .275) - (rain * .5));
|
||||||
|
private _effectiveLight = _lightFinal * linearConversion [1, 3, GVAR(nvgGeneration), 0.25, 1];
|
||||||
|
private _effectMod = linearConversion [1, 3, GVAR(nvgGeneration), 1.5, 1];
|
||||||
|
// This has become a little weird. Basically means that lightfinal is unlikely to reach zero with any moon in the sky
|
||||||
|
// buuut it just so happens that setting it like this means that the lighting progression from clear -> cloudy -> rainy works particularly well.
|
||||||
|
|
||||||
|
private _grainFinal = linearConversion [1, 0, _effectiveLight, ST_NVG_GRAIN_MIN, ST_NVG_GRAIN_MAX, true];
|
||||||
|
private _blurFinal = _effectMod *_effectMod * linearConversion [1, 0, _effectiveLight, ST_NVG_BLUR_MIN, ST_NVG_BLUR_MAX, true];
|
||||||
|
private _brightFinal = linearConversion [0, 1, _effectiveLight, ST_NVG_BRIGHT_MIN, ST_NVG_BRIGHT_MAX, true];
|
||||||
|
private _contrastFinal = linearConversion [0, 1, _effectiveLight, ST_NVG_CONTRAST_MIN, ST_NVG_CONTRAST_MAX, true];
|
||||||
|
private _grainIntensityFinal = _effectMod * linearConversion [1, 0, _effectiveLight, ST_NVG_NOISEINTENSITY_MIN, ST_NVG_NOISEINTENSITY_MAX, true];
|
||||||
|
private _noiseSharpnessFinal = linearConversion [1, 0, _effectiveLight, ST_NVG_NOISESHARPNESS_MIN, ST_NVG_NOISESHARPNESS_MAX, true];
|
||||||
|
|
||||||
|
private _playerBrightSetting = ACE_player getVariable [QGVAR(NVGBrightness), 0];
|
||||||
|
_brightFinal = _brightFinal + (_playerBrightSetting / 20);
|
||||||
|
|
||||||
|
private _fogApply = linearConversion [0, 1, _effectiveLight, ST_NVG_MAXFOG, ST_NVG_MINFOG, true];
|
||||||
|
|
||||||
|
// Modify blur if looking down scope
|
||||||
|
if ((cameraView == "GUNNER") && {[ACE_player] call CBA_fnc_canUseWeapon}) then {
|
||||||
|
if (currentWeapon ACE_player == "") exitWith {};
|
||||||
|
if (currentWeapon ACE_player == primaryWeapon ACE_player) exitWith {_blurFinal = _blurFinal * ST_NVG_CAMERA_BLUR_SIGHTS_RIFLE}; // Rifles are bad
|
||||||
|
if (currentWeapon ACE_player == handgunWeapon ACE_player) exitWith {_blurFinal = _blurFinal * ST_NVG_CAMERA_BLUR_SIGHTS_PISTOL}; // Pistols aren't so bad
|
||||||
|
};
|
||||||
|
|
||||||
|
// Scale effects based on ace_nightvision_effectScaling setting
|
||||||
|
_grainIntensityFinal = _grainIntensityFinal * GVAR(effectScaling);
|
||||||
|
_noiseSharpnessFinal = linearConversion [0, 1, GVAR(effectScaling), 2.5, _noiseSharpnessFinal];
|
||||||
|
private _radialBlurPower = 0.0025 * GVAR(effectScaling);
|
||||||
|
_brightFinal = linearConversion [0, 1, GVAR(effectScaling), 1, _brightFinal];
|
||||||
|
_contrastFinal = linearConversion [0, 1, GVAR(effectScaling), 1, _contrastFinal];
|
||||||
|
_blurFinal = _blurFinal * GVAR(effectScaling);
|
||||||
|
|
||||||
|
|
||||||
|
// 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;
|
||||||
|
};
|
||||||
|
|
||||||
|
// ColorCorrections - Changes brightness, contrast and "green" color of nvg
|
||||||
|
// Params: [brightness(0..2), contrast(0..inf), offset(-x..+x), blendArray, colorizeArray, weightArray]
|
||||||
|
GVAR(ppeffectColorCorrect) = ppEffectCreate ["ColorCorrections", 2003];
|
||||||
|
GVAR(ppeffectColorCorrect) ppEffectAdjust [_brightFinal, _contrastFinal, 0, [0.0, 0.0, 0.0, 0.0], [1.3, 1.2, 0.0, 0.9], [6, 1, 1, 0.0]];
|
||||||
|
GVAR(ppeffectColorCorrect) ppEffectCommit 0;
|
||||||
|
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 {
|
||||||
|
if (((vehicle ACE_player) != ACE_player) && {(vehicle ACE_player) 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) = [_fogApply, 0, 0];
|
||||||
|
0 setFog GVAR(nvgFog)
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifdef DEBUG_MODE_FULL
|
||||||
|
private _aceAmbient = [] call EFUNC(common,ambientBrightness);
|
||||||
|
hintSilent format ["EffectiveLight %1\nLight: %2\nACE Ambient: %3\nBrightness: %4\nContrast: %5\nGrain: %6\nBlur: %7\nFog: %8\nScaling %9", _effectiveLight, _lightFinal, _aceAmbient, _brightFinal, _contrastFinal, [_grainIntensityFinal, _noiseSharpnessFinal, _grainFinal], _blurFinal, _fogApply, [GVAR(effectScaling),GVAR(fogScaling)]];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
END_COUNTER(updateAllEffects);
|
||||||
|
};
|
129
addons/nightvision/functions/fnc_refreshGoggleType.sqf
Normal file
129
addons/nightvision/functions/fnc_refreshGoggleType.sqf
Normal file
@ -0,0 +1,129 @@
|
|||||||
|
/*
|
||||||
|
* Author: Dslyecxi, PabstMirror
|
||||||
|
* Determines night vision source (player/vehicle) - Updates UI based on type.
|
||||||
|
*
|
||||||
|
* Arguments:
|
||||||
|
* None
|
||||||
|
*
|
||||||
|
* Return Value:
|
||||||
|
* None
|
||||||
|
*
|
||||||
|
* Example:
|
||||||
|
* [] call ace_nightvision_fnc_refreshGoggleType
|
||||||
|
*
|
||||||
|
* Public: No
|
||||||
|
*/
|
||||||
|
#include "script_component.hpp"
|
||||||
|
|
||||||
|
TRACE_1("refreshGoggleType",_this);
|
||||||
|
|
||||||
|
if (!GVAR(running)) exitWith {};
|
||||||
|
|
||||||
|
// Defaults (good for most vehicles/binoculars)
|
||||||
|
private _borderImage = "";
|
||||||
|
private _eyeCups = false;
|
||||||
|
private _hideHex = true;
|
||||||
|
private _nvgGen = 3;
|
||||||
|
private _blurRadius = -1;
|
||||||
|
|
||||||
|
if (alive ACE_player) then {
|
||||||
|
if (((vehicle ACE_player) == ACE_player) || {
|
||||||
|
// Test if we are using player's nvg or if sourced from vehicle:
|
||||||
|
|
||||||
|
private _currentVehicle = vehicle ACE_player;
|
||||||
|
private _vehConfig = configFile >> "CfgVehicles" >> (typeOf _currentVehicle);
|
||||||
|
|
||||||
|
if (cameraView != "GUNNER") exitWith {true}; // asume hmd usage outside of gunner view
|
||||||
|
|
||||||
|
if (ACE_player == (driver _currentVehicle)) exitWith {
|
||||||
|
!("NVG" in getArray (_vehConfig >> "ViewOptics" >> "visionMode"));
|
||||||
|
};
|
||||||
|
private _result = true;
|
||||||
|
private _turret = ACE_player call CBA_fnc_turretPath;
|
||||||
|
private _turretConfig = [_currentVehicle, _turret] call CBA_fnc_getTurret;
|
||||||
|
|
||||||
|
// Seems to cover things like the offroad technical
|
||||||
|
if ((isNumber (_turretConfig >> "optics")) && {(getNumber (_turretConfig >> "optics")) == 0}) exitWith {true};
|
||||||
|
|
||||||
|
private _turretConfigOpticsIn = _turretConfig >> "OpticsIn";
|
||||||
|
if (isClass _turretConfigOpticsIn) then {
|
||||||
|
for "_index" from 0 to (count _turretConfigOpticsIn - 1) do {
|
||||||
|
if ("NVG" in getArray (_turretConfigOpticsIn select _index >> "visionMode")) exitWith {_result = false};
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
// No OpticsIn usualy means RCWS, still need to test on more vehicles
|
||||||
|
_result = false;
|
||||||
|
};
|
||||||
|
_result
|
||||||
|
}) then {
|
||||||
|
if ((cameraView == "GUNNER") && {currentWeapon ACE_player != ""} && {binocular ACE_player == currentWeapon ACE_player}) exitWith {
|
||||||
|
TRACE_1("souce: binocular",binocular ACE_player); // Source is from player's binocular (Rangefinder/Vector21bNite)
|
||||||
|
private _config = configFile >> "CfgWeapons" >> (binocular ACE_player);
|
||||||
|
if (isNumber (_config >> QGVAR(generation))) then {_nvgGen = getNumber (_config >> QGVAR(generation));};
|
||||||
|
};
|
||||||
|
|
||||||
|
TRACE_1("source: hmd",GVAR(playerHMD)); // Source is player's HMD (or possibly a NVG scope, but no good way to detect that)
|
||||||
|
private _config = configFile >> "CfgWeapons" >> GVAR(playerHMD);
|
||||||
|
if (!isClass _config) exitWith {};
|
||||||
|
|
||||||
|
// Only use border if there is no modelOptics
|
||||||
|
if ((getText (_config >> "modelOptics")) == "") then {
|
||||||
|
_borderImage = getText (_config >> QGVAR(border));
|
||||||
|
_eyeCups = ((getNumber (_config >> QGVAR(eyeCups))) == 1);
|
||||||
|
_hideHex = (getNumber (_config >> QGVAR(hideHex))) == 1;
|
||||||
|
if (isNumber (_config >> QGVAR(bluRadius))) then {_blurRadius = getNumber (_config >> QGVAR(bluRadius));};
|
||||||
|
};
|
||||||
|
if (isNumber (_config >> QGVAR(generation))) then {_nvgGen = getNumber (_config >> QGVAR(generation));};
|
||||||
|
|
||||||
|
} else {
|
||||||
|
TRACE_1("source: vehicle - defaults",typeOf vehicle ACE_player);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
#ifdef DEBUG_MODE_FULL
|
||||||
|
systemChat format ["NVG Refresh - Border: %1", _borderImage];
|
||||||
|
systemChat format ["EyeCups: %1, HideHex %2, NVGen: %3, BluRadius: %4", _eyeCups, _hideHex, _nvgGen, _blurRadius];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
GVAR(nvgBlurRadius) = _blurRadius;
|
||||||
|
GVAR(nvgGeneration) = _nvgGen;
|
||||||
|
|
||||||
|
// Setup border and hex image based on NVG config:
|
||||||
|
private _scale = (call EFUNC(common,getZoom)) * 1.12513;
|
||||||
|
|
||||||
|
private _borderImageCtrl = (uiNamespace getVariable QGVAR(titleDisplay)) displayCtrl 1001;
|
||||||
|
private _trippleHeadLeft = (uiNamespace getVariable QGVAR(titleDisplay)) displayCtrl 1002;
|
||||||
|
private _trippleHeadRight = (uiNamespace getVariable QGVAR(titleDisplay)) displayCtrl 1003;
|
||||||
|
if (_borderImage == "") then {
|
||||||
|
_borderImageCtrl ctrlShow false;
|
||||||
|
_trippleHeadLeft ctrlShow false;
|
||||||
|
_trippleHeadRight ctrlShow false;
|
||||||
|
GVAR(defaultPositionBorder) = [];
|
||||||
|
} else {
|
||||||
|
_borderImageCtrl ctrlShow true;
|
||||||
|
_trippleHeadLeft ctrlShow true;
|
||||||
|
_trippleHeadRight ctrlShow true;
|
||||||
|
|
||||||
|
_borderImageCtrl ctrlSetText _borderImage;
|
||||||
|
_borderImageCtrl ctrlSetFade ([.15, 0] select _eyeCups);
|
||||||
|
|
||||||
|
#define BORDER_SIZE 3
|
||||||
|
GVAR(defaultPositionBorder) = [safezoneX - (((BORDER_SIZE * 0.75) * safezoneH) - safezoneW) / 2, safezoneY - ((BORDER_SIZE - 1) / 2) * safezoneH, (BORDER_SIZE * 0.75) * safezoneH, BORDER_SIZE * safezoneH];
|
||||||
|
[_borderImageCtrl, GVAR(defaultPositionBorder), _scale] call FUNC(scaleCtrl);
|
||||||
|
};
|
||||||
|
|
||||||
|
private _hexCtrl = (uiNamespace getVariable QGVAR(titleDisplay)) displayCtrl 1000;
|
||||||
|
if (_hideHex) then {
|
||||||
|
_hexCtrl ctrlShow false;
|
||||||
|
} else {
|
||||||
|
_hexCtrl ctrlShow true;
|
||||||
|
// _hexCtrl ctrlSetText QPATHTOF(data\nvg_mask_hexes.paa);
|
||||||
|
_hexCtrl ctrlSetText QPATHTOF(data\nvg_mask_hexes_thin.paa);
|
||||||
|
|
||||||
|
#define HEX_SIZE 1.5
|
||||||
|
GVAR(defaultPositionHex) = [safezoneX - (((HEX_SIZE * 0.75) * safezoneH) - safezoneW) / 2, safezoneY - ((HEX_SIZE - 1) / 2) * safezoneH, (HEX_SIZE * 0.75) * safezoneH, HEX_SIZE * safezoneH];
|
||||||
|
[_hexCtrl, GVAR(defaultPositionHex), _scale] call FUNC(scaleCtrl);
|
||||||
|
};
|
||||||
|
|
||||||
|
// Trigger full ppEffects update next time run in the PFEH:
|
||||||
|
GVAR(nextEffectsUpdate) = -1;
|
31
addons/nightvision/functions/fnc_scaleCtrl.sqf
Normal file
31
addons/nightvision/functions/fnc_scaleCtrl.sqf
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
/*
|
||||||
|
* Author: Dslyecxi, PabstMirror
|
||||||
|
* Determines night vision source (player/vehicle) - Updates UI based on type.
|
||||||
|
*
|
||||||
|
* Arguments:
|
||||||
|
* 0: Control <CONTROL>
|
||||||
|
* 1: Default position [x,y,w,h] <ARRAY>
|
||||||
|
* 2: Zoom Level <NUMBER>
|
||||||
|
*
|
||||||
|
* Return Value:
|
||||||
|
* None
|
||||||
|
*
|
||||||
|
* Example:
|
||||||
|
* [] call ace_nightvision_fnc_scaleCtrl
|
||||||
|
*
|
||||||
|
* Public: No
|
||||||
|
*/
|
||||||
|
#include "script_component.hpp"
|
||||||
|
|
||||||
|
params ["_ctrl", "_default_pos", "_scale"];
|
||||||
|
|
||||||
|
if (!ctrlShown _ctrl) exitWith {};
|
||||||
|
|
||||||
|
_ctrl ctrlSetPosition
|
||||||
|
[(((_default_pos select 0) - 0.5) * _scale) + 0.5,
|
||||||
|
(((_default_pos select 1) - 0.5) * _scale) + 0.5,
|
||||||
|
(_default_pos select 2) * _scale,
|
||||||
|
(_default_pos select 3) * _scale];
|
||||||
|
|
||||||
|
|
||||||
|
_ctrl ctrlCommit 0;
|
77
addons/nightvision/functions/fnc_setupDisplayEffects.sqf
Normal file
77
addons/nightvision/functions/fnc_setupDisplayEffects.sqf
Normal file
@ -0,0 +1,77 @@
|
|||||||
|
/*
|
||||||
|
* Author: Dslyecxi, PabstMirror
|
||||||
|
* Handles setting up the effects: fog, ppEffects and the RscTittle.
|
||||||
|
*
|
||||||
|
* Arguments:
|
||||||
|
* 0: Activated <BOOL>
|
||||||
|
*
|
||||||
|
* Return Value:
|
||||||
|
* None
|
||||||
|
*
|
||||||
|
* Example:
|
||||||
|
* [true] call ace_nightvision_fnc_setupDisplayEffects
|
||||||
|
*
|
||||||
|
* Public: No
|
||||||
|
*/
|
||||||
|
#include "script_component.hpp"
|
||||||
|
|
||||||
|
params ["_activated"];
|
||||||
|
TRACE_1("setupDisplayEffects",_activated);
|
||||||
|
|
||||||
|
// Backup and restore changes to fog:
|
||||||
|
if (GVAR(fogScaling) > 0) then {
|
||||||
|
if (_activated) then {
|
||||||
|
if (isNil QGVAR(priorFog)) then {
|
||||||
|
TRACE_1("Backing up fog",fogParams);
|
||||||
|
GVAR(priorFog) = fogParams;
|
||||||
|
} else {
|
||||||
|
ERROR("fog already backed up");
|
||||||
|
};
|
||||||
|
|
||||||
|
// Handle non-dedicated:
|
||||||
|
if (isServer && hasInterface) then {
|
||||||
|
missionNamespace setVariable [QGVAR(serverPriorFog), fogParams, true];
|
||||||
|
[QGVAR(nonDedicatedFix), []] call CBA_fnc_remoteEvent;
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
if (!isNil QGVAR(priorFog)) then {
|
||||||
|
0 setFog GVAR(priorFog);
|
||||||
|
GVAR(priorFog) = nil;
|
||||||
|
} else {
|
||||||
|
ERROR("no fog backed up");
|
||||||
|
};
|
||||||
|
|
||||||
|
// Handle non-dedicated:
|
||||||
|
if (isServer && hasInterface) then {
|
||||||
|
missionNamespace setVariable [QGVAR(serverPriorFog), nil, true];
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
// Note: Using BIS_fnc_rscLayer because of bug with string syntax - https://feedback.bistudio.com/T120768
|
||||||
|
(QGVAR(display) call BIS_fnc_rscLayer) cutText ["", "PLAIN"]; // Cleanup Old Display
|
||||||
|
if (_activated) then { // Create New Display
|
||||||
|
(QGVAR(display) call BIS_fnc_rscLayer) cutRsc [QGVAR(title), "PLAIN", 0, false];
|
||||||
|
};
|
||||||
|
|
||||||
|
// Cleanup Old PP Effects
|
||||||
|
if (GVAR(ppeffectGrain) != -1) then {
|
||||||
|
ppEffectDestroy GVAR(ppeffectGrain);
|
||||||
|
GVAR(ppeffectGrain) = -1;
|
||||||
|
};
|
||||||
|
if (GVAR(ppeffectBlur) != -1) then {
|
||||||
|
ppEffectDestroy GVAR(ppeffectBlur);
|
||||||
|
GVAR(ppeffectBlur) = -1;
|
||||||
|
};
|
||||||
|
if (GVAR(ppeffectRadialBlur) != -1) then {
|
||||||
|
ppEffectDestroy GVAR(ppeffectRadialBlur);
|
||||||
|
GVAR(ppeffectRadialBlur) = -1;
|
||||||
|
};
|
||||||
|
if (GVAR(ppeffectColorCorrect) != -1) then {
|
||||||
|
ppEffectDestroy GVAR(ppeffectColorCorrect);
|
||||||
|
GVAR(ppeffectColorCorrect) = -1;
|
||||||
|
};
|
||||||
|
if (GVAR(ppEffectCCMuzzleFlash) != -1) then {
|
||||||
|
ppEffectDestroy GVAR(ppEffectCCMuzzleFlash);
|
||||||
|
GVAR(ppEffectCCMuzzleFlash) = -1;
|
||||||
|
};
|
@ -1,96 +0,0 @@
|
|||||||
/*
|
|
||||||
* Author: commy2, PabstMirror and esteldunedain
|
|
||||||
* Update the ppEffects everytime something changes
|
|
||||||
*
|
|
||||||
* Arguments:
|
|
||||||
* None
|
|
||||||
*
|
|
||||||
* Return Value:
|
|
||||||
* None
|
|
||||||
*
|
|
||||||
* Example:
|
|
||||||
* [someEvent] call ace_nightvision_fnc_updatePPEffects
|
|
||||||
*
|
|
||||||
* Public: No
|
|
||||||
*/
|
|
||||||
#include "script_component.hpp"
|
|
||||||
|
|
||||||
if (!hasInterface) exitWith {};
|
|
||||||
|
|
||||||
disableSerialization;
|
|
||||||
|
|
||||||
params [["_display", displayNull]];
|
|
||||||
|
|
||||||
if !(_display isEqualType displayNull) then {
|
|
||||||
_display = displayNull;
|
|
||||||
};
|
|
||||||
|
|
||||||
private _currentVehicle = vehicle ACE_player;
|
|
||||||
|
|
||||||
// If the Zeus display is on or the player has no nightvision
|
|
||||||
if (ctrlIDD _display == 312 || currentVisionMode ACE_player != 1) exitWith {
|
|
||||||
GVAR(ppEffectFilmGrain) ppEffectEnable false;
|
|
||||||
GVAR(ppEffectBlur) ppEffectEnable false;
|
|
||||||
GVAR(ppEffectRadialBlur) ppEffectEnable false;
|
|
||||||
GVAR(ppEffectNVGBrightness) ppEffectEnable false;
|
|
||||||
};
|
|
||||||
|
|
||||||
// The unit has nightvision
|
|
||||||
private _config = configFile >> "CfgVehicles" >> typeOf _currentVehicle;
|
|
||||||
private _hmd = hmd ACE_player;
|
|
||||||
private _cameraView = cameraView;
|
|
||||||
private _turret = [ACE_player] call EFUNC(common,getTurretIndex);
|
|
||||||
|
|
||||||
|
|
||||||
private _fnc_isUsingHMD = {
|
|
||||||
if (_cameraView != "GUNNER") exitWith {true}; // asume hmd usage outside of gunner view
|
|
||||||
|
|
||||||
if (ACE_player == (driver _currentVehicle)) exitWith {
|
|
||||||
!("NVG" in getArray (_config >> "ViewOptics" >> "visionMode"));
|
|
||||||
};
|
|
||||||
|
|
||||||
private _result = true;
|
|
||||||
private _turretConfig = [_config, _turret] call EFUNC(common,getTurretConfigPath);
|
|
||||||
private _turretConfigOpticsIn = _turretConfig >> "OpticsIn";
|
|
||||||
|
|
||||||
if (isClass _turretConfigOpticsIn) then {
|
|
||||||
for "_index" from 0 to (count _turretConfigOpticsIn - 1) do {
|
|
||||||
if ("NVG" in getArray (_turretConfigOpticsIn select _index >> "visionMode")) exitWith {_result = false};
|
|
||||||
};
|
|
||||||
} else {
|
|
||||||
//No OpticsIn usualy means RCWS, still need to test on more vehicles
|
|
||||||
_result = false;
|
|
||||||
};
|
|
||||||
_result
|
|
||||||
};
|
|
||||||
|
|
||||||
private _grainSetting = 0;
|
|
||||||
private _blurSetting = 0;
|
|
||||||
private _radBlurSetting = 0;
|
|
||||||
|
|
||||||
if ((_currentVehicle == ACE_player) || _fnc_isUsingHMD) then {
|
|
||||||
_grainSetting = getNumber (configFile >> "CfgWeapons" >> _hmd >> "ACE_NightVision_grain");
|
|
||||||
_blurSetting = getNumber (configFile >> "CfgWeapons" >> _hmd >> "ACE_NightVision_blur");
|
|
||||||
_radBlurSetting = getNumber (configFile >> "CfgWeapons" >> _hmd >> "ACE_NightVision_radBlur");
|
|
||||||
TRACE_3("New NVG Settings From Player NVG",_grainSetting,_blurSetting,_radBlurSetting)
|
|
||||||
} else {
|
|
||||||
_grainSetting = _currentVehicle getVariable ["ACE_NightVision_grain", getNumber (_config >> "ACE_NightVision_grain")];
|
|
||||||
_blurSetting = _currentVehicle getVariable ["ACE_NightVision_blur", getNumber (_config >> "ACE_NightVision_blur")];
|
|
||||||
_radBlurSetting = _currentVehicle getVariable ["ACE_NightVision_radBlur", getNumber (_config >> "ACE_NightVision_radBlur")];
|
|
||||||
TRACE_3("New NVG Settings From Vehicle",_grainSetting,_blurSetting,_radBlurSetting)
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
// Enable the effects
|
|
||||||
GVAR(ppEffectFilmGrain) ppEffectEnable true;
|
|
||||||
GVAR(ppEffectBlur) ppEffectEnable true;
|
|
||||||
GVAR(ppEffectRadialBlur) ppEffectEnable true;
|
|
||||||
GVAR(ppEffectNVGBrightness) ppEffectEnable true;
|
|
||||||
|
|
||||||
// Configure effects parameters
|
|
||||||
GVAR(ppEffectFilmGrain) ppEffectAdjust [0.25, 2.5, 2.5, _grainSetting, _grainSetting, false];
|
|
||||||
GVAR(ppEffectFilmGrain) ppEffectCommit 0;
|
|
||||||
GVAR(ppEffectBlur) ppEffectAdjust [_blurSetting];
|
|
||||||
GVAR(ppEffectBlur) ppEffectCommit 0;
|
|
||||||
GVAR(ppEffectRadialBlur) ppEffectAdjust [_radBlurSetting, _radBlurSetting, 0.2, 0.2];
|
|
||||||
GVAR(ppEffectRadialBlur) ppEffectCommit 0;
|
|
@ -15,3 +15,34 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "\z\ace\addons\main\script_macros.hpp"
|
#include "\z\ace\addons\main\script_macros.hpp"
|
||||||
|
|
||||||
|
|
||||||
|
// Effect Settings / Magic values to tweak:
|
||||||
|
|
||||||
|
// Decreases fog when in air vehicles
|
||||||
|
#define ST_NVG_AIR_FOG_MULTIPLIER 0.5
|
||||||
|
|
||||||
|
// Increase blur when looking down sights
|
||||||
|
#define ST_NVG_CAMERA_BLUR_SIGHTS_RIFLE 6
|
||||||
|
#define ST_NVG_CAMERA_BLUR_SIGHTS_PISTOL 2
|
||||||
|
|
||||||
|
#define ST_NVG_MINFOG 0.2
|
||||||
|
#define ST_NVG_MAXFOG 0.3
|
||||||
|
|
||||||
|
#define ST_NVG_GRAIN_MIN 2.25
|
||||||
|
#define ST_NVG_GRAIN_MAX 2.7
|
||||||
|
|
||||||
|
#define ST_NVG_BLUR_MIN 0.05
|
||||||
|
#define ST_NVG_BLUR_MAX 0.11
|
||||||
|
|
||||||
|
#define ST_NVG_BRIGHT_MIN 0.65
|
||||||
|
#define ST_NVG_BRIGHT_MAX 0.75
|
||||||
|
|
||||||
|
#define ST_NVG_CONTRAST_MIN 0.4
|
||||||
|
#define ST_NVG_CONTRAST_MAX 0.8
|
||||||
|
|
||||||
|
#define ST_NVG_NOISEINTENSITY_MIN 0.4
|
||||||
|
#define ST_NVG_NOISEINTENSITY_MAX 0.55
|
||||||
|
|
||||||
|
#define ST_NVG_NOISESHARPNESS_MIN 1.2
|
||||||
|
#define ST_NVG_NOISESHARPNESS_MAX 1
|
||||||
|
@ -1,6 +1,9 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<Project name="ACE">
|
<Project name="ACE">
|
||||||
<Package name="NightVision">
|
<Package name="NightVision">
|
||||||
|
<Key ID="STR_ACE_NightVision_Category">
|
||||||
|
<English>ACE - Nightvision</English>
|
||||||
|
</Key>
|
||||||
<Key ID="STR_ACE_NightVision_NVG_Gen1">
|
<Key ID="STR_ACE_NightVision_NVG_Gen1">
|
||||||
<English>NV Goggles (Gen1)</English>
|
<English>NV Goggles (Gen1)</English>
|
||||||
<Czech>Noktovizor (Gen1)</Czech>
|
<Czech>Noktovizor (Gen1)</Czech>
|
||||||
@ -237,5 +240,17 @@
|
|||||||
<Chinesesimp>此功能开启后,当要使用瞄准镜时,为避免夜视镜镜头碰撞到瞄准镜,会先拿开夜视镜后再进行瞄准镜瞄准。</Chinesesimp>
|
<Chinesesimp>此功能开启后,当要使用瞄准镜时,为避免夜视镜镜头碰撞到瞄准镜,会先拿开夜视镜后再进行瞄准镜瞄准。</Chinesesimp>
|
||||||
<Chinese>此功能開啟後,當要使用瞄準鏡時,為避免夜視鏡鏡頭碰撞到瞄準鏡,會先拿開夜視鏡後再進行瞄準鏡瞄準。</Chinese>
|
<Chinese>此功能開啟後,當要使用瞄準鏡時,為避免夜視鏡鏡頭碰撞到瞄準鏡,會先拿開夜視鏡後再進行瞄準鏡瞄準。</Chinese>
|
||||||
</Key>
|
</Key>
|
||||||
|
<Key ID="STR_ACE_NightVision_fogScaling_DisplayName">
|
||||||
|
<English>NVG Fog Scale</English>
|
||||||
|
</Key>
|
||||||
|
<Key ID="STR_ACE_NightVision_fogScaling_Description">
|
||||||
|
<English>Fog is used to limit visibility.</English>
|
||||||
|
</Key>
|
||||||
|
<Key ID="STR_ACE_NightVision_effectScaling_DisplayName">
|
||||||
|
<English>NVG Effect Scale</English>
|
||||||
|
</Key>
|
||||||
|
<Key ID="STR_ACE_NightVision_effectScaling_Description">
|
||||||
|
<English>Blur, grain and brightness effects [Setting to 0 will disable ALL nightvision effects]</English>
|
||||||
|
</Key>
|
||||||
</Package>
|
</Package>
|
||||||
</Project>
|
</Project>
|
||||||
|
@ -1,5 +1,13 @@
|
|||||||
|
|
||||||
class CfgWeapons {
|
class CfgWeapons {
|
||||||
|
|
||||||
|
class NVGoggles;
|
||||||
|
class rhs_1PN138: NVGoggles { // Monocular
|
||||||
|
modelOptics = "";
|
||||||
|
EGVAR(nightvision,border) = QPATHTOEF(nightvision,data\nvg_mask_4096.paa);
|
||||||
|
EGVAR(nightvision,bluRadius) = 0.13;
|
||||||
|
};
|
||||||
|
|
||||||
class hgun_Rook40_F;
|
class hgun_Rook40_F;
|
||||||
class rhs_weap_pya: hgun_Rook40_F {
|
class rhs_weap_pya: hgun_Rook40_F {
|
||||||
ACE_barrelTwist = 254.0;
|
ACE_barrelTwist = 254.0;
|
||||||
|
@ -1,5 +1,17 @@
|
|||||||
|
|
||||||
class CfgWeapons {
|
class CfgWeapons {
|
||||||
|
class NVGoggles;
|
||||||
|
class rhsusf_ANPVS_14: NVGoggles { // Monocular
|
||||||
|
modelOptics = "";
|
||||||
|
EGVAR(nightvision,border) = QPATHTOEF(nightvision,data\nvg_mask_4096.paa);
|
||||||
|
EGVAR(nightvision,bluRadius) = 0.13;
|
||||||
|
};
|
||||||
|
class rhsusf_ANPVS_15: rhsusf_ANPVS_14 { // Binocular (same as base)
|
||||||
|
modelOptics = "";
|
||||||
|
EGVAR(nightvision,border) = QPATHTOEF(nightvision,data\nvg_mask_binos_4096.paa);
|
||||||
|
EGVAR(nightvision,bluRadius) = 0.15;
|
||||||
|
};
|
||||||
|
|
||||||
class Pistol_Base_F;
|
class Pistol_Base_F;
|
||||||
class Rifle_Base_F;
|
class Rifle_Base_F;
|
||||||
class srifle_EBR_F;
|
class srifle_EBR_F;
|
||||||
|
Loading…
Reference in New Issue
Block a user