// сам носимый баллон:

        // внедряем в FX-объект баллона контроллер подмены анимации
        // вытаскиваем индекс из носителя и применяем подмену символа анимации
        // запоминаем ссылку на новый FX-объект
        private static void ApplySymbolOverrideBalloonFX(BalloonFX.Instance smi, KBatchedAnimController kbac)
        {
            kbac.usingNewSymbolOverrideSystem = true;
            var symbolOverrideController = SymbolOverrideControllerUtil.AddToPrefab(kbac.gameObject);
            var receiver = smi.master.GetComponent <VaricolouredBalloonsHelper>();

            if (receiver != null)
            {
                receiver.fx = smi;
                VaricolouredBalloonsHelper.ApplySymbolOverrideByIdx(symbolOverrideController, receiver.ReceiverBalloonSymbolIdx);
            }
        }
 private static void EquippableBalloonConfig_OnUnequipBalloon_Prefix(Equippable eq, ref BalloonFX.Instance ___fx)
 {
     if (VaricolouredBalloonsOptions.Instance.DestroyFXAfterEffectExpired)
     {
         var carrier = (eq?.assignee?.GetSoleOwner()?.GetComponent <MinionAssignablesProxy>().target as KMonoBehaviour)?.GetComponent <VaricolouredBalloonsHelper>();
         if (carrier?.fx != null)
         {
             carrier.fx.StopSM("Unequipped");
             carrier.fx = null;
         }
     }
     ___fx = null;
 }