Exemple #1
0
 protected internal virtual int MoveOrMergeItem(int index, ItemStack item, WindowArea from)
 {
     int emptyIndex = -1;
     for (int i = 0; i < Length; i++)
     {
         if (this[i].Empty && emptyIndex == -1)
             emptyIndex = i;
         else if (this[i].Id == item.Id &&
             this[i].Metadata == item.Metadata &&
             this[i].Count < item.AsItem().MaximumStack)
         {
             // Merging takes precedence over empty slots
             emptyIndex = -1;
             if (from != null)
                 from[index] = ItemStack.EmptyStack;
             if (this[i].Count + item.Count > item.AsItem().MaximumStack)
             {
                 item = new ItemStack(item.Id, (sbyte)(item.Count - (item.AsItem().MaximumStack - this[i].Count)),
                     item.Metadata, item.Nbt);
                 this[i] = new ItemStack(item.Id, (sbyte)item.AsItem().MaximumStack, item.Metadata, item.Nbt);
                 continue;
             }
             this[i] = new ItemStack(item.Id, (sbyte)(this[i].Count + item.Count), item.Metadata);
             return i;
         }
     }
     if (emptyIndex != -1)
     {
         if (from != null)
             from[index] = ItemStack.EmptyStack;
         this[emptyIndex] = item;
     }
     return emptyIndex;
 }
 protected override WindowArea GetLinkedArea(int index, ItemStack slot)
 {
     if (!slot.Empty && slot.AsItem() is IArmorItem && (index == 2 || index == 3))
         return Armor;
     if (index == 0 || index == 1 || index == 3)
         return MainInventory;
     return Hotbar;
 }
Exemple #3
0
        protected internal virtual int MoveOrMergeItem(int index, ItemStack item, WindowArea from)
        {
            int emptyIndex = -1;

            for (int i = 0; i < Length; i++)
            {
                if (this[i].Empty && emptyIndex == -1)
                {
                    emptyIndex = i;
                }
                else if (this[i].Id == item.Id &&
                         this[i].Metadata == item.Metadata &&
                         this[i].Count < item.AsItem().MaximumStack)
                {
                    // Merging takes precedence over empty slots
                    emptyIndex = -1;
                    if (from != null)
                    {
                        from[index] = ItemStack.EmptyStack;
                    }
                    if (this[i].Count + item.Count > item.AsItem().MaximumStack)
                    {
                        item = new ItemStack(item.Id, (sbyte)(item.Count - (item.AsItem().MaximumStack - this[i].Count)),
                                             item.Metadata, item.Nbt);
                        this[i] = new ItemStack(item.Id, (sbyte)item.AsItem().MaximumStack, item.Metadata, item.Nbt);
                        continue;
                    }
                    this[i] = new ItemStack(item.Id, (sbyte)(this[i].Count + item.Count), item.Metadata);
                    return(i);
                }
            }
            if (emptyIndex != -1)
            {
                if (from != null)
                {
                    from[index] = ItemStack.EmptyStack;
                }
                this[emptyIndex] = item;
            }
            return(emptyIndex);
        }
Exemple #4
0
 protected override WindowArea GetLinkedArea(int index, ItemStack slot)
 {
     if (!slot.Empty && slot.AsItem() is IArmorItem && (index == 2 || index == 3))
     {
         return(Armor);
     }
     if (index == 0 || index == 1 || index == 3)
     {
         return(MainInventory);
     }
     return(Hotbar);
 }
Exemple #5
0
    public async Task WriteSlotAsync(ItemStack slot)
    {
        if (slot is null)
        {
            slot = new ItemStack(0, 0)
            {
                Present = true
            }
        }
        ;

        var item = slot.AsItem();

        await WriteBooleanAsync(slot.Present);

        if (slot.Present)
        {
            await WriteVarIntAsync(item.Id);
            await WriteByteAsync((sbyte)slot.Count);

            var writer = new NbtWriter(this, "");

            var itemMeta = slot.ItemMeta;

            //TODO write enchants
            if (itemMeta.HasTags())
            {
                writer.WriteBool("Unbreakable", itemMeta.Unbreakable);

                if (itemMeta.Durability > 0)
                {
                    writer.WriteInt("Damage", itemMeta.Durability);
                }

                if (itemMeta.CustomModelData > 0)
                {
                    writer.WriteInt("CustomModelData", itemMeta.CustomModelData);
                }

                if (itemMeta.CanDestroy != null)
                {
                    writer.WriteListStart("CanDestroy", NbtTagType.String, itemMeta.CanDestroy.Count);

                    foreach (var block in itemMeta.CanDestroy)
                    {
                        writer.WriteString(block);
                    }

                    writer.EndList();
                }

                if (itemMeta.Name != null)
                {
                    writer.WriteCompoundStart("display");

                    writer.WriteString("Name", new List <ChatMessage> {
                        itemMeta.Name
                    }.ToJson());

                    if (itemMeta.Lore != null)
                    {
                        writer.WriteListStart("Lore", NbtTagType.String, itemMeta.Lore.Count);

                        foreach (var lore in itemMeta.Lore)
                        {
                            writer.WriteString(new List <ChatMessage> {
                                lore
                            }.ToJson());
                        }

                        writer.EndList();
                    }

                    writer.EndCompound();
                }
                else if (itemMeta.Lore != null)
                {
                    writer.WriteCompoundStart("display");

                    writer.WriteListStart("Lore", NbtTagType.String, itemMeta.Lore.Count);

                    foreach (var lore in itemMeta.Lore)
                    {
                        writer.WriteString(new List <ChatMessage> {
                            lore
                        }.ToJson());
                    }

                    writer.EndList();

                    writer.EndCompound();
                }
            }

            writer.WriteString("id", item.UnlocalizedName);
            writer.WriteByte("Count", (byte)slot.Count);

            writer.EndCompound();
            writer.TryFinish();
        }
    }
Exemple #6
0
    public void WriteItemStack(ItemStack value)
    {
        value ??= new ItemStack(0, 0)
        {
            Present = true
        };
        WriteBoolean(value.Present);
        if (value.Present)
        {
            var item = value.AsItem();

            WriteVarInt(item.Id);
            WriteByte((sbyte)value.Count);

            NbtWriter writer = new(this, string.Empty);
            ItemMeta  meta   = value.ItemMeta;

            if (meta.HasTags())
            {
                writer.WriteByte("Unbreakable", (byte)(meta.Unbreakable ? 1 : 0));

                if (meta.Durability > 0)
                {
                    writer.WriteInt("Damage", meta.Durability);
                }

                if (meta.CustomModelData > 0)
                {
                    writer.WriteInt("CustomModelData", meta.CustomModelData);
                }

                if (meta.CanDestroy is not null)
                {
                    writer.WriteListStart("CanDestroy", NbtTagType.String, meta.CanDestroy.Count);

                    foreach (var block in meta.CanDestroy)
                    {
                        writer.WriteString(block);
                    }

                    writer.EndList();
                }

                if (meta.Name is not null)
                {
                    writer.WriteCompoundStart("display");

                    writer.WriteString("Name", new List <ChatMessage> {
                        meta.Name
                    }.ToJson());

                    if (meta.Lore is not null)
                    {
                        writer.WriteListStart("Lore", NbtTagType.String, meta.Lore.Count);

                        foreach (var lore in meta.Lore)
                        {
                            writer.WriteString(new List <ChatMessage> {
                                lore
                            }.ToJson());
                        }

                        writer.EndList();
                    }

                    writer.EndCompound();
                }
                else if (meta.Lore is not null)
                {
                    writer.WriteCompoundStart("display");

                    writer.WriteListStart("Lore", NbtTagType.String, meta.Lore.Count);

                    foreach (var lore in meta.Lore)
                    {
                        writer.WriteString(new List <ChatMessage> {
                            lore
                        }.ToJson());
                    }

                    writer.EndList();

                    writer.EndCompound();
                }
            }

            writer.WriteString("id", item.UnlocalizedName);
            writer.WriteByte("Count", (byte)value.Count);

            writer.EndCompound();
            writer.TryFinish();
        }
    }