From 50176e10a87ea4a566e373389f88a6d770cff6a2 Mon Sep 17 00:00:00 2001 From: AJ Ferguson Date: Mon, 6 Jul 2020 23:44:39 -0800 Subject: [PATCH] Fix inabilty to place items into brewing stand --- .../geysermc/connector/GeyserConnector.java | 2 + .../translators/item/PotionMixRegistry.java | 113 ++++++++++++++++++ .../java/JavaDeclareRecipesTranslator.java | 8 +- 3 files changed, 117 insertions(+), 6 deletions(-) create mode 100644 connector/src/main/java/org/geysermc/connector/network/translators/item/PotionMixRegistry.java diff --git a/connector/src/main/java/org/geysermc/connector/GeyserConnector.java b/connector/src/main/java/org/geysermc/connector/GeyserConnector.java index 675c2b9a2..601421303 100644 --- a/connector/src/main/java/org/geysermc/connector/GeyserConnector.java +++ b/connector/src/main/java/org/geysermc/connector/GeyserConnector.java @@ -47,6 +47,7 @@ import org.geysermc.connector.network.translators.PacketTranslatorRegistry; import org.geysermc.connector.network.translators.effect.EffectRegistry; import org.geysermc.connector.network.translators.item.ItemRegistry; import org.geysermc.connector.network.translators.item.ItemTranslator; +import org.geysermc.connector.network.translators.item.PotionMixRegistry; import org.geysermc.connector.network.translators.sound.SoundHandlerRegistry; import org.geysermc.connector.network.translators.sound.SoundRegistry; import org.geysermc.connector.network.translators.world.WorldManager; @@ -127,6 +128,7 @@ public class GeyserConnector { ItemRegistry.init(); ItemTranslator.init(); LocaleUtils.init(); + PotionMixRegistry.init(); SoundRegistry.init(); SoundHandlerRegistry.init(); diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/item/PotionMixRegistry.java b/connector/src/main/java/org/geysermc/connector/network/translators/item/PotionMixRegistry.java new file mode 100644 index 000000000..02e01d83c --- /dev/null +++ b/connector/src/main/java/org/geysermc/connector/network/translators/item/PotionMixRegistry.java @@ -0,0 +1,113 @@ +/* + * Copyright (c) 2019-2020 GeyserMC. http://geysermc.org + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + * @author GeyserMC + * @link https://github.com/GeyserMC/Geyser + * + */ + +package org.geysermc.connector.network.translators.item; + +import com.nukkitx.protocol.bedrock.data.inventory.PotionMixData; + +import java.util.*; + +/** + * Generates a {@link Collection} of {@link PotionMixData} that enables the + * Bedrock client to place brewing items into the brewing stand. + * (Does not contain actual potion mixes.) + * + * Designed to replicate Java Edition behavior. + * (Ex: Bedrock cannot normally place glass bottles or fully upgraded + * potions into the brewing stand, but Java can.) + */ +public class PotionMixRegistry { + public static final Collection POTION_MIXES; + + private PotionMixRegistry() { + } + + public static void init() { + // no-op + } + + static { + 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")); + + List inputs = new ArrayList<>(); + inputs.add(getNonNull("minecraft:potion")); + inputs.add(getNonNull("minecraft:splash_potion")); + inputs.add(getNonNull("minecraft:lingering_potion")); + + ItemEntry glassBottle = getNonNull("minecraft:glass_bottle"); + + Set potionMixes = new HashSet<>(); + + // Add all types of potions as inputs + ItemEntry fillerIngredient = ingredients.get(0); + for (ItemEntry input : inputs) { + for (Potion potion : Potion.values()) { + potionMixes.add(new PotionMixData( + input.getBedrockId(), potion.getBedrockId(), + fillerIngredient.getBedrockId(), fillerIngredient.getBedrockData(), + glassBottle.getBedrockId(), glassBottle.getBedrockData()) + ); + } + } + + // Add all brewing ingredients + // Also adds glass bottle as input + for (ItemEntry ingredient : ingredients) { + potionMixes.add(new PotionMixData( + glassBottle.getBedrockId(), glassBottle.getBedrockData(), + ingredient.getBedrockId(), ingredient.getBedrockData(), + glassBottle.getBedrockId(), glassBottle.getBedrockData()) + ); + } + + POTION_MIXES = potionMixes; + } + + private static ItemEntry getNonNull(String javaIdentifier) { + ItemEntry itemEntry = ItemRegistry.getItemEntry(javaIdentifier); + if (itemEntry == null) + throw new NullPointerException("No item entry exists for java identifier: " + javaIdentifier); + + return itemEntry; + } +} diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/java/JavaDeclareRecipesTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/java/JavaDeclareRecipesTranslator.java index 08022640f..75ccc0a5a 100644 --- a/connector/src/main/java/org/geysermc/connector/network/translators/java/JavaDeclareRecipesTranslator.java +++ b/connector/src/main/java/org/geysermc/connector/network/translators/java/JavaDeclareRecipesTranslator.java @@ -33,7 +33,6 @@ import com.github.steveice10.mc.protocol.packet.ingame.server.ServerDeclareRecip import com.nukkitx.nbt.NbtMap; import com.nukkitx.protocol.bedrock.data.inventory.CraftingData; import com.nukkitx.protocol.bedrock.data.inventory.ItemData; -import com.nukkitx.protocol.bedrock.data.inventory.PotionMixData; import com.nukkitx.protocol.bedrock.packet.CraftingDataPacket; import it.unimi.dsi.fastutil.ints.IntOpenHashSet; import it.unimi.dsi.fastutil.ints.IntSet; @@ -45,16 +44,13 @@ import org.geysermc.connector.network.translators.Translator; import org.geysermc.connector.network.translators.item.ItemEntry; import org.geysermc.connector.network.translators.item.ItemRegistry; import org.geysermc.connector.network.translators.item.ItemTranslator; +import org.geysermc.connector.network.translators.item.PotionMixRegistry; import java.util.*; import java.util.stream.Collectors; @Translator(packet = ServerDeclareRecipesPacket.class) public class JavaDeclareRecipesTranslator extends PacketTranslator { - private static final Collection POTION_MIXES = - Arrays.stream(new int[]{372, 331, 348, 376, 289, 437, 353, 414, 382, 375, 462, 378, 396, 377, 370, 469, 470}) - .mapToObj(ingredient -> new PotionMixData(0, ingredient, 0, 0, 0, 0)) //TODO: Confirm this is correct behavior. - .collect(Collectors.toList()); @Override public void translate(ServerDeclareRecipesPacket packet, GeyserSession session) { @@ -89,7 +85,7 @@ public class JavaDeclareRecipesTranslator extends PacketTranslator