Skip to content

Commit 55983a8

Browse files
committed
improve TakeAction
1 parent a633a1d commit 55983a8

File tree

2 files changed

+26
-13
lines changed

2 files changed

+26
-13
lines changed

src/MiNET/MiNET/ItemStackInventoryManager.cs

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -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)

src/MiNET/MiNET/Player.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2516,7 +2516,7 @@ public void HandleMcpeItemStackRequest(McpeItemStackRequest message)
25162516

25172517
foreach (var slot in updatedSlots)
25182518
{
2519-
//Inventory.SendSetSlot(slot.Slot, slot.ContainerId); todo something breaks
2519+
Inventory.SendSetSlot(slot.Slot, slot.ContainerId);
25202520
}
25212521
}
25222522

0 commit comments

Comments
 (0)