// by commy2
#include "script_component.hpp"

private ["_driver", "_vehicle"];

_driver = _this select 0;
_vehicle = _this select 1;

if (GETGVAR(isSpeedLimiter,false)) exitWith {
    [localize "STR_ACE_SpeedLimiter_Off"] call EFUNC(common,displayTextStructured);
    playSound "ACE_Sound_Click";
    GVAR(isSpeedLimiter) = false;
};

[localize "STR_ACE_SpeedLimiter_On"] call EFUNC(common,displayTextStructured);
playSound "ACE_Sound_Click";
GVAR(isSpeedLimiter) = true;

private "_maxSpeed";
_maxSpeed = speed _vehicle max 10;

[{
    private ["_driver", "_vehicle", "_maxSpeed"];

    _driver = _this select 0 select 0;
    _vehicle = _this select 0 select 1;
    _maxSpeed = _this select 0 select 2;

    if (!GVAR(isSpeedLimiter) || {_driver != driver _vehicle}) exitWith {
        GVAR(isSpeedLimiter) = false;
        [_this select 1] call CBA_fnc_removePerFrameHandler;
    };

    private "_speed";
    _speed = speed _vehicle;

    if (_speed > _maxSpeed) then {
        _vehicle setVelocity ((velocity _vehicle) vectorMultiply ((_maxSpeed / _speed) - 0.00001));  // fix 1.42-hotfix PhysX libraries applying force in previous direction when turning
    };

} , 0, [_driver, _vehicle, _maxSpeed]] call CBA_fnc_addPerFrameHandler;