예제 #1
0
        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);
            }
        }
예제 #2
0
        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;
            }
            }
        }