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()) {
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)) {

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.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()];

View file

@ -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<Key, Tag> ALL_BLOCK_TAGS = new HashMap<>();

View file

@ -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<Key, Tag> ALL_ENCHANTMENT_TAGS = new HashMap<>();

View file

@ -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<Key, Integer> keyIdMapping) {

View file

@ -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<Key, Tag> ALL_ITEM_TAGS = new HashMap<>();