From d8ec4a5389204466691803f2811bb8f11b9bee0e Mon Sep 17 00:00:00 2001 From: Konicai <71294714+konicai@users.noreply.github.com> Date: Mon, 15 May 2023 22:51:52 -0400 Subject: [PATCH] Hardcode armor trim recipes --- .../geyser/inventory/recipe/TrimRecipe.java | 94 +++++++++++++++++++ .../java/JavaUpdateRecipesTranslator.java | 37 ++++---- 2 files changed, 111 insertions(+), 20 deletions(-) create mode 100644 core/src/main/java/org/geysermc/geyser/inventory/recipe/TrimRecipe.java diff --git a/core/src/main/java/org/geysermc/geyser/inventory/recipe/TrimRecipe.java b/core/src/main/java/org/geysermc/geyser/inventory/recipe/TrimRecipe.java new file mode 100644 index 000000000..584928e65 --- /dev/null +++ b/core/src/main/java/org/geysermc/geyser/inventory/recipe/TrimRecipe.java @@ -0,0 +1,94 @@ +/* + * Copyright (c) 2019-2023 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.geyser.inventory.recipe; + +import org.cloudburstmc.protocol.bedrock.data.TrimMaterial; +import org.cloudburstmc.protocol.bedrock.data.TrimPattern; +import org.cloudburstmc.protocol.bedrock.data.inventory.descriptor.ItemDescriptorWithCount; +import org.cloudburstmc.protocol.bedrock.data.inventory.descriptor.ItemTagDescriptor; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * Hardcoded recipe information about armor trims until further improvements can be made. This information was scraped + * from BDS 1.19.81 with a world with the next_major_update and sniffer features enabled, using ProxyPass. + */ +public class TrimRecipe { + + // For TrimDataPacket, which BDS sends just before the CraftingDataPacket + public static final List PATTERNS; + public static final List MATERIALS; + + // For CraftingDataPacket + public static final String ID = "minecraft:smithing_armor_trim"; + public static final ItemDescriptorWithCount BASE = tagDescriptor("minecraft:trimmable_armors"); + public static final ItemDescriptorWithCount ADDITION = tagDescriptor("minecraft:trim_materials"); + public static final ItemDescriptorWithCount TEMPLATE = tagDescriptor("minecraft:trim_templates"); + + static { + List patterns = new ArrayList<>(16); + patterns.add(new TrimPattern("minecraft:ward_armor_trim_smithing_template", "ward")); + patterns.add(new TrimPattern("minecraft:sentry_armor_trim_smithing_template", "sentry")); + patterns.add(new TrimPattern("minecraft:snout_armor_trim_smithing_template", "snout")); + patterns.add(new TrimPattern("minecraft:dune_armor_trim_smithing_template", "dune")); + patterns.add(new TrimPattern("minecraft:spire_armor_trim_smithing_template", "spire")); + patterns.add(new TrimPattern("minecraft:tide_armor_trim_smithing_template", "tide")); + patterns.add(new TrimPattern("minecraft:wild_armor_trim_smithing_template", "wild")); + patterns.add(new TrimPattern("minecraft:rib_armor_trim_smithing_template", "rib")); + patterns.add(new TrimPattern("minecraft:coast_armor_trim_smithing_template", "coast")); + patterns.add(new TrimPattern("minecraft:shaper_armor_trim_smithing_template", "shaper")); + patterns.add(new TrimPattern("minecraft:eye_armor_trim_smithing_template", "eye")); + patterns.add(new TrimPattern("minecraft:vex_armor_trim_smithing_template", "vex")); + patterns.add(new TrimPattern("minecraft:silence_armor_trim_smithing_template", "silence")); + patterns.add(new TrimPattern("minecraft:wayfinder_armor_trim_smithing_template", "wayfinder")); + patterns.add(new TrimPattern("minecraft:raiser_armor_trim_smithing_template", "raiser")); + patterns.add(new TrimPattern("minecraft:host_armor_trim_smithing_template", "host")); + PATTERNS = Collections.unmodifiableList(patterns); + + List materials = new ArrayList<>(10); + materials.add(new TrimMaterial("quartz", "§h", "minecraft:quartz")); + materials.add(new TrimMaterial("iron", "§i", "minecraft:iron_ingot")); + materials.add(new TrimMaterial("netherite", "§j", "minecraft:netherite_ingot")); + materials.add(new TrimMaterial("redstone", "§m", "minecraft:redstone")); + materials.add(new TrimMaterial("copper", "§n", "minecraft:copper_ingot")); + materials.add(new TrimMaterial("gold", "§p", "minecraft:gold_ingot")); + materials.add(new TrimMaterial("emerald", "§q", "minecraft:emerald")); + materials.add(new TrimMaterial("diamond", "§s", "minecraft:diamond")); + materials.add(new TrimMaterial("lapis", "§t", "minecraft:lapis_lazuli")); + materials.add(new TrimMaterial("amethyst", "§u", "minecraft:amethyst_shard")); + MATERIALS = Collections.unmodifiableList(materials); + } + + private TrimRecipe() { + //no-op + } + + private static ItemDescriptorWithCount tagDescriptor(String tag) { + return new ItemDescriptorWithCount(new ItemTagDescriptor(tag), 1); + } +} 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 7fa6ee860..b69a432be 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 @@ -32,7 +32,6 @@ import com.github.steveice10.mc.protocol.data.game.recipe.RecipeType; import com.github.steveice10.mc.protocol.data.game.recipe.data.ShapedRecipeData; import com.github.steveice10.mc.protocol.data.game.recipe.data.ShapelessRecipeData; import com.github.steveice10.mc.protocol.data.game.recipe.data.SmithingTransformRecipeData; -import com.github.steveice10.mc.protocol.data.game.recipe.data.SmithingTrimRecipeData; import com.github.steveice10.mc.protocol.data.game.recipe.data.StoneCuttingRecipeData; import com.github.steveice10.mc.protocol.packet.ingame.clientbound.ClientboundUpdateRecipesPacket; import it.unimi.dsi.fastutil.ints.*; @@ -42,13 +41,16 @@ import org.cloudburstmc.protocol.bedrock.data.defintions.ItemDefinition; import org.cloudburstmc.protocol.bedrock.data.inventory.ItemData; import org.cloudburstmc.protocol.bedrock.data.inventory.crafting.recipe.MultiRecipeData; import org.cloudburstmc.protocol.bedrock.data.inventory.crafting.recipe.RecipeData; +import org.cloudburstmc.protocol.bedrock.data.inventory.crafting.recipe.SmithingTrimRecipeData; import org.cloudburstmc.protocol.bedrock.data.inventory.descriptor.DefaultDescriptor; import org.cloudburstmc.protocol.bedrock.data.inventory.descriptor.ItemDescriptorWithCount; import org.cloudburstmc.protocol.bedrock.packet.CraftingDataPacket; +import org.cloudburstmc.protocol.bedrock.packet.TrimDataPacket; import org.geysermc.geyser.inventory.recipe.GeyserRecipe; import org.geysermc.geyser.inventory.recipe.GeyserShapedRecipe; import org.geysermc.geyser.inventory.recipe.GeyserShapelessRecipe; import org.geysermc.geyser.inventory.recipe.GeyserStonecutterData; +import org.geysermc.geyser.inventory.recipe.TrimRecipe; import org.geysermc.geyser.registry.Registries; import org.geysermc.geyser.registry.type.ItemMapping; import org.geysermc.geyser.session.GeyserSession; @@ -165,27 +167,9 @@ public class JavaUpdateRecipesTranslator extends PacketTranslator { - SmithingTrimRecipeData data = (SmithingTrimRecipeData) recipe.getData(); - - for (ItemStack template : data.getTemplate().getOptions()) { - ItemDescriptorWithCount bedrockTemplate = ItemDescriptorWithCount.fromItem(ItemTranslator.translateToBedrock(session, template)); - - for (ItemStack base : data.getBase().getOptions()) { - ItemDescriptorWithCount bedrockBase = ItemDescriptorWithCount.fromItem(ItemTranslator.translateToBedrock(session, base)); - - for (ItemStack addition : data.getAddition().getOptions()) { - ItemDescriptorWithCount bedrockAddition = ItemDescriptorWithCount.fromItem(ItemTranslator.translateToBedrock(session, addition)); - - craftingDataPacket.getCraftingData().add(org.cloudburstmc.protocol.bedrock.data.inventory.crafting.recipe.SmithingTrimRecipeData.of(recipe.getIdentifier(), - bedrockBase, bedrockAddition, bedrockTemplate, "smithing_table", netId++)); - } - } - } + // ignored currently - see below } - */ default -> { List craftingData = recipeTypes.get(recipe.getType()); if (craftingData != null) { @@ -230,6 +214,19 @@ public class JavaUpdateRecipesTranslator extends PacketTranslator