From a0e9b752e9f0b8bfca3b9700ce0188b147d60af4 Mon Sep 17 00:00:00 2001 From: Dystopian Date: Sat, 18 Nov 2017 01:47:58 +0300 Subject: [PATCH] Add ability to pull dead body out of vehicle (#5630) * Add ability to pull dead body out of vehicle * Fix interaction not in vehicle * Fix interaction with crew of dead vehicle * Fix medical unload patient when he is dead * Cleanup * Fix cargo index, fix menu visible in vehicle --- addons/interaction/CfgVehicles.hpp | 36 ++++++----- addons/interaction/XEH_PREP.hpp | 2 + .../functions/fnc_canPullOutBody.sqf | 47 ++++++++++++++ .../interaction/functions/fnc_pullOutBody.sqf | 63 +++++++++++++++++++ addons/interaction/stringtable.xml | 4 ++ addons/medical/CfgVehicles.hpp | 2 +- 6 files changed, 139 insertions(+), 15 deletions(-) create mode 100644 addons/interaction/functions/fnc_canPullOutBody.sqf create mode 100644 addons/interaction/functions/fnc_pullOutBody.sqf diff --git a/addons/interaction/CfgVehicles.hpp b/addons/interaction/CfgVehicles.hpp index 493debe0ce..9bd70a00da 100644 --- a/addons/interaction/CfgVehicles.hpp +++ b/addons/interaction/CfgVehicles.hpp @@ -168,6 +168,14 @@ class CfgVehicles { showDisabled = 0; priority = 2.6; }; + + class GVAR(PullOutBody) { + displayName = CSTRING(PullOutBody); + condition = QUOTE(call DFUNC(canPullOutBody)); + statement = QUOTE(call DFUNC(pullOutBody)); + exceptions[] = {"isNotSwimming"}; + icon = "\a3\ui_f\data\IGUI\Cfg\simpleTasks\types\getout_ca.paa"; + }; }; class ACE_Torso { @@ -342,7 +350,7 @@ class CfgVehicles { condition = "true"; class ACE_Passengers { displayName = CSTRING(Passengers); - condition = "true"; + condition = QUOTE(alive _target); statement = ""; exceptions[] = {"isNotSwimming"}; insertChildren = QUOTE(_this call DFUNC(addPassengersActions)); @@ -353,7 +361,7 @@ class CfgVehicles { class ACE_SelfActions { class ACE_Passengers { displayName = CSTRING(Passengers); - condition = "true"; + condition = QUOTE(alive _target); statement = ""; insertChildren = QUOTE(_this call DFUNC(addPassengersActions)); }; @@ -370,7 +378,7 @@ class CfgVehicles { condition = "true"; class ACE_Passengers { displayName = CSTRING(Passengers); - condition = "true"; + condition = QUOTE(alive _target); statement = ""; exceptions[] = {"isNotSwimming"}; insertChildren = QUOTE(_this call DFUNC(addPassengersActions)); @@ -381,7 +389,7 @@ class CfgVehicles { class ACE_SelfActions { class ACE_Passengers { displayName = CSTRING(Passengers); - condition = "true"; + condition = QUOTE(alive _target); statement = ""; insertChildren = QUOTE(_this call DFUNC(addPassengersActions)); }; @@ -397,7 +405,7 @@ class CfgVehicles { condition = "true"; class ACE_Passengers { displayName = CSTRING(Passengers); - condition = "true"; + condition = QUOTE(alive _target); statement = ""; exceptions[] = {"isNotSwimming"}; insertChildren = QUOTE(_this call DFUNC(addPassengersActions)); @@ -408,7 +416,7 @@ class CfgVehicles { class ACE_SelfActions { class ACE_Passengers { displayName = CSTRING(Passengers); - condition = "true"; + condition = QUOTE(alive _target); statement = ""; exceptions[] = {"isNotSwimming"}; insertChildren = QUOTE(_this call DFUNC(addPassengersActions)); @@ -428,7 +436,7 @@ class CfgVehicles { condition = "true"; class ACE_Passengers { displayName = CSTRING(Passengers); - condition = "true"; + condition = QUOTE(alive _target); statement = ""; exceptions[] = {"isNotSwimming"}; insertChildren = QUOTE(_this call DFUNC(addPassengersActions)); @@ -439,7 +447,7 @@ class CfgVehicles { class ACE_SelfActions { class ACE_Passengers { displayName = CSTRING(Passengers); - condition = "true"; + condition = QUOTE(alive _target); statement = ""; insertChildren = QUOTE(_this call DFUNC(addPassengersActions)); }; @@ -456,7 +464,7 @@ class CfgVehicles { condition = "true"; class ACE_Passengers { displayName = CSTRING(Passengers); - condition = "true"; + condition = QUOTE(alive _target); statement = ""; exceptions[] = {"isNotSwimming"}; insertChildren = QUOTE(_this call DFUNC(addPassengersActions)); @@ -467,7 +475,7 @@ class CfgVehicles { class ACE_SelfActions { class ACE_Passengers { displayName = CSTRING(Passengers); - condition = "true"; + condition = QUOTE(alive _target); statement = ""; insertChildren = QUOTE(_this call DFUNC(addPassengersActions)); }; @@ -505,7 +513,7 @@ class CfgVehicles { }; class ACE_Passengers { displayName = CSTRING(Passengers); - condition = "true"; + condition = QUOTE(alive _target); statement = ""; exceptions[] = {"isNotSwimming"}; insertChildren = QUOTE(_this call DFUNC(addPassengersActions)); @@ -516,7 +524,7 @@ class CfgVehicles { class ACE_SelfActions { class ACE_Passengers { displayName = CSTRING(Passengers); - condition = "true"; + condition = QUOTE(alive _target); statement = ""; insertChildren = QUOTE(_this call DFUNC(addPassengersActions)); }; @@ -532,7 +540,7 @@ class CfgVehicles { condition = "true"; class ACE_Passengers { displayName = CSTRING(Passengers); - condition = "true"; + condition = QUOTE(alive _target); statement = ""; exceptions[] = {"isNotSwimming"}; insertChildren = QUOTE(_this call DFUNC(addPassengersActions)); @@ -543,7 +551,7 @@ class CfgVehicles { class ACE_SelfActions { class ACE_Passengers { displayName = CSTRING(Passengers); - condition = "true"; + condition = QUOTE(alive _target); statement = ""; insertChildren = QUOTE(_this call DFUNC(addPassengersActions)); }; diff --git a/addons/interaction/XEH_PREP.hpp b/addons/interaction/XEH_PREP.hpp index 4f0ef58357..1a70de8831 100644 --- a/addons/interaction/XEH_PREP.hpp +++ b/addons/interaction/XEH_PREP.hpp @@ -28,6 +28,8 @@ PREP(canTapShoulder); PREP(tapShoulder); PREP(canPardon); PREP(pardon); +PREP(canPullOutBody); +PREP(pullOutBody); // interaction with doors PREP(getDoor); diff --git a/addons/interaction/functions/fnc_canPullOutBody.sqf b/addons/interaction/functions/fnc_canPullOutBody.sqf new file mode 100644 index 0000000000..f0f8f32db9 --- /dev/null +++ b/addons/interaction/functions/fnc_canPullOutBody.sqf @@ -0,0 +1,47 @@ +/* + * Author: Dystopian + * Checks if unit can pull target body out of vehicle. + * + * Arguments: + * 1: Body + * 2: Unit + * + * Return Value: + * Able to pull out target body + * + * Example: + * [crew cursorObject select 0, player] call ace_interaction_fnc_canPullOutBody + * + * Public: No + */ +#include "script_component.hpp" + +params ["_body", "_unit"]; + +private _vehicle = objectParent _body; + +if ( + !isNull objectParent _unit + || {alive _body} + || {isNull _vehicle} + || {1 < locked _vehicle} + || { + 0 < {alive _x} count crew _vehicle // alive is in vehicle + // group is used here for situations when side player == ENEMY + && {0.6 > side group _unit getFriend side group _vehicle} // player is enemy + } +) exitWith {false}; + +((fullCrew [_vehicle, ""] select {_body == _x select 0}) select 0) params ["", "", "_cargoIndex", "_turretPath"]; + +private _locked = if (!(_turretPath isEqualTo [])) then { + _vehicle lockedTurret _turretPath; +} else { + if (_cargoIndex > -1) then { + _vehicle lockedCargo _cargoIndex; + } else { + lockedDriver _vehicle; + }; +}; + +!_locked diff --git a/addons/interaction/functions/fnc_pullOutBody.sqf b/addons/interaction/functions/fnc_pullOutBody.sqf new file mode 100644 index 0000000000..bab54a0805 --- /dev/null +++ b/addons/interaction/functions/fnc_pullOutBody.sqf @@ -0,0 +1,63 @@ +/* + * Author: Dystopian + * Makes unit pull target body out of vehicle. + * + * Arguments: + * 0: Body + * 1: Unit + * + * Return Value: + * None + * + * Example: + * [crew cursorObject select 0, player] call ace_interaction_fnc_pullOutBody + * + * Public: No + */ +#include "script_component.hpp" + +params ["_body", "_unit"]; + +private _vehicle = objectParent _body; // vehicle command doesn't work for dead + +// get target crew properties +private ["_cargoIndex", "_turretPath"]; +private _cargoNumber = -1; +{ + if ("cargo" == _x select 1) then { + INC(_cargoNumber); + }; + if (_body == _x select 0) exitWith { + _cargoIndex = _x select 2; + _turretPath = _x select 3; + }; +} forEach fullCrew [_vehicle, "", true]; +TRACE_3("",_cargoIndex,_cargoNumber,_turretPath); + +private _preserveEngineOn = false; + +// first get in to target seat +if (!(_turretPath isEqualTo [])) then { + _unit action ["GetInTurret", _vehicle, _turretPath]; +} else { + if (_cargoIndex > -1) then { + _unit action ["GetInCargo", _vehicle, _cargoNumber]; + } else { + _unit action ["GetInDriver", _vehicle]; + _preserveEngineOn = isEngineOn _vehicle; + }; +}; + +// then get out +[ + {(_this select 0) in (_this select 1)}, + { + params ["_unit", "_vehicle", "_preserveEngineOn"]; + TRACE_3("",_unit,_vehicle,_preserveEngineOn); + _unit action ["GetOut", _vehicle]; + if (_preserveEngineOn) then { + [{isNull driver _this}, {_this engineOn true}, _vehicle] call CBA_fnc_waitUntilAndExecute; + }; + }, + [_unit, _vehicle, _preserveEngineOn] +] call CBA_fnc_waitUntilAndExecute; diff --git a/addons/interaction/stringtable.xml b/addons/interaction/stringtable.xml index 96379bbdd2..c860959ca9 100644 --- a/addons/interaction/stringtable.xml +++ b/addons/interaction/stringtable.xml @@ -1073,5 +1073,9 @@ 显示"给予弹匣"互动动作 顯示"給予彈匣"互動動作 + + Pull out body + Вытащить тело + diff --git a/addons/medical/CfgVehicles.hpp b/addons/medical/CfgVehicles.hpp index addc9ef172..34bba3c95e 100644 --- a/addons/medical/CfgVehicles.hpp +++ b/addons/medical/CfgVehicles.hpp @@ -556,7 +556,7 @@ class CfgVehicles { class GVAR(UnLoadPatient) { displayName = CSTRING(UnloadPatient); distance = 5; - condition = QUOTE(_target getVariable [ARR_2(QUOTE(QUOTE(ACE_isUnconscious)), false)] && {vehicle _target != _target} && {vehicle _player == _player}); + condition = QUOTE(_target getVariable [ARR_2(QUOTE(QUOTE(ACE_isUnconscious)), false)] && {alive _target} && {vehicle _target != _target} && {vehicle _player == _player}); statement = QUOTE([ARR_2(_player, _target)] call DFUNC(actionUnloadUnit)); showDisabled = 0; priority = 2;