diff --git a/addons/common/functions/fnc_setUnconsciousState.sqf b/addons/common/functions/fnc_setUnconsciousState.sqf index b890acac3f..182fd650bc 100644 --- a/addons/common/functions/fnc_setUnconsciousState.sqf +++ b/addons/common/functions/fnc_setUnconsciousState.sqf @@ -13,12 +13,13 @@ private ["_unit", "_animState", "_dAnim"]; _unit = _this select 0; -_dAnim = ([_unit] call FUNC(getDeathAnim)); if !([_unit] call FUNC(canGoUnconsciousState)) exitwith{}; if (!local _unit) exitwith { - [[_unit], QUOTE(FUNC(setUnconsciousState)), _unit, false] spawn EFUNC(common,execRemoteFnc); + [[_unit], QUOTE(FUNC(setUnconsciousState)), _unit, false] call EFUNC(common,execRemoteFnc); }; +_dAnim = ([_unit] call FUNC(getDeathAnim)); + // get rid of the object we are carrying, before we go unconscious. [_unit, ObjNull, [0,0,0]] call FUNC(carryObj); @@ -30,7 +31,7 @@ _animState = animationState _unit; _originalPos = unitPos _unit; if (isPlayer _unit) then { [] call FUNC(closeAllDialogs_f); - [true] call FUNC(effectBlackOut); + [true] call EFUNC(GUI,effectBlackOut); ["unconscious", true] call FUNC(disableUserInput_f); [false] call FUNC(setVolume_f); } else { @@ -41,53 +42,78 @@ if (isPlayer _unit) then { _captiveSwitch = [_unit, true] call FUNC(setCaptiveSwitch); _unit setUnconscious true; -[_unit, _dAnim] call FUNC(localAnim); +[_unit, _dAnim, 1, true] call FUNC(doAnimation); -[_unit,_animState, _captiveSwitch, _originalPos] spawn { +_startingTime = time; +_minWaitingTime = (round(random(10)+5)); +[{ private ["_unit", "_vehicleOfUnit","_lockSwitch","_minWaitingTime", "_oldAnimation", "_captiveSwitch"]; - _unit = _this select 0; - _oldAnimation = _this select 1; - _captiveSwitch = _this select 2; - _originalPos = _this select 3; + _args = _this select 0; + _unit = _args select 0; + _oldAnimation = _args select 1; + _captiveSwitch = _args select 2; + _originalPos = _args select 3; + _startingTime = _args select 4; + _minWaitingTime = _args select 5; - _minWaitingTime = (round(random(10)+5)); - _counter = time; - while {(((time - _counter) < _minWaitingTime) && {alive _unit})} do { - if (vehicle _unit == _unit && {animationState _unit != "deadState" && animationState _unit != "unconscious"} && {(alive _unit)} && {(isNull ([_unit] call FUNC(getCarriedBy)))}) then { - [_unit,([_unit] call FUNC(getDeathAnim))] call FUNC(broadcastAnim); + // Since the unit is no longer alive, get rid of this PFH. + if (!alive _unit) exitwith { + [(_this select 1)] call cba_fnc_removePerFrameHandler; + [[_unit, false],"setUnconsciousState"] call FUNC(raiseScriptedEvent_f); + }; + + // In case the unit is no longer in an unconscious state, we are going to check if we can already reset the animation + if !([_unit] call FUNC(isUnconscious)) exitwith { + + // Wait until the unit isn't being carried anymore, so we won't end up with wierd animations + if !([_unit] call FUNC(beingCarried)) then { + if (vehicle _unit == _unit) then { + [_unit,"amovppnemstpsnonwnondnon", 1] call FUNC(doAnimation); + } else { + // Switch to the units original animation, assuming + // TODO: what if the unit switched vehicle? + [_unit, _oldAnimation, 1] call FUNC(doAnimation); + }; + [(_this select 1)] call cba_fnc_removePerFrameHandler; + [[_unit, false],"setUnconsciousState"] call FUNC(raiseScriptedEvent_f); }; - sleep 0.1; }; - waituntil{(!([_unit] call FUNC(getUnconsciousCondition)) || !alive _unit)}; - [format["setUnconsciousState false - %1",_unit]] call FUNC(debug); - sleep 0.5; - if (_captiveSwitch) then { - [_unit, false] call FUNC(setCaptiveSwitch); - }; - _unit setUnconscious false; - [_unit, false, QGVAR(StateUnconscious), side group _unit] call FUNC(switchToGroupSide_f); + // Ensure we are waiting at least a minimum period before checking if we can wake up the unit again, allows for temp knock outs + if ((time - _startingTime) >= _minWaitingTime) exitwith { - if (isPlayer _unit) then { - [false] call FUNC(effectBlackOut); - [true] call FUNC(setVolume_f); - ["unconscious", false] call FUNC(disableUserInput_f); - } else { - [_unit, false] call FUNC(disableAI_F); - _unit setUnitPos _originalPos; // This is not position but stance (DOWN, MIDDLE, UP) - }; + // Wait until the unit is no longer unconscious + if (!([_unit] call FUNC(getUnconsciousCondition))) then { - waituntil {!([_unit] call FUNC(beingCarried))}; - if (alive _unit) then { - if (vehicle _unit == _unit) then { - [format["Resetting unit animiation to normal %1",_unit]] call FUNC(debug); - //[_unit,"",false] call FUNC(broadcastAnim); - [_unit,"amovppnemstpsnonwnondnon",false] call FUNC(broadcastAnim); - } else { - [format["Resetting unit animiation to oldAnimation %1 - %2",_unit, _oldAnimation]] call FUNC(debug); - [_unit, _oldAnimation,false] call FUNC(broadcastAnim); + // Reset the unit back to the previous captive state. + if (_captiveSwitch) then { + [_unit, false] call FUNC(setCaptiveSwitch); + }; + _unit setUnconscious false; + + // Swhich the unit back to its original group + [_unit, false, QGVAR(StateUnconscious), side group _unit] call FUNC(switchToGroupSide_f); + + // Reset any visual and audio effects for players, or enable everything again for AI. + if (isPlayer _unit) then { + [false] call EFUNC(GUI,effectBlackOut); + [true] call FUNC(setVolume_f); + ["unconscious", false] call FUNC(disableUserInput_f); + } else { + [_unit, false] call FUNC(disableAI_F); + _unit setUnitPos _originalPos; // This is not position but stance (DOWN, MIDDLE, UP) + }; + + // Move unit out of unconscious state + _unit setvariable [QGVAR(StateUnconscious), false, true]; }; - _unit setvariable [QGVAR(StateUnconscious), false, true]; }; - [[_unit, false],"setUnconsciousState"] call FUNC(customEventHandler_F); -}; -[[_unit, true],"setUnconsciousState"] call FUNC(customEventHandler_F); \ No newline at end of file + + // A check to ensure that the animation is being played properly. + // TODO: Might no longer be necessary: Have to test this in MP + if (vehicle _unit == _unit && {animationState _unit != "deadState" && animationState _unit != "unconscious"} && {(isNull ([_unit] call FUNC(getCarriedBy)))}) then { + [_unit,([_unit] call FUNC(getDeathAnim)), 1, true] call FUNC(doAnimation); // Reset animations if unit starts doing wierd things. + }; + +}, 0.1, [_unit,_animState, _captiveSwitch, _originalPos, _startingTime, _minWaitingTime] ] call CBA_fnc_addPerFrameHandler; + +[[_unit, true],"setUnconsciousState"] call FUNC(raiseScriptedEvent_f);