This commit is contained in:
Eclipse 2024-08-15 00:37:08 +02:00 committed by GitHub
commit b99e398ad8
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
37 changed files with 852 additions and 556 deletions

View file

@ -87,6 +87,7 @@ import org.geysermc.geyser.session.GeyserSession;
import org.geysermc.geyser.session.PendingMicrosoftAuthentication;
import org.geysermc.geyser.session.SessionManager;
import org.geysermc.geyser.session.cache.RegistryCache;
import org.geysermc.geyser.session.cache.tags.TagRegistry;
import org.geysermc.geyser.skin.FloodgateSkinUploader;
import org.geysermc.geyser.skin.ProvidedSkins;
import org.geysermc.geyser.skin.SkinProvider;
@ -234,6 +235,7 @@ public class GeyserImpl implements GeyserApi, EventRegistrar {
/* Initialize registries */
Registries.init();
BlockRegistries.init();
TagRegistry.init();
RegistryCache.init();

View file

@ -34,7 +34,7 @@ import org.geysermc.geyser.entity.EntityDefinition;
import org.geysermc.geyser.entity.type.living.AgeableEntity;
import org.geysermc.geyser.inventory.GeyserItemStack;
import org.geysermc.geyser.session.GeyserSession;
import org.geysermc.geyser.session.cache.tags.ItemTag;
import org.geysermc.geyser.session.cache.tags.Tag;
import org.geysermc.geyser.util.InteractionResult;
import org.geysermc.geyser.util.InteractiveTag;
import org.geysermc.mcprotocollib.protocol.data.game.entity.player.Hand;
@ -48,7 +48,7 @@ public abstract class AnimalEntity extends AgeableEntity {
}
protected final boolean canEat(GeyserItemStack itemStack) {
ItemTag tag = getFoodTag();
Tag tag = getFoodTag();
if (tag == null) {
return false;
}
@ -58,7 +58,7 @@ public abstract class AnimalEntity extends AgeableEntity {
/**
* @return the tag associated with this animal for eating food. Null for nothing or different behavior.
*/
protected abstract @Nullable ItemTag getFoodTag();
protected abstract @Nullable Tag getFoodTag();
@NonNull
@Override

View file

@ -30,6 +30,7 @@ import org.cloudburstmc.math.vector.Vector3f;
import org.geysermc.geyser.entity.EntityDefinition;
import org.geysermc.geyser.session.GeyserSession;
import org.geysermc.geyser.session.cache.tags.ItemTag;
import org.geysermc.geyser.session.cache.tags.Tag;
import org.geysermc.mcprotocollib.protocol.data.game.entity.metadata.ArmadilloState;
import org.geysermc.mcprotocollib.protocol.data.game.entity.metadata.type.ObjectEntityMetadata;
@ -75,7 +76,7 @@ public class ArmadilloEntity extends AnimalEntity {
@Override
@Nullable
protected ItemTag getFoodTag() {
protected Tag getFoodTag() {
return ItemTag.ARMADILLO_FOOD;
}
}

View file

@ -34,6 +34,7 @@ import org.geysermc.geyser.entity.EntityDefinition;
import org.geysermc.geyser.inventory.GeyserItemStack;
import org.geysermc.geyser.session.GeyserSession;
import org.geysermc.geyser.session.cache.tags.ItemTag;
import org.geysermc.geyser.session.cache.tags.Tag;
import org.geysermc.geyser.util.EntityUtils;
import org.geysermc.geyser.util.InteractionResult;
import org.geysermc.mcprotocollib.protocol.data.game.entity.metadata.type.BooleanEntityMetadata;
@ -62,7 +63,7 @@ public class AxolotlEntity extends AnimalEntity {
@Override
@Nullable
protected ItemTag getFoodTag() {
protected Tag getFoodTag() {
return ItemTag.AXOLOTL_FOOD;
}

View file

@ -34,6 +34,7 @@ import org.cloudburstmc.protocol.bedrock.packet.EntityEventPacket;
import org.geysermc.geyser.entity.EntityDefinition;
import org.geysermc.geyser.session.GeyserSession;
import org.geysermc.geyser.session.cache.tags.ItemTag;
import org.geysermc.geyser.session.cache.tags.Tag;
import org.geysermc.mcprotocollib.protocol.data.game.entity.metadata.type.ByteEntityMetadata;
import org.geysermc.mcprotocollib.protocol.data.game.entity.metadata.type.IntEntityMetadata;
@ -69,7 +70,7 @@ public class BeeEntity extends AnimalEntity {
@Override
@Nullable
protected ItemTag getFoodTag() {
protected Tag getFoodTag() {
return ItemTag.BEE_FOOD;
}
}

View file

@ -30,6 +30,7 @@ import org.cloudburstmc.math.vector.Vector3f;
import org.geysermc.geyser.entity.EntityDefinition;
import org.geysermc.geyser.session.GeyserSession;
import org.geysermc.geyser.session.cache.tags.ItemTag;
import org.geysermc.geyser.session.cache.tags.Tag;
import java.util.UUID;
@ -41,7 +42,7 @@ public class ChickenEntity extends AnimalEntity {
@Override
@Nullable
protected ItemTag getFoodTag() {
protected Tag getFoodTag() {
return ItemTag.CHICKEN_FOOD;
}
}

View file

@ -35,6 +35,7 @@ import org.geysermc.geyser.inventory.GeyserItemStack;
import org.geysermc.geyser.item.Items;
import org.geysermc.geyser.session.GeyserSession;
import org.geysermc.geyser.session.cache.tags.ItemTag;
import org.geysermc.geyser.session.cache.tags.Tag;
import org.geysermc.geyser.util.InteractionResult;
import org.geysermc.geyser.util.InteractiveTag;
import org.geysermc.mcprotocollib.protocol.data.game.entity.player.Hand;
@ -69,7 +70,7 @@ public class CowEntity extends AnimalEntity {
@Override
@Nullable
protected ItemTag getFoodTag() {
protected Tag getFoodTag() {
return ItemTag.COW_FOOD;
}
}

View file

@ -32,6 +32,7 @@ import org.cloudburstmc.protocol.bedrock.data.entity.EntityFlag;
import org.geysermc.geyser.entity.EntityDefinition;
import org.geysermc.geyser.session.GeyserSession;
import org.geysermc.geyser.session.cache.tags.ItemTag;
import org.geysermc.geyser.session.cache.tags.Tag;
import org.geysermc.mcprotocollib.protocol.data.game.entity.metadata.type.ByteEntityMetadata;
import org.geysermc.mcprotocollib.protocol.data.game.entity.metadata.type.IntEntityMetadata;
@ -57,7 +58,7 @@ public class FoxEntity extends AnimalEntity {
@Override
@Nullable
protected ItemTag getFoodTag() {
protected Tag getFoodTag() {
return ItemTag.FOX_FOOD;
}
}

View file

@ -33,6 +33,7 @@ import org.geysermc.geyser.entity.EntityDefinition;
import org.geysermc.geyser.entity.type.Entity;
import org.geysermc.geyser.session.GeyserSession;
import org.geysermc.geyser.session.cache.tags.ItemTag;
import org.geysermc.geyser.session.cache.tags.Tag;
import org.geysermc.mcprotocollib.protocol.data.game.entity.metadata.Pose;
import org.geysermc.mcprotocollib.protocol.data.game.entity.metadata.type.IntEntityMetadata;
import org.geysermc.mcprotocollib.protocol.data.game.entity.metadata.type.ObjectEntityMetadata;
@ -77,7 +78,7 @@ public class FrogEntity extends AnimalEntity {
@Override
@Nullable
protected ItemTag getFoodTag() {
protected Tag getFoodTag() {
return ItemTag.FROG_FOOD;
}
}

View file

@ -36,6 +36,7 @@ import org.geysermc.geyser.inventory.GeyserItemStack;
import org.geysermc.geyser.item.Items;
import org.geysermc.geyser.session.GeyserSession;
import org.geysermc.geyser.session.cache.tags.ItemTag;
import org.geysermc.geyser.session.cache.tags.Tag;
import org.geysermc.geyser.util.InteractionResult;
import org.geysermc.mcprotocollib.protocol.data.game.entity.metadata.Pose;
import org.geysermc.mcprotocollib.protocol.data.game.entity.metadata.type.BooleanEntityMetadata;
@ -99,7 +100,7 @@ public class GoatEntity extends AnimalEntity {
@Override
@Nullable
protected ItemTag getFoodTag() {
protected Tag getFoodTag() {
return ItemTag.GOAT_FOOD;
}
}

View file

@ -32,6 +32,7 @@ import org.cloudburstmc.protocol.bedrock.data.entity.EntityFlag;
import org.geysermc.geyser.entity.EntityDefinition;
import org.geysermc.geyser.session.GeyserSession;
import org.geysermc.geyser.session.cache.tags.ItemTag;
import org.geysermc.geyser.session.cache.tags.Tag;
import org.geysermc.mcprotocollib.protocol.data.game.entity.metadata.type.BooleanEntityMetadata;
import java.util.UUID;
@ -58,7 +59,7 @@ public class HoglinEntity extends AnimalEntity {
@Override
@Nullable
protected ItemTag getFoodTag() {
protected Tag getFoodTag() {
return ItemTag.HOGLIN_FOOD;
}

View file

@ -33,6 +33,7 @@ import org.geysermc.geyser.entity.EntityDefinition;
import org.geysermc.geyser.inventory.GeyserItemStack;
import org.geysermc.geyser.session.GeyserSession;
import org.geysermc.geyser.session.cache.tags.ItemTag;
import org.geysermc.geyser.session.cache.tags.Tag;
import org.geysermc.geyser.util.InteractionResult;
import org.geysermc.geyser.util.InteractiveTag;
import org.geysermc.mcprotocollib.protocol.data.game.entity.player.Hand;
@ -47,7 +48,7 @@ public class OcelotEntity extends AnimalEntity {
@Override
@Nullable
protected ItemTag getFoodTag() {
protected Tag getFoodTag() {
return ItemTag.OCELOT_FOOD;
}

View file

@ -36,6 +36,7 @@ import org.geysermc.geyser.entity.EntityDefinition;
import org.geysermc.geyser.inventory.GeyserItemStack;
import org.geysermc.geyser.session.GeyserSession;
import org.geysermc.geyser.session.cache.tags.ItemTag;
import org.geysermc.geyser.session.cache.tags.Tag;
import org.geysermc.geyser.util.InteractionResult;
import org.geysermc.geyser.util.InteractiveTag;
import org.geysermc.mcprotocollib.protocol.data.game.entity.metadata.type.ByteEntityMetadata;
@ -90,7 +91,7 @@ public class PandaEntity extends AnimalEntity {
@Override
@Nullable
protected ItemTag getFoodTag() {
protected Tag getFoodTag() {
return ItemTag.PANDA_FOOD;
}

View file

@ -33,6 +33,7 @@ import org.geysermc.geyser.entity.EntityDefinition;
import org.geysermc.geyser.inventory.GeyserItemStack;
import org.geysermc.geyser.session.GeyserSession;
import org.geysermc.geyser.session.cache.tags.ItemTag;
import org.geysermc.geyser.session.cache.tags.Tag;
import org.geysermc.geyser.util.EntityUtils;
import org.geysermc.geyser.util.InteractionResult;
import org.geysermc.geyser.util.InteractiveTag;
@ -48,7 +49,7 @@ public class PigEntity extends AnimalEntity {
@Override
@Nullable
protected ItemTag getFoodTag() {
protected Tag getFoodTag() {
return ItemTag.PIG_FOOD;
}

View file

@ -29,7 +29,7 @@ import org.checkerframework.checker.nullness.qual.Nullable;
import org.cloudburstmc.math.vector.Vector3f;
import org.geysermc.geyser.entity.EntityDefinition;
import org.geysermc.geyser.session.GeyserSession;
import org.geysermc.geyser.session.cache.tags.ItemTag;
import org.geysermc.geyser.session.cache.tags.Tag;
import java.util.UUID;
@ -41,7 +41,7 @@ public class PolarBearEntity extends AnimalEntity {
@Override
@Nullable
protected ItemTag getFoodTag() {
protected Tag getFoodTag() {
return null;
}
}

View file

@ -32,6 +32,7 @@ import org.cloudburstmc.protocol.bedrock.data.entity.EntityFlag;
import org.geysermc.geyser.entity.EntityDefinition;
import org.geysermc.geyser.session.GeyserSession;
import org.geysermc.geyser.session.cache.tags.ItemTag;
import org.geysermc.geyser.session.cache.tags.Tag;
import org.geysermc.mcprotocollib.protocol.data.game.entity.metadata.type.IntEntityMetadata;
import java.util.UUID;
@ -68,7 +69,7 @@ public class RabbitEntity extends AnimalEntity {
@Override
@Nullable
protected ItemTag getFoodTag() {
protected Tag getFoodTag() {
return ItemTag.RABBIT_FOOD;
}
}
}

View file

@ -36,6 +36,7 @@ import org.geysermc.geyser.item.Items;
import org.geysermc.geyser.item.type.DyeItem;
import org.geysermc.geyser.session.GeyserSession;
import org.geysermc.geyser.session.cache.tags.ItemTag;
import org.geysermc.geyser.session.cache.tags.Tag;
import org.geysermc.geyser.util.InteractionResult;
import org.geysermc.geyser.util.InteractiveTag;
import org.geysermc.mcprotocollib.protocol.data.game.entity.metadata.type.ByteEntityMetadata;
@ -59,7 +60,7 @@ public class SheepEntity extends AnimalEntity {
@Override
@Nullable
protected ItemTag getFoodTag() {
protected Tag getFoodTag() {
return ItemTag.SHEEP_FOOD;
}
@ -103,4 +104,4 @@ public class SheepEntity extends AnimalEntity {
private boolean canDye(GeyserItemStack item) {
return item.asItem() instanceof DyeItem dyeItem && dyeItem.dyeColor() != this.color && !getFlag(EntityFlag.SHEARED);
}
}
}

View file

@ -37,6 +37,7 @@ import org.geysermc.geyser.entity.EntityDefinitions;
import org.geysermc.geyser.entity.type.Tickable;
import org.geysermc.geyser.session.GeyserSession;
import org.geysermc.geyser.session.cache.tags.ItemTag;
import org.geysermc.geyser.session.cache.tags.Tag;
import org.geysermc.mcprotocollib.protocol.data.game.entity.metadata.Pose;
import org.geysermc.mcprotocollib.protocol.data.game.entity.metadata.SnifferState;
import org.geysermc.mcprotocollib.protocol.data.game.entity.metadata.type.ObjectEntityMetadata;
@ -73,7 +74,7 @@ public class SnifferEntity extends AnimalEntity implements Tickable {
@Override
@Nullable
protected ItemTag getFoodTag() {
protected Tag getFoodTag() {
return ItemTag.SNIFFER_FOOD;
}

View file

@ -34,6 +34,7 @@ import org.geysermc.geyser.entity.type.Entity;
import org.geysermc.geyser.inventory.GeyserItemStack;
import org.geysermc.geyser.session.GeyserSession;
import org.geysermc.geyser.session.cache.tags.ItemTag;
import org.geysermc.geyser.session.cache.tags.Tag;
import org.geysermc.geyser.util.EntityUtils;
import org.geysermc.geyser.util.InteractionResult;
import org.geysermc.geyser.util.InteractiveTag;
@ -95,7 +96,7 @@ public class StriderEntity extends AnimalEntity {
@Override
@Nullable
protected ItemTag getFoodTag() {
protected Tag getFoodTag() {
return ItemTag.STRIDER_FOOD;
}

View file

@ -31,6 +31,7 @@ import org.cloudburstmc.protocol.bedrock.data.entity.EntityFlag;
import org.geysermc.geyser.entity.EntityDefinition;
import org.geysermc.geyser.session.GeyserSession;
import org.geysermc.geyser.session.cache.tags.ItemTag;
import org.geysermc.geyser.session.cache.tags.Tag;
import org.geysermc.mcprotocollib.protocol.data.game.entity.metadata.type.BooleanEntityMetadata;
import java.util.UUID;
@ -51,7 +52,7 @@ public class TurtleEntity extends AnimalEntity {
@Override
@Nullable
protected ItemTag getFoodTag() {
protected Tag getFoodTag() {
return ItemTag.TURTLE_FOOD;
}

View file

@ -41,6 +41,7 @@ import org.geysermc.geyser.inventory.GeyserItemStack;
import org.geysermc.geyser.item.Items;
import org.geysermc.geyser.session.GeyserSession;
import org.geysermc.geyser.session.cache.tags.ItemTag;
import org.geysermc.geyser.session.cache.tags.Tag;
import org.geysermc.geyser.util.InteractionResult;
import org.geysermc.geyser.util.InteractiveTag;
import org.geysermc.mcprotocollib.protocol.data.game.entity.metadata.type.ByteEntityMetadata;
@ -119,7 +120,7 @@ public class AbstractHorseEntity extends AnimalEntity {
@Override
@Nullable
protected ItemTag getFoodTag() {
protected Tag getFoodTag() {
return ItemTag.HORSE_FOOD;
}

View file

@ -35,6 +35,7 @@ import org.cloudburstmc.protocol.bedrock.packet.EntityEventPacket;
import org.geysermc.geyser.entity.EntityDefinition;
import org.geysermc.geyser.session.GeyserSession;
import org.geysermc.geyser.session.cache.tags.ItemTag;
import org.geysermc.geyser.session.cache.tags.Tag;
import org.geysermc.mcprotocollib.protocol.data.game.entity.metadata.Pose;
import org.geysermc.mcprotocollib.protocol.data.game.entity.metadata.type.BooleanEntityMetadata;
import org.geysermc.mcprotocollib.protocol.data.game.entity.metadata.type.ByteEntityMetadata;
@ -90,7 +91,7 @@ public class CamelEntity extends AbstractHorseEntity {
}
@Override
protected @Nullable ItemTag getFoodTag() {
protected @Nullable Tag getFoodTag() {
return ItemTag.CAMEL_FOOD;
}

View file

@ -32,6 +32,7 @@ import org.cloudburstmc.protocol.bedrock.data.entity.EntityDataTypes;
import org.geysermc.geyser.entity.EntityDefinition;
import org.geysermc.geyser.session.GeyserSession;
import org.geysermc.geyser.session.cache.tags.ItemTag;
import org.geysermc.geyser.session.cache.tags.Tag;
import org.geysermc.geyser.util.MathUtils;
import org.geysermc.mcprotocollib.protocol.data.game.entity.metadata.type.IntEntityMetadata;
@ -56,7 +57,7 @@ public class LlamaEntity extends ChestedHorseEntity {
}
@Override
protected @Nullable ItemTag getFoodTag() {
protected @Nullable Tag getFoodTag() {
return ItemTag.LLAMA_FOOD;
}
}

View file

@ -34,6 +34,7 @@ import org.geysermc.geyser.entity.EntityDefinition;
import org.geysermc.geyser.inventory.GeyserItemStack;
import org.geysermc.geyser.session.GeyserSession;
import org.geysermc.geyser.session.cache.tags.ItemTag;
import org.geysermc.geyser.session.cache.tags.Tag;
import org.geysermc.geyser.util.InteractionResult;
import org.geysermc.geyser.util.InteractiveTag;
import org.geysermc.mcprotocollib.protocol.data.game.entity.metadata.type.BooleanEntityMetadata;
@ -109,7 +110,7 @@ public class CatEntity extends TameableEntity {
}
@Override
protected @Nullable ItemTag getFoodTag() {
protected @Nullable Tag getFoodTag() {
return ItemTag.CAT_FOOD;
}

View file

@ -34,6 +34,7 @@ import org.geysermc.geyser.inventory.GeyserItemStack;
import org.geysermc.geyser.item.type.Item;
import org.geysermc.geyser.session.GeyserSession;
import org.geysermc.geyser.session.cache.tags.ItemTag;
import org.geysermc.geyser.session.cache.tags.Tag;
import org.geysermc.geyser.util.InteractionResult;
import org.geysermc.geyser.util.InteractiveTag;
import org.geysermc.mcprotocollib.protocol.data.game.entity.player.Hand;
@ -47,7 +48,7 @@ public class ParrotEntity extends TameableEntity {
@Override
@Nullable
protected ItemTag getFoodTag() {
protected Tag getFoodTag() {
return null;
}

View file

@ -38,6 +38,7 @@ import org.geysermc.geyser.item.enchantment.EnchantmentComponent;
import org.geysermc.geyser.item.type.DyeItem;
import org.geysermc.geyser.session.GeyserSession;
import org.geysermc.geyser.session.cache.tags.ItemTag;
import org.geysermc.geyser.session.cache.tags.Tag;
import org.geysermc.geyser.util.InteractionResult;
import org.geysermc.geyser.util.InteractiveTag;
import org.geysermc.geyser.util.ItemUtils;
@ -116,7 +117,7 @@ public class WolfEntity extends TameableEntity {
@Override
@Nullable
protected ItemTag getFoodTag() {
protected Tag getFoodTag() {
return ItemTag.WOLF_FOOD;
}

View file

@ -27,7 +27,6 @@ package org.geysermc.geyser.inventory.updater;
import it.unimi.dsi.fastutil.objects.Object2IntMap;
import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap;
import java.util.stream.IntStream;
import net.kyori.adventure.text.Component;
import org.cloudburstmc.nbt.NbtMap;
import org.cloudburstmc.nbt.NbtMapBuilder;
@ -42,14 +41,11 @@ import org.geysermc.geyser.inventory.item.BedrockEnchantment;
import org.geysermc.geyser.item.enchantment.Enchantment;
import org.geysermc.geyser.item.Items;
import org.geysermc.geyser.session.GeyserSession;
import org.geysermc.geyser.session.cache.tags.EnchantmentTag;
import org.geysermc.geyser.session.cache.tags.ItemTag;
import org.geysermc.geyser.translator.inventory.InventoryTranslator;
import org.geysermc.geyser.translator.text.MessageTranslator;
import org.geysermc.geyser.util.ItemUtils;
import org.geysermc.mcprotocollib.protocol.data.game.entity.player.GameMode;
import org.geysermc.mcprotocollib.protocol.data.game.item.component.DataComponentType;
import org.geysermc.mcprotocollib.protocol.data.game.item.component.HolderSet;
import org.geysermc.mcprotocollib.protocol.data.game.item.component.ItemEnchantments;
import org.geysermc.mcprotocollib.protocol.packet.ingame.serverbound.inventory.ServerboundRenameItemPacket;
@ -314,12 +310,9 @@ public class AnvilInventoryUpdater extends InventoryUpdater {
for (Object2IntMap.Entry<Enchantment> entry : getEnchantments(session, material).object2IntEntrySet()) {
Enchantment enchantment = entry.getKey();
HolderSet supportedItems = enchantment.supportedItems();
int[] supportedItemIds = supportedItems.resolve(tagId -> session.getTagCache().get(ItemTag.ALL_ITEM_TAGS.get(tagId)));
boolean canApply = isEnchantedBook(input) || IntStream.of(supportedItemIds).anyMatch(id -> id == input.getJavaId());
boolean canApply = isEnchantedBook(input) || session.getTagCache().is(enchantment.supportedItems(), input.getJavaId());
HolderSet exclusiveSet = enchantment.exclusiveSet();
int[] incompatibleEnchantments = exclusiveSet.resolve(tagId -> session.getTagCache().get(EnchantmentTag.ALL_ENCHANTMENT_TAGS.get(tagId)));
int[] incompatibleEnchantments = enchantment.exclusiveSet().resolve(session.getTagCache());
for (int i : incompatibleEnchantments) {
Enchantment incompatible = session.getRegistryCache().enchantments().byId(i);
if (combinedEnchantments.containsKey(incompatible)) {

View file

@ -25,21 +25,19 @@
package org.geysermc.geyser.item.enchantment;
import java.util.List;
import java.util.function.Function;
import net.kyori.adventure.key.Key;
import org.checkerframework.checker.nullness.qual.Nullable;
import org.cloudburstmc.nbt.NbtMap;
import org.geysermc.geyser.inventory.item.BedrockEnchantment;
import org.geysermc.geyser.item.Items;
import org.geysermc.geyser.registry.Registries;
import org.geysermc.geyser.session.cache.registry.RegistryEntryContext;
import org.geysermc.geyser.session.cache.tags.HolderSet;
import org.geysermc.geyser.session.cache.tags.TagRegistry;
import org.geysermc.geyser.translator.text.MessageTranslator;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.geysermc.mcprotocollib.protocol.data.game.item.component.HolderSet;
/**
* @param description only populated if {@link #bedrockEnchantment()} is not null.
@ -58,12 +56,12 @@ public record Enchantment(String identifier,
NbtMap data = context.data();
Set<EnchantmentComponent> effects = readEnchantmentComponents(data.getCompound("effects"));
HolderSet supportedItems = readHolderSet(data.get("supported_items"), itemId -> Registries.JAVA_ITEM_IDENTIFIERS.getOrDefault(itemId.asString(), Items.AIR).javaId());
HolderSet supportedItems = HolderSet.readHolderSet(TagRegistry.ITEM, data.get("supported_items"), itemId -> Registries.JAVA_ITEM_IDENTIFIERS.getOrDefault(itemId.asString(), Items.AIR).javaId());
int maxLevel = data.getInt("max_level");
int anvilCost = data.getInt("anvil_cost");
HolderSet exclusiveSet = readHolderSet(data.getOrDefault("exclusive_set", null), context::getNetworkId);
HolderSet exclusiveSet = HolderSet.readHolderSet(TagRegistry.ENCHANTMENT, data.get("exclusive_set"), context::getNetworkId);
BedrockEnchantment bedrockEnchantment = BedrockEnchantment.getByJavaIdentifier(context.id().asString());
@ -84,24 +82,4 @@ public record Enchantment(String identifier,
}
return Set.copyOf(components); // Also ensures any empty sets are consolidated
}
// TODO holder set util?
private static HolderSet readHolderSet(@Nullable Object holderSet, Function<Key, Integer> keyIdMapping) {
if (holderSet == null) {
return new HolderSet(new int[]{});
}
if (holderSet instanceof String stringTag) {
// Tag
if (stringTag.startsWith("#")) {
return new HolderSet(Key.key(stringTag.substring(1))); // Remove '#' at beginning that indicates tag
} else {
return new HolderSet(new int[]{keyIdMapping.apply(Key.key(stringTag))});
}
} else if (holderSet instanceof List<?> list) {
// Assume the list is a list of strings
return new HolderSet(list.stream().map(o -> (String) o).map(Key::key).map(keyIdMapping).mapToInt(Integer::intValue).toArray());
}
throw new IllegalArgumentException("Holder set must either be a tag, a string ID or a list of string IDs");
}
}

View file

@ -25,117 +25,143 @@
package org.geysermc.geyser.session.cache;
import it.unimi.dsi.fastutil.ints.IntArrays;
import it.unimi.dsi.fastutil.objects.Object2IntMap;
import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap;
import net.kyori.adventure.key.Key;
import org.checkerframework.checker.nullness.qual.Nullable;
import org.geysermc.geyser.GeyserImpl;
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.tags.BlockTag;
import org.geysermc.geyser.session.cache.tags.EnchantmentTag;
import org.geysermc.geyser.session.cache.tags.ItemTag;
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.geyser.util.Ordered;
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;
import static org.geysermc.geyser.session.cache.tags.BlockTag.ALL_BLOCK_TAGS;
import static org.geysermc.geyser.session.cache.tags.EnchantmentTag.ALL_ENCHANTMENT_TAGS;
import static org.geysermc.geyser.session.cache.tags.ItemTag.ALL_ITEM_TAGS;
/**
* 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. Only tags from registries in {@link TagRegistry} are stored.
*/
@ParametersAreNonnullByDefault
public final class TagCache {
private final int[][] blocks = new int[ALL_BLOCK_TAGS.size()][];
private final int[][] items = new int[ALL_ITEM_TAGS.size()][];
private final int[][] enchantments = new int[ALL_ENCHANTMENT_TAGS.size()][];
// Stores the indexes of non-vanilla tag keys in the tags array.
private Object2IntMap<Key>[] tagIndexMaps = new Object2IntMap[TagRegistry.values().length];
private int[][][] tags = new int[TagRegistry.values().length][][];
public void loadPacket(GeyserSession session, ClientboundUpdateTagsPacket packet) {
Map<Key, int[]> blockTags = packet.getTags().get(MinecraftKey.key("block"));
loadTags("Block", blockTags, ALL_BLOCK_TAGS, this.blocks);
// Hack btw
Map<Key, Map<Key, int[]>> allTags = packet.getTags();
GeyserLogger logger = session.getGeyser().getLogger();
int[] convertableToMud = blockTags.get(MinecraftKey.key("convertable_to_mud"));
boolean emulatePost1_18Logic = convertableToMud != null && convertableToMud.length != 0;
session.setEmulatePost1_18Logic(emulatePost1_18Logic);
if (logger.isDebug()) {
logger.debug("Emulating post 1.18 block predication logic for " + session.bedrockUsername() + "? " + emulatePost1_18Logic);
this.tagIndexMaps = new Object2IntMap[TagRegistry.values().length];
this.tags = new int[TagRegistry.values().length][][];
for (Key registryKey : allTags.keySet()) {
TagRegistry registry = TagRegistry.fromKey(registryKey);
if (registry == null) {
logger.debug("Not loading tags for registry " + registryKey + " (registry is not defined in TagRegistry enum)");
continue;
}
Map<Key, int[]> registryTags = allTags.get(registryKey);
if (registry == TagRegistry.BLOCK) {
// Hack btw
int[] convertableToMud = registryTags.get(MinecraftKey.key("convertable_to_mud"));
boolean emulatePost1_18Logic = convertableToMud != null && convertableToMud.length != 0;
session.setEmulatePost1_18Logic(emulatePost1_18Logic);
if (logger.isDebug()) {
logger.debug("Emulating post 1.18 block predication logic for " + session.bedrockUsername() + "? " + emulatePost1_18Logic);
}
} else if (registry == TagRegistry.ITEM) {
// Hack btw
boolean emulatePost1_13Logic = registryTags.get(MinecraftKey.key("signs")).length > 1;
session.setEmulatePost1_13Logic(emulatePost1_13Logic);
if (logger.isDebug()) {
logger.debug("Emulating post 1.13 villager logic for " + session.bedrockUsername() + "? " + emulatePost1_13Logic);
}
}
Object2IntMap<Key> tagIndexMap = new Object2IntOpenHashMap<>();
this.tags[registry.ordinal()] = loadTags(registryTags, tagIndexMap, registry);
this.tagIndexMaps[registry.ordinal()] = tagIndexMap;
}
Map<Key, int[]> itemTags = packet.getTags().get(MinecraftKey.key("item"));
loadTags("Item", itemTags, ALL_ITEM_TAGS, this.items);
// Hack btw
boolean emulatePost1_13Logic = itemTags.get(MinecraftKey.key("signs")).length > 1;
session.setEmulatePost1_13Logic(emulatePost1_13Logic);
if (logger.isDebug()) {
logger.debug("Emulating post 1.13 villager logic for " + session.bedrockUsername() + "? " + emulatePost1_13Logic);
}
Map<Key, int[]> enchantmentTags = packet.getTags().get(MinecraftKey.key("enchantment"));
loadTags("Enchantment", enchantmentTags, ALL_ENCHANTMENT_TAGS, this.enchantments);
}
private <T extends Ordered> void loadTags(String type, @Nullable Map<Key, int[]> packetTags, Map<Key, T> allTags, int[][] localValues) {
if (packetTags == null) {
Arrays.fill(localValues, IntArrays.EMPTY_ARRAY);
GeyserImpl.getInstance().getLogger().debug("Not loading " + type + " tags; they do not exist here.");
return;
private int[][] loadTags(Map<Key, int[]> packetTags, Object2IntMap<Key> tagIndexMap, TagRegistry registry) {
Map<Key, Tag> vanillaTags = registry.getVanillaTags();
List<Key> nonVanillaTagKeys = packetTags.keySet().stream().filter(tag -> !vanillaTags.containsKey(tag)).toList();
int[][] tags = new int[vanillaTags.size() + nonVanillaTagKeys.size()][];
// Load all vanilla tags first (whether the server sent them or not), then load all the remaining non-vanilla tags the server might have sent.
for (Map.Entry<Key, Tag> vanillaTag : vanillaTags.entrySet()) {
tags[((VanillaTag) vanillaTag.getValue()).ordinal()] = packetTags.getOrDefault(vanillaTag.getKey(), new int[0]);
}
allTags.forEach((location, tag) -> {
int[] values = packetTags.get(location);
if (values != null) {
if (values.length != 0) {
localValues[tag.ordinal()] = values;
} else {
localValues[tag.ordinal()] = IntArrays.EMPTY_ARRAY;
}
} else {
localValues[tag.ordinal()] = IntArrays.EMPTY_ARRAY;
GeyserImpl.getInstance().getLogger().debug(type + " tag not found from server: " + location);
}
});
int tagIndex = vanillaTags.size();
for (Key nonVanillaTagKey : nonVanillaTagKeys) {
tags[tagIndex] = packetTags.get(nonVanillaTagKey);
tagIndexMap.put(nonVanillaTagKey, tagIndex);
tagIndex++;
}
return tags;
}
/**
* @return true if the block tag is present and contains this block mapping's Java ID.
*/
public boolean is(BlockTag tag, Block block) {
int[] values = this.blocks[tag.ordinal()];
return contains(values, block.javaId());
public boolean is(Tag tag, Block block) {
if (tag.registry() != TagRegistry.BLOCK) {
throw new IllegalArgumentException("Given tag is not a block tag! (tag registry=%s)".formatted(tag.registry()));
}
return contains(get(tag), block.javaId());
}
/**
* @return true if the item tag is present and contains this item stack's Java ID.
*/
public boolean is(ItemTag tag, GeyserItemStack itemStack) {
public boolean is(Tag tag, GeyserItemStack itemStack) {
return is(tag, itemStack.asItem());
}
/**
* @return true if the item tag is present and contains this item's Java ID.
*/
public boolean is(ItemTag tag, Item item) {
int[] values = this.items[tag.ordinal()];
return contains(values, item.javaId());
public boolean is(Tag tag, Item item) {
if (tag.registry() != TagRegistry.ITEM) {
throw new IllegalArgumentException("Given tag is not an item tag! (tag registry=%s)".formatted(tag.registry()));
}
return contains(get(tag), item.javaId());
}
public int[] get(ItemTag itemTag) {
return this.items[itemTag.ordinal()];
/**
* @return true if the specified network ID is in the given holder set.
*/
public boolean is(HolderSet holderSet, int id) {
return contains(holderSet.resolve(this), id);
}
public int[] get(EnchantmentTag enchantmentTag) {
return this.enchantments[enchantmentTag.ordinal()];
/**
* @return the network IDs in the given tag. This can be an empty list. Vanilla tags will be resolved faster than non-vanilla ones.
*/
public int[] get(Tag tag) {
if (tag instanceof VanillaTag vanillaTag) {
return this.tags[tag.registry().ordinal()][vanillaTag.ordinal()];
}
int registryIndex = tag.registry().ordinal();
Object2IntMap<Key> tagIndexMap = this.tagIndexMaps[registryIndex];
if (!tagIndexMap.containsKey(tag.tag())) {
return new int[0];
}
return this.tags[registryIndex][tagIndexMap.getInt(tag.tag())];
}
private static boolean contains(int[] array, int i) {

View file

@ -25,214 +25,205 @@
package org.geysermc.geyser.session.cache.tags;
import net.kyori.adventure.key.Key;
import org.geysermc.geyser.util.Ordered;
import java.util.HashMap;
import java.util.Map;
import org.geysermc.geyser.util.MinecraftKey;
/**
* Lists vanilla block tags.
*/
@SuppressWarnings("unused")
public final class BlockTag implements Ordered {
public static final Map<Key, BlockTag> ALL_BLOCK_TAGS = new HashMap<>();
public final class BlockTag {
public static final Tag WOOL = register("wool");
public static final Tag PLANKS = register("planks");
public static final Tag STONE_BRICKS = register("stone_bricks");
public static final Tag WOODEN_BUTTONS = register("wooden_buttons");
public static final Tag STONE_BUTTONS = register("stone_buttons");
public static final Tag BUTTONS = register("buttons");
public static final Tag WOOL_CARPETS = register("wool_carpets");
public static final Tag WOODEN_DOORS = register("wooden_doors");
public static final Tag MOB_INTERACTABLE_DOORS = register("mob_interactable_doors");
public static final Tag WOODEN_STAIRS = register("wooden_stairs");
public static final Tag WOODEN_SLABS = register("wooden_slabs");
public static final Tag WOODEN_FENCES = register("wooden_fences");
public static final Tag PRESSURE_PLATES = register("pressure_plates");
public static final Tag WOODEN_PRESSURE_PLATES = register("wooden_pressure_plates");
public static final Tag STONE_PRESSURE_PLATES = register("stone_pressure_plates");
public static final Tag WOODEN_TRAPDOORS = register("wooden_trapdoors");
public static final Tag DOORS = register("doors");
public static final Tag SAPLINGS = register("saplings");
public static final Tag LOGS_THAT_BURN = register("logs_that_burn");
public static final Tag OVERWORLD_NATURAL_LOGS = register("overworld_natural_logs");
public static final Tag LOGS = register("logs");
public static final Tag DARK_OAK_LOGS = register("dark_oak_logs");
public static final Tag OAK_LOGS = register("oak_logs");
public static final Tag BIRCH_LOGS = register("birch_logs");
public static final Tag ACACIA_LOGS = register("acacia_logs");
public static final Tag CHERRY_LOGS = register("cherry_logs");
public static final Tag JUNGLE_LOGS = register("jungle_logs");
public static final Tag SPRUCE_LOGS = register("spruce_logs");
public static final Tag MANGROVE_LOGS = register("mangrove_logs");
public static final Tag CRIMSON_STEMS = register("crimson_stems");
public static final Tag WARPED_STEMS = register("warped_stems");
public static final Tag BAMBOO_BLOCKS = register("bamboo_blocks");
public static final Tag WART_BLOCKS = register("wart_blocks");
public static final Tag BANNERS = register("banners");
public static final Tag SAND = register("sand");
public static final Tag SMELTS_TO_GLASS = register("smelts_to_glass");
public static final Tag STAIRS = register("stairs");
public static final Tag SLABS = register("slabs");
public static final Tag WALLS = register("walls");
public static final Tag ANVIL = register("anvil");
public static final Tag RAILS = register("rails");
public static final Tag LEAVES = register("leaves");
public static final Tag TRAPDOORS = register("trapdoors");
public static final Tag SMALL_FLOWERS = register("small_flowers");
public static final Tag BEDS = register("beds");
public static final Tag FENCES = register("fences");
public static final Tag TALL_FLOWERS = register("tall_flowers");
public static final Tag FLOWERS = register("flowers");
public static final Tag PIGLIN_REPELLENTS = register("piglin_repellents");
public static final Tag GOLD_ORES = register("gold_ores");
public static final Tag IRON_ORES = register("iron_ores");
public static final Tag DIAMOND_ORES = register("diamond_ores");
public static final Tag REDSTONE_ORES = register("redstone_ores");
public static final Tag LAPIS_ORES = register("lapis_ores");
public static final Tag COAL_ORES = register("coal_ores");
public static final Tag EMERALD_ORES = register("emerald_ores");
public static final Tag COPPER_ORES = register("copper_ores");
public static final Tag CANDLES = register("candles");
public static final Tag DIRT = register("dirt");
public static final Tag TERRACOTTA = register("terracotta");
public static final Tag BADLANDS_TERRACOTTA = register("badlands_terracotta");
public static final Tag CONCRETE_POWDER = register("concrete_powder");
public static final Tag COMPLETES_FIND_TREE_TUTORIAL = register("completes_find_tree_tutorial");
public static final Tag FLOWER_POTS = register("flower_pots");
public static final Tag ENDERMAN_HOLDABLE = register("enderman_holdable");
public static final Tag ICE = register("ice");
public static final Tag VALID_SPAWN = register("valid_spawn");
public static final Tag IMPERMEABLE = register("impermeable");
public static final Tag UNDERWATER_BONEMEALS = register("underwater_bonemeals");
public static final Tag CORAL_BLOCKS = register("coral_blocks");
public static final Tag WALL_CORALS = register("wall_corals");
public static final Tag CORAL_PLANTS = register("coral_plants");
public static final Tag CORALS = register("corals");
public static final Tag BAMBOO_PLANTABLE_ON = register("bamboo_plantable_on");
public static final Tag STANDING_SIGNS = register("standing_signs");
public static final Tag WALL_SIGNS = register("wall_signs");
public static final Tag SIGNS = register("signs");
public static final Tag CEILING_HANGING_SIGNS = register("ceiling_hanging_signs");
public static final Tag WALL_HANGING_SIGNS = register("wall_hanging_signs");
public static final Tag ALL_HANGING_SIGNS = register("all_hanging_signs");
public static final Tag ALL_SIGNS = register("all_signs");
public static final Tag DRAGON_IMMUNE = register("dragon_immune");
public static final Tag DRAGON_TRANSPARENT = register("dragon_transparent");
public static final Tag WITHER_IMMUNE = register("wither_immune");
public static final Tag WITHER_SUMMON_BASE_BLOCKS = register("wither_summon_base_blocks");
public static final Tag BEEHIVES = register("beehives");
public static final Tag CROPS = register("crops");
public static final Tag BEE_GROWABLES = register("bee_growables");
public static final Tag PORTALS = register("portals");
public static final Tag FIRE = register("fire");
public static final Tag NYLIUM = register("nylium");
public static final Tag BEACON_BASE_BLOCKS = register("beacon_base_blocks");
public static final Tag SOUL_SPEED_BLOCKS = register("soul_speed_blocks");
public static final Tag WALL_POST_OVERRIDE = register("wall_post_override");
public static final Tag CLIMBABLE = register("climbable");
public static final Tag FALL_DAMAGE_RESETTING = register("fall_damage_resetting");
public static final Tag SHULKER_BOXES = register("shulker_boxes");
public static final Tag HOGLIN_REPELLENTS = register("hoglin_repellents");
public static final Tag SOUL_FIRE_BASE_BLOCKS = register("soul_fire_base_blocks");
public static final Tag STRIDER_WARM_BLOCKS = register("strider_warm_blocks");
public static final Tag CAMPFIRES = register("campfires");
public static final Tag GUARDED_BY_PIGLINS = register("guarded_by_piglins");
public static final Tag PREVENT_MOB_SPAWNING_INSIDE = register("prevent_mob_spawning_inside");
public static final Tag FENCE_GATES = register("fence_gates");
public static final Tag UNSTABLE_BOTTOM_CENTER = register("unstable_bottom_center");
public static final Tag MUSHROOM_GROW_BLOCK = register("mushroom_grow_block");
public static final Tag INFINIBURN_OVERWORLD = register("infiniburn_overworld");
public static final Tag INFINIBURN_NETHER = register("infiniburn_nether");
public static final Tag INFINIBURN_END = register("infiniburn_end");
public static final Tag BASE_STONE_OVERWORLD = register("base_stone_overworld");
public static final Tag STONE_ORE_REPLACEABLES = register("stone_ore_replaceables");
public static final Tag DEEPSLATE_ORE_REPLACEABLES = register("deepslate_ore_replaceables");
public static final Tag BASE_STONE_NETHER = register("base_stone_nether");
public static final Tag OVERWORLD_CARVER_REPLACEABLES = register("overworld_carver_replaceables");
public static final Tag NETHER_CARVER_REPLACEABLES = register("nether_carver_replaceables");
public static final Tag CANDLE_CAKES = register("candle_cakes");
public static final Tag CAULDRONS = register("cauldrons");
public static final Tag CRYSTAL_SOUND_BLOCKS = register("crystal_sound_blocks");
public static final Tag INSIDE_STEP_SOUND_BLOCKS = register("inside_step_sound_blocks");
public static final Tag COMBINATION_STEP_SOUND_BLOCKS = register("combination_step_sound_blocks");
public static final Tag CAMEL_SAND_STEP_SOUND_BLOCKS = register("camel_sand_step_sound_blocks");
public static final Tag OCCLUDES_VIBRATION_SIGNALS = register("occludes_vibration_signals");
public static final Tag DAMPENS_VIBRATIONS = register("dampens_vibrations");
public static final Tag DRIPSTONE_REPLACEABLE_BLOCKS = register("dripstone_replaceable_blocks");
public static final Tag CAVE_VINES = register("cave_vines");
public static final Tag MOSS_REPLACEABLE = register("moss_replaceable");
public static final Tag LUSH_GROUND_REPLACEABLE = register("lush_ground_replaceable");
public static final Tag AZALEA_ROOT_REPLACEABLE = register("azalea_root_replaceable");
public static final Tag SMALL_DRIPLEAF_PLACEABLE = register("small_dripleaf_placeable");
public static final Tag BIG_DRIPLEAF_PLACEABLE = register("big_dripleaf_placeable");
public static final Tag SNOW = register("snow");
public static final Tag MINEABLE_AXE = register("mineable/axe");
public static final Tag MINEABLE_HOE = register("mineable/hoe");
public static final Tag MINEABLE_PICKAXE = register("mineable/pickaxe");
public static final Tag MINEABLE_SHOVEL = register("mineable/shovel");
public static final Tag SWORD_EFFICIENT = register("sword_efficient");
public static final Tag NEEDS_DIAMOND_TOOL = register("needs_diamond_tool");
public static final Tag NEEDS_IRON_TOOL = register("needs_iron_tool");
public static final Tag NEEDS_STONE_TOOL = register("needs_stone_tool");
public static final Tag INCORRECT_FOR_NETHERITE_TOOL = register("incorrect_for_netherite_tool");
public static final Tag INCORRECT_FOR_DIAMOND_TOOL = register("incorrect_for_diamond_tool");
public static final Tag INCORRECT_FOR_IRON_TOOL = register("incorrect_for_iron_tool");
public static final Tag INCORRECT_FOR_STONE_TOOL = register("incorrect_for_stone_tool");
public static final Tag INCORRECT_FOR_GOLD_TOOL = register("incorrect_for_gold_tool");
public static final Tag INCORRECT_FOR_WOODEN_TOOL = register("incorrect_for_wooden_tool");
public static final Tag FEATURES_CANNOT_REPLACE = register("features_cannot_replace");
public static final Tag LAVA_POOL_STONE_CANNOT_REPLACE = register("lava_pool_stone_cannot_replace");
public static final Tag GEODE_INVALID_BLOCKS = register("geode_invalid_blocks");
public static final Tag FROG_PREFER_JUMP_TO = register("frog_prefer_jump_to");
public static final Tag SCULK_REPLACEABLE = register("sculk_replaceable");
public static final Tag SCULK_REPLACEABLE_WORLD_GEN = register("sculk_replaceable_world_gen");
public static final Tag ANCIENT_CITY_REPLACEABLE = register("ancient_city_replaceable");
public static final Tag VIBRATION_RESONATORS = register("vibration_resonators");
public static final Tag ANIMALS_SPAWNABLE_ON = register("animals_spawnable_on");
public static final Tag ARMADILLO_SPAWNABLE_ON = register("armadillo_spawnable_on");
public static final Tag AXOLOTLS_SPAWNABLE_ON = register("axolotls_spawnable_on");
public static final Tag GOATS_SPAWNABLE_ON = register("goats_spawnable_on");
public static final Tag MOOSHROOMS_SPAWNABLE_ON = register("mooshrooms_spawnable_on");
public static final Tag PARROTS_SPAWNABLE_ON = register("parrots_spawnable_on");
public static final Tag POLAR_BEARS_SPAWNABLE_ON_ALTERNATE = register("polar_bears_spawnable_on_alternate");
public static final Tag RABBITS_SPAWNABLE_ON = register("rabbits_spawnable_on");
public static final Tag FOXES_SPAWNABLE_ON = register("foxes_spawnable_on");
public static final Tag WOLVES_SPAWNABLE_ON = register("wolves_spawnable_on");
public static final Tag FROGS_SPAWNABLE_ON = register("frogs_spawnable_on");
public static final Tag AZALEA_GROWS_ON = register("azalea_grows_on");
public static final Tag CONVERTABLE_TO_MUD = register("convertable_to_mud");
public static final Tag MANGROVE_LOGS_CAN_GROW_THROUGH = register("mangrove_logs_can_grow_through");
public static final Tag MANGROVE_ROOTS_CAN_GROW_THROUGH = register("mangrove_roots_can_grow_through");
public static final Tag DEAD_BUSH_MAY_PLACE_ON = register("dead_bush_may_place_on");
public static final Tag SNAPS_GOAT_HORN = register("snaps_goat_horn");
public static final Tag REPLACEABLE_BY_TREES = register("replaceable_by_trees");
public static final Tag SNOW_LAYER_CANNOT_SURVIVE_ON = register("snow_layer_cannot_survive_on");
public static final Tag SNOW_LAYER_CAN_SURVIVE_ON = register("snow_layer_can_survive_on");
public static final Tag INVALID_SPAWN_INSIDE = register("invalid_spawn_inside");
public static final Tag SNIFFER_DIGGABLE_BLOCK = register("sniffer_diggable_block");
public static final Tag SNIFFER_EGG_HATCH_BOOST = register("sniffer_egg_hatch_boost");
public static final Tag TRAIL_RUINS_REPLACEABLE = register("trail_ruins_replaceable");
public static final Tag REPLACEABLE = register("replaceable");
public static final Tag ENCHANTMENT_POWER_PROVIDER = register("enchantment_power_provider");
public static final Tag ENCHANTMENT_POWER_TRANSMITTER = register("enchantment_power_transmitter");
public static final Tag MAINTAINS_FARMLAND = register("maintains_farmland");
public static final Tag BLOCKS_WIND_CHARGE_EXPLOSIONS = register("blocks_wind_charge_explosions");
public static final Tag DOES_NOT_BLOCK_HOPPERS = register("does_not_block_hoppers");
public static final Tag AIR = register("air");
public static final BlockTag WOOL = new BlockTag("wool");
public static final BlockTag PLANKS = new BlockTag("planks");
public static final BlockTag STONE_BRICKS = new BlockTag("stone_bricks");
public static final BlockTag WOODEN_BUTTONS = new BlockTag("wooden_buttons");
public static final BlockTag STONE_BUTTONS = new BlockTag("stone_buttons");
public static final BlockTag BUTTONS = new BlockTag("buttons");
public static final BlockTag WOOL_CARPETS = new BlockTag("wool_carpets");
public static final BlockTag WOODEN_DOORS = new BlockTag("wooden_doors");
public static final BlockTag MOB_INTERACTABLE_DOORS = new BlockTag("mob_interactable_doors");
public static final BlockTag WOODEN_STAIRS = new BlockTag("wooden_stairs");
public static final BlockTag WOODEN_SLABS = new BlockTag("wooden_slabs");
public static final BlockTag WOODEN_FENCES = new BlockTag("wooden_fences");
public static final BlockTag PRESSURE_PLATES = new BlockTag("pressure_plates");
public static final BlockTag WOODEN_PRESSURE_PLATES = new BlockTag("wooden_pressure_plates");
public static final BlockTag STONE_PRESSURE_PLATES = new BlockTag("stone_pressure_plates");
public static final BlockTag WOODEN_TRAPDOORS = new BlockTag("wooden_trapdoors");
public static final BlockTag DOORS = new BlockTag("doors");
public static final BlockTag SAPLINGS = new BlockTag("saplings");
public static final BlockTag LOGS_THAT_BURN = new BlockTag("logs_that_burn");
public static final BlockTag OVERWORLD_NATURAL_LOGS = new BlockTag("overworld_natural_logs");
public static final BlockTag LOGS = new BlockTag("logs");
public static final BlockTag DARK_OAK_LOGS = new BlockTag("dark_oak_logs");
public static final BlockTag OAK_LOGS = new BlockTag("oak_logs");
public static final BlockTag BIRCH_LOGS = new BlockTag("birch_logs");
public static final BlockTag ACACIA_LOGS = new BlockTag("acacia_logs");
public static final BlockTag CHERRY_LOGS = new BlockTag("cherry_logs");
public static final BlockTag JUNGLE_LOGS = new BlockTag("jungle_logs");
public static final BlockTag SPRUCE_LOGS = new BlockTag("spruce_logs");
public static final BlockTag MANGROVE_LOGS = new BlockTag("mangrove_logs");
public static final BlockTag CRIMSON_STEMS = new BlockTag("crimson_stems");
public static final BlockTag WARPED_STEMS = new BlockTag("warped_stems");
public static final BlockTag BAMBOO_BLOCKS = new BlockTag("bamboo_blocks");
public static final BlockTag WART_BLOCKS = new BlockTag("wart_blocks");
public static final BlockTag BANNERS = new BlockTag("banners");
public static final BlockTag SAND = new BlockTag("sand");
public static final BlockTag SMELTS_TO_GLASS = new BlockTag("smelts_to_glass");
public static final BlockTag STAIRS = new BlockTag("stairs");
public static final BlockTag SLABS = new BlockTag("slabs");
public static final BlockTag WALLS = new BlockTag("walls");
public static final BlockTag ANVIL = new BlockTag("anvil");
public static final BlockTag RAILS = new BlockTag("rails");
public static final BlockTag LEAVES = new BlockTag("leaves");
public static final BlockTag TRAPDOORS = new BlockTag("trapdoors");
public static final BlockTag SMALL_FLOWERS = new BlockTag("small_flowers");
public static final BlockTag BEDS = new BlockTag("beds");
public static final BlockTag FENCES = new BlockTag("fences");
public static final BlockTag TALL_FLOWERS = new BlockTag("tall_flowers");
public static final BlockTag FLOWERS = new BlockTag("flowers");
public static final BlockTag PIGLIN_REPELLENTS = new BlockTag("piglin_repellents");
public static final BlockTag GOLD_ORES = new BlockTag("gold_ores");
public static final BlockTag IRON_ORES = new BlockTag("iron_ores");
public static final BlockTag DIAMOND_ORES = new BlockTag("diamond_ores");
public static final BlockTag REDSTONE_ORES = new BlockTag("redstone_ores");
public static final BlockTag LAPIS_ORES = new BlockTag("lapis_ores");
public static final BlockTag COAL_ORES = new BlockTag("coal_ores");
public static final BlockTag EMERALD_ORES = new BlockTag("emerald_ores");
public static final BlockTag COPPER_ORES = new BlockTag("copper_ores");
public static final BlockTag CANDLES = new BlockTag("candles");
public static final BlockTag DIRT = new BlockTag("dirt");
public static final BlockTag TERRACOTTA = new BlockTag("terracotta");
public static final BlockTag BADLANDS_TERRACOTTA = new BlockTag("badlands_terracotta");
public static final BlockTag CONCRETE_POWDER = new BlockTag("concrete_powder");
public static final BlockTag COMPLETES_FIND_TREE_TUTORIAL = new BlockTag("completes_find_tree_tutorial");
public static final BlockTag FLOWER_POTS = new BlockTag("flower_pots");
public static final BlockTag ENDERMAN_HOLDABLE = new BlockTag("enderman_holdable");
public static final BlockTag ICE = new BlockTag("ice");
public static final BlockTag VALID_SPAWN = new BlockTag("valid_spawn");
public static final BlockTag IMPERMEABLE = new BlockTag("impermeable");
public static final BlockTag UNDERWATER_BONEMEALS = new BlockTag("underwater_bonemeals");
public static final BlockTag CORAL_BLOCKS = new BlockTag("coral_blocks");
public static final BlockTag WALL_CORALS = new BlockTag("wall_corals");
public static final BlockTag CORAL_PLANTS = new BlockTag("coral_plants");
public static final BlockTag CORALS = new BlockTag("corals");
public static final BlockTag BAMBOO_PLANTABLE_ON = new BlockTag("bamboo_plantable_on");
public static final BlockTag STANDING_SIGNS = new BlockTag("standing_signs");
public static final BlockTag WALL_SIGNS = new BlockTag("wall_signs");
public static final BlockTag SIGNS = new BlockTag("signs");
public static final BlockTag CEILING_HANGING_SIGNS = new BlockTag("ceiling_hanging_signs");
public static final BlockTag WALL_HANGING_SIGNS = new BlockTag("wall_hanging_signs");
public static final BlockTag ALL_HANGING_SIGNS = new BlockTag("all_hanging_signs");
public static final BlockTag ALL_SIGNS = new BlockTag("all_signs");
public static final BlockTag DRAGON_IMMUNE = new BlockTag("dragon_immune");
public static final BlockTag DRAGON_TRANSPARENT = new BlockTag("dragon_transparent");
public static final BlockTag WITHER_IMMUNE = new BlockTag("wither_immune");
public static final BlockTag WITHER_SUMMON_BASE_BLOCKS = new BlockTag("wither_summon_base_blocks");
public static final BlockTag BEEHIVES = new BlockTag("beehives");
public static final BlockTag CROPS = new BlockTag("crops");
public static final BlockTag BEE_GROWABLES = new BlockTag("bee_growables");
public static final BlockTag PORTALS = new BlockTag("portals");
public static final BlockTag FIRE = new BlockTag("fire");
public static final BlockTag NYLIUM = new BlockTag("nylium");
public static final BlockTag BEACON_BASE_BLOCKS = new BlockTag("beacon_base_blocks");
public static final BlockTag SOUL_SPEED_BLOCKS = new BlockTag("soul_speed_blocks");
public static final BlockTag WALL_POST_OVERRIDE = new BlockTag("wall_post_override");
public static final BlockTag CLIMBABLE = new BlockTag("climbable");
public static final BlockTag FALL_DAMAGE_RESETTING = new BlockTag("fall_damage_resetting");
public static final BlockTag SHULKER_BOXES = new BlockTag("shulker_boxes");
public static final BlockTag HOGLIN_REPELLENTS = new BlockTag("hoglin_repellents");
public static final BlockTag SOUL_FIRE_BASE_BLOCKS = new BlockTag("soul_fire_base_blocks");
public static final BlockTag STRIDER_WARM_BLOCKS = new BlockTag("strider_warm_blocks");
public static final BlockTag CAMPFIRES = new BlockTag("campfires");
public static final BlockTag GUARDED_BY_PIGLINS = new BlockTag("guarded_by_piglins");
public static final BlockTag PREVENT_MOB_SPAWNING_INSIDE = new BlockTag("prevent_mob_spawning_inside");
public static final BlockTag FENCE_GATES = new BlockTag("fence_gates");
public static final BlockTag UNSTABLE_BOTTOM_CENTER = new BlockTag("unstable_bottom_center");
public static final BlockTag MUSHROOM_GROW_BLOCK = new BlockTag("mushroom_grow_block");
public static final BlockTag INFINIBURN_OVERWORLD = new BlockTag("infiniburn_overworld");
public static final BlockTag INFINIBURN_NETHER = new BlockTag("infiniburn_nether");
public static final BlockTag INFINIBURN_END = new BlockTag("infiniburn_end");
public static final BlockTag BASE_STONE_OVERWORLD = new BlockTag("base_stone_overworld");
public static final BlockTag STONE_ORE_REPLACEABLES = new BlockTag("stone_ore_replaceables");
public static final BlockTag DEEPSLATE_ORE_REPLACEABLES = new BlockTag("deepslate_ore_replaceables");
public static final BlockTag BASE_STONE_NETHER = new BlockTag("base_stone_nether");
public static final BlockTag OVERWORLD_CARVER_REPLACEABLES = new BlockTag("overworld_carver_replaceables");
public static final BlockTag NETHER_CARVER_REPLACEABLES = new BlockTag("nether_carver_replaceables");
public static final BlockTag CANDLE_CAKES = new BlockTag("candle_cakes");
public static final BlockTag CAULDRONS = new BlockTag("cauldrons");
public static final BlockTag CRYSTAL_SOUND_BLOCKS = new BlockTag("crystal_sound_blocks");
public static final BlockTag INSIDE_STEP_SOUND_BLOCKS = new BlockTag("inside_step_sound_blocks");
public static final BlockTag COMBINATION_STEP_SOUND_BLOCKS = new BlockTag("combination_step_sound_blocks");
public static final BlockTag CAMEL_SAND_STEP_SOUND_BLOCKS = new BlockTag("camel_sand_step_sound_blocks");
public static final BlockTag OCCLUDES_VIBRATION_SIGNALS = new BlockTag("occludes_vibration_signals");
public static final BlockTag DAMPENS_VIBRATIONS = new BlockTag("dampens_vibrations");
public static final BlockTag DRIPSTONE_REPLACEABLE_BLOCKS = new BlockTag("dripstone_replaceable_blocks");
public static final BlockTag CAVE_VINES = new BlockTag("cave_vines");
public static final BlockTag MOSS_REPLACEABLE = new BlockTag("moss_replaceable");
public static final BlockTag LUSH_GROUND_REPLACEABLE = new BlockTag("lush_ground_replaceable");
public static final BlockTag AZALEA_ROOT_REPLACEABLE = new BlockTag("azalea_root_replaceable");
public static final BlockTag SMALL_DRIPLEAF_PLACEABLE = new BlockTag("small_dripleaf_placeable");
public static final BlockTag BIG_DRIPLEAF_PLACEABLE = new BlockTag("big_dripleaf_placeable");
public static final BlockTag SNOW = new BlockTag("snow");
public static final BlockTag MINEABLE_AXE = new BlockTag("mineable/axe");
public static final BlockTag MINEABLE_HOE = new BlockTag("mineable/hoe");
public static final BlockTag MINEABLE_PICKAXE = new BlockTag("mineable/pickaxe");
public static final BlockTag MINEABLE_SHOVEL = new BlockTag("mineable/shovel");
public static final BlockTag SWORD_EFFICIENT = new BlockTag("sword_efficient");
public static final BlockTag NEEDS_DIAMOND_TOOL = new BlockTag("needs_diamond_tool");
public static final BlockTag NEEDS_IRON_TOOL = new BlockTag("needs_iron_tool");
public static final BlockTag NEEDS_STONE_TOOL = new BlockTag("needs_stone_tool");
public static final BlockTag INCORRECT_FOR_NETHERITE_TOOL = new BlockTag("incorrect_for_netherite_tool");
public static final BlockTag INCORRECT_FOR_DIAMOND_TOOL = new BlockTag("incorrect_for_diamond_tool");
public static final BlockTag INCORRECT_FOR_IRON_TOOL = new BlockTag("incorrect_for_iron_tool");
public static final BlockTag INCORRECT_FOR_STONE_TOOL = new BlockTag("incorrect_for_stone_tool");
public static final BlockTag INCORRECT_FOR_GOLD_TOOL = new BlockTag("incorrect_for_gold_tool");
public static final BlockTag INCORRECT_FOR_WOODEN_TOOL = new BlockTag("incorrect_for_wooden_tool");
public static final BlockTag FEATURES_CANNOT_REPLACE = new BlockTag("features_cannot_replace");
public static final BlockTag LAVA_POOL_STONE_CANNOT_REPLACE = new BlockTag("lava_pool_stone_cannot_replace");
public static final BlockTag GEODE_INVALID_BLOCKS = new BlockTag("geode_invalid_blocks");
public static final BlockTag FROG_PREFER_JUMP_TO = new BlockTag("frog_prefer_jump_to");
public static final BlockTag SCULK_REPLACEABLE = new BlockTag("sculk_replaceable");
public static final BlockTag SCULK_REPLACEABLE_WORLD_GEN = new BlockTag("sculk_replaceable_world_gen");
public static final BlockTag ANCIENT_CITY_REPLACEABLE = new BlockTag("ancient_city_replaceable");
public static final BlockTag VIBRATION_RESONATORS = new BlockTag("vibration_resonators");
public static final BlockTag ANIMALS_SPAWNABLE_ON = new BlockTag("animals_spawnable_on");
public static final BlockTag ARMADILLO_SPAWNABLE_ON = new BlockTag("armadillo_spawnable_on");
public static final BlockTag AXOLOTLS_SPAWNABLE_ON = new BlockTag("axolotls_spawnable_on");
public static final BlockTag GOATS_SPAWNABLE_ON = new BlockTag("goats_spawnable_on");
public static final BlockTag MOOSHROOMS_SPAWNABLE_ON = new BlockTag("mooshrooms_spawnable_on");
public static final BlockTag PARROTS_SPAWNABLE_ON = new BlockTag("parrots_spawnable_on");
public static final BlockTag POLAR_BEARS_SPAWNABLE_ON_ALTERNATE = new BlockTag("polar_bears_spawnable_on_alternate");
public static final BlockTag RABBITS_SPAWNABLE_ON = new BlockTag("rabbits_spawnable_on");
public static final BlockTag FOXES_SPAWNABLE_ON = new BlockTag("foxes_spawnable_on");
public static final BlockTag WOLVES_SPAWNABLE_ON = new BlockTag("wolves_spawnable_on");
public static final BlockTag FROGS_SPAWNABLE_ON = new BlockTag("frogs_spawnable_on");
public static final BlockTag AZALEA_GROWS_ON = new BlockTag("azalea_grows_on");
public static final BlockTag CONVERTABLE_TO_MUD = new BlockTag("convertable_to_mud");
public static final BlockTag MANGROVE_LOGS_CAN_GROW_THROUGH = new BlockTag("mangrove_logs_can_grow_through");
public static final BlockTag MANGROVE_ROOTS_CAN_GROW_THROUGH = new BlockTag("mangrove_roots_can_grow_through");
public static final BlockTag DEAD_BUSH_MAY_PLACE_ON = new BlockTag("dead_bush_may_place_on");
public static final BlockTag SNAPS_GOAT_HORN = new BlockTag("snaps_goat_horn");
public static final BlockTag REPLACEABLE_BY_TREES = new BlockTag("replaceable_by_trees");
public static final BlockTag SNOW_LAYER_CANNOT_SURVIVE_ON = new BlockTag("snow_layer_cannot_survive_on");
public static final BlockTag SNOW_LAYER_CAN_SURVIVE_ON = new BlockTag("snow_layer_can_survive_on");
public static final BlockTag INVALID_SPAWN_INSIDE = new BlockTag("invalid_spawn_inside");
public static final BlockTag SNIFFER_DIGGABLE_BLOCK = new BlockTag("sniffer_diggable_block");
public static final BlockTag SNIFFER_EGG_HATCH_BOOST = new BlockTag("sniffer_egg_hatch_boost");
public static final BlockTag TRAIL_RUINS_REPLACEABLE = new BlockTag("trail_ruins_replaceable");
public static final BlockTag REPLACEABLE = new BlockTag("replaceable");
public static final BlockTag ENCHANTMENT_POWER_PROVIDER = new BlockTag("enchantment_power_provider");
public static final BlockTag ENCHANTMENT_POWER_TRANSMITTER = new BlockTag("enchantment_power_transmitter");
public static final BlockTag MAINTAINS_FARMLAND = new BlockTag("maintains_farmland");
public static final BlockTag BLOCKS_WIND_CHARGE_EXPLOSIONS = new BlockTag("blocks_wind_charge_explosions");
public static final BlockTag DOES_NOT_BLOCK_HOPPERS = new BlockTag("does_not_block_hoppers");
public static final BlockTag AIR = new BlockTag("air");
private BlockTag() {}
private final int id;
private BlockTag(String identifier) {
this.id = ALL_BLOCK_TAGS.size();
register(identifier, this);
private static Tag register(String name) {
return TagRegistry.BLOCK.registerVanillaTag(MinecraftKey.key(name));
}
@Override
public int ordinal() {
return id;
}
private static void register(String name, BlockTag tag) {
ALL_BLOCK_TAGS.put(Key.key(name), tag);
public static void init() {
// no-op
}
}

View file

@ -25,67 +25,57 @@
package org.geysermc.geyser.session.cache.tags;
import net.kyori.adventure.key.Key;
import org.geysermc.geyser.util.MinecraftKey;
import org.geysermc.geyser.util.Ordered;
import java.util.HashMap;
import java.util.Map;
/**
* Lists vanilla enchantment tags.
*/
@SuppressWarnings("unused")
public final class EnchantmentTag implements Ordered {
public static final Map<Key, EnchantmentTag> ALL_ENCHANTMENT_TAGS = new HashMap<>();
public final class EnchantmentTag {
public static final Tag TOOLTIP_ORDER = register("tooltip_order");
public static final Tag EXCLUSIVE_SET_ARMOR = register("exclusive_set/armor");
public static final Tag EXCLUSIVE_SET_BOOTS = register("exclusive_set/boots");
public static final Tag EXCLUSIVE_SET_BOW = register("exclusive_set/bow");
public static final Tag EXCLUSIVE_SET_CROSSBOW = register("exclusive_set/crossbow");
public static final Tag EXCLUSIVE_SET_DAMAGE = register("exclusive_set/damage");
public static final Tag EXCLUSIVE_SET_MINING = register("exclusive_set/mining");
public static final Tag EXCLUSIVE_SET_RIPTIDE = register("exclusive_set/riptide");
public static final Tag TRADEABLE = register("tradeable");
public static final Tag DOUBLE_TRADE_PRICE = register("double_trade_price");
public static final Tag IN_ENCHANTING_TABLE = register("in_enchanting_table");
public static final Tag ON_MOB_SPAWN_EQUIPMENT = register("on_mob_spawn_equipment");
public static final Tag ON_TRADED_EQUIPMENT = register("on_traded_equipment");
public static final Tag ON_RANDOM_LOOT = register("on_random_loot");
public static final Tag CURSE = register("curse");
public static final Tag SMELTS_LOOT = register("smelts_loot");
public static final Tag PREVENTS_BEE_SPAWNS_WHEN_MINING = register("prevents_bee_spawns_when_mining");
public static final Tag PREVENTS_DECORATED_POT_SHATTERING = register("prevents_decorated_pot_shattering");
public static final Tag PREVENTS_ICE_MELTING = register("prevents_ice_melting");
public static final Tag PREVENTS_INFESTED_SPAWNS = register("prevents_infested_spawns");
public static final Tag TREASURE = register("treasure");
public static final Tag NON_TREASURE = register("non_treasure");
public static final Tag TRADES_DESERT_COMMON = register("trades/desert_common");
public static final Tag TRADES_JUNGLE_COMMON = register("trades/jungle_common");
public static final Tag TRADES_PLAINS_COMMON = register("trades/plains_common");
public static final Tag TRADES_SAVANNA_COMMON = register("trades/savanna_common");
public static final Tag TRADES_SNOW_COMMON = register("trades/snow_common");
public static final Tag TRADES_SWAMP_COMMON = register("trades/swamp_common");
public static final Tag TRADES_TAIGA_COMMON = register("trades/taiga_common");
public static final Tag TRADES_DESERT_SPECIAL = register("trades/desert_special");
public static final Tag TRADES_JUNGLE_SPECIAL = register("trades/jungle_special");
public static final Tag TRADES_PLAINS_SPECIAL = register("trades/plains_special");
public static final Tag TRADES_SAVANNA_SPECIAL = register("trades/savanna_special");
public static final Tag TRADES_SNOW_SPECIAL = register("trades/snow_special");
public static final Tag TRADES_SWAMP_SPECIAL = register("trades/swamp_special");
public static final Tag TRADES_TAIGA_SPECIAL = register("trades/taiga_special");
public static final EnchantmentTag TOOLTIP_ORDER = new EnchantmentTag("tooltip_order");
public static final EnchantmentTag EXCLUSIVE_SET_ARMOR = new EnchantmentTag("exclusive_set/armor");
public static final EnchantmentTag EXCLUSIVE_SET_BOOTS = new EnchantmentTag("exclusive_set/boots");
public static final EnchantmentTag EXCLUSIVE_SET_BOW = new EnchantmentTag("exclusive_set/bow");
public static final EnchantmentTag EXCLUSIVE_SET_CROSSBOW = new EnchantmentTag("exclusive_set/crossbow");
public static final EnchantmentTag EXCLUSIVE_SET_DAMAGE = new EnchantmentTag("exclusive_set/damage");
public static final EnchantmentTag EXCLUSIVE_SET_MINING = new EnchantmentTag("exclusive_set/mining");
public static final EnchantmentTag EXCLUSIVE_SET_RIPTIDE = new EnchantmentTag("exclusive_set/riptide");
public static final EnchantmentTag TRADEABLE = new EnchantmentTag("tradeable");
public static final EnchantmentTag DOUBLE_TRADE_PRICE = new EnchantmentTag("double_trade_price");
public static final EnchantmentTag IN_ENCHANTING_TABLE = new EnchantmentTag("in_enchanting_table");
public static final EnchantmentTag ON_MOB_SPAWN_EQUIPMENT = new EnchantmentTag("on_mob_spawn_equipment");
public static final EnchantmentTag ON_TRADED_EQUIPMENT = new EnchantmentTag("on_traded_equipment");
public static final EnchantmentTag ON_RANDOM_LOOT = new EnchantmentTag("on_random_loot");
public static final EnchantmentTag CURSE = new EnchantmentTag("curse");
public static final EnchantmentTag SMELTS_LOOT = new EnchantmentTag("smelts_loot");
public static final EnchantmentTag PREVENTS_BEE_SPAWNS_WHEN_MINING = new EnchantmentTag("prevents_bee_spawns_when_mining");
public static final EnchantmentTag PREVENTS_DECORATED_POT_SHATTERING = new EnchantmentTag("prevents_decorated_pot_shattering");
public static final EnchantmentTag PREVENTS_ICE_MELTING = new EnchantmentTag("prevents_ice_melting");
public static final EnchantmentTag PREVENTS_INFESTED_SPAWNS = new EnchantmentTag("prevents_infested_spawns");
public static final EnchantmentTag TREASURE = new EnchantmentTag("treasure");
public static final EnchantmentTag NON_TREASURE = new EnchantmentTag("non_treasure");
public static final EnchantmentTag TRADES_DESERT_COMMON = new EnchantmentTag("trades/desert_common");
public static final EnchantmentTag TRADES_JUNGLE_COMMON = new EnchantmentTag("trades/jungle_common");
public static final EnchantmentTag TRADES_PLAINS_COMMON = new EnchantmentTag("trades/plains_common");
public static final EnchantmentTag TRADES_SAVANNA_COMMON = new EnchantmentTag("trades/savanna_common");
public static final EnchantmentTag TRADES_SNOW_COMMON = new EnchantmentTag("trades/snow_common");
public static final EnchantmentTag TRADES_SWAMP_COMMON = new EnchantmentTag("trades/swamp_common");
public static final EnchantmentTag TRADES_TAIGA_COMMON = new EnchantmentTag("trades/taiga_common");
public static final EnchantmentTag TRADES_DESERT_SPECIAL = new EnchantmentTag("trades/desert_special");
public static final EnchantmentTag TRADES_JUNGLE_SPECIAL = new EnchantmentTag("trades/jungle_special");
public static final EnchantmentTag TRADES_PLAINS_SPECIAL = new EnchantmentTag("trades/plains_special");
public static final EnchantmentTag TRADES_SAVANNA_SPECIAL = new EnchantmentTag("trades/savanna_special");
public static final EnchantmentTag TRADES_SNOW_SPECIAL = new EnchantmentTag("trades/snow_special");
public static final EnchantmentTag TRADES_SWAMP_SPECIAL = new EnchantmentTag("trades/swamp_special");
public static final EnchantmentTag TRADES_TAIGA_SPECIAL = new EnchantmentTag("trades/taiga_special");
private EnchantmentTag() {}
private final int id;
private EnchantmentTag(String identifier) {
this.id = ALL_ENCHANTMENT_TAGS.size();
register(identifier, this);
private static Tag register(String name) {
return TagRegistry.ENCHANTMENT.registerVanillaTag(MinecraftKey.key(name));
}
@Override
public int ordinal() {
return id;
}
private static void register(String name, EnchantmentTag tag) {
ALL_ENCHANTMENT_TAGS.put(MinecraftKey.key(name), tag);
public static void init() {
// no-op
}
}

View file

@ -0,0 +1,99 @@
/*
* Copyright (c) 2024 GeyserMC. http://geysermc.org
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*
* @author GeyserMC
* @link https://github.com/GeyserMC/Geyser
*/
package org.geysermc.geyser.session.cache.tags;
import java.util.List;
import java.util.function.Function;
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.cache.TagCache;
/**
* Similar to vanilla Minecraft's HolderSets, stores either a tag or a list of IDs (this list can also be represented as a single ID in vanilla HolderSets).
*
* Because HolderSets utilise tags, when loading a HolderSet, Geyser must store tags for the registry the HolderSet is for (it must be listed in {@link TagRegistry}).
*
* Use the {@link HolderSet#readHolderSet} method to easily read a HolderSet from NBT sent by a server. To turn the HolderSet into a list of network IDs, use the {@link HolderSet#resolve} method.
*/
@Data
public final class HolderSet {
private final @Nullable Tag tag;
private final int @Nullable [] holders;
public HolderSet(int @NonNull [] holders) {
this.tag = null;
this.holders = holders;
}
public HolderSet(@NonNull Tag tagId) {
this.tag = tagId;
this.holders = null;
}
/**
* Resolves the HolderSet. 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.
*
* @return the HolderSet turned into a list of network IDs.
*/
public int[] resolve(TagCache tagCache) {
if (holders != null) {
return holders;
}
assert tag != null;
return tagCache.get(tag);
}
/**
* Reads a HolderSet from an object from NBT.
*
* @param registry the registry the HolderSet contains IDs from.
* @param holderSet the HolderSet as an object from NBT.
* @param keyIdMapping a function that maps resource location IDs in the HolderSet's registry to their network IDs.
*/
public static HolderSet readHolderSet(TagRegistry registry, @Nullable Object holderSet, Function<Key, Integer> keyIdMapping) {
if (holderSet == null) {
return new HolderSet(new int[]{});
}
if (holderSet instanceof String stringTag) {
if (stringTag.startsWith("#")) {
// Tag
return new HolderSet(Tag.createTag(registry, Key.key(stringTag.substring(1)))); // Remove '#' at beginning that indicates tag
} else if (stringTag.isEmpty()) {
return new HolderSet(new int[]{});
}
return new HolderSet(new int[]{keyIdMapping.apply(Key.key(stringTag))});
} else if (holderSet instanceof List<?> list) {
// Assume the list is a list of strings
return new HolderSet(list.stream().map(o -> (String) o).map(Key::key).map(keyIdMapping).mapToInt(Integer::intValue).toArray());
}
throw new IllegalArgumentException("Holder set must either be a tag, a string ID or a list of string IDs");
}
}

View file

@ -25,178 +25,168 @@
package org.geysermc.geyser.session.cache.tags;
import net.kyori.adventure.key.Key;
import org.geysermc.geyser.util.MinecraftKey;
import org.geysermc.geyser.util.Ordered;
import java.util.HashMap;
import java.util.Map;
/**
* Lists vanilla item tags.
*/
@SuppressWarnings("unused")
public final class ItemTag implements Ordered {
public static final Map<Key, ItemTag> ALL_ITEM_TAGS = new HashMap<>();
public final class ItemTag {
public static final Tag WOOL = register("wool");
public static final Tag PLANKS = register("planks");
public static final Tag STONE_BRICKS = register("stone_bricks");
public static final Tag WOODEN_BUTTONS = register("wooden_buttons");
public static final Tag STONE_BUTTONS = register("stone_buttons");
public static final Tag BUTTONS = register("buttons");
public static final Tag WOOL_CARPETS = register("wool_carpets");
public static final Tag WOODEN_DOORS = register("wooden_doors");
public static final Tag WOODEN_STAIRS = register("wooden_stairs");
public static final Tag WOODEN_SLABS = register("wooden_slabs");
public static final Tag WOODEN_FENCES = register("wooden_fences");
public static final Tag FENCE_GATES = register("fence_gates");
public static final Tag WOODEN_PRESSURE_PLATES = register("wooden_pressure_plates");
public static final Tag WOODEN_TRAPDOORS = register("wooden_trapdoors");
public static final Tag DOORS = register("doors");
public static final Tag SAPLINGS = register("saplings");
public static final Tag LOGS_THAT_BURN = register("logs_that_burn");
public static final Tag LOGS = register("logs");
public static final Tag DARK_OAK_LOGS = register("dark_oak_logs");
public static final Tag OAK_LOGS = register("oak_logs");
public static final Tag BIRCH_LOGS = register("birch_logs");
public static final Tag ACACIA_LOGS = register("acacia_logs");
public static final Tag CHERRY_LOGS = register("cherry_logs");
public static final Tag JUNGLE_LOGS = register("jungle_logs");
public static final Tag SPRUCE_LOGS = register("spruce_logs");
public static final Tag MANGROVE_LOGS = register("mangrove_logs");
public static final Tag CRIMSON_STEMS = register("crimson_stems");
public static final Tag WARPED_STEMS = register("warped_stems");
public static final Tag BAMBOO_BLOCKS = register("bamboo_blocks");
public static final Tag WART_BLOCKS = register("wart_blocks");
public static final Tag BANNERS = register("banners");
public static final Tag SAND = register("sand");
public static final Tag SMELTS_TO_GLASS = register("smelts_to_glass");
public static final Tag STAIRS = register("stairs");
public static final Tag SLABS = register("slabs");
public static final Tag WALLS = register("walls");
public static final Tag ANVIL = register("anvil");
public static final Tag RAILS = register("rails");
public static final Tag LEAVES = register("leaves");
public static final Tag TRAPDOORS = register("trapdoors");
public static final Tag SMALL_FLOWERS = register("small_flowers");
public static final Tag BEDS = register("beds");
public static final Tag FENCES = register("fences");
public static final Tag TALL_FLOWERS = register("tall_flowers");
public static final Tag FLOWERS = register("flowers");
public static final Tag PIGLIN_REPELLENTS = register("piglin_repellents");
public static final Tag PIGLIN_LOVED = register("piglin_loved");
public static final Tag IGNORED_BY_PIGLIN_BABIES = register("ignored_by_piglin_babies");
public static final Tag MEAT = register("meat");
public static final Tag SNIFFER_FOOD = register("sniffer_food");
public static final Tag PIGLIN_FOOD = register("piglin_food");
public static final Tag FOX_FOOD = register("fox_food");
public static final Tag COW_FOOD = register("cow_food");
public static final Tag GOAT_FOOD = register("goat_food");
public static final Tag SHEEP_FOOD = register("sheep_food");
public static final Tag WOLF_FOOD = register("wolf_food");
public static final Tag CAT_FOOD = register("cat_food");
public static final Tag HORSE_FOOD = register("horse_food");
public static final Tag HORSE_TEMPT_ITEMS = register("horse_tempt_items");
public static final Tag CAMEL_FOOD = register("camel_food");
public static final Tag ARMADILLO_FOOD = register("armadillo_food");
public static final Tag BEE_FOOD = register("bee_food");
public static final Tag CHICKEN_FOOD = register("chicken_food");
public static final Tag FROG_FOOD = register("frog_food");
public static final Tag HOGLIN_FOOD = register("hoglin_food");
public static final Tag LLAMA_FOOD = register("llama_food");
public static final Tag LLAMA_TEMPT_ITEMS = register("llama_tempt_items");
public static final Tag OCELOT_FOOD = register("ocelot_food");
public static final Tag PANDA_FOOD = register("panda_food");
public static final Tag PIG_FOOD = register("pig_food");
public static final Tag RABBIT_FOOD = register("rabbit_food");
public static final Tag STRIDER_FOOD = register("strider_food");
public static final Tag STRIDER_TEMPT_ITEMS = register("strider_tempt_items");
public static final Tag TURTLE_FOOD = register("turtle_food");
public static final Tag PARROT_FOOD = register("parrot_food");
public static final Tag PARROT_POISONOUS_FOOD = register("parrot_poisonous_food");
public static final Tag AXOLOTL_FOOD = register("axolotl_food");
public static final Tag GOLD_ORES = register("gold_ores");
public static final Tag IRON_ORES = register("iron_ores");
public static final Tag DIAMOND_ORES = register("diamond_ores");
public static final Tag REDSTONE_ORES = register("redstone_ores");
public static final Tag LAPIS_ORES = register("lapis_ores");
public static final Tag COAL_ORES = register("coal_ores");
public static final Tag EMERALD_ORES = register("emerald_ores");
public static final Tag COPPER_ORES = register("copper_ores");
public static final Tag NON_FLAMMABLE_WOOD = register("non_flammable_wood");
public static final Tag SOUL_FIRE_BASE_BLOCKS = register("soul_fire_base_blocks");
public static final Tag CANDLES = register("candles");
public static final Tag DIRT = register("dirt");
public static final Tag TERRACOTTA = register("terracotta");
public static final Tag COMPLETES_FIND_TREE_TUTORIAL = register("completes_find_tree_tutorial");
public static final Tag BOATS = register("boats");
public static final Tag CHEST_BOATS = register("chest_boats");
public static final Tag FISHES = register("fishes");
public static final Tag SIGNS = register("signs");
public static final Tag CREEPER_DROP_MUSIC_DISCS = register("creeper_drop_music_discs");
public static final Tag COALS = register("coals");
public static final Tag ARROWS = register("arrows");
public static final Tag LECTERN_BOOKS = register("lectern_books");
public static final Tag BOOKSHELF_BOOKS = register("bookshelf_books");
public static final Tag BEACON_PAYMENT_ITEMS = register("beacon_payment_items");
public static final Tag STONE_TOOL_MATERIALS = register("stone_tool_materials");
public static final Tag STONE_CRAFTING_MATERIALS = register("stone_crafting_materials");
public static final Tag FREEZE_IMMUNE_WEARABLES = register("freeze_immune_wearables");
public static final Tag DAMPENS_VIBRATIONS = register("dampens_vibrations");
public static final Tag CLUSTER_MAX_HARVESTABLES = register("cluster_max_harvestables");
public static final Tag COMPASSES = register("compasses");
public static final Tag HANGING_SIGNS = register("hanging_signs");
public static final Tag CREEPER_IGNITERS = register("creeper_igniters");
public static final Tag NOTEBLOCK_TOP_INSTRUMENTS = register("noteblock_top_instruments");
public static final Tag FOOT_ARMOR = register("foot_armor");
public static final Tag LEG_ARMOR = register("leg_armor");
public static final Tag CHEST_ARMOR = register("chest_armor");
public static final Tag HEAD_ARMOR = register("head_armor");
public static final Tag SKULLS = register("skulls");
public static final Tag TRIMMABLE_ARMOR = register("trimmable_armor");
public static final Tag TRIM_MATERIALS = register("trim_materials");
public static final Tag TRIM_TEMPLATES = register("trim_templates");
public static final Tag DECORATED_POT_SHERDS = register("decorated_pot_sherds");
public static final Tag DECORATED_POT_INGREDIENTS = register("decorated_pot_ingredients");
public static final Tag SWORDS = register("swords");
public static final Tag AXES = register("axes");
public static final Tag HOES = register("hoes");
public static final Tag PICKAXES = register("pickaxes");
public static final Tag SHOVELS = register("shovels");
public static final Tag BREAKS_DECORATED_POTS = register("breaks_decorated_pots");
public static final Tag VILLAGER_PLANTABLE_SEEDS = register("villager_plantable_seeds");
public static final Tag DYEABLE = register("dyeable");
public static final Tag ENCHANTABLE_FOOT_ARMOR = register("enchantable/foot_armor");
public static final Tag ENCHANTABLE_LEG_ARMOR = register("enchantable/leg_armor");
public static final Tag ENCHANTABLE_CHEST_ARMOR = register("enchantable/chest_armor");
public static final Tag ENCHANTABLE_HEAD_ARMOR = register("enchantable/head_armor");
public static final Tag ENCHANTABLE_ARMOR = register("enchantable/armor");
public static final Tag ENCHANTABLE_SWORD = register("enchantable/sword");
public static final Tag ENCHANTABLE_FIRE_ASPECT = register("enchantable/fire_aspect");
public static final Tag ENCHANTABLE_SHARP_WEAPON = register("enchantable/sharp_weapon");
public static final Tag ENCHANTABLE_WEAPON = register("enchantable/weapon");
public static final Tag ENCHANTABLE_MINING = register("enchantable/mining");
public static final Tag ENCHANTABLE_MINING_LOOT = register("enchantable/mining_loot");
public static final Tag ENCHANTABLE_FISHING = register("enchantable/fishing");
public static final Tag ENCHANTABLE_TRIDENT = register("enchantable/trident");
public static final Tag ENCHANTABLE_DURABILITY = register("enchantable/durability");
public static final Tag ENCHANTABLE_BOW = register("enchantable/bow");
public static final Tag ENCHANTABLE_EQUIPPABLE = register("enchantable/equippable");
public static final Tag ENCHANTABLE_CROSSBOW = register("enchantable/crossbow");
public static final Tag ENCHANTABLE_VANISHING = register("enchantable/vanishing");
public static final Tag ENCHANTABLE_MACE = register("enchantable/mace");
public static final ItemTag WOOL = new ItemTag("wool");
public static final ItemTag PLANKS = new ItemTag("planks");
public static final ItemTag STONE_BRICKS = new ItemTag("stone_bricks");
public static final ItemTag WOODEN_BUTTONS = new ItemTag("wooden_buttons");
public static final ItemTag STONE_BUTTONS = new ItemTag("stone_buttons");
public static final ItemTag BUTTONS = new ItemTag("buttons");
public static final ItemTag WOOL_CARPETS = new ItemTag("wool_carpets");
public static final ItemTag WOODEN_DOORS = new ItemTag("wooden_doors");
public static final ItemTag WOODEN_STAIRS = new ItemTag("wooden_stairs");
public static final ItemTag WOODEN_SLABS = new ItemTag("wooden_slabs");
public static final ItemTag WOODEN_FENCES = new ItemTag("wooden_fences");
public static final ItemTag FENCE_GATES = new ItemTag("fence_gates");
public static final ItemTag WOODEN_PRESSURE_PLATES = new ItemTag("wooden_pressure_plates");
public static final ItemTag WOODEN_TRAPDOORS = new ItemTag("wooden_trapdoors");
public static final ItemTag DOORS = new ItemTag("doors");
public static final ItemTag SAPLINGS = new ItemTag("saplings");
public static final ItemTag LOGS_THAT_BURN = new ItemTag("logs_that_burn");
public static final ItemTag LOGS = new ItemTag("logs");
public static final ItemTag DARK_OAK_LOGS = new ItemTag("dark_oak_logs");
public static final ItemTag OAK_LOGS = new ItemTag("oak_logs");
public static final ItemTag BIRCH_LOGS = new ItemTag("birch_logs");
public static final ItemTag ACACIA_LOGS = new ItemTag("acacia_logs");
public static final ItemTag CHERRY_LOGS = new ItemTag("cherry_logs");
public static final ItemTag JUNGLE_LOGS = new ItemTag("jungle_logs");
public static final ItemTag SPRUCE_LOGS = new ItemTag("spruce_logs");
public static final ItemTag MANGROVE_LOGS = new ItemTag("mangrove_logs");
public static final ItemTag CRIMSON_STEMS = new ItemTag("crimson_stems");
public static final ItemTag WARPED_STEMS = new ItemTag("warped_stems");
public static final ItemTag BAMBOO_BLOCKS = new ItemTag("bamboo_blocks");
public static final ItemTag WART_BLOCKS = new ItemTag("wart_blocks");
public static final ItemTag BANNERS = new ItemTag("banners");
public static final ItemTag SAND = new ItemTag("sand");
public static final ItemTag SMELTS_TO_GLASS = new ItemTag("smelts_to_glass");
public static final ItemTag STAIRS = new ItemTag("stairs");
public static final ItemTag SLABS = new ItemTag("slabs");
public static final ItemTag WALLS = new ItemTag("walls");
public static final ItemTag ANVIL = new ItemTag("anvil");
public static final ItemTag RAILS = new ItemTag("rails");
public static final ItemTag LEAVES = new ItemTag("leaves");
public static final ItemTag TRAPDOORS = new ItemTag("trapdoors");
public static final ItemTag SMALL_FLOWERS = new ItemTag("small_flowers");
public static final ItemTag BEDS = new ItemTag("beds");
public static final ItemTag FENCES = new ItemTag("fences");
public static final ItemTag TALL_FLOWERS = new ItemTag("tall_flowers");
public static final ItemTag FLOWERS = new ItemTag("flowers");
public static final ItemTag PIGLIN_REPELLENTS = new ItemTag("piglin_repellents");
public static final ItemTag PIGLIN_LOVED = new ItemTag("piglin_loved");
public static final ItemTag IGNORED_BY_PIGLIN_BABIES = new ItemTag("ignored_by_piglin_babies");
public static final ItemTag MEAT = new ItemTag("meat");
public static final ItemTag SNIFFER_FOOD = new ItemTag("sniffer_food");
public static final ItemTag PIGLIN_FOOD = new ItemTag("piglin_food");
public static final ItemTag FOX_FOOD = new ItemTag("fox_food");
public static final ItemTag COW_FOOD = new ItemTag("cow_food");
public static final ItemTag GOAT_FOOD = new ItemTag("goat_food");
public static final ItemTag SHEEP_FOOD = new ItemTag("sheep_food");
public static final ItemTag WOLF_FOOD = new ItemTag("wolf_food");
public static final ItemTag CAT_FOOD = new ItemTag("cat_food");
public static final ItemTag HORSE_FOOD = new ItemTag("horse_food");
public static final ItemTag HORSE_TEMPT_ITEMS = new ItemTag("horse_tempt_items");
public static final ItemTag CAMEL_FOOD = new ItemTag("camel_food");
public static final ItemTag ARMADILLO_FOOD = new ItemTag("armadillo_food");
public static final ItemTag BEE_FOOD = new ItemTag("bee_food");
public static final ItemTag CHICKEN_FOOD = new ItemTag("chicken_food");
public static final ItemTag FROG_FOOD = new ItemTag("frog_food");
public static final ItemTag HOGLIN_FOOD = new ItemTag("hoglin_food");
public static final ItemTag LLAMA_FOOD = new ItemTag("llama_food");
public static final ItemTag LLAMA_TEMPT_ITEMS = new ItemTag("llama_tempt_items");
public static final ItemTag OCELOT_FOOD = new ItemTag("ocelot_food");
public static final ItemTag PANDA_FOOD = new ItemTag("panda_food");
public static final ItemTag PIG_FOOD = new ItemTag("pig_food");
public static final ItemTag RABBIT_FOOD = new ItemTag("rabbit_food");
public static final ItemTag STRIDER_FOOD = new ItemTag("strider_food");
public static final ItemTag STRIDER_TEMPT_ITEMS = new ItemTag("strider_tempt_items");
public static final ItemTag TURTLE_FOOD = new ItemTag("turtle_food");
public static final ItemTag PARROT_FOOD = new ItemTag("parrot_food");
public static final ItemTag PARROT_POISONOUS_FOOD = new ItemTag("parrot_poisonous_food");
public static final ItemTag AXOLOTL_FOOD = new ItemTag("axolotl_food");
public static final ItemTag GOLD_ORES = new ItemTag("gold_ores");
public static final ItemTag IRON_ORES = new ItemTag("iron_ores");
public static final ItemTag DIAMOND_ORES = new ItemTag("diamond_ores");
public static final ItemTag REDSTONE_ORES = new ItemTag("redstone_ores");
public static final ItemTag LAPIS_ORES = new ItemTag("lapis_ores");
public static final ItemTag COAL_ORES = new ItemTag("coal_ores");
public static final ItemTag EMERALD_ORES = new ItemTag("emerald_ores");
public static final ItemTag COPPER_ORES = new ItemTag("copper_ores");
public static final ItemTag NON_FLAMMABLE_WOOD = new ItemTag("non_flammable_wood");
public static final ItemTag SOUL_FIRE_BASE_BLOCKS = new ItemTag("soul_fire_base_blocks");
public static final ItemTag CANDLES = new ItemTag("candles");
public static final ItemTag DIRT = new ItemTag("dirt");
public static final ItemTag TERRACOTTA = new ItemTag("terracotta");
public static final ItemTag COMPLETES_FIND_TREE_TUTORIAL = new ItemTag("completes_find_tree_tutorial");
public static final ItemTag BOATS = new ItemTag("boats");
public static final ItemTag CHEST_BOATS = new ItemTag("chest_boats");
public static final ItemTag FISHES = new ItemTag("fishes");
public static final ItemTag SIGNS = new ItemTag("signs");
public static final ItemTag CREEPER_DROP_MUSIC_DISCS = new ItemTag("creeper_drop_music_discs");
public static final ItemTag COALS = new ItemTag("coals");
public static final ItemTag ARROWS = new ItemTag("arrows");
public static final ItemTag LECTERN_BOOKS = new ItemTag("lectern_books");
public static final ItemTag BOOKSHELF_BOOKS = new ItemTag("bookshelf_books");
public static final ItemTag BEACON_PAYMENT_ITEMS = new ItemTag("beacon_payment_items");
public static final ItemTag STONE_TOOL_MATERIALS = new ItemTag("stone_tool_materials");
public static final ItemTag STONE_CRAFTING_MATERIALS = new ItemTag("stone_crafting_materials");
public static final ItemTag FREEZE_IMMUNE_WEARABLES = new ItemTag("freeze_immune_wearables");
public static final ItemTag DAMPENS_VIBRATIONS = new ItemTag("dampens_vibrations");
public static final ItemTag CLUSTER_MAX_HARVESTABLES = new ItemTag("cluster_max_harvestables");
public static final ItemTag COMPASSES = new ItemTag("compasses");
public static final ItemTag HANGING_SIGNS = new ItemTag("hanging_signs");
public static final ItemTag CREEPER_IGNITERS = new ItemTag("creeper_igniters");
public static final ItemTag NOTEBLOCK_TOP_INSTRUMENTS = new ItemTag("noteblock_top_instruments");
public static final ItemTag FOOT_ARMOR = new ItemTag("foot_armor");
public static final ItemTag LEG_ARMOR = new ItemTag("leg_armor");
public static final ItemTag CHEST_ARMOR = new ItemTag("chest_armor");
public static final ItemTag HEAD_ARMOR = new ItemTag("head_armor");
public static final ItemTag SKULLS = new ItemTag("skulls");
public static final ItemTag TRIMMABLE_ARMOR = new ItemTag("trimmable_armor");
public static final ItemTag TRIM_MATERIALS = new ItemTag("trim_materials");
public static final ItemTag TRIM_TEMPLATES = new ItemTag("trim_templates");
public static final ItemTag DECORATED_POT_SHERDS = new ItemTag("decorated_pot_sherds");
public static final ItemTag DECORATED_POT_INGREDIENTS = new ItemTag("decorated_pot_ingredients");
public static final ItemTag SWORDS = new ItemTag("swords");
public static final ItemTag AXES = new ItemTag("axes");
public static final ItemTag HOES = new ItemTag("hoes");
public static final ItemTag PICKAXES = new ItemTag("pickaxes");
public static final ItemTag SHOVELS = new ItemTag("shovels");
public static final ItemTag BREAKS_DECORATED_POTS = new ItemTag("breaks_decorated_pots");
public static final ItemTag VILLAGER_PLANTABLE_SEEDS = new ItemTag("villager_plantable_seeds");
public static final ItemTag DYEABLE = new ItemTag("dyeable");
public static final ItemTag ENCHANTABLE_FOOT_ARMOR = new ItemTag("enchantable/foot_armor");
public static final ItemTag ENCHANTABLE_LEG_ARMOR = new ItemTag("enchantable/leg_armor");
public static final ItemTag ENCHANTABLE_CHEST_ARMOR = new ItemTag("enchantable/chest_armor");
public static final ItemTag ENCHANTABLE_HEAD_ARMOR = new ItemTag("enchantable/head_armor");
public static final ItemTag ENCHANTABLE_ARMOR = new ItemTag("enchantable/armor");
public static final ItemTag ENCHANTABLE_SWORD = new ItemTag("enchantable/sword");
public static final ItemTag ENCHANTABLE_FIRE_ASPECT = new ItemTag("enchantable/fire_aspect");
public static final ItemTag ENCHANTABLE_SHARP_WEAPON = new ItemTag("enchantable/sharp_weapon");
public static final ItemTag ENCHANTABLE_WEAPON = new ItemTag("enchantable/weapon");
public static final ItemTag ENCHANTABLE_MINING = new ItemTag("enchantable/mining");
public static final ItemTag ENCHANTABLE_MINING_LOOT = new ItemTag("enchantable/mining_loot");
public static final ItemTag ENCHANTABLE_FISHING = new ItemTag("enchantable/fishing");
public static final ItemTag ENCHANTABLE_TRIDENT = new ItemTag("enchantable/trident");
public static final ItemTag ENCHANTABLE_DURABILITY = new ItemTag("enchantable/durability");
public static final ItemTag ENCHANTABLE_BOW = new ItemTag("enchantable/bow");
public static final ItemTag ENCHANTABLE_EQUIPPABLE = new ItemTag("enchantable/equippable");
public static final ItemTag ENCHANTABLE_CROSSBOW = new ItemTag("enchantable/crossbow");
public static final ItemTag ENCHANTABLE_VANISHING = new ItemTag("enchantable/vanishing");
public static final ItemTag ENCHANTABLE_MACE = new ItemTag("enchantable/mace");
private ItemTag() {}
private final int id;
private ItemTag(String identifier) {
this.id = ALL_ITEM_TAGS.size();
register(identifier, this);
private static Tag register(String name) {
return TagRegistry.ITEM.registerVanillaTag(MinecraftKey.key(name));
}
@Override
public int ordinal() {
return id;
}
private static void register(String name, ItemTag tag) {
ALL_ITEM_TAGS.put(MinecraftKey.key(name), tag);
public static void init() {
// no-op
}
}

View file

@ -0,0 +1,35 @@
/*
* Copyright (c) 2024 GeyserMC. http://geysermc.org
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*
* @author GeyserMC
* @link https://github.com/GeyserMC/Geyser
*/
package org.geysermc.geyser.session.cache.tags;
import net.kyori.adventure.key.Key;
/**
* A non-vanilla tag. This can be any key in any of the registries that are stored by Geyser.
*/
public record NonVanillaTag(TagRegistry registry, Key tag) implements Tag {
}

View file

@ -0,0 +1,45 @@
/*
* Copyright (c) 2024 GeyserMC. http://geysermc.org
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*
* @author GeyserMC
* @link https://github.com/GeyserMC/Geyser
*/
package org.geysermc.geyser.session.cache.tags;
import net.kyori.adventure.key.Key;
/**
* A tag in any of the registries that are stored by Geyser.
*
* The recommended way to turn a tag key into a Tag is to use {@link Tag#createTag}.
* This ensures a {@link VanillaTag} is used when the tag key is a vanilla one, which allows for faster lookup of the tag.
*/
public interface Tag {
TagRegistry registry();
Key tag();
static Tag createTag(TagRegistry registry, Key tagKey) {
return registry.getVanillaTags().getOrDefault(tagKey, new NonVanillaTag(registry, tagKey));
}
}

View file

@ -0,0 +1,87 @@
/*
* Copyright (c) 2024 GeyserMC. http://geysermc.org
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*
* @author GeyserMC
* @link https://github.com/GeyserMC/Geyser
*/
package org.geysermc.geyser.session.cache.tags;
import java.util.HashMap;
import java.util.Map;
import lombok.Getter;
import net.kyori.adventure.key.Key;
import org.checkerframework.checker.nullness.qual.Nullable;
import org.geysermc.geyser.util.MinecraftKey;
/**
* Lists registries that Geyser stores tags for.
*
* When wanting to store tags from a new registry, add the registry here, and register all vanilla tags for it using {@link TagRegistry#registerVanillaTag}. These vanilla tags
* can be stored in a vanilla tag class, like {@link BlockTag} and {@link ItemTag}. This class can then have an init method that's called in {@link TagRegistry#init}, to ensure
* that all vanilla tags are registered before any connection is made.
*/
public enum TagRegistry {
BLOCK("block"),
ITEM("item"),
ENCHANTMENT("enchantment");
private final Key registryKey;
/**
* A map mapping vanilla tag keys in this registry to a {@link Tag} instance (this is a {@link VanillaTag}).
*
* Keys should never be manually added to this map. Rather, {@link TagRegistry#registerVanillaTag} should be used, during Geyser init.
*/
@Getter
private final Map<Key, Tag> vanillaTags;
TagRegistry(String registry) {
this.registryKey = MinecraftKey.key(registry);
this.vanillaTags = new HashMap<>();
}
public Tag registerVanillaTag(Key identifier) {
if (vanillaTags.containsKey(identifier)) {
throw new IllegalArgumentException("Vanilla tag " + identifier + " was already registered!");
}
Tag tag = new VanillaTag(this, identifier, vanillaTags.size());
vanillaTags.put(identifier, tag);
return tag;
}
@Nullable
public static TagRegistry fromKey(Key registryKey) {
for (TagRegistry registry : TagRegistry.values()) {
if (registry.registryKey.equals(registryKey)) {
return registry;
}
}
return null;
}
public static void init() {
BlockTag.init();
ItemTag.init();
EnchantmentTag.init();
}
}

View file

@ -0,0 +1,37 @@
/*
* Copyright (c) 2024 GeyserMC. http://geysermc.org
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*
* @author GeyserMC
* @link https://github.com/GeyserMC/Geyser
*/
package org.geysermc.geyser.session.cache.tags;
import net.kyori.adventure.key.Key;
import org.geysermc.geyser.util.Ordered;
public record VanillaTag(TagRegistry registry, Key tag, int geyserId) implements Ordered, Tag {
@Override
public int ordinal() {
return geyserId;
}
}