From e8c1c2218f99c6abbaa981d71fd360cba7b9f2c7 Mon Sep 17 00:00:00 2001 From: Camotoy <20743703+Camotoy@users.noreply.github.com> Date: Mon, 29 Apr 2024 00:35:44 -0400 Subject: [PATCH] Fix banners on shields --- .../geysermc/geyser/item/type/BannerItem.java | 45 +++++++++++-------- .../geysermc/geyser/item/type/ShieldItem.java | 29 ++++++------ 2 files changed, 39 insertions(+), 35 deletions(-) diff --git a/core/src/main/java/org/geysermc/geyser/item/type/BannerItem.java b/core/src/main/java/org/geysermc/geyser/item/type/BannerItem.java index 232f340ea..9f5138323 100644 --- a/core/src/main/java/org/geysermc/geyser/item/type/BannerItem.java +++ b/core/src/main/java/org/geysermc/geyser/item/type/BannerItem.java @@ -113,6 +113,31 @@ public class BannerItem extends BlockItem { return new NbtList<>(NbtType.COMPOUND, tagsList); } + /** + * Converts a Java item component for banners into Bedrock item NBT. + */ + static void convertBannerPattern(GeyserSession session, List patterns, BedrockItemBuilder builder) { + if (isOminous(session, patterns)) { + // Remove the current patterns and set the ominous banner type + builder.putInt("Type", 1); + } else { + List patternList = new ArrayList<>(patterns.size()); + for (BannerPatternLayer patternLayer : patterns) { + patternLayer.getPattern().ifId(holder -> { + BannerPattern bannerPattern = session.getRegistryCache().bannerPatterns().get(holder.id()); + if (bannerPattern != null) { + NbtMap tag = NbtMap.builder() + .putString("Pattern", bannerPattern.getBedrockIdentifier()) + .putInt("Color", 15 - patternLayer.getColorId()) + .build(); + patternList.add(tag); + } + }); + } + builder.putList("Patterns", NbtType.COMPOUND, patternList); + } + } + /** * Convert the Java edition banner pattern nbt to Bedrock edition, null if the pattern doesn't exist * @@ -166,25 +191,7 @@ public class BannerItem extends BlockItem { List patterns = components.get(DataComponentType.BANNER_PATTERNS); if (patterns != null) { - if (isOminous(session, patterns)) { - // Remove the current patterns and set the ominous banner type - builder.putInt("Type", 1); - } else { - List patternList = new ArrayList<>(patterns.size()); - for (BannerPatternLayer patternLayer : patterns) { - patternLayer.getPattern().ifId(holder -> { - BannerPattern bannerPattern = session.getRegistryCache().bannerPatterns().get(holder.id()); - if (bannerPattern != null) { - NbtMap tag = NbtMap.builder() - .putString("Pattern", bannerPattern.getBedrockIdentifier()) - .putInt("Color", 15 - patternLayer.getColorId()) - .build(); - patternList.add(tag); - } - }); - } - builder.putList("Patterns", NbtType.COMPOUND, patternList); - } + convertBannerPattern(session, patterns, builder); } } diff --git a/core/src/main/java/org/geysermc/geyser/item/type/ShieldItem.java b/core/src/main/java/org/geysermc/geyser/item/type/ShieldItem.java index 001fa74b6..14d41a073 100644 --- a/core/src/main/java/org/geysermc/geyser/item/type/ShieldItem.java +++ b/core/src/main/java/org/geysermc/geyser/item/type/ShieldItem.java @@ -29,8 +29,12 @@ import org.checkerframework.checker.nullness.qual.NonNull; import org.geysermc.geyser.item.components.ToolTier; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.translator.item.BedrockItemBuilder; +import org.geysermc.mcprotocollib.protocol.data.game.item.component.BannerPatternLayer; +import org.geysermc.mcprotocollib.protocol.data.game.item.component.DataComponentType; import org.geysermc.mcprotocollib.protocol.data.game.item.component.DataComponents; +import java.util.List; + public class ShieldItem extends Item { public ShieldItem(String javaIdentifier, Builder builder) { super(javaIdentifier, builder); @@ -40,22 +44,15 @@ public class ShieldItem extends Item { public void translateComponentsToBedrock(@NonNull GeyserSession session, @NonNull DataComponents components, @NonNull BedrockItemBuilder builder) { super.translateComponentsToBedrock(session, components, builder); - // TODO figure out patterns first. -// if (tag.remove("BlockEntityTag") instanceof CompoundTag blockEntityTag) { -// if (blockEntityTag.get("Patterns") instanceof ListTag patterns) { -// for (Tag pattern : patterns) { -// if (((CompoundTag) pattern).get("Color") instanceof IntTag color) { -// color.setValue(15 - color.getValue()); -// } -// } -// // Bedrock looks for patterns at the root -// tag.put(patterns); -// } -// if (blockEntityTag.get("Base") instanceof IntTag base) { -// base.setValue(15 - base.getValue()); -// tag.put(base); -// } -// } + List patterns = components.get(DataComponentType.BANNER_PATTERNS); + if (patterns != null) { + BannerItem.convertBannerPattern(session, patterns, builder); + } + // Shield pattern backing color + Integer baseColor = components.get(DataComponentType.BASE_COLOR); + if (baseColor != null) { + builder.putInt("Base", 15 - baseColor); + } } @Override