public static void Register(
            object key,
            IItemsContainer container,
            IItemsContainer[] allowedTargets   = null,
            bool registerAllowedTargetsReverse = true)
        {
            //Api.Logger.Dev(
            //    string.Format("Registering container for exchange:{0}(by {1}){2}{3}Allowed targets: {4}",
            //                  Environment.NewLine,
            //                  key.GetType().Name,
            //                  container,
            //                  Environment.NewLine,
            //                  allowedTargets?.Select(t => t.Id).GetJoinedString()));

            if (!ContainersOpenedBy.TryGetValue(key, out List <WrappedContainer> list))
            {
                list = new List <WrappedContainer>();
                ContainersOpenedBy.Add(key, list);
            }

            var clientItemsContainer = (IClientItemsContainer)container;
            var wrappedContainer     = list.FirstOrDefault(p => p.Container == clientItemsContainer);

            if (wrappedContainer == null)
            {
                wrappedContainer = new WrappedContainer(clientItemsContainer);
                list.Add(wrappedContainer);

                if (!ActiveContainersReferencesCount.TryGetValue(clientItemsContainer, out int referencesCount))
                {
                    referencesCount = 1;
                    ActiveContainersList.Add(clientItemsContainer);
                }
                else
                {
                    referencesCount++;
                }

                ActiveContainersReferencesCount[clientItemsContainer] = referencesCount;
            }

            if (allowedTargets != null)
            {
                wrappedContainer.AddAllowedTargetContainers(allowedTargets);

                if (registerAllowedTargetsReverse)
                {
                    foreach (var allowedTargetContainer in allowedTargets)
                    {
                        Register(key,
                                 allowedTargetContainer,
                                 new[] { container },
                                 registerAllowedTargetsReverse: false);
                    }
                }
            }
        }
        public static void Register(
            object key,
            IItemsContainer container,
            IItemsContainer[] allowedTargets   = null,
            bool registerAllowedTargetsReverse = true)
        {
            //Api.Logger.Dev(
            //    string.Format("Registering container for exchange:{0}(by {1}){2}{3}Allowed targets: {4}",
            //                  Environment.NewLine,
            //                  key.GetType().Name,
            //                  container,
            //                  Environment.NewLine,
            //                  allowedTargets?.Select(t => t.Id).GetJoinedString()));

            if (!ContainersOpenedBy.TryGetValue(key, out var list))
            {
                list = new List <WrappedContainer>();
                ContainersOpenedBy.Add(key, list);
            }

            var clientItemsContainer = (IClientItemsContainer)container;
            var wrappedContainer     = list.FirstOrDefault(p => p.Container == clientItemsContainer);

            if (wrappedContainer is null)
            {
                wrappedContainer = new WrappedContainer(clientItemsContainer);
                list.Add(wrappedContainer);

                if (!ActiveContainersReferencesCount.TryGetValue(clientItemsContainer, out var referencesCount))
                {
                    referencesCount = 1;
                    ActiveContainersList.Add(clientItemsContainer);
                }
                else
                {
                    referencesCount++;
                    // Ensure the order is modified - same as if the container was added for the first time.
                    // Otherwise order of container operations (such as Shift+Click to move item)
                    // might be incorrect in some cases
                    // (such as when inventory opened while crafting menu was opened).
                    ActiveContainersList.Remove(clientItemsContainer);
                    ActiveContainersList.Add(clientItemsContainer);
                }

                ActiveContainersReferencesCount[clientItemsContainer] = referencesCount;
            }

            if (allowedTargets is not null)
            {
                wrappedContainer.AddAllowedTargetContainers(allowedTargets);

                if (registerAllowedTargetsReverse)
                {
                    foreach (var allowedTargetContainer in allowedTargets)
                    {
                        Register(key,
                                 allowedTargetContainer,
                                 new[] { container },
                                 registerAllowedTargetsReverse: false);
                    }
                }
            }
        }