diff --git a/addons/movement/XEH_PREP.hpp b/addons/movement/XEH_PREP.hpp index 8e465970eb..04913f7670 100644 --- a/addons/movement/XEH_PREP.hpp +++ b/addons/movement/XEH_PREP.hpp @@ -1,5 +1,7 @@ +PREP(addLoadToUnitContainer); PREP(getWeight); PREP(canClimb); PREP(climb); PREP(handleClimb); +PREP(handleVirtualMass); diff --git a/addons/movement/XEH_postInit.sqf b/addons/movement/XEH_postInit.sqf index 806823f4c4..d9179a912a 100644 --- a/addons/movement/XEH_postInit.sqf +++ b/addons/movement/XEH_postInit.sqf @@ -3,6 +3,9 @@ if (!hasInterface) exitWith {}; +["playerChanged", FUNC(handleVirtualMass)] call FUNC(addEventHandler); +["playerInventoryChanged", FUNC(handleVirtualMass)] call FUNC(addEventHandler); + ["ACE3 Movement", QGVAR(climb), localize LSTRING(Climb), { // Conditions: canInteract diff --git a/addons/movement/functions/fnc_addLoadToUnitContainer.sqf b/addons/movement/functions/fnc_addLoadToUnitContainer.sqf new file mode 100644 index 0000000000..28fea8f697 --- /dev/null +++ b/addons/movement/functions/fnc_addLoadToUnitContainer.sqf @@ -0,0 +1,31 @@ +/* + * Author: commy2 + * Add (negative numbers to subtract) a virtual mass to a units container. + * + * Arguments: + * 0: The Unit + * 1: The Container + * 2: The Virtual Load + * + * Return Value: + * Success? + * + * Public: No + */ +#include "script_component.hpp" + +params [["_unit", objNull, [objNull]], ["_container", objNull, [objNull]], ["_virtualLoadToAdd", 0, [0]]]; + +if !(_container in [ + uniformContainer _unit, + vestContainer _unit, + backpackContainer _unit +]) exitWith {false}; + +private _virtualLoad = (_container getVariable [QGVAR(vLoad), 0]) + _virtualLoadToAdd; +_container setVariable [QGVAR(vLoad), _virtualLoad]; + +// update +_unit call FUNC(handleVirtualMass); + +true diff --git a/addons/movement/functions/fnc_handleVirtualMass.sqf b/addons/movement/functions/fnc_handleVirtualMass.sqf new file mode 100644 index 0000000000..5d71c58df4 --- /dev/null +++ b/addons/movement/functions/fnc_handleVirtualMass.sqf @@ -0,0 +1,42 @@ +/* + * Author: commy2 + * Recalculate the units loadCoef to emulate a mass added to uniform, vest or backpack. + * + * Arguments: + * 0: The Unit (usually the player) + * + * Return Value: + * Nothing + * + * Public: No + */ +#include "script_component.hpp" + +params ["_unit"]; + +// add sum of virtual loads +private _virtualLoad = 0; + +{ + _virtualLoad = _virtualLoad + (_x getVariable [QGVAR(vLoad), 0]); +} forEach [ + uniformContainer _unit, + vestContainer _unit, + backpackContainer _unit +]; + +// get absolute vanilla load +private _absLoad = loadAbs _unit / load _unit; + +// try to preserve other changes to the "LoadCoef" unitTrait +private _loadCoef = _unit getVariable QGVAR(loadCoef); + +if (isNil "_loadCoef") then { + _loadCoef = _unit getUnitTrait "loadCoef"; + _unit setVariable [QGVAR(loadCoef), _loadCoef, true]; +}; + +// calc. new "virtual" loadCoef +private _virtualLoadCoef = (1 + _virtualLoad / _absLoad) * _loadCoef; + +_unit setUnitTrait ["loadCoef", _virtualLoadCoef];