Вешайте обработчик на следующие события модуля 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)