From 32ffe3243c7015f574a93773902ad02fe0390598 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Wed, 30 Jan 2019 18:30:42 -0600 Subject: [PATCH] Zeus - Paradrop Cargo (#6743) * Zeus - Paradrop Cargo Waypoint * move script component * cfgpatches, localize, fix getModuleDestination call * cleanup debug --- addons/cargo/functions/fnc_paradropItem.sqf | 19 +++-- addons/zeus/CfgVehicles.hpp | 7 ++ addons/zeus/XEH_PREP.hpp | 1 + addons/zeus/config.cpp | 3 +- .../functions/fnc_moduleCargoParadrop.sqf | 71 +++++++++++++++++ .../fnc_moduleCargoParadropWaypoint.sqf | 75 ++++++++++++++++++ .../functions/fnc_moduleLoadIntoCargo.sqf | 2 +- addons/zeus/stringtable.xml | 6 ++ .../ui/Icon_Module_Zeus_ParadropCargo_ca.paa | Bin 0 -> 25506 bytes 9 files changed, 174 insertions(+), 10 deletions(-) create mode 100644 addons/zeus/functions/fnc_moduleCargoParadrop.sqf create mode 100644 addons/zeus/functions/fnc_moduleCargoParadropWaypoint.sqf create mode 100644 addons/zeus/ui/Icon_Module_Zeus_ParadropCargo_ca.paa diff --git a/addons/cargo/functions/fnc_paradropItem.sqf b/addons/cargo/functions/fnc_paradropItem.sqf index 961b2f7c36..2f9ae06336 100644 --- a/addons/cargo/functions/fnc_paradropItem.sqf +++ b/addons/cargo/functions/fnc_paradropItem.sqf @@ -6,6 +6,7 @@ * Arguments: * 0: Object * 1: Vehicle + * 2: Show Hint (default: true) * * Return Value: * Object unloaded @@ -16,7 +17,7 @@ * Public: No */ -params ["_item", "_vehicle"]; +params ["_item", "_vehicle", ["_showHint", true]]; TRACE_2("params",_item,_vehicle); private _loaded = _vehicle getVariable [QGVAR(loaded), []]; @@ -90,14 +91,16 @@ _itemObject setVelocity ((velocity _vehicle) vectorAdd ((vectorNormalized (vecto }, 1, [_itemObject]] call CBA_fnc_addPerFrameHandler; -[ +if (_showHint) then { [ - LSTRING(UnloadedItem), - getText (configFile >> "CfgVehicles" >> typeOf _itemObject >> "displayName"), - getText (configFile >> "CfgVehicles" >> typeOf _vehicle >> "displayName") - ], - 3 -] call EFUNC(common,displayTextStructured); + [ + LSTRING(UnloadedItem), + getText (configFile >> "CfgVehicles" >> typeOf _itemObject >> "displayName"), + getText (configFile >> "CfgVehicles" >> typeOf _vehicle >> "displayName") + ], + 3 + ] call EFUNC(common,displayTextStructured); +}; // Invoke listenable event ["ace_cargoUnloaded", [_item, _vehicle, "paradrop"]] call CBA_fnc_globalEvent; diff --git a/addons/zeus/CfgVehicles.hpp b/addons/zeus/CfgVehicles.hpp index 74095cb4a2..ace73e3bcd 100644 --- a/addons/zeus/CfgVehicles.hpp +++ b/addons/zeus/CfgVehicles.hpp @@ -186,6 +186,13 @@ class CfgVehicles { function = QFUNC(moduleLoadIntoCargo); icon = "a3\ui_f\data\IGUI\Cfg\Actions\loadVehicle_ca.paa"; }; + class GVAR(moduleCargoParadrop): GVAR(moduleBase) { + curatorCanAttach = 1; + category = QGVAR(AI); + displayName = CSTRING(moduleCargoParadrop_DisplayName); + function = QFUNC(moduleCargoParadrop); + icon = QPATHTOF(UI\Icon_Module_Zeus_ParadropCargo_ca.paa); + }; class GVAR(modulePatrolArea): GVAR(moduleBase) { curatorCanAttach = 1; category = QGVAR(AI); diff --git a/addons/zeus/XEH_PREP.hpp b/addons/zeus/XEH_PREP.hpp index 910b0db4d1..efa01be7d5 100644 --- a/addons/zeus/XEH_PREP.hpp +++ b/addons/zeus/XEH_PREP.hpp @@ -13,6 +13,7 @@ PREP(moduleAddSpareTrack); PREP(moduleAddSpareWheel); PREP(moduleAddOrRemoveFRIES); PREP(moduleCaptive); +PREP(moduleCargoParadrop); PREP(moduleConfigurePylons); PREP(moduleGarrison); PREP(moduleGlobalSetSkill); diff --git a/addons/zeus/config.cpp b/addons/zeus/config.cpp index 37cfa24dd4..932d5e09c8 100644 --- a/addons/zeus/config.cpp +++ b/addons/zeus/config.cpp @@ -54,7 +54,8 @@ class CfgPatches { }; class GVAR(cargo): ADDON { units[] = { - QGVAR(moduleLoadIntoCargo) + QGVAR(moduleLoadIntoCargo), + QGVAR(moduleCargoParadrop) }; }; class GVAR(repair): ADDON { diff --git a/addons/zeus/functions/fnc_moduleCargoParadrop.sqf b/addons/zeus/functions/fnc_moduleCargoParadrop.sqf new file mode 100644 index 0000000000..948a54a7a9 --- /dev/null +++ b/addons/zeus/functions/fnc_moduleCargoParadrop.sqf @@ -0,0 +1,71 @@ +#include "script_component.hpp" +/* + * Author: PabstMirror + * Commands the selected vehicle to paradrop all cargo at the specified location + * + * Arguments: + * 0: Module logic + * 1: Synchronized units + * 2: Activated + * + * Return Value: + * None + * + * Example: + * [LOGIC, [], true] call ace_zeus_fnc_moduleCargoParadrop + * + * Public: No + */ + +if (canSuspend) exitWith {[FUNC(moduleCargoParadrop), _this] call CBA_fnc_directCall;}; + +params ["_logic", "", "_activated"]; + +if ((!local _logic) || {!_activated}) exitWith {}; + +// Validate the module target +private _vehicle = attachedTo _logic; +private _pilot = driver _vehicle; +TRACE_4("moduleCargoParadrop placed",_logic,typeOf _vehicle,_pilot,typeOf _pilot); + +deleteVehicle _logic; // cleanup logic now, we just needed it to get the attached vehicle + +if (!(missionNamespace getVariable [QEGVAR(cargo,enable), false])) exitWith { + [LSTRING(RequiresAddon)] call FUNC(showMessage); +}; +if (isNull _vehicle) exitWith { + [LSTRING(NothingSelected)] call FUNC(showMessage); +}; +if (!(_vehicle isKindOf "Air")) exitWith { + [format ["%1 %2", localize "str_dn_aircraft", localize "str_msg_no_veh_select"]] call FUNC(showMessage); +}; +if ((!alive _vehicle) || {!alive _pilot}) exitWith { + [LSTRING(OnlyAlive)] call FUNC(showMessage); +}; +if ([_pilot] call EFUNC(common,isPlayer)) exitWith { + ["str_a3_cfgvehicles_moduleremotecontrol_f_errorPlayer"] call FUNC(showMessage); +}; +if ((_vehicle getVariable [QEGVAR(cargo,loaded), []]) isEqualTo []) exitWith { + [LSTRING(paradrop_noCargoLoaded)] call FUNC(showMessage); +}; + +[_vehicle, { + params ["_successful", "_vehicle", "_mousePosASL"]; + TRACE_3("getModuleDestination return",_successful,_vehicle,_mousePosASL); + + if ((!_successful) || {!alive _vehicle}) exitWith {}; + + private _pilot = driver _vehicle; + private _group = group _pilot; + + if ((!alive _vehicle) || {!alive _pilot} || {[_pilot] call EFUNC(common,isPlayer)}) exitWith {TRACE_2("invalid",_vehicle,_pilot);}; + + [_group] call CBA_fnc_clearWaypoints; + + private _wp = _group addWaypoint [ASLtoAGL _mousePosASL, 0]; + _wp setWaypointType "SCRIPTED"; + _wp setWaypointScript QPATHTOF(functions\DOUBLES(fnc,moduleCargoParadropWaypoint).sqf); + + TRACE_2("Waypoint Added",_wp,local _group); // Locality is handled by the waypoint + +}, localize LSTRING(moduleCargoParadrop_DisplayName), "\a3\ui_f\data\IGUI\Cfg\Cursors\select_target_ca.paa", [1,0,0,1], 45] call FUNC(getModuleDestination); diff --git a/addons/zeus/functions/fnc_moduleCargoParadropWaypoint.sqf b/addons/zeus/functions/fnc_moduleCargoParadropWaypoint.sqf new file mode 100644 index 0000000000..1b4e00960c --- /dev/null +++ b/addons/zeus/functions/fnc_moduleCargoParadropWaypoint.sqf @@ -0,0 +1,75 @@ +#include "script_component.hpp" +/* + * Author: PabstMirror + * Handles the paradrop cargo scripted waypoint (Scheduled Environment) + * + * Arguments: + * 0: Group + * 1: Waypoint Position + * + * Return Value: + * Waypoint Finished + * + * Example: + * [group, [0,0,0]] call ace_zeus_fnc_moduleCargoParadropWaypoint + * + * Public: No + */ + +params [["_vehicleGroup", grpNull, [grpNull]], ["_wpPos", [0, 0, 0], [[]], 3]]; +TRACE_2("moduleCargoParadropWaypoint",_vehicleGroup,_wpPos); + +private _vehicle = vehicle leader _vehicleGroup; +private _commander = driver _vehicle; +private _cargo = _vehicle getVariable [QEGVAR(cargo,loaded), []]; +if (!(_vehicle isKindOf "Air")) exitWith {WARNING_1("not in a air vehicle",typeOf _vehicle); true}; +if (_cargo isEqualTo []) exitWith {WARNING_1("no cargo",_cargo); true}; + +private _previousSpeedMode = speedMode _vehicleGroup; +private _nextMoveUpdate = -1; +private _closeEnoughTicks = 0; // should prevent aircraft from endlessly going in circles trying to hit a point + +// Start moving the vehicle to the drop off point +waitUntil { + sleep 0.1; + if ((!alive _vehicle) || {!alive _commander}) exitWith {true}; + + if (CBA_missionTime > _nextMoveUpdate) then { + private _heading = _vehicle getDir _wpPos; + private _movePos = _vehicle getPos [1000, _heading]; + TRACE_2("move",_vehicleGroup,_movePos); + _vehicle flyInHeight 150; + _vehicleGroup move _movePos; + _nextMoveUpdate = CBA_missionTime + 3; + }; + if ((_vehicle distance2D _wpPos) < 300) then {_closeEnoughTicks = _closeEnoughTicks + 1}; + private _leadDistance = _closeEnoughTicks * 3 + linearConversion [0, 300, (speed _vehicle), 50, 100, true]; + (_vehicle distance2D _wpPos) < _leadDistance +}; +TRACE_2("Finished primary movement",_vehicle distance2D _wpPos,_closeEnoughTicks); + +if ((!alive _vehicle) || {!alive _commander}) exitWith {TRACE_2("died",alive _vehicle, alive _commander); true}; +if (((getPos _vehicle) select 2) < 25) exitWith {TRACE_1("too low",getPos _vehicle); true}; + +// Fly level and straight +private _unloadFlightPos = _vehicle getRelPos [1000, 0]; +_vehicle flyInHeight 150; +_vehicleGroup setSpeedMode "LIMITED"; +_vehicleGroup move _unloadFlightPos; + +sleep 0.5; + +TRACE_2("Starting unload",_vehicle,_cargo); +{ + TRACE_1("cargo-paradropItem",_x); + [QEGVAR(cargo,paradropItem), [_x, _vehicle, false], _vehicle] call CBA_fnc_targetEvent; + sleep 1; +} forEach (+_cargo); // copy because array will be modified after each drop + +TRACE_1("Unload finished",_vehicle); + +sleep 0.5; +_vehicleGroup setSpeedMode _previousSpeedMode; + +TRACE_1("WP Done",_vehicle); +true diff --git a/addons/zeus/functions/fnc_moduleLoadIntoCargo.sqf b/addons/zeus/functions/fnc_moduleLoadIntoCargo.sqf index b13c0cc29b..7411c8ee9f 100644 --- a/addons/zeus/functions/fnc_moduleLoadIntoCargo.sqf +++ b/addons/zeus/functions/fnc_moduleLoadIntoCargo.sqf @@ -43,7 +43,7 @@ if (!alive _cargo) exitWith { params ["_successful", "_cargo", "_mousePosASL"]; if (!_successful) exitWith {}; - private _holder = (nearestObjects [ASLToAGL _mousePosASL, EGVAR(cargo,cargoHolderTypes), 5, true]) param [0, objNull]; // 2d distance search + private _holder = (nearestObjects [ASLToAGL _mousePosASL, EGVAR(cargo,cargoHolderTypes), 15, true]) param [0, objNull]; // 2d distance search if (isNull _holder) exitWith { [LSTRING(NothingSelected)] call FUNC(showMessage); }; diff --git a/addons/zeus/stringtable.xml b/addons/zeus/stringtable.xml index c841f28f91..2eb2efe2a5 100644 --- a/addons/zeus/stringtable.xml +++ b/addons/zeus/stringtable.xml @@ -1516,5 +1516,11 @@ "%1" menu menu "%1" + + Paradrop Cargo + + + No cargo loaded + diff --git a/addons/zeus/ui/Icon_Module_Zeus_ParadropCargo_ca.paa b/addons/zeus/ui/Icon_Module_Zeus_ParadropCargo_ca.paa new file mode 100644 index 0000000000000000000000000000000000000000..d1790a405b6c859c57d4c6bf23f846836609a86e GIT binary patch literal 25506 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 M?*m`gu4c3QKXCvU+W-In literal 0 HcmV?d00001