diff --git a/core/src/main/java/org/geysermc/geyser/registry/populator/CustomItemRegistryPopulator.java b/core/src/main/java/org/geysermc/geyser/registry/populator/CustomItemRegistryPopulator.java index cd19ab14718..d1cec32312f 100644 --- a/core/src/main/java/org/geysermc/geyser/registry/populator/CustomItemRegistryPopulator.java +++ b/core/src/main/java/org/geysermc/geyser/registry/populator/CustomItemRegistryPopulator.java @@ -33,6 +33,7 @@ import org.cloudburstmc.nbt.NbtType; import org.cloudburstmc.protocol.bedrock.data.definitions.ItemDefinition; import org.cloudburstmc.protocol.bedrock.data.definitions.SimpleItemDefinition; +import org.cloudburstmc.protocol.bedrock.data.inventory.ItemVersion; import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.api.item.custom.CustomItemData; import org.geysermc.geyser.api.item.custom.CustomRenderOffsets; @@ -106,7 +107,7 @@ public boolean register(@NonNull NonVanillaCustomItemData customItemData) { public static GeyserCustomMappingData registerCustomItem(String customItemName, Item javaItem, GeyserMappingItem mapping, CustomItemData customItemData, int bedrockId, int protocolVersion) { NbtMapBuilder builder = createComponentNbt(customItemData, javaItem, mapping, customItemName, bedrockId, protocolVersion); - ItemDefinition itemDefinition = new SimpleItemDefinition(customItemName, bedrockId, 1, true, builder.build()); + ItemDefinition itemDefinition = new SimpleItemDefinition(customItemName, bedrockId, ItemVersion.DATA_DRIVEN, true, builder.build()); return new GeyserCustomMappingData(itemDefinition, customItemName, bedrockId); } @@ -143,7 +144,7 @@ public static NonVanillaItemRegistration registerCustomItem(NonVanillaCustomItem customItemData.isHat(), customItemData.displayHandheld(), protocolVersion); ItemMapping customItemMapping = ItemMapping.builder() .bedrockIdentifier(customIdentifier) - .bedrockDefinition(new SimpleItemDefinition(customIdentifier, customItemId, 1, true, builder.build())) + .bedrockDefinition(new SimpleItemDefinition(customIdentifier, customItemId, ItemVersion.DATA_DRIVEN, true, builder.build())) .bedrockData(0) .bedrockBlockDefinition(null) .toolType(customItemData.toolType()) diff --git a/core/src/main/java/org/geysermc/geyser/registry/populator/DataComponentRegistryPopulator.java b/core/src/main/java/org/geysermc/geyser/registry/populator/DataComponentRegistryPopulator.java index 742564a390e..829e8719e10 100644 --- a/core/src/main/java/org/geysermc/geyser/registry/populator/DataComponentRegistryPopulator.java +++ b/core/src/main/java/org/geysermc/geyser/registry/populator/DataComponentRegistryPopulator.java @@ -48,6 +48,9 @@ import java.util.List; import java.util.Map; +/** + * Loads default item components for all Java items. + */ public final class DataComponentRegistryPopulator { public static void populate() { diff --git a/core/src/main/java/org/geysermc/geyser/registry/populator/ItemRegistryPopulator.java b/core/src/main/java/org/geysermc/geyser/registry/populator/ItemRegistryPopulator.java index 6e269b5a382..08f3226f9e2 100644 --- a/core/src/main/java/org/geysermc/geyser/registry/populator/ItemRegistryPopulator.java +++ b/core/src/main/java/org/geysermc/geyser/registry/populator/ItemRegistryPopulator.java @@ -54,6 +54,7 @@ import org.cloudburstmc.protocol.bedrock.data.inventory.CreativeItemData; import org.cloudburstmc.protocol.bedrock.data.inventory.CreativeItemGroup; import org.cloudburstmc.protocol.bedrock.data.inventory.ItemData; +import org.cloudburstmc.protocol.bedrock.data.inventory.ItemVersion; import org.geysermc.geyser.Constants; import org.geysermc.geyser.GeyserBootstrap; import org.geysermc.geyser.GeyserImpl; @@ -212,15 +213,13 @@ public static void populate() { nextFreeBedrockId = id + 1; } - NbtMap components = null; - if (entry.isComponentBased()) { - components = vanillaComponents.getCompound(entry.getName()); - if (components == null) { - throw new RuntimeException("Could not find vanilla components for vanilla component based item! " + entry.getName()); - } + // Some items, e.g. food, are not component based but still have components + NbtMap components = vanillaComponents.getCompound(entry.getName()); + if (components == null && entry.isComponentBased()) { + throw new RuntimeException("Could not find vanilla components for vanilla component based item! " + entry.getName()); } - ItemDefinition definition = new SimpleItemDefinition(entry.getName().intern(), id, entry.getVersion(), entry.isComponentBased(), components); + ItemDefinition definition = new SimpleItemDefinition(entry.getName().intern(), id, ItemVersion.from(entry.getVersion()), entry.isComponentBased(), components); definitions.put(entry.getName(), definition); registry.put(definition.getRuntimeId(), definition); } @@ -453,7 +452,7 @@ public static void populate() { int customProtocolId = nextFreeBedrockId++; mappingItem = mappingItem.withBedrockData(customProtocolId); bedrockIdentifier = customBlockData.identifier(); - definition = new SimpleItemDefinition(bedrockIdentifier, customProtocolId, 1, false, null); + definition = new SimpleItemDefinition(bedrockIdentifier, customProtocolId, ItemVersion.DATA_DRIVEN, true, NbtMap.EMPTY); registry.put(customProtocolId, definition); customBlockItemDefinitions.put(customBlockData, definition); customIdMappings.put(customProtocolId, bedrockIdentifier); @@ -593,7 +592,7 @@ public static void populate() { if (customItemsAllowed) { // Add furnace minecart int furnaceMinecartId = nextFreeBedrockId++; - ItemDefinition definition = new SimpleItemDefinition("geysermc:furnace_minecart", furnaceMinecartId, 1, true, registerFurnaceMinecart(furnaceMinecartId)); + ItemDefinition definition = new SimpleItemDefinition("geysermc:furnace_minecart", furnaceMinecartId, ItemVersion.DATA_DRIVEN, true, registerFurnaceMinecart(furnaceMinecartId)); definitions.put("geysermc:furnace_minecart", definition); registry.put(definition.getRuntimeId(), definition); componentItemData.add(definition); @@ -667,7 +666,7 @@ public static void populate() { String identifier = customBlock.identifier(); // TODO verify - final ItemDefinition definition = new SimpleItemDefinition(identifier, customProtocolId, 1, false, null); + final ItemDefinition definition = new SimpleItemDefinition(identifier, customProtocolId, ItemVersion.DATA_DRIVEN, false, null); registry.put(customProtocolId, definition); customBlockItemDefinitions.put(customBlock, definition); customIdMappings.put(customProtocolId, identifier); diff --git a/core/src/main/resources/bedrock/item_components.nbt b/core/src/main/resources/bedrock/item_components.nbt index 34d2ac7f0ca..b34ebf88146 100644 Binary files a/core/src/main/resources/bedrock/item_components.nbt and b/core/src/main/resources/bedrock/item_components.nbt differ diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 4616ab96dda..1d993bf60a1 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -10,9 +10,9 @@ netty-io-uring = "0.0.25.Final-SNAPSHOT" guava = "29.0-jre" gson = "2.3.1" # Provided by Spigot 1.8.8 websocket = "1.5.1" -protocol-connection = "3.0.0.Beta6-20250203.121006-1" -protocol-common = "3.0.0.Beta6-20250203.121006-1" -protocol-codec = "3.0.0.Beta6-20250203.121006-1" +protocol-connection = "3.0.0.Beta6-20250212.131009-3" +protocol-common = "3.0.0.Beta6-20250212.131009-3" +protocol-codec = "3.0.0.Beta6-20250212.131009-3" raknet = "1.0.0.CR3-20250128.101054-17" minecraftauth = "4.1.1" mcprotocollib = "1.21.4-20250121.131208-18"