diff --git a/api/src/main/java/com/viaversion/viaversion/api/minecraft/item/DataItem.java b/api/src/main/java/com/viaversion/viaversion/api/minecraft/item/DataItem.java index b2805ad83..297bd1e87 100644 --- a/api/src/main/java/com/viaversion/viaversion/api/minecraft/item/DataItem.java +++ b/api/src/main/java/com/viaversion/viaversion/api/minecraft/item/DataItem.java @@ -93,7 +93,7 @@ public class DataItem implements Item { } @Override - public StructuredDataContainer structuredData() { + public StructuredDataContainer dataContainer() { throw new UnsupportedOperationException(); } diff --git a/api/src/main/java/com/viaversion/viaversion/api/minecraft/item/Item.java b/api/src/main/java/com/viaversion/viaversion/api/minecraft/item/Item.java index e5fc4fca3..11a06cee4 100644 --- a/api/src/main/java/com/viaversion/viaversion/api/minecraft/item/Item.java +++ b/api/src/main/java/com/viaversion/viaversion/api/minecraft/item/Item.java @@ -90,7 +90,12 @@ public interface Item { */ void setTag(@Nullable CompoundTag tag); - StructuredDataContainer structuredData(); + /** + * Returns the data container for item data components. + * + * @return the data container + */ + StructuredDataContainer dataContainer(); /** * Returns a copy of the item. diff --git a/api/src/main/java/com/viaversion/viaversion/api/minecraft/item/StructuredItem.java b/api/src/main/java/com/viaversion/viaversion/api/minecraft/item/StructuredItem.java index d37c9793c..df6de2ef3 100644 --- a/api/src/main/java/com/viaversion/viaversion/api/minecraft/item/StructuredItem.java +++ b/api/src/main/java/com/viaversion/viaversion/api/minecraft/item/StructuredItem.java @@ -41,6 +41,11 @@ public class StructuredItem implements Item { this.data = data; } + public static StructuredItem empty() { + // Data is mutable, create a new item + return new StructuredItem(0, 0); + } + @Override public int identifier() { return identifier; @@ -72,7 +77,7 @@ public class StructuredItem implements Item { } @Override - public StructuredDataContainer structuredData() { + public StructuredDataContainer dataContainer() { return data; } diff --git a/api/src/main/java/com/viaversion/viaversion/api/type/types/item/ItemCostType1_20_5.java b/api/src/main/java/com/viaversion/viaversion/api/type/types/item/ItemCostType1_20_5.java index 3da160294..13aa1d98f 100644 --- a/api/src/main/java/com/viaversion/viaversion/api/type/types/item/ItemCostType1_20_5.java +++ b/api/src/main/java/com/viaversion/viaversion/api/type/types/item/ItemCostType1_20_5.java @@ -54,7 +54,7 @@ public final class ItemCostType1_20_5 extends Type { public void write(final ByteBuf buffer, final Item object) { Types.VAR_INT.writePrimitive(buffer, object.identifier()); Types.VAR_INT.writePrimitive(buffer, object.amount()); - dataArrayType.write(buffer, object.structuredData().data().values().toArray(EMPTY_DATA_ARRAY)); + dataArrayType.write(buffer, object.dataContainer().data().values().toArray(EMPTY_DATA_ARRAY)); } public static final class OptionalItemCostType extends OptionalType { diff --git a/api/src/main/java/com/viaversion/viaversion/api/type/types/item/ItemType1_20_5.java b/api/src/main/java/com/viaversion/viaversion/api/type/types/item/ItemType1_20_5.java index 4c25184a7..40717433f 100644 --- a/api/src/main/java/com/viaversion/viaversion/api/type/types/item/ItemType1_20_5.java +++ b/api/src/main/java/com/viaversion/viaversion/api/type/types/item/ItemType1_20_5.java @@ -33,7 +33,6 @@ import com.viaversion.viaversion.api.type.Types; import io.netty.buffer.ByteBuf; import it.unimi.dsi.fastutil.objects.Reference2ObjectOpenHashMap; import java.util.Map; -import org.checkerframework.checker.nullness.qual.Nullable; public class ItemType1_20_5 extends Type { @@ -45,10 +44,10 @@ public class ItemType1_20_5 extends Type { } @Override - public @Nullable Item read(final ByteBuf buffer) { + public Item read(final ByteBuf buffer) { final int amount = Types.VAR_INT.readPrimitive(buffer); if (amount <= 0) { - return null; + return StructuredItem.empty(); } final int id = Types.VAR_INT.readPrimitive(buffer); @@ -81,8 +80,8 @@ public class ItemType1_20_5 extends Type { } @Override - public void write(final ByteBuf buffer, @Nullable final Item object) { - if (object == null || object.isEmpty()) { + public void write(final ByteBuf buffer, final Item object) { + if (object.isEmpty()) { Types.VAR_INT.writePrimitive(buffer, 0); return; } @@ -90,7 +89,7 @@ public class ItemType1_20_5 extends Type { Types.VAR_INT.writePrimitive(buffer, object.amount()); Types.VAR_INT.writePrimitive(buffer, object.identifier()); - final Map, StructuredData> data = object.structuredData().data(); + final Map, StructuredData> data = object.dataContainer().data(); int valuesSize = 0; int markersSize = 0; for (final StructuredData value : data.values()) { diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/v1_20_3to1_20_5/rewriter/BlockItemPacketRewriter1_20_5.java b/common/src/main/java/com/viaversion/viaversion/protocols/v1_20_3to1_20_5/rewriter/BlockItemPacketRewriter1_20_5.java index 9a59b9507..b26e360b6 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/v1_20_3to1_20_5/rewriter/BlockItemPacketRewriter1_20_5.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/v1_20_3to1_20_5/rewriter/BlockItemPacketRewriter1_20_5.java @@ -88,9 +88,9 @@ import com.viaversion.viaversion.protocols.v1_20_3to1_20_5.data.BannerPatterns1_ import com.viaversion.viaversion.protocols.v1_20_3to1_20_5.data.DyeColors; import com.viaversion.viaversion.protocols.v1_20_3to1_20_5.data.Enchantments1_20_5; import com.viaversion.viaversion.protocols.v1_20_3to1_20_5.data.EquipmentSlots1_20_5; -import com.viaversion.viaversion.protocols.v1_20_3to1_20_5.data.MaxStackSize1_20_3; import com.viaversion.viaversion.protocols.v1_20_3to1_20_5.data.Instruments1_20_3; import com.viaversion.viaversion.protocols.v1_20_3to1_20_5.data.MapDecorations1_20_5; +import com.viaversion.viaversion.protocols.v1_20_3to1_20_5.data.MaxStackSize1_20_3; import com.viaversion.viaversion.protocols.v1_20_3to1_20_5.data.PotionEffects1_20_5; import com.viaversion.viaversion.protocols.v1_20_3to1_20_5.data.Potions1_20_5; import com.viaversion.viaversion.protocols.v1_20_3to1_20_5.data.TrimMaterials1_20_3; @@ -197,7 +197,7 @@ public final class BlockItemPacketRewriter1_20_5 extends ItemRewriter recipeRewriter = new RecipeRewriter1_20_3<>(protocol) { @Override protected Item rewrite(final UserConnection connection, @Nullable Item item) { - item = super.rewrite(connection, item); - if (item == null || item.isEmpty()) { - // Does not allow empty items - return new StructuredItem(1, 1); - } - return item; + return handleNonEmptyItemToClient(connection, item); } }; protocol.registerClientbound(ClientboundPackets1_20_3.UPDATE_RECIPES, wrapper -> { @@ -344,18 +339,21 @@ public final class BlockItemPacketRewriter1_20_5 extends ItemRewriter MaxStackSize1_20_3.getMaxStackSize(structuredItem.identifier())) { - structuredItem.structuredData().set(StructuredDataKey.MAX_STACK_SIZE, structuredItem.amount()); + structuredItem.dataContainer().set(StructuredDataKey.MAX_STACK_SIZE, structuredItem.amount()); } } return super.handleItemToClient(connection, structuredItem); } @Override - public @Nullable Item handleItemToServer(UserConnection connection, @Nullable final Item item) { - if (item == null) return null; + public @Nullable Item handleItemToServer(UserConnection connection, final Item item) { + if (item.isEmpty()) { + // Empty to null for the old protocols + return null; + } super.handleItemToServer(connection, item); return toOldItem(connection, item, DATA_CONVERTER); @@ -385,7 +386,7 @@ public final class BlockItemPacketRewriter1_20_5 extends ItemRewriter customData = data.getNonEmpty(StructuredDataKey.CUSTOM_DATA); @@ -405,7 +406,7 @@ public final class BlockItemPacketRewriter1_20_5 extends ItemRewriter itemFromTag(connection, item)) - .filter(Objects::nonNull) .filter(item -> allowEmpty || !item.isEmpty()) .toArray(Item[]::new); data.set(dataKey, items); } } - private @Nullable Item itemFromTag(final UserConnection connection, final CompoundTag item) { + private Item itemFromTag(final UserConnection connection, final CompoundTag item) { final String id = item.getString("id"); if (id == null) { return null; diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/v1_20_3to1_20_5/rewriter/ComponentRewriter1_20_5.java b/common/src/main/java/com/viaversion/viaversion/protocols/v1_20_3to1_20_5/rewriter/ComponentRewriter1_20_5.java index b800bbc7c..bfe60cbd9 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/v1_20_3to1_20_5/rewriter/ComponentRewriter1_20_5.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/v1_20_3to1_20_5/rewriter/ComponentRewriter1_20_5.java @@ -243,7 +243,7 @@ public class ComponentRewriter1_20_5 extends Co contentsTag.putString("id", "minecraft:stone"); } - final Map, StructuredData> data = structuredItem.structuredData().data(); + final Map, StructuredData> data = structuredItem.dataContainer().data(); if (!data.isEmpty()) { final CompoundTag components; try { @@ -971,7 +971,7 @@ public class ComponentRewriter1_20_5 extends Co } catch (IllegalArgumentException ignored) { // Fallback value tag.putInt("count", 1); } - final Map, StructuredData> components = item.structuredData().data(); + final Map, StructuredData> components = item.dataContainer().data(); tag.put("components", toTag(components, true)); } diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/v1_20_3to1_20_5/rewriter/StructuredDataConverter.java b/common/src/main/java/com/viaversion/viaversion/protocols/v1_20_3to1_20_5/rewriter/StructuredDataConverter.java index 7ef76a81c..8508fd634 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/v1_20_3to1_20_5/rewriter/StructuredDataConverter.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/v1_20_3to1_20_5/rewriter/StructuredDataConverter.java @@ -709,16 +709,12 @@ public final class StructuredDataConverter { // Check if item name could be mapped, if not, locate original/backup item id and use it static int removeItemBackupTag(final CompoundTag tag, final int unmappedId) { - if (unmappedId != -1) { - return unmappedId; - } - final IntTag itemBackupTag = tag.getIntTag(ITEM_BACKUP_TAG_KEY); if (itemBackupTag != null) { tag.remove(ITEM_BACKUP_TAG_KEY); return itemBackupTag.asInt(); } - return -1; + return unmappedId; } private void convertBlockPredicates(final CompoundTag tag, final AdventureModePredicate data, final String key, final int hideFlag) { @@ -808,7 +804,7 @@ public final class StructuredDataConverter { savedItem.putByte("Count", (byte) item.amount()); final CompoundTag itemTag = new CompoundTag(); - for (final StructuredData data : item.structuredData().data().values()) { + for (final StructuredData data : item.dataContainer().data().values()) { writeToTag(connection, data, itemTag); } savedItem.put("tag", itemTag); diff --git a/common/src/main/java/com/viaversion/viaversion/protocols/v1_20_3to1_20_5/storage/AcknowledgedMessagesStorage.java b/common/src/main/java/com/viaversion/viaversion/protocols/v1_20_3to1_20_5/storage/AcknowledgedMessagesStorage.java index c80ca1ebb..d4ec722ce 100644 --- a/common/src/main/java/com/viaversion/viaversion/protocols/v1_20_3to1_20_5/storage/AcknowledgedMessagesStorage.java +++ b/common/src/main/java/com/viaversion/viaversion/protocols/v1_20_3to1_20_5/storage/AcknowledgedMessagesStorage.java @@ -20,7 +20,6 @@ package com.viaversion.viaversion.protocols.v1_20_3to1_20_5.storage; import com.viaversion.viaversion.api.connection.StorableObject; import com.viaversion.viaversion.api.minecraft.ProfileKey; import com.viaversion.viaversion.api.protocol.packet.PacketWrapper; -import com.viaversion.viaversion.api.type.Type; import com.viaversion.viaversion.api.type.Types; import com.viaversion.viaversion.protocols.v1_20_2to1_20_3.packet.ServerboundPackets1_20_3; import com.viaversion.viaversion.protocols.v1_20_3to1_20_5.Protocol1_20_3To1_20_5; diff --git a/common/src/main/java/com/viaversion/viaversion/rewriter/StructuredItemRewriter.java b/common/src/main/java/com/viaversion/viaversion/rewriter/StructuredItemRewriter.java index 68502fae0..735817a3c 100644 --- a/common/src/main/java/com/viaversion/viaversion/rewriter/StructuredItemRewriter.java +++ b/common/src/main/java/com/viaversion/viaversion/rewriter/StructuredItemRewriter.java @@ -24,7 +24,6 @@ import com.viaversion.viaversion.api.protocol.Protocol; import com.viaversion.viaversion.api.protocol.packet.ClientboundPacketType; import com.viaversion.viaversion.api.protocol.packet.ServerboundPacketType; import com.viaversion.viaversion.api.type.Type; -import org.checkerframework.checker.nullness.qual.Nullable; public class StructuredItemRewriter> extends ItemRewriter { @@ -38,9 +37,9 @@ public class StructuredItemRewriter