public async ValueTask HandleAsync(Server server, Player player) { var inventory = player.OpenedInventory ?? player.Inventory; var(slot, isForPlayer) = ClickedSlot.GetDifference(inventory.Size); if (isForPlayer) { inventory = player.Inventory; } inventory.SetItem(slot, ClickedItem); player.LastClickedItem = ClickedItem; if (player.CurrentSlot == ClickedSlot) { var heldItem = player.GetHeldItem(); await server.BroadcastPacketAsync(new EntityEquipment { EntityId = player.EntityId, Slot = ESlot.MainHand, Item = new ItemStack(heldItem.Type, heldItem.Count, heldItem.ItemMeta) { Present = heldItem.Present } }, player); } }
public async ValueTask HandleAsync(Server server, Player player) { var inventory = player.OpenedInventory ?? player.Inventory; var(value, forPlayer) = ClickedSlot.GetDifference(inventory.Size); if (WindowId == 0 && player.LastClickedBlock.Is(Material.EnderChest) && ClickedSlot >= 27 && ClickedSlot <= 62 || forPlayer) { inventory = player.Inventory; } switch (Mode) { case InventoryOperationMode.MouseClick: await HandleMouseClick(inventory, server, player, value); break; case InventoryOperationMode.ShiftMouseClick: { if (Item == null) { return; } inventory.RemoveItem(value); player.Inventory.AddItem(Item); break; } case InventoryOperationMode.NumberKeys: { var localSlot = Button + 36; var currentItem = player.Inventory.GetItem(localSlot); if (currentItem.IsAir() && Item != null) { inventory.RemoveItem(value); player.Inventory.SetItem(localSlot, Item); } else if (!currentItem.IsAir() && Item != null) { inventory.SetItem(value, currentItem); player.Inventory.SetItem(localSlot, Item); } else { inventory.SetItem(value, currentItem); player.Inventory.RemoveItem(localSlot); } break; } case InventoryOperationMode.MiddleMouseClick: break; case InventoryOperationMode.Drop: { // TODO drop actual item if (ClickedSlot != Outsideinventory) { if (Button == 0) { inventory.RemoveItem(value); } else { inventory.RemoveItem(value, 64); } } break; } case InventoryOperationMode.MouseDrag: HandleDragClick(inventory, player, value); break; case InventoryOperationMode.DoubleClick: { if (Item == null || Item.Count >= 64) { return; } var item = Item; (ItemStack item, int index)selectedItem = (null, 0); var items = inventory.Items .Select((item, index) => (item, index)) .Where(tuple => tuple.item.Type == item.Type) .OrderByDescending(x => x.index); foreach (var(invItem, index) in items) { if (invItem != item) { continue; } var copyItem = invItem; var finalCount = item.Count + copyItem.Count; if (finalCount <= 64) { item += copyItem.Count; copyItem -= finalCount; } else if (finalCount > 64) { var difference = finalCount - 64; copyItem -= difference; item += difference; } selectedItem = (copyItem, index); break; } inventory.SetItem((short)selectedItem.index, selectedItem.item); break; } } }