ACE3/addons/medical_feedback/XEH_postInit.sqf
BaerMitUmlaut 8c7f8d7d6a Medical Feedback - effects overhaul (#7215)
* Intensify pain effects

* Add chromatic abberation effect, add blur with very high pain

* Add option for limited pain effects with only high pain blur

* Fix playInjuredSound

* Add instant feedback effects update when getting hit

* Cleanup

* Overhaul playInjuredSound

* Fix voice detection, simplify nearby unit filter

* Apply suggestions from code review

* Add Chromatic Aberration translations

* Use while loop instead of configClasses

* detach say3d dummies before deleting
2019-10-11 15:00:53 -05:00

135 lines
4.5 KiB
Plaintext

#include "script_component.hpp"
[QEGVAR(medical,injured), {
params ["_unit", "_painLevel"];
[_unit, "hit", PAIN_TO_SCREAM(_painLevel)] call FUNC(playInjuredSound);
if (hasInterface && {_unit == ace_player}) then {
[true] call FUNC(handleEffects);
};
}] call CBA_fnc_addEventHandler;
[QEGVAR(medical,moan), {
params ["_unit", "_painLevel"];
[_unit, "moan", PAIN_TO_MOAN(_painLevel)] call FUNC(playInjuredSound);
}] call CBA_fnc_addEventHandler;
if (!hasInterface) exitWith {};
[QEGVAR(medical,fracture), {
params ["_unit"];
if (_unit == ACE_player) then {
playSound SND_FRACTURE;
};
}] call CBA_fnc_addEventHandler;
GVAR(nextFadeIn) = 0;
GVAR(heartBeatEffectRunning) = false;
GVAR(lastHeartBeatSound) = 0;
GVAR(bloodTickCounter) = 0;
[false] call FUNC(initEffects);
[true] call FUNC(handleEffects);
[FUNC(handleEffects), 1, false] call CBA_fnc_addPerFrameHandler;
["ace_unconscious", {
params ["_unit", "_unconscious"];
if (_unit != ACE_player) exitWith {};
TRACE_1("player unconscious eh",_unconscious);
if (_unconscious && {cameraView == "GUNNER"} && {(vehicle _unit) != _unit} && {cameraOn == vehicle _unit}) then {
TRACE_2("exiting gunner view",cameraOn,cameraView);
ACE_player switchCamera "INTERNAL";
};
// Toggle unconscious player's ability to talk in radio addons
if (["task_force_radio"] call EFUNC(common,isModLoaded)) then {
_unit setVariable ["tf_voiceVolume", [1, 0] select _unconscious, true];
_unit setVariable ["tf_unable_to_use_radio", _unconscious]; // Only used locally
};
if (["acre_main"] call EFUNC(common,isModLoaded)) then {
_unit setVariable ["acre_sys_core_isDisabled", _unconscious, true];
};
// Greatly reduce player's hearing ability while unconscious (affects radio addons)
[QUOTE(ADDON), VOL_UNCONSCIOUS, _unconscious] call EFUNC(common,setHearingCapability);
[true] call FUNC(handleEffects);
["unconscious", _unconscious] call EFUNC(common,setDisableUserInputStatus);
}] call CBA_fnc_addEventHandler;
// Reset volume upon death for spectators
[QEGVAR(medical,death), {
params ["_unit"];
if (_unit != ACE_player) exitWith {};
if (["task_force_radio"] call EFUNC(common,isModLoaded)) then {
_unit setVariable ["tf_voiceVolume", 1, true];
_unit setVariable ["tf_unable_to_use_radio", false];
};
if (["acre_main"] call EFUNC(common,isModLoaded)) then {
_unit setVariable ["acre_sys_core_isDisabled", false, true];
};
[QUOTE(ADDON), 1, false] call EFUNC(common,setHearingCapability);
}] call CBA_fnc_addEventHandler;
// Update effects to match new unit's current status (this also handles respawn)
["unit", {
params ["_new"];
private _status = IS_UNCONSCIOUS(_new);
if (["task_force_radio"] call EFUNC(common,isModLoaded)) then {
_new setVariable ["tf_voiceVolume", [1, 0] select _status, true];
_new setVariable ["tf_unable_to_use_radio", _status];
};
if (["acre_main"] call EFUNC(common,isModLoaded)) then {
_new setVariable ["acre_sys_core_isDisabled", _status, true];
};
[QUOTE(ADDON), VOL_UNCONSCIOUS, _status] call EFUNC(common,setHearingCapability);
[true] call FUNC(handleEffects);
["unconscious", _status] call EFUNC(common,setDisableUserInputStatus);
}] call CBA_fnc_addPlayerEventHandler;
// Forced say3D
[QGVAR(forceSay3D), {
params ["_unit", "_sound", "_distance"];
if (ACE_player distance _unit > _distance) exitWith {};
if (vehicle _unit == _unit) then {
// say3D waits for the previous sound to finish, so use a dummy instead
private _dummy = "#dynamicsound" createVehicleLocal [0, 0, 0];
_dummy attachTo [_unit, [0, 0, 0], "camera"];
_dummy say3D [_sound, _distance, 1, false];
[{
detach _this;
deleteVehicle _this;
}, _dummy, 5] call CBA_fnc_waitAndExecute;
} else {
// Fallback: attachTo doesn't work within vehicles
_unit say3D [_sound, _distance, 1, false];
};
}] call CBA_fnc_addEventHandler;
// Kill vanilla bleeding feedback effects.
#ifdef DISABLE_VANILLA_DAMAGE_EFFECTS
TRACE_1("disabling vanilla bleeding feedback effects",_this);
[{
{isNil _x} count [
"BIS_fnc_feedback_damageCC",
"BIS_fnc_feedback_damageRadialBlur",
"BIS_fnc_feedback_damageBlur"
] == 0
}, {
{
ppEffectDestroy _x;
} forEach [
BIS_fnc_feedback_damageCC,
BIS_fnc_feedback_damageRadialBlur,
BIS_fnc_feedback_damageBlur
];
}] call CBA_fnc_waitUntilAndExecute;
#endif