From 3757f3e98dd926dc5728ec170e57b79959fb085e Mon Sep 17 00:00:00 2001 From: Eclipse Date: Sat, 27 Sep 2025 09:11:05 +0000 Subject: [PATCH] Reduce direct access to TagCache --- .../entity/type/living/DolphinEntity.java | 4 +- .../entity/type/living/TadpoleEntity.java | 2 +- .../type/living/animal/AnimalEntity.java | 2 +- .../type/living/animal/HappyGhastEntity.java | 4 +- .../type/living/animal/MooshroomEntity.java | 2 +- .../living/animal/tameable/ParrotEntity.java | 4 +- .../living/animal/tameable/WolfEntity.java | 3 +- .../type/living/monster/CreeperEntity.java | 4 +- .../type/player/SessionPlayerEntity.java | 2 +- .../entity/vehicle/VehicleComponent.java | 2 +- .../geyser/inventory/GeyserItemStack.java | 8 ++- .../updater/AnvilInventoryUpdater.java | 4 +- .../org/geysermc/geyser/item/type/Item.java | 10 +++ .../geyser/level/block/type/Block.java | 11 ++++ .../geyser/session/cache/BundleCache.java | 4 +- .../geyser/session/cache/TagCache.java | 61 ++++++++++--------- .../session/cache/tags/GeyserHolderSet.java | 7 +++ .../org/geysermc/geyser/util/BlockUtils.java | 6 +- .../org/geysermc/geyser/util/EntityUtils.java | 2 +- .../geysermc/geyser/util/InventoryUtils.java | 2 +- 20 files changed, 89 insertions(+), 55 deletions(-) diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/DolphinEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/DolphinEntity.java index 8c404be97..cb300a7c9 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/DolphinEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/DolphinEntity.java @@ -50,7 +50,7 @@ public class DolphinEntity extends AgeableWaterEntity { @NonNull @Override protected InteractiveTag testMobInteraction(@NonNull Hand hand, @NonNull GeyserItemStack itemInHand) { - if (!itemInHand.isEmpty() && session.getTagCache().is(ItemTag.FISHES, itemInHand)) { + if (!itemInHand.isEmpty() && itemInHand.is(session, ItemTag.FISHES)) { return InteractiveTag.FEED; } return super.testMobInteraction(hand, itemInHand); @@ -59,7 +59,7 @@ public class DolphinEntity extends AgeableWaterEntity { @NonNull @Override protected InteractionResult mobInteract(@NonNull Hand hand, @NonNull GeyserItemStack itemInHand) { - if (!itemInHand.isEmpty() && session.getTagCache().is(ItemTag.FISHES, itemInHand)) { + if (!itemInHand.isEmpty() && itemInHand.is(session, ItemTag.FISHES)) { // Feed return InteractionResult.SUCCESS; } diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/TadpoleEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/TadpoleEntity.java index 68cf763c3..42ef51f67 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/TadpoleEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/TadpoleEntity.java @@ -62,6 +62,6 @@ public class TadpoleEntity extends AbstractFishEntity { } private boolean isFood(GeyserItemStack itemStack) { - return session.getTagCache().is(ItemTag.FROG_FOOD, itemStack); + return itemStack.is(session, ItemTag.FROG_FOOD); } } diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/AnimalEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/AnimalEntity.java index 57cbdc783..d0c097ec8 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/AnimalEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/AnimalEntity.java @@ -53,7 +53,7 @@ public abstract class AnimalEntity extends AgeableEntity { if (tag == null) { return false; } - return session.getTagCache().is(tag, itemStack); + return itemStack.is(session, tag); } /** diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/HappyGhastEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/HappyGhastEntity.java index 47932bcb0..69a1be981 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/HappyGhastEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/HappyGhastEntity.java @@ -122,7 +122,7 @@ public class HappyGhastEntity extends AnimalEntity implements ClientVehicle { return super.testMobInteraction(hand, itemInHand); } else { if (!itemInHand.isEmpty()) { - if (session.getTagCache().is(ItemTag.HARNESSES, itemInHand)) { + if (itemInHand.is(session, ItemTag.HARNESSES)) { if (getItemInSlot(EquipmentSlot.BODY).isEmpty()) { // Harnesses the ghast return InteractiveTag.EQUIP_HARNESS; @@ -151,7 +151,7 @@ public class HappyGhastEntity extends AnimalEntity implements ClientVehicle { return super.mobInteract(hand, itemInHand); } else { if (!itemInHand.isEmpty()) { - if (session.getTagCache().is(ItemTag.HARNESSES, itemInHand)) { + if (itemInHand.is(session, ItemTag.HARNESSES)) { if (getItemInSlot(EquipmentSlot.BODY).isEmpty()) { // Harnesses the ghast return InteractionResult.SUCCESS; diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/MooshroomEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/MooshroomEntity.java index 3314344cb..03c744a1a 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/MooshroomEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/MooshroomEntity.java @@ -84,7 +84,7 @@ public class MooshroomEntity extends CowEntity { } else if (!isBaby && isAlive() && itemInHand.asItem() == Items.SHEARS) { // Shear items return InteractionResult.SUCCESS; - } else if (isBrown && session.getTagCache().is(ItemTag.SMALL_FLOWERS, itemInHand)) { + } else if (isBrown && itemInHand.is(session, ItemTag.SMALL_FLOWERS)) { // ? return InteractionResult.SUCCESS; } diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/tameable/ParrotEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/tameable/ParrotEntity.java index 95e9c901b..d6484a028 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/tameable/ParrotEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/tameable/ParrotEntity.java @@ -53,11 +53,11 @@ public class ParrotEntity extends TameableEntity { } private boolean isTameFood(Item item) { - return session.getTagCache().is(ItemTag.PARROT_FOOD, item); + return item.is(session, ItemTag.PARROT_FOOD); } private boolean isPoisonousFood(Item item) { - return session.getTagCache().is(ItemTag.PARROT_POISONOUS_FOOD, item); + return item.is(session, ItemTag.PARROT_POISONOUS_FOOD); } @NonNull diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/tameable/WolfEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/tameable/WolfEntity.java index b80301440..8730ddc24 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/tameable/WolfEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/tameable/WolfEntity.java @@ -167,8 +167,7 @@ public class WolfEntity extends TameableEntity implements VariantIntHolder { && (!isCurseOfBinding || session.getGameMode().equals(GameMode.CREATIVE))) { return InteractiveTag.REMOVE_WOLF_ARMOR; } - if (getFlag(EntityFlag.SITTING) && - session.getTagCache().isItem(repairableItems, itemInHand.asItem()) && + if (getFlag(EntityFlag.SITTING) && itemInHand.is(session, repairableItems) && !getItemInSlot(EquipmentSlot.BODY).isEmpty() && getItemInSlot(EquipmentSlot.BODY).isDamaged()) { return InteractiveTag.REPAIR_WOLF_ARMOR; } diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/monster/CreeperEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/monster/CreeperEntity.java index 5f54d2942..cc58aa7aa 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/monster/CreeperEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/monster/CreeperEntity.java @@ -66,7 +66,7 @@ public class CreeperEntity extends MonsterEntity { @NonNull @Override protected InteractiveTag testMobInteraction(@NonNull Hand hand, @NonNull GeyserItemStack itemInHand) { - if (session.getTagCache().is(ItemTag.CREEPER_IGNITERS, itemInHand)) { + if (itemInHand.is(session, ItemTag.CREEPER_IGNITERS)) { return InteractiveTag.IGNITE_CREEPER; } else { return super.testMobInteraction(hand, itemInHand); @@ -76,7 +76,7 @@ public class CreeperEntity extends MonsterEntity { @NonNull @Override protected InteractionResult mobInteract(@NonNull Hand hand, @NonNull GeyserItemStack itemInHand) { - if (session.getTagCache().is(ItemTag.CREEPER_IGNITERS, itemInHand)) { + if (itemInHand.is(session, ItemTag.CREEPER_IGNITERS)) { // Ignite creeper - as of 1.19.3 session.playSoundEvent(SoundEvent.IGNITE, position); return InteractionResult.SUCCESS; diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/player/SessionPlayerEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/player/SessionPlayerEntity.java index 145421a5f..7867fdcf6 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/player/SessionPlayerEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/player/SessionPlayerEntity.java @@ -498,7 +498,7 @@ public class SessionPlayerEntity extends PlayerEntity { } Vector3i pos = getPosition().down(EntityDefinitions.PLAYER.offset()).toInt(); BlockState state = session.getGeyser().getWorldManager().blockAt(session, pos); - if (session.getTagCache().is(BlockTag.CLIMBABLE, state.block())) { + if (state.block().is(session, BlockTag.CLIMBABLE)) { return true; } diff --git a/core/src/main/java/org/geysermc/geyser/entity/vehicle/VehicleComponent.java b/core/src/main/java/org/geysermc/geyser/entity/vehicle/VehicleComponent.java index 44e922950..64796d052 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/vehicle/VehicleComponent.java +++ b/core/src/main/java/org/geysermc/geyser/entity/vehicle/VehicleComponent.java @@ -683,7 +683,7 @@ public class VehicleComponent { } BlockState blockState = ctx.centerBlock(); - if (vehicle.getSession().getTagCache().is(BlockTag.CLIMBABLE, blockState.block())) { + if (blockState.block().is(vehicle.getSession(), BlockTag.CLIMBABLE)) { return true; } diff --git a/core/src/main/java/org/geysermc/geyser/inventory/GeyserItemStack.java b/core/src/main/java/org/geysermc/geyser/inventory/GeyserItemStack.java index a9fa3603c..e40a76bee 100644 --- a/core/src/main/java/org/geysermc/geyser/inventory/GeyserItemStack.java +++ b/core/src/main/java/org/geysermc/geyser/inventory/GeyserItemStack.java @@ -40,12 +40,14 @@ import org.geysermc.geyser.registry.Registries; import org.geysermc.geyser.registry.type.ItemMapping; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.session.cache.BundleCache; +import org.geysermc.geyser.session.cache.registry.JavaRegistries; import org.geysermc.geyser.session.cache.tags.Tag; import org.geysermc.geyser.translator.item.ItemTranslator; import org.geysermc.mcprotocollib.protocol.data.game.item.ItemStack; import org.geysermc.mcprotocollib.protocol.data.game.item.component.DataComponentType; import org.geysermc.mcprotocollib.protocol.data.game.item.component.DataComponentTypes; import org.geysermc.mcprotocollib.protocol.data.game.item.component.DataComponents; +import org.geysermc.mcprotocollib.protocol.data.game.item.component.HolderSet; import org.geysermc.mcprotocollib.protocol.data.game.recipe.display.slot.EmptySlotDisplay; import org.geysermc.mcprotocollib.protocol.data.game.recipe.display.slot.ItemSlotDisplay; import org.geysermc.mcprotocollib.protocol.data.game.recipe.display.slot.ItemStackSlotDisplay; @@ -121,7 +123,11 @@ public class GeyserItemStack { } public boolean is(GeyserSession session, Tag tag) { - return session.getTagCache().is(tag, this); + return session.getTagCache().is(tag, javaId); + } + + public boolean is(GeyserSession session, HolderSet set) { + return session.getTagCache().is(set, JavaRegistries.ITEM, javaId); } /** 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 bea3e0507..7c0b7b61a 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,7 +312,7 @@ public class AnvilInventoryUpdater extends InventoryUpdater { for (Object2IntMap.Entry entry : getEnchantments(session, material).object2IntEntrySet()) { Enchantment enchantment = entry.getKey(); - boolean canApply = isEnchantedBook(input) || session.getTagCache().is(enchantment.supportedItems(), input.asItem()); + boolean canApply = isEnchantedBook(input) || enchantment.supportedItems().contains(session, input.asItem()); List incompatibleEnchantments = enchantment.exclusiveSet().resolve(session); for (Enchantment incompatible : incompatibleEnchantments) { @@ -401,7 +401,7 @@ public class AnvilInventoryUpdater extends InventoryUpdater { return false; } - return session.getTagCache().isItem(repairable, material.asItem()); + return material.is(session, repairable); } private boolean isRenaming(GeyserSession session, AnvilContainer anvilContainer, boolean bedrock) { diff --git a/core/src/main/java/org/geysermc/geyser/item/type/Item.java b/core/src/main/java/org/geysermc/geyser/item/type/Item.java index bf8d4786e..b28b4ac3b 100644 --- a/core/src/main/java/org/geysermc/geyser/item/type/Item.java +++ b/core/src/main/java/org/geysermc/geyser/item/type/Item.java @@ -45,6 +45,7 @@ import org.geysermc.geyser.registry.type.ItemMapping; import org.geysermc.geyser.registry.type.ItemMappings; import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.session.cache.registry.JavaRegistries; +import org.geysermc.geyser.session.cache.tags.Tag; import org.geysermc.geyser.text.ChatColor; import org.geysermc.geyser.text.MinecraftLocale; import org.geysermc.geyser.translator.item.BedrockItemBuilder; @@ -53,6 +54,7 @@ import org.geysermc.geyser.util.MinecraftKey; import org.geysermc.mcprotocollib.protocol.data.game.item.component.DataComponentType; import org.geysermc.mcprotocollib.protocol.data.game.item.component.DataComponentTypes; import org.geysermc.mcprotocollib.protocol.data.game.item.component.DataComponents; +import org.geysermc.mcprotocollib.protocol.data.game.item.component.HolderSet; import org.geysermc.mcprotocollib.protocol.data.game.item.component.ItemEnchantments; import org.jetbrains.annotations.UnmodifiableView; @@ -101,6 +103,14 @@ public class Item { return baseComponents.getOrDefault(DataComponentTypes.MAX_STACK_SIZE, 1); } + public boolean is(GeyserSession session, Tag tag) { + return session.getTagCache().is(tag, javaId); + } + + public boolean is(GeyserSession session, HolderSet set) { + return session.getTagCache().is(set, JavaRegistries.ITEM, javaId); + } + /** * Returns an unmodifiable {@link DataComponents} view containing known data components. * Optionally, additional components can be provided to replace (or add to) diff --git a/core/src/main/java/org/geysermc/geyser/level/block/type/Block.java b/core/src/main/java/org/geysermc/geyser/level/block/type/Block.java index f15f73cac..1f45c516b 100644 --- a/core/src/main/java/org/geysermc/geyser/level/block/type/Block.java +++ b/core/src/main/java/org/geysermc/geyser/level/block/type/Block.java @@ -41,7 +41,10 @@ import org.geysermc.geyser.level.block.property.Property; import org.geysermc.geyser.level.physics.PistonBehavior; import org.geysermc.geyser.registry.BlockRegistries; import org.geysermc.geyser.session.GeyserSession; +import org.geysermc.geyser.session.cache.registry.JavaRegistries; +import org.geysermc.geyser.session.cache.tags.Tag; import org.geysermc.mcprotocollib.protocol.data.game.item.ItemStack; +import org.geysermc.mcprotocollib.protocol.data.game.item.component.HolderSet; import org.geysermc.mcprotocollib.protocol.data.game.level.block.BlockEntityType; import org.intellij.lang.annotations.Subst; @@ -215,6 +218,14 @@ public class Block { this.javaId = javaId; } + public boolean is(GeyserSession session, Tag tag) { + return session.getTagCache().is(tag, javaId); + } + + public boolean is(GeyserSession session, HolderSet set) { + return session.getTagCache().is(set, JavaRegistries.BLOCK, javaId); + } + @Override public String toString() { return "Block{" + diff --git a/core/src/main/java/org/geysermc/geyser/session/cache/BundleCache.java b/core/src/main/java/org/geysermc/geyser/session/cache/BundleCache.java index 3338a11fc..d5405d1de 100644 --- a/core/src/main/java/org/geysermc/geyser/session/cache/BundleCache.java +++ b/core/src/main/java/org/geysermc/geyser/session/cache/BundleCache.java @@ -65,7 +65,7 @@ public final class BundleCache { public void initialize(GeyserItemStack itemStack) { // Message before 1.21.4 - "Can't check for BUNDLE_CONTENTS, which may be missing if the bundle is empty." // Now irrelevant, but keeping as-is for the time being. - if (session.getTagCache().is(ItemTag.BUNDLES, itemStack)) { + if (itemStack.is(session, ItemTag.BUNDLES)) { if (itemStack.getBundleData() != null) { session.getGeyser().getLogger().warning("Stack has bundle data already! It should not!"); if (session.getGeyser().getConfig().isDebugMode()) { @@ -231,7 +231,7 @@ public final class BundleCache { * if Bedrock sends its own. */ public void awaitRelease() { - if (session.getTagCache().is(ItemTag.BUNDLES, session.getPlayerInventory().getItemInHand())) { + if (session.getPlayerInventory().getItemInHand().is(session, ItemTag.BUNDLES)) { releaseTick = session.getTicks() + 1; } } 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 57ce7ecbf..28990e1e2 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 @@ -31,9 +31,6 @@ import net.kyori.adventure.key.Key; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; import org.geysermc.geyser.GeyserLogger; -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.registry.JavaRegistries; import org.geysermc.geyser.session.cache.registry.JavaRegistryKey; @@ -43,7 +40,6 @@ import org.geysermc.geyser.util.MinecraftKey; import org.geysermc.mcprotocollib.protocol.data.game.item.component.HolderSet; import org.geysermc.mcprotocollib.protocol.packet.common.clientbound.ClientboundUpdateTagsPacket; -import javax.annotation.ParametersAreNonnullByDefault; import java.util.Arrays; import java.util.List; import java.util.Map; @@ -52,8 +48,19 @@ 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. Looking up a tag that wasn't listed in that packet will return an empty array. * Only tags from registries in {@link JavaRegistries} are stored. Read {@link JavaRegistryKey} for more information. + * + *

To simply check if an element is in a tag, it's preferred to use the element's "{@code is}" method, if available. For example:

+ * + *
    + *
  • {@link org.geysermc.geyser.level.block.type.Block#is(GeyserSession, Tag)}
  • + *
  • {@link org.geysermc.geyser.level.block.type.Block#is(GeyserSession, HolderSet)}
  • + *
  • {@link org.geysermc.geyser.item.type.Item#is(GeyserSession, Tag)}
  • + *
  • {@link org.geysermc.geyser.item.type.Item#is(GeyserSession, HolderSet)}
  • + *
  • {@link org.geysermc.geyser.inventory.GeyserItemStack#is(GeyserSession, Tag)}
  • + *
  • {@link org.geysermc.geyser.inventory.GeyserItemStack#is(GeyserSession, HolderSet)}
  • + *
  • {@link GeyserHolderSet#contains(GeyserSession, Object)}
  • + *
*/ -@ParametersAreNonnullByDefault public final class TagCache { private final GeyserSession session; private final Map, int[]> tags = new Object2ObjectOpenHashMap<>(); @@ -109,37 +116,40 @@ public final class TagCache { } } - public boolean is(Tag tag, T object) { + /** + * Should only be used when the network ID of an element is already known. If not, prefer using the {@link TagCache#is(Tag, Object)} shorthand method. + */ + public boolean is(@NonNull Tag tag, int id) { + return contains(getRaw(tag), id); + } + + public boolean is(@NonNull Tag tag, @NonNull T object) { return contains(getRaw(tag), tag.registry().networkId(session, object)); } /** - * @return true if the item tag is present and contains this item stack's Java ID. + * Prefer using {@link GeyserHolderSet#contains(GeyserSession, Object)}. + * + * @return true if the specified network ID is in the given {@link GeyserHolderSet}. */ - public boolean is(Tag tag, GeyserItemStack itemStack) { - return is(tag, itemStack.asItem()); - } - - /** - * @return true if the specified network ID is in the given holder set. - */ - public boolean is(@Nullable GeyserHolderSet holderSet, @Nullable T object) { - if (holderSet == null || object == null) { + public boolean is(@NonNull GeyserHolderSet holderSet, @Nullable T object) { + if (object == null) { return false; } return contains(holderSet.resolveRaw(this), holderSet.getRegistry().networkId(session, object)); } /** - * Accessible via the {@link #isItem(HolderSet, Item)} method. * @return true if the specified network ID is in the given {@link HolderSet} set. */ - private boolean is(@Nullable HolderSet holderSet, @NonNull JavaRegistryKey registry, int id) { + public boolean is(@Nullable HolderSet holderSet, @NonNull JavaRegistryKey registry, int id) { if (holderSet == null) { return false; } int[] entries = holderSet.resolve(key -> { + // This should never happen, since a key in a HolderSet is always a tag + // We check for it anyway if (key.value().startsWith("#")) { key = Key.key(key.namespace(), key.value().substring(1)); } @@ -149,23 +159,14 @@ public final class TagCache { return contains(entries, id); } - public boolean isItem(@Nullable HolderSet holderSet, @NonNull Item item) { - return is(holderSet, JavaRegistries.ITEM, item.javaId()); - } - - public boolean isBlock(@Nullable HolderSet holderSet, @NonNull Block block) { - return is(holderSet, JavaRegistries.BLOCK, block.javaId()); - } - - - public List get(Tag tag) { + public List get(@NonNull Tag tag) { return mapRawArray(session, getRaw(tag), tag.registry()); } /** - * @return the network IDs in the given tag. This can be an empty list. + * @return the network IDs in the given tag. This can be an empty array. */ - public int[] getRaw(Tag tag) { + public int[] getRaw(@NonNull Tag tag) { return this.tags.getOrDefault(tag, IntArrays.EMPTY_ARRAY); } diff --git a/core/src/main/java/org/geysermc/geyser/session/cache/tags/GeyserHolderSet.java b/core/src/main/java/org/geysermc/geyser/session/cache/tags/GeyserHolderSet.java index 00eaf1f44..85c7d762e 100644 --- a/core/src/main/java/org/geysermc/geyser/session/cache/tags/GeyserHolderSet.java +++ b/core/src/main/java/org/geysermc/geyser/session/cache/tags/GeyserHolderSet.java @@ -95,6 +95,13 @@ public final class GeyserHolderSet { return new GeyserHolderSet<>(registry, tag, holderSet.getHolders(), null); } + public boolean contains(@NonNull GeyserSession session, @Nullable T object) { + if (object == null) { + return false; + } + return session.getTagCache().is(this, object); + } + /** * Resolves the HolderSet, and automatically maps the network IDs to their respective object types. * If the HolderSet is a list of IDs, this will be returned. If it is a tag, the tag will be resolved from the tag cache. If it is an inline HolderSet, the list of inline elements will be returned. diff --git a/core/src/main/java/org/geysermc/geyser/util/BlockUtils.java b/core/src/main/java/org/geysermc/geyser/util/BlockUtils.java index d327934e8..13f3646ee 100644 --- a/core/src/main/java/org/geysermc/geyser/util/BlockUtils.java +++ b/core/src/main/java/org/geysermc/geyser/util/BlockUtils.java @@ -79,7 +79,7 @@ public final class BlockUtils { for (ToolData.Rule rule : tool.getRules()) { if (rule.getCorrectForDrops() != null) { - if (session.getTagCache().isBlock(rule.getBlocks(), block)) { + if (block.is(session, rule.getBlocks())) { return rule.getCorrectForDrops(); } } @@ -96,7 +96,7 @@ public final class BlockUtils { for (ToolData.Rule rule : tool.getRules()) { if (rule.getSpeed() != null) { - if (session.getTagCache().isBlock(rule.getBlocks(), block)) { + if (block.is(session, rule.getBlocks())) { return rule.getSpeed(); } } @@ -258,7 +258,7 @@ public final class BlockUtils { } public static boolean blockMatchesPredicate(GeyserSession session, BlockState state, AdventureModePredicate.BlockPredicate predicate) { - if (predicate.getBlocks() != null && !session.getTagCache().isBlock(predicate.getBlocks(), state.block())) { + if (predicate.getBlocks() != null && !state.block().is(session, predicate.getBlocks())) { return false; } else if (predicate.getProperties() != null) { List matchers = predicate.getProperties(); diff --git a/core/src/main/java/org/geysermc/geyser/util/EntityUtils.java b/core/src/main/java/org/geysermc/geyser/util/EntityUtils.java index cf098aa77..b6d73b12c 100644 --- a/core/src/main/java/org/geysermc/geyser/util/EntityUtils.java +++ b/core/src/main/java/org/geysermc/geyser/util/EntityUtils.java @@ -359,7 +359,7 @@ public final class EntityUtils { } GeyserHolderSet holderSet = GeyserHolderSet.fromHolderSet(JavaRegistries.ENTITY_TYPE, equippable.allowedEntities()); - return session.getTagCache().is(holderSet, entity); + return holderSet.contains(session, entity); } // From ViaVersion! thank u!! diff --git a/core/src/main/java/org/geysermc/geyser/util/InventoryUtils.java b/core/src/main/java/org/geysermc/geyser/util/InventoryUtils.java index 49517e3f6..df8a3a097 100644 --- a/core/src/main/java/org/geysermc/geyser/util/InventoryUtils.java +++ b/core/src/main/java/org/geysermc/geyser/util/InventoryUtils.java @@ -379,7 +379,7 @@ public class InventoryUtils { && Objects.equals(itemStack.getComponents(), other.getDataComponentsPatch()); } if (slotDisplay instanceof TagSlotDisplay tagSlotDisplay) { - return session.getTagCache().is(new Tag<>(JavaRegistries.ITEM, tagSlotDisplay.tag()), itemStack.asItem()); + return itemStack.is(session, new Tag<>(JavaRegistries.ITEM, tagSlotDisplay.tag())); } session.getGeyser().getLogger().warning("Unknown slot display type: " + slotDisplay); return false;