ACE3/TO_MERGE/ace/sys_cargo/slingload/fnc_attachSlingRopeToHelicopter.sqf

117 lines
3.9 KiB
Plaintext
Raw Normal View History

2015-01-29 23:18:45 +00:00
#include "script_component.hpp"
PARAMS_2(_cargo,_helicopter);
//TODO: Check if helicopter is already filled with cargo aka soldiers, if so, make sling rope break if speed > 50
// Cargo becomes damaged and slingrope unuseable
// TODO: Cargo limits
// TODO: Move to process.sqf ?
_crew = crew _helicopter;
_passengers = [];
{
if ((assignedVehicleRole _x) select 0 == "CARGO") then {
_passengers set [count _passengers, _x];
};
} foreach _crew;
//_passenger_weight = 80 * count _passengers;
private["_cable","_pp","_reduction","_rel","_slingrope_type"];
_bboxHelicopter = boundingBox _helicopter;
_bh = abs((_bboxHelicopter select 0) select 2) + (abs((_bboxHelicopter select 1) select 2) * 1.2);
_lh = abs((_bboxHelicopter select 0) select 0) + abs((_bboxHelicopter select 1) select 0);
_hh = abs((_bboxHelicopter select 0) select 1) + abs((_bboxHelicopter select 1) select 1);
_volumeH = _lh * _bh * _hh;
_bboxCargo = boundingBox _cargo;
_bc = abs((_bboxCargo select 0) select 0) + abs((_bboxCargo select 1) select 0);
_lc = abs((_bboxCargo select 0) select 1) + abs((_bboxCargo select 1) select 1);
_hc = abs((_bboxCargo select 0) select 2) + abs((_bboxCargo select 1) select 2);
_volumeC = _lc * _bc * _hc;
_tope = 16;
_abort = false;
// Find the correct sling rope model
if (_volumeC > 0.001) then {
_rel = _volumeH / _volumeC;
if (_rel >= _tope) then {
_slingrope_type = switch (true) do {
case(_volumeC < 150): {1};
case (_volumeC < 200): {2};
default {2};
};
if (_rel < 20) then {
_slingrope_type = 1;
_volumeC = (_lc * 100) / _bc;
if (_volumeC > 100) then {_volumeC = _volumeC - 100};
if (_volumeC > 20) then {_slingrope_type = 2};
};
} else { _slingrope_type = 2; };
};
if (_abort) exitWith {
_msg1 = "An error occured with the slingload feature.";
hint _msg1;
#ifdef DEBUG_MODE_FULL
_msg2 = format ["H: %1 C: %2", typeOf _helicopter, typeOf _cargo];
LOG(_msg1); LOG(_msg2);
#endif
};
// Execute the lift
_Obx = 0;
_Oby = 0;
_Obz = 0;
_dist = -(_helicopter distance _cargo);
_cargo attachTo [_helicopter, [0,0, _dist + 0]];
_dir = direction _cargo - direction _helicopter;
if ("Air" counttype [_cargo] > 0) then { _dir = 0; };
if ("Ship" counttype [_cargo] > 0) then { _dir = 0; };
if ("Landvehicle" counttype [_cargo] > 0) then { _dir = 0;_slingrope_type = 1; };
if ("Motorcycle" counttype [_cargo] > 0) then { _slingrope_type = 1; };
_center = getArray(configFile >> "CfgVehicles" >> typeOf _helicopter >> "ACE_GeoLifterAttachment") select 0;
_cx = _center select 0;
_cy = _center select 1;
_cz = _center select 2;
switch (_slingrope_type) do {
case 1: {
_cable = "ACE_Slingrope_L" createvehicle [0,0,0];
_cable attachto [_helicopter, [_cx + 0.02,_cy - 0.1,_cz + 0.4]];
_helicopter setvariable [QGVAR(slingrope), _cable,true];
_pp = _cable selectionposition "Anclaje";
_cargo attachto [_cable, [_pp select 0, _pp select 1, _pp select 2]];
_cargo attachto [_cable, [_Obx+(_pp select 0), _Oby+(_pp select 1), _Obz+(_pp select 2)]];
_cargo setdir _dir; _cargo setpos getpos _cargo;
_reduction = 1.0025;
};
case 2: {
_cable = "ACE_Slingrope_M" createvehicle [0,0,0];
_cable attachto [_helicopter, [_cx,_cy,_cz]];
_helicopter setvariable [QGVAR(slingrope),_cable,true];
_pp = _cable selectionposition "Anclaje";
_cargo attachto [_cable, [_Obx+(_pp select 0), _Oby+(_pp select 1), _Obz+(_pp select 2) + 0.5]];
_cargo setdir _dir; _cargo setpos getpos _cargo;
_reduction = 1.0050;
};
};
// Set variables
_helicopter setVariable [QGVAR(isTransporting),true,true];
_helicopter setVariable [QGVAR(cargoHeight),(_cargo modeltoworld [0,0,0]) select 2,true];
_helicopter setVariable [QGVAR(cargo),_cargo,true];
// Visual for helicopter
localize "STR_UA_ACE_CARGOHELIHOOKED" spawn ace_fnc_visual;
[_helicopter, _reduction, _cargo] spawn COMPILE_FILE(process); // Main process loop // TODO: Evaluate some more events for this
// Add CUT action for driver of helicopter
[QGVAR(action), _helicopter] call CBA_fnc_globalEvent;