Hearing - Code cleanup (#10041)

* Hearing cleanup

* Update fnc_updateHearingProtection.sqf

* Fixes + tweaks

* Update initSettings.inc.sqf

* Update fnc_removeEarplugs.sqf
This commit is contained in:
johnb432 2024-05-29 19:01:39 +02:00 committed by GitHub
parent be61424fed
commit e535988479
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
19 changed files with 146 additions and 109 deletions

View File

@ -1,4 +1,3 @@
class Extended_PreStart_EventHandlers { class Extended_PreStart_EventHandlers {
class ADDON { class ADDON {
init = QUOTE(call COMPILE_SCRIPT(XEH_preStart)); init = QUOTE(call COMPILE_SCRIPT(XEH_preStart));

View File

@ -5,7 +5,7 @@ class CfgVehicles {
class ACE_Equipment { class ACE_Equipment {
class ACE_PutInEarplugs { class ACE_PutInEarplugs {
displayName = CSTRING(EarPlugs_On); displayName = CSTRING(EarPlugs_On);
condition = QUOTE(GVAR(EnableCombatDeafness) && {!([_player] call FUNC(hasEarPlugsIn)) && {'ACE_EarPlugs' in items _player}}); condition = QUOTE(GVAR(enableCombatDeafness) && {!(_player call FUNC(hasEarPlugsIn)) && {[ARR_2(_player,'ACE_EarPlugs')] call EFUNC(common,hasItem)}});
exceptions[] = {"isNotSwimming", "isNotInside", "isNotSitting"}; exceptions[] = {"isNotSwimming", "isNotInside", "isNotSitting"};
statement = QUOTE([ARR_2(_player,true)] call FUNC(putInEarPlugs)); statement = QUOTE([ARR_2(_player,true)] call FUNC(putInEarPlugs));
showDisabled = 0; showDisabled = 0;
@ -13,7 +13,7 @@ class CfgVehicles {
}; };
class ACE_RemoveEarplugs { class ACE_RemoveEarplugs {
displayName = CSTRING(EarPlugs_Off); displayName = CSTRING(EarPlugs_Off);
condition = QUOTE(GVAR(EnableCombatDeafness) && {[_player] call FUNC(hasEarPlugsIn)}); condition = QUOTE(GVAR(enableCombatDeafness) && {_player call FUNC(hasEarPlugsIn)});
exceptions[] = {"isNotSwimming", "isNotInside", "isNotSitting"}; exceptions[] = {"isNotSwimming", "isNotInside", "isNotSitting"};
statement = QUOTE([ARR_2(_player,true)] call FUNC(removeEarPlugs)); statement = QUOTE([ARR_2(_player,true)] call FUNC(removeEarPlugs));
showDisabled = 0; showDisabled = 0;

View File

@ -80,7 +80,7 @@ class CfgWeapons {
class H_HelmetO_ocamo: H_HelmetB { class H_HelmetO_ocamo: H_HelmetB {
HEARING_PROTECTION_PELTOR; HEARING_PROTECTION_PELTOR;
}; // Defender and Assasin Helmet inherit. }; // Defender and Assassin Helmet inherit.
class H_HelmetO_ViperSP_hex_f: H_HelmetB { class H_HelmetO_ViperSP_hex_f: H_HelmetB {
HEARING_PROTECTION_PELTOR; HEARING_PROTECTION_PELTOR;

View File

@ -1,4 +1,3 @@
PREP(addEarPlugs); PREP(addEarPlugs);
PREP(earRinging); PREP(earRinging);
PREP(explosionNear); PREP(explosionNear);

View File

@ -2,9 +2,10 @@
if (isServer) then { if (isServer) then {
["CBA_settingsInitialized", { ["CBA_settingsInitialized", {
TRACE_1("settingInit - server",GVAR(EnableCombatDeafness)); TRACE_1("settingInit - server",GVAR(enableCombatDeafness));
// Only install event handler if combat deafness is enabled // Only install event handler if combat deafness is enabled
if (!GVAR(EnableCombatDeafness)) exitWith {}; if (!GVAR(enableCombatDeafness)) exitWith {};
["CAManBase", "Init", LINKFUNC(addEarPlugs), true, [], true] call CBA_fnc_addClassEventHandler; ["CAManBase", "Init", LINKFUNC(addEarPlugs), true, [], true] call CBA_fnc_addClassEventHandler;
}] call CBA_fnc_addEventHandler; }] call CBA_fnc_addEventHandler;
@ -26,18 +27,20 @@ GVAR(volumeAttenuation) = 1;
GVAR(lastPlayerVehicle) = objNull; GVAR(lastPlayerVehicle) = objNull;
["CBA_settingsInitialized", { ["CBA_settingsInitialized", {
TRACE_1("settingInit",GVAR(EnableCombatDeafness)); TRACE_1("settingInit",GVAR(enableCombatDeafness));
// Only run PFEH and install event handlers if combat deafness is enabled // Only run PFEH and install event handlers if combat deafness is enabled
if (!GVAR(EnableCombatDeafness)) exitWith {}; if (!GVAR(enableCombatDeafness)) exitWith {};
// Spawn volume updating process // Spawn volume updating process
[LINKFUNC(updateVolume), 1, [false]] call CBA_fnc_addPerFrameHandler; [LINKFUNC(updateVolume), 1, false] call CBA_fnc_addPerFrameHandler;
[QGVAR(updateVolume), LINKFUNC(updateVolume)] call CBA_fnc_addEventHandler; [QGVAR(updateVolume), LINKFUNC(updateVolume)] call CBA_fnc_addEventHandler;
// Update veh attunation when player veh changes // Update veh attunation when player veh changes
["vehicle", { ["vehicle", {
params ["_player", "_vehicle"]; params ["_player", "_vehicle"];
TRACE_2("vehicle change",_player,_vehicle); TRACE_2("vehicle change",_player,_vehicle);
_this call FUNC(updatePlayerVehAttenuation); _this call FUNC(updatePlayerVehAttenuation);
@ -48,6 +51,7 @@ GVAR(lastPlayerVehicle) = objNull;
GVAR(lastPlayerVehicle) = objNull; GVAR(lastPlayerVehicle) = objNull;
TRACE_2("removed veh eh",_firedEH,GVAR(lastPlayerVehicle)); TRACE_2("removed veh eh",_firedEH,GVAR(lastPlayerVehicle));
}; };
if ((!isNull _vehicle) && {_player != _vehicle}) then { if ((!isNull _vehicle) && {_player != _vehicle}) then {
private _firedEH = _vehicle addEventHandler ["FiredNear", {call FUNC(firedNear)}]; private _firedEH = _vehicle addEventHandler ["FiredNear", {call FUNC(firedNear)}];
_vehicle setVariable [QGVAR(firedEH), _firedEH]; _vehicle setVariable [QGVAR(firedEH), _firedEH];
@ -55,8 +59,8 @@ GVAR(lastPlayerVehicle) = objNull;
TRACE_2("added veh eh",_firedEH,GVAR(lastPlayerVehicle)); TRACE_2("added veh eh",_firedEH,GVAR(lastPlayerVehicle));
}; };
}, true] call CBA_fnc_addPlayerEventHandler; }, true] call CBA_fnc_addPlayerEventHandler;
["turret", LINKFUNC(updatePlayerVehAttenuation), false] call CBA_fnc_addPlayerEventHandler;
["turret", LINKFUNC(updatePlayerVehAttenuation), false] call CBA_fnc_addPlayerEventHandler;
// Reset deafness on respawn (or remote control player switch) // Reset deafness on respawn (or remote control player switch)
["unit", { ["unit", {
@ -67,9 +71,11 @@ GVAR(lastPlayerVehicle) = objNull;
private _firedEH = _oldPlayer getVariable [QGVAR(firedEH), -1]; private _firedEH = _oldPlayer getVariable [QGVAR(firedEH), -1];
_oldPlayer removeEventHandler ["FiredNear", _firedEH]; _oldPlayer removeEventHandler ["FiredNear", _firedEH];
_oldPlayer setVariable [QGVAR(firedEH), nil]; _oldPlayer setVariable [QGVAR(firedEH), nil];
private _explosionEH = _oldPlayer getVariable [QGVAR(explosionEH), -1]; private _explosionEH = _oldPlayer getVariable [QGVAR(explosionEH), -1];
_oldPlayer removeEventHandler ["Explosion", _explosionEH]; _oldPlayer removeEventHandler ["Explosion", _explosionEH];
_oldPlayer setVariable [QGVAR(explosionEH), nil]; _oldPlayer setVariable [QGVAR(explosionEH), nil];
TRACE_3("removed unit eh",_oldPlayer,_firedEH,_explosionEH); TRACE_3("removed unit eh",_oldPlayer,_firedEH,_explosionEH);
}; };
// Don't add a new EH if the unit respawned // Don't add a new EH if the unit respawned
@ -77,17 +83,21 @@ GVAR(lastPlayerVehicle) = objNull;
if ((getNumber (configOf _player >> "isPlayableLogic")) == 1) exitWith { if ((getNumber (configOf _player >> "isPlayableLogic")) == 1) exitWith {
TRACE_1("skipping playable logic",typeOf _player); // VirtualMan_F (placeable logic zeus / spectator) TRACE_1("skipping playable logic",typeOf _player); // VirtualMan_F (placeable logic zeus / spectator)
}; };
private _firedEH = _player addEventHandler ["FiredNear", {call FUNC(firedNear)}]; private _firedEH = _player addEventHandler ["FiredNear", {call FUNC(firedNear)}];
_player setVariable [QGVAR(firedEH), _firedEH]; _player setVariable [QGVAR(firedEH), _firedEH];
private _explosionEH = _player addEventHandler ["Explosion", {call FUNC(explosionNear)}]; private _explosionEH = _player addEventHandler ["Explosion", {call FUNC(explosionNear)}];
_player setVariable [QGVAR(explosionEH), _explosionEH]; _player setVariable [QGVAR(explosionEH), _explosionEH];
TRACE_3("added unit eh",_player,_firedEH,_explosionEH); TRACE_3("added unit eh",_player,_firedEH,_explosionEH);
}; };
GVAR(deafnessDV) = 0; GVAR(deafnessDV) = 0;
GVAR(deafnessPrior) = 0; GVAR(deafnessPrior) = 0;
GVAR(time3) = 0; GVAR(time3) = 0;
[] call FUNC(updateHearingProtection);
call FUNC(updateHearingProtection);
}, true] call CBA_fnc_addPlayerEventHandler; }, true] call CBA_fnc_addPlayerEventHandler;
// Update protection on possible helmet change // Update protection on possible helmet change

View File

@ -10,18 +10,20 @@ PREP_RECOMPILE_END;
["CBA_loadoutSet", { ["CBA_loadoutSet", {
params ["_unit", "_loadout", "_extendedInfo"]; params ["_unit", "_loadout", "_extendedInfo"];
if (_extendedInfo getOrDefault ["ace_earplugs", false]) then { if (_extendedInfo getOrDefault ["ace_earplugs", false]) then {
_unit setVariable ["ACE_hasEarPlugsIn", true, true]; _unit setVariable ["ACE_hasEarPlugsIn", true, true];
// Only force update volume if unit is a player (including remote controlled) // Only force update volume if unit is a player (including remote controlled)
if (_unit call EFUNC(common,isPlayer)) then { if (_unit call EFUNC(common,isPlayer)) then {
[QGVAR(updateVolume), [[true]], _unit] call CBA_fnc_targetEvent; [QGVAR(updateVolume), true, _unit] call CBA_fnc_targetEvent;
}; };
}; };
}] call CBA_fnc_addEventHandler; }] call CBA_fnc_addEventHandler;
["CBA_loadoutGet", { ["CBA_loadoutGet", {
params ["_unit", "_loadout", "_extendedInfo"]; params ["_unit", "_loadout", "_extendedInfo"];
if (_unit getVariable ["ACE_hasEarPlugsin", false]) then { if (_unit getVariable ["ACE_hasEarPlugsin", false]) then {
_extendedInfo set ["ace_earplugs", true] _extendedInfo set ["ace_earplugs", true]
}; };

View File

@ -1,24 +1,25 @@
#include "..\script_component.hpp" #include "..\script_component.hpp"
/* /*
* Author: KoffeinFlummi, commy2, Rocko, Rommel, Ruthberg * Author: KoffeinFlummi, commy2, Rocko, Rommel, Ruthberg
* Handle new sound souce near ace_player and apply hearing damage * Handle new sound souce near ace_player and apply hearing damage.
* *
* Arguments: * Arguments:
* 0: strength of ear ringing <NUMBER> * 0: Strength of ear ringing <NUMBER>
* *
* Return Value: * Return Value:
* None * None
* *
* Example: * Example:
* [_strength] call ace_hearing_fnc_earRinging * 10 call ace_hearing_fnc_earRinging
* *
* Public: No * Public: No
*/ */
params ["_strength"]; params ["_strength"];
if (_strength < 0.05) exitWith {}; if (_strength < 0.05) exitWith {};
if (!isNull curatorCamera) exitWith {}; if (!isNull curatorCamera) exitWith {};
if ((!GVAR(enabledForZeusUnits)) && {player != ACE_player}) exitWith {}; if (!GVAR(enabledForZeusUnits) && {player != ACE_player}) exitWith {};
TRACE_2("adding",_strength * GVAR(damageCoefficent),GVAR(deafnessDV)); TRACE_2("adding",_strength * GVAR(damageCoefficent),GVAR(deafnessDV));

View File

@ -4,8 +4,8 @@
* Handles deafness due to explosions going off near the player. * Handles deafness due to explosions going off near the player.
* *
* Arguments: * Arguments:
* 0: vehicle - Object the event handler is assigned to (player) <OBJECT> * 0: Unit <OBJECT>
* 1: damage - Damage inflicted to the object <NUMBER> * 1: Damage inflicted to the unit <NUMBER>
* *
* Return Value: * Return Value:
* None * None
@ -22,5 +22,5 @@ TRACE_2("explosion near player",_unit,_damage);
private _strength = (0 max _damage) * 30; private _strength = (0 max _damage) * 30;
// Call inmediately, as it will get pick up later anyway by the update thread // Call immediately, as it will get picked up later by the update thread anyway
[_strength] call FUNC(earRinging); _strength call FUNC(earRinging);

View File

@ -59,5 +59,5 @@ private _strength = _vehAttenuation * (_loudness - (_loudness / 50 * _distance))
TRACE_1("result",_strength); TRACE_1("result",_strength);
// Call inmediately, as it will get pick up later anyway by the update thread // Call immediately, as it will get picked up later by the update thread anyway
[_strength] call FUNC(earRinging); _strength call FUNC(earRinging);

View File

@ -1,7 +1,7 @@
#include "..\script_component.hpp" #include "..\script_component.hpp"
/* /*
* Author: PabstMirror * Author: PabstMirror
* Reset earplugs on respawn, and then re-add if appropriate * Reset earplugs on respawn, and then re-add if appropriate.
* *
* Arguments: * Arguments:
* 0: Unit <OBJECT> * 0: Unit <OBJECT>
@ -10,29 +10,29 @@
* None * None
* *
* Example: * Example:
* [player] call ACE_hearing_fnc_handleRespawn; * player call ace_hearing_fnc_handleRespawn;
* *
* Public: No * Public: No
*/ */
// Do not add or remove earplugs if gear should be preserved
if (missionNamespace getVariable [QEGVAR(respawn,savePreDeathGear), false]) exitWith {};
params ["_unit"]; params ["_unit"];
TRACE_2("params",_unit,typeOf _unit); TRACE_2("params",_unit,typeOf _unit);
if (!local _unit) exitWith {}; //XEH should only be called on local units if (!local _unit) exitWith {}; // XEH should only be called on local units
//Do not add or remove earplugs if gear should be preserved
if (missionNamespace getVariable [QEGVAR(respawn,SavePreDeathGear), false]) exitWith {};
private _respawn = [0] call BIS_fnc_missionRespawnType; private _respawn = [0] call BIS_fnc_missionRespawnType;
//if respawn is not Group or side: // If respawn is not group or side:
if (_respawn <= 3) then { if (_respawn <= 3) then {
//Remove earplugs if they have them: // Remove earplugs if they have them:
if (_unit getVariable ["ACE_hasEarPlugsin", false]) then { if (_unit getVariable ["ACE_hasEarPlugsin", false]) then {
TRACE_1("had EarPlugs in - removing",_unit); TRACE_1("had EarPlugs in - removing",_unit);
_unit setVariable ["ACE_hasEarPlugsin", false, true]; _unit setVariable ["ACE_hasEarPlugsin", false, true];
}; };
}; };
//Re-add if they need them: // Re-add if they need them
[_unit] call FUNC(addEarPlugs); _unit call FUNC(addEarPlugs);

View File

@ -4,16 +4,17 @@
* Check if the unit has earplugs put in. * Check if the unit has earplugs put in.
* *
* Arguments: * Arguments:
* 0: Unit (player) <OBJECT> * 0: Unit <OBJECT>
* *
* Return Value: * Return Value:
* Have Earplugs in <BOOL> * Has Earplugs in <BOOL>
* *
* Example: * Example:
* [ace_player] call ace_hearing_fnc_hasEarPlugsIn * player call ace_hearing_fnc_hasEarPlugsIn
* *
* Public: No * Public: No
*/ */
params ["_unit"]; params ["_unit"];
_unit getVariable ["ACE_hasEarPlugsin", false] _unit getVariable ["ACE_hasEarPlugsin", false]

View File

@ -10,7 +10,7 @@
* None * None
* *
* Example: * Example:
* [player] call ACE_hearing_fnc_moduleHearing * player call ace_hearing_fnc_moduleHearing
* *
* Public: No * Public: No
*/ */
@ -23,6 +23,8 @@ params ["_logic"];
if ((_logic getVariable "DisableEarRinging") != -1) then { if ((_logic getVariable "DisableEarRinging") != -1) then {
[_logic, QGVAR(DisableEarRinging), "DisableEarRinging"] call EFUNC(common,readSettingFromModule); [_logic, QGVAR(DisableEarRinging), "DisableEarRinging"] call EFUNC(common,readSettingFromModule);
}; };
[_logic, QGVAR(enabledForZeusUnits), "enabledForZeusUnits"] call EFUNC(common,readSettingFromModule); [_logic, QGVAR(enabledForZeusUnits), "enabledForZeusUnits"] call EFUNC(common,readSettingFromModule);
[_logic, QGVAR(autoAddEarplugsToUnits), "autoAddEarplugsToUnits"] call EFUNC(common,readSettingFromModule); [_logic, QGVAR(autoAddEarplugsToUnits), "autoAddEarplugsToUnits"] call EFUNC(common,readSettingFromModule);
INFO("Hearing Module Initialized."); INFO("Hearing Module Initialized.");

View File

@ -1,38 +1,35 @@
#include "..\script_component.hpp" #include "..\script_component.hpp"
/* /*
* Author: Hope Johnson and commy2 * Author: Hope Johnson, commy2
* Puts in earplugs. * Puts in earplugs.
* *
* Arguments: * Arguments:
* 0: Unit (player) <OBJECT> * 0: Unit <OBJECT>
* 1: Display hint <BOOL> (default: false) * 1: Display hint <BOOL> (default: false)
* *
* Return Value: * Return Value:
* None * None
* *
* Example: * Example:
* [ace_player, false] call ace_hearing_fnc_putInEarplugs * [player, false] call ace_hearing_fnc_putInEarplugs
* *
* Public: No * Public: No
*/ */
params ["_player", ["_displayHint", false, [false]]]; if (!GVAR(enableCombatDeafness)) exitWith {};
if (!GVAR(EnableCombatDeafness)) exitWith {}; params ["_unit", ["_displayHint", false]];
// Plugs in inventory, putting them in // Plugs in inventory, putting them in
_player removeItem "ACE_EarPlugs"; _unit removeItem "ACE_EarPlugs";
_player setVariable ["ACE_hasEarPlugsIn", true, true]; _unit setVariable ["ACE_hasEarPlugsIn", true, true];
if (_displayHint) then { if (_displayHint) then {
[localize LSTRING(EarPlugs_Are_On)] call EFUNC(common,displayTextStructured); [LLSTRING(EarPlugs_Are_On)] call EFUNC(common,displayTextStructured);
}; };
//Force an immediate fast volume update: // Force an immediate volume update
[[true]] call FUNC(updateVolume); true call FUNC(updateVolume);
// No Earplugs in inventory, telling user call FUNC(updateHearingProtection);
//[localize LSTRING(NoPlugs)] call EFUNC(common,displayTextStructured);
[] call FUNC(updateHearingProtection);

View File

@ -1,39 +1,40 @@
#include "..\script_component.hpp" #include "..\script_component.hpp"
/* /*
* Author: Hope Johnson and commy2 * Author: Hope Johnson, commy2
* Takes out earplugs. * Takes out earplugs.
* *
* Arguments: * Arguments:
* 0: Unit (player) <OBJECT> * 0: Unit <OBJECT>
* 1: Display hint <BOOL> (default false) * 1: Display hint <BOOL> (default: false)
* *
* Return Value: * Return Value:
* None * None
* *
* Example: * Example:
* [ace_player, false] call ace_hearing_fnc_removeEarplugs * [player, false] call ace_hearing_fnc_removeEarplugs
* *
* Public: No * Public: No
*/ */
params ["_player", ["_displayHint", false, [false]]]; if (!GVAR(enableCombatDeafness)) exitWith {};
if (!GVAR(EnableCombatDeafness)) exitWith {}; params ["_unit", ["_displayHint", false]];
if !([_player, "ACE_EarPlugs"] call CBA_fnc_canAddItem) exitWith { // inventory full // Inventory full
if !([_unit, "ACE_EarPlugs"] call CBA_fnc_canAddItem) exitWith {
[LELSTRING(common,Inventory_Full)] call EFUNC(common,displayTextStructured); [LELSTRING(common,Inventory_Full)] call EFUNC(common,displayTextStructured);
}; };
// Plugs already in and removing them. // Plugs already in and removing them.
_player addItem "ACE_EarPlugs"; _unit addItem "ACE_EarPlugs";
_player setVariable ["ACE_hasEarPlugsIn", false, true]; _unit setVariable ["ACE_hasEarPlugsIn", false, true];
if (_displayHint) then { if (_displayHint) then {
[localize LSTRING(EarPlugs_Are_Off)] call EFUNC(common,displayTextStructured); [LLSTRING(EarPlugs_Are_Off)] call EFUNC(common,displayTextStructured);
}; };
//Force an immediate fast volume update: // Force an immediate volume update
[[true]] call FUNC(updateVolume); true call FUNC(updateVolume);
[] call FUNC(updateHearingProtection); call FUNC(updateHearingProtection);

View File

@ -1,7 +1,7 @@
#include "..\script_component.hpp" #include "..\script_component.hpp"
/* /*
* Author: PabstMirror * Author: PabstMirror
* Updates the hearing protection and volume attenuation for player on earbuds/helmet change * Updates the hearing protection and volume attenuation for player on earbuds/helmet change.
* *
* Arguments: * Arguments:
* None * None
@ -10,12 +10,12 @@
* None * None
* *
* Example: * Example:
* [] call ace_hearing_fnc_updateHearingProtection * call ace_hearing_fnc_updateHearingProtection
* *
* Public: No * Public: No
*/ */
TRACE_1("params",_this); LOG("updateHearingProtection");
if (isNull ACE_player) exitWith { if (isNull ACE_player) exitWith {
GVAR(damageCoefficent) = 0; GVAR(damageCoefficent) = 0;
@ -23,22 +23,32 @@ if (isNull ACE_player) exitWith {
}; };
// Handle Earplugs // Handle Earplugs
private _hasEarPlugsIn = [ACE_player] call FUNC(hasEarPlugsIn); private _hasEarPlugsIn = ACE_player call FUNC(hasEarPlugsIn);
GVAR(damageCoefficent) = [1, 0.25] select _hasEarPlugsIn; GVAR(damageCoefficent) = [1, 0.25] select _hasEarPlugsIn;
GVAR(volumeAttenuation) = [1, GVAR(EarplugsVolume)] select _hasEarPlugsIn; GVAR(volumeAttenuation) = [1, GVAR(earplugsVolume)] select _hasEarPlugsIn;
// Handle Headgear // Handle Headgear
if (headgear ACE_player != "") then { private _headgear = headgear ACE_player;
private _protection = getNumber (configFile >> "CfgWeapons" >> headgear ACE_player >> QGVAR(protection)) min 1;
if (_headgear != "") then {
private _heargearConfig = configFile >> "CfgWeapons" >> _headgear;
private _protection = getNumber (_heargearConfig >> QGVAR(protection)) min 1;
GVAR(damageCoefficent) = GVAR(damageCoefficent) * (1 - _protection); GVAR(damageCoefficent) = GVAR(damageCoefficent) * (1 - _protection);
private _attenuation = getNumber (configFile >> "CfgWeapons" >> headgear ACE_player >> QGVAR(lowerVolume)) min 1;
private _attenuation = getNumber (_heargearConfig >> QGVAR(lowerVolume)) min 1;
GVAR(volumeAttenuation) = GVAR(volumeAttenuation) * (1 - _attenuation); GVAR(volumeAttenuation) = GVAR(volumeAttenuation) * (1 - _attenuation);
}; };
// Handle Goggles // Handle Goggles
if (goggles ACE_player != "") then { private _goggles = goggles ACE_player;
private _protection = getNumber (configFile >> "CfgGlasses" >> goggles ACE_player >> QGVAR(protection)) min 1;
if (_goggles != "") then {
private _gogglesConfig = configFile >> "CfgGlasses" >> _goggles;
private _protection = getNumber (_gogglesConfig >> QGVAR(protection)) min 1;
GVAR(damageCoefficent) = GVAR(damageCoefficent) * (1 - _protection); GVAR(damageCoefficent) = GVAR(damageCoefficent) * (1 - _protection);
private _attenuation = getNumber (configFile >> "CfgGlasses" >> goggles ACE_player >> QGVAR(lowerVolume)) min 1;
private _attenuation = getNumber (_gogglesConfig >> QGVAR(lowerVolume)) min 1;
GVAR(volumeAttenuation) = GVAR(volumeAttenuation) * (1 - _attenuation); GVAR(volumeAttenuation) = GVAR(volumeAttenuation) * (1 - _attenuation);
}; };

View File

@ -7,10 +7,10 @@
* None * None
* *
* Return Value: * Return Value:
* Ammount that unit can hear outside <NUMBER> * Amount that unit can hear outside <NUMBER>
* *
* Example: * Example:
* [] call ace_hearing_fnc_updatePlayerVehAttenuation * call ace_hearing_fnc_updatePlayerVehAttenuation
* *
* Public: No * Public: No
*/ */
@ -20,12 +20,14 @@ private _vehicle = vehicle ACE_player;
if (isNull _vehicle) exitWith {}; if (isNull _vehicle) exitWith {};
private _newAttenuation = 1; private _newAttenuation = 1;
if (ACE_player != _vehicle) then { if (ACE_player != _vehicle) then {
private _turretPath = [ACE_player] call EFUNC(common,getTurretIndex); private _vehicleConfig = configOf _vehicle;
private _effectType = getText (configOf _vehicle >> "attenuationEffectType"); private _turretPath = _vehicle unitTurret ACE_player;
private _effectType = getText (_vehicleConfig >> "attenuationEffectType");
if (_turretPath isNotEqualTo []) then { if (_turretPath isNotEqualTo []) then {
private _turretConfig = [(configOf _vehicle), _turretPath] call EFUNC(common,getTurretConfigPath); private _turretConfig = [_vehicleConfig, _turretPath] call EFUNC(common,getTurretConfigPath);
if ((getNumber (_turretConfig >> "disableSoundAttenuation")) == 1) then { if ((getNumber (_turretConfig >> "disableSoundAttenuation")) == 1) then {
_effectType = ""; _effectType = "";
@ -40,7 +42,7 @@ if (ACE_player != _vehicle) then {
case (_effectType == ""): {1}; case (_effectType == ""): {1};
case (_effectType == "CarAttenuation"); case (_effectType == "CarAttenuation");
case (_effectType == "RHS_CarAttenuation"): { // Increase protection for armored cars case (_effectType == "RHS_CarAttenuation"): { // Increase protection for armored cars
private _armor = getNumber (configOf _vehicle >> "HitPoints" >> "HitBody" >> "armor"); private _armor = getNumber (_vehicleConfig >> "HitPoints" >> "HitBody" >> "armor");
linearConversion [2, 8, _armor, 0.5, 0.3, true];}; linearConversion [2, 8, _armor, 0.5, 0.3, true];};
case (_effectType == "OpenCarAttenuation"): {1}; case (_effectType == "OpenCarAttenuation"): {1};
case (_effectType == "TankAttenuation"): {0.1}; case (_effectType == "TankAttenuation"): {0.1};

View File

@ -1,55 +1,60 @@
#include "..\script_component.hpp" #include "..\script_component.hpp"
/* /*
* Author: commy2 and esteldunedain and Ruthberg * Author: commy2, esteldunedain, Ruthberg
* Updates and applies the current deafness. Called every 1 sec from a PFEH. * Updates and applies the current deafness. Called every 1 sec from a PFEH.
* *
* Arguments: * Arguments:
* 0: Args <ARRAY> * 0: Update volume only (skip ringing/recovery) <BOOL> (default: false)
* - 0: Just update volume (skip ringing/recovery) <BOOL> (default: false)
* *
* Return Value: * Return Value:
* None * None
* *
* Example: * Example:
* [] call ace_hearing_fnc_updateVolume * call ace_hearing_fnc_updateVolume
* *
* Public: No * Public: No
*/ */
if (!alive ACE_player) exitWith { if (!alive ACE_player) exitWith {
if (missionNameSpace getVariable [QGVAR(disableVolumeUpdate), false]) exitWith {}; if (missionNamespace getVariable [QGVAR(disableVolumeUpdate), false]) exitWith {};
TRACE_1("dead - removing hearing effects",ACE_player); TRACE_1("dead - removing hearing effects",ACE_player);
[QUOTE(ADDON), 1, true] call EFUNC(common,setHearingCapability); [QUOTE(ADDON), 1, true] call EFUNC(common,setHearingCapability);
}; };
(_this select 0) params [["_justUpdateVolume", false]]; params [["_updateVolumeOnly", false]];
GVAR(deafnessDV) = (GVAR(deafnessDV) min 20) max 0; GVAR(deafnessDV) = (GVAR(deafnessDV) min 20) max 0;
GVAR(volume) = (1 - (GVAR(deafnessDV) / 20)) max 0.05; GVAR(volume) = (1 - (GVAR(deafnessDV) / 20)) max 0.05;
TRACE_3("",GVAR(volume),GVAR(deafnessDV),GVAR(deafnessDV) - GVAR(deafnessPrior)); TRACE_3("",GVAR(volume),GVAR(deafnessDV),GVAR(deafnessDV) - GVAR(deafnessPrior));
if (!_justUpdateVolume) then { if (!_updateVolumeOnly) then {
// Ring if we got a big increase in the last second or enough accumulated damage // Ring if we got a big increase in the last second or enough accumulated damage
if (GVAR(deafnessDV) - GVAR(deafnessPrior) > 1 || if (GVAR(deafnessDV) - GVAR(deafnessPrior) > 1 ||
GVAR(deafnessDV) > 10) then { GVAR(deafnessDV) > 10) then {
if (CBA_missionTime - GVAR(time3) < 3) exitWith {}; if (CBA_missionTime - GVAR(time3) < 3) exitWith {};
GVAR(time3) = CBA_missionTime; GVAR(time3) = CBA_missionTime;
if (!isGameFocused) exitWith {}; if (!isGameFocused) exitWith {};
if (GVAR(deafnessDV) > 19.75) then { if (GVAR(deafnessDV) > 19.75) then {
playSound (["ACE_Combat_Deafness_Heavy", "ACE_Combat_Deafness_Heavy_NoRing"] select GVAR(DisableEarRinging)); playSound (["ACE_Combat_Deafness_Heavy", "ACE_Combat_Deafness_Heavy_NoRing"] select GVAR(disableEarRinging));
} else { } else {
playSound (["ACE_Combat_Deafness_Medium", "ACE_Combat_Deafness_Medium_NoRing"] select GVAR(DisableEarRinging)); playSound (["ACE_Combat_Deafness_Medium", "ACE_Combat_Deafness_Medium_NoRing"] select GVAR(disableEarRinging));
}; };
}; };
GVAR(deafnessPrior) = GVAR(deafnessDV); GVAR(deafnessPrior) = GVAR(deafnessDV);
// Hearing takes longer to return to normal after it hits rock bottom // Hearing takes longer to return to normal after it hits rock bottom
GVAR(deafnessDV) = (GVAR(deafnessDV) - (0.5 * (GVAR(volume) max 0.1))) max 0; GVAR(deafnessDV) = (GVAR(deafnessDV) - (0.5 * (GVAR(volume) max 0.1))) max 0;
}; };
if (missionNameSpace getVariable [QGVAR(disableVolumeUpdate), false]) exitWith {}; if (missionNamespace getVariable [QGVAR(disableVolumeUpdate), false]) exitWith {};
private _volume = GVAR(volume); private _volume = GVAR(volume);
@ -57,8 +62,8 @@ private _volume = GVAR(volume);
_volume = _volume min GVAR(volumeAttenuation); _volume = _volume min GVAR(volumeAttenuation);
// Reduce volume if player is unconscious // Reduce volume if player is unconscious
if (ACE_player getVariable ["ACE_isUnconscious", false]) then { if (lifeState ACE_player == "INCAPACITATED") then {
_volume = _volume min GVAR(UnconsciousnessVolume); _volume = _volume min GVAR(unconsciousnessVolume);
}; };
[QUOTE(ADDON), _volume, true] call EFUNC(common,setHearingCapability); [QUOTE(ADDON), _volume, true] call EFUNC(common,setHearingCapability);

View File

@ -2,14 +2,17 @@
// Conditions: specific // Conditions: specific
if !([ACE_player, objNull, ["isNotSwimming", "isNotInside", "isNotSitting"]] call EFUNC(common,canInteractWith)) exitWith {false}; if !([ACE_player, objNull, ["isNotSwimming", "isNotInside", "isNotSitting"]] call EFUNC(common,canInteractWith)) exitWith {false};
if (GVAR(EnableCombatDeafness) && {!([ACE_player] call FUNC(hasEarPlugsIn))} && {[ACE_player, "ACE_EarPlugs"] call EFUNC(common,hasItem)}) exitWith { if (GVAR(enableCombatDeafness) && {!(ACE_player call FUNC(hasEarPlugsIn))} && {[ACE_player, "ACE_EarPlugs"] call EFUNC(common,hasItem)}) exitWith {
[ACE_player, true] call FUNC(putInEarPlugs); [ACE_player, true] call FUNC(putInEarPlugs);
true
}; true // return
if (GVAR(EnableCombatDeafness) && {[ACE_player] call FUNC(hasEarPlugsIn)}) exitWith {
[ACE_player, true] call FUNC(removeEarPlugs);
true
}; };
false if (GVAR(enableCombatDeafness) && {ACE_player call FUNC(hasEarPlugsIn)}) exitWith {
[ACE_player, true] call FUNC(removeEarPlugs);
true // return
};
false // return
}] call CBA_fnc_addKeybind; // UNBOUND }] call CBA_fnc_addKeybind; // UNBOUND

View File

@ -1,7 +1,8 @@
private _category = format ["ACE %1", localize LSTRING(Module_DisplayName)]; private _category = format ["ACE %1", LLSTRING(Module_DisplayName)];
[ [
QGVAR(enableCombatDeafness), "CHECKBOX", QGVAR(enableCombatDeafness),
"CHECKBOX",
[LSTRING(EnableCombatDeafness_DisplayName), LSTRING(EnableCombatDeafness_Description)], [LSTRING(EnableCombatDeafness_DisplayName), LSTRING(EnableCombatDeafness_Description)],
_category, _category,
true, true,
@ -11,7 +12,8 @@ private _category = format ["ACE %1", localize LSTRING(Module_DisplayName)];
] call CBA_fnc_addSetting; ] call CBA_fnc_addSetting;
[ [
QGVAR(earplugsVolume), "SLIDER", QGVAR(earplugsVolume),
"SLIDER",
[LSTRING(earplugsVolume_DisplayName), LSTRING(earplugsVolume_Description)], [LSTRING(earplugsVolume_DisplayName), LSTRING(earplugsVolume_Description)],
_category, _category,
[0, 1, 0.5, 1], [0, 1, 0.5, 1],
@ -19,7 +21,8 @@ private _category = format ["ACE %1", localize LSTRING(Module_DisplayName)];
] call CBA_fnc_addSetting; ] call CBA_fnc_addSetting;
[ [
QGVAR(unconsciousnessVolume), "SLIDER", QGVAR(unconsciousnessVolume),
"SLIDER",
[LSTRING(unconsciousnessVolume_DisplayName), LSTRING(unconsciousnessVolume_Description)], [LSTRING(unconsciousnessVolume_DisplayName), LSTRING(unconsciousnessVolume_Description)],
_category, _category,
[0, 1, 0.4, 1], [0, 1, 0.4, 1],
@ -27,15 +30,16 @@ private _category = format ["ACE %1", localize LSTRING(Module_DisplayName)];
] call CBA_fnc_addSetting; ] call CBA_fnc_addSetting;
[ [
QGVAR(disableEarRinging), "CHECKBOX", QGVAR(disableEarRinging),
"CHECKBOX",
[LSTRING(DisableEarRinging_DisplayName), LSTRING(DisableEarRinging_Description)], [LSTRING(DisableEarRinging_DisplayName), LSTRING(DisableEarRinging_Description)],
_category, _category,
false, false
0
] call CBA_fnc_addSetting; ] call CBA_fnc_addSetting;
[ [
QGVAR(enabledForZeusUnits), "CHECKBOX", QGVAR(enabledForZeusUnits),
"CHECKBOX",
[LSTRING(enabledForZeusUnits_DisplayName), LSTRING(enabledForZeusUnits_Description)], [LSTRING(enabledForZeusUnits_DisplayName), LSTRING(enabledForZeusUnits_Description)],
_category, _category,
true, true,
@ -43,7 +47,8 @@ private _category = format ["ACE %1", localize LSTRING(Module_DisplayName)];
] call CBA_fnc_addSetting; ] call CBA_fnc_addSetting;
[ [
QGVAR(autoAddEarplugsToUnits), "LIST", QGVAR(autoAddEarplugsToUnits),
"LIST",
[LSTRING(autoAddEarplugsToUnits_DisplayName), LSTRING(autoAddEarplugsToUnits_Description)], [LSTRING(autoAddEarplugsToUnits_DisplayName), LSTRING(autoAddEarplugsToUnits_Description)],
_category, _category,
[[0, 1, 2], [ELSTRING(common,Disabled), LSTRING(heavyWeaponUnits), ELSTRING(common,Enabled)], 1], [[0, 1, 2], [ELSTRING(common,Disabled), LSTRING(heavyWeaponUnits), ELSTRING(common,Enabled)], 1],