-
Notifications
You must be signed in to change notification settings - Fork 763
Expand file tree
/
Copy pathfnc_dropObject_carry.sqf
More file actions
150 lines (121 loc) · 4.88 KB
/
Copy pathfnc_dropObject_carry.sqf
File metadata and controls
150 lines (121 loc) · 4.88 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
#include "..\script_component.hpp"
/*
* Author: commy2
* Drops a carried object.
*
* Arguments:
* 0: Unit that carries the other object <OBJECT>
* 1: Carried object to drop <OBJECT>
* 2: Try loading object into vehicle <BOOL> (default: false)
*
* Return Value:
* None
*
* Example:
* [player, cursorTarget] call ace_dragging_fnc_dropObject_carry;
*
* Public: No
*/
params ["_unit", "_target", ["_tryLoad", false]];
TRACE_1("params",_this);
// Remove drop action
[_unit, "DefaultAction", _unit getVariable [QGVAR(releaseActionID), -1]] call EFUNC(common,removeActionEventHandler);
_unit setVariable [QGVAR(releaseActionID), nil];
private _inBuilding = _unit call FUNC(isObjectOnObject);
private _isClone = _target isKindOf QGVAR(clone);
// Drop cloned dead units
if (_isClone) then {
_target = [_unit, _target, _inBuilding] call FUNC(deleteClone);
};
// Prevent collision damage
[QEGVAR(common,fixCollision), _unit] call CBA_fnc_localEvent;
[QEGVAR(common,fixCollision), _target, _target] call CBA_fnc_targetEvent;
private _cursorObject = cursorObject;
_tryLoad = _tryLoad && {!isNull _cursorObject} && {[_unit, _cursorObject, ["isNotCarrying"]] call EFUNC(common,canInteractWith)};
private _loadCargo = false;
// Don't release object if loading into vehicle (object might be released into vehicle)
if (_tryLoad && {!(_target isKindOf "CAManBase")} && {["ace_cargo"] call EFUNC(common,isModLoaded)} && {[_target, _cursorObject] call EFUNC(cargo,canLoadItemIn)}) then {
_loadCargo = true;
} else {
// Release object
detach _target;
};
// Put unit into correct animation
if (_target isKindOf "CAManBase") then {
if (_target call EFUNC(common,isAwake)) then {
[_target, "amovppnemstpsnonwnondnon", 2] call EFUNC(common,doAnimation);
} else {
[_target, "unconscious", 2] call EFUNC(common,doAnimation);
};
};
// Fix anim when aborting carrying persons
if (isNull objectParent _unit && {_unit call EFUNC(common,isAwake)}) then {
private _animationState = animationState _unit;
if (_animationState regexMatch "^acinpercmrunsnonwnond.*" || {_animationState in CARRY_ANIMATIONS}) then {
[_unit, "", 2] call EFUNC(common,doAnimation);
};
};
// Properly remove fake weapon
_unit removeWeapon "ACE_FakePrimaryWeapon";
// Reselect weapon and re-enable sprint
private _previousWeaponState = _unit getVariable QGVAR(previousWeapon);
if (!isNil "_previousWeaponState") then {
_unit selectWeapon _previousWeaponState;
_unit setVariable [QGVAR(previousWeapon), nil, true];
};
[_unit, "forceWalk", QUOTE(ADDON), false] call EFUNC(common,statusEffect_set);
[_unit, "blockSprint", QUOTE(ADDON), false] call EFUNC(common,statusEffect_set);
[_unit, "blockThrow", QUOTE(ADDON), false] call EFUNC(common,statusEffect_set);
// Prevent object from flipping inside buildings
if (_inBuilding && {!_isClone}) then {
_target setPosASL (getPosASL _target vectorAdd [0, 0, 0.05]);
TRACE_2("setPos",getPosASL _unit,getPosASL _target);
};
_unit setVariable [QGVAR(isCarrying), false, true];
_unit setVariable [QGVAR(carriedObject), objNull, true];
// Make object accessible for other units
[objNull, _target, true] call EFUNC(common,claim);
if !(_target isKindOf "CAManBase") then {
[QEGVAR(common,fixPosition), _target, _target] call CBA_fnc_targetEvent;
[QEGVAR(common,fixFloating), _target, _target] call CBA_fnc_targetEvent;
};
// Reenable UAV crew
private _UAVCrew = _target getVariable [QGVAR(isUAV), []];
if (_UAVCrew isNotEqualTo []) then {
// Reenable AI
{
[_x, false] call EFUNC(common,disableAiUAV);
} forEach _UAVCrew;
_target setVariable [QGVAR(isUAV), nil, true];
};
// Reset mass
private _mass = _target getVariable [QGVAR(originalMass), 0];
if (_mass != 0) then {
[QEGVAR(common,setMass), [_target, _mass]] call CBA_fnc_globalEvent; // Force global sync
};
// Reset temp direction
_target setVariable [QGVAR(carryDirection_temp), nil];
// (Try) loading into vehicle
if (_loadCargo) then {
[_unit, _target, _cursorObject] call EFUNC(cargo,startLoadIn);
} else {
if (
_tryLoad
&& {_target isKindOf "CAManBase"}
&& {[_unit, _cursorObject] call EFUNC(interaction,getInteractionDistance) < MAX_LOAD_DISTANCE_MAN}
) then {
// can't search nearest vehicles because target position can be desynced ATM
private _vehicles = [_target, nil, nil, _cursorObject] call EFUNC(common,nearestVehiclesFreeSeat);
if (_vehicles isEqualTo [_cursorObject]) then {
if (GETEGVAR(medical,enabled,false)) then {
[_unit, _target, _cursorObject] call EFUNC(medical_treatment,loadUnit);
} else {
[_unit, _target, _cursorObject] call EFUNC(common,loadPerson);
};
// Repurpose variable for flag used in event below
_loadCargo = true;
};
};
};
// API
[QGVAR(stoppedCarry), [_unit, _target, _loadCargo]] call CBA_fnc_localEvent;