mirror of
https://github.com/acemod/ACE3.git
synced 2024-08-30 18:23:18 +00:00
Cargo - Add alternative unloading item from vehicle cargo (#8827)
Co-authored-by: johnb432 <58661205+johnb432@users.noreply.github.com> Co-authored-by: LinkIsGrim <salluci.lovi@gmail.com> Co-authored-by: Grim <69561145+LinkIsGrim@users.noreply.github.com>
This commit is contained in:
39
addons/cargo/functions/fnc_deployCancel.sqf
Normal file
39
addons/cargo/functions/fnc_deployCancel.sqf
Normal file
@ -0,0 +1,39 @@
|
||||
#include "..\script_component.hpp"
|
||||
/*
|
||||
* Author: Garth 'L-H' de Wet, Ruthberg, commy2, Smith
|
||||
* Cancels unloading when deploying.
|
||||
*
|
||||
* Arguments:
|
||||
* 0: Unit <OBJECT>
|
||||
*
|
||||
* Return Value:
|
||||
* None
|
||||
*
|
||||
* Example:
|
||||
* player call ace_cargo_fnc_deployCancel
|
||||
*
|
||||
* Public: No
|
||||
*/
|
||||
|
||||
if (GVAR(deployPFH) == -1) exitWith {};
|
||||
|
||||
// Remove deployment pfh
|
||||
GVAR(deployPFH) call CBA_fnc_removePerFrameHandler;
|
||||
GVAR(deployPFH) = -1;
|
||||
|
||||
params ["_unit"];
|
||||
|
||||
// Enable running again
|
||||
[_unit, "forceWalk", QUOTE(ADDON), false] call EFUNC(common,statusEffect_set);
|
||||
[_unit, "blockThrow", QUOTE(ADDON), false] call EFUNC(common,statusEffect_set);
|
||||
|
||||
// Delete placement dummy
|
||||
deleteVehicle GVAR(itemPreviewObject);
|
||||
|
||||
// Remove mouse button actions
|
||||
call EFUNC(interaction,hideMouseHint);
|
||||
|
||||
[_unit, "DefaultAction", _unit getVariable [QGVAR(deploy), -1]] call EFUNC(common,removeActionEventHandler);
|
||||
_unit setVariable [QGVAR(deploy), -1];
|
||||
|
||||
_unit setVariable [QGVAR(isDeploying), false, true];
|
56
addons/cargo/functions/fnc_deployConfirm.sqf
Normal file
56
addons/cargo/functions/fnc_deployConfirm.sqf
Normal file
@ -0,0 +1,56 @@
|
||||
#include "..\script_component.hpp"
|
||||
/*
|
||||
* Author: Garth 'L-H' de Wet, Ruthberg, commy2, Smith
|
||||
* Confirms unloading when deploying.
|
||||
*
|
||||
* Arguments:
|
||||
* 0: Unit <OBJECT>
|
||||
*
|
||||
* Return Value:
|
||||
* None
|
||||
*
|
||||
* Example:
|
||||
* player call ace_cargo_fnc_deployConfirm
|
||||
*
|
||||
* Public: No
|
||||
*/
|
||||
|
||||
if (GVAR(deployPFH) == -1) exitWith {};
|
||||
|
||||
params ["_unit"];
|
||||
|
||||
// Delete placement dummy and unload real item from cargo at dummy position
|
||||
if (!isNull GVAR(itemPreviewObject) && {[GVAR(selectedItem), GVAR(interactionVehicle), _unit, false, true] call FUNC(canUnloadItem)}) then {
|
||||
// Position is AGL for unloading event
|
||||
private _position = ASLToAGL getPosASL GVAR(itemPreviewObject);
|
||||
private _direction = getDir GVAR(itemPreviewObject);
|
||||
private _duration = GVAR(loadTimeCoefficient) * (GVAR(selectedItem) call FUNC(getSizeItem));
|
||||
|
||||
// If unload time is 0, don't show a progress bar
|
||||
if (_duration <= 0) exitWith {
|
||||
["ace_unloadCargo", [GVAR(selectedItem), GVAR(interactionVehicle), _unit, [_position, _direction]]] call CBA_fnc_localEvent;
|
||||
};
|
||||
|
||||
[
|
||||
_duration,
|
||||
[GVAR(selectedItem), GVAR(interactionVehicle), _unit, [_position, _direction]],
|
||||
{
|
||||
TRACE_1("deploy finish",_this);
|
||||
|
||||
["ace_unloadCargo", _this select 0] call CBA_fnc_localEvent;
|
||||
},
|
||||
{
|
||||
TRACE_1("deploy fail",_this);
|
||||
},
|
||||
format [LLSTRING(unloadingItem), [GVAR(selectedItem), true] call FUNC(getNameItem), getText (configOf GVAR(interactionVehicle) >> "displayName")],
|
||||
{
|
||||
(_this select 0) params ["_item", "_vehicle", "_unit"];
|
||||
|
||||
[_item, _vehicle, _unit, false, true] call FUNC(canUnloadItem) // don't check for a suitable unloading position when deploying
|
||||
},
|
||||
["isNotSwimming"]
|
||||
] call EFUNC(common,progressBar);
|
||||
};
|
||||
|
||||
// Cleanup EHs and preview object
|
||||
_unit call FUNC(deployCancel);
|
29
addons/cargo/functions/fnc_getSelectedItem.sqf
Normal file
29
addons/cargo/functions/fnc_getSelectedItem.sqf
Normal file
@ -0,0 +1,29 @@
|
||||
#include "..\script_component.hpp"
|
||||
/*
|
||||
* Author: Glowbal, Smith
|
||||
* Get selected item from cargo menu.
|
||||
*
|
||||
* Arguments:
|
||||
* None
|
||||
*
|
||||
* Return Value:
|
||||
* Classname of selected item or selected object <STRING> or <OBJECT> (default: nil)
|
||||
*
|
||||
* Example:
|
||||
* call ace_cargo_fnc_getSelectedItem
|
||||
*
|
||||
* Public: No
|
||||
*/
|
||||
|
||||
disableSerialization;
|
||||
|
||||
private _display = uiNamespace getVariable QGVAR(menuDisplay);
|
||||
|
||||
if (isNil "_display") exitWith {};
|
||||
|
||||
private _loaded = GVAR(interactionVehicle) getVariable [QGVAR(loaded), []];
|
||||
|
||||
if (_loaded isEqualTo []) exitWith {};
|
||||
|
||||
// This can be an object or a classname string
|
||||
_loaded param [lbCurSel (_display displayCtrl 100), nil]
|
30
addons/cargo/functions/fnc_handleDeployInterrupt.sqf
Normal file
30
addons/cargo/functions/fnc_handleDeployInterrupt.sqf
Normal file
@ -0,0 +1,30 @@
|
||||
#include "..\script_component.hpp"
|
||||
/*
|
||||
* Author: commy2, Smith
|
||||
* Handle various interruption types.
|
||||
*
|
||||
* Arguments:
|
||||
* 0: (New) unit <OBJECT>
|
||||
* 1: Old unit (for player change) <OBJECT> (default: objNull)
|
||||
*
|
||||
* Return Value:
|
||||
* None
|
||||
*
|
||||
* Example:
|
||||
* player call ace_cargo_fnc_handleDeployInterrupt
|
||||
*
|
||||
* Public: No
|
||||
*/
|
||||
|
||||
params ["_newPlayer", ["_oldPlayer", objNull]];
|
||||
TRACE_2("params",_newPlayer,_oldPlayer);
|
||||
|
||||
if (!local _newPlayer) exitWith {};
|
||||
|
||||
if (_newPlayer getVariable [QGVAR(isDeploying), false]) then {
|
||||
_newPlayer call FUNC(deployCancel);
|
||||
};
|
||||
|
||||
if (_oldPlayer getVariable [QGVAR(isDeploying), false]) then {
|
||||
_oldPlayer call FUNC(deployCancel);
|
||||
};
|
58
addons/cargo/functions/fnc_handleScrollWheel.sqf
Normal file
58
addons/cargo/functions/fnc_handleScrollWheel.sqf
Normal file
@ -0,0 +1,58 @@
|
||||
#include "..\script_component.hpp"
|
||||
/*
|
||||
* Author: L-H, commy2, Smith
|
||||
* Handles rotation of object to unload.
|
||||
*
|
||||
* Arguments:
|
||||
* 0: Scroll amount <NUMBER>
|
||||
*
|
||||
* Return Value:
|
||||
* If the scroll was handled <BOOL>
|
||||
*
|
||||
* Example:
|
||||
* 1.2 call ace_cargo_fnc_handleScrollWheel
|
||||
*
|
||||
* Public: No
|
||||
*/
|
||||
|
||||
if (GVAR(deployPFH) == -1) exitWith {false};
|
||||
|
||||
params ["_scrollAmount"];
|
||||
|
||||
private _deployedItem = GVAR(itemPreviewObject);
|
||||
|
||||
if (!CBA_events_control) then {
|
||||
private _unit = ACE_player;
|
||||
|
||||
// Raise/lower
|
||||
// Move deployed item 15 cm per scroll interval
|
||||
_scrollAmount = _scrollAmount * 0.15;
|
||||
|
||||
private _position = getPosASL _deployedItem;
|
||||
private _maxHeight = (_unit modelToWorldVisualWorld [0, 0, 0]) select 2;
|
||||
|
||||
_position set [2, ((_position select 2) + _scrollAmount min (_maxHeight + 1.5)) max _maxHeight];
|
||||
|
||||
// Move up/down object and reattach at current position
|
||||
detach _deployedItem;
|
||||
|
||||
// Uses this method of selecting position because setPosATL did not have immediate effect
|
||||
private _positionChange = _position vectorDiff (getPosASL _deployedItem);
|
||||
private _selectionPosition = _unit worldToModel (ASLtoAGL getPosWorld _deployedItem);
|
||||
_selectionPosition = _selectionPosition vectorAdd _positionChange;
|
||||
_deployedItem attachTo [_unit, _selectionPosition];
|
||||
|
||||
// Reset the deploy direction
|
||||
private _direction = _deployedItem getVariable [QGVAR(deployDirection_temp), 0];
|
||||
_deployedItem setDir _direction;
|
||||
} else {
|
||||
// Rotate
|
||||
private _direction = _deployedItem getVariable [QGVAR(deployDirection_temp), 0];
|
||||
_scrollAmount = _scrollAmount * 10;
|
||||
_direction = _direction + _scrollAmount;
|
||||
|
||||
_deployedItem setDir _direction;
|
||||
_deployedItem setVariable [QGVAR(deployDirection_temp), _direction];
|
||||
};
|
||||
|
||||
true
|
@ -22,11 +22,17 @@ private _type = typeOf _vehicle;
|
||||
private _config = configOf _vehicle;
|
||||
|
||||
// If vehicle had space given to it via eden/public, then override config hasCargo setting
|
||||
private _hasCargoPublic = _vehicle getVariable [QGVAR(hasCargo), false];
|
||||
private _hasCargoPublic = _item getVariable QGVAR(hasCargo);
|
||||
private _hasCargoPublicDefined = !isNil "_canLoadPublic";
|
||||
|
||||
if (_hasCargoPublicDefined && {!(_hasCargoPublic isEqualType false)}) then {
|
||||
WARNING_4("%1[%2] - Variable %3 is %4 - Should be bool",_item,_type,QGVAR(hasCargo),_hasCargoPublic);
|
||||
};
|
||||
|
||||
private _hasCargoConfig = getNumber (_config >> QGVAR(hasCargo)) == 1;
|
||||
|
||||
// Nothing to do here if vehicle has no cargo space
|
||||
if !(_hasCargoConfig || _hasCargoPublic) exitWith {};
|
||||
if !((_hasCargoPublicDefined && {_hasCargoPublic in [true, 1]}) || {!_hasCargoPublicDefined && {_hasCargoConfig}}) exitWith {};
|
||||
|
||||
// Check if cargo is in cargo holder types (checked when trying to search for loadable objects)
|
||||
private _addCargoType = GVAR(cargoHolderTypes) findIf {_type isKindOf _x} == -1;
|
||||
|
@ -25,6 +25,9 @@ if (GVAR(interactionParadrop)) then {
|
||||
(_display displayCtrl 12) ctrlSetText LLSTRING(paradropButton);
|
||||
};
|
||||
|
||||
// Disable deploy option if paradropping or in Zeus
|
||||
(_display displayCtrl 13) ctrlEnable (GVAR(enableDeploy) && !GVAR(interactionParadrop) && {isNull curatorCamera});
|
||||
|
||||
[{
|
||||
params ["_vehicle", "_pfhID"];
|
||||
|
||||
@ -33,7 +36,6 @@ if (GVAR(interactionParadrop)) then {
|
||||
private _display = uiNamespace getVariable QGVAR(menuDisplay);
|
||||
|
||||
if (isNil "_display") exitWith {
|
||||
GVAR(interactionVehicle) = nil;
|
||||
GVAR(interactionParadrop) = nil;
|
||||
|
||||
_pfhID call CBA_fnc_removePerFrameHandler;
|
||||
@ -41,18 +43,18 @@ if (GVAR(interactionParadrop)) then {
|
||||
|
||||
// Close menu if in invalid state
|
||||
if (
|
||||
!alive _vehicle ||
|
||||
!alive ACE_player ||
|
||||
{!alive _vehicle} ||
|
||||
{locked _vehicle >= 2} ||
|
||||
{!(_vehicle getVariable [QGVAR(hasCargo), true])} || // if the cargo menu could be opened, the vehicle has QGVAR(hasCargo) in its config or the variable is set using FUNC(setSpace)
|
||||
{
|
||||
isNull findDisplay 312 && // if in Zeus, ignore the following checks
|
||||
isNull curatorCamera && // if in Zeus, ignore the checks that follow
|
||||
{([ACE_player, _vehicle] call EFUNC(interaction,getInteractionDistance)) >= MAX_LOAD_DISTANCE} &&
|
||||
{(vehicle ACE_player) != _vehicle}
|
||||
}
|
||||
) exitWith {
|
||||
closeDialog 0;
|
||||
|
||||
GVAR(interactionVehicle) = nil;
|
||||
GVAR(interactionParadrop) = nil;
|
||||
|
||||
_pfhID call CBA_fnc_removePerFrameHandler;
|
||||
|
86
addons/cargo/functions/fnc_startDeploy.sqf
Normal file
86
addons/cargo/functions/fnc_startDeploy.sqf
Normal file
@ -0,0 +1,86 @@
|
||||
#include "..\script_component.hpp"
|
||||
/*
|
||||
* Author: Garth 'L-H' de Wet, Ruthberg, commy2, Smith
|
||||
* Starts the deploy process for unloading an object.
|
||||
*
|
||||
* Arguments:
|
||||
* 0: Unit deploying <OBJECT>
|
||||
*
|
||||
* Return Value:
|
||||
* None
|
||||
*
|
||||
* Example:
|
||||
* player call ace_cargo_fnc_startDeploy
|
||||
*
|
||||
* Public: No
|
||||
*/
|
||||
|
||||
// Deny creating preview item as it will destroy player vehicle instantly by collision
|
||||
if (GVAR(interactionParadrop)) exitWith {};
|
||||
|
||||
params ["_unit"];
|
||||
|
||||
// Don't allow deploying if already deploying
|
||||
if (_unit getVariable [QGVAR(isDeploying), false]) exitWith {};
|
||||
|
||||
// This can be an object or a classname string
|
||||
private _item = call FUNC(getSelectedItem);
|
||||
|
||||
if (isNil "_item") exitWith {};
|
||||
|
||||
// Close opened cargo menu
|
||||
closeDialog 0;
|
||||
|
||||
GVAR(selectedItem) = _item;
|
||||
|
||||
private _classname = _item;
|
||||
|
||||
if (_classname isEqualType objNull) then {
|
||||
_classname = typeOf _classname;
|
||||
};
|
||||
|
||||
// Prevent the placing unit from running
|
||||
[_unit, "forceWalk", QUOTE(ADDON), true] call EFUNC(common,statusEffect_set);
|
||||
[_unit, "blockThrow", QUOTE(ADDON), true] call EFUNC(common,statusEffect_set);
|
||||
|
||||
// Create a local preview object
|
||||
private _itemPreviewObject = createVehicleLocal [_classname, [0, 0, 0], [], 0, "CAN_COLLIDE"];
|
||||
|
||||
GVAR(itemPreviewObject) = _itemPreviewObject;
|
||||
|
||||
// Prevent collisions with object
|
||||
_itemPreviewObject disableCollisionWith _unit;
|
||||
_itemPreviewObject enableSimulation false;
|
||||
_itemPreviewObject setMass 1e-12;
|
||||
|
||||
// Detect radius of zone where collision can damage the player
|
||||
private _itemPreviewObjectRadius = 1 max ((boundingBoxReal [_itemPreviewObject, "FireGeometry"]) select 2);
|
||||
|
||||
// Add height offset of model
|
||||
private _offset = ((_itemPreviewObject modelToWorldVisual [0, 0, 0]) select 2) - ((_unit modelToWorldVisual [0, 0, 0]) select 2) + 1;
|
||||
|
||||
// Attach object
|
||||
_itemPreviewObject attachTo [_unit, [0, 1.5 * _itemPreviewObjectRadius, _offset]];
|
||||
|
||||
// PFH that runs while the deployment is in progress
|
||||
GVAR(deployPFH) = [{
|
||||
(_this select 0) params ["_unit", "_vehicle", "_item", "_itemPreviewObject"];
|
||||
|
||||
if !(
|
||||
!isNull _itemPreviewObject &&
|
||||
{[_item, _vehicle, _unit, false, true] call FUNC(canUnloadItem)} // don't check for a suitable unloading position when deploying
|
||||
) exitWith {
|
||||
_unit call FUNC(deployCancel);
|
||||
};
|
||||
}, 0.5, [_unit, GVAR(interactionVehicle), _item, _itemPreviewObject]] call CBA_fnc_addPerFrameHandler;
|
||||
|
||||
// Add mouse button action and hint
|
||||
[LLSTRING(unloadObject), localize "STR_DISP_CANCEL", LLSTRING(scrollAction)] call EFUNC(interaction,showMouseHint);
|
||||
|
||||
_unit setVariable [QGVAR(deploy), [
|
||||
_unit, "DefaultAction",
|
||||
{GVAR(deployPFH) != -1},
|
||||
{[_this select 0] call FUNC(deployConfirm)}
|
||||
] call EFUNC(common,addActionEventHandler)];
|
||||
|
||||
_unit setVariable [QGVAR(isDeploying), true, true];
|
@ -15,18 +15,8 @@
|
||||
* Public: No
|
||||
*/
|
||||
|
||||
disableSerialization;
|
||||
|
||||
private _display = uiNamespace getVariable QGVAR(menuDisplay);
|
||||
|
||||
if (isNil "_display") exitWith {};
|
||||
|
||||
private _loaded = GVAR(interactionVehicle) getVariable [QGVAR(loaded), []];
|
||||
|
||||
if (_loaded isEqualTo []) exitWith {};
|
||||
|
||||
// This can be an object or a classname string
|
||||
private _item = _loaded param [lbCurSel (_display displayCtrl 100), nil];
|
||||
private _item = call FUNC(getSelectedItem);
|
||||
|
||||
if (isNil "_item") exitWith {};
|
||||
|
||||
@ -60,11 +50,11 @@ if (GVAR(interactionParadrop)) exitWith {
|
||||
},
|
||||
format [LLSTRING(unloadingItem), [_item, true] call FUNC(getNameItem), getText (configOf GVAR(interactionVehicle) >> "displayName")],
|
||||
{
|
||||
(_this select 0) params ["", "_target"];
|
||||
(_this select 0) params ["", "_vehicle"];
|
||||
|
||||
if ((acos ((vectorUp _target) select 2)) > 30) exitWith {false}; // check flight level
|
||||
if (((getPos _target) select 2) < 25) exitWith {false}; // check height
|
||||
if ((speed _target) < -5) exitWith {false}; // check reverse
|
||||
if ((acos ((vectorUp _vehicle) select 2)) > 30) exitWith {false}; // check flight level
|
||||
if (((getPos _vehicle) select 2) < 25) exitWith {false}; // check height
|
||||
if ((speed _vehicle) < -5) exitWith {false}; // check reverse
|
||||
|
||||
true
|
||||
},
|
||||
@ -74,7 +64,7 @@ if (GVAR(interactionParadrop)) exitWith {
|
||||
};
|
||||
|
||||
// If in zeus
|
||||
if (!isNull findDisplay 312) exitWith {
|
||||
if (!isNull curatorCamera) exitWith {
|
||||
// Do not check distance to unit, but do check for valid position
|
||||
if !([_item, GVAR(interactionVehicle), objNull, true] call FUNC(canUnloadItem)) exitWith {
|
||||
[[LSTRING(unloadingFailed), [_item, true] call FUNC(getNameItem)], 3] call EFUNC(common,displayTextStructured);
|
||||
|
@ -7,6 +7,9 @@
|
||||
* 0: Item to be unloaded <STRING> or <OBJECT> (default: "")
|
||||
* 1: Holder object (vehicle) <OBJECT> (default: objNull)
|
||||
* 2: Unloader <OBJECT> (default: objNull)
|
||||
* 3: Deploy parameters <ARRAY> (default: [])
|
||||
* - 0: Position AGL <ARRAY>
|
||||
* - 1: Direction <NUMBER>
|
||||
*
|
||||
* Return Value:
|
||||
* Object unloaded <BOOL>
|
||||
@ -17,8 +20,10 @@
|
||||
* Public: Yes
|
||||
*/
|
||||
|
||||
params [["_item", "", [objNull, ""]], ["_vehicle", objNull, [objNull]], ["_unloader", objNull, [objNull]]];
|
||||
TRACE_3("params",_item,_vehicle,_unloader);
|
||||
params [["_item", "", [objNull, ""]], ["_vehicle", objNull, [objNull]], ["_unloader", objNull, [objNull]], ["_deploy", []]];
|
||||
_deploy params ["_emptyPosAGL", "_direction"];
|
||||
|
||||
TRACE_4("params",_item,_vehicle,_unloader,_deploy);
|
||||
|
||||
// Get config sensitive case name
|
||||
if (_item isEqualType "") then {
|
||||
@ -41,9 +46,18 @@ if (_itemSize < 0) exitWith {
|
||||
false // return
|
||||
};
|
||||
|
||||
// This covers testing vehicle stability and finding a safe position
|
||||
private _emptyPosAGL = [_vehicle, _item, _unloader] call EFUNC(common,findUnloadPosition);
|
||||
TRACE_1("findUnloadPosition",_emptyPosAGL);
|
||||
private _deployed = _deploy isNotEqualTo [];
|
||||
|
||||
if (!_deployed) then {
|
||||
// This covers testing vehicle stability and finding a safe position
|
||||
for "_i" from 1 to 3 do {
|
||||
_emptyPosAGL = [_vehicle, _item, _unloader] call EFUNC(common,findUnloadPosition);
|
||||
|
||||
if (_emptyPosAGL isNotEqualTo []) exitWith {};
|
||||
};
|
||||
|
||||
TRACE_1("findUnloadPosition",_emptyPosAGL);
|
||||
};
|
||||
|
||||
if (_emptyPosAGL isEqualTo []) exitWith {
|
||||
// Display text saying there are no safe places to exit the vehicle
|
||||
@ -67,9 +81,12 @@ private _object = _item;
|
||||
if (_object isEqualType objNull) then {
|
||||
detach _object;
|
||||
|
||||
// hideObjectGlobal must be executed before setPos to ensure light objects are rendered correctly
|
||||
// Do both on server to ensure they are executed in the correct order
|
||||
[QGVAR(serverUnload), [_object, _emptyPosAGL]] call CBA_fnc_serverEvent;
|
||||
// If player unloads via deployment, set direction first, then unload
|
||||
if (_deployed) then {
|
||||
[QGVAR(setDirAndUnload), [_object, _emptyPosAGL, _direction], _object] call CBA_fnc_targetEvent;
|
||||
} else {
|
||||
[QGVAR(serverUnload), [_object, _emptyPosAGL]] call CBA_fnc_serverEvent;
|
||||
};
|
||||
|
||||
if (["ace_zeus"] call EFUNC(common,isModLoaded)) then {
|
||||
// Get which curators had this object as editable
|
||||
@ -81,6 +98,12 @@ if (_object isEqualType objNull) then {
|
||||
};
|
||||
} else {
|
||||
_object = createVehicle [_item, _emptyPosAGL, [], 0, "NONE"];
|
||||
|
||||
// If player unloads via deployment, set direction. Must happen before setPosASL command according to wiki
|
||||
if (_deployed) then {
|
||||
_object setDir _direction;
|
||||
};
|
||||
|
||||
_object setPosASL (AGLtoASL _emptyPosAGL);
|
||||
|
||||
[QEGVAR(common,fixCollision), _object] call CBA_fnc_localEvent;
|
||||
@ -88,7 +111,9 @@ if (_object isEqualType objNull) then {
|
||||
};
|
||||
|
||||
// Dragging integration
|
||||
[_unloader, _object] call FUNC(unloadCarryItem);
|
||||
if (!_deployed) then {
|
||||
[_unloader, _object] call FUNC(unloadCarryItem);
|
||||
};
|
||||
|
||||
// Invoke listenable event
|
||||
["ace_cargoUnloaded", [_object, _vehicle, "unload"]] call CBA_fnc_globalEvent;
|
||||
|
Reference in New Issue
Block a user