Add is method for HolderSets to TagCache

This commit is contained in:
Eclipse 2024-07-10 10:43:13 +00:00
parent cd1ceaa28d
commit dbd062d56d
No known key found for this signature in database
GPG key ID: 95E6998F82EC938A
6 changed files with 27 additions and 16 deletions

View file

@ -312,10 +312,9 @@ public class AnvilInventoryUpdater extends InventoryUpdater {
for (Object2IntMap.Entry<Enchantment> entry : getEnchantments(session, material).object2IntEntrySet()) { for (Object2IntMap.Entry<Enchantment> entry : getEnchantments(session, material).object2IntEntrySet()) {
Enchantment enchantment = entry.getKey(); Enchantment enchantment = entry.getKey();
int[] supportedItemIds = enchantment.supportedItems().resolve(session, TagRegistry.ITEM); boolean canApply = isEnchantedBook(input) || session.getTagCache().is(enchantment.supportedItems(), input.getJavaId(), TagRegistry.ITEM);
boolean canApply = isEnchantedBook(input) || IntStream.of(supportedItemIds).anyMatch(id -> id == input.getJavaId());
int[] incompatibleEnchantments = enchantment.exclusiveSet().resolve(session, TagRegistry.ENCHANTMENT); int[] incompatibleEnchantments = enchantment.exclusiveSet().resolve(session.getTagCache(), TagRegistry.ENCHANTMENT);
for (int i : incompatibleEnchantments) { for (int i : incompatibleEnchantments) {
Enchantment incompatible = session.getRegistryCache().enchantments().byId(i); Enchantment incompatible = session.getRegistryCache().enchantments().byId(i);
if (combinedEnchantments.containsKey(incompatible)) { if (combinedEnchantments.containsKey(incompatible)) {

View file

@ -27,10 +27,6 @@ package org.geysermc.geyser.session.cache;
import it.unimi.dsi.fastutil.objects.Object2IntMap; import it.unimi.dsi.fastutil.objects.Object2IntMap;
import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; 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 net.kyori.adventure.key.Key;
import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.GeyserImpl;
import org.geysermc.geyser.GeyserLogger; 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.item.type.Item;
import org.geysermc.geyser.level.block.type.Block; import org.geysermc.geyser.level.block.type.Block;
import org.geysermc.geyser.session.GeyserSession; 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.Tag;
import org.geysermc.geyser.session.cache.tags.TagRegistry; import org.geysermc.geyser.session.cache.tags.TagRegistry;
import org.geysermc.geyser.session.cache.tags.VanillaTag; import org.geysermc.geyser.session.cache.tags.VanillaTag;
import org.geysermc.geyser.util.MinecraftKey; import org.geysermc.geyser.util.MinecraftKey;
import org.geysermc.mcprotocollib.protocol.packet.common.clientbound.ClientboundUpdateTagsPacket; 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 * Manages information sent from the {@link ClientboundUpdateTagsPacket}. If that packet is not sent, all lists here
* will remain empty, matching Java Edition behavior. * will remain empty, matching Java Edition behavior.
@ -142,6 +144,13 @@ public final class TagCache {
return contains(get(tag), item.javaId()); 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) { public int[] get(Tag tag) {
if (tag instanceof VanillaTag vanillaTag) { if (tag instanceof VanillaTag vanillaTag) {
return this.tags[tag.registry().ordinal()][vanillaTag.ordinal()]; return this.tags[tag.registry().ordinal()][vanillaTag.ordinal()];

View file

@ -25,11 +25,12 @@
package org.geysermc.geyser.session.cache.tags; package org.geysermc.geyser.session.cache.tags;
import java.util.HashMap;
import java.util.Map;
import net.kyori.adventure.key.Key; import net.kyori.adventure.key.Key;
import org.geysermc.geyser.util.MinecraftKey; import org.geysermc.geyser.util.MinecraftKey;
import java.util.HashMap;
import java.util.Map;
@SuppressWarnings("unused") @SuppressWarnings("unused")
public final class BlockTag { public final class BlockTag {
public static final Map<Key, Tag> ALL_BLOCK_TAGS = new HashMap<>(); public static final Map<Key, Tag> ALL_BLOCK_TAGS = new HashMap<>();

View file

@ -25,11 +25,12 @@
package org.geysermc.geyser.session.cache.tags; package org.geysermc.geyser.session.cache.tags;
import java.util.HashMap;
import java.util.Map;
import net.kyori.adventure.key.Key; import net.kyori.adventure.key.Key;
import org.geysermc.geyser.util.MinecraftKey; import org.geysermc.geyser.util.MinecraftKey;
import java.util.HashMap;
import java.util.Map;
@SuppressWarnings("unused") @SuppressWarnings("unused")
public final class EnchantmentTag { public final class EnchantmentTag {
public static final Map<Key, Tag> ALL_ENCHANTMENT_TAGS = new HashMap<>(); public static final Map<Key, Tag> ALL_ENCHANTMENT_TAGS = new HashMap<>();

View file

@ -31,7 +31,7 @@ import lombok.Data;
import net.kyori.adventure.key.Key; import net.kyori.adventure.key.Key;
import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.NonNull;
import org.checkerframework.checker.nullness.qual.Nullable; import org.checkerframework.checker.nullness.qual.Nullable;
import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.session.cache.TagCache;
@Data @Data
public final class HolderSet { public final class HolderSet {
@ -49,12 +49,12 @@ public final class HolderSet {
this.holders = null; this.holders = null;
} }
public int[] resolve(GeyserSession session, TagRegistry registry) { public int[] resolve(TagCache tagCache, TagRegistry registry) {
if (holders != null) { if (holders != null) {
return holders; 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<Key, Integer> keyIdMapping) { public static HolderSet readHolderSet(@Nullable Object holderSet, Function<Key, Integer> keyIdMapping) {

View file

@ -25,11 +25,12 @@
package org.geysermc.geyser.session.cache.tags; package org.geysermc.geyser.session.cache.tags;
import java.util.HashMap;
import java.util.Map;
import net.kyori.adventure.key.Key; import net.kyori.adventure.key.Key;
import org.geysermc.geyser.util.MinecraftKey; import org.geysermc.geyser.util.MinecraftKey;
import java.util.HashMap;
import java.util.Map;
@SuppressWarnings("unused") @SuppressWarnings("unused")
public final class ItemTag { public final class ItemTag {
public static final Map<Key, Tag> ALL_ITEM_TAGS = new HashMap<>(); public static final Map<Key, Tag> ALL_ITEM_TAGS = new HashMap<>();