From 9609686eb34960937fe514d06d467ffd7fc57bcc Mon Sep 17 00:00:00 2001 From: Camotoy <20743703+Camotoy@users.noreply.github.com> Date: Fri, 17 Mar 2023 19:07:31 -0400 Subject: [PATCH] Version out potion registry The ID of (for example) redstone dust has shifted, meaning that our hack of re-using IDs no longer works. Fixes #3620 --- .../geysermc/geyser/registry/Registries.java | 4 +- .../loader/PotionMixRegistryLoader.java | 101 ++++++++++-------- .../geyser/session/GeyserSession.java | 2 +- .../java/JavaUpdateRecipesTranslator.java | 2 +- 4 files changed, 59 insertions(+), 50 deletions(-) diff --git a/core/src/main/java/org/geysermc/geyser/registry/Registries.java b/core/src/main/java/org/geysermc/geyser/registry/Registries.java index 866cbd291..b4afd7d2f 100644 --- a/core/src/main/java/org/geysermc/geyser/registry/Registries.java +++ b/core/src/main/java/org/geysermc/geyser/registry/Registries.java @@ -135,7 +135,7 @@ public final class Registries { /** * A registry holding all the potion mixes. */ - public static final SimpleRegistry> POTION_MIXES; + public static final VersionedRegistry> POTION_MIXES; /** * A registry holding all the @@ -178,7 +178,7 @@ public final class Registries { RecipeRegistryPopulator.populate(); // Create registries that require other registries to load first - POTION_MIXES = SimpleRegistry.create(PotionMixRegistryLoader::new); + POTION_MIXES = VersionedRegistry.create(PotionMixRegistryLoader::new); ENCHANTMENTS = SimpleMappedRegistry.create("mappings/enchantments.json", EnchantmentRegistryLoader::new); // Remove unneeded client generation data from NbtMapBuilder diff --git a/core/src/main/java/org/geysermc/geyser/registry/loader/PotionMixRegistryLoader.java b/core/src/main/java/org/geysermc/geyser/registry/loader/PotionMixRegistryLoader.java index 8d40edac3..694aeba9c 100644 --- a/core/src/main/java/org/geysermc/geyser/registry/loader/PotionMixRegistryLoader.java +++ b/core/src/main/java/org/geysermc/geyser/registry/loader/PotionMixRegistryLoader.java @@ -26,17 +26,18 @@ package org.geysermc.geyser.registry.loader; import com.nukkitx.protocol.bedrock.data.inventory.PotionMixData; +import it.unimi.dsi.fastutil.ints.Int2ObjectMap; +import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; import org.geysermc.geyser.inventory.item.Potion; -import org.geysermc.geyser.network.GameProtocol; import org.geysermc.geyser.registry.Registries; import org.geysermc.geyser.registry.type.ItemMapping; +import org.geysermc.geyser.registry.type.ItemMappings; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; -//TODO this needs to be versioned, but the runtime item states between 1.17 and 1.17.10 are identical except for new blocks so this works for both /** * Generates a collection of {@link PotionMixData} that enables the * Bedrock client to place brewing items into the brewing stand. @@ -46,64 +47,72 @@ import java.util.Set; * (Ex: Bedrock cannot normally place glass bottles or fully upgraded * potions into the brewing stand, but Java can.) */ -public class PotionMixRegistryLoader implements RegistryLoader> { +public class PotionMixRegistryLoader implements RegistryLoader>> { @Override - public Set load(Object input) { - List ingredients = new ArrayList<>(); - ingredients.add(getNonNull("minecraft:nether_wart")); - ingredients.add(getNonNull("minecraft:redstone")); - ingredients.add(getNonNull("minecraft:glowstone_dust")); - ingredients.add(getNonNull("minecraft:fermented_spider_eye")); - ingredients.add(getNonNull("minecraft:gunpowder")); - ingredients.add(getNonNull("minecraft:dragon_breath")); - ingredients.add(getNonNull("minecraft:sugar")); - ingredients.add(getNonNull("minecraft:rabbit_foot")); - ingredients.add(getNonNull("minecraft:glistering_melon_slice")); - ingredients.add(getNonNull("minecraft:spider_eye")); - ingredients.add(getNonNull("minecraft:pufferfish")); - ingredients.add(getNonNull("minecraft:magma_cream")); - ingredients.add(getNonNull("minecraft:golden_carrot")); - ingredients.add(getNonNull("minecraft:blaze_powder")); - ingredients.add(getNonNull("minecraft:ghast_tear")); - ingredients.add(getNonNull("minecraft:turtle_helmet")); - ingredients.add(getNonNull("minecraft:phantom_membrane")); + public Int2ObjectMap> load(Object input) { + var allPotionMixes = new Int2ObjectOpenHashMap>(Registries.ITEMS.get().size()); + for (var entry : Registries.ITEMS.get().int2ObjectEntrySet()) { + ItemMappings mappings = entry.getValue(); + List ingredients = new ArrayList<>(); + ingredients.add(getNonNull(mappings, "minecraft:nether_wart")); + ingredients.add(getNonNull(mappings, "minecraft:redstone")); + ingredients.add(getNonNull(mappings, "minecraft:glowstone_dust")); + ingredients.add(getNonNull(mappings, "minecraft:fermented_spider_eye")); + ingredients.add(getNonNull(mappings, "minecraft:gunpowder")); + ingredients.add(getNonNull(mappings, "minecraft:dragon_breath")); + ingredients.add(getNonNull(mappings, "minecraft:sugar")); + ingredients.add(getNonNull(mappings, "minecraft:rabbit_foot")); + ingredients.add(getNonNull(mappings, "minecraft:glistering_melon_slice")); + ingredients.add(getNonNull(mappings, "minecraft:spider_eye")); + ingredients.add(getNonNull(mappings, "minecraft:pufferfish")); + ingredients.add(getNonNull(mappings, "minecraft:magma_cream")); + ingredients.add(getNonNull(mappings, "minecraft:golden_carrot")); + ingredients.add(getNonNull(mappings, "minecraft:blaze_powder")); + ingredients.add(getNonNull(mappings, "minecraft:ghast_tear")); + ingredients.add(getNonNull(mappings, "minecraft:turtle_helmet")); + ingredients.add(getNonNull(mappings, "minecraft:phantom_membrane")); - List inputs = new ArrayList<>(); - inputs.add(getNonNull("minecraft:potion")); - inputs.add(getNonNull("minecraft:splash_potion")); - inputs.add(getNonNull("minecraft:lingering_potion")); + List inputs = List.of( + getNonNull(mappings, "minecraft:potion"), + getNonNull(mappings, "minecraft:splash_potion"), + getNonNull(mappings, "minecraft:lingering_potion") + ); - ItemMapping glassBottle = getNonNull("minecraft:glass_bottle"); + ItemMapping glassBottle = getNonNull(mappings, "minecraft:glass_bottle"); - Set potionMixes = new HashSet<>(); + Set potionMixes = new HashSet<>(); - // Add all types of potions as inputs - ItemMapping fillerIngredient = ingredients.get(0); - for (ItemMapping entryInput : inputs) { - for (Potion potion : Potion.values()) { + // Add all types of potions as inputs + ItemMapping fillerIngredient = ingredients.get(0); + for (ItemMapping entryInput : inputs) { + for (Potion potion : Potion.VALUES) { + potionMixes.add(new PotionMixData( + entryInput.getBedrockId(), potion.getBedrockId(), + fillerIngredient.getBedrockId(), fillerIngredient.getBedrockData(), + glassBottle.getBedrockId(), glassBottle.getBedrockData()) + ); + } + } + + // Add all brewing ingredients + // Also adds glass bottle as input + for (ItemMapping ingredient : ingredients) { potionMixes.add(new PotionMixData( - entryInput.getBedrockId(), potion.getBedrockId(), - fillerIngredient.getBedrockId(), fillerIngredient.getBedrockData(), + glassBottle.getBedrockId(), glassBottle.getBedrockData(), + ingredient.getBedrockId(), ingredient.getBedrockData(), glassBottle.getBedrockId(), glassBottle.getBedrockData()) ); } - } - // Add all brewing ingredients - // Also adds glass bottle as input - for (ItemMapping ingredient : ingredients) { - potionMixes.add(new PotionMixData( - glassBottle.getBedrockId(), glassBottle.getBedrockData(), - ingredient.getBedrockId(), ingredient.getBedrockData(), - glassBottle.getBedrockId(), glassBottle.getBedrockData()) - ); + allPotionMixes.put(entry.getIntKey(), potionMixes); } - return potionMixes; + allPotionMixes.trim(); + return allPotionMixes; } - private static ItemMapping getNonNull(String javaIdentifier) { - ItemMapping itemMapping = Registries.ITEMS.forVersion(GameProtocol.DEFAULT_BEDROCK_CODEC.getProtocolVersion()).getMapping(javaIdentifier); + private static ItemMapping getNonNull(ItemMappings mappings, String javaIdentifier) { + ItemMapping itemMapping = mappings.getMapping(javaIdentifier); if (itemMapping == null) throw new NullPointerException("No item entry exists for java identifier: " + javaIdentifier); diff --git a/core/src/main/java/org/geysermc/geyser/session/GeyserSession.java b/core/src/main/java/org/geysermc/geyser/session/GeyserSession.java index 9b7d334fc..fa0db15f2 100644 --- a/core/src/main/java/org/geysermc/geyser/session/GeyserSession.java +++ b/core/src/main/java/org/geysermc/geyser/session/GeyserSession.java @@ -640,7 +640,7 @@ public class GeyserSession implements GeyserConnection, GeyserCommandSource { // Potion mixes are registered by default, as they are needed to be able to put ingredients into the brewing stand. CraftingDataPacket craftingDataPacket = new CraftingDataPacket(); craftingDataPacket.setCleanRecipes(true); - craftingDataPacket.getPotionMixData().addAll(Registries.POTION_MIXES.get()); + craftingDataPacket.getPotionMixData().addAll(Registries.POTION_MIXES.forVersion(this.upstream.getProtocolVersion())); upstream.sendPacket(craftingDataPacket); PlayStatusPacket playStatusPacket = new PlayStatusPacket(); diff --git a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/JavaUpdateRecipesTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/JavaUpdateRecipesTranslator.java index 9923c0a16..e665d5424 100644 --- a/core/src/main/java/org/geysermc/geyser/translator/protocol/java/JavaUpdateRecipesTranslator.java +++ b/core/src/main/java/org/geysermc/geyser/translator/protocol/java/JavaUpdateRecipesTranslator.java @@ -167,7 +167,7 @@ public class JavaUpdateRecipesTranslator extends PacketTranslator stonecutterRecipeMap = new Int2ObjectOpenHashMap<>(); for (Int2ObjectMap.Entry> data : unsortedStonecutterData.int2ObjectEntrySet()) {