diff --git a/addons/common/functions/fnc_limitMovementSpeed.sqf b/addons/common/functions/fnc_limitMovementSpeed.sqf index ab5891c6f7..33af15d3a4 100644 --- a/addons/common/functions/fnc_limitMovementSpeed.sqf +++ b/addons/common/functions/fnc_limitMovementSpeed.sqf @@ -10,27 +10,44 @@ #include "script_component.hpp" -_this spawn { - private ["_unit","_carriedObj"]; - _unit = _this select 0; - _fallDown = false; - if (count _this > 1) then { - _fallDown = _this select 1; - }; - _carriedObj = [_unit] call FUNC(getCarriedObj); - while {sleep 1;_carriedObj = [_unit] call FUNC(getCarriedObj); ((!isNull _carriedObj) && (alive _unit))} do { - if (speed _unit > 12 && vehicle _unit == _unit) then { - [format["Unit ran to fast (Speed: %1, is now dropping carrying obj",speed _unit],2] call FUNC(debug); - if (_fallDown) then { - _unit playMove "amovppnemstpsraswrfldnon"; - }; - - if (_carriedObj isKindOf "Man") then { - hint "You can not move this fast while transporting this person."; - } else { - hint "You can not move this fast while carrying this object"; - }; - [_unit,ObjNull] call FUNC(carryObj); - }; - }; +private ["_unit","_carriedObj"]; +_unit = _this select 0; +_fallDown = false; +if (count _this > 1) then { + _fallDown = _this select 1; }; + +if ((_vehicle getvariable [QGVAR(limitMovementSpeed),false])) exitwith { + _vehicle setvariable [QGVAR(limitMovementSpeed),nil,true]; +}; + +{ + private["_unit","_fallDown","_carriedObj"]; + _unit = (_this select 0) select 0; + _fallDown = (_this select 0) select 1; + + _carriedObj = [_unit] call FUNC(getCarriedObj) + + if !(_vehicle getvariable [QGVAR(limitMovementSpeed),false]) exitwith { + [(_this select 1)] call cba_fnc_removePerFrameHandler; + }; + if !((!isNull _carriedObj) && (alive _unit)) exitwith { + [(_this select 1)] call cba_fnc_removePerFrameHandler; + }; + + if (speed _unit > 12 && vehicle _unit == _unit && isTouchingGround) then { + + _unit setVelocity [0,0,0]; + + if (_fallDown) then { + _unit playMove "amovppnemstpsraswrfldnon"; + }; + + if (_carriedObj isKindOf "Man") then { + hint "You can not move this fast while transporting this person."; + } else { + hint "You can not move this fast while carrying this object"; + }; + [_unit,ObjNull] call FUNC(carryObj); + }; +}, 0.5, [_unit,_fallDown] ] call CBA_fnc_addPerFrameHandler; diff --git a/addons/common/functions/fnc_limitSpeed.sqf b/addons/common/functions/fnc_limitSpeed.sqf index 87c7532be4..63c855f69f 100644 --- a/addons/common/functions/fnc_limitSpeed.sqf +++ b/addons/common/functions/fnc_limitSpeed.sqf @@ -10,31 +10,35 @@ #include "script_component.hpp" -_this spawn { - private ["_vehicle", "_maxSpeed", "_velocity"]; +private ["_vehicle", "_maxSpeed"]; +_vehicle = _this select 0; +_maxSpeed = _this select 1; - _vehicle = _this select 0; - _maxSpeed = _this select 1; - if ((_vehicle getvariable [QGVAR(limitSpeed_f),false])) then { - _vehicle setvariable [QGVAR(limitSpeed_f),nil,true]; +if ((_vehicle getvariable [QGVAR(limitSpeed_f),false])) then { + _vehicle setvariable [QGVAR(limitSpeed_f),nil,true]; +}; + +if (_maxSpeed < 0) exitwith {}; +_vehicle setvariable [QGVAR(limitSpeed_f),true,true]; + +{ + private["_vehicle","_maxSpeed","_speed","_x","_y","_z", "_diff","_percentage","_newVelocity","_velocity"]; + _vehicle = (_this select 0) select 0; + _maxSpeed = (_this select 0) select 1; + if !(_vehicle getvariable [QGVAR(limitSpeed_f),false]) exitwith { + [(_this select 1)] call cba_fnc_removePerFrameHandler; }; - if (_maxSpeed < 0) exitwith {}; - _vehicle setvariable [QGVAR(limitSpeed_f),true,true]; + _speed = speed _vehicle; + if (_speed > _maxSpeed) then { + _velocity = velocity _vehicle; + _x = _velocity select 0; + _y = _velocity select 1; + _z = _velocity select 2; - waitUntil { - _speed = speed _vehicle; - if (_speed > _maxSpeed) then { - _velocity = velocity _vehicle; - _x = _velocity select 0; - _y = _velocity select 1; - _z = _velocity select 2; - - _diff = _speed - _maxSpeed; - _percentage = (_speed / 100) * _diff; - _newVelocity = [_x - (_x * _percentage), _y - (_y * _percentage), _z - (_z * _percentage)]; - _vehicle setVelocity _newVelocity; - }; - !(_vehicle getvariable [QGVAR(limitSpeed_f),false]) + _diff = _speed - _maxSpeed; + _percentage = (_speed / 100) * _diff; + _newVelocity = [_x - (_x * _percentage), _y - (_y * _percentage), _z - (_z * _percentage)]; + _vehicle setVelocity _newVelocity; }; -}; \ No newline at end of file +}, 0, [_vehicle,_maxSpeed] ] call CBA_fnc_addPerFrameHandler;