From 5e1769d2bda3c37a8a58c4f00104d50299ee9199 Mon Sep 17 00:00:00 2001 From: David Choo Date: Wed, 15 Jun 2022 22:55:11 -0400 Subject: [PATCH] Translate goat horns (#3057) --- .../geyser/registry/type/ItemMappings.java | 4 +- .../inventory/item/GoatHornTranslator.java | 98 +++++++++++++++++++ 2 files changed, 100 insertions(+), 2 deletions(-) create mode 100644 core/src/main/java/org/geysermc/geyser/translator/inventory/item/GoatHornTranslator.java diff --git a/core/src/main/java/org/geysermc/geyser/registry/type/ItemMappings.java b/core/src/main/java/org/geysermc/geyser/registry/type/ItemMappings.java index 3072568f3..ef1a8bc77 100644 --- a/core/src/main/java/org/geysermc/geyser/registry/type/ItemMappings.java +++ b/core/src/main/java/org/geysermc/geyser/registry/type/ItemMappings.java @@ -135,9 +135,9 @@ public class ItemMappings { } } else { if (!(mapping.getBedrockData() == data.getDamage() || - // Make exceptions for potions, tipped arrows, and firework stars, whose damage values can vary + // Make exceptions for potions, tipped arrows, firework stars, and goat horns, whose damage values can vary (mapping.getJavaIdentifier().endsWith("potion") || mapping.getJavaIdentifier().equals("minecraft:arrow") - || mapping.getJavaIdentifier().equals("minecraft:firework_star")))) { + || mapping.getJavaIdentifier().equals("minecraft:firework_star") || mapping.getJavaIdentifier().equals("minecraft:goat_horn")))) { continue; } } diff --git a/core/src/main/java/org/geysermc/geyser/translator/inventory/item/GoatHornTranslator.java b/core/src/main/java/org/geysermc/geyser/translator/inventory/item/GoatHornTranslator.java new file mode 100644 index 000000000..08e8534af --- /dev/null +++ b/core/src/main/java/org/geysermc/geyser/translator/inventory/item/GoatHornTranslator.java @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2019-2022 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.translator.inventory.item; + +import com.github.steveice10.mc.protocol.data.game.entity.metadata.ItemStack; +import com.github.steveice10.opennbt.tag.builtin.StringTag; +import com.nukkitx.protocol.bedrock.data.inventory.ItemData; +import org.geysermc.geyser.GeyserImpl; +import org.geysermc.geyser.network.MinecraftProtocol; +import org.geysermc.geyser.registry.Registries; +import org.geysermc.geyser.registry.type.ItemMapping; +import org.geysermc.geyser.registry.type.ItemMappings; + +import java.util.Collections; +import java.util.List; + +@ItemRemapper +public class GoatHornTranslator extends ItemTranslator { + + private static final List INSTRUMENTS = List.of( + "ponder_goat_horn", + "sing_goat_horn", + "seek_goat_horn", + "feel_goat_horn", + "admire_goat_horn", + "call_goat_horn", + "yearn_goat_horn", + "dream_goat_horn" // Called "Resist" on Bedrock 1.19.0 due to https://bugs.mojang.com/browse/MCPE-155059 + ); + + @Override + protected ItemData.Builder translateToBedrock(ItemStack itemStack, ItemMapping mapping, ItemMappings mappings) { + ItemData.Builder builder = super.translateToBedrock(itemStack, mapping, mappings); + if (itemStack.getNbt() != null && itemStack.getNbt().get("instrument") instanceof StringTag instrumentTag) { + String instrument = instrumentTag.getValue(); + // Drop the Minecraft namespace if applicable + if (instrument.startsWith("minecraft:")) { + instrument = instrument.substring("minecraft:".length()); + } + + int damage = INSTRUMENTS.indexOf(instrument); + if (damage == -1) { + damage = 0; + GeyserImpl.getInstance().getLogger().debug("Unknown goat horn instrument: " + instrumentTag.getValue()); + } + builder.damage(damage); + } + return builder; + } + + @Override + public ItemStack translateToJava(ItemData itemData, ItemMapping mapping, ItemMappings mappings) { + ItemStack itemStack = super.translateToJava(itemData, mapping, mappings); + + int damage = itemData.getDamage(); + if (damage < 0 || damage >= INSTRUMENTS.size()) { + GeyserImpl.getInstance().getLogger().debug("Unknown goat horn instrument for damage: " + damage); + damage = 0; + } + + String instrument = INSTRUMENTS.get(damage); + StringTag instrumentTag = new StringTag("instrument", "minecraft:" + instrument); + itemStack.getNbt().put(instrumentTag); + + return itemStack; + } + + @Override + public List getAppliedItems() { + return Collections.singletonList( + Registries.ITEMS.forVersion(MinecraftProtocol.DEFAULT_BEDROCK_CODEC.getProtocolVersion()) + .getMapping("minecraft:goat_horn") + ); + } +}