ACE3/TO_MERGE/ace/sys_cargo/fnc_loadCargo.sqf
Giallustio e5f02f8d63 sys_cargo
sys_cargo to merge
2015-01-30 00:19:13 +01:00

81 lines
3.2 KiB
Plaintext

/*
Function: ACE_fnc_loadCargo
Description:
Load cargo into vehicles.
Parameters:
_cargo - Cargo object to load. (Must exist) [Array of one or more objects]
_vehicle - Vehicle to load cargo into. (Must exist) [Object]
Returns:
nothing
Example:
(begin example)
[[myCrate1, myCrate2], myTruck] call ACE_fnc_loadCargo;
(end)
Author:
rocko
*/
#include "script_component.hpp"
PARAMS_2(_cargo,_vehicle);
private "_error";
{
_preloading_allowed = true;
if (isNull _x) then { _error = format["Cargo (%1) does not exist",_x]; _preloading_allowed = false; TRACE_1("Cargo isNull",""); };
if (isNil "_x") then { _error = format["Cargo (%1) does not exist",_x]; _preloading_allowed = false; TRACE_1("Cargo isNil",""); };
if (isNull _vehicle) then { _error = format["Vehicle (%1) does not exist",_vehicle]; _preloading_allowed = false; TRACE_1("Vehicle isNull",""); };
if (_x getVariable [QGVAR(busy),false]) then { _error = format["Cargo (%1) is busy",_x]; _preloading_allowed = false; TRACE_1("Cargo is busy",""); };
if ({alive _x} count (crew _x) > 0) then { _error = format["Cargo (%1) has crew",_x]; _preloading_allowed = false; TRACE_1("Cargo is occupied",""); };
TRACE_1("Current cargo processed",_x);
_currentcontent = _vehicle getVariable [QGVAR(content), []]; TRACE_1("Current content",_currentcontent);
_volume_vehicle = [_vehicle] call FUNC(volume);
_size_vehicle = sizeOf (typeOf _vehicle);
_weight_vehicle = floor (_volume_vehicle * _size_vehicle * 4);
_weight_vehicle_maxload = floor (_weight_vehicle / 5);
_weight_vehicle_current = 0;
if (count _currentcontent > 0) then {
{
private ["_w"];
_w = [_x] call FUNC(weight);
_weight_vehicle_current = _weight_vehicle_current + _w;
} foreach _currentcontent;
};
TRACE_5("VSWWmaxWcur",_volume_vehicle, _size_vehicle, _weight_vehicle, _weight_vehicle_maxload, _weight_vehicle_current);
_volume_cargo = [_x] call FUNC(volume); TRACE_1("",_volume_cargo);
_weight_cargo = [_x] call FUNC(weight); TRACE_1("",_weight_cargo);
_loading_allowed = ((_weight_vehicle_maxload - _weight_vehicle_current) >= _weight_cargo); TRACE_1("",_loading_allowed);
if (!_loading_allowed) then { _error = format["Weight/Volume of cargo (%1) exceeds allowed values for %2",_x,(typeOf _vehicle)]; };
if (_loading_allowed && {_preloading_allowed}) then {
_newcontent = _currentcontent;
_newcontent set [count _newcontent,_x]; TRACE_1("New content", _newcontent);
_vehicle setVariable [QGVAR(content), _newcontent, true]; // Add cargo variables
_cargo_pos = getPosATL _x;
detach _x;
// TODO: Test enableSimulation = false; on loaded object
//_x setPos [_cargo_pos select 0, _cargo_pos select 1, (_cargo_pos select 2) - 20]; TRACE_1("Setpos cargo item",(getPos _x));
// Put stuff to [0,0,0] no matter what
_x setPos [0,0,0];
//_x spawn { // Check if cargo item is below surface
// private "_cargo_item";
// _cargo_item = _this;
// sleep 5;
// if ((getPos _cargo_item select 2) > 0) then {
// TRACE_1("Item hiding below surface failed, setting to [0,0,0]","");
// _cargo_item setPos [0,0,0]; // TODO: allowdamage false while on "hiding pos"??
// };
//};
[_x,"set"] call FUNC(determineCargo);
} else {
WARNING(_error);
};
} foreach _cargo;