@@ -418,45 +418,58 @@ protected virtual StackRequestSlotInfo ProcessPlaceAction(PlaceAction action, Li
418418 protected virtual void ProcessTakeAction ( TakeAction action , List < StackResponseContainerInfo > stackResponses )
419419 {
420420 byte count = action . Count ;
421- Item sourceItem ;
422- Item destinationItem ;
423- Item destItem = new ItemAir ( ) ;
421+
424422 StackRequestSlotInfo source = action . Source ;
425423 StackRequestSlotInfo destination = action . Destination ;
426424
427- sourceItem = GetContainerItem ( source . ContainerId , source . Slot ) ;
428- destinationItem = GetContainerItem ( destination . ContainerId , destination . Slot ) ;
425+ Item destItem = new ItemAir ( ) ;
426+ Item sourceItem = GetContainerItem ( source . ContainerId , source . Slot ) ;
427+ Item destinationItem = GetContainerItem ( destination . ContainerId , destination . Slot ) ;
429428
430429 if ( ! _player . OnItemTransaction ( new ItemTransactionEventArgs ( _player , _player . Level , sourceItem , action ) ) )
431430 {
432431 //revert. Empty looks ok
433432 }
434433 else
435434 {
436- if ( source . ContainerId == 60 && sourceItem . Id == destinationItem . Id )
435+ int totalItems = destinationItem . Count + sourceItem . Count ;
436+ if ( source . ContainerId == 60 && source . Slot == 50 ) //crafting
437437 {
438- destItem = ( Item ) destinationItem . Clone ( ) ;
439- destItem . Count += count ;
438+ destItem = ( Item ) sourceItem . Clone ( ) ;
439+ destItem . Count = ( byte ) ( destinationItem . Count + count ) ;
440440 destItem . UniqueId = Environment . TickCount ;
441+
442+ sourceItem = new ItemAir ( ) ;
443+ sourceItem . UniqueId = 0 ;
441444 }
442- else if ( source . ContainerId != 60 && sourceItem . Count == count )
445+ else if ( totalItems > 64 ) //combine if more than 64
446+ {
447+ int excessItems = totalItems - 64 ;
448+ destItem = ( Item ) sourceItem . Clone ( ) ;
449+ destItem . Count = 64 ;
450+ destItem . UniqueId = Environment . TickCount ;
451+
452+ sourceItem . Count = ( byte ) excessItems ;
453+ }
454+ else if ( sourceItem . Count == count ) //take or combine if less or 64
443455 {
444456 destItem = ( Item ) sourceItem . Clone ( ) ;
445457 destItem . Count = ( byte ) ( destinationItem . Count + count ) ;
446458 destItem . UniqueId = Environment . TickCount ;
459+
447460 sourceItem = new ItemAir ( ) ;
448461 sourceItem . UniqueId = 0 ;
449- SetContainerItem ( source . ContainerId , source . Slot , sourceItem ) ;
450462 }
451- else
463+ else //split
452464 {
453465 destItem = ( Item ) sourceItem . Clone ( ) ;
454466 destItem . Count = count ;
455467 destItem . UniqueId = Environment . TickCount ;
468+
456469 sourceItem . Count -= count ;
457- SetContainerItem ( source . ContainerId , source . Slot , sourceItem ) ;
458470 }
459471
472+ SetContainerItem ( source . ContainerId , source . Slot , sourceItem ) ;
460473 SetContainerItem ( destination . ContainerId , destination . Slot , destItem ) ;
461474
462475 if ( source . ContainerId == 22 || source . ContainerId == 23 )
0 commit comments