From b8c45c0a57e1a2193130472c2ba54560e18b507c Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Sat, 28 Sep 2019 15:52:49 -0500 Subject: [PATCH] Medical Statemachine - Fix locality EH breaking current state (#7136) * Medical Statemachine - Fix locality EH breaking current state * Handle Injured state * Update fnc_localityChangedEH.sqf --- .../medical_statemachine/CfgEventHandlers.hpp | 6 -- addons/medical_statemachine/XEH_PREP.hpp | 1 - addons/medical_statemachine/XEH_postInit.sqf | 3 - .../functions/fnc_localityChangedEH.sqf | 56 +++++++++++++++---- .../functions/fnc_localityTransfer.sqf | 26 --------- 5 files changed, 46 insertions(+), 46 deletions(-) delete mode 100644 addons/medical_statemachine/XEH_postInit.sqf delete mode 100644 addons/medical_statemachine/functions/fnc_localityTransfer.sqf diff --git a/addons/medical_statemachine/CfgEventHandlers.hpp b/addons/medical_statemachine/CfgEventHandlers.hpp index ab659e1cda..7196bf8aaf 100644 --- a/addons/medical_statemachine/CfgEventHandlers.hpp +++ b/addons/medical_statemachine/CfgEventHandlers.hpp @@ -10,12 +10,6 @@ class Extended_PreInit_EventHandlers { }; }; -class Extended_PostInit_EventHandlers { - class ADDON { - init = QUOTE(call COMPILE_FILE(XEH_postInit)); - }; -}; - class Extended_Respawn_EventHandlers { class CAManBase { class ADDON { diff --git a/addons/medical_statemachine/XEH_PREP.hpp b/addons/medical_statemachine/XEH_PREP.hpp index d8d0af8283..38d0cb573a 100644 --- a/addons/medical_statemachine/XEH_PREP.hpp +++ b/addons/medical_statemachine/XEH_PREP.hpp @@ -10,6 +10,5 @@ PREP(handleStateInjured); PREP(handleStateUnconscious); PREP(leftStateCardiacArrest); PREP(localityChangedEH); -PREP(localityTransfer); PREP(resetStateDefault); PREP(transitionSecondChance); diff --git a/addons/medical_statemachine/XEH_postInit.sqf b/addons/medical_statemachine/XEH_postInit.sqf deleted file mode 100644 index 89d8891fdb..0000000000 --- a/addons/medical_statemachine/XEH_postInit.sqf +++ /dev/null @@ -1,3 +0,0 @@ -#include "script_component.hpp" - -[QGVAR(localityTransfer), LINKFUNC(localityTransfer)] call CBA_fnc_addEventHandler; diff --git a/addons/medical_statemachine/functions/fnc_localityChangedEH.sqf b/addons/medical_statemachine/functions/fnc_localityChangedEH.sqf index 1bcc9a9bde..e76784a939 100644 --- a/addons/medical_statemachine/functions/fnc_localityChangedEH.sqf +++ b/addons/medical_statemachine/functions/fnc_localityChangedEH.sqf @@ -1,7 +1,8 @@ #include "script_component.hpp" /* * Author: PabstMirror - * Handles locality switch. + * Handles locality switch. Will also be called at unit init. + * Because state machine state is local only, when a unit transfers locality we need to manually transition to it's current state * * Arguments: * 0: Unit @@ -19,15 +20,50 @@ params ["_unit", "_isLocal"]; TRACE_2("localityChangedEH",_unit,_isLocal); -if (!alive _unit) exitWith {TRACE_1("dead", _this)}; - -if (!_isLocal) then { - // If locality changed, broadcast the last medical state - _unit setVariable [VAR_HEART_RATE, GET_HEART_RATE(_unit), true]; - _unit setVariable [VAR_BLOOD_PRESS, _unit getVariable [VAR_BLOOD_PRESS, [80, 120]], true]; - _unit setVariable [VAR_BLOOD_VOL, GET_BLOOD_VOLUME(_unit), true]; +if (!alive _unit) exitWith {}; +if (_isLocal) then { private _currentState = [_unit, EGVAR(medical,STATE_MACHINE)] call CBA_statemachine_fnc_getCurrentState; - TRACE_2("sending current state",_unit,_currentState); - [QGVAR(localityTransfer), [_unit, _currentState], _unit] call CBA_fnc_targetEvent; + TRACE_1("local",_currentState); + + switch (true) do { + case (IN_CRDC_ARRST(_unit)): { + if (_currentState == "CardiacArrest") exitWith {}; + _unit setVariable [VAR_CRDC_ARRST, false]; // force reset vars so setCardiacArrest can run (enteredStateCardiacArrest will also be called) + _unit setVariable [VAR_UNCON, false]; + TRACE_1("manually changing state to CardiacArrest",_currentState); + [_unit, EGVAR(medical,STATE_MACHINE), _currentState, "CardiacArrest", {}, "LocalityChange"] call CBA_statemachine_fnc_manualTransition; + }; + case (IS_UNCONSCIOUS(_unit)): { + if (_currentState == "Unconscious") exitWith {}; + _unit setVariable [VAR_UNCON, false]; // force reset var so ace_medical_status_fnc_setUnconscious can run + TRACE_1("manually changing state to Unconscious",_currentState); + [_unit, EGVAR(medical,STATE_MACHINE), _currentState, "Unconscious", {}, "LocalityChange"] call CBA_statemachine_fnc_manualTransition; + }; + case (IS_BLEEDING(_unit) || {IS_IN_PAIN(_unit)}): { + if (_currentState == "Injured") exitWith {}; + TRACE_1("manually changing state to Injured",_currentState); + [_unit, EGVAR(medical,STATE_MACHINE), _currentState, "Injured", {}, "LocalityChange"] call CBA_statemachine_fnc_manualTransition; + }; + default { + // If locality transfers back and forth, we could be in an old state and should transfer back to default + if (_currentState == "Default") exitWith {}; + TRACE_1("manually changing state to Default",_currentState); + [_unit, EGVAR(medical,STATE_MACHINE), _currentState, "Default", {}, "LocalityChange"] call CBA_statemachine_fnc_manualTransition; + }; + }; +} else { + /* + // Not sure if this is even needed, idea is that on locality transfer we broadcast more up to date info + + private _lastTimeUpdated = _unit getVariable [QEGVAR(medical_vitals,lastTimeUpdated), 1e99]; + private _deltaT = CBA_missionTime - _lastTimeUpdated; + TRACE_1("not local",_deltaT); + if (_deltaT < 5) then { + // If locality changed and we have recently updated vitals, broadcast globally now + _unit setVariable [VAR_HEART_RATE, GET_HEART_RATE(_unit), true]; + _unit setVariable [VAR_BLOOD_PRESS, _unit getVariable [VAR_BLOOD_PRESS, [80, 120]], true]; + _unit setVariable [VAR_BLOOD_VOL, GET_BLOOD_VOLUME(_unit), true]; + }; + */ }; diff --git a/addons/medical_statemachine/functions/fnc_localityTransfer.sqf b/addons/medical_statemachine/functions/fnc_localityTransfer.sqf deleted file mode 100644 index abf4ddd5a3..0000000000 --- a/addons/medical_statemachine/functions/fnc_localityTransfer.sqf +++ /dev/null @@ -1,26 +0,0 @@ -#include "script_component.hpp" -/* - * Author: PabstMirror - * Handles locality switch. - * - * Arguments: - * 0: Unit - * 1: State - * - * Return Value: - * None - * - * Example: - * [player, "Injured"] call ace_medical_statemachine_fnc_localityTransfer - * - * Public: No - */ - -params ["_unit", "_currentState"]; -TRACE_2("localityTransfer",_unit,_currentState); - -private _oldState = [_unit, EGVAR(medical,STATE_MACHINE)] call CBA_statemachine_fnc_getCurrentState; -if (_oldState != _currentState) then { - TRACE_2("changing state",_oldState,_currentState); - [_unit, EGVAR(medical,STATE_MACHINE), _oldState, _currentState, {}, "LocalityChange"] call CBA_statemachine_fnc_manualTransition; -};