From dbd062d56dc5fbfa347e55b20124af689c578e99 Mon Sep 17 00:00:00 2001 From: Eclipse Date: Wed, 10 Jul 2024 10:43:13 +0000 Subject: [PATCH] Add is method for HolderSets to TagCache --- .../updater/AnvilInventoryUpdater.java | 5 ++--- .../geysermc/geyser/session/cache/TagCache.java | 17 +++++++++++++---- .../geyser/session/cache/tags/BlockTag.java | 5 +++-- .../session/cache/tags/EnchantmentTag.java | 5 +++-- .../geyser/session/cache/tags/HolderSet.java | 6 +++--- .../geyser/session/cache/tags/ItemTag.java | 5 +++-- 6 files changed, 27 insertions(+), 16 deletions(-) diff --git a/core/src/main/java/org/geysermc/geyser/inventory/updater/AnvilInventoryUpdater.java b/core/src/main/java/org/geysermc/geyser/inventory/updater/AnvilInventoryUpdater.java index 8874af61b..61a18a632 100644 --- a/core/src/main/java/org/geysermc/geyser/inventory/updater/AnvilInventoryUpdater.java +++ b/core/src/main/java/org/geysermc/geyser/inventory/updater/AnvilInventoryUpdater.java @@ -312,10 +312,9 @@ public class AnvilInventoryUpdater extends InventoryUpdater { for (Object2IntMap.Entry entry : getEnchantments(session, material).object2IntEntrySet()) { Enchantment enchantment = entry.getKey(); - int[] supportedItemIds = enchantment.supportedItems().resolve(session, TagRegistry.ITEM); - boolean canApply = isEnchantedBook(input) || IntStream.of(supportedItemIds).anyMatch(id -> id == input.getJavaId()); + boolean canApply = isEnchantedBook(input) || session.getTagCache().is(enchantment.supportedItems(), input.getJavaId(), TagRegistry.ITEM); - int[] incompatibleEnchantments = enchantment.exclusiveSet().resolve(session, TagRegistry.ENCHANTMENT); + int[] incompatibleEnchantments = enchantment.exclusiveSet().resolve(session.getTagCache(), TagRegistry.ENCHANTMENT); for (int i : incompatibleEnchantments) { Enchantment incompatible = session.getRegistryCache().enchantments().byId(i); if (combinedEnchantments.containsKey(incompatible)) { diff --git a/core/src/main/java/org/geysermc/geyser/session/cache/TagCache.java b/core/src/main/java/org/geysermc/geyser/session/cache/TagCache.java index 95f8d5f1e..9b6c32363 100644 --- a/core/src/main/java/org/geysermc/geyser/session/cache/TagCache.java +++ b/core/src/main/java/org/geysermc/geyser/session/cache/TagCache.java @@ -27,10 +27,6 @@ package org.geysermc.geyser.session.cache; import it.unimi.dsi.fastutil.objects.Object2IntMap; import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import javax.annotation.ParametersAreNonnullByDefault; import net.kyori.adventure.key.Key; import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.GeyserLogger; @@ -38,12 +34,18 @@ import org.geysermc.geyser.inventory.GeyserItemStack; import org.geysermc.geyser.item.type.Item; import org.geysermc.geyser.level.block.type.Block; import org.geysermc.geyser.session.GeyserSession; +import org.geysermc.geyser.session.cache.tags.HolderSet; import org.geysermc.geyser.session.cache.tags.Tag; import org.geysermc.geyser.session.cache.tags.TagRegistry; import org.geysermc.geyser.session.cache.tags.VanillaTag; import org.geysermc.geyser.util.MinecraftKey; import org.geysermc.mcprotocollib.protocol.packet.common.clientbound.ClientboundUpdateTagsPacket; +import javax.annotation.ParametersAreNonnullByDefault; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + /** * Manages information sent from the {@link ClientboundUpdateTagsPacket}. If that packet is not sent, all lists here * will remain empty, matching Java Edition behavior. @@ -142,6 +144,13 @@ public final class TagCache { return contains(get(tag), item.javaId()); } + /** + * @return true if the specified network ID is in the given holder set. + */ + public boolean is(HolderSet holderSet, int id, TagRegistry registry) { + return contains(holderSet.resolve(this, registry), id); + } + public int[] get(Tag tag) { if (tag instanceof VanillaTag vanillaTag) { return this.tags[tag.registry().ordinal()][vanillaTag.ordinal()]; diff --git a/core/src/main/java/org/geysermc/geyser/session/cache/tags/BlockTag.java b/core/src/main/java/org/geysermc/geyser/session/cache/tags/BlockTag.java index 093ac1a70..3b73494dd 100644 --- a/core/src/main/java/org/geysermc/geyser/session/cache/tags/BlockTag.java +++ b/core/src/main/java/org/geysermc/geyser/session/cache/tags/BlockTag.java @@ -25,11 +25,12 @@ package org.geysermc.geyser.session.cache.tags; -import java.util.HashMap; -import java.util.Map; import net.kyori.adventure.key.Key; import org.geysermc.geyser.util.MinecraftKey; +import java.util.HashMap; +import java.util.Map; + @SuppressWarnings("unused") public final class BlockTag { public static final Map ALL_BLOCK_TAGS = new HashMap<>(); diff --git a/core/src/main/java/org/geysermc/geyser/session/cache/tags/EnchantmentTag.java b/core/src/main/java/org/geysermc/geyser/session/cache/tags/EnchantmentTag.java index 8061d2450..0cb3bdf16 100644 --- a/core/src/main/java/org/geysermc/geyser/session/cache/tags/EnchantmentTag.java +++ b/core/src/main/java/org/geysermc/geyser/session/cache/tags/EnchantmentTag.java @@ -25,11 +25,12 @@ package org.geysermc.geyser.session.cache.tags; -import java.util.HashMap; -import java.util.Map; import net.kyori.adventure.key.Key; import org.geysermc.geyser.util.MinecraftKey; +import java.util.HashMap; +import java.util.Map; + @SuppressWarnings("unused") public final class EnchantmentTag { public static final Map ALL_ENCHANTMENT_TAGS = new HashMap<>(); diff --git a/core/src/main/java/org/geysermc/geyser/session/cache/tags/HolderSet.java b/core/src/main/java/org/geysermc/geyser/session/cache/tags/HolderSet.java index 7a9e276b9..f4f9ce666 100644 --- a/core/src/main/java/org/geysermc/geyser/session/cache/tags/HolderSet.java +++ b/core/src/main/java/org/geysermc/geyser/session/cache/tags/HolderSet.java @@ -31,7 +31,7 @@ import lombok.Data; import net.kyori.adventure.key.Key; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; -import org.geysermc.geyser.session.GeyserSession; +import org.geysermc.geyser.session.cache.TagCache; @Data public final class HolderSet { @@ -49,12 +49,12 @@ public final class HolderSet { this.holders = null; } - public int[] resolve(GeyserSession session, TagRegistry registry) { + public int[] resolve(TagCache tagCache, TagRegistry registry) { if (holders != null) { return holders; } - return session.getTagCache().get(Tag.createTag(registry, tagId)); + return tagCache.get(Tag.createTag(registry, tagId)); } public static HolderSet readHolderSet(@Nullable Object holderSet, Function keyIdMapping) { diff --git a/core/src/main/java/org/geysermc/geyser/session/cache/tags/ItemTag.java b/core/src/main/java/org/geysermc/geyser/session/cache/tags/ItemTag.java index 8ded6c073..039ac1cb9 100644 --- a/core/src/main/java/org/geysermc/geyser/session/cache/tags/ItemTag.java +++ b/core/src/main/java/org/geysermc/geyser/session/cache/tags/ItemTag.java @@ -25,11 +25,12 @@ package org.geysermc.geyser.session.cache.tags; -import java.util.HashMap; -import java.util.Map; import net.kyori.adventure.key.Key; import org.geysermc.geyser.util.MinecraftKey; +import java.util.HashMap; +import java.util.Map; + @SuppressWarnings("unused") public final class ItemTag { public static final Map ALL_ITEM_TAGS = new HashMap<>();