void charInventory_CellMouseUp(object sender, InventoryWindowEventArgs e) { var keyboard = _inputManager.KeyboardManager.CurKeyboardState; if (_dragControl.Slot != null) { if (_hoverSlot == null) { CancelDrag(); return; } if (_hoverSlot.Parent == _toolBar) { ToolBarSlotClicked(sender, new InventoryWindowCellMouseEventArgs { Cell = _hoverSlot }); CancelDrag(); return; } e = ((InventoryWindow)_hoverSlot.Parent).CreateEventArgs(_hoverSlot); // put item // check slot we want to put to var slot = e.Container.PeekSlot(e.SlotPosition); if (slot != null && !slot.CanStackWith(_dragControl.Slot)) { // exchange // first check if we can perform exchange here, we can't if we took not the whole pack var srcSlot = _sourceContainer.PeekSlot(_dragControl.Slot.GridPosition); if (srcSlot != null) { CancelDrag(); } else { var prevPosition = _dragControl.Slot.GridPosition; _dragControl.Slot.GridPosition = e.SlotPosition; ContainedSlot slotTaken; if (!e.Container.PutItemExchange(_dragControl.Slot.Item, _dragControl.Slot.GridPosition, _dragControl.Slot.ItemsCount, out slotTaken)) { throw new InvalidOperationException(); } OnSlotPut(_dragControl.Slot); slotTaken.GridPosition = prevPosition; UpdateDrag(slotTaken); CancelDrag(); } } else { // just put, gonna be okay, da da doo-doo-mmm _dragControl.Slot.GridPosition = e.SlotPosition; var itemsCount = _dragControl.Slot.ItemsCount; if (e.MouseState.RightButton == S33M3CoreComponents.Inputs.MouseHandler.ButtonState.Pressed) { if (keyboard.IsKeyDown(Keys.ShiftKey) && itemsCount > 1) { itemsCount = itemsCount / 2; } else { itemsCount = 1; } } if (!e.Container.PutItem(_dragControl.Slot.Item, _dragControl.Slot.GridPosition, itemsCount)) { throw new InvalidOperationException(); } OnSlotPut(_dragControl.Slot); _dragControl.Slot.ItemsCount -= itemsCount; if (_dragControl.Slot.ItemsCount == 0) { EndDrag(); } else { _dragControl.BringToFront(); } } } }