Вешайте обработчик на следующие события модуля sale:
OnBasketUpdate
OnBasketDelete
OnBasketAdd
Т.е. на каждое изменение состава корзины.
Так как сам обработчик тоже будет менять состав, не забудьте добавить флаг, чтобы не уйти в рекурсию. Что-то вроде:
if (self::$Bypass) return;
self::$Bypass = true;
// здесь ваш код
self::$Bypass = false;
Далее вам остается получить корзину, посчитать вес товаров без учета вашего, рассчитать нужное количество вашего товара и изменить его, добавить или убрать.
Корзину бы я получал на месте, не оглядываясь на входящие параметры:
\Bitrix\Main\Loader::includeModule('sale');
$basket = \Bitrix\Sale\Basket::loadItemsForFUser(
\Bitrix\Sale\Fuser::getId(),
\Bitrix\Main\Context::getCurrent()->getSite()
);
Входящие параметры сделайте так:
public static function basketOperator ($_=0,$__=0,$___=0)