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; }
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); }
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(); } }
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(); } }