diff --git a/addons/cargo/XEH_PREP.hpp b/addons/cargo/XEH_PREP.hpp index aa1600b82d..95fefb4ba0 100644 --- a/addons/cargo/XEH_PREP.hpp +++ b/addons/cargo/XEH_PREP.hpp @@ -19,5 +19,6 @@ PREP(setSize); PREP(setSpace); PREP(startLoadIn); PREP(startUnload); +PREP(unloadCarryItem); PREP(unloadItem); PREP(validateCargoSpace); diff --git a/addons/cargo/XEH_postInit.sqf b/addons/cargo/XEH_postInit.sqf index b1e3493b11..26e25c5686 100644 --- a/addons/cargo/XEH_postInit.sqf +++ b/addons/cargo/XEH_postInit.sqf @@ -50,8 +50,6 @@ GVAR(interactionParadrop) = false; createDialog QGVAR(menu); }; - - // TOOO maybe drag/carry the unloaded item? }] call CBA_fnc_addEventHandler; [QGVAR(serverUnload), { diff --git a/addons/cargo/functions/fnc_unloadCarryItem.sqf b/addons/cargo/functions/fnc_unloadCarryItem.sqf new file mode 100644 index 0000000000..d60904cdc0 --- /dev/null +++ b/addons/cargo/functions/fnc_unloadCarryItem.sqf @@ -0,0 +1,39 @@ +#include "script_component.hpp" +/* + * Author: GhostIsSpooky + * Dragging integration. Unloader starts carrying unloaded object. + * + * Arguments: + * 0: Unloader + * 1: Item + * + * Return Value: + * None + * + * Example: + * [player, object] call ace_cargo_fnc_unloadCarryItem + * + * Public: No + */ +params ["_unloader", "_object"]; +TRACE_2("unloadCarryItem-start",_unloader,_object); + +if !(["ace_dragging"] call EFUNC(common,isModLoaded)) exitWith {}; + +// When unloading attached objects, this code will run before server has finished moving object to the safe position +[{ + params ["_unloader", "_object"]; + (_unloader distance _object) < 10 +}, { + params ["_unloader", "_object"]; + TRACE_2("unloadCarryItem-unloaded",_unloader,_object); + if ([_unloader, _object] call EFUNC(dragging,canCarry)) exitWith { + [_unloader, _object] call EFUNC(dragging,startCarry); + }; + if ([_unloader, _object] call EFUNC(dragging,canDrag)) exitWith { + [_unloader, _object] call EFUNC(dragging,startDrag); + }; +}, _this, 1.0, { // delay is based on how long it will take server event to trigger and take effect + // not a hard error if this fails, could have just unloaded to other side of vehicle because of findSafePos + TRACE_1("unloadCarryItem-failed to unload nearby player",_this); +}] call CBA_fnc_waitUntilAndExecute; diff --git a/addons/cargo/functions/fnc_unloadItem.sqf b/addons/cargo/functions/fnc_unloadItem.sqf index 791141c535..26642c5d81 100644 --- a/addons/cargo/functions/fnc_unloadItem.sqf +++ b/addons/cargo/functions/fnc_unloadItem.sqf @@ -60,6 +60,10 @@ if (_object isEqualType objNull) then { [QEGVAR(common,fixCollision), _object] call CBA_fnc_localEvent; [QEGVAR(common,fixPosition), _object] call CBA_fnc_localEvent; }; + +// Dragging integration +[_unloader, _object] call FUNC(unloadCarryItem); + // Invoke listenable event ["ace_cargoUnloaded", [_object, _vehicle, "unload"]] call CBA_fnc_globalEvent; true