Medical Statemachine - Fix locality EH breaking current state (#7136)

* Medical Statemachine - Fix locality EH breaking current state

* Handle Injured state

* Update fnc_localityChangedEH.sqf
This commit is contained in:
PabstMirror 2019-09-28 15:52:49 -05:00 committed by GitHub
parent ec9e6c088b
commit b8c45c0a57
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 46 additions and 46 deletions

View File

@ -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 Extended_Respawn_EventHandlers {
class CAManBase { class CAManBase {
class ADDON { class ADDON {

View File

@ -10,6 +10,5 @@ PREP(handleStateInjured);
PREP(handleStateUnconscious); PREP(handleStateUnconscious);
PREP(leftStateCardiacArrest); PREP(leftStateCardiacArrest);
PREP(localityChangedEH); PREP(localityChangedEH);
PREP(localityTransfer);
PREP(resetStateDefault); PREP(resetStateDefault);
PREP(transitionSecondChance); PREP(transitionSecondChance);

View File

@ -1,3 +0,0 @@
#include "script_component.hpp"
[QGVAR(localityTransfer), LINKFUNC(localityTransfer)] call CBA_fnc_addEventHandler;

View File

@ -1,7 +1,8 @@
#include "script_component.hpp" #include "script_component.hpp"
/* /*
* Author: PabstMirror * 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: * Arguments:
* 0: Unit <OBJECT> * 0: Unit <OBJECT>
@ -19,15 +20,50 @@
params ["_unit", "_isLocal"]; params ["_unit", "_isLocal"];
TRACE_2("localityChangedEH",_unit,_isLocal); TRACE_2("localityChangedEH",_unit,_isLocal);
if (!alive _unit) exitWith {TRACE_1("dead", _this)}; if (!alive _unit) exitWith {};
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 (_isLocal) then {
private _currentState = [_unit, EGVAR(medical,STATE_MACHINE)] call CBA_statemachine_fnc_getCurrentState; private _currentState = [_unit, EGVAR(medical,STATE_MACHINE)] call CBA_statemachine_fnc_getCurrentState;
TRACE_2("sending current state",_unit,_currentState); TRACE_1("local",_currentState);
[QGVAR(localityTransfer), [_unit, _currentState], _unit] call CBA_fnc_targetEvent;
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];
};
*/
}; };

View File

@ -1,26 +0,0 @@
#include "script_component.hpp"
/*
* Author: PabstMirror
* Handles locality switch.
*
* Arguments:
* 0: Unit <OBJECT>
* 1: State <STRING>
*
* 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;
};