private void AttemptSwap(IDragContainer <T> destination, IDragContainer <T> source) { // Provisionally remove item from both sides. var removedSourceNumber = source.GetNumber(); var removedSourceItem = source.GetItem(); var removedSourceState = source.GetModifiers(); var removedDestinationNumber = destination.GetNumber(); var removedDestinationItem = destination.GetItem(); var removedDestinationState = destination.GetModifiers(); source.RemoveItems(removedSourceNumber); destination.RemoveItems(removedDestinationNumber); var sourceTakeBackNumber = CalculateTakeBack(removedSourceItem, removedSourceNumber, source, destination); var destinationTakeBackNumber = CalculateTakeBack(removedDestinationItem, removedDestinationNumber, destination, source); // Do take backs (if needed) if (sourceTakeBackNumber > 0) { source.AddItems(removedSourceItem, sourceTakeBackNumber, removedSourceState); removedSourceNumber -= sourceTakeBackNumber; } if (destinationTakeBackNumber > 0) { destination.AddItems(removedDestinationItem, destinationTakeBackNumber, removedSourceState); removedDestinationNumber -= destinationTakeBackNumber; } // Abort if we can't do a successful swap if (source.MaxAcceptable(removedDestinationItem) < removedDestinationNumber || destination.MaxAcceptable(removedSourceItem) < removedSourceNumber) { destination.AddItems(removedDestinationItem, removedDestinationNumber, removedDestinationState); source.AddItems(removedSourceItem, removedSourceNumber, removedSourceState); return; } // If stack exists in inventory, send both items to destination to stack source and return destination if (destination.HasStack(removedSourceItem)) { destination.AddItems(removedSourceItem, removedSourceNumber, removedSourceState); destination.AddItems(removedDestinationItem, removedDestinationNumber, removedDestinationState); return; } // Do swaps if (removedDestinationNumber > 0) { source.AddItems(removedDestinationItem, removedDestinationNumber, removedDestinationState); } if (removedSourceNumber > 0) { destination.AddItems(removedSourceItem, removedSourceNumber, removedSourceState); } }