public void RelocateItems(Character character, Character issuer, IEnumerable <Item> items, Container targetContainer)
        {
            var itemArray = items.ToArray();

            if (itemArray.Length == 1)
            {
                RelocateItem(character, issuer.Eid, itemArray[0], targetContainer);
            }
            else
            {
                using (var n = new ItemErrorNotifier(true))
                {
                    foreach (var item in itemArray)
                    {
                        try
                        {
                            RelocateItem(character, issuer.Eid, item, targetContainer);
                        }
                        catch (PerpetuumException gex)
                        {
                            n.AddError(item, gex);
                        }
                    }
                }
            }
        }
        public void TrashItems(Character issuerCharacter, IEnumerable <long> target)
        {
            var trashableItems = GetItems(target).Where(i => i.IsTrashable).ToList();

            using (var n = new ItemErrorNotifier(true))
            {
                foreach (var item in trashableItems)
                {
                    try
                    {
                        //selected robot now allowed
                        issuerCharacter.IsRobotSelectedForCharacter(item as Robot).ThrowIfTrue(ErrorCodes.RobotMustBeDeselected);

                        RemoveItemOrThrow(item);
                        Repository.Delete(item);

                        AddLogEntry(issuerCharacter, ContainerAccess.Delete, item.Definition, item.Quantity);
                        var b = TransactionLogEvent.Builder()
                                .SetTransactionType(TransactionType.TrashItem)
                                .SetCharacter(issuerCharacter)
                                .SetContainer(this)
                                .SetItem(item.Definition, item.Quantity);
                        issuerCharacter.LogTransaction(b);
                    }
                    catch (PerpetuumException gex)
                    {
                        Logger.Error("Failed to delete item:" + item.Eid + " " + item.ED.Name + " owner:" + item.Owner + " issuerCharacter:" + issuerCharacter.Id);
                        n.AddError(item, gex);
                    }
                }
            }
        }
        public void HandleRequest(IRequest request)
        {
            using (var scope = Db.CreateTransaction())
            {
                var character          = request.Session.Character;
                var targetEid          = request.Data.GetOrDefault <long>(k.eid);
                var includeRobotCargos = request.Data.GetOrDefault <int>(k.inventory) == 1;
                var containerEid       = request.Data.GetOrDefault <long>(k.container);

                character.IsDocked.ThrowIfFalse(ErrorCodes.CharacterHasToBeDocked);

                var container = Container.GetWithItems(containerEid, character, ContainerAccess.Remove);

                var targetItem = container.GetItemOrThrow(targetEid, true);
                targetItem.ED.AttributeFlags.AlwaysStackable.ThrowIfFalse(ErrorCodes.OnlyAlwaysStackableIsSupported);
                var parentContainerOfTarget = targetItem.GetOrLoadParentEntity().ThrowIfNotType <Container>(ErrorCodes.WTFErrorMedicalAttentionSuggested);
                parentContainerOfTarget.CheckAccessAndThrowIfFailed(character, ContainerAccess.Delete);

                //only from container and infinite box
                parentContainerOfTarget.IsCategory(CategoryFlags.cf_infinite_capacity_containers).ThrowIfFalse(ErrorCodes.ContainerHasToBeInfinite);

                var quantitySum = 0;
                using (var notifier = new ItemErrorNotifier(true))
                {
                    foreach (var item in container.GetItems(true))
                    {
                        try
                        {
                            if (item.Definition != targetItem.Definition || item.Eid == targetItem.Eid)
                            {
                                continue;
                            }

                            //get the parent of the current item
                            var currentParent = item.GetOrLoadParentEntity() as Container;
                            if (currentParent == null)
                            {
                                continue;
                            }

                            if (!includeRobotCargos)
                            {
                                if (currentParent is RobotInventory)
                                {
                                    //skip items in any robotcargo
                                    continue;
                                }
                            }

                            if (currentParent is VolumeWrapperContainer)
                            {
                                currentParent.CheckAccessAndThrowIfFailed(character, ContainerAccess.Delete);
                            }

                            quantitySum += item.Quantity;
                            Entity.Repository.Delete(item);
                        }
                        catch (PerpetuumException gex)
                        {
                            notifier.AddError(item, gex);
                        }
                    }
                }

                targetItem.Quantity += quantitySum;
                container.Save();

                Message.Builder.SetCommand(Commands.ListContainer).WithData(container.ToDictionary()).ToClient(request.Session).Send();

                scope.Complete();
            }
        }