diff --git a/addons/common/XEH_preInit.sqf b/addons/common/XEH_preInit.sqf index 1b7bdc624c..141db507b7 100644 --- a/addons/common/XEH_preInit.sqf +++ b/addons/common/XEH_preInit.sqf @@ -154,6 +154,7 @@ PREP(selectWeaponMode); PREP(sendRequest); PREP(serverLog); PREP(setAllGear); +PREP(setApproximateVariablePublic); PREP(setCaptivityStatus); PREP(setDefinedVariable); PREP(setDisableUserInputStatus); diff --git a/addons/common/functions/fnc_setApproximateVariablePublic.sqf b/addons/common/functions/fnc_setApproximateVariablePublic.sqf new file mode 100644 index 0000000000..5131f99058 --- /dev/null +++ b/addons/common/functions/fnc_setApproximateVariablePublic.sqf @@ -0,0 +1,42 @@ +/* + * Author: esteldunedain + * Publish a variable if it's different enough from the previously published value. + * + * Argument: + * 0: Object the variable should be assigned to + * 1: Name of the variable + * 2: Value of the variable + * 3: Absolute tolerance + * + * Return value: + * Nothing. + * + * Example: + * [player, "balls", 2, 0.1] call ace_common_fnc_setApproximateVariablePublic; + * + * Public: No + */ +// #define DEBUG_MODE_FULL +#include "script_component.hpp" + +params ["_object", "_varName", "_value", "_tolerance"]; +TRACE_4("params",_object,_varName,_value,_tolerance); + +// Set exact new value locally +_object setVariable [_varName, _value]; + +// Exit if in SP - "duh" +if (!isMultiplayer) exitWith {}; + +// If new value is not different +private _oldVarName = format ["ACE_oldValue_%1", _varName]; +private _oldValue = _object getVariable [_oldVarName, -100000]; + +// Exit if new value is not different enough from the old onedifferent +if (abs(_value - _oldValue) < _tolerance) exitWith {}; + +// Publish the new value: +_object setVariable [_varName, _value, true]; +_object setVariable [_oldVarName, _value]; + +TRACE_2("Published variable:", _varName, _value);