diff --git a/TO_MERGE/cse/sys_combatdeaf/CfgFunctions.h b/TO_MERGE/cse/sys_combatdeaf/CfgFunctions.h new file mode 100644 index 0000000000..e5c097e69c --- /dev/null +++ b/TO_MERGE/cse/sys_combatdeaf/CfgFunctions.h @@ -0,0 +1,18 @@ +class CfgFunctions { + class CSE { + class combatdeaf { + file = "cse\cse_sys_combatdeaf\functions"; + class handleFiredNear_DEAF { recompile = 1; }; + class handleFired_DEAF { recompile = 1; }; + class getAttenuation_DEAF { recompile = 1; }; + class applyEletronicEarProtection_DEAF { recompile = 1; }; + class explosion_DEAF { recompile = 1; }; + class handlePressureWave_DEAF { recompile = 1; }; + class getIn_DEAF { recompile = 1; }; + class getOut_DEAF { recompile = 1; }; + class register_ear_protection_actions_DEAF { recompile = 1; }; + class getMuzzleAccessory_DEAF { recompile = 1; }; + class hasMuzzleAccessory_DEAF { recompile = 1; }; + }; + }; +}; \ No newline at end of file diff --git a/TO_MERGE/cse/sys_combatdeaf/CfgSounds.h b/TO_MERGE/cse/sys_combatdeaf/CfgSounds.h new file mode 100644 index 0000000000..6230b98a63 --- /dev/null +++ b/TO_MERGE/cse/sys_combatdeaf/CfgSounds.h @@ -0,0 +1,9 @@ +class CfgSounds +{ + class cse_combatdeaf_ear_ringing + { + name="cse_combatdeaf_ear_ringing"; + sound[]={"\cse\cse_sys_combatdeaf\sound\ear_ringing.ogg",1,1}; + titles[]={}; + }; +}; \ No newline at end of file diff --git a/TO_MERGE/cse/sys_combatdeaf/CfgVehicles.h b/TO_MERGE/cse/sys_combatdeaf/CfgVehicles.h new file mode 100644 index 0000000000..c844679424 --- /dev/null +++ b/TO_MERGE/cse/sys_combatdeaf/CfgVehicles.h @@ -0,0 +1,85 @@ +class CfgVehicles { + class Logic; + class Module_F: Logic { + class ArgumentsBaseUnits { + }; + }; + class cse_sys_combatdeaf: Module_F { + scope = 2; + displayName = "Combat Deafness [CSE]"; + icon = "\cse\cse_main\data\cse_earmuffs_module.paa"; + category = "cseModules"; + function = "cse_fnc_initalizeModule_F"; + functionPriority = 1; + isGlobal = 1; + isTriggerActivated = 0; + class Arguments { + class DEAFNESS_EFFECT_INTENSITY { + displayName = "Deafness effect intensity"; + description = "Allows to tune down the deafness effect (2.0 - dual intensity, 1.0 - default intensity, 0.5 - half intensity)"; + typeName = "NUMBER"; + defaultValue = 1; + }; + class DISABLE_EAR_RINGING { + displayName = "Disable ear ringing"; + description = "Disables the ear ringing effect"; + typeName = "BOOL"; + defaultValue = 0; + }; + }; + class ModuleDescription { + description = "Combat deafness"; + }; + }; + + class Item_Base_F; + class cse_earplugsItem: Item_Base_F + { + scope = 2; + scopeCurator = 2; + displayName = "Earplugs"; + author = "Combat Space Enhancement"; + vehicleClass = "Items"; + class TransportItems + { + class cse_earplugs + { + name = "cse_earplugs"; + count = 1; + }; + }; + }; + class cse_earplugs_electronicItem: cse_earplugsItem + { + class TransportItems + { + class cse_earplugs_electronic + { + name = "cse_earplugs_electronic"; + count = 1; + }; + }; + }; + + class NATO_Box_Base; + class cse_crateCombatDeafness: NATO_Box_Base + { + scope = 2; + displayName = "Earplugs Crate [CSE]"; + author = "Combat Space Enhancement"; + model = "\A3\weapons_F\AmmoBoxes\AmmoBox_F"; + class TransportWeapons + { + class _xx_cse_earplugs + { + weapon="cse_earplugs"; + count=50; + }; + class _xx_cse_earplugs_electronic + { + weapon="cse_earplugs_electronic"; + count=10; + }; + }; + }; +}; diff --git a/TO_MERGE/cse/sys_combatdeaf/CfgWeapons.h b/TO_MERGE/cse/sys_combatdeaf/CfgWeapons.h new file mode 100644 index 0000000000..e7568824b0 --- /dev/null +++ b/TO_MERGE/cse/sys_combatdeaf/CfgWeapons.h @@ -0,0 +1,27 @@ +class CfgWeapons { + class ItemCore; + class InventoryItem_Base_F; + class cse_earplugs: ItemCore + { + scope=2; + value = 1; + count = 1; + type = 16; + displayName="Earplugs"; + model="\cse\cse_sys_combatdeaf\equipment\earplugs_simple.p3d"; + picture="\cse\cse_sys_combatdeaf\equipment\icons\earplugs_simple_icon.paa"; + descriptionShort="Earplugs"; + class ItemInfo: InventoryItem_Base_F + { + mass=0.01; + type=201; + }; + }; + class cse_earplugs_electronic: cse_earplugs + { + displayName="Electronic earplugs"; + model="\cse\cse_sys_combatdeaf\equipment\earplugs_electronic.p3d"; + picture="\cse\cse_sys_combatdeaf\equipment\icons\earplugs_electronic_icon.paa"; + descriptionShort="Eletronic earplugs"; + }; +}; \ No newline at end of file diff --git a/TO_MERGE/cse/sys_combatdeaf/Combat_Space_Enhancement.h b/TO_MERGE/cse/sys_combatdeaf/Combat_Space_Enhancement.h new file mode 100644 index 0000000000..3efadef3bd --- /dev/null +++ b/TO_MERGE/cse/sys_combatdeaf/Combat_Space_Enhancement.h @@ -0,0 +1,14 @@ +class Combat_Space_Enhancement { + class CfgModules { + class cse_sys_combatdeaf { + init = "call compile preprocessFile 'cse\cse_sys_combatdeaf\init_sys_combatdeaf.sqf';"; + name = "Combat Deafness"; + class EventHandlers { + class AllVehicles { + GetIn = "call cse_fnc_getIn_DEAF; false"; + GetOut = "call cse_fnc_getOut_DEAF; false"; + }; + }; + }; + }; +}; \ No newline at end of file diff --git a/TO_MERGE/cse/sys_combatdeaf/config.cpp b/TO_MERGE/cse/sys_combatdeaf/config.cpp new file mode 100644 index 0000000000..372d5fa9ae --- /dev/null +++ b/TO_MERGE/cse/sys_combatdeaf/config.cpp @@ -0,0 +1,26 @@ +class CfgPatches { + class cse_sys_combatdeaf { + units[] = {"cse_crateCombatDeafness", "cse_earplugsItem", "cse_earplugs_electronicItem"}; + weapons[] = {}; + requiredVersion = 1.0; + requiredAddons[] = {"cse_f_eh","cse_main"}; + versionDesc = "CSE Combat Deafness"; + version = "0.10.0_rc"; + author[] = {"Combat Space Enhancement"}; + authorUrl = "http://csemod.com"; + }; +}; + +class cse_sys_combatdeaf { + class PreloadAddons { + class cse_sys_combatdeaf { + list[] = {"cse_sys_combatdeaf"}; + }; + }; +}; + +#include "CfgVehicles.h" +#include "CfgWeapons.h" +#include "CfgSounds.h" +#include "CfgFunctions.h" +#include "Combat_Space_Enhancement.h" \ No newline at end of file diff --git a/TO_MERGE/cse/sys_combatdeaf/data/cse_combatdeaf_deafness.paa b/TO_MERGE/cse/sys_combatdeaf/data/cse_combatdeaf_deafness.paa new file mode 100644 index 0000000000..8cd1069a64 Binary files /dev/null and b/TO_MERGE/cse/sys_combatdeaf/data/cse_combatdeaf_deafness.paa differ diff --git a/TO_MERGE/cse/sys_combatdeaf/equipment/data/earplugs_electronic.rvmat b/TO_MERGE/cse/sys_combatdeaf/equipment/data/earplugs_electronic.rvmat new file mode 100644 index 0000000000..5743771bbe --- /dev/null +++ b/TO_MERGE/cse/sys_combatdeaf/equipment/data/earplugs_electronic.rvmat @@ -0,0 +1,92 @@ +ambient[]={1.000000,1.000000,1.000000,1.000000}; +diffuse[]={1.000000,1.000000,1.000000,1.000000}; +forcedDiffuse[]={0.000000,0.000000,0.000000,0.000000}; +emmisive[]={0.000000,0.000000,0.000000,1.000000}; +specular[]={0.703999,0.703999,0.703999,0.000000}; +specularPower=70.000000; +PixelShaderID="Super"; +VertexShaderID="Super"; +class Stage1 +{ + texture="cse\cse_sys_combatdeaf\equipment\data\earplugs_electronic_nohq.paa"; + uvSource="tex"; + class uvTransform + { + aside[]={1.000000,0.000000,0.000000}; + up[]={0.000000,1.000000,0.000000}; + dir[]={0.000000,0.000000,0.000000}; + pos[]={0.000000,0.000000,0.000000}; + }; +}; +class Stage2 +{ + texture="#(argb,8,8,3)color(0.5,0.5,0.5,1,DT)"; + uvSource="tex"; + class uvTransform + { + aside[]={1.000000,0.000000,0.000000}; + up[]={0.000000,1.000000,0.000000}; + dir[]={0.000000,0.000000,0.000000}; + pos[]={0.000000,0.000000,0.000000}; + }; +}; +class Stage3 +{ + texture="#(argb,8,8,3)color(0,0,0,0,MC)"; + uvSource="tex"; + class uvTransform + { + aside[]={1.000000,0.000000,0.000000}; + up[]={0.000000,1.000000,0.000000}; + dir[]={0.000000,0.000000,0.000000}; + pos[]={0.000000,0.000000,0.000000}; + }; +}; +class Stage4 +{ + texture="#(argb,8,8,3)color(1,1,1,1,AS)"; + uvSource="tex"; + class uvTransform + { + aside[]={1.000000,0.000000,0.000000}; + up[]={0.000000,1.000000,0.000000}; + dir[]={0.000000,0.000000,0.000000}; + pos[]={0.000000,0.000000,0.000000}; + }; +}; +class Stage5 +{ + texture="#(argb,8,8,3)color(0,0.05,1,1,SMDI)"; + uvSource="tex"; + class uvTransform + { + aside[]={1.000000,0.000000,0.000000}; + up[]={0.000000,1.000000,0.000000}; + dir[]={0.000000,0.000000,0.000000}; + pos[]={0.000000,0.000000,0.000000}; + }; +}; +class Stage6 +{ + texture="#(ai,32,128,1)fresnel(0.98,1.02)"; + uvSource="tex"; + class uvTransform + { + aside[]={1.000000,0.000000,0.000000}; + up[]={0.000000,1.000000,0.000000}; + dir[]={0.000000,0.000000,0.000000}; + pos[]={0.000000,0.000000,0.000000}; + }; +}; +class Stage7 +{ + texture="cse\cse_sys_medical\equipment\data\env_co.tga"; + uvSource="tex"; + class uvTransform + { + aside[]={1.000000,0.000000,0.000000}; + up[]={0.000000,1.000000,0.000000}; + dir[]={0.000000,0.000000,0.000000}; + pos[]={0.000000,0.000000,0.000000}; + }; +}; diff --git a/TO_MERGE/cse/sys_combatdeaf/equipment/data/earplugs_electronic_co.paa b/TO_MERGE/cse/sys_combatdeaf/equipment/data/earplugs_electronic_co.paa new file mode 100644 index 0000000000..5a8aa676b4 Binary files /dev/null and b/TO_MERGE/cse/sys_combatdeaf/equipment/data/earplugs_electronic_co.paa differ diff --git a/TO_MERGE/cse/sys_combatdeaf/equipment/data/earplugs_electronic_nohq.paa b/TO_MERGE/cse/sys_combatdeaf/equipment/data/earplugs_electronic_nohq.paa new file mode 100644 index 0000000000..4d29071c01 Binary files /dev/null and b/TO_MERGE/cse/sys_combatdeaf/equipment/data/earplugs_electronic_nohq.paa differ diff --git a/TO_MERGE/cse/sys_combatdeaf/equipment/data/earplugs_simple.rvmat b/TO_MERGE/cse/sys_combatdeaf/equipment/data/earplugs_simple.rvmat new file mode 100644 index 0000000000..deb96f14e8 --- /dev/null +++ b/TO_MERGE/cse/sys_combatdeaf/equipment/data/earplugs_simple.rvmat @@ -0,0 +1,92 @@ +ambient[]={1.000000,1.000000,1.000000,1.000000}; +diffuse[]={1.000000,1.000000,1.000000,1.000000}; +forcedDiffuse[]={0.000000,0.000000,0.000000,0.000000}; +emmisive[]={0.000000,0.000000,0.000000,1.000000}; +specular[]={0.703999,0.703999,0.703999,0.000000}; +specularPower=70.000000; +PixelShaderID="Super"; +VertexShaderID="Super"; +class Stage1 +{ + texture="cse\cse_sys_combatdeaf\equipment\data\earplugs_simple_nohq.paa"; + uvSource="tex"; + class uvTransform + { + aside[]={1.000000,0.000000,0.000000}; + up[]={0.000000,1.000000,0.000000}; + dir[]={0.000000,0.000000,0.000000}; + pos[]={0.000000,0.000000,0.000000}; + }; +}; +class Stage2 +{ + texture="#(argb,8,8,3)color(0.5,0.5,0.5,1,DT)"; + uvSource="tex"; + class uvTransform + { + aside[]={1.000000,0.000000,0.000000}; + up[]={0.000000,1.000000,0.000000}; + dir[]={0.000000,0.000000,0.000000}; + pos[]={0.000000,0.000000,0.000000}; + }; +}; +class Stage3 +{ + texture="#(argb,8,8,3)color(0,0,0,0,MC)"; + uvSource="tex"; + class uvTransform + { + aside[]={1.000000,0.000000,0.000000}; + up[]={0.000000,1.000000,0.000000}; + dir[]={0.000000,0.000000,0.000000}; + pos[]={0.000000,0.000000,0.000000}; + }; +}; +class Stage4 +{ + texture="#(argb,8,8,3)color(1,1,1,1,AS)"; + uvSource="tex"; + class uvTransform + { + aside[]={1.000000,0.000000,0.000000}; + up[]={0.000000,1.000000,0.000000}; + dir[]={0.000000,0.000000,0.000000}; + pos[]={0.000000,0.000000,0.000000}; + }; +}; +class Stage5 +{ + texture="#(argb,8,8,3)color(0,0.05,1,1,SMDI)"; + uvSource="tex"; + class uvTransform + { + aside[]={1.000000,0.000000,0.000000}; + up[]={0.000000,1.000000,0.000000}; + dir[]={0.000000,0.000000,0.000000}; + pos[]={0.000000,0.000000,0.000000}; + }; +}; +class Stage6 +{ + texture="#(ai,32,128,1)fresnel(0.98,1.02)"; + uvSource="tex"; + class uvTransform + { + aside[]={1.000000,0.000000,0.000000}; + up[]={0.000000,1.000000,0.000000}; + dir[]={0.000000,0.000000,0.000000}; + pos[]={0.000000,0.000000,0.000000}; + }; +}; +class Stage7 +{ + texture="cse\cse_sys_medical\equipment\data\env_co.tga"; + uvSource="tex"; + class uvTransform + { + aside[]={1.000000,0.000000,0.000000}; + up[]={0.000000,1.000000,0.000000}; + dir[]={0.000000,0.000000,0.000000}; + pos[]={0.000000,0.000000,0.000000}; + }; +}; diff --git a/TO_MERGE/cse/sys_combatdeaf/equipment/data/earplugs_simple_co.paa b/TO_MERGE/cse/sys_combatdeaf/equipment/data/earplugs_simple_co.paa new file mode 100644 index 0000000000..bd7904b497 Binary files /dev/null and b/TO_MERGE/cse/sys_combatdeaf/equipment/data/earplugs_simple_co.paa differ diff --git a/TO_MERGE/cse/sys_combatdeaf/equipment/data/earplugs_simple_nohq.paa b/TO_MERGE/cse/sys_combatdeaf/equipment/data/earplugs_simple_nohq.paa new file mode 100644 index 0000000000..1e4d3ea283 Binary files /dev/null and b/TO_MERGE/cse/sys_combatdeaf/equipment/data/earplugs_simple_nohq.paa differ diff --git a/TO_MERGE/cse/sys_combatdeaf/equipment/earplugs_electronic.p3d b/TO_MERGE/cse/sys_combatdeaf/equipment/earplugs_electronic.p3d new file mode 100644 index 0000000000..4020a0e801 Binary files /dev/null and b/TO_MERGE/cse/sys_combatdeaf/equipment/earplugs_electronic.p3d differ diff --git a/TO_MERGE/cse/sys_combatdeaf/equipment/earplugs_simple.p3d b/TO_MERGE/cse/sys_combatdeaf/equipment/earplugs_simple.p3d new file mode 100644 index 0000000000..472c83259f Binary files /dev/null and b/TO_MERGE/cse/sys_combatdeaf/equipment/earplugs_simple.p3d differ diff --git a/TO_MERGE/cse/sys_combatdeaf/equipment/icons/earplugs_electronic_icon.paa b/TO_MERGE/cse/sys_combatdeaf/equipment/icons/earplugs_electronic_icon.paa new file mode 100644 index 0000000000..f401554c5d Binary files /dev/null and b/TO_MERGE/cse/sys_combatdeaf/equipment/icons/earplugs_electronic_icon.paa differ diff --git a/TO_MERGE/cse/sys_combatdeaf/equipment/icons/earplugs_simple_icon.paa b/TO_MERGE/cse/sys_combatdeaf/equipment/icons/earplugs_simple_icon.paa new file mode 100644 index 0000000000..30154b3e5b Binary files /dev/null and b/TO_MERGE/cse/sys_combatdeaf/equipment/icons/earplugs_simple_icon.paa differ diff --git a/TO_MERGE/cse/sys_combatdeaf/functions/defines.h b/TO_MERGE/cse/sys_combatdeaf/functions/defines.h new file mode 100644 index 0000000000..8ee75925fc --- /dev/null +++ b/TO_MERGE/cse/sys_combatdeaf/functions/defines.h @@ -0,0 +1,4 @@ +#define EARPLUGS_ID 18312 +#define NO_EARPLUGS 0 +#define STANDARD_EARPLUGS 1 +#define ELECTRONIC_EARPLUGS 2 \ No newline at end of file diff --git a/TO_MERGE/cse/sys_combatdeaf/functions/fn_applyEletronicEarProtection_DEAF.sqf b/TO_MERGE/cse/sys_combatdeaf/functions/fn_applyEletronicEarProtection_DEAF.sqf new file mode 100644 index 0000000000..0022ac97f1 --- /dev/null +++ b/TO_MERGE/cse/sys_combatdeaf/functions/fn_applyEletronicEarProtection_DEAF.sqf @@ -0,0 +1,34 @@ +#include "defines.h" + +private ["_audibleFire", "_attenuation", "_totalAttenuation", "_ID"]; +_audibleFire = _this; + +if (_audibleFire < 1) exitWith {}; + +_totalAttenuation = 1; + +if (_audibleFire > 1) then { + // TODO: Use a headgear config entry instead + if (headgear player == "H_Cap_headphones") then { + _attenuation = 0.25 max (1 / _audibleFire) min 1; // max. -20 dB + _totalAttenuation = _totalAttenuation * _attenuation; + _audibleFire = _audibleFire * _attenuation; + }; +}; + +if (_audibleFire > 1) then { + if (player getVariable ["cse_combatdeaf_earplugs", NO_EARPLUGS] == ELECTRONIC_EARPLUGS) then { + _attenuation = 0.125 max (1 / _audibleFire) min 1; // max. -30 dB + _totalAttenuation = _totalAttenuation * _attenuation; + _audibleFire = _audibleFire * _attenuation; + }; +}; + +if (_totalAttenuation < 1) then { + _ID = floor(random 1000000); + [format["electronicHearingProtection_%1", _ID], _totalAttenuation, true] call cse_fnc_setHearingCapability; + _ID spawn { + sleep 2; + [format["electronicHearingProtection_%1", _this], 1, false] call cse_fnc_setHearingCapability; + }; +}; diff --git a/TO_MERGE/cse/sys_combatdeaf/functions/fn_explosion_DEAF.sqf b/TO_MERGE/cse/sys_combatdeaf/functions/fn_explosion_DEAF.sqf new file mode 100644 index 0000000000..b7a85bcad9 --- /dev/null +++ b/TO_MERGE/cse/sys_combatdeaf/functions/fn_explosion_DEAF.sqf @@ -0,0 +1,8 @@ +private ["_unit", "_damage", "_attenuation", "_sp"]; +_unit = _this select 0; +_damage = _this select 1; + +_attenuation = player call cse_fnc_getAttenuation_DEAF; + +_sp = _attenuation * _damage * 500; +_sp call cse_fnc_handlePressureWave_DEAF; diff --git a/TO_MERGE/cse/sys_combatdeaf/functions/fn_getAttenuation_DEAF.sqf b/TO_MERGE/cse/sys_combatdeaf/functions/fn_getAttenuation_DEAF.sqf new file mode 100644 index 0000000000..c440e1e1f9 --- /dev/null +++ b/TO_MERGE/cse/sys_combatdeaf/functions/fn_getAttenuation_DEAF.sqf @@ -0,0 +1,16 @@ +#include "defines.h" + +private ["_unit", "_attenuation"]; +_unit = _this; + +_attenuation = 1; + +if (player getVariable ["cse_combatdeaf_earplugs", NO_EARPLUGS] != NO_EARPLUGS) then { + _attenuation = _attenuation * 0.125; // -30 dB +}; +// TODO: Use a headgear config entry instead +if (headgear player == "H_Cap_headphones") then { + _attenuation = _attenuation * 0.25; // -20 dB +}; + +_attenuation diff --git a/TO_MERGE/cse/sys_combatdeaf/functions/fn_getIn_DEAF.sqf b/TO_MERGE/cse/sys_combatdeaf/functions/fn_getIn_DEAF.sqf new file mode 100644 index 0000000000..55173940c9 --- /dev/null +++ b/TO_MERGE/cse/sys_combatdeaf/functions/fn_getIn_DEAF.sqf @@ -0,0 +1,9 @@ +private ["_vehicle", "_position", "_unit", "_handle"]; +_vehicle = _this select 0; +_position = _this select 1; +_unit = _this select 2; + +if (_unit != player) exitWith {}; +_handle = _vehicle addEventHandler ["Fired", {_this call cse_fnc_handleFired_DEAF}]; + +_vehicle setVariable ["cse_combat_deaf_fired_event_handler", _handle]; diff --git a/TO_MERGE/cse/sys_combatdeaf/functions/fn_getMuzzleAccessory_DEAF.sqf b/TO_MERGE/cse/sys_combatdeaf/functions/fn_getMuzzleAccessory_DEAF.sqf new file mode 100644 index 0000000000..01f70f32e5 --- /dev/null +++ b/TO_MERGE/cse/sys_combatdeaf/functions/fn_getMuzzleAccessory_DEAF.sqf @@ -0,0 +1,20 @@ +/** + * fn_getMuzzleAccessory_DEAF.sqf + * @Descr: N/A Throws exception NO_WEAPON_UNIT + * @Author: Glowbal + * + * @Arguments: [unit OBJECT] + * @Return: STRING classname. Empty string if no assescory for Muzzle + * @PublicAPI: false + */ + + private ["_unit"]; +_unit = _this select 0; +_accessories = [_unit] call cse_fnc_getWeaponItems_F; +_items = switch (currentWeapon _unit) do { + case (primaryWeapon _unit): { _accessories select 0 }; + case (secondaryWeapon _unit): { _accessories select 1 }; + case (handgunWeapon _unit): { _accessories select 2 }; + default { throw "NO_WEAPON_UNIT"; }; +}; +(_items select 0); \ No newline at end of file diff --git a/TO_MERGE/cse/sys_combatdeaf/functions/fn_getOut_DEAF.sqf b/TO_MERGE/cse/sys_combatdeaf/functions/fn_getOut_DEAF.sqf new file mode 100644 index 0000000000..8345953097 --- /dev/null +++ b/TO_MERGE/cse/sys_combatdeaf/functions/fn_getOut_DEAF.sqf @@ -0,0 +1,12 @@ +private ["_vehicle", "_position", "_unit", "_handle"]; +_vehicle = _this select 0; +_position = _this select 1; +_unit = _this select 2; + +if (_unit != player) exitWith {}; +_handle = _vehicle getVariable "cse_combat_deaf_fired_event_handler"; + +if (!isNil "_handle") then { + _vehicle removeEventHandler ["Fired", _handle]; + _vehicle setVariable ["cse_combat_deaf_fired_event_handler", nil]; +}; diff --git a/TO_MERGE/cse/sys_combatdeaf/functions/fn_handleFiredNear_DEAF.sqf b/TO_MERGE/cse/sys_combatdeaf/functions/fn_handleFiredNear_DEAF.sqf new file mode 100644 index 0000000000..984fba7f55 --- /dev/null +++ b/TO_MERGE/cse/sys_combatdeaf/functions/fn_handleFiredNear_DEAF.sqf @@ -0,0 +1,85 @@ +/** + * fn_handleFiredNear_DEAF.sqf + * @Descr: N/A + * @Author: Ruthberg + * + * @Arguments: [] + * @Return: + * @PublicAPI: false + */ + +#define MAX_DISTANCE 10 +#define BLUR_DELAY 0.1 +#define SPEED_OF_SOUND 340.29 + +private ["_unit", "_firer", "_distance", "_weapon", "_ammo", "_pressureRatio", "_audibleFire", "_audibleFireToSPL", "_audibleFireDistanceCorrected", "_accessoryConfig", "_sp"]; +_unit = _this select 0; +_firer = _this select 1; +_distance = _this select 2; +_weapon = _this select 3; +_ammo = _this select 6; + +if (_distance > MAX_DISTANCE) exitWith {}; +if (_weapon in ["Throw", "Put"]) exitWith {}; +if (getNumber (configFile >> "CfgWeapons" >> _weapon >> "type") == 0) exitWith { + [format["Weapon type was 0. Exiting (%1)", _weapon]] call cse_fnc_debug; +}; + +_pressureRatio = 1 / 3; +if ([_unit] call cse_fnc_isInBuilding && [_firer] call cse_fnc_isInBuilding) then { + _pressureRatio = 1.0; +} else { + if (_unit != _firer) then { + // calculate direction deviation (shotdirection - (firer -> unit direction)) + _shotDirection = _firer weaponDirection currentWeapon _firer; + _hearerDirection = (getPosASL _firer) vectorFromTo (getPosASL _unit); + _cosOfAngle = _shotDirection vectorCos _hearerDirection; // -1 .. +1 + _pressureRatio = (1 / 3) * (2 + _cosOfAngle); // 0.333 .. 1 + if (lineIntersects [eyePos _firer, eyePos _unit, _firer, _unit]) then { + _pressureRatio = _pressureRatio / 2; + }; + }; +}; + +try { + _audibleFire = getNumber(configFile >> "CfgAmmo" >> _ammo >> "audibleFire"); + _accessoryConfig = (configFile >> "CfgWeapons" >> ([_firer] call cse_fnc_getMuzzleAccessory_DEAF)); + if (isClass _accessoryConfig) then { + _audibleFire = (getNumber (_accessoryConfig >> "ItemInfo" >> "AmmoCoef" >> "audibleFire")) * _audibleFire; + }; + + _distance = 1 max _distance; + _audibleFireToSPL = abs(10 * log(1 / (4 * PI * _distance^2))); + _audibleFireDistanceCorrected = 0 max (_audibleFire / 2^(_audibleFireToSPL / 10)); + _sp = _pressureRatio * (_unit call cse_fnc_getAttenuation_DEAF) * _audibleFireDistanceCorrected / 3; + hintSilent format["%1, %2, %3, %4, %5, %6", _distance, _pressureRatio, (_unit call cse_fnc_getAttenuation_DEAF), _sp, _audibleFire, _audibleFireDistanceCorrected]; + + _sp call cse_fnc_handlePressureWave_DEAF; + _audibleFireDistanceCorrected call cse_fnc_applyEletronicEarProtection_DEAF; + + if (_sp > 1 && goggles _unit == "" && _unit != _firer) then { + [_distance, _sp] spawn { + private ["_distance", "_blur"]; + _distance = _this select 0; + _blur = (sqrt(_this select 1) / 5) min 2; + sleep (_distance / SPEED_OF_SOUND); + cse_sys_combatdeaf_blurEffect ppEffectEnable true; + cse_sys_combatdeaf_blurEffect ppEffectAdjust [_blur / (_distance^2)]; + cse_sys_combatdeaf_blurEffect ppEffectCommit BLUR_DELAY; + sleep BLUR_DELAY; + for "_i" from floor(_distance) to MAX_DISTANCE do { + cse_sys_combatdeaf_blurEffect ppEffectAdjust [_blur * (MAX_DISTANCE - _i)]; + cse_sys_combatdeaf_blurEffect ppEffectCommit (_blur * (BLUR_DELAY / 2)); + sleep (_blur * (BLUR_DELAY / 2)); + }; + cse_sys_combatdeaf_blurEffect ppEffectEnable false; + }; + }; +}catch { + // This should never happen. + if (_exception == "NO_WEAPON_UNIT") then { + [format["Unit (%1) that fired has no weapon. Cannot retrieve silencer accessory", _firer]] call cse_fnc_debug; + } else { + [_exception] call cse_fnc_debug; + }; +}; \ No newline at end of file diff --git a/TO_MERGE/cse/sys_combatdeaf/functions/fn_handleFired_DEAF.sqf b/TO_MERGE/cse/sys_combatdeaf/functions/fn_handleFired_DEAF.sqf new file mode 100644 index 0000000000..4d07b1fccb --- /dev/null +++ b/TO_MERGE/cse/sys_combatdeaf/functions/fn_handleFired_DEAF.sqf @@ -0,0 +1,8 @@ +private ["_unit", "_weapon", "_muzzle", "_mode", "_ammo"]; +_unit = _this select 0; +_weapon = _this select 1; +_muzzle = _this select 2; +_mode = _this select 3; +_ammo = _this select 4; + +[_unit, _unit, 0, _weapon, _muzzle, _mode, _ammo] call cse_fnc_handleFiredNear_DEAF; diff --git a/TO_MERGE/cse/sys_combatdeaf/functions/fn_handlePressureWave_DEAF.sqf b/TO_MERGE/cse/sys_combatdeaf/functions/fn_handlePressureWave_DEAF.sqf new file mode 100644 index 0000000000..32324b6ce8 --- /dev/null +++ b/TO_MERGE/cse/sys_combatdeaf/functions/fn_handlePressureWave_DEAF.sqf @@ -0,0 +1,46 @@ +#define PAIN_THRESHOLD 5 +#define DAMAGE_THRESHOLD 40 +#define HEARING_CAPABILITY_MAP_ID 1713 + +private ["_sp", "_deafness"]; +_sp = _this; + +if !(alive player) exitWith {}; + +if (_sp > 0.5 && cse_DeafnessIntensity > 0.0) then { + _deafness = ((player getVariable ["cse_combatdeaf_deafness", 0]) + _sp) min (DAMAGE_THRESHOLD / cse_DeafnessIntensity); + player setVariable ["cse_combatdeaf_deafness", _deafness, false]; + + if (!cse_sys_combatdeaf_deafness_running) then { + [] spawn { + private ["_deafness", "_ringing", "_ringingStart", "_img", "_volume"]; + cse_sys_combatdeaf_deafness_running = true; + _deafness = player getVariable ["cse_combatdeaf_deafness", 0]; + _ringing = false; + _ringingStart = time - 120; + while {alive player && _deafness > 0.01} do { + if (_deafness > DAMAGE_THRESHOLD / cse_DeafnessIntensity) then { + ["cse_sys_combatdeaf_deafIcon", true, "cse\cse_sys_combatdeaf\data\cse_combatdeaf_deafness.paa", [1,1,1,1]] call cse_fnc_gui_displayIcon; + } else { + ["cse_sys_combatdeaf_deafIcon", false, "", [1,1,1,1]] call cse_fnc_gui_displayIcon; + if (!cse_DisableEarRinging && _deafness > PAIN_THRESHOLD / cse_DeafnessIntensity) then { + if (!_ringing || time - _ringingStart > 120) then { + playSound "cse_combatdeaf_ear_ringing"; + _ringingStart = time; + _ringing = true; + }; + } else { + _ringing = false; + }; + }; + _deafness = player getVariable ["cse_combatdeaf_deafness", 0]; + _volume = 0 max (1 - (_deafness / (DAMAGE_THRESHOLD / cse_DeafnessIntensity))); + [format["hearingCapability_%1", HEARING_CAPABILITY_MAP_ID], _volume, true] call cse_fnc_setHearingCapability; + player setVariable ["cse_combatdeaf_deafness", 0 max (_deafness - 0.5 / (1 max _deafness min (DAMAGE_THRESHOLD / cse_DeafnessIntensity))), false]; + sleep 1; + }; + cse_sys_combatdeaf_deafness_running = false; + [format["hearingCapability_%1", HEARING_CAPABILITY_MAP_ID], 1, false] call cse_fnc_setHearingCapability; + }; + }; +}; \ No newline at end of file diff --git a/TO_MERGE/cse/sys_combatdeaf/functions/fn_hasMuzzleAccessory_DEAF.sqf b/TO_MERGE/cse/sys_combatdeaf/functions/fn_hasMuzzleAccessory_DEAF.sqf new file mode 100644 index 0000000000..616f3d0ad6 --- /dev/null +++ b/TO_MERGE/cse/sys_combatdeaf/functions/fn_hasMuzzleAccessory_DEAF.sqf @@ -0,0 +1,20 @@ +/** + * fn_hasMuzzleAccessory_DEAF.sqf + * @Descr: N/A + * @Author: Glowbal + * + * @Arguments: [] + * @Return: + * @PublicAPI: false + */ + + private ["_unit"]; +_unit = _this select 0; +_accessories = [_unit] call cse_fnc_getWeaponItems_F; +_items = switch (currentWeapon _unit) do { + case (primaryWeapon _unit): { _accessories select 0 }; + case (secondaryWeapon _unit): { _accessories select 1 }; + case (handgunWeapon _unit): { _accessories select 2 }; + default { throw "NO_WEAPON_UNIT"; }; +}; +(_items select 0) != ""; \ No newline at end of file diff --git a/TO_MERGE/cse/sys_combatdeaf/functions/fn_register_ear_protection_actions_DEAF.sqf b/TO_MERGE/cse/sys_combatdeaf/functions/fn_register_ear_protection_actions_DEAF.sqf new file mode 100644 index 0000000000..2c5351e7fd --- /dev/null +++ b/TO_MERGE/cse/sys_combatdeaf/functions/fn_register_ear_protection_actions_DEAF.sqf @@ -0,0 +1,60 @@ +#include "defines.h" + +if (isDedicated) exitwith{}; +CSE_ICON_PATH = "cse\cse_gui\radialmenu\data\icons\"; + +cse_hearingProtectionDisplaySubMenu = { + [_this] call cse_fnc_Debug; + + private ["_subMenus"]; + _subMenus = []; + + // Put on standard earplugs + if (player getVariable ["cse_combatdeaf_earplugs", NO_EARPLUGS] == NO_EARPLUGS && [player, "cse_earplugs"] call cse_fnc_hasItem) then { + _subMenus pushBack ["Use earplugs", CSE_ICON_PATH + "icon_earplugs_standard.paa", { + closeDialog 0; + player setVariable ["cse_combatdeaf_earplugs", STANDARD_EARPLUGS, false]; + player removeItem "cse_earplugs"; + [format["earplugsAttenuation_ID_%1", EARPLUGS_ID], 0.125] call cse_fnc_setHearingCapability; + }, true, "Use standard earplugs"]; + }; + + // Put on electronic earplugs + if (player getVariable ["cse_combatdeaf_earplugs", NO_EARPLUGS] == NO_EARPLUGS && [player, "cse_earplugs_electronic"] call cse_fnc_hasItem) then { + _subMenus pushBack ["Use earplugs", CSE_ICON_PATH + "icon_earplugs_electronic.paa", { + closeDialog 0; + player setVariable ["cse_combatdeaf_earplugs", ELECTRONIC_EARPLUGS, false]; + player removeItem "cse_earplugs_electronic"; + }, true, "Use electronic earplugs"]; + }; + + // Remove earplugs + if (player getVariable ["cse_combatdeaf_earplugs", NO_EARPLUGS] != NO_EARPLUGS) then { + switch (player getVariable ["cse_combatdeaf_earplugs", NO_EARPLUGS]) do { + case STANDARD_EARPLUGS: { + _subMenus pushBack ["Earplugs out", CSE_ICON_PATH + "icon_earplugs_remove.paa", { + closeDialog 0; + player setVariable ["cse_combatdeaf_earplugs", NO_EARPLUGS, false]; + player addItem "cse_earplugs"; + [format["earplugsAttenuation_ID_%1", EARPLUGS_ID], 1, false] call cse_fnc_setHearingCapability; + }, true, "Remove standard earplugs"]; + }; + case ELECTRONIC_EARPLUGS: { + _subMenus pushBack ["Earplugs out", CSE_ICON_PATH + "icon_earplugs_remove.paa", { + closeDialog 0; + player setVariable ["cse_combatdeaf_earplugs", NO_EARPLUGS, false]; + player addItem "cse_earplugs_electronic"; + }, true, "Remove electronic earplugs"]; + }; + }; + }; + + [_this select 3, _subMenus, _this select 1, CSE_SELECTED_RADIAL_OPTION_N_GUI, true] call cse_fnc_openRadialSecondRing_GUI; +}; + + +_entries = [ + ["Hearing", {((player getVariable ["cse_combatdeaf_earplugs", NO_EARPLUGS] != NO_EARPLUGS) || (([player, "cse_earplugs_electronic"] call cse_fnc_hasItem) || ([player, "cse_earplugs"] call cse_fnc_hasItem)))}, CSE_ICON_PATH + "icon_ear_protection.paa", cse_hearingProtectionDisplaySubMenu, "Show available hearing protections"] +]; +["ActionMenu","equipment", _entries ] call cse_fnc_addMultipleEntriesToRadialCategory_F; + diff --git a/TO_MERGE/cse/sys_combatdeaf/init_sys_combatdeaf.sqf b/TO_MERGE/cse/sys_combatdeaf/init_sys_combatdeaf.sqf new file mode 100644 index 0000000000..a8bd8fcd8d --- /dev/null +++ b/TO_MERGE/cse/sys_combatdeaf/init_sys_combatdeaf.sqf @@ -0,0 +1,29 @@ +#include "functions\defines.h" + +if (!hasInterface) exitwith {}; +waituntil{!isnil "cse_gui" && !isnil "cse_main"}; + +waitUntil {!isNull player}; + +private ["_args"]; +_args = _this; +{ + _varName = "cse_"+(_x select 0); + missionNamespace setVariable[_varName, _x select 1]; +} forEach _args; + +if (isNil "cse_DeafnessIntensity") then { cse_DeafnessIntensity = cse_DEAFNESS_EFFECT_INTENSITY }; +if (isNil "cse_DisableEarRinging") then { cse_DisableEarRinging = cse_DISABLE_EAR_RINGING }; + +["cse_combatdeaf_deafness", 0, false, "cd"] call cse_fnc_defineVariable; +["cse_combatdeaf_earplugs", NO_EARPLUGS, false, "cd"] call cse_fnc_defineVariable; + +call cse_fnc_register_ear_protection_actions_DEAF; + +player addEventHandler ["FiredNear", {_this call cse_fnc_handleFiredNear_DEAF}]; +player addEventHandler ["Explosion", {_this call cse_fnc_explosion_DEAF}]; + +cse_sys_combatdeaf_blurEffect = ppEffectCreate ["dynamicBlur", -11723]; +cse_sys_combatdeaf_deafness_running = false; + +cse_sys_combatdeaf = true; \ No newline at end of file diff --git a/TO_MERGE/cse/sys_combatdeaf/sound/ear_ringing.ogg b/TO_MERGE/cse/sys_combatdeaf/sound/ear_ringing.ogg new file mode 100644 index 0000000000..9bbc7b504b Binary files /dev/null and b/TO_MERGE/cse/sys_combatdeaf/sound/ear_ringing.ogg differ diff --git a/TO_MERGE/cse/sys_combatdeaf/stringtable.xml b/TO_MERGE/cse/sys_combatdeaf/stringtable.xml new file mode 100644 index 0000000000..0c3a9168de --- /dev/null +++ b/TO_MERGE/cse/sys_combatdeaf/stringtable.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file