From bad2d03d3d939b7cf0f62e73702881741a932f65 Mon Sep 17 00:00:00 2001 From: Eclipse Date: Wed, 10 Jul 2024 07:45:04 +0000 Subject: [PATCH 01/12] Work on new tag system, still largely unfinished --- .../type/living/animal/AnimalEntity.java | 5 +- .../type/living/animal/ArmadilloEntity.java | 3 +- .../type/living/animal/AxolotlEntity.java | 3 +- .../entity/type/living/animal/BeeEntity.java | 3 +- .../type/living/animal/ChickenEntity.java | 3 +- .../entity/type/living/animal/CowEntity.java | 3 +- .../entity/type/living/animal/FoxEntity.java | 3 +- .../entity/type/living/animal/FrogEntity.java | 3 +- .../entity/type/living/animal/GoatEntity.java | 3 +- .../type/living/animal/HoglinEntity.java | 3 +- .../type/living/animal/OcelotEntity.java | 3 +- .../type/living/animal/PandaEntity.java | 3 +- .../entity/type/living/animal/PigEntity.java | 3 +- .../type/living/animal/PolarBearEntity.java | 3 +- .../type/living/animal/RabbitEntity.java | 5 +- .../type/living/animal/SheepEntity.java | 5 +- .../type/living/animal/SnifferEntity.java | 3 +- .../type/living/animal/StriderEntity.java | 3 +- .../type/living/animal/TurtleEntity.java | 3 +- .../animal/horse/AbstractHorseEntity.java | 3 +- .../type/living/animal/horse/CamelEntity.java | 3 +- .../type/living/animal/horse/LlamaEntity.java | 3 +- .../living/animal/tameable/CatEntity.java | 3 +- .../living/animal/tameable/ParrotEntity.java | 3 +- .../living/animal/tameable/WolfEntity.java | 3 +- .../populator/BlockRegistryPopulator.java | 24 +- .../geyser/session/cache/TagCache.java | 148 ++++--- .../geyser/session/cache/tags/BlockTag.java | 395 +++++++++--------- .../session/cache/tags/EnchantmentTag.java | 94 ++--- .../geyser/session/cache/tags/ItemTag.java | 316 +++++++------- .../session/cache/tags/NonVanillaTag.java | 32 ++ .../geyser/session/cache/tags/Tag.java | 35 ++ .../geyser/session/cache/tags/VanillaTag.java | 37 ++ 33 files changed, 651 insertions(+), 511 deletions(-) create mode 100644 core/src/main/java/org/geysermc/geyser/session/cache/tags/NonVanillaTag.java create mode 100644 core/src/main/java/org/geysermc/geyser/session/cache/tags/Tag.java create mode 100644 core/src/main/java/org/geysermc/geyser/session/cache/tags/VanillaTag.java diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/AnimalEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/AnimalEntity.java index 2e627b461..cc3e69d43 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/AnimalEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/AnimalEntity.java @@ -35,6 +35,7 @@ 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.VanillaTag; import org.geysermc.geyser.util.InteractionResult; import org.geysermc.geyser.util.InteractiveTag; import org.geysermc.mcprotocollib.protocol.data.game.entity.player.Hand; @@ -48,7 +49,7 @@ public abstract class AnimalEntity extends AgeableEntity { } protected final boolean canEat(GeyserItemStack itemStack) { - ItemTag tag = getFoodTag(); + VanillaTag tag = getFoodTag(); if (tag == null) { return false; } @@ -58,7 +59,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 VanillaTag getFoodTag(); @NonNull @Override diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/ArmadilloEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/ArmadilloEntity.java index 968520bb6..b044e5785 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/ArmadilloEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/ArmadilloEntity.java @@ -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.VanillaTag; 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 VanillaTag getFoodTag() { return ItemTag.ARMADILLO_FOOD; } } diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/AxolotlEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/AxolotlEntity.java index a0ab56ead..12c56d0d5 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/AxolotlEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/AxolotlEntity.java @@ -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.VanillaTag; 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 VanillaTag getFoodTag() { return ItemTag.AXOLOTL_FOOD; } diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/BeeEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/BeeEntity.java index 4fcf0e178..06fd7111f 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/BeeEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/BeeEntity.java @@ -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.VanillaTag; 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 VanillaTag getFoodTag() { return ItemTag.BEE_FOOD; } } diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/ChickenEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/ChickenEntity.java index 075a49923..71755809a 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/ChickenEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/ChickenEntity.java @@ -32,6 +32,7 @@ import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.session.cache.tags.ItemTag; import java.util.UUID; +import org.geysermc.geyser.session.cache.tags.VanillaTag; public class ChickenEntity extends AnimalEntity { @@ -41,7 +42,7 @@ public class ChickenEntity extends AnimalEntity { @Override @Nullable - protected ItemTag getFoodTag() { + protected VanillaTag getFoodTag() { return ItemTag.CHICKEN_FOOD; } } diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/CowEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/CowEntity.java index 64e7de193..2a3206abd 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/CowEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/CowEntity.java @@ -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.VanillaTag; 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 VanillaTag getFoodTag() { return ItemTag.COW_FOOD; } } diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/FoxEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/FoxEntity.java index e20031baa..4acda556f 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/FoxEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/FoxEntity.java @@ -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.VanillaTag; 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 VanillaTag getFoodTag() { return ItemTag.FOX_FOOD; } } diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/FrogEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/FrogEntity.java index 120bfcdd4..933b7b431 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/FrogEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/FrogEntity.java @@ -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.VanillaTag; 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 VanillaTag getFoodTag() { return ItemTag.FROG_FOOD; } } diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/GoatEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/GoatEntity.java index 4e919b81c..f43cb5e58 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/GoatEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/GoatEntity.java @@ -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.VanillaTag; 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 VanillaTag getFoodTag() { return ItemTag.GOAT_FOOD; } } diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/HoglinEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/HoglinEntity.java index cc23fc607..7e0c344d7 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/HoglinEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/HoglinEntity.java @@ -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.VanillaTag; 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 VanillaTag getFoodTag() { return ItemTag.HOGLIN_FOOD; } diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/OcelotEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/OcelotEntity.java index 9d6d33227..4de01b856 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/OcelotEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/OcelotEntity.java @@ -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.VanillaTag; 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 VanillaTag getFoodTag() { return ItemTag.OCELOT_FOOD; } diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/PandaEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/PandaEntity.java index aaa7c2d7e..f5779e60b 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/PandaEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/PandaEntity.java @@ -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.VanillaTag; 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 VanillaTag getFoodTag() { return ItemTag.PANDA_FOOD; } diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/PigEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/PigEntity.java index 446e3e109..8fa1760ce 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/PigEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/PigEntity.java @@ -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.VanillaTag; 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 VanillaTag getFoodTag() { return ItemTag.PIG_FOOD; } diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/PolarBearEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/PolarBearEntity.java index 0e83615f7..6db94cfe7 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/PolarBearEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/PolarBearEntity.java @@ -32,6 +32,7 @@ import org.geysermc.geyser.session.GeyserSession; import org.geysermc.geyser.session.cache.tags.ItemTag; import java.util.UUID; +import org.geysermc.geyser.session.cache.tags.VanillaTag; public class PolarBearEntity extends AnimalEntity { @@ -41,7 +42,7 @@ public class PolarBearEntity extends AnimalEntity { @Override @Nullable - protected ItemTag getFoodTag() { + protected VanillaTag getFoodTag() { return null; } } diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/RabbitEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/RabbitEntity.java index 0a108be73..f1b8485ba 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/RabbitEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/RabbitEntity.java @@ -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.VanillaTag; 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 VanillaTag getFoodTag() { return ItemTag.RABBIT_FOOD; } -} \ No newline at end of file +} diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/SheepEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/SheepEntity.java index 155ddf00c..dfb2be072 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/SheepEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/SheepEntity.java @@ -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.VanillaTag; 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 VanillaTag 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); } -} \ No newline at end of file +} diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/SnifferEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/SnifferEntity.java index 11fee5bbf..8393ca3fe 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/SnifferEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/SnifferEntity.java @@ -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.VanillaTag; 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 VanillaTag getFoodTag() { return ItemTag.SNIFFER_FOOD; } diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/StriderEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/StriderEntity.java index 0291f75d9..ef351ed9b 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/StriderEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/StriderEntity.java @@ -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.VanillaTag; 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 VanillaTag getFoodTag() { return ItemTag.STRIDER_FOOD; } diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/TurtleEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/TurtleEntity.java index 16901a844..41754c611 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/TurtleEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/TurtleEntity.java @@ -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.VanillaTag; 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 VanillaTag getFoodTag() { return ItemTag.TURTLE_FOOD; } diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/horse/AbstractHorseEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/horse/AbstractHorseEntity.java index ddc212053..4867b54c6 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/horse/AbstractHorseEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/horse/AbstractHorseEntity.java @@ -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.VanillaTag; 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 VanillaTag getFoodTag() { return ItemTag.HORSE_FOOD; } diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/horse/CamelEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/horse/CamelEntity.java index ee3b2be70..6e695d368 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/horse/CamelEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/horse/CamelEntity.java @@ -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.VanillaTag; 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 VanillaTag getFoodTag() { return ItemTag.CAMEL_FOOD; } diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/horse/LlamaEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/horse/LlamaEntity.java index 76939ceb9..d53fae729 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/horse/LlamaEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/horse/LlamaEntity.java @@ -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.VanillaTag; 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 VanillaTag getFoodTag() { return ItemTag.LLAMA_FOOD; } } diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/tameable/CatEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/tameable/CatEntity.java index bf1555e9d..4cf89bd9e 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/tameable/CatEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/tameable/CatEntity.java @@ -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.VanillaTag; 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 VanillaTag getFoodTag() { return ItemTag.CAT_FOOD; } diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/tameable/ParrotEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/tameable/ParrotEntity.java index 8baba6f00..9a36ac0ed 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/tameable/ParrotEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/tameable/ParrotEntity.java @@ -35,6 +35,7 @@ import org.geysermc.geyser.item.Items; 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.VanillaTag; import org.geysermc.geyser.util.InteractionResult; import org.geysermc.geyser.util.InteractiveTag; import org.geysermc.mcprotocollib.protocol.data.game.entity.player.Hand; @@ -52,7 +53,7 @@ public class ParrotEntity extends TameableEntity { @Override @Nullable - protected ItemTag getFoodTag() { + protected VanillaTag getFoodTag() { return null; } diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/tameable/WolfEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/tameable/WolfEntity.java index e7fde2be8..3b9749852 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/tameable/WolfEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/tameable/WolfEntity.java @@ -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.VanillaTag; 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 VanillaTag getFoodTag() { return ItemTag.WOLF_FOOD; } diff --git a/core/src/main/java/org/geysermc/geyser/registry/populator/BlockRegistryPopulator.java b/core/src/main/java/org/geysermc/geyser/registry/populator/BlockRegistryPopulator.java index d7dc989da..e2fd53ce1 100644 --- a/core/src/main/java/org/geysermc/geyser/registry/populator/BlockRegistryPopulator.java +++ b/core/src/main/java/org/geysermc/geyser/registry/populator/BlockRegistryPopulator.java @@ -82,7 +82,7 @@ public final class BlockRegistryPopulator { @FunctionalInterface interface Remapper { - NbtMap remap(NbtMap tag); + NbtMap remap(NbtMap vanillaTag); } public static void populate(Stage stage) { @@ -108,7 +108,7 @@ public final class BlockRegistryPopulator { private static void registerBedrockBlocks() { var blockMappers = ImmutableMap., Remapper>builder() .put(ObjectIntPair.of("1_20_80", Bedrock_v671.CODEC.getProtocolVersion()), Conversion685_671::remapBlock) - .put(ObjectIntPair.of("1_21_0", Bedrock_v685.CODEC.getProtocolVersion()), tag -> tag) + .put(ObjectIntPair.of("1_21_0", Bedrock_v685.CODEC.getProtocolVersion()), vanillaTag -> vanillaTag) .build(); // We can keep this strong as nothing should be garbage collected @@ -163,12 +163,12 @@ public final class BlockRegistryPopulator { Object2ObjectMap blockStateOrderedMap = new Object2ObjectOpenHashMap<>(blockStates.size()); GeyserBedrockBlock[] bedrockRuntimeMap = new GeyserBedrockBlock[blockStates.size()]; for (int i = 0; i < blockStates.size(); i++) { - NbtMap tag = blockStates.get(i); - if (blockStateOrderedMap.containsKey(tag)) { - throw new AssertionError("Duplicate block states in Bedrock palette: " + tag); + NbtMap vanillaTag = blockStates.get(i); + if (blockStateOrderedMap.containsKey(vanillaTag)) { + throw new AssertionError("Duplicate block states in Bedrock palette: " + vanillaTag); } - GeyserBedrockBlock block = new GeyserBedrockBlock(i, tag); - blockStateOrderedMap.put(tag, block); + GeyserBedrockBlock block = new GeyserBedrockBlock(i, vanillaTag); + blockStateOrderedMap.put(vanillaTag, block); bedrockRuntimeMap[i] = block; } @@ -177,9 +177,9 @@ public final class BlockRegistryPopulator { if (BlockRegistries.CUSTOM_BLOCKS.get().length != 0) { customBlockStateDefinitions = new Object2ObjectOpenHashMap<>(customExtBlockStates.size()); for (int i = 0; i < customExtBlockStates.size(); i++) { - NbtMap tag = customBlockStates.get(i); + NbtMap vanillaTag = customBlockStates.get(i); CustomBlockState blockState = customExtBlockStates.get(i); - GeyserBedrockBlock bedrockBlock = blockStateOrderedMap.get(tag); + GeyserBedrockBlock bedrockBlock = blockStateOrderedMap.get(vanillaTag); customBlockStateDefinitions.put(blockState, bedrockBlock); Set extendedCollisionjavaIds = BlockRegistries.EXTENDED_COLLISION_BOXES.getOrDefault(blockState.block(), null); @@ -250,9 +250,9 @@ public final class BlockRegistryPopulator { bedrockDefinition = vanillaBedrockDefinition; if (bedrockDefinition == null) { throw new RuntimeException(""" - Unable to find %s Bedrock runtime ID for %s! Original block tag: + Unable to find %s Bedrock runtime ID for %s! Original block vanillaTag: %s - Updated block tag: + Updated block vanillaTag: %s""".formatted(javaId, palette.key(), originalBedrockTag, bedrockTag)); } } else { @@ -297,7 +297,7 @@ public final class BlockRegistryPopulator { BlockRegistries.WATERLOGGED.get().set(javaRuntimeId); } - // Get the tag needed for non-empty flower pots + // Get the vanillaTag needed for non-empty flower pots if (javaPottable.contains(block)) { // Specifically NOT putIfAbsent - mangrove propagule breaks otherwise flowerPotBlocks.put(block, blockStates.get(bedrockDefinition.getRuntimeId())); diff --git a/core/src/main/java/org/geysermc/geyser/session/cache/TagCache.java b/core/src/main/java/org/geysermc/geyser/session/cache/TagCache.java index f4d69dcdb..070085880 100644 --- a/core/src/main/java/org/geysermc/geyser/session/cache/TagCache.java +++ b/core/src/main/java/org/geysermc/geyser/session/cache/TagCache.java @@ -25,24 +25,24 @@ 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 java.util.ArrayList; +import java.util.List; 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.NonVanillaTag; +import org.geysermc.geyser.session.cache.tags.Tag; +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.Map; import static org.geysermc.geyser.session.cache.tags.BlockTag.ALL_BLOCK_TAGS; @@ -55,87 +55,115 @@ import static org.geysermc.geyser.session.cache.tags.ItemTag.ALL_ITEM_TAGS; */ @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()][]; + private final Object2IntMap registryIndexMap = new Object2IntOpenHashMap<>(); + private List> tagIndexMaps = new ArrayList<>(); + private int[][][] tags = new int[0][][]; public void loadPacket(GeyserSession session, ClientboundUpdateTagsPacket packet) { - Map blockTags = packet.getTags().get(MinecraftKey.key("block")); - loadTags("Block", blockTags, ALL_BLOCK_TAGS, this.blocks); + this.registryIndexMap.clear(); - // Hack btw + Map> 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 ArrayList<>(allTags.size()); + this.tags = new int[allTags.size()][][]; + + int i = 0; + for (Key registry : allTags.keySet()) { + Map registryTags = allTags.get(registry); + Map vanillaTags = null; + + if (registry.equals(MinecraftKey.key("block"))) { + vanillaTags = ALL_BLOCK_TAGS; + + // 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.equals(MinecraftKey.key("item"))) { + vanillaTags = ALL_ITEM_TAGS; + + // 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); + } + } else if (registry.equals(MinecraftKey.key("enchantment"))) { + vanillaTags = ALL_ENCHANTMENT_TAGS; + } + + int[][] registryTagsArray = new int[0][]; + this.tagIndexMaps.set(i, loadTags(registryTags, registryTagsArray, vanillaTags)); + this.tags[i] = registryTagsArray; + this.registryIndexMap.put(registry, i); + i++; } - - Map 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 enchantmentTags = packet.getTags().get(MinecraftKey.key("enchantment")); - loadTags("Enchantment", enchantmentTags, ALL_ENCHANTMENT_TAGS, this.enchantments); } - private void loadTags(String type, @Nullable Map packetTags, Map 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; - } - 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; - } + private Object2IntMap loadTags(Map packetTags, int[][] tags, @Nullable Map vanillaTags) { + List vanillaTagsList = vanillaTags == null ? List.of() : List.copyOf(vanillaTags.keySet()); + + // Using Math.max here because we might have more vanilla tags defined than the server sent us + List tagsBuilder = new ArrayList<>(Math.max(packetTags.size(), vanillaTagsList.size())); + Object2IntMap tagIndexMap = new Object2IntOpenHashMap<>(); + + int tagIndex = vanillaTagsList.size(); + for (Map.Entry tag : packetTags.entrySet()) { + int id; + if (vanillaTagsList.contains(tag.getKey())) { + id = vanillaTagsList.indexOf(tag.getKey()); } else { - localValues[tag.ordinal()] = IntArrays.EMPTY_ARRAY; - GeyserImpl.getInstance().getLogger().debug(type + " tag not found from server: " + location); + id = tagIndex; + tagIndex++; } - }); + tagsBuilder.set(id, tag.getValue()); + tagIndexMap.put(tag.getKey(), id); + } + + tagsBuilder.toArray(tags); + return tagIndexMap; } /** * @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) { + 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) { + return contains(get(tag), item.javaId()); } - public int[] get(ItemTag itemTag) { - return this.items[itemTag.ordinal()]; - } + public int[] get(Tag tag) { + if (!this.registryIndexMap.containsKey(tag.registry())) { + return new int[0]; + } - public int[] get(EnchantmentTag enchantmentTag) { - return this.enchantments[enchantmentTag.ordinal()]; + if (tag instanceof VanillaTag vanillaTag) { + return this.tags[this.registryIndexMap.getInt(tag.registry())][vanillaTag.ordinal()]; + } + + int registryIndex = this.registryIndexMap.getInt(tag.registry()); + Object2IntMap tagIndexMap = tagIndexMaps.get(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) { diff --git a/core/src/main/java/org/geysermc/geyser/session/cache/tags/BlockTag.java b/core/src/main/java/org/geysermc/geyser/session/cache/tags/BlockTag.java index 1dca7843a..7d735ec0d 100644 --- a/core/src/main/java/org/geysermc/geyser/session/cache/tags/BlockTag.java +++ b/core/src/main/java/org/geysermc/geyser/session/cache/tags/BlockTag.java @@ -26,213 +26,208 @@ package org.geysermc.geyser.session.cache.tags; import net.kyori.adventure.key.Key; -import org.geysermc.geyser.util.Ordered; +import org.geysermc.geyser.util.MinecraftKey; import java.util.HashMap; import java.util.Map; @SuppressWarnings("unused") -public final class BlockTag implements Ordered { - public static final Map ALL_BLOCK_TAGS = new HashMap<>(); +// TODO rename to vanillablocktags +public final class BlockTag { + public static final Map ALL_BLOCK_TAGS = new HashMap<>(); - 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"); + public static final VanillaTag WOOL = register("wool"); + public static final VanillaTag PLANKS = register("planks"); + public static final VanillaTag STONE_BRICKS = register("stone_bricks"); + public static final VanillaTag WOODEN_BUTTONS = register("wooden_buttons"); + public static final VanillaTag STONE_BUTTONS = register("stone_buttons"); + public static final VanillaTag BUTTONS = register("buttons"); + public static final VanillaTag WOOL_CARPETS = register("wool_carpets"); + public static final VanillaTag WOODEN_DOORS = register("wooden_doors"); + public static final VanillaTag MOB_INTERACTABLE_DOORS = register("mob_interactable_doors"); + public static final VanillaTag WOODEN_STAIRS = register("wooden_stairs"); + public static final VanillaTag WOODEN_SLABS = register("wooden_slabs"); + public static final VanillaTag WOODEN_FENCES = register("wooden_fences"); + public static final VanillaTag PRESSURE_PLATES = register("pressure_plates"); + public static final VanillaTag WOODEN_PRESSURE_PLATES = register("wooden_pressure_plates"); + public static final VanillaTag STONE_PRESSURE_PLATES = register("stone_pressure_plates"); + public static final VanillaTag WOODEN_TRAPDOORS = register("wooden_trapdoors"); + public static final VanillaTag DOORS = register("doors"); + public static final VanillaTag SAPLINGS = register("saplings"); + public static final VanillaTag LOGS_THAT_BURN = register("logs_that_burn"); + public static final VanillaTag OVERWORLD_NATURAL_LOGS = register("overworld_natural_logs"); + public static final VanillaTag LOGS = register("logs"); + public static final VanillaTag DARK_OAK_LOGS = register("dark_oak_logs"); + public static final VanillaTag OAK_LOGS = register("oak_logs"); + public static final VanillaTag BIRCH_LOGS = register("birch_logs"); + public static final VanillaTag ACACIA_LOGS = register("acacia_logs"); + public static final VanillaTag CHERRY_LOGS = register("cherry_logs"); + public static final VanillaTag JUNGLE_LOGS = register("jungle_logs"); + public static final VanillaTag SPRUCE_LOGS = register("spruce_logs"); + public static final VanillaTag MANGROVE_LOGS = register("mangrove_logs"); + public static final VanillaTag CRIMSON_STEMS = register("crimson_stems"); + public static final VanillaTag WARPED_STEMS = register("warped_stems"); + public static final VanillaTag BAMBOO_BLOCKS = register("bamboo_blocks"); + public static final VanillaTag WART_BLOCKS = register("wart_blocks"); + public static final VanillaTag BANNERS = register("banners"); + public static final VanillaTag SAND = register("sand"); + public static final VanillaTag SMELTS_TO_GLASS = register("smelts_to_glass"); + public static final VanillaTag STAIRS = register("stairs"); + public static final VanillaTag SLABS = register("slabs"); + public static final VanillaTag WALLS = register("walls"); + public static final VanillaTag ANVIL = register("anvil"); + public static final VanillaTag RAILS = register("rails"); + public static final VanillaTag LEAVES = register("leaves"); + public static final VanillaTag TRAPDOORS = register("trapdoors"); + public static final VanillaTag SMALL_FLOWERS = register("small_flowers"); + public static final VanillaTag BEDS = register("beds"); + public static final VanillaTag FENCES = register("fences"); + public static final VanillaTag TALL_FLOWERS = register("tall_flowers"); + public static final VanillaTag FLOWERS = register("flowers"); + public static final VanillaTag PIGLIN_REPELLENTS = register("piglin_repellents"); + public static final VanillaTag GOLD_ORES = register("gold_ores"); + public static final VanillaTag IRON_ORES = register("iron_ores"); + public static final VanillaTag DIAMOND_ORES = register("diamond_ores"); + public static final VanillaTag REDSTONE_ORES = register("redstone_ores"); + public static final VanillaTag LAPIS_ORES = register("lapis_ores"); + public static final VanillaTag COAL_ORES = register("coal_ores"); + public static final VanillaTag EMERALD_ORES = register("emerald_ores"); + public static final VanillaTag COPPER_ORES = register("copper_ores"); + public static final VanillaTag CANDLES = register("candles"); + public static final VanillaTag DIRT = register("dirt"); + public static final VanillaTag TERRACOTTA = register("terracotta"); + public static final VanillaTag BADLANDS_TERRACOTTA = register("badlands_terracotta"); + public static final VanillaTag CONCRETE_POWDER = register("concrete_powder"); + public static final VanillaTag COMPLETES_FIND_TREE_TUTORIAL = register("completes_find_tree_tutorial"); + public static final VanillaTag FLOWER_POTS = register("flower_pots"); + public static final VanillaTag ENDERMAN_HOLDABLE = register("enderman_holdable"); + public static final VanillaTag ICE = register("ice"); + public static final VanillaTag VALID_SPAWN = register("valid_spawn"); + public static final VanillaTag IMPERMEABLE = register("impermeable"); + public static final VanillaTag UNDERWATER_BONEMEALS = register("underwater_bonemeals"); + public static final VanillaTag CORAL_BLOCKS = register("coral_blocks"); + public static final VanillaTag WALL_CORALS = register("wall_corals"); + public static final VanillaTag CORAL_PLANTS = register("coral_plants"); + public static final VanillaTag CORALS = register("corals"); + public static final VanillaTag BAMBOO_PLANTABLE_ON = register("bamboo_plantable_on"); + public static final VanillaTag STANDING_SIGNS = register("standing_signs"); + public static final VanillaTag WALL_SIGNS = register("wall_signs"); + public static final VanillaTag SIGNS = register("signs"); + public static final VanillaTag CEILING_HANGING_SIGNS = register("ceiling_hanging_signs"); + public static final VanillaTag WALL_HANGING_SIGNS = register("wall_hanging_signs"); + public static final VanillaTag ALL_HANGING_SIGNS = register("all_hanging_signs"); + public static final VanillaTag ALL_SIGNS = register("all_signs"); + public static final VanillaTag DRAGON_IMMUNE = register("dragon_immune"); + public static final VanillaTag DRAGON_TRANSPARENT = register("dragon_transparent"); + public static final VanillaTag WITHER_IMMUNE = register("wither_immune"); + public static final VanillaTag WITHER_SUMMON_BASE_BLOCKS = register("wither_summon_base_blocks"); + public static final VanillaTag BEEHIVES = register("beehives"); + public static final VanillaTag CROPS = register("crops"); + public static final VanillaTag BEE_GROWABLES = register("bee_growables"); + public static final VanillaTag PORTALS = register("portals"); + public static final VanillaTag FIRE = register("fire"); + public static final VanillaTag NYLIUM = register("nylium"); + public static final VanillaTag BEACON_BASE_BLOCKS = register("beacon_base_blocks"); + public static final VanillaTag SOUL_SPEED_BLOCKS = register("soul_speed_blocks"); + public static final VanillaTag WALL_POST_OVERRIDE = register("wall_post_override"); + public static final VanillaTag CLIMBABLE = register("climbable"); + public static final VanillaTag FALL_DAMAGE_RESETTING = register("fall_damage_resetting"); + public static final VanillaTag SHULKER_BOXES = register("shulker_boxes"); + public static final VanillaTag HOGLIN_REPELLENTS = register("hoglin_repellents"); + public static final VanillaTag SOUL_FIRE_BASE_BLOCKS = register("soul_fire_base_blocks"); + public static final VanillaTag STRIDER_WARM_BLOCKS = register("strider_warm_blocks"); + public static final VanillaTag CAMPFIRES = register("campfires"); + public static final VanillaTag GUARDED_BY_PIGLINS = register("guarded_by_piglins"); + public static final VanillaTag PREVENT_MOB_SPAWNING_INSIDE = register("prevent_mob_spawning_inside"); + public static final VanillaTag FENCE_GATES = register("fence_gates"); + public static final VanillaTag UNSTABLE_BOTTOM_CENTER = register("unstable_bottom_center"); + public static final VanillaTag MUSHROOM_GROW_BLOCK = register("mushroom_grow_block"); + public static final VanillaTag INFINIBURN_OVERWORLD = register("infiniburn_overworld"); + public static final VanillaTag INFINIBURN_NETHER = register("infiniburn_nether"); + public static final VanillaTag INFINIBURN_END = register("infiniburn_end"); + public static final VanillaTag BASE_STONE_OVERWORLD = register("base_stone_overworld"); + public static final VanillaTag STONE_ORE_REPLACEABLES = register("stone_ore_replaceables"); + public static final VanillaTag DEEPSLATE_ORE_REPLACEABLES = register("deepslate_ore_replaceables"); + public static final VanillaTag BASE_STONE_NETHER = register("base_stone_nether"); + public static final VanillaTag OVERWORLD_CARVER_REPLACEABLES = register("overworld_carver_replaceables"); + public static final VanillaTag NETHER_CARVER_REPLACEABLES = register("nether_carver_replaceables"); + public static final VanillaTag CANDLE_CAKES = register("candle_cakes"); + public static final VanillaTag CAULDRONS = register("cauldrons"); + public static final VanillaTag CRYSTAL_SOUND_BLOCKS = register("crystal_sound_blocks"); + public static final VanillaTag INSIDE_STEP_SOUND_BLOCKS = register("inside_step_sound_blocks"); + public static final VanillaTag COMBINATION_STEP_SOUND_BLOCKS = register("combination_step_sound_blocks"); + public static final VanillaTag CAMEL_SAND_STEP_SOUND_BLOCKS = register("camel_sand_step_sound_blocks"); + public static final VanillaTag OCCLUDES_VIBRATION_SIGNALS = register("occludes_vibration_signals"); + public static final VanillaTag DAMPENS_VIBRATIONS = register("dampens_vibrations"); + public static final VanillaTag DRIPSTONE_REPLACEABLE_BLOCKS = register("dripstone_replaceable_blocks"); + public static final VanillaTag CAVE_VINES = register("cave_vines"); + public static final VanillaTag MOSS_REPLACEABLE = register("moss_replaceable"); + public static final VanillaTag LUSH_GROUND_REPLACEABLE = register("lush_ground_replaceable"); + public static final VanillaTag AZALEA_ROOT_REPLACEABLE = register("azalea_root_replaceable"); + public static final VanillaTag SMALL_DRIPLEAF_PLACEABLE = register("small_dripleaf_placeable"); + public static final VanillaTag BIG_DRIPLEAF_PLACEABLE = register("big_dripleaf_placeable"); + public static final VanillaTag SNOW = register("snow"); + public static final VanillaTag MINEABLE_AXE = register("mineable/axe"); + public static final VanillaTag MINEABLE_HOE = register("mineable/hoe"); + public static final VanillaTag MINEABLE_PICKAXE = register("mineable/pickaxe"); + public static final VanillaTag MINEABLE_SHOVEL = register("mineable/shovel"); + public static final VanillaTag SWORD_EFFICIENT = register("sword_efficient"); + public static final VanillaTag NEEDS_DIAMOND_TOOL = register("needs_diamond_tool"); + public static final VanillaTag NEEDS_IRON_TOOL = register("needs_iron_tool"); + public static final VanillaTag NEEDS_STONE_TOOL = register("needs_stone_tool"); + public static final VanillaTag INCORRECT_FOR_NETHERITE_TOOL = register("incorrect_for_netherite_tool"); + public static final VanillaTag INCORRECT_FOR_DIAMOND_TOOL = register("incorrect_for_diamond_tool"); + public static final VanillaTag INCORRECT_FOR_IRON_TOOL = register("incorrect_for_iron_tool"); + public static final VanillaTag INCORRECT_FOR_STONE_TOOL = register("incorrect_for_stone_tool"); + public static final VanillaTag INCORRECT_FOR_GOLD_TOOL = register("incorrect_for_gold_tool"); + public static final VanillaTag INCORRECT_FOR_WOODEN_TOOL = register("incorrect_for_wooden_tool"); + public static final VanillaTag FEATURES_CANNOT_REPLACE = register("features_cannot_replace"); + public static final VanillaTag LAVA_POOL_STONE_CANNOT_REPLACE = register("lava_pool_stone_cannot_replace"); + public static final VanillaTag GEODE_INVALID_BLOCKS = register("geode_invalid_blocks"); + public static final VanillaTag FROG_PREFER_JUMP_TO = register("frog_prefer_jump_to"); + public static final VanillaTag SCULK_REPLACEABLE = register("sculk_replaceable"); + public static final VanillaTag SCULK_REPLACEABLE_WORLD_GEN = register("sculk_replaceable_world_gen"); + public static final VanillaTag ANCIENT_CITY_REPLACEABLE = register("ancient_city_replaceable"); + public static final VanillaTag VIBRATION_RESONATORS = register("vibration_resonators"); + public static final VanillaTag ANIMALS_SPAWNABLE_ON = register("animals_spawnable_on"); + public static final VanillaTag ARMADILLO_SPAWNABLE_ON = register("armadillo_spawnable_on"); + public static final VanillaTag AXOLOTLS_SPAWNABLE_ON = register("axolotls_spawnable_on"); + public static final VanillaTag GOATS_SPAWNABLE_ON = register("goats_spawnable_on"); + public static final VanillaTag MOOSHROOMS_SPAWNABLE_ON = register("mooshrooms_spawnable_on"); + public static final VanillaTag PARROTS_SPAWNABLE_ON = register("parrots_spawnable_on"); + public static final VanillaTag POLAR_BEARS_SPAWNABLE_ON_ALTERNATE = register("polar_bears_spawnable_on_alternate"); + public static final VanillaTag RABBITS_SPAWNABLE_ON = register("rabbits_spawnable_on"); + public static final VanillaTag FOXES_SPAWNABLE_ON = register("foxes_spawnable_on"); + public static final VanillaTag WOLVES_SPAWNABLE_ON = register("wolves_spawnable_on"); + public static final VanillaTag FROGS_SPAWNABLE_ON = register("frogs_spawnable_on"); + public static final VanillaTag AZALEA_GROWS_ON = register("azalea_grows_on"); + public static final VanillaTag CONVERTABLE_TO_MUD = register("convertable_to_mud"); + public static final VanillaTag MANGROVE_LOGS_CAN_GROW_THROUGH = register("mangrove_logs_can_grow_through"); + public static final VanillaTag MANGROVE_ROOTS_CAN_GROW_THROUGH = register("mangrove_roots_can_grow_through"); + public static final VanillaTag DEAD_BUSH_MAY_PLACE_ON = register("dead_bush_may_place_on"); + public static final VanillaTag SNAPS_GOAT_HORN = register("snaps_goat_horn"); + public static final VanillaTag REPLACEABLE_BY_TREES = register("replaceable_by_trees"); + public static final VanillaTag SNOW_LAYER_CANNOT_SURVIVE_ON = register("snow_layer_cannot_survive_on"); + public static final VanillaTag SNOW_LAYER_CAN_SURVIVE_ON = register("snow_layer_can_survive_on"); + public static final VanillaTag INVALID_SPAWN_INSIDE = register("invalid_spawn_inside"); + public static final VanillaTag SNIFFER_DIGGABLE_BLOCK = register("sniffer_diggable_block"); + public static final VanillaTag SNIFFER_EGG_HATCH_BOOST = register("sniffer_egg_hatch_boost"); + public static final VanillaTag TRAIL_RUINS_REPLACEABLE = register("trail_ruins_replaceable"); + public static final VanillaTag REPLACEABLE = register("replaceable"); + public static final VanillaTag ENCHANTMENT_POWER_PROVIDER = register("enchantment_power_provider"); + public static final VanillaTag ENCHANTMENT_POWER_TRANSMITTER = register("enchantment_power_transmitter"); + public static final VanillaTag MAINTAINS_FARMLAND = register("maintains_farmland"); + public static final VanillaTag BLOCKS_WIND_CHARGE_EXPLOSIONS = register("blocks_wind_charge_explosions"); + public static final VanillaTag DOES_NOT_BLOCK_HOPPERS = register("does_not_block_hoppers"); + public static final VanillaTag AIR = register("air"); - private final int id; - - private BlockTag(String identifier) { - this.id = ALL_BLOCK_TAGS.size(); - register(identifier, this); - } + private BlockTag() {} - @Override - public int ordinal() { - return id; - } - - private static void register(String name, BlockTag tag) { - ALL_BLOCK_TAGS.put(Key.key(name), tag); + private static VanillaTag register(String name) { + Key identifier = MinecraftKey.key(name); + int geyserId = ALL_BLOCK_TAGS.size(); + VanillaTag tag = new VanillaTag(MinecraftKey.key("block"), identifier, geyserId); + ALL_BLOCK_TAGS.put(identifier, tag); + return tag; } } diff --git a/core/src/main/java/org/geysermc/geyser/session/cache/tags/EnchantmentTag.java b/core/src/main/java/org/geysermc/geyser/session/cache/tags/EnchantmentTag.java index 0af690abd..b33cc2cc9 100644 --- a/core/src/main/java/org/geysermc/geyser/session/cache/tags/EnchantmentTag.java +++ b/core/src/main/java/org/geysermc/geyser/session/cache/tags/EnchantmentTag.java @@ -33,59 +33,53 @@ import java.util.HashMap; import java.util.Map; @SuppressWarnings("unused") -public final class EnchantmentTag implements Ordered { - public static final Map ALL_ENCHANTMENT_TAGS = new HashMap<>(); +public final class EnchantmentTag { + public static final Map ALL_ENCHANTMENT_TAGS = new HashMap<>(); - 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"); + public static final VanillaTag TOOLTIP_ORDER = register("tooltip_order"); + public static final VanillaTag EXCLUSIVE_SET_ARMOR = register("exclusive_set/armor"); + public static final VanillaTag EXCLUSIVE_SET_BOOTS = register("exclusive_set/boots"); + public static final VanillaTag EXCLUSIVE_SET_BOW = register("exclusive_set/bow"); + public static final VanillaTag EXCLUSIVE_SET_CROSSBOW = register("exclusive_set/crossbow"); + public static final VanillaTag EXCLUSIVE_SET_DAMAGE = register("exclusive_set/damage"); + public static final VanillaTag EXCLUSIVE_SET_MINING = register("exclusive_set/mining"); + public static final VanillaTag EXCLUSIVE_SET_RIPTIDE = register("exclusive_set/riptide"); + public static final VanillaTag TRADEABLE = register("tradeable"); + public static final VanillaTag DOUBLE_TRADE_PRICE = register("double_trade_price"); + public static final VanillaTag IN_ENCHANTING_TABLE = register("in_enchanting_table"); + public static final VanillaTag ON_MOB_SPAWN_EQUIPMENT = register("on_mob_spawn_equipment"); + public static final VanillaTag ON_TRADED_EQUIPMENT = register("on_traded_equipment"); + public static final VanillaTag ON_RANDOM_LOOT = register("on_random_loot"); + public static final VanillaTag CURSE = register("curse"); + public static final VanillaTag SMELTS_LOOT = register("smelts_loot"); + public static final VanillaTag PREVENTS_BEE_SPAWNS_WHEN_MINING = register("prevents_bee_spawns_when_mining"); + public static final VanillaTag PREVENTS_DECORATED_POT_SHATTERING = register("prevents_decorated_pot_shattering"); + public static final VanillaTag PREVENTS_ICE_MELTING = register("prevents_ice_melting"); + public static final VanillaTag PREVENTS_INFESTED_SPAWNS = register("prevents_infested_spawns"); + public static final VanillaTag TREASURE = register("treasure"); + public static final VanillaTag NON_TREASURE = register("non_treasure"); + public static final VanillaTag TRADES_DESERT_COMMON = register("trades/desert_common"); + public static final VanillaTag TRADES_JUNGLE_COMMON = register("trades/jungle_common"); + public static final VanillaTag TRADES_PLAINS_COMMON = register("trades/plains_common"); + public static final VanillaTag TRADES_SAVANNA_COMMON = register("trades/savanna_common"); + public static final VanillaTag TRADES_SNOW_COMMON = register("trades/snow_common"); + public static final VanillaTag TRADES_SWAMP_COMMON = register("trades/swamp_common"); + public static final VanillaTag TRADES_TAIGA_COMMON = register("trades/taiga_common"); + public static final VanillaTag TRADES_DESERT_SPECIAL = register("trades/desert_special"); + public static final VanillaTag TRADES_JUNGLE_SPECIAL = register("trades/jungle_special"); + public static final VanillaTag TRADES_PLAINS_SPECIAL = register("trades/plains_special"); + public static final VanillaTag TRADES_SAVANNA_SPECIAL = register("trades/savanna_special"); + public static final VanillaTag TRADES_SNOW_SPECIAL = register("trades/snow_special"); + public static final VanillaTag TRADES_SWAMP_SPECIAL = register("trades/swamp_special"); + public static final VanillaTag TRADES_TAIGA_SPECIAL = register("trades/taiga_special"); - private final int id; + private EnchantmentTag() {} - private EnchantmentTag(String identifier) { - this.id = ALL_ENCHANTMENT_TAGS.size(); - register(identifier, this); - } - - @Override - public int ordinal() { - return id; - } - - private static void register(String name, EnchantmentTag tag) { + private static VanillaTag register(String name) { + Key identifier = MinecraftKey.key(name); + int geyserId = ALL_ENCHANTMENT_TAGS.size(); + VanillaTag tag = new VanillaTag(MinecraftKey.key("enchantment"), identifier, geyserId); ALL_ENCHANTMENT_TAGS.put(MinecraftKey.key(name), tag); + return tag; } } diff --git a/core/src/main/java/org/geysermc/geyser/session/cache/tags/ItemTag.java b/core/src/main/java/org/geysermc/geyser/session/cache/tags/ItemTag.java index a2e861dd6..106348a8f 100644 --- a/core/src/main/java/org/geysermc/geyser/session/cache/tags/ItemTag.java +++ b/core/src/main/java/org/geysermc/geyser/session/cache/tags/ItemTag.java @@ -33,170 +33,164 @@ import java.util.HashMap; import java.util.Map; @SuppressWarnings("unused") -public final class ItemTag implements Ordered { - public static final Map ALL_ITEM_TAGS = new HashMap<>(); +public final class ItemTag { + public static final Map ALL_ITEM_TAGS = new HashMap<>(); - 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"); + public static final VanillaTag WOOL = register("wool"); + public static final VanillaTag PLANKS = register("planks"); + public static final VanillaTag STONE_BRICKS = register("stone_bricks"); + public static final VanillaTag WOODEN_BUTTONS = register("wooden_buttons"); + public static final VanillaTag STONE_BUTTONS = register("stone_buttons"); + public static final VanillaTag BUTTONS = register("buttons"); + public static final VanillaTag WOOL_CARPETS = register("wool_carpets"); + public static final VanillaTag WOODEN_DOORS = register("wooden_doors"); + public static final VanillaTag WOODEN_STAIRS = register("wooden_stairs"); + public static final VanillaTag WOODEN_SLABS = register("wooden_slabs"); + public static final VanillaTag WOODEN_FENCES = register("wooden_fences"); + public static final VanillaTag FENCE_GATES = register("fence_gates"); + public static final VanillaTag WOODEN_PRESSURE_PLATES = register("wooden_pressure_plates"); + public static final VanillaTag WOODEN_TRAPDOORS = register("wooden_trapdoors"); + public static final VanillaTag DOORS = register("doors"); + public static final VanillaTag SAPLINGS = register("saplings"); + public static final VanillaTag LOGS_THAT_BURN = register("logs_that_burn"); + public static final VanillaTag LOGS = register("logs"); + public static final VanillaTag DARK_OAK_LOGS = register("dark_oak_logs"); + public static final VanillaTag OAK_LOGS = register("oak_logs"); + public static final VanillaTag BIRCH_LOGS = register("birch_logs"); + public static final VanillaTag ACACIA_LOGS = register("acacia_logs"); + public static final VanillaTag CHERRY_LOGS = register("cherry_logs"); + public static final VanillaTag JUNGLE_LOGS = register("jungle_logs"); + public static final VanillaTag SPRUCE_LOGS = register("spruce_logs"); + public static final VanillaTag MANGROVE_LOGS = register("mangrove_logs"); + public static final VanillaTag CRIMSON_STEMS = register("crimson_stems"); + public static final VanillaTag WARPED_STEMS = register("warped_stems"); + public static final VanillaTag BAMBOO_BLOCKS = register("bamboo_blocks"); + public static final VanillaTag WART_BLOCKS = register("wart_blocks"); + public static final VanillaTag BANNERS = register("banners"); + public static final VanillaTag SAND = register("sand"); + public static final VanillaTag SMELTS_TO_GLASS = register("smelts_to_glass"); + public static final VanillaTag STAIRS = register("stairs"); + public static final VanillaTag SLABS = register("slabs"); + public static final VanillaTag WALLS = register("walls"); + public static final VanillaTag ANVIL = register("anvil"); + public static final VanillaTag RAILS = register("rails"); + public static final VanillaTag LEAVES = register("leaves"); + public static final VanillaTag TRAPDOORS = register("trapdoors"); + public static final VanillaTag SMALL_FLOWERS = register("small_flowers"); + public static final VanillaTag BEDS = register("beds"); + public static final VanillaTag FENCES = register("fences"); + public static final VanillaTag TALL_FLOWERS = register("tall_flowers"); + public static final VanillaTag FLOWERS = register("flowers"); + public static final VanillaTag PIGLIN_REPELLENTS = register("piglin_repellents"); + public static final VanillaTag PIGLIN_LOVED = register("piglin_loved"); + public static final VanillaTag IGNORED_BY_PIGLIN_BABIES = register("ignored_by_piglin_babies"); + public static final VanillaTag MEAT = register("meat"); + public static final VanillaTag SNIFFER_FOOD = register("sniffer_food"); + public static final VanillaTag PIGLIN_FOOD = register("piglin_food"); + public static final VanillaTag FOX_FOOD = register("fox_food"); + public static final VanillaTag COW_FOOD = register("cow_food"); + public static final VanillaTag GOAT_FOOD = register("goat_food"); + public static final VanillaTag SHEEP_FOOD = register("sheep_food"); + public static final VanillaTag WOLF_FOOD = register("wolf_food"); + public static final VanillaTag CAT_FOOD = register("cat_food"); + public static final VanillaTag HORSE_FOOD = register("horse_food"); + public static final VanillaTag HORSE_TEMPT_ITEMS = register("horse_tempt_items"); + public static final VanillaTag CAMEL_FOOD = register("camel_food"); + public static final VanillaTag ARMADILLO_FOOD = register("armadillo_food"); + public static final VanillaTag BEE_FOOD = register("bee_food"); + public static final VanillaTag CHICKEN_FOOD = register("chicken_food"); + public static final VanillaTag FROG_FOOD = register("frog_food"); + public static final VanillaTag HOGLIN_FOOD = register("hoglin_food"); + public static final VanillaTag LLAMA_FOOD = register("llama_food"); + public static final VanillaTag LLAMA_TEMPT_ITEMS = register("llama_tempt_items"); + public static final VanillaTag OCELOT_FOOD = register("ocelot_food"); + public static final VanillaTag PANDA_FOOD = register("panda_food"); + public static final VanillaTag PIG_FOOD = register("pig_food"); + public static final VanillaTag RABBIT_FOOD = register("rabbit_food"); + public static final VanillaTag STRIDER_FOOD = register("strider_food"); + public static final VanillaTag STRIDER_TEMPT_ITEMS = register("strider_tempt_items"); + public static final VanillaTag TURTLE_FOOD = register("turtle_food"); + public static final VanillaTag PARROT_FOOD = register("parrot_food"); + public static final VanillaTag PARROT_POISONOUS_FOOD = register("parrot_poisonous_food"); + public static final VanillaTag AXOLOTL_FOOD = register("axolotl_food"); + public static final VanillaTag GOLD_ORES = register("gold_ores"); + public static final VanillaTag IRON_ORES = register("iron_ores"); + public static final VanillaTag DIAMOND_ORES = register("diamond_ores"); + public static final VanillaTag REDSTONE_ORES = register("redstone_ores"); + public static final VanillaTag LAPIS_ORES = register("lapis_ores"); + public static final VanillaTag COAL_ORES = register("coal_ores"); + public static final VanillaTag EMERALD_ORES = register("emerald_ores"); + public static final VanillaTag COPPER_ORES = register("copper_ores"); + public static final VanillaTag NON_FLAMMABLE_WOOD = register("non_flammable_wood"); + public static final VanillaTag SOUL_FIRE_BASE_BLOCKS = register("soul_fire_base_blocks"); + public static final VanillaTag CANDLES = register("candles"); + public static final VanillaTag DIRT = register("dirt"); + public static final VanillaTag TERRACOTTA = register("terracotta"); + public static final VanillaTag COMPLETES_FIND_TREE_TUTORIAL = register("completes_find_tree_tutorial"); + public static final VanillaTag BOATS = register("boats"); + public static final VanillaTag CHEST_BOATS = register("chest_boats"); + public static final VanillaTag FISHES = register("fishes"); + public static final VanillaTag SIGNS = register("signs"); + public static final VanillaTag CREEPER_DROP_MUSIC_DISCS = register("creeper_drop_music_discs"); + public static final VanillaTag COALS = register("coals"); + public static final VanillaTag ARROWS = register("arrows"); + public static final VanillaTag LECTERN_BOOKS = register("lectern_books"); + public static final VanillaTag BOOKSHELF_BOOKS = register("bookshelf_books"); + public static final VanillaTag BEACON_PAYMENT_ITEMS = register("beacon_payment_items"); + public static final VanillaTag STONE_TOOL_MATERIALS = register("stone_tool_materials"); + public static final VanillaTag STONE_CRAFTING_MATERIALS = register("stone_crafting_materials"); + public static final VanillaTag FREEZE_IMMUNE_WEARABLES = register("freeze_immune_wearables"); + public static final VanillaTag DAMPENS_VIBRATIONS = register("dampens_vibrations"); + public static final VanillaTag CLUSTER_MAX_HARVESTABLES = register("cluster_max_harvestables"); + public static final VanillaTag COMPASSES = register("compasses"); + public static final VanillaTag HANGING_SIGNS = register("hanging_signs"); + public static final VanillaTag CREEPER_IGNITERS = register("creeper_igniters"); + public static final VanillaTag NOTEBLOCK_TOP_INSTRUMENTS = register("noteblock_top_instruments"); + public static final VanillaTag FOOT_ARMOR = register("foot_armor"); + public static final VanillaTag LEG_ARMOR = register("leg_armor"); + public static final VanillaTag CHEST_ARMOR = register("chest_armor"); + public static final VanillaTag HEAD_ARMOR = register("head_armor"); + public static final VanillaTag SKULLS = register("skulls"); + public static final VanillaTag TRIMMABLE_ARMOR = register("trimmable_armor"); + public static final VanillaTag TRIM_MATERIALS = register("trim_materials"); + public static final VanillaTag TRIM_TEMPLATES = register("trim_templates"); + public static final VanillaTag DECORATED_POT_SHERDS = register("decorated_pot_sherds"); + public static final VanillaTag DECORATED_POT_INGREDIENTS = register("decorated_pot_ingredients"); + public static final VanillaTag SWORDS = register("swords"); + public static final VanillaTag AXES = register("axes"); + public static final VanillaTag HOES = register("hoes"); + public static final VanillaTag PICKAXES = register("pickaxes"); + public static final VanillaTag SHOVELS = register("shovels"); + public static final VanillaTag BREAKS_DECORATED_POTS = register("breaks_decorated_pots"); + public static final VanillaTag VILLAGER_PLANTABLE_SEEDS = register("villager_plantable_seeds"); + public static final VanillaTag DYEABLE = register("dyeable"); + public static final VanillaTag ENCHANTABLE_FOOT_ARMOR = register("enchantable/foot_armor"); + public static final VanillaTag ENCHANTABLE_LEG_ARMOR = register("enchantable/leg_armor"); + public static final VanillaTag ENCHANTABLE_CHEST_ARMOR = register("enchantable/chest_armor"); + public static final VanillaTag ENCHANTABLE_HEAD_ARMOR = register("enchantable/head_armor"); + public static final VanillaTag ENCHANTABLE_ARMOR = register("enchantable/armor"); + public static final VanillaTag ENCHANTABLE_SWORD = register("enchantable/sword"); + public static final VanillaTag ENCHANTABLE_FIRE_ASPECT = register("enchantable/fire_aspect"); + public static final VanillaTag ENCHANTABLE_SHARP_WEAPON = register("enchantable/sharp_weapon"); + public static final VanillaTag ENCHANTABLE_WEAPON = register("enchantable/weapon"); + public static final VanillaTag ENCHANTABLE_MINING = register("enchantable/mining"); + public static final VanillaTag ENCHANTABLE_MINING_LOOT = register("enchantable/mining_loot"); + public static final VanillaTag ENCHANTABLE_FISHING = register("enchantable/fishing"); + public static final VanillaTag ENCHANTABLE_TRIDENT = register("enchantable/trident"); + public static final VanillaTag ENCHANTABLE_DURABILITY = register("enchantable/durability"); + public static final VanillaTag ENCHANTABLE_BOW = register("enchantable/bow"); + public static final VanillaTag ENCHANTABLE_EQUIPPABLE = register("enchantable/equippable"); + public static final VanillaTag ENCHANTABLE_CROSSBOW = register("enchantable/crossbow"); + public static final VanillaTag ENCHANTABLE_VANISHING = register("enchantable/vanishing"); + public static final VanillaTag ENCHANTABLE_MACE = register("enchantable/mace"); - private final int id; - - private ItemTag(String identifier) { - this.id = ALL_ITEM_TAGS.size(); - register(identifier, this); - } + private ItemTag() {} - @Override - public int ordinal() { - return id; - } - - private static void register(String name, ItemTag tag) { + private static VanillaTag register(String name) { + Key identifier = MinecraftKey.key(name); + int geyserId = ALL_ITEM_TAGS.size(); + VanillaTag tag = new VanillaTag(MinecraftKey.key("item"), identifier, geyserId); ALL_ITEM_TAGS.put(MinecraftKey.key(name), tag); + return tag; } } diff --git a/core/src/main/java/org/geysermc/geyser/session/cache/tags/NonVanillaTag.java b/core/src/main/java/org/geysermc/geyser/session/cache/tags/NonVanillaTag.java new file mode 100644 index 000000000..64bd04f85 --- /dev/null +++ b/core/src/main/java/org/geysermc/geyser/session/cache/tags/NonVanillaTag.java @@ -0,0 +1,32 @@ +/* + * 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; + +public record NonVanillaTag(Key registry, Key tag) implements Tag { + +} diff --git a/core/src/main/java/org/geysermc/geyser/session/cache/tags/Tag.java b/core/src/main/java/org/geysermc/geyser/session/cache/tags/Tag.java new file mode 100644 index 000000000..cebb5a077 --- /dev/null +++ b/core/src/main/java/org/geysermc/geyser/session/cache/tags/Tag.java @@ -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; + +public interface Tag { + + Key registry(); + + Key tag(); +} diff --git a/core/src/main/java/org/geysermc/geyser/session/cache/tags/VanillaTag.java b/core/src/main/java/org/geysermc/geyser/session/cache/tags/VanillaTag.java new file mode 100644 index 000000000..48c6089d7 --- /dev/null +++ b/core/src/main/java/org/geysermc/geyser/session/cache/tags/VanillaTag.java @@ -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(Key registry, Key tag, int geyserId) implements Ordered, Tag { + + @Override + public int ordinal() { + return geyserId; + } +} From 5ec330d0b1c092c87881de60032536bee5ef3489 Mon Sep 17 00:00:00 2001 From: Eclipse Date: Wed, 10 Jul 2024 08:45:28 +0000 Subject: [PATCH 02/12] Continue work on new tag system, closer to testing now --- .../type/living/animal/AnimalEntity.java | 10 +- .../type/living/animal/ArmadilloEntity.java | 9 +- .../type/living/animal/AxolotlEntity.java | 7 +- .../entity/type/living/animal/BeeEntity.java | 7 +- .../type/living/animal/ChickenEntity.java | 7 +- .../entity/type/living/animal/CowEntity.java | 7 +- .../entity/type/living/animal/FoxEntity.java | 7 +- .../entity/type/living/animal/FrogEntity.java | 9 +- .../entity/type/living/animal/GoatEntity.java | 7 +- .../type/living/animal/HoglinEntity.java | 7 +- .../type/living/animal/OcelotEntity.java | 7 +- .../type/living/animal/PandaEntity.java | 7 +- .../entity/type/living/animal/PigEntity.java | 7 +- .../type/living/animal/PolarBearEntity.java | 8 +- .../type/living/animal/RabbitEntity.java | 7 +- .../type/living/animal/SheepEntity.java | 7 +- .../type/living/animal/SnifferEntity.java | 7 +- .../type/living/animal/StriderEntity.java | 7 +- .../type/living/animal/TurtleEntity.java | 7 +- .../animal/horse/AbstractHorseEntity.java | 7 +- .../type/living/animal/horse/CamelEntity.java | 7 +- .../type/living/animal/horse/LlamaEntity.java | 7 +- .../living/animal/tameable/CatEntity.java | 7 +- .../living/animal/tameable/ParrotEntity.java | 9 +- .../living/animal/tameable/WolfEntity.java | 11 +- .../updater/AnvilInventoryUpdater.java | 8 +- .../geyser/session/cache/TagCache.java | 75 ++-- .../geyser/session/cache/tags/BlockTag.java | 380 +++++++++--------- .../session/cache/tags/EnchantmentTag.java | 84 ++-- .../geyser/session/cache/tags/ItemTag.java | 306 +++++++------- .../session/cache/tags/NonVanillaTag.java | 2 +- .../geyser/session/cache/tags/Tag.java | 6 +- .../session/cache/tags/TagRegistry.java | 57 +++ .../geyser/session/cache/tags/VanillaTag.java | 2 +- 34 files changed, 565 insertions(+), 544 deletions(-) create mode 100644 core/src/main/java/org/geysermc/geyser/session/cache/tags/TagRegistry.java diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/AnimalEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/AnimalEntity.java index cc3e69d43..07b680d68 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/AnimalEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/AnimalEntity.java @@ -25,6 +25,7 @@ package org.geysermc.geyser.entity.type.living.animal; +import java.util.UUID; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.math.vector.Vector3f; @@ -34,14 +35,11 @@ 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.VanillaTag; +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; -import java.util.UUID; - public abstract class AnimalEntity extends AgeableEntity { public AnimalEntity(GeyserSession session, int entityId, long geyserId, UUID uuid, EntityDefinition definition, Vector3f position, Vector3f motion, float yaw, float pitch, float headYaw) { @@ -49,7 +47,7 @@ public abstract class AnimalEntity extends AgeableEntity { } protected final boolean canEat(GeyserItemStack itemStack) { - VanillaTag tag = getFoodTag(); + Tag tag = getFoodTag(); if (tag == null) { return false; } @@ -59,7 +57,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 VanillaTag getFoodTag(); + protected abstract @Nullable Tag getFoodTag(); @NonNull @Override diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/ArmadilloEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/ArmadilloEntity.java index b044e5785..93c58db99 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/ArmadilloEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/ArmadilloEntity.java @@ -25,18 +25,17 @@ package org.geysermc.geyser.entity.type.living.animal; +import java.util.UUID; +import java.util.concurrent.TimeUnit; 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.VanillaTag; +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; -import java.util.UUID; -import java.util.concurrent.TimeUnit; - public class ArmadilloEntity extends AnimalEntity { private ArmadilloState armadilloState = ArmadilloState.IDLE; @@ -76,7 +75,7 @@ public class ArmadilloEntity extends AnimalEntity { @Override @Nullable - protected VanillaTag getFoodTag() { + protected Tag getFoodTag() { return ItemTag.ARMADILLO_FOOD; } } diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/AxolotlEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/AxolotlEntity.java index 12c56d0d5..c5d73b175 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/AxolotlEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/AxolotlEntity.java @@ -25,6 +25,7 @@ package org.geysermc.geyser.entity.type.living.animal; +import java.util.UUID; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.math.vector.Vector3f; @@ -34,15 +35,13 @@ 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.VanillaTag; +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; import org.geysermc.mcprotocollib.protocol.data.game.entity.metadata.type.IntEntityMetadata; import org.geysermc.mcprotocollib.protocol.data.game.entity.player.Hand; -import java.util.UUID; - public class AxolotlEntity extends AnimalEntity { public AxolotlEntity(GeyserSession session, int entityId, long geyserId, UUID uuid, EntityDefinition definition, Vector3f position, Vector3f motion, float yaw, float pitch, float headYaw) { super(session, entityId, geyserId, uuid, definition, position, motion, yaw, pitch, headYaw); @@ -63,7 +62,7 @@ public class AxolotlEntity extends AnimalEntity { @Override @Nullable - protected VanillaTag getFoodTag() { + protected Tag getFoodTag() { return ItemTag.AXOLOTL_FOOD; } diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/BeeEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/BeeEntity.java index 06fd7111f..bd6f016ea 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/BeeEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/BeeEntity.java @@ -25,6 +25,7 @@ package org.geysermc.geyser.entity.type.living.animal; +import java.util.UUID; import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.math.vector.Vector3f; import org.cloudburstmc.protocol.bedrock.data.entity.EntityDataTypes; @@ -34,12 +35,10 @@ 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.VanillaTag; +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; -import java.util.UUID; - public class BeeEntity extends AnimalEntity { public BeeEntity(GeyserSession session, int entityId, long geyserId, UUID uuid, EntityDefinition definition, Vector3f position, Vector3f motion, float yaw, float pitch, float headYaw) { @@ -70,7 +69,7 @@ public class BeeEntity extends AnimalEntity { @Override @Nullable - protected VanillaTag getFoodTag() { + protected Tag getFoodTag() { return ItemTag.BEE_FOOD; } } diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/ChickenEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/ChickenEntity.java index 71755809a..824295d74 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/ChickenEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/ChickenEntity.java @@ -25,14 +25,13 @@ package org.geysermc.geyser.entity.type.living.animal; +import java.util.UUID; 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 java.util.UUID; -import org.geysermc.geyser.session.cache.tags.VanillaTag; +import org.geysermc.geyser.session.cache.tags.Tag; public class ChickenEntity extends AnimalEntity { @@ -42,7 +41,7 @@ public class ChickenEntity extends AnimalEntity { @Override @Nullable - protected VanillaTag getFoodTag() { + protected Tag getFoodTag() { return ItemTag.CHICKEN_FOOD; } } diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/CowEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/CowEntity.java index 2a3206abd..a504f2aec 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/CowEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/CowEntity.java @@ -25,6 +25,7 @@ package org.geysermc.geyser.entity.type.living.animal; +import java.util.UUID; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.math.vector.Vector3f; @@ -35,13 +36,11 @@ 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.VanillaTag; +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; -import java.util.UUID; - public class CowEntity extends AnimalEntity { public CowEntity(GeyserSession session, int entityId, long geyserId, UUID uuid, EntityDefinition definition, Vector3f position, Vector3f motion, float yaw, float pitch, float headYaw) { super(session, entityId, geyserId, uuid, definition, position, motion, yaw, pitch, headYaw); @@ -70,7 +69,7 @@ public class CowEntity extends AnimalEntity { @Override @Nullable - protected VanillaTag getFoodTag() { + protected Tag getFoodTag() { return ItemTag.COW_FOOD; } } diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/FoxEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/FoxEntity.java index 4acda556f..2c26707c2 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/FoxEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/FoxEntity.java @@ -25,6 +25,7 @@ package org.geysermc.geyser.entity.type.living.animal; +import java.util.UUID; import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.math.vector.Vector3f; import org.cloudburstmc.protocol.bedrock.data.entity.EntityDataTypes; @@ -32,12 +33,10 @@ 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.VanillaTag; +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; -import java.util.UUID; - public class FoxEntity extends AnimalEntity { public FoxEntity(GeyserSession session, int entityId, long geyserId, UUID uuid, EntityDefinition definition, Vector3f position, Vector3f motion, float yaw, float pitch, float headYaw) { @@ -58,7 +57,7 @@ public class FoxEntity extends AnimalEntity { @Override @Nullable - protected VanillaTag getFoodTag() { + protected Tag getFoodTag() { return ItemTag.FOX_FOOD; } } diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/FrogEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/FrogEntity.java index 933b7b431..9a9083ff5 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/FrogEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/FrogEntity.java @@ -25,6 +25,8 @@ package org.geysermc.geyser.entity.type.living.animal; +import java.util.OptionalInt; +import java.util.UUID; import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.math.vector.Vector3f; import org.cloudburstmc.protocol.bedrock.data.entity.EntityDataTypes; @@ -33,14 +35,11 @@ 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.VanillaTag; +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; -import java.util.OptionalInt; -import java.util.UUID; - public class FrogEntity extends AnimalEntity { public FrogEntity(GeyserSession session, int entityId, long geyserId, UUID uuid, EntityDefinition definition, Vector3f position, Vector3f motion, float yaw, float pitch, float headYaw) { super(session, entityId, geyserId, uuid, definition, position, motion, yaw, pitch, headYaw); @@ -78,7 +77,7 @@ public class FrogEntity extends AnimalEntity { @Override @Nullable - protected VanillaTag getFoodTag() { + protected Tag getFoodTag() { return ItemTag.FROG_FOOD; } } diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/GoatEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/GoatEntity.java index f43cb5e58..260dd4b30 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/GoatEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/GoatEntity.java @@ -25,6 +25,7 @@ package org.geysermc.geyser.entity.type.living.animal; +import java.util.UUID; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.math.vector.Vector3f; @@ -36,14 +37,12 @@ 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.VanillaTag; +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; import org.geysermc.mcprotocollib.protocol.data.game.entity.player.Hand; -import java.util.UUID; - public class GoatEntity extends AnimalEntity { private static final float LONG_JUMPING_HEIGHT = 1.3f * 0.7f; private static final float LONG_JUMPING_WIDTH = 0.9f * 0.7f; @@ -100,7 +99,7 @@ public class GoatEntity extends AnimalEntity { @Override @Nullable - protected VanillaTag getFoodTag() { + protected Tag getFoodTag() { return ItemTag.GOAT_FOOD; } } diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/HoglinEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/HoglinEntity.java index 7e0c344d7..7daff1143 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/HoglinEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/HoglinEntity.java @@ -25,6 +25,7 @@ package org.geysermc.geyser.entity.type.living.animal; +import java.util.UUID; import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.math.vector.Vector3f; import org.cloudburstmc.protocol.bedrock.data.entity.EntityDataTypes; @@ -32,11 +33,9 @@ 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.VanillaTag; +import org.geysermc.geyser.session.cache.tags.Tag; import org.geysermc.mcprotocollib.protocol.data.game.entity.metadata.type.BooleanEntityMetadata; -import java.util.UUID; - public class HoglinEntity extends AnimalEntity { private boolean isImmuneToZombification; @@ -59,7 +58,7 @@ public class HoglinEntity extends AnimalEntity { @Override @Nullable - protected VanillaTag getFoodTag() { + protected Tag getFoodTag() { return ItemTag.HOGLIN_FOOD; } diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/OcelotEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/OcelotEntity.java index 4de01b856..e0a330dc1 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/OcelotEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/OcelotEntity.java @@ -25,6 +25,7 @@ package org.geysermc.geyser.entity.type.living.animal; +import java.util.UUID; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.math.vector.Vector3f; @@ -33,13 +34,11 @@ 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.VanillaTag; +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; -import java.util.UUID; - public class OcelotEntity extends AnimalEntity { public OcelotEntity(GeyserSession session, int entityId, long geyserId, UUID uuid, EntityDefinition definition, Vector3f position, Vector3f motion, float yaw, float pitch, float headYaw) { @@ -48,7 +47,7 @@ public class OcelotEntity extends AnimalEntity { @Override @Nullable - protected VanillaTag getFoodTag() { + protected Tag getFoodTag() { return ItemTag.OCELOT_FOOD; } diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/PandaEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/PandaEntity.java index f5779e60b..cb0d45953 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/PandaEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/PandaEntity.java @@ -25,6 +25,7 @@ package org.geysermc.geyser.entity.type.living.animal; +import java.util.UUID; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.math.vector.Vector3f; @@ -36,15 +37,13 @@ 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.VanillaTag; +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; import org.geysermc.mcprotocollib.protocol.data.game.entity.metadata.type.IntEntityMetadata; import org.geysermc.mcprotocollib.protocol.data.game.entity.player.Hand; -import java.util.UUID; - public class PandaEntity extends AnimalEntity { private Gene mainGene = Gene.NORMAL; private Gene hiddenGene = Gene.NORMAL; @@ -91,7 +90,7 @@ public class PandaEntity extends AnimalEntity { @Override @Nullable - protected VanillaTag getFoodTag() { + protected Tag getFoodTag() { return ItemTag.PANDA_FOOD; } diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/PigEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/PigEntity.java index 8fa1760ce..13fb07110 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/PigEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/PigEntity.java @@ -25,6 +25,7 @@ package org.geysermc.geyser.entity.type.living.animal; +import java.util.UUID; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.math.vector.Vector3f; @@ -33,14 +34,12 @@ 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.VanillaTag; +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; import org.geysermc.mcprotocollib.protocol.data.game.entity.player.Hand; -import java.util.UUID; - public class PigEntity extends AnimalEntity { public PigEntity(GeyserSession session, int entityId, long geyserId, UUID uuid, EntityDefinition definition, Vector3f position, Vector3f motion, float yaw, float pitch, float headYaw) { @@ -49,7 +48,7 @@ public class PigEntity extends AnimalEntity { @Override @Nullable - protected VanillaTag getFoodTag() { + protected Tag getFoodTag() { return ItemTag.PIG_FOOD; } diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/PolarBearEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/PolarBearEntity.java index 6db94cfe7..ec77a6378 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/PolarBearEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/PolarBearEntity.java @@ -25,14 +25,12 @@ package org.geysermc.geyser.entity.type.living.animal; +import java.util.UUID; 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 java.util.UUID; -import org.geysermc.geyser.session.cache.tags.VanillaTag; +import org.geysermc.geyser.session.cache.tags.Tag; public class PolarBearEntity extends AnimalEntity { @@ -42,7 +40,7 @@ public class PolarBearEntity extends AnimalEntity { @Override @Nullable - protected VanillaTag getFoodTag() { + protected Tag getFoodTag() { return null; } } diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/RabbitEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/RabbitEntity.java index f1b8485ba..7afa3ad50 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/RabbitEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/RabbitEntity.java @@ -25,6 +25,7 @@ package org.geysermc.geyser.entity.type.living.animal; +import java.util.UUID; import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.math.vector.Vector3f; import org.cloudburstmc.protocol.bedrock.data.entity.EntityDataTypes; @@ -32,11 +33,9 @@ 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.VanillaTag; +import org.geysermc.geyser.session.cache.tags.Tag; import org.geysermc.mcprotocollib.protocol.data.game.entity.metadata.type.IntEntityMetadata; -import java.util.UUID; - public class RabbitEntity extends AnimalEntity { public RabbitEntity(GeyserSession session, int entityId, long geyserId, UUID uuid, EntityDefinition definition, Vector3f position, Vector3f motion, float yaw, float pitch, float headYaw) { @@ -69,7 +68,7 @@ public class RabbitEntity extends AnimalEntity { @Override @Nullable - protected VanillaTag getFoodTag() { + protected Tag getFoodTag() { return ItemTag.RABBIT_FOOD; } } diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/SheepEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/SheepEntity.java index dfb2be072..01792778c 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/SheepEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/SheepEntity.java @@ -25,6 +25,7 @@ package org.geysermc.geyser.entity.type.living.animal; +import java.util.UUID; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.math.vector.Vector3f; @@ -36,14 +37,12 @@ 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.VanillaTag; +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; import org.geysermc.mcprotocollib.protocol.data.game.entity.player.Hand; -import java.util.UUID; - public class SheepEntity extends AnimalEntity { private int color; @@ -60,7 +59,7 @@ public class SheepEntity extends AnimalEntity { @Override @Nullable - protected VanillaTag getFoodTag() { + protected Tag getFoodTag() { return ItemTag.SHEEP_FOOD; } diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/SnifferEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/SnifferEntity.java index 8393ca3fe..062ce789b 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/SnifferEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/SnifferEntity.java @@ -25,6 +25,7 @@ package org.geysermc.geyser.entity.type.living.animal; +import java.util.UUID; import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.math.vector.Vector3f; import org.cloudburstmc.protocol.bedrock.data.LevelEvent; @@ -37,13 +38,11 @@ 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.VanillaTag; +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; -import java.util.UUID; - public class SnifferEntity extends AnimalEntity implements Tickable { private static final float DIGGING_HEIGHT = EntityDefinitions.SNIFFER.height() - 0.4f; private static final int DIG_END = 120; @@ -74,7 +73,7 @@ public class SnifferEntity extends AnimalEntity implements Tickable { @Override @Nullable - protected VanillaTag getFoodTag() { + protected Tag getFoodTag() { return ItemTag.SNIFFER_FOOD; } diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/StriderEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/StriderEntity.java index ef351ed9b..697e92f8a 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/StriderEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/StriderEntity.java @@ -25,6 +25,7 @@ package org.geysermc.geyser.entity.type.living.animal; +import java.util.UUID; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.math.vector.Vector3f; @@ -34,15 +35,13 @@ 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.VanillaTag; +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; import org.geysermc.mcprotocollib.protocol.data.game.entity.metadata.type.BooleanEntityMetadata; import org.geysermc.mcprotocollib.protocol.data.game.entity.player.Hand; -import java.util.UUID; - public class StriderEntity extends AnimalEntity { private boolean isCold = false; @@ -96,7 +95,7 @@ public class StriderEntity extends AnimalEntity { @Override @Nullable - protected VanillaTag getFoodTag() { + protected Tag getFoodTag() { return ItemTag.STRIDER_FOOD; } diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/TurtleEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/TurtleEntity.java index 41754c611..d0ab7f948 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/TurtleEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/TurtleEntity.java @@ -25,17 +25,16 @@ package org.geysermc.geyser.entity.type.living.animal; +import java.util.UUID; import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.math.vector.Vector3f; 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.VanillaTag; +import org.geysermc.geyser.session.cache.tags.Tag; import org.geysermc.mcprotocollib.protocol.data.game.entity.metadata.type.BooleanEntityMetadata; -import java.util.UUID; - public class TurtleEntity extends AnimalEntity { public TurtleEntity(GeyserSession session, int entityId, long geyserId, UUID uuid, EntityDefinition definition, Vector3f position, Vector3f motion, float yaw, float pitch, float headYaw) { @@ -52,7 +51,7 @@ public class TurtleEntity extends AnimalEntity { @Override @Nullable - protected VanillaTag getFoodTag() { + protected Tag getFoodTag() { return ItemTag.TURTLE_FOOD; } diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/horse/AbstractHorseEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/horse/AbstractHorseEntity.java index 4867b54c6..0d8a90c4f 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/horse/AbstractHorseEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/horse/AbstractHorseEntity.java @@ -25,6 +25,7 @@ package org.geysermc.geyser.entity.type.living.animal.horse; +import java.util.UUID; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.math.vector.Vector3f; @@ -41,14 +42,12 @@ 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.VanillaTag; +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; import org.geysermc.mcprotocollib.protocol.data.game.entity.player.Hand; -import java.util.UUID; - public class AbstractHorseEntity extends AnimalEntity { public AbstractHorseEntity(GeyserSession session, int entityId, long geyserId, UUID uuid, EntityDefinition definition, Vector3f position, Vector3f motion, float yaw, float pitch, float headYaw) { @@ -120,7 +119,7 @@ public class AbstractHorseEntity extends AnimalEntity { @Override @Nullable - protected VanillaTag getFoodTag() { + protected Tag getFoodTag() { return ItemTag.HORSE_FOOD; } diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/horse/CamelEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/horse/CamelEntity.java index 6e695d368..32af43866 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/horse/CamelEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/horse/CamelEntity.java @@ -25,6 +25,7 @@ package org.geysermc.geyser.entity.type.living.animal.horse; +import java.util.UUID; import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.math.vector.Vector3f; import org.cloudburstmc.protocol.bedrock.data.entity.EntityDataTypes; @@ -35,13 +36,11 @@ 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.VanillaTag; +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; -import java.util.UUID; - public class CamelEntity extends AbstractHorseEntity { public static final float SITTING_HEIGHT_DIFFERENCE = 1.43F; @@ -91,7 +90,7 @@ public class CamelEntity extends AbstractHorseEntity { } @Override - protected @Nullable VanillaTag getFoodTag() { + protected @Nullable Tag getFoodTag() { return ItemTag.CAMEL_FOOD; } diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/horse/LlamaEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/horse/LlamaEntity.java index d53fae729..c73ffdde9 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/horse/LlamaEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/horse/LlamaEntity.java @@ -25,6 +25,7 @@ package org.geysermc.geyser.entity.type.living.animal.horse; +import java.util.UUID; import lombok.Getter; import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.math.vector.Vector3f; @@ -32,12 +33,10 @@ 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.VanillaTag; +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; -import java.util.UUID; - public class LlamaEntity extends ChestedHorseEntity { /** * Used to calculate inventory size @@ -57,7 +56,7 @@ public class LlamaEntity extends ChestedHorseEntity { } @Override - protected @Nullable VanillaTag getFoodTag() { + protected @Nullable Tag getFoodTag() { return ItemTag.LLAMA_FOOD; } } diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/tameable/CatEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/tameable/CatEntity.java index 4cf89bd9e..5abf096ce 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/tameable/CatEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/tameable/CatEntity.java @@ -25,6 +25,7 @@ package org.geysermc.geyser.entity.type.living.animal.tameable; +import java.util.UUID; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.math.vector.Vector3f; @@ -34,7 +35,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.VanillaTag; +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; @@ -42,8 +43,6 @@ import org.geysermc.mcprotocollib.protocol.data.game.entity.metadata.type.ByteEn import org.geysermc.mcprotocollib.protocol.data.game.entity.metadata.type.IntEntityMetadata; import org.geysermc.mcprotocollib.protocol.data.game.entity.player.Hand; -import java.util.UUID; - public class CatEntity extends TameableEntity { private byte collarColor = 14; // Red - default @@ -110,7 +109,7 @@ public class CatEntity extends TameableEntity { } @Override - protected @Nullable VanillaTag getFoodTag() { + protected @Nullable Tag getFoodTag() { return ItemTag.CAT_FOOD; } diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/tameable/ParrotEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/tameable/ParrotEntity.java index 9a36ac0ed..c170da413 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/tameable/ParrotEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/tameable/ParrotEntity.java @@ -25,6 +25,8 @@ package org.geysermc.geyser.entity.type.living.animal.tameable; +import java.util.Set; +import java.util.UUID; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.math.vector.Vector3f; @@ -35,14 +37,11 @@ import org.geysermc.geyser.item.Items; 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.VanillaTag; +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; -import java.util.Set; -import java.util.UUID; - public class ParrotEntity extends TameableEntity { // Note: is the same as chicken. Reuse? private static final Set TAMING_FOOD = Set.of(Items.WHEAT_SEEDS, Items.MELON_SEEDS, Items.PUMPKIN_SEEDS, Items.BEETROOT_SEEDS); @@ -53,7 +52,7 @@ public class ParrotEntity extends TameableEntity { @Override @Nullable - protected VanillaTag getFoodTag() { + protected Tag getFoodTag() { return null; } diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/tameable/WolfEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/tameable/WolfEntity.java index 3b9749852..712e9c7a6 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/tameable/WolfEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/tameable/WolfEntity.java @@ -25,6 +25,9 @@ package org.geysermc.geyser.entity.type.living.animal.tameable; +import java.util.Collections; +import java.util.Locale; +import java.util.UUID; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.math.vector.Vector3f; @@ -38,7 +41,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.VanillaTag; +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; @@ -51,10 +54,6 @@ import org.geysermc.mcprotocollib.protocol.data.game.entity.player.GameMode; import org.geysermc.mcprotocollib.protocol.data.game.entity.player.Hand; import org.geysermc.mcprotocollib.protocol.data.game.item.ItemStack; -import java.util.Collections; -import java.util.Locale; -import java.util.UUID; - public class WolfEntity extends TameableEntity { private byte collarColor = 14; // Red - default @@ -117,7 +116,7 @@ public class WolfEntity extends TameableEntity { @Override @Nullable - protected VanillaTag getFoodTag() { + protected Tag getFoodTag() { return ItemTag.WOLF_FOOD; } diff --git a/core/src/main/java/org/geysermc/geyser/inventory/updater/AnvilInventoryUpdater.java b/core/src/main/java/org/geysermc/geyser/inventory/updater/AnvilInventoryUpdater.java index 7afd31cc9..eed9c95d1 100644 --- a/core/src/main/java/org/geysermc/geyser/inventory/updater/AnvilInventoryUpdater.java +++ b/core/src/main/java/org/geysermc/geyser/inventory/updater/AnvilInventoryUpdater.java @@ -42,8 +42,8 @@ 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.session.cache.tags.Tag; +import org.geysermc.geyser.session.cache.tags.TagRegistry; import org.geysermc.geyser.translator.inventory.InventoryTranslator; import org.geysermc.geyser.translator.text.MessageTranslator; import org.geysermc.geyser.util.ItemUtils; @@ -315,11 +315,11 @@ public class AnvilInventoryUpdater extends InventoryUpdater { Enchantment enchantment = entry.getKey(); HolderSet supportedItems = enchantment.supportedItems(); - int[] supportedItemIds = supportedItems.resolve(tagId -> session.getTagCache().get(ItemTag.ALL_ITEM_TAGS.get(tagId))); + int[] supportedItemIds = supportedItems.resolve(tagId -> session.getTagCache().get(Tag.createTag(TagRegistry.ITEM, tagId))); boolean canApply = isEnchantedBook(input) || IntStream.of(supportedItemIds).anyMatch(id -> id == input.getJavaId()); HolderSet exclusiveSet = enchantment.exclusiveSet(); - int[] incompatibleEnchantments = exclusiveSet.resolve(tagId -> session.getTagCache().get(EnchantmentTag.ALL_ENCHANTMENT_TAGS.get(tagId))); + int[] incompatibleEnchantments = exclusiveSet.resolve(tagId -> session.getTagCache().get(Tag.createTag(TagRegistry.ENCHANTMENT, tagId))); for (int i : incompatibleEnchantments) { Enchantment incompatible = session.getRegistryCache().enchantments().byId(i); if (combinedEnchantments.containsKey(incompatible)) { diff --git a/core/src/main/java/org/geysermc/geyser/session/cache/TagCache.java b/core/src/main/java/org/geysermc/geyser/session/cache/TagCache.java index 070085880..12d20e7ba 100644 --- a/core/src/main/java/org/geysermc/geyser/session/cache/TagCache.java +++ b/core/src/main/java/org/geysermc/geyser/session/cache/TagCache.java @@ -25,43 +25,39 @@ package org.geysermc.geyser.session.cache; +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; + import it.unimi.dsi.fastutil.objects.Object2IntMap; import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; import java.util.ArrayList; import java.util.List; +import java.util.Map; +import javax.annotation.ParametersAreNonnullByDefault; import net.kyori.adventure.key.Key; -import org.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.NonVanillaTag; import org.geysermc.geyser.session.cache.tags.Tag; +import org.geysermc.geyser.session.cache.tags.TagRegistry; import org.geysermc.geyser.session.cache.tags.VanillaTag; import org.geysermc.geyser.util.MinecraftKey; import org.geysermc.mcprotocollib.protocol.packet.common.clientbound.ClientboundUpdateTagsPacket; -import javax.annotation.ParametersAreNonnullByDefault; -import java.util.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. */ @ParametersAreNonnullByDefault public final class TagCache { - private final Object2IntMap registryIndexMap = new Object2IntOpenHashMap<>(); private List> tagIndexMaps = new ArrayList<>(); - private int[][][] tags = new int[0][][]; + private int[][][] tags = new int[TagRegistry.values().length][][]; public void loadPacket(GeyserSession session, ClientboundUpdateTagsPacket packet) { - this.registryIndexMap.clear(); - Map> allTags = packet.getTags(); GeyserLogger logger = session.getGeyser().getLogger(); @@ -69,13 +65,16 @@ public final class TagCache { this.tags = new int[allTags.size()][][]; int i = 0; - for (Key registry : allTags.keySet()) { - Map registryTags = allTags.get(registry); - Map vanillaTags = null; + for (Key registryKey : allTags.keySet()) { + TagRegistry registry = TagRegistry.valueOf(registryKey); + if (registry == null) { + GeyserImpl.getInstance().getLogger().debug("Not loading tags for registry " + registryKey + " (registry is not defined in TagRegistry enum)"); + continue; + } - if (registry.equals(MinecraftKey.key("block"))) { - vanillaTags = ALL_BLOCK_TAGS; + Map 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; @@ -83,42 +82,37 @@ public final class TagCache { if (logger.isDebug()) { logger.debug("Emulating post 1.18 block predication logic for " + session.bedrockUsername() + "? " + emulatePost1_18Logic); } - } else if (registry.equals(MinecraftKey.key("item"))) { - vanillaTags = ALL_ITEM_TAGS; - + } 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); } - } else if (registry.equals(MinecraftKey.key("enchantment"))) { - vanillaTags = ALL_ENCHANTMENT_TAGS; } int[][] registryTagsArray = new int[0][]; - this.tagIndexMaps.set(i, loadTags(registryTags, registryTagsArray, vanillaTags)); + this.tagIndexMaps.set(i, loadTags(registryTags, registryTagsArray, registry)); this.tags[i] = registryTagsArray; - this.registryIndexMap.put(registry, i); i++; } } - private Object2IntMap loadTags(Map packetTags, int[][] tags, @Nullable Map vanillaTags) { - List vanillaTagsList = vanillaTags == null ? List.of() : List.copyOf(vanillaTags.keySet()); + private Object2IntMap loadTags(Map packetTags, int[][] tags, TagRegistry registry) { + List vanillaTagKeys = List.copyOf(registry.getVanillaTags().keySet()); + int nonVanillaTagAmount = (int) packetTags.keySet().stream().filter(tag -> !vanillaTagKeys.contains(tag)).count(); - // Using Math.max here because we might have more vanilla tags defined than the server sent us - List tagsBuilder = new ArrayList<>(Math.max(packetTags.size(), vanillaTagsList.size())); + List tagsBuilder = new ArrayList<>(vanillaTagKeys.size() + nonVanillaTagAmount); Object2IntMap tagIndexMap = new Object2IntOpenHashMap<>(); - int tagIndex = vanillaTagsList.size(); + int nonVanillaTagIndex = vanillaTagKeys.size(); for (Map.Entry tag : packetTags.entrySet()) { int id; - if (vanillaTagsList.contains(tag.getKey())) { - id = vanillaTagsList.indexOf(tag.getKey()); + if (vanillaTagKeys.contains(tag.getKey())) { + id = vanillaTagKeys.indexOf(tag.getKey()); } else { - id = tagIndex; - tagIndex++; + id = nonVanillaTagIndex; + nonVanillaTagIndex++; } tagsBuilder.set(id, tag.getValue()); tagIndexMap.put(tag.getKey(), id); @@ -132,6 +126,7 @@ public final class TagCache { * @return true if the block tag is present and contains this block mapping's Java ID. */ public boolean is(Tag tag, Block block) { + assert tag.registry() == TagRegistry.BLOCK; return contains(get(tag), block.javaId()); } @@ -139,6 +134,7 @@ public final class TagCache { * @return true if the item tag is present and contains this item stack's Java ID. */ public boolean is(Tag tag, GeyserItemStack itemStack) { + assert tag.registry() == TagRegistry.ITEM; return is(tag, itemStack.asItem()); } @@ -146,20 +142,17 @@ public final class TagCache { * @return true if the item tag is present and contains this item's Java ID. */ public boolean is(Tag tag, Item item) { + assert tag.registry() == TagRegistry.ITEM; return contains(get(tag), item.javaId()); } public int[] get(Tag tag) { - if (!this.registryIndexMap.containsKey(tag.registry())) { - return new int[0]; - } - if (tag instanceof VanillaTag vanillaTag) { - return this.tags[this.registryIndexMap.getInt(tag.registry())][vanillaTag.ordinal()]; + return this.tags[tag.registry().ordinal()][vanillaTag.ordinal()]; } - int registryIndex = this.registryIndexMap.getInt(tag.registry()); - Object2IntMap tagIndexMap = tagIndexMaps.get(registryIndex); + int registryIndex = tag.registry().ordinal(); + Object2IntMap tagIndexMap = this.tagIndexMaps.get(registryIndex); if (!tagIndexMap.containsKey(tag.tag())) { return new int[0]; } diff --git a/core/src/main/java/org/geysermc/geyser/session/cache/tags/BlockTag.java b/core/src/main/java/org/geysermc/geyser/session/cache/tags/BlockTag.java index 7d735ec0d..093ac1a70 100644 --- a/core/src/main/java/org/geysermc/geyser/session/cache/tags/BlockTag.java +++ b/core/src/main/java/org/geysermc/geyser/session/cache/tags/BlockTag.java @@ -25,208 +25,206 @@ package org.geysermc.geyser.session.cache.tags; +import java.util.HashMap; +import java.util.Map; import net.kyori.adventure.key.Key; import org.geysermc.geyser.util.MinecraftKey; -import java.util.HashMap; -import java.util.Map; - @SuppressWarnings("unused") -// TODO rename to vanillablocktags public final class BlockTag { - public static final Map ALL_BLOCK_TAGS = new HashMap<>(); + public static final Map ALL_BLOCK_TAGS = new HashMap<>(); - public static final VanillaTag WOOL = register("wool"); - public static final VanillaTag PLANKS = register("planks"); - public static final VanillaTag STONE_BRICKS = register("stone_bricks"); - public static final VanillaTag WOODEN_BUTTONS = register("wooden_buttons"); - public static final VanillaTag STONE_BUTTONS = register("stone_buttons"); - public static final VanillaTag BUTTONS = register("buttons"); - public static final VanillaTag WOOL_CARPETS = register("wool_carpets"); - public static final VanillaTag WOODEN_DOORS = register("wooden_doors"); - public static final VanillaTag MOB_INTERACTABLE_DOORS = register("mob_interactable_doors"); - public static final VanillaTag WOODEN_STAIRS = register("wooden_stairs"); - public static final VanillaTag WOODEN_SLABS = register("wooden_slabs"); - public static final VanillaTag WOODEN_FENCES = register("wooden_fences"); - public static final VanillaTag PRESSURE_PLATES = register("pressure_plates"); - public static final VanillaTag WOODEN_PRESSURE_PLATES = register("wooden_pressure_plates"); - public static final VanillaTag STONE_PRESSURE_PLATES = register("stone_pressure_plates"); - public static final VanillaTag WOODEN_TRAPDOORS = register("wooden_trapdoors"); - public static final VanillaTag DOORS = register("doors"); - public static final VanillaTag SAPLINGS = register("saplings"); - public static final VanillaTag LOGS_THAT_BURN = register("logs_that_burn"); - public static final VanillaTag OVERWORLD_NATURAL_LOGS = register("overworld_natural_logs"); - public static final VanillaTag LOGS = register("logs"); - public static final VanillaTag DARK_OAK_LOGS = register("dark_oak_logs"); - public static final VanillaTag OAK_LOGS = register("oak_logs"); - public static final VanillaTag BIRCH_LOGS = register("birch_logs"); - public static final VanillaTag ACACIA_LOGS = register("acacia_logs"); - public static final VanillaTag CHERRY_LOGS = register("cherry_logs"); - public static final VanillaTag JUNGLE_LOGS = register("jungle_logs"); - public static final VanillaTag SPRUCE_LOGS = register("spruce_logs"); - public static final VanillaTag MANGROVE_LOGS = register("mangrove_logs"); - public static final VanillaTag CRIMSON_STEMS = register("crimson_stems"); - public static final VanillaTag WARPED_STEMS = register("warped_stems"); - public static final VanillaTag BAMBOO_BLOCKS = register("bamboo_blocks"); - public static final VanillaTag WART_BLOCKS = register("wart_blocks"); - public static final VanillaTag BANNERS = register("banners"); - public static final VanillaTag SAND = register("sand"); - public static final VanillaTag SMELTS_TO_GLASS = register("smelts_to_glass"); - public static final VanillaTag STAIRS = register("stairs"); - public static final VanillaTag SLABS = register("slabs"); - public static final VanillaTag WALLS = register("walls"); - public static final VanillaTag ANVIL = register("anvil"); - public static final VanillaTag RAILS = register("rails"); - public static final VanillaTag LEAVES = register("leaves"); - public static final VanillaTag TRAPDOORS = register("trapdoors"); - public static final VanillaTag SMALL_FLOWERS = register("small_flowers"); - public static final VanillaTag BEDS = register("beds"); - public static final VanillaTag FENCES = register("fences"); - public static final VanillaTag TALL_FLOWERS = register("tall_flowers"); - public static final VanillaTag FLOWERS = register("flowers"); - public static final VanillaTag PIGLIN_REPELLENTS = register("piglin_repellents"); - public static final VanillaTag GOLD_ORES = register("gold_ores"); - public static final VanillaTag IRON_ORES = register("iron_ores"); - public static final VanillaTag DIAMOND_ORES = register("diamond_ores"); - public static final VanillaTag REDSTONE_ORES = register("redstone_ores"); - public static final VanillaTag LAPIS_ORES = register("lapis_ores"); - public static final VanillaTag COAL_ORES = register("coal_ores"); - public static final VanillaTag EMERALD_ORES = register("emerald_ores"); - public static final VanillaTag COPPER_ORES = register("copper_ores"); - public static final VanillaTag CANDLES = register("candles"); - public static final VanillaTag DIRT = register("dirt"); - public static final VanillaTag TERRACOTTA = register("terracotta"); - public static final VanillaTag BADLANDS_TERRACOTTA = register("badlands_terracotta"); - public static final VanillaTag CONCRETE_POWDER = register("concrete_powder"); - public static final VanillaTag COMPLETES_FIND_TREE_TUTORIAL = register("completes_find_tree_tutorial"); - public static final VanillaTag FLOWER_POTS = register("flower_pots"); - public static final VanillaTag ENDERMAN_HOLDABLE = register("enderman_holdable"); - public static final VanillaTag ICE = register("ice"); - public static final VanillaTag VALID_SPAWN = register("valid_spawn"); - public static final VanillaTag IMPERMEABLE = register("impermeable"); - public static final VanillaTag UNDERWATER_BONEMEALS = register("underwater_bonemeals"); - public static final VanillaTag CORAL_BLOCKS = register("coral_blocks"); - public static final VanillaTag WALL_CORALS = register("wall_corals"); - public static final VanillaTag CORAL_PLANTS = register("coral_plants"); - public static final VanillaTag CORALS = register("corals"); - public static final VanillaTag BAMBOO_PLANTABLE_ON = register("bamboo_plantable_on"); - public static final VanillaTag STANDING_SIGNS = register("standing_signs"); - public static final VanillaTag WALL_SIGNS = register("wall_signs"); - public static final VanillaTag SIGNS = register("signs"); - public static final VanillaTag CEILING_HANGING_SIGNS = register("ceiling_hanging_signs"); - public static final VanillaTag WALL_HANGING_SIGNS = register("wall_hanging_signs"); - public static final VanillaTag ALL_HANGING_SIGNS = register("all_hanging_signs"); - public static final VanillaTag ALL_SIGNS = register("all_signs"); - public static final VanillaTag DRAGON_IMMUNE = register("dragon_immune"); - public static final VanillaTag DRAGON_TRANSPARENT = register("dragon_transparent"); - public static final VanillaTag WITHER_IMMUNE = register("wither_immune"); - public static final VanillaTag WITHER_SUMMON_BASE_BLOCKS = register("wither_summon_base_blocks"); - public static final VanillaTag BEEHIVES = register("beehives"); - public static final VanillaTag CROPS = register("crops"); - public static final VanillaTag BEE_GROWABLES = register("bee_growables"); - public static final VanillaTag PORTALS = register("portals"); - public static final VanillaTag FIRE = register("fire"); - public static final VanillaTag NYLIUM = register("nylium"); - public static final VanillaTag BEACON_BASE_BLOCKS = register("beacon_base_blocks"); - public static final VanillaTag SOUL_SPEED_BLOCKS = register("soul_speed_blocks"); - public static final VanillaTag WALL_POST_OVERRIDE = register("wall_post_override"); - public static final VanillaTag CLIMBABLE = register("climbable"); - public static final VanillaTag FALL_DAMAGE_RESETTING = register("fall_damage_resetting"); - public static final VanillaTag SHULKER_BOXES = register("shulker_boxes"); - public static final VanillaTag HOGLIN_REPELLENTS = register("hoglin_repellents"); - public static final VanillaTag SOUL_FIRE_BASE_BLOCKS = register("soul_fire_base_blocks"); - public static final VanillaTag STRIDER_WARM_BLOCKS = register("strider_warm_blocks"); - public static final VanillaTag CAMPFIRES = register("campfires"); - public static final VanillaTag GUARDED_BY_PIGLINS = register("guarded_by_piglins"); - public static final VanillaTag PREVENT_MOB_SPAWNING_INSIDE = register("prevent_mob_spawning_inside"); - public static final VanillaTag FENCE_GATES = register("fence_gates"); - public static final VanillaTag UNSTABLE_BOTTOM_CENTER = register("unstable_bottom_center"); - public static final VanillaTag MUSHROOM_GROW_BLOCK = register("mushroom_grow_block"); - public static final VanillaTag INFINIBURN_OVERWORLD = register("infiniburn_overworld"); - public static final VanillaTag INFINIBURN_NETHER = register("infiniburn_nether"); - public static final VanillaTag INFINIBURN_END = register("infiniburn_end"); - public static final VanillaTag BASE_STONE_OVERWORLD = register("base_stone_overworld"); - public static final VanillaTag STONE_ORE_REPLACEABLES = register("stone_ore_replaceables"); - public static final VanillaTag DEEPSLATE_ORE_REPLACEABLES = register("deepslate_ore_replaceables"); - public static final VanillaTag BASE_STONE_NETHER = register("base_stone_nether"); - public static final VanillaTag OVERWORLD_CARVER_REPLACEABLES = register("overworld_carver_replaceables"); - public static final VanillaTag NETHER_CARVER_REPLACEABLES = register("nether_carver_replaceables"); - public static final VanillaTag CANDLE_CAKES = register("candle_cakes"); - public static final VanillaTag CAULDRONS = register("cauldrons"); - public static final VanillaTag CRYSTAL_SOUND_BLOCKS = register("crystal_sound_blocks"); - public static final VanillaTag INSIDE_STEP_SOUND_BLOCKS = register("inside_step_sound_blocks"); - public static final VanillaTag COMBINATION_STEP_SOUND_BLOCKS = register("combination_step_sound_blocks"); - public static final VanillaTag CAMEL_SAND_STEP_SOUND_BLOCKS = register("camel_sand_step_sound_blocks"); - public static final VanillaTag OCCLUDES_VIBRATION_SIGNALS = register("occludes_vibration_signals"); - public static final VanillaTag DAMPENS_VIBRATIONS = register("dampens_vibrations"); - public static final VanillaTag DRIPSTONE_REPLACEABLE_BLOCKS = register("dripstone_replaceable_blocks"); - public static final VanillaTag CAVE_VINES = register("cave_vines"); - public static final VanillaTag MOSS_REPLACEABLE = register("moss_replaceable"); - public static final VanillaTag LUSH_GROUND_REPLACEABLE = register("lush_ground_replaceable"); - public static final VanillaTag AZALEA_ROOT_REPLACEABLE = register("azalea_root_replaceable"); - public static final VanillaTag SMALL_DRIPLEAF_PLACEABLE = register("small_dripleaf_placeable"); - public static final VanillaTag BIG_DRIPLEAF_PLACEABLE = register("big_dripleaf_placeable"); - public static final VanillaTag SNOW = register("snow"); - public static final VanillaTag MINEABLE_AXE = register("mineable/axe"); - public static final VanillaTag MINEABLE_HOE = register("mineable/hoe"); - public static final VanillaTag MINEABLE_PICKAXE = register("mineable/pickaxe"); - public static final VanillaTag MINEABLE_SHOVEL = register("mineable/shovel"); - public static final VanillaTag SWORD_EFFICIENT = register("sword_efficient"); - public static final VanillaTag NEEDS_DIAMOND_TOOL = register("needs_diamond_tool"); - public static final VanillaTag NEEDS_IRON_TOOL = register("needs_iron_tool"); - public static final VanillaTag NEEDS_STONE_TOOL = register("needs_stone_tool"); - public static final VanillaTag INCORRECT_FOR_NETHERITE_TOOL = register("incorrect_for_netherite_tool"); - public static final VanillaTag INCORRECT_FOR_DIAMOND_TOOL = register("incorrect_for_diamond_tool"); - public static final VanillaTag INCORRECT_FOR_IRON_TOOL = register("incorrect_for_iron_tool"); - public static final VanillaTag INCORRECT_FOR_STONE_TOOL = register("incorrect_for_stone_tool"); - public static final VanillaTag INCORRECT_FOR_GOLD_TOOL = register("incorrect_for_gold_tool"); - public static final VanillaTag INCORRECT_FOR_WOODEN_TOOL = register("incorrect_for_wooden_tool"); - public static final VanillaTag FEATURES_CANNOT_REPLACE = register("features_cannot_replace"); - public static final VanillaTag LAVA_POOL_STONE_CANNOT_REPLACE = register("lava_pool_stone_cannot_replace"); - public static final VanillaTag GEODE_INVALID_BLOCKS = register("geode_invalid_blocks"); - public static final VanillaTag FROG_PREFER_JUMP_TO = register("frog_prefer_jump_to"); - public static final VanillaTag SCULK_REPLACEABLE = register("sculk_replaceable"); - public static final VanillaTag SCULK_REPLACEABLE_WORLD_GEN = register("sculk_replaceable_world_gen"); - public static final VanillaTag ANCIENT_CITY_REPLACEABLE = register("ancient_city_replaceable"); - public static final VanillaTag VIBRATION_RESONATORS = register("vibration_resonators"); - public static final VanillaTag ANIMALS_SPAWNABLE_ON = register("animals_spawnable_on"); - public static final VanillaTag ARMADILLO_SPAWNABLE_ON = register("armadillo_spawnable_on"); - public static final VanillaTag AXOLOTLS_SPAWNABLE_ON = register("axolotls_spawnable_on"); - public static final VanillaTag GOATS_SPAWNABLE_ON = register("goats_spawnable_on"); - public static final VanillaTag MOOSHROOMS_SPAWNABLE_ON = register("mooshrooms_spawnable_on"); - public static final VanillaTag PARROTS_SPAWNABLE_ON = register("parrots_spawnable_on"); - public static final VanillaTag POLAR_BEARS_SPAWNABLE_ON_ALTERNATE = register("polar_bears_spawnable_on_alternate"); - public static final VanillaTag RABBITS_SPAWNABLE_ON = register("rabbits_spawnable_on"); - public static final VanillaTag FOXES_SPAWNABLE_ON = register("foxes_spawnable_on"); - public static final VanillaTag WOLVES_SPAWNABLE_ON = register("wolves_spawnable_on"); - public static final VanillaTag FROGS_SPAWNABLE_ON = register("frogs_spawnable_on"); - public static final VanillaTag AZALEA_GROWS_ON = register("azalea_grows_on"); - public static final VanillaTag CONVERTABLE_TO_MUD = register("convertable_to_mud"); - public static final VanillaTag MANGROVE_LOGS_CAN_GROW_THROUGH = register("mangrove_logs_can_grow_through"); - public static final VanillaTag MANGROVE_ROOTS_CAN_GROW_THROUGH = register("mangrove_roots_can_grow_through"); - public static final VanillaTag DEAD_BUSH_MAY_PLACE_ON = register("dead_bush_may_place_on"); - public static final VanillaTag SNAPS_GOAT_HORN = register("snaps_goat_horn"); - public static final VanillaTag REPLACEABLE_BY_TREES = register("replaceable_by_trees"); - public static final VanillaTag SNOW_LAYER_CANNOT_SURVIVE_ON = register("snow_layer_cannot_survive_on"); - public static final VanillaTag SNOW_LAYER_CAN_SURVIVE_ON = register("snow_layer_can_survive_on"); - public static final VanillaTag INVALID_SPAWN_INSIDE = register("invalid_spawn_inside"); - public static final VanillaTag SNIFFER_DIGGABLE_BLOCK = register("sniffer_diggable_block"); - public static final VanillaTag SNIFFER_EGG_HATCH_BOOST = register("sniffer_egg_hatch_boost"); - public static final VanillaTag TRAIL_RUINS_REPLACEABLE = register("trail_ruins_replaceable"); - public static final VanillaTag REPLACEABLE = register("replaceable"); - public static final VanillaTag ENCHANTMENT_POWER_PROVIDER = register("enchantment_power_provider"); - public static final VanillaTag ENCHANTMENT_POWER_TRANSMITTER = register("enchantment_power_transmitter"); - public static final VanillaTag MAINTAINS_FARMLAND = register("maintains_farmland"); - public static final VanillaTag BLOCKS_WIND_CHARGE_EXPLOSIONS = register("blocks_wind_charge_explosions"); - public static final VanillaTag DOES_NOT_BLOCK_HOPPERS = register("does_not_block_hoppers"); - public static final VanillaTag AIR = register("air"); + 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"); private BlockTag() {} - private static VanillaTag register(String name) { + private static Tag register(String name) { Key identifier = MinecraftKey.key(name); int geyserId = ALL_BLOCK_TAGS.size(); - VanillaTag tag = new VanillaTag(MinecraftKey.key("block"), identifier, geyserId); + Tag tag = new VanillaTag(TagRegistry.BLOCK, identifier, geyserId); ALL_BLOCK_TAGS.put(identifier, tag); return tag; } diff --git a/core/src/main/java/org/geysermc/geyser/session/cache/tags/EnchantmentTag.java b/core/src/main/java/org/geysermc/geyser/session/cache/tags/EnchantmentTag.java index b33cc2cc9..8061d2450 100644 --- a/core/src/main/java/org/geysermc/geyser/session/cache/tags/EnchantmentTag.java +++ b/core/src/main/java/org/geysermc/geyser/session/cache/tags/EnchantmentTag.java @@ -25,60 +25,58 @@ 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; +import net.kyori.adventure.key.Key; +import org.geysermc.geyser.util.MinecraftKey; @SuppressWarnings("unused") public final class EnchantmentTag { - public static final Map ALL_ENCHANTMENT_TAGS = new HashMap<>(); + public static final Map ALL_ENCHANTMENT_TAGS = new HashMap<>(); - public static final VanillaTag TOOLTIP_ORDER = register("tooltip_order"); - public static final VanillaTag EXCLUSIVE_SET_ARMOR = register("exclusive_set/armor"); - public static final VanillaTag EXCLUSIVE_SET_BOOTS = register("exclusive_set/boots"); - public static final VanillaTag EXCLUSIVE_SET_BOW = register("exclusive_set/bow"); - public static final VanillaTag EXCLUSIVE_SET_CROSSBOW = register("exclusive_set/crossbow"); - public static final VanillaTag EXCLUSIVE_SET_DAMAGE = register("exclusive_set/damage"); - public static final VanillaTag EXCLUSIVE_SET_MINING = register("exclusive_set/mining"); - public static final VanillaTag EXCLUSIVE_SET_RIPTIDE = register("exclusive_set/riptide"); - public static final VanillaTag TRADEABLE = register("tradeable"); - public static final VanillaTag DOUBLE_TRADE_PRICE = register("double_trade_price"); - public static final VanillaTag IN_ENCHANTING_TABLE = register("in_enchanting_table"); - public static final VanillaTag ON_MOB_SPAWN_EQUIPMENT = register("on_mob_spawn_equipment"); - public static final VanillaTag ON_TRADED_EQUIPMENT = register("on_traded_equipment"); - public static final VanillaTag ON_RANDOM_LOOT = register("on_random_loot"); - public static final VanillaTag CURSE = register("curse"); - public static final VanillaTag SMELTS_LOOT = register("smelts_loot"); - public static final VanillaTag PREVENTS_BEE_SPAWNS_WHEN_MINING = register("prevents_bee_spawns_when_mining"); - public static final VanillaTag PREVENTS_DECORATED_POT_SHATTERING = register("prevents_decorated_pot_shattering"); - public static final VanillaTag PREVENTS_ICE_MELTING = register("prevents_ice_melting"); - public static final VanillaTag PREVENTS_INFESTED_SPAWNS = register("prevents_infested_spawns"); - public static final VanillaTag TREASURE = register("treasure"); - public static final VanillaTag NON_TREASURE = register("non_treasure"); - public static final VanillaTag TRADES_DESERT_COMMON = register("trades/desert_common"); - public static final VanillaTag TRADES_JUNGLE_COMMON = register("trades/jungle_common"); - public static final VanillaTag TRADES_PLAINS_COMMON = register("trades/plains_common"); - public static final VanillaTag TRADES_SAVANNA_COMMON = register("trades/savanna_common"); - public static final VanillaTag TRADES_SNOW_COMMON = register("trades/snow_common"); - public static final VanillaTag TRADES_SWAMP_COMMON = register("trades/swamp_common"); - public static final VanillaTag TRADES_TAIGA_COMMON = register("trades/taiga_common"); - public static final VanillaTag TRADES_DESERT_SPECIAL = register("trades/desert_special"); - public static final VanillaTag TRADES_JUNGLE_SPECIAL = register("trades/jungle_special"); - public static final VanillaTag TRADES_PLAINS_SPECIAL = register("trades/plains_special"); - public static final VanillaTag TRADES_SAVANNA_SPECIAL = register("trades/savanna_special"); - public static final VanillaTag TRADES_SNOW_SPECIAL = register("trades/snow_special"); - public static final VanillaTag TRADES_SWAMP_SPECIAL = register("trades/swamp_special"); - public static final VanillaTag TRADES_TAIGA_SPECIAL = register("trades/taiga_special"); + 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"); private EnchantmentTag() {} - private static VanillaTag register(String name) { + private static Tag register(String name) { Key identifier = MinecraftKey.key(name); int geyserId = ALL_ENCHANTMENT_TAGS.size(); - VanillaTag tag = new VanillaTag(MinecraftKey.key("enchantment"), identifier, geyserId); + Tag tag = new VanillaTag(TagRegistry.ENCHANTMENT, identifier, geyserId); ALL_ENCHANTMENT_TAGS.put(MinecraftKey.key(name), tag); return tag; } diff --git a/core/src/main/java/org/geysermc/geyser/session/cache/tags/ItemTag.java b/core/src/main/java/org/geysermc/geyser/session/cache/tags/ItemTag.java index 106348a8f..8ded6c073 100644 --- a/core/src/main/java/org/geysermc/geyser/session/cache/tags/ItemTag.java +++ b/core/src/main/java/org/geysermc/geyser/session/cache/tags/ItemTag.java @@ -25,171 +25,169 @@ 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; +import net.kyori.adventure.key.Key; +import org.geysermc.geyser.util.MinecraftKey; @SuppressWarnings("unused") public final class ItemTag { - public static final Map ALL_ITEM_TAGS = new HashMap<>(); + public static final Map ALL_ITEM_TAGS = new HashMap<>(); - public static final VanillaTag WOOL = register("wool"); - public static final VanillaTag PLANKS = register("planks"); - public static final VanillaTag STONE_BRICKS = register("stone_bricks"); - public static final VanillaTag WOODEN_BUTTONS = register("wooden_buttons"); - public static final VanillaTag STONE_BUTTONS = register("stone_buttons"); - public static final VanillaTag BUTTONS = register("buttons"); - public static final VanillaTag WOOL_CARPETS = register("wool_carpets"); - public static final VanillaTag WOODEN_DOORS = register("wooden_doors"); - public static final VanillaTag WOODEN_STAIRS = register("wooden_stairs"); - public static final VanillaTag WOODEN_SLABS = register("wooden_slabs"); - public static final VanillaTag WOODEN_FENCES = register("wooden_fences"); - public static final VanillaTag FENCE_GATES = register("fence_gates"); - public static final VanillaTag WOODEN_PRESSURE_PLATES = register("wooden_pressure_plates"); - public static final VanillaTag WOODEN_TRAPDOORS = register("wooden_trapdoors"); - public static final VanillaTag DOORS = register("doors"); - public static final VanillaTag SAPLINGS = register("saplings"); - public static final VanillaTag LOGS_THAT_BURN = register("logs_that_burn"); - public static final VanillaTag LOGS = register("logs"); - public static final VanillaTag DARK_OAK_LOGS = register("dark_oak_logs"); - public static final VanillaTag OAK_LOGS = register("oak_logs"); - public static final VanillaTag BIRCH_LOGS = register("birch_logs"); - public static final VanillaTag ACACIA_LOGS = register("acacia_logs"); - public static final VanillaTag CHERRY_LOGS = register("cherry_logs"); - public static final VanillaTag JUNGLE_LOGS = register("jungle_logs"); - public static final VanillaTag SPRUCE_LOGS = register("spruce_logs"); - public static final VanillaTag MANGROVE_LOGS = register("mangrove_logs"); - public static final VanillaTag CRIMSON_STEMS = register("crimson_stems"); - public static final VanillaTag WARPED_STEMS = register("warped_stems"); - public static final VanillaTag BAMBOO_BLOCKS = register("bamboo_blocks"); - public static final VanillaTag WART_BLOCKS = register("wart_blocks"); - public static final VanillaTag BANNERS = register("banners"); - public static final VanillaTag SAND = register("sand"); - public static final VanillaTag SMELTS_TO_GLASS = register("smelts_to_glass"); - public static final VanillaTag STAIRS = register("stairs"); - public static final VanillaTag SLABS = register("slabs"); - public static final VanillaTag WALLS = register("walls"); - public static final VanillaTag ANVIL = register("anvil"); - public static final VanillaTag RAILS = register("rails"); - public static final VanillaTag LEAVES = register("leaves"); - public static final VanillaTag TRAPDOORS = register("trapdoors"); - public static final VanillaTag SMALL_FLOWERS = register("small_flowers"); - public static final VanillaTag BEDS = register("beds"); - public static final VanillaTag FENCES = register("fences"); - public static final VanillaTag TALL_FLOWERS = register("tall_flowers"); - public static final VanillaTag FLOWERS = register("flowers"); - public static final VanillaTag PIGLIN_REPELLENTS = register("piglin_repellents"); - public static final VanillaTag PIGLIN_LOVED = register("piglin_loved"); - public static final VanillaTag IGNORED_BY_PIGLIN_BABIES = register("ignored_by_piglin_babies"); - public static final VanillaTag MEAT = register("meat"); - public static final VanillaTag SNIFFER_FOOD = register("sniffer_food"); - public static final VanillaTag PIGLIN_FOOD = register("piglin_food"); - public static final VanillaTag FOX_FOOD = register("fox_food"); - public static final VanillaTag COW_FOOD = register("cow_food"); - public static final VanillaTag GOAT_FOOD = register("goat_food"); - public static final VanillaTag SHEEP_FOOD = register("sheep_food"); - public static final VanillaTag WOLF_FOOD = register("wolf_food"); - public static final VanillaTag CAT_FOOD = register("cat_food"); - public static final VanillaTag HORSE_FOOD = register("horse_food"); - public static final VanillaTag HORSE_TEMPT_ITEMS = register("horse_tempt_items"); - public static final VanillaTag CAMEL_FOOD = register("camel_food"); - public static final VanillaTag ARMADILLO_FOOD = register("armadillo_food"); - public static final VanillaTag BEE_FOOD = register("bee_food"); - public static final VanillaTag CHICKEN_FOOD = register("chicken_food"); - public static final VanillaTag FROG_FOOD = register("frog_food"); - public static final VanillaTag HOGLIN_FOOD = register("hoglin_food"); - public static final VanillaTag LLAMA_FOOD = register("llama_food"); - public static final VanillaTag LLAMA_TEMPT_ITEMS = register("llama_tempt_items"); - public static final VanillaTag OCELOT_FOOD = register("ocelot_food"); - public static final VanillaTag PANDA_FOOD = register("panda_food"); - public static final VanillaTag PIG_FOOD = register("pig_food"); - public static final VanillaTag RABBIT_FOOD = register("rabbit_food"); - public static final VanillaTag STRIDER_FOOD = register("strider_food"); - public static final VanillaTag STRIDER_TEMPT_ITEMS = register("strider_tempt_items"); - public static final VanillaTag TURTLE_FOOD = register("turtle_food"); - public static final VanillaTag PARROT_FOOD = register("parrot_food"); - public static final VanillaTag PARROT_POISONOUS_FOOD = register("parrot_poisonous_food"); - public static final VanillaTag AXOLOTL_FOOD = register("axolotl_food"); - public static final VanillaTag GOLD_ORES = register("gold_ores"); - public static final VanillaTag IRON_ORES = register("iron_ores"); - public static final VanillaTag DIAMOND_ORES = register("diamond_ores"); - public static final VanillaTag REDSTONE_ORES = register("redstone_ores"); - public static final VanillaTag LAPIS_ORES = register("lapis_ores"); - public static final VanillaTag COAL_ORES = register("coal_ores"); - public static final VanillaTag EMERALD_ORES = register("emerald_ores"); - public static final VanillaTag COPPER_ORES = register("copper_ores"); - public static final VanillaTag NON_FLAMMABLE_WOOD = register("non_flammable_wood"); - public static final VanillaTag SOUL_FIRE_BASE_BLOCKS = register("soul_fire_base_blocks"); - public static final VanillaTag CANDLES = register("candles"); - public static final VanillaTag DIRT = register("dirt"); - public static final VanillaTag TERRACOTTA = register("terracotta"); - public static final VanillaTag COMPLETES_FIND_TREE_TUTORIAL = register("completes_find_tree_tutorial"); - public static final VanillaTag BOATS = register("boats"); - public static final VanillaTag CHEST_BOATS = register("chest_boats"); - public static final VanillaTag FISHES = register("fishes"); - public static final VanillaTag SIGNS = register("signs"); - public static final VanillaTag CREEPER_DROP_MUSIC_DISCS = register("creeper_drop_music_discs"); - public static final VanillaTag COALS = register("coals"); - public static final VanillaTag ARROWS = register("arrows"); - public static final VanillaTag LECTERN_BOOKS = register("lectern_books"); - public static final VanillaTag BOOKSHELF_BOOKS = register("bookshelf_books"); - public static final VanillaTag BEACON_PAYMENT_ITEMS = register("beacon_payment_items"); - public static final VanillaTag STONE_TOOL_MATERIALS = register("stone_tool_materials"); - public static final VanillaTag STONE_CRAFTING_MATERIALS = register("stone_crafting_materials"); - public static final VanillaTag FREEZE_IMMUNE_WEARABLES = register("freeze_immune_wearables"); - public static final VanillaTag DAMPENS_VIBRATIONS = register("dampens_vibrations"); - public static final VanillaTag CLUSTER_MAX_HARVESTABLES = register("cluster_max_harvestables"); - public static final VanillaTag COMPASSES = register("compasses"); - public static final VanillaTag HANGING_SIGNS = register("hanging_signs"); - public static final VanillaTag CREEPER_IGNITERS = register("creeper_igniters"); - public static final VanillaTag NOTEBLOCK_TOP_INSTRUMENTS = register("noteblock_top_instruments"); - public static final VanillaTag FOOT_ARMOR = register("foot_armor"); - public static final VanillaTag LEG_ARMOR = register("leg_armor"); - public static final VanillaTag CHEST_ARMOR = register("chest_armor"); - public static final VanillaTag HEAD_ARMOR = register("head_armor"); - public static final VanillaTag SKULLS = register("skulls"); - public static final VanillaTag TRIMMABLE_ARMOR = register("trimmable_armor"); - public static final VanillaTag TRIM_MATERIALS = register("trim_materials"); - public static final VanillaTag TRIM_TEMPLATES = register("trim_templates"); - public static final VanillaTag DECORATED_POT_SHERDS = register("decorated_pot_sherds"); - public static final VanillaTag DECORATED_POT_INGREDIENTS = register("decorated_pot_ingredients"); - public static final VanillaTag SWORDS = register("swords"); - public static final VanillaTag AXES = register("axes"); - public static final VanillaTag HOES = register("hoes"); - public static final VanillaTag PICKAXES = register("pickaxes"); - public static final VanillaTag SHOVELS = register("shovels"); - public static final VanillaTag BREAKS_DECORATED_POTS = register("breaks_decorated_pots"); - public static final VanillaTag VILLAGER_PLANTABLE_SEEDS = register("villager_plantable_seeds"); - public static final VanillaTag DYEABLE = register("dyeable"); - public static final VanillaTag ENCHANTABLE_FOOT_ARMOR = register("enchantable/foot_armor"); - public static final VanillaTag ENCHANTABLE_LEG_ARMOR = register("enchantable/leg_armor"); - public static final VanillaTag ENCHANTABLE_CHEST_ARMOR = register("enchantable/chest_armor"); - public static final VanillaTag ENCHANTABLE_HEAD_ARMOR = register("enchantable/head_armor"); - public static final VanillaTag ENCHANTABLE_ARMOR = register("enchantable/armor"); - public static final VanillaTag ENCHANTABLE_SWORD = register("enchantable/sword"); - public static final VanillaTag ENCHANTABLE_FIRE_ASPECT = register("enchantable/fire_aspect"); - public static final VanillaTag ENCHANTABLE_SHARP_WEAPON = register("enchantable/sharp_weapon"); - public static final VanillaTag ENCHANTABLE_WEAPON = register("enchantable/weapon"); - public static final VanillaTag ENCHANTABLE_MINING = register("enchantable/mining"); - public static final VanillaTag ENCHANTABLE_MINING_LOOT = register("enchantable/mining_loot"); - public static final VanillaTag ENCHANTABLE_FISHING = register("enchantable/fishing"); - public static final VanillaTag ENCHANTABLE_TRIDENT = register("enchantable/trident"); - public static final VanillaTag ENCHANTABLE_DURABILITY = register("enchantable/durability"); - public static final VanillaTag ENCHANTABLE_BOW = register("enchantable/bow"); - public static final VanillaTag ENCHANTABLE_EQUIPPABLE = register("enchantable/equippable"); - public static final VanillaTag ENCHANTABLE_CROSSBOW = register("enchantable/crossbow"); - public static final VanillaTag ENCHANTABLE_VANISHING = register("enchantable/vanishing"); - public static final VanillaTag ENCHANTABLE_MACE = register("enchantable/mace"); + 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"); private ItemTag() {} - private static VanillaTag register(String name) { + private static Tag register(String name) { Key identifier = MinecraftKey.key(name); int geyserId = ALL_ITEM_TAGS.size(); - VanillaTag tag = new VanillaTag(MinecraftKey.key("item"), identifier, geyserId); + Tag tag = new VanillaTag(TagRegistry.ITEM, identifier, geyserId); ALL_ITEM_TAGS.put(MinecraftKey.key(name), tag); return tag; } diff --git a/core/src/main/java/org/geysermc/geyser/session/cache/tags/NonVanillaTag.java b/core/src/main/java/org/geysermc/geyser/session/cache/tags/NonVanillaTag.java index 64bd04f85..888e245ae 100644 --- a/core/src/main/java/org/geysermc/geyser/session/cache/tags/NonVanillaTag.java +++ b/core/src/main/java/org/geysermc/geyser/session/cache/tags/NonVanillaTag.java @@ -27,6 +27,6 @@ package org.geysermc.geyser.session.cache.tags; import net.kyori.adventure.key.Key; -public record NonVanillaTag(Key registry, Key tag) implements Tag { +public record NonVanillaTag(TagRegistry registry, Key tag) implements Tag { } diff --git a/core/src/main/java/org/geysermc/geyser/session/cache/tags/Tag.java b/core/src/main/java/org/geysermc/geyser/session/cache/tags/Tag.java index cebb5a077..f3e8e526f 100644 --- a/core/src/main/java/org/geysermc/geyser/session/cache/tags/Tag.java +++ b/core/src/main/java/org/geysermc/geyser/session/cache/tags/Tag.java @@ -29,7 +29,11 @@ import net.kyori.adventure.key.Key; public interface Tag { - Key registry(); + TagRegistry registry(); Key tag(); + + static Tag createTag(TagRegistry registry, Key tagKey) { + return registry.getVanillaTags().getOrDefault(tagKey, new NonVanillaTag(registry, tagKey)); + } } diff --git a/core/src/main/java/org/geysermc/geyser/session/cache/tags/TagRegistry.java b/core/src/main/java/org/geysermc/geyser/session/cache/tags/TagRegistry.java new file mode 100644 index 000000000..3a94ddd34 --- /dev/null +++ b/core/src/main/java/org/geysermc/geyser/session/cache/tags/TagRegistry.java @@ -0,0 +1,57 @@ +/* + * 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.Map; +import lombok.Getter; +import net.kyori.adventure.key.Key; +import org.checkerframework.checker.nullness.qual.Nullable; +import org.geysermc.geyser.util.MinecraftKey; + +@Getter +public enum TagRegistry { + BLOCK("block", BlockTag.ALL_BLOCK_TAGS), + ITEM("item", ItemTag.ALL_ITEM_TAGS), + ENCHANTMENT("enchantment", EnchantmentTag.ALL_ENCHANTMENT_TAGS); + + private final Key registryKey; + private final Map vanillaTags; + + TagRegistry(String registry, Map vanillaTags) { + this.registryKey = MinecraftKey.key(registry); + this.vanillaTags = vanillaTags; + } + + @Nullable + public static TagRegistry valueOf(Key registryKey) { + for (TagRegistry registry : TagRegistry.values()) { + if (registry.registryKey.equals(registryKey)) { + return registry; + } + } + return null; + } +} diff --git a/core/src/main/java/org/geysermc/geyser/session/cache/tags/VanillaTag.java b/core/src/main/java/org/geysermc/geyser/session/cache/tags/VanillaTag.java index 48c6089d7..340ac088b 100644 --- a/core/src/main/java/org/geysermc/geyser/session/cache/tags/VanillaTag.java +++ b/core/src/main/java/org/geysermc/geyser/session/cache/tags/VanillaTag.java @@ -28,7 +28,7 @@ package org.geysermc.geyser.session.cache.tags; import net.kyori.adventure.key.Key; import org.geysermc.geyser.util.Ordered; -public record VanillaTag(Key registry, Key tag, int geyserId) implements Ordered, Tag { +public record VanillaTag(TagRegistry registry, Key tag, int geyserId) implements Ordered, Tag { @Override public int ordinal() { From fbe702077c43427a28fa9ae1034744c66625b8f8 Mon Sep 17 00:00:00 2001 From: Eclipse Date: Wed, 10 Jul 2024 09:04:12 +0000 Subject: [PATCH 03/12] Add holderset class for geyser --- .../updater/AnvilInventoryUpdater.java | 8 +- .../geyser/item/enchantment/Enchantment.java | 29 +------ .../geyser/session/cache/TagCache.java | 4 - .../geyser/session/cache/tags/HolderSet.java | 79 +++++++++++++++++++ 4 files changed, 84 insertions(+), 36 deletions(-) create mode 100644 core/src/main/java/org/geysermc/geyser/session/cache/tags/HolderSet.java diff --git a/core/src/main/java/org/geysermc/geyser/inventory/updater/AnvilInventoryUpdater.java b/core/src/main/java/org/geysermc/geyser/inventory/updater/AnvilInventoryUpdater.java index eed9c95d1..8874af61b 100644 --- a/core/src/main/java/org/geysermc/geyser/inventory/updater/AnvilInventoryUpdater.java +++ b/core/src/main/java/org/geysermc/geyser/inventory/updater/AnvilInventoryUpdater.java @@ -42,14 +42,12 @@ 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.Tag; import org.geysermc.geyser.session.cache.tags.TagRegistry; 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 +312,10 @@ public class AnvilInventoryUpdater extends InventoryUpdater { for (Object2IntMap.Entry entry : getEnchantments(session, material).object2IntEntrySet()) { Enchantment enchantment = entry.getKey(); - HolderSet supportedItems = enchantment.supportedItems(); - int[] supportedItemIds = supportedItems.resolve(tagId -> session.getTagCache().get(Tag.createTag(TagRegistry.ITEM, tagId))); + int[] supportedItemIds = enchantment.supportedItems().resolve(session, TagRegistry.ITEM); boolean canApply = isEnchantedBook(input) || IntStream.of(supportedItemIds).anyMatch(id -> id == input.getJavaId()); - HolderSet exclusiveSet = enchantment.exclusiveSet(); - int[] incompatibleEnchantments = exclusiveSet.resolve(tagId -> session.getTagCache().get(Tag.createTag(TagRegistry.ENCHANTMENT, tagId))); + int[] incompatibleEnchantments = enchantment.exclusiveSet().resolve(session, TagRegistry.ENCHANTMENT); for (int i : incompatibleEnchantments) { Enchantment incompatible = session.getRegistryCache().enchantments().byId(i); if (combinedEnchantments.containsKey(incompatible)) { diff --git a/core/src/main/java/org/geysermc/geyser/item/enchantment/Enchantment.java b/core/src/main/java/org/geysermc/geyser/item/enchantment/Enchantment.java index 3c0caa60c..529a8748a 100644 --- a/core/src/main/java/org/geysermc/geyser/item/enchantment/Enchantment.java +++ b/core/src/main/java/org/geysermc/geyser/item/enchantment/Enchantment.java @@ -25,21 +25,18 @@ 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.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 +55,12 @@ public record Enchantment(String identifier, NbtMap data = context.data(); Set 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(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(data.get("exclusive_set"), context::getNetworkId); BedrockEnchantment bedrockEnchantment = BedrockEnchantment.getByJavaIdentifier(context.id().asString()); @@ -84,24 +81,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 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"); - } } diff --git a/core/src/main/java/org/geysermc/geyser/session/cache/TagCache.java b/core/src/main/java/org/geysermc/geyser/session/cache/TagCache.java index 12d20e7ba..95f8d5f1e 100644 --- a/core/src/main/java/org/geysermc/geyser/session/cache/TagCache.java +++ b/core/src/main/java/org/geysermc/geyser/session/cache/TagCache.java @@ -25,10 +25,6 @@ package org.geysermc.geyser.session.cache; -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; - import it.unimi.dsi.fastutil.objects.Object2IntMap; import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; import java.util.ArrayList; diff --git a/core/src/main/java/org/geysermc/geyser/session/cache/tags/HolderSet.java b/core/src/main/java/org/geysermc/geyser/session/cache/tags/HolderSet.java new file mode 100644 index 000000000..7a9e276b9 --- /dev/null +++ b/core/src/main/java/org/geysermc/geyser/session/cache/tags/HolderSet.java @@ -0,0 +1,79 @@ +/* + * 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.GeyserSession; + +@Data +public final class HolderSet { + + private final @Nullable Key tagId; + private final int @Nullable [] holders; + + public HolderSet(int @NonNull [] holders) { + this.tagId = null; + this.holders = holders; + } + + public HolderSet(@NonNull Key tagId) { + this.tagId = tagId; + this.holders = null; + } + + public int[] resolve(GeyserSession session, TagRegistry registry) { + if (holders != null) { + return holders; + } + + return session.getTagCache().get(Tag.createTag(registry, tagId)); + } + + public static HolderSet readHolderSet(@Nullable Object holderSet, Function 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 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"); + } +} From cd1ceaa28d276895d9e9eba43d37d608edabbdff Mon Sep 17 00:00:00 2001 From: Eclipse Date: Wed, 10 Jul 2024 10:31:37 +0000 Subject: [PATCH 04/12] My IDE did some stuff it shouldn't have done --- .../type/living/animal/AnimalEntity.java | 3 ++- .../type/living/animal/ArmadilloEntity.java | 5 ++-- .../type/living/animal/AxolotlEntity.java | 3 ++- .../entity/type/living/animal/BeeEntity.java | 3 ++- .../type/living/animal/ChickenEntity.java | 3 ++- .../entity/type/living/animal/CowEntity.java | 3 ++- .../entity/type/living/animal/FoxEntity.java | 3 ++- .../entity/type/living/animal/FrogEntity.java | 5 ++-- .../entity/type/living/animal/GoatEntity.java | 3 ++- .../type/living/animal/HoglinEntity.java | 3 ++- .../type/living/animal/OcelotEntity.java | 3 ++- .../type/living/animal/PandaEntity.java | 3 ++- .../entity/type/living/animal/PigEntity.java | 3 ++- .../type/living/animal/PolarBearEntity.java | 3 ++- .../type/living/animal/RabbitEntity.java | 3 ++- .../type/living/animal/SheepEntity.java | 3 ++- .../type/living/animal/SnifferEntity.java | 3 ++- .../type/living/animal/StriderEntity.java | 3 ++- .../type/living/animal/TurtleEntity.java | 3 ++- .../animal/horse/AbstractHorseEntity.java | 3 ++- .../type/living/animal/horse/CamelEntity.java | 3 ++- .../type/living/animal/horse/LlamaEntity.java | 3 ++- .../living/animal/tameable/CatEntity.java | 3 ++- .../living/animal/tameable/ParrotEntity.java | 5 ++-- .../living/animal/tameable/WolfEntity.java | 7 +++--- .../populator/BlockRegistryPopulator.java | 24 +++++++++---------- 26 files changed, 67 insertions(+), 42 deletions(-) diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/AnimalEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/AnimalEntity.java index 07b680d68..c4de76ce8 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/AnimalEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/AnimalEntity.java @@ -25,7 +25,6 @@ package org.geysermc.geyser.entity.type.living.animal; -import java.util.UUID; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.math.vector.Vector3f; @@ -40,6 +39,8 @@ import org.geysermc.geyser.util.InteractionResult; import org.geysermc.geyser.util.InteractiveTag; import org.geysermc.mcprotocollib.protocol.data.game.entity.player.Hand; +import java.util.UUID; + public abstract class AnimalEntity extends AgeableEntity { public AnimalEntity(GeyserSession session, int entityId, long geyserId, UUID uuid, EntityDefinition definition, Vector3f position, Vector3f motion, float yaw, float pitch, float headYaw) { diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/ArmadilloEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/ArmadilloEntity.java index 93c58db99..649e7f44c 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/ArmadilloEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/ArmadilloEntity.java @@ -25,8 +25,6 @@ package org.geysermc.geyser.entity.type.living.animal; -import java.util.UUID; -import java.util.concurrent.TimeUnit; import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.math.vector.Vector3f; import org.geysermc.geyser.entity.EntityDefinition; @@ -36,6 +34,9 @@ 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; +import java.util.UUID; +import java.util.concurrent.TimeUnit; + public class ArmadilloEntity extends AnimalEntity { private ArmadilloState armadilloState = ArmadilloState.IDLE; diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/AxolotlEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/AxolotlEntity.java index c5d73b175..de4309f3d 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/AxolotlEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/AxolotlEntity.java @@ -25,7 +25,6 @@ package org.geysermc.geyser.entity.type.living.animal; -import java.util.UUID; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.math.vector.Vector3f; @@ -42,6 +41,8 @@ import org.geysermc.mcprotocollib.protocol.data.game.entity.metadata.type.Boolea import org.geysermc.mcprotocollib.protocol.data.game.entity.metadata.type.IntEntityMetadata; import org.geysermc.mcprotocollib.protocol.data.game.entity.player.Hand; +import java.util.UUID; + public class AxolotlEntity extends AnimalEntity { public AxolotlEntity(GeyserSession session, int entityId, long geyserId, UUID uuid, EntityDefinition definition, Vector3f position, Vector3f motion, float yaw, float pitch, float headYaw) { super(session, entityId, geyserId, uuid, definition, position, motion, yaw, pitch, headYaw); diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/BeeEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/BeeEntity.java index bd6f016ea..894262980 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/BeeEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/BeeEntity.java @@ -25,7 +25,6 @@ package org.geysermc.geyser.entity.type.living.animal; -import java.util.UUID; import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.math.vector.Vector3f; import org.cloudburstmc.protocol.bedrock.data.entity.EntityDataTypes; @@ -39,6 +38,8 @@ 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; +import java.util.UUID; + public class BeeEntity extends AnimalEntity { public BeeEntity(GeyserSession session, int entityId, long geyserId, UUID uuid, EntityDefinition definition, Vector3f position, Vector3f motion, float yaw, float pitch, float headYaw) { diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/ChickenEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/ChickenEntity.java index 824295d74..70772927a 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/ChickenEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/ChickenEntity.java @@ -25,7 +25,6 @@ package org.geysermc.geyser.entity.type.living.animal; -import java.util.UUID; import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.math.vector.Vector3f; import org.geysermc.geyser.entity.EntityDefinition; @@ -33,6 +32,8 @@ 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; + public class ChickenEntity extends AnimalEntity { public ChickenEntity(GeyserSession session, int entityId, long geyserId, UUID uuid, EntityDefinition definition, Vector3f position, Vector3f motion, float yaw, float pitch, float headYaw) { diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/CowEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/CowEntity.java index a504f2aec..3e09814f9 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/CowEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/CowEntity.java @@ -25,7 +25,6 @@ package org.geysermc.geyser.entity.type.living.animal; -import java.util.UUID; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.math.vector.Vector3f; @@ -41,6 +40,8 @@ import org.geysermc.geyser.util.InteractionResult; import org.geysermc.geyser.util.InteractiveTag; import org.geysermc.mcprotocollib.protocol.data.game.entity.player.Hand; +import java.util.UUID; + public class CowEntity extends AnimalEntity { public CowEntity(GeyserSession session, int entityId, long geyserId, UUID uuid, EntityDefinition definition, Vector3f position, Vector3f motion, float yaw, float pitch, float headYaw) { super(session, entityId, geyserId, uuid, definition, position, motion, yaw, pitch, headYaw); diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/FoxEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/FoxEntity.java index 2c26707c2..3cf0b49c7 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/FoxEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/FoxEntity.java @@ -25,7 +25,6 @@ package org.geysermc.geyser.entity.type.living.animal; -import java.util.UUID; import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.math.vector.Vector3f; import org.cloudburstmc.protocol.bedrock.data.entity.EntityDataTypes; @@ -37,6 +36,8 @@ 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; +import java.util.UUID; + public class FoxEntity extends AnimalEntity { public FoxEntity(GeyserSession session, int entityId, long geyserId, UUID uuid, EntityDefinition definition, Vector3f position, Vector3f motion, float yaw, float pitch, float headYaw) { diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/FrogEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/FrogEntity.java index 9a9083ff5..4269c0b08 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/FrogEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/FrogEntity.java @@ -25,8 +25,6 @@ package org.geysermc.geyser.entity.type.living.animal; -import java.util.OptionalInt; -import java.util.UUID; import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.math.vector.Vector3f; import org.cloudburstmc.protocol.bedrock.data.entity.EntityDataTypes; @@ -40,6 +38,9 @@ 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; +import java.util.OptionalInt; +import java.util.UUID; + public class FrogEntity extends AnimalEntity { public FrogEntity(GeyserSession session, int entityId, long geyserId, UUID uuid, EntityDefinition definition, Vector3f position, Vector3f motion, float yaw, float pitch, float headYaw) { super(session, entityId, geyserId, uuid, definition, position, motion, yaw, pitch, headYaw); diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/GoatEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/GoatEntity.java index 260dd4b30..73018796b 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/GoatEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/GoatEntity.java @@ -25,7 +25,6 @@ package org.geysermc.geyser.entity.type.living.animal; -import java.util.UUID; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.math.vector.Vector3f; @@ -43,6 +42,8 @@ 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.player.Hand; +import java.util.UUID; + public class GoatEntity extends AnimalEntity { private static final float LONG_JUMPING_HEIGHT = 1.3f * 0.7f; private static final float LONG_JUMPING_WIDTH = 0.9f * 0.7f; diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/HoglinEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/HoglinEntity.java index 7daff1143..1dc8d68f6 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/HoglinEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/HoglinEntity.java @@ -25,7 +25,6 @@ package org.geysermc.geyser.entity.type.living.animal; -import java.util.UUID; import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.math.vector.Vector3f; import org.cloudburstmc.protocol.bedrock.data.entity.EntityDataTypes; @@ -36,6 +35,8 @@ 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; + public class HoglinEntity extends AnimalEntity { private boolean isImmuneToZombification; diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/OcelotEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/OcelotEntity.java index e0a330dc1..3033416ae 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/OcelotEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/OcelotEntity.java @@ -25,7 +25,6 @@ package org.geysermc.geyser.entity.type.living.animal; -import java.util.UUID; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.math.vector.Vector3f; @@ -39,6 +38,8 @@ import org.geysermc.geyser.util.InteractionResult; import org.geysermc.geyser.util.InteractiveTag; import org.geysermc.mcprotocollib.protocol.data.game.entity.player.Hand; +import java.util.UUID; + public class OcelotEntity extends AnimalEntity { public OcelotEntity(GeyserSession session, int entityId, long geyserId, UUID uuid, EntityDefinition definition, Vector3f position, Vector3f motion, float yaw, float pitch, float headYaw) { diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/PandaEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/PandaEntity.java index cb0d45953..7e36c957b 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/PandaEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/PandaEntity.java @@ -25,7 +25,6 @@ package org.geysermc.geyser.entity.type.living.animal; -import java.util.UUID; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.math.vector.Vector3f; @@ -44,6 +43,8 @@ import org.geysermc.mcprotocollib.protocol.data.game.entity.metadata.type.ByteEn import org.geysermc.mcprotocollib.protocol.data.game.entity.metadata.type.IntEntityMetadata; import org.geysermc.mcprotocollib.protocol.data.game.entity.player.Hand; +import java.util.UUID; + public class PandaEntity extends AnimalEntity { private Gene mainGene = Gene.NORMAL; private Gene hiddenGene = Gene.NORMAL; diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/PigEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/PigEntity.java index 13fb07110..a0f43188c 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/PigEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/PigEntity.java @@ -25,7 +25,6 @@ package org.geysermc.geyser.entity.type.living.animal; -import java.util.UUID; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.math.vector.Vector3f; @@ -40,6 +39,8 @@ import org.geysermc.geyser.util.InteractionResult; import org.geysermc.geyser.util.InteractiveTag; import org.geysermc.mcprotocollib.protocol.data.game.entity.player.Hand; +import java.util.UUID; + public class PigEntity extends AnimalEntity { public PigEntity(GeyserSession session, int entityId, long geyserId, UUID uuid, EntityDefinition definition, Vector3f position, Vector3f motion, float yaw, float pitch, float headYaw) { diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/PolarBearEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/PolarBearEntity.java index ec77a6378..d0e46b714 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/PolarBearEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/PolarBearEntity.java @@ -25,13 +25,14 @@ package org.geysermc.geyser.entity.type.living.animal; -import java.util.UUID; 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.Tag; +import java.util.UUID; + public class PolarBearEntity extends AnimalEntity { public PolarBearEntity(GeyserSession session, int entityId, long geyserId, UUID uuid, EntityDefinition definition, Vector3f position, Vector3f motion, float yaw, float pitch, float headYaw) { diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/RabbitEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/RabbitEntity.java index 7afa3ad50..38bba27e8 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/RabbitEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/RabbitEntity.java @@ -25,7 +25,6 @@ package org.geysermc.geyser.entity.type.living.animal; -import java.util.UUID; import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.math.vector.Vector3f; import org.cloudburstmc.protocol.bedrock.data.entity.EntityDataTypes; @@ -36,6 +35,8 @@ 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; + public class RabbitEntity extends AnimalEntity { public RabbitEntity(GeyserSession session, int entityId, long geyserId, UUID uuid, EntityDefinition definition, Vector3f position, Vector3f motion, float yaw, float pitch, float headYaw) { diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/SheepEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/SheepEntity.java index 01792778c..32ecbf8c8 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/SheepEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/SheepEntity.java @@ -25,7 +25,6 @@ package org.geysermc.geyser.entity.type.living.animal; -import java.util.UUID; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.math.vector.Vector3f; @@ -43,6 +42,8 @@ import org.geysermc.geyser.util.InteractiveTag; import org.geysermc.mcprotocollib.protocol.data.game.entity.metadata.type.ByteEntityMetadata; import org.geysermc.mcprotocollib.protocol.data.game.entity.player.Hand; +import java.util.UUID; + public class SheepEntity extends AnimalEntity { private int color; diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/SnifferEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/SnifferEntity.java index 062ce789b..2d0695648 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/SnifferEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/SnifferEntity.java @@ -25,7 +25,6 @@ package org.geysermc.geyser.entity.type.living.animal; -import java.util.UUID; import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.math.vector.Vector3f; import org.cloudburstmc.protocol.bedrock.data.LevelEvent; @@ -43,6 +42,8 @@ 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; +import java.util.UUID; + public class SnifferEntity extends AnimalEntity implements Tickable { private static final float DIGGING_HEIGHT = EntityDefinitions.SNIFFER.height() - 0.4f; private static final int DIG_END = 120; diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/StriderEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/StriderEntity.java index 697e92f8a..5a1927ede 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/StriderEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/StriderEntity.java @@ -25,7 +25,6 @@ package org.geysermc.geyser.entity.type.living.animal; -import java.util.UUID; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.math.vector.Vector3f; @@ -42,6 +41,8 @@ import org.geysermc.geyser.util.InteractiveTag; import org.geysermc.mcprotocollib.protocol.data.game.entity.metadata.type.BooleanEntityMetadata; import org.geysermc.mcprotocollib.protocol.data.game.entity.player.Hand; +import java.util.UUID; + public class StriderEntity extends AnimalEntity { private boolean isCold = false; diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/TurtleEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/TurtleEntity.java index d0ab7f948..4c5032eae 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/TurtleEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/TurtleEntity.java @@ -25,7 +25,6 @@ package org.geysermc.geyser.entity.type.living.animal; -import java.util.UUID; import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.math.vector.Vector3f; import org.cloudburstmc.protocol.bedrock.data.entity.EntityFlag; @@ -35,6 +34,8 @@ 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; + public class TurtleEntity extends AnimalEntity { public TurtleEntity(GeyserSession session, int entityId, long geyserId, UUID uuid, EntityDefinition definition, Vector3f position, Vector3f motion, float yaw, float pitch, float headYaw) { diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/horse/AbstractHorseEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/horse/AbstractHorseEntity.java index 0d8a90c4f..987907ec0 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/horse/AbstractHorseEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/horse/AbstractHorseEntity.java @@ -25,7 +25,6 @@ package org.geysermc.geyser.entity.type.living.animal.horse; -import java.util.UUID; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.math.vector.Vector3f; @@ -48,6 +47,8 @@ import org.geysermc.geyser.util.InteractiveTag; import org.geysermc.mcprotocollib.protocol.data.game.entity.metadata.type.ByteEntityMetadata; import org.geysermc.mcprotocollib.protocol.data.game.entity.player.Hand; +import java.util.UUID; + public class AbstractHorseEntity extends AnimalEntity { public AbstractHorseEntity(GeyserSession session, int entityId, long geyserId, UUID uuid, EntityDefinition definition, Vector3f position, Vector3f motion, float yaw, float pitch, float headYaw) { diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/horse/CamelEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/horse/CamelEntity.java index 32af43866..e314fb021 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/horse/CamelEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/horse/CamelEntity.java @@ -25,7 +25,6 @@ package org.geysermc.geyser.entity.type.living.animal.horse; -import java.util.UUID; import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.math.vector.Vector3f; import org.cloudburstmc.protocol.bedrock.data.entity.EntityDataTypes; @@ -41,6 +40,8 @@ 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; +import java.util.UUID; + public class CamelEntity extends AbstractHorseEntity { public static final float SITTING_HEIGHT_DIFFERENCE = 1.43F; diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/horse/LlamaEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/horse/LlamaEntity.java index c73ffdde9..72d4afb33 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/horse/LlamaEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/horse/LlamaEntity.java @@ -25,7 +25,6 @@ package org.geysermc.geyser.entity.type.living.animal.horse; -import java.util.UUID; import lombok.Getter; import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.math.vector.Vector3f; @@ -37,6 +36,8 @@ 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; +import java.util.UUID; + public class LlamaEntity extends ChestedHorseEntity { /** * Used to calculate inventory size diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/tameable/CatEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/tameable/CatEntity.java index 5abf096ce..306e2c07e 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/tameable/CatEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/tameable/CatEntity.java @@ -25,7 +25,6 @@ package org.geysermc.geyser.entity.type.living.animal.tameable; -import java.util.UUID; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.math.vector.Vector3f; @@ -43,6 +42,8 @@ import org.geysermc.mcprotocollib.protocol.data.game.entity.metadata.type.ByteEn import org.geysermc.mcprotocollib.protocol.data.game.entity.metadata.type.IntEntityMetadata; import org.geysermc.mcprotocollib.protocol.data.game.entity.player.Hand; +import java.util.UUID; + public class CatEntity extends TameableEntity { private byte collarColor = 14; // Red - default diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/tameable/ParrotEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/tameable/ParrotEntity.java index c170da413..0e14ccfc4 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/tameable/ParrotEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/tameable/ParrotEntity.java @@ -25,8 +25,6 @@ package org.geysermc.geyser.entity.type.living.animal.tameable; -import java.util.Set; -import java.util.UUID; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.math.vector.Vector3f; @@ -42,6 +40,9 @@ import org.geysermc.geyser.util.InteractionResult; import org.geysermc.geyser.util.InteractiveTag; import org.geysermc.mcprotocollib.protocol.data.game.entity.player.Hand; +import java.util.Set; +import java.util.UUID; + public class ParrotEntity extends TameableEntity { // Note: is the same as chicken. Reuse? private static final Set TAMING_FOOD = Set.of(Items.WHEAT_SEEDS, Items.MELON_SEEDS, Items.PUMPKIN_SEEDS, Items.BEETROOT_SEEDS); diff --git a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/tameable/WolfEntity.java b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/tameable/WolfEntity.java index 712e9c7a6..d94124c8e 100644 --- a/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/tameable/WolfEntity.java +++ b/core/src/main/java/org/geysermc/geyser/entity/type/living/animal/tameable/WolfEntity.java @@ -25,9 +25,6 @@ package org.geysermc.geyser.entity.type.living.animal.tameable; -import java.util.Collections; -import java.util.Locale; -import java.util.UUID; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; import org.cloudburstmc.math.vector.Vector3f; @@ -54,6 +51,10 @@ import org.geysermc.mcprotocollib.protocol.data.game.entity.player.GameMode; import org.geysermc.mcprotocollib.protocol.data.game.entity.player.Hand; import org.geysermc.mcprotocollib.protocol.data.game.item.ItemStack; +import java.util.Collections; +import java.util.Locale; +import java.util.UUID; + public class WolfEntity extends TameableEntity { private byte collarColor = 14; // Red - default diff --git a/core/src/main/java/org/geysermc/geyser/registry/populator/BlockRegistryPopulator.java b/core/src/main/java/org/geysermc/geyser/registry/populator/BlockRegistryPopulator.java index e2fd53ce1..d7dc989da 100644 --- a/core/src/main/java/org/geysermc/geyser/registry/populator/BlockRegistryPopulator.java +++ b/core/src/main/java/org/geysermc/geyser/registry/populator/BlockRegistryPopulator.java @@ -82,7 +82,7 @@ public final class BlockRegistryPopulator { @FunctionalInterface interface Remapper { - NbtMap remap(NbtMap vanillaTag); + NbtMap remap(NbtMap tag); } public static void populate(Stage stage) { @@ -108,7 +108,7 @@ public final class BlockRegistryPopulator { private static void registerBedrockBlocks() { var blockMappers = ImmutableMap., Remapper>builder() .put(ObjectIntPair.of("1_20_80", Bedrock_v671.CODEC.getProtocolVersion()), Conversion685_671::remapBlock) - .put(ObjectIntPair.of("1_21_0", Bedrock_v685.CODEC.getProtocolVersion()), vanillaTag -> vanillaTag) + .put(ObjectIntPair.of("1_21_0", Bedrock_v685.CODEC.getProtocolVersion()), tag -> tag) .build(); // We can keep this strong as nothing should be garbage collected @@ -163,12 +163,12 @@ public final class BlockRegistryPopulator { Object2ObjectMap blockStateOrderedMap = new Object2ObjectOpenHashMap<>(blockStates.size()); GeyserBedrockBlock[] bedrockRuntimeMap = new GeyserBedrockBlock[blockStates.size()]; for (int i = 0; i < blockStates.size(); i++) { - NbtMap vanillaTag = blockStates.get(i); - if (blockStateOrderedMap.containsKey(vanillaTag)) { - throw new AssertionError("Duplicate block states in Bedrock palette: " + vanillaTag); + NbtMap tag = blockStates.get(i); + if (blockStateOrderedMap.containsKey(tag)) { + throw new AssertionError("Duplicate block states in Bedrock palette: " + tag); } - GeyserBedrockBlock block = new GeyserBedrockBlock(i, vanillaTag); - blockStateOrderedMap.put(vanillaTag, block); + GeyserBedrockBlock block = new GeyserBedrockBlock(i, tag); + blockStateOrderedMap.put(tag, block); bedrockRuntimeMap[i] = block; } @@ -177,9 +177,9 @@ public final class BlockRegistryPopulator { if (BlockRegistries.CUSTOM_BLOCKS.get().length != 0) { customBlockStateDefinitions = new Object2ObjectOpenHashMap<>(customExtBlockStates.size()); for (int i = 0; i < customExtBlockStates.size(); i++) { - NbtMap vanillaTag = customBlockStates.get(i); + NbtMap tag = customBlockStates.get(i); CustomBlockState blockState = customExtBlockStates.get(i); - GeyserBedrockBlock bedrockBlock = blockStateOrderedMap.get(vanillaTag); + GeyserBedrockBlock bedrockBlock = blockStateOrderedMap.get(tag); customBlockStateDefinitions.put(blockState, bedrockBlock); Set extendedCollisionjavaIds = BlockRegistries.EXTENDED_COLLISION_BOXES.getOrDefault(blockState.block(), null); @@ -250,9 +250,9 @@ public final class BlockRegistryPopulator { bedrockDefinition = vanillaBedrockDefinition; if (bedrockDefinition == null) { throw new RuntimeException(""" - Unable to find %s Bedrock runtime ID for %s! Original block vanillaTag: + Unable to find %s Bedrock runtime ID for %s! Original block tag: %s - Updated block vanillaTag: + Updated block tag: %s""".formatted(javaId, palette.key(), originalBedrockTag, bedrockTag)); } } else { @@ -297,7 +297,7 @@ public final class BlockRegistryPopulator { BlockRegistries.WATERLOGGED.get().set(javaRuntimeId); } - // Get the vanillaTag needed for non-empty flower pots + // Get the tag needed for non-empty flower pots if (javaPottable.contains(block)) { // Specifically NOT putIfAbsent - mangrove propagule breaks otherwise flowerPotBlocks.put(block, blockStates.get(bedrockDefinition.getRuntimeId())); From dbd062d56dc5fbfa347e55b20124af689c578e99 Mon Sep 17 00:00:00 2001 From: Eclipse Date: Wed, 10 Jul 2024 10:43:13 +0000 Subject: [PATCH 05/12] Add is method for HolderSets to TagCache --- .../updater/AnvilInventoryUpdater.java | 5 ++--- .../geysermc/geyser/session/cache/TagCache.java | 17 +++++++++++++---- .../geyser/session/cache/tags/BlockTag.java | 5 +++-- .../session/cache/tags/EnchantmentTag.java | 5 +++-- .../geyser/session/cache/tags/HolderSet.java | 6 +++--- .../geyser/session/cache/tags/ItemTag.java | 5 +++-- 6 files changed, 27 insertions(+), 16 deletions(-) diff --git a/core/src/main/java/org/geysermc/geyser/inventory/updater/AnvilInventoryUpdater.java b/core/src/main/java/org/geysermc/geyser/inventory/updater/AnvilInventoryUpdater.java index 8874af61b..61a18a632 100644 --- a/core/src/main/java/org/geysermc/geyser/inventory/updater/AnvilInventoryUpdater.java +++ b/core/src/main/java/org/geysermc/geyser/inventory/updater/AnvilInventoryUpdater.java @@ -312,10 +312,9 @@ public class AnvilInventoryUpdater extends InventoryUpdater { for (Object2IntMap.Entry entry : getEnchantments(session, material).object2IntEntrySet()) { Enchantment enchantment = entry.getKey(); - int[] supportedItemIds = enchantment.supportedItems().resolve(session, TagRegistry.ITEM); - boolean canApply = isEnchantedBook(input) || IntStream.of(supportedItemIds).anyMatch(id -> id == input.getJavaId()); + boolean canApply = isEnchantedBook(input) || session.getTagCache().is(enchantment.supportedItems(), input.getJavaId(), TagRegistry.ITEM); - int[] incompatibleEnchantments = enchantment.exclusiveSet().resolve(session, TagRegistry.ENCHANTMENT); + int[] incompatibleEnchantments = enchantment.exclusiveSet().resolve(session.getTagCache(), TagRegistry.ENCHANTMENT); for (int i : incompatibleEnchantments) { Enchantment incompatible = session.getRegistryCache().enchantments().byId(i); if (combinedEnchantments.containsKey(incompatible)) { diff --git a/core/src/main/java/org/geysermc/geyser/session/cache/TagCache.java b/core/src/main/java/org/geysermc/geyser/session/cache/TagCache.java index 95f8d5f1e..9b6c32363 100644 --- a/core/src/main/java/org/geysermc/geyser/session/cache/TagCache.java +++ b/core/src/main/java/org/geysermc/geyser/session/cache/TagCache.java @@ -27,10 +27,6 @@ package org.geysermc.geyser.session.cache; import it.unimi.dsi.fastutil.objects.Object2IntMap; import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import javax.annotation.ParametersAreNonnullByDefault; import net.kyori.adventure.key.Key; import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.GeyserLogger; @@ -38,12 +34,18 @@ import org.geysermc.geyser.inventory.GeyserItemStack; import org.geysermc.geyser.item.type.Item; import org.geysermc.geyser.level.block.type.Block; import org.geysermc.geyser.session.GeyserSession; +import org.geysermc.geyser.session.cache.tags.HolderSet; import org.geysermc.geyser.session.cache.tags.Tag; import org.geysermc.geyser.session.cache.tags.TagRegistry; import org.geysermc.geyser.session.cache.tags.VanillaTag; import org.geysermc.geyser.util.MinecraftKey; import org.geysermc.mcprotocollib.protocol.packet.common.clientbound.ClientboundUpdateTagsPacket; +import javax.annotation.ParametersAreNonnullByDefault; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + /** * Manages information sent from the {@link ClientboundUpdateTagsPacket}. If that packet is not sent, all lists here * will remain empty, matching Java Edition behavior. @@ -142,6 +144,13 @@ public final class TagCache { return contains(get(tag), item.javaId()); } + /** + * @return true if the specified network ID is in the given holder set. + */ + public boolean is(HolderSet holderSet, int id, TagRegistry registry) { + return contains(holderSet.resolve(this, registry), id); + } + public int[] get(Tag tag) { if (tag instanceof VanillaTag vanillaTag) { return this.tags[tag.registry().ordinal()][vanillaTag.ordinal()]; diff --git a/core/src/main/java/org/geysermc/geyser/session/cache/tags/BlockTag.java b/core/src/main/java/org/geysermc/geyser/session/cache/tags/BlockTag.java index 093ac1a70..3b73494dd 100644 --- a/core/src/main/java/org/geysermc/geyser/session/cache/tags/BlockTag.java +++ b/core/src/main/java/org/geysermc/geyser/session/cache/tags/BlockTag.java @@ -25,11 +25,12 @@ package org.geysermc.geyser.session.cache.tags; -import java.util.HashMap; -import java.util.Map; import net.kyori.adventure.key.Key; import org.geysermc.geyser.util.MinecraftKey; +import java.util.HashMap; +import java.util.Map; + @SuppressWarnings("unused") public final class BlockTag { public static final Map ALL_BLOCK_TAGS = new HashMap<>(); diff --git a/core/src/main/java/org/geysermc/geyser/session/cache/tags/EnchantmentTag.java b/core/src/main/java/org/geysermc/geyser/session/cache/tags/EnchantmentTag.java index 8061d2450..0cb3bdf16 100644 --- a/core/src/main/java/org/geysermc/geyser/session/cache/tags/EnchantmentTag.java +++ b/core/src/main/java/org/geysermc/geyser/session/cache/tags/EnchantmentTag.java @@ -25,11 +25,12 @@ package org.geysermc.geyser.session.cache.tags; -import java.util.HashMap; -import java.util.Map; import net.kyori.adventure.key.Key; import org.geysermc.geyser.util.MinecraftKey; +import java.util.HashMap; +import java.util.Map; + @SuppressWarnings("unused") public final class EnchantmentTag { public static final Map ALL_ENCHANTMENT_TAGS = new HashMap<>(); diff --git a/core/src/main/java/org/geysermc/geyser/session/cache/tags/HolderSet.java b/core/src/main/java/org/geysermc/geyser/session/cache/tags/HolderSet.java index 7a9e276b9..f4f9ce666 100644 --- a/core/src/main/java/org/geysermc/geyser/session/cache/tags/HolderSet.java +++ b/core/src/main/java/org/geysermc/geyser/session/cache/tags/HolderSet.java @@ -31,7 +31,7 @@ import lombok.Data; import net.kyori.adventure.key.Key; import org.checkerframework.checker.nullness.qual.NonNull; import org.checkerframework.checker.nullness.qual.Nullable; -import org.geysermc.geyser.session.GeyserSession; +import org.geysermc.geyser.session.cache.TagCache; @Data public final class HolderSet { @@ -49,12 +49,12 @@ public final class HolderSet { this.holders = null; } - public int[] resolve(GeyserSession session, TagRegistry registry) { + public int[] resolve(TagCache tagCache, TagRegistry registry) { if (holders != null) { return holders; } - return session.getTagCache().get(Tag.createTag(registry, tagId)); + return tagCache.get(Tag.createTag(registry, tagId)); } public static HolderSet readHolderSet(@Nullable Object holderSet, Function keyIdMapping) { diff --git a/core/src/main/java/org/geysermc/geyser/session/cache/tags/ItemTag.java b/core/src/main/java/org/geysermc/geyser/session/cache/tags/ItemTag.java index 8ded6c073..039ac1cb9 100644 --- a/core/src/main/java/org/geysermc/geyser/session/cache/tags/ItemTag.java +++ b/core/src/main/java/org/geysermc/geyser/session/cache/tags/ItemTag.java @@ -25,11 +25,12 @@ package org.geysermc.geyser.session.cache.tags; -import java.util.HashMap; -import java.util.Map; import net.kyori.adventure.key.Key; import org.geysermc.geyser.util.MinecraftKey; +import java.util.HashMap; +import java.util.Map; + @SuppressWarnings("unused") public final class ItemTag { public static final Map ALL_ITEM_TAGS = new HashMap<>(); From 9a40e5de09786aca28eb60568ce76ee1b0846a1f Mon Sep 17 00:00:00 2001 From: Eclipse Date: Wed, 10 Jul 2024 19:29:36 +0000 Subject: [PATCH 06/12] Add some documentation --- .../updater/AnvilInventoryUpdater.java | 6 ++-- .../geyser/session/cache/TagCache.java | 10 ++++-- .../geyser/session/cache/tags/BlockTag.java | 3 ++ .../session/cache/tags/EnchantmentTag.java | 3 ++ .../geyser/session/cache/tags/HolderSet.java | 36 ++++++++++++++----- .../geyser/session/cache/tags/ItemTag.java | 3 ++ .../session/cache/tags/NonVanillaTag.java | 3 ++ .../geyser/session/cache/tags/Tag.java | 6 ++++ .../session/cache/tags/TagRegistry.java | 6 ++++ 9 files changed, 60 insertions(+), 16 deletions(-) diff --git a/core/src/main/java/org/geysermc/geyser/inventory/updater/AnvilInventoryUpdater.java b/core/src/main/java/org/geysermc/geyser/inventory/updater/AnvilInventoryUpdater.java index 61a18a632..efe243192 100644 --- a/core/src/main/java/org/geysermc/geyser/inventory/updater/AnvilInventoryUpdater.java +++ b/core/src/main/java/org/geysermc/geyser/inventory/updater/AnvilInventoryUpdater.java @@ -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,7 +41,6 @@ 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.TagRegistry; import org.geysermc.geyser.translator.inventory.InventoryTranslator; import org.geysermc.geyser.translator.text.MessageTranslator; import org.geysermc.geyser.util.ItemUtils; @@ -312,9 +310,9 @@ public class AnvilInventoryUpdater extends InventoryUpdater { for (Object2IntMap.Entry entry : getEnchantments(session, material).object2IntEntrySet()) { Enchantment enchantment = entry.getKey(); - boolean canApply = isEnchantedBook(input) || session.getTagCache().is(enchantment.supportedItems(), input.getJavaId(), TagRegistry.ITEM); + boolean canApply = isEnchantedBook(input) || session.getTagCache().is(enchantment.supportedItems(), input.getJavaId()); - int[] incompatibleEnchantments = enchantment.exclusiveSet().resolve(session.getTagCache(), TagRegistry.ENCHANTMENT); + int[] incompatibleEnchantments = enchantment.exclusiveSet().resolve(session.getTagCache()); for (int i : incompatibleEnchantments) { Enchantment incompatible = session.getRegistryCache().enchantments().byId(i); if (combinedEnchantments.containsKey(incompatible)) { diff --git a/core/src/main/java/org/geysermc/geyser/session/cache/TagCache.java b/core/src/main/java/org/geysermc/geyser/session/cache/TagCache.java index 9b6c32363..7aa8b2a3f 100644 --- a/core/src/main/java/org/geysermc/geyser/session/cache/TagCache.java +++ b/core/src/main/java/org/geysermc/geyser/session/cache/TagCache.java @@ -48,10 +48,11 @@ import java.util.Map; /** * Manages information sent from the {@link ClientboundUpdateTagsPacket}. If that packet is not sent, all lists here - * will remain empty, matching Java Edition behavior. + * will remain empty, matching Java Edition behavior. Only tags from registries in {@link TagRegistry} are stored. */ @ParametersAreNonnullByDefault public final class TagCache { + // Stores the indexes of non-vanilla tag keys in the tags array. private List> tagIndexMaps = new ArrayList<>(); private int[][][] tags = new int[TagRegistry.values().length][][]; @@ -147,10 +148,13 @@ public final class TagCache { /** * @return true if the specified network ID is in the given holder set. */ - public boolean is(HolderSet holderSet, int id, TagRegistry registry) { - return contains(holderSet.resolve(this, registry), id); + public boolean is(HolderSet holderSet, int id) { + return contains(holderSet.resolve(this), id); } + /** + * @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()]; diff --git a/core/src/main/java/org/geysermc/geyser/session/cache/tags/BlockTag.java b/core/src/main/java/org/geysermc/geyser/session/cache/tags/BlockTag.java index 3b73494dd..001072fc1 100644 --- a/core/src/main/java/org/geysermc/geyser/session/cache/tags/BlockTag.java +++ b/core/src/main/java/org/geysermc/geyser/session/cache/tags/BlockTag.java @@ -31,6 +31,9 @@ import org.geysermc.geyser.util.MinecraftKey; import java.util.HashMap; import java.util.Map; +/** + * Lists vanilla block tags. + */ @SuppressWarnings("unused") public final class BlockTag { public static final Map ALL_BLOCK_TAGS = new HashMap<>(); diff --git a/core/src/main/java/org/geysermc/geyser/session/cache/tags/EnchantmentTag.java b/core/src/main/java/org/geysermc/geyser/session/cache/tags/EnchantmentTag.java index 0cb3bdf16..f038742ed 100644 --- a/core/src/main/java/org/geysermc/geyser/session/cache/tags/EnchantmentTag.java +++ b/core/src/main/java/org/geysermc/geyser/session/cache/tags/EnchantmentTag.java @@ -31,6 +31,9 @@ import org.geysermc.geyser.util.MinecraftKey; import java.util.HashMap; import java.util.Map; +/** + * Lists vanilla enchantment tags. + */ @SuppressWarnings("unused") public final class EnchantmentTag { public static final Map ALL_ENCHANTMENT_TAGS = new HashMap<>(); diff --git a/core/src/main/java/org/geysermc/geyser/session/cache/tags/HolderSet.java b/core/src/main/java/org/geysermc/geyser/session/cache/tags/HolderSet.java index f4f9ce666..7bd11a57f 100644 --- a/core/src/main/java/org/geysermc/geyser/session/cache/tags/HolderSet.java +++ b/core/src/main/java/org/geysermc/geyser/session/cache/tags/HolderSet.java @@ -33,39 +33,57 @@ 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). + * + * 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 Key tagId; + private final @Nullable Tag tag; private final int @Nullable [] holders; public HolderSet(int @NonNull [] holders) { - this.tagId = null; + this.tag = null; this.holders = holders; } - public HolderSet(@NonNull Key tagId) { - this.tagId = tagId; + public HolderSet(@NonNull Tag tagId) { + this.tag = tagId; this.holders = null; } - public int[] resolve(TagCache tagCache, TagRegistry registry) { + /** + * 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; } - return tagCache.get(Tag.createTag(registry, tagId)); + assert tag != null; + return tagCache.get(tag); } - public static HolderSet readHolderSet(@Nullable Object holderSet, Function keyIdMapping) { + /** + * 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 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 + // 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[]{}); } diff --git a/core/src/main/java/org/geysermc/geyser/session/cache/tags/ItemTag.java b/core/src/main/java/org/geysermc/geyser/session/cache/tags/ItemTag.java index 039ac1cb9..218d3cfc4 100644 --- a/core/src/main/java/org/geysermc/geyser/session/cache/tags/ItemTag.java +++ b/core/src/main/java/org/geysermc/geyser/session/cache/tags/ItemTag.java @@ -31,6 +31,9 @@ import org.geysermc.geyser.util.MinecraftKey; import java.util.HashMap; import java.util.Map; +/** + * Lists vanilla item tags. + */ @SuppressWarnings("unused") public final class ItemTag { public static final Map ALL_ITEM_TAGS = new HashMap<>(); diff --git a/core/src/main/java/org/geysermc/geyser/session/cache/tags/NonVanillaTag.java b/core/src/main/java/org/geysermc/geyser/session/cache/tags/NonVanillaTag.java index 888e245ae..9cf9dcf7d 100644 --- a/core/src/main/java/org/geysermc/geyser/session/cache/tags/NonVanillaTag.java +++ b/core/src/main/java/org/geysermc/geyser/session/cache/tags/NonVanillaTag.java @@ -27,6 +27,9 @@ 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 { } diff --git a/core/src/main/java/org/geysermc/geyser/session/cache/tags/Tag.java b/core/src/main/java/org/geysermc/geyser/session/cache/tags/Tag.java index f3e8e526f..b735bb856 100644 --- a/core/src/main/java/org/geysermc/geyser/session/cache/tags/Tag.java +++ b/core/src/main/java/org/geysermc/geyser/session/cache/tags/Tag.java @@ -27,6 +27,12 @@ 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(); diff --git a/core/src/main/java/org/geysermc/geyser/session/cache/tags/TagRegistry.java b/core/src/main/java/org/geysermc/geyser/session/cache/tags/TagRegistry.java index 3a94ddd34..32594a002 100644 --- a/core/src/main/java/org/geysermc/geyser/session/cache/tags/TagRegistry.java +++ b/core/src/main/java/org/geysermc/geyser/session/cache/tags/TagRegistry.java @@ -31,6 +31,12 @@ 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 add a map for all the vanilla tags in the registry. These vanilla tags + * can be stored in a vanilla tag class, like {@link BlockTag} and {@link ItemTag}. + */ @Getter public enum TagRegistry { BLOCK("block", BlockTag.ALL_BLOCK_TAGS), From 8c8c46bf92a8361fa174b6bf82c05b002544494b Mon Sep 17 00:00:00 2001 From: Eclipse Date: Wed, 10 Jul 2024 19:37:10 +0000 Subject: [PATCH 07/12] Fix build and slightly adjust documentation --- .../org/geysermc/geyser/item/enchantment/Enchantment.java | 5 +++-- .../org/geysermc/geyser/session/cache/tags/HolderSet.java | 2 ++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/core/src/main/java/org/geysermc/geyser/item/enchantment/Enchantment.java b/core/src/main/java/org/geysermc/geyser/item/enchantment/Enchantment.java index 529a8748a..f159c730d 100644 --- a/core/src/main/java/org/geysermc/geyser/item/enchantment/Enchantment.java +++ b/core/src/main/java/org/geysermc/geyser/item/enchantment/Enchantment.java @@ -32,6 +32,7 @@ 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; @@ -55,12 +56,12 @@ public record Enchantment(String identifier, NbtMap data = context.data(); Set effects = readEnchantmentComponents(data.getCompound("effects")); - HolderSet supportedItems = HolderSet.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 = HolderSet.readHolderSet(data.get("exclusive_set"), context::getNetworkId); + HolderSet exclusiveSet = HolderSet.readHolderSet(TagRegistry.ENCHANTMENT, data.get("exclusive_set"), context::getNetworkId); BedrockEnchantment bedrockEnchantment = BedrockEnchantment.getByJavaIdentifier(context.id().asString()); diff --git a/core/src/main/java/org/geysermc/geyser/session/cache/tags/HolderSet.java b/core/src/main/java/org/geysermc/geyser/session/cache/tags/HolderSet.java index 7bd11a57f..78c27537f 100644 --- a/core/src/main/java/org/geysermc/geyser/session/cache/tags/HolderSet.java +++ b/core/src/main/java/org/geysermc/geyser/session/cache/tags/HolderSet.java @@ -36,6 +36,8 @@ 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 From 7c9842e597e1eb1b6c0700f5367387b7d4dad5a2 Mon Sep 17 00:00:00 2001 From: Eclipse Date: Wed, 10 Jul 2024 20:25:01 +0000 Subject: [PATCH 08/12] Fix some issues, still broken --- .../geyser/session/cache/TagCache.java | 30 ++++++++----------- .../session/cache/tags/TagRegistry.java | 4 +++ 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/core/src/main/java/org/geysermc/geyser/session/cache/TagCache.java b/core/src/main/java/org/geysermc/geyser/session/cache/TagCache.java index 7aa8b2a3f..6b2016ea4 100644 --- a/core/src/main/java/org/geysermc/geyser/session/cache/TagCache.java +++ b/core/src/main/java/org/geysermc/geyser/session/cache/TagCache.java @@ -58,10 +58,11 @@ public final class TagCache { public void loadPacket(GeyserSession session, ClientboundUpdateTagsPacket packet) { Map> allTags = packet.getTags(); + int tagsLoading = (int) allTags.keySet().stream().filter(TagRegistry::shouldLoad).count(); GeyserLogger logger = session.getGeyser().getLogger(); - this.tagIndexMaps = new ArrayList<>(allTags.size()); - this.tags = new int[allTags.size()][][]; + this.tagIndexMaps = new ArrayList<>(tagsLoading); + this.tags = new int[tagsLoading][][]; int i = 0; for (Key registryKey : allTags.keySet()) { @@ -91,7 +92,7 @@ public final class TagCache { } int[][] registryTagsArray = new int[0][]; - this.tagIndexMaps.set(i, loadTags(registryTags, registryTagsArray, registry)); + this.tagIndexMaps.add(loadTags(registryTags, registryTagsArray, registry)); this.tags[i] = registryTagsArray; i++; } @@ -99,22 +100,18 @@ public final class TagCache { private Object2IntMap loadTags(Map packetTags, int[][] tags, TagRegistry registry) { List vanillaTagKeys = List.copyOf(registry.getVanillaTags().keySet()); - int nonVanillaTagAmount = (int) packetTags.keySet().stream().filter(tag -> !vanillaTagKeys.contains(tag)).count(); + List nonVanillaTagKeys = packetTags.keySet().stream().filter(tag -> !vanillaTagKeys.contains(tag)).toList(); - List tagsBuilder = new ArrayList<>(vanillaTagKeys.size() + nonVanillaTagAmount); + List tagsBuilder = new ArrayList<>(vanillaTagKeys.size() + nonVanillaTagKeys.size()); Object2IntMap tagIndexMap = new Object2IntOpenHashMap<>(); - int nonVanillaTagIndex = vanillaTagKeys.size(); - for (Map.Entry tag : packetTags.entrySet()) { - int id; - if (vanillaTagKeys.contains(tag.getKey())) { - id = vanillaTagKeys.indexOf(tag.getKey()); - } else { - id = nonVanillaTagIndex; - nonVanillaTagIndex++; - } - tagsBuilder.set(id, tag.getValue()); - tagIndexMap.put(tag.getKey(), id); + for (Key vanillaTagKey : registry.getVanillaTags().keySet()) { + tagsBuilder.add(packetTags.getOrDefault(vanillaTagKey, new int[0])); + } + + for (Key nonVanillaTagKey : nonVanillaTagKeys) { + tagIndexMap.put(nonVanillaTagKey, tagsBuilder.size()); + tagsBuilder.add(packetTags.get(nonVanillaTagKey)); } tagsBuilder.toArray(tags); @@ -133,7 +130,6 @@ public final class TagCache { * @return true if the item tag is present and contains this item stack's Java ID. */ public boolean is(Tag tag, GeyserItemStack itemStack) { - assert tag.registry() == TagRegistry.ITEM; return is(tag, itemStack.asItem()); } diff --git a/core/src/main/java/org/geysermc/geyser/session/cache/tags/TagRegistry.java b/core/src/main/java/org/geysermc/geyser/session/cache/tags/TagRegistry.java index 32594a002..6734baa7b 100644 --- a/core/src/main/java/org/geysermc/geyser/session/cache/tags/TagRegistry.java +++ b/core/src/main/java/org/geysermc/geyser/session/cache/tags/TagRegistry.java @@ -51,6 +51,10 @@ public enum TagRegistry { this.vanillaTags = vanillaTags; } + public static boolean shouldLoad(Key registryKey) { + return valueOf(registryKey) != null; + } + @Nullable public static TagRegistry valueOf(Key registryKey) { for (TagRegistry registry : TagRegistry.values()) { From 444dad7407f6ecce946d17a5c1207c0f9a4ca0cb Mon Sep 17 00:00:00 2001 From: Eclipse Date: Thu, 11 Jul 2024 09:10:33 +0000 Subject: [PATCH 09/12] Fix more issues with registering vanilla tags, works better now --- .../java/org/geysermc/geyser/GeyserImpl.java | 2 + .../geyser/session/cache/TagCache.java | 14 +++---- .../geyser/session/cache/tags/BlockTag.java | 12 +++--- .../session/cache/tags/EnchantmentTag.java | 15 +++---- .../geyser/session/cache/tags/ItemTag.java | 12 +++--- .../session/cache/tags/TagRegistry.java | 42 ++++++++++++++----- 6 files changed, 54 insertions(+), 43 deletions(-) diff --git a/core/src/main/java/org/geysermc/geyser/GeyserImpl.java b/core/src/main/java/org/geysermc/geyser/GeyserImpl.java index 88cc74691..76097c364 100644 --- a/core/src/main/java/org/geysermc/geyser/GeyserImpl.java +++ b/core/src/main/java/org/geysermc/geyser/GeyserImpl.java @@ -79,6 +79,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; @@ -219,6 +220,7 @@ public class GeyserImpl implements GeyserApi { /* Initialize registries */ Registries.init(); BlockRegistries.init(); + TagRegistry.init(); RegistryCache.init(); diff --git a/core/src/main/java/org/geysermc/geyser/session/cache/TagCache.java b/core/src/main/java/org/geysermc/geyser/session/cache/TagCache.java index 6b2016ea4..26f40c192 100644 --- a/core/src/main/java/org/geysermc/geyser/session/cache/TagCache.java +++ b/core/src/main/java/org/geysermc/geyser/session/cache/TagCache.java @@ -66,7 +66,7 @@ public final class TagCache { int i = 0; for (Key registryKey : allTags.keySet()) { - TagRegistry registry = TagRegistry.valueOf(registryKey); + TagRegistry registry = TagRegistry.fromKey(registryKey); if (registry == null) { GeyserImpl.getInstance().getLogger().debug("Not loading tags for registry " + registryKey + " (registry is not defined in TagRegistry enum)"); continue; @@ -91,19 +91,18 @@ public final class TagCache { } } - int[][] registryTagsArray = new int[0][]; - this.tagIndexMaps.add(loadTags(registryTags, registryTagsArray, registry)); - this.tags[i] = registryTagsArray; + Object2IntMap tagIndexMap = new Object2IntOpenHashMap<>(); + this.tags[i] = loadTags(registryTags, tagIndexMap, registry); + this.tagIndexMaps.add(tagIndexMap); i++; } } - private Object2IntMap loadTags(Map packetTags, int[][] tags, TagRegistry registry) { + private int[][] loadTags(Map packetTags, Object2IntMap tagIndexMap, TagRegistry registry) { List vanillaTagKeys = List.copyOf(registry.getVanillaTags().keySet()); List nonVanillaTagKeys = packetTags.keySet().stream().filter(tag -> !vanillaTagKeys.contains(tag)).toList(); List tagsBuilder = new ArrayList<>(vanillaTagKeys.size() + nonVanillaTagKeys.size()); - Object2IntMap tagIndexMap = new Object2IntOpenHashMap<>(); for (Key vanillaTagKey : registry.getVanillaTags().keySet()) { tagsBuilder.add(packetTags.getOrDefault(vanillaTagKey, new int[0])); @@ -114,8 +113,7 @@ public final class TagCache { tagsBuilder.add(packetTags.get(nonVanillaTagKey)); } - tagsBuilder.toArray(tags); - return tagIndexMap; + return tagsBuilder.toArray(new int[0][]); } /** diff --git a/core/src/main/java/org/geysermc/geyser/session/cache/tags/BlockTag.java b/core/src/main/java/org/geysermc/geyser/session/cache/tags/BlockTag.java index 001072fc1..86f361742 100644 --- a/core/src/main/java/org/geysermc/geyser/session/cache/tags/BlockTag.java +++ b/core/src/main/java/org/geysermc/geyser/session/cache/tags/BlockTag.java @@ -36,8 +36,6 @@ import java.util.Map; */ @SuppressWarnings("unused") public final class BlockTag { - public static final Map ALL_BLOCK_TAGS = new HashMap<>(); - public static final Tag WOOL = register("wool"); public static final Tag PLANKS = register("planks"); public static final Tag STONE_BRICKS = register("stone_bricks"); @@ -226,10 +224,10 @@ public final class BlockTag { private BlockTag() {} private static Tag register(String name) { - Key identifier = MinecraftKey.key(name); - int geyserId = ALL_BLOCK_TAGS.size(); - Tag tag = new VanillaTag(TagRegistry.BLOCK, identifier, geyserId); - ALL_BLOCK_TAGS.put(identifier, tag); - return tag; + return TagRegistry.BLOCK.registerVanillaTag(MinecraftKey.key(name)); + } + + public static void init() { + // no-op } } diff --git a/core/src/main/java/org/geysermc/geyser/session/cache/tags/EnchantmentTag.java b/core/src/main/java/org/geysermc/geyser/session/cache/tags/EnchantmentTag.java index f038742ed..1632efce9 100644 --- a/core/src/main/java/org/geysermc/geyser/session/cache/tags/EnchantmentTag.java +++ b/core/src/main/java/org/geysermc/geyser/session/cache/tags/EnchantmentTag.java @@ -28,16 +28,11 @@ package org.geysermc.geyser.session.cache.tags; import net.kyori.adventure.key.Key; import org.geysermc.geyser.util.MinecraftKey; -import java.util.HashMap; -import java.util.Map; - /** * Lists vanilla enchantment tags. */ @SuppressWarnings("unused") public final class EnchantmentTag { - public static final Map ALL_ENCHANTMENT_TAGS = new HashMap<>(); - 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"); @@ -78,10 +73,10 @@ public final class EnchantmentTag { private EnchantmentTag() {} private static Tag register(String name) { - Key identifier = MinecraftKey.key(name); - int geyserId = ALL_ENCHANTMENT_TAGS.size(); - Tag tag = new VanillaTag(TagRegistry.ENCHANTMENT, identifier, geyserId); - ALL_ENCHANTMENT_TAGS.put(MinecraftKey.key(name), tag); - return tag; + return TagRegistry.ENCHANTMENT.registerVanillaTag(MinecraftKey.key(name)); + } + + public static void init() { + // no-op } } diff --git a/core/src/main/java/org/geysermc/geyser/session/cache/tags/ItemTag.java b/core/src/main/java/org/geysermc/geyser/session/cache/tags/ItemTag.java index 218d3cfc4..8291b6947 100644 --- a/core/src/main/java/org/geysermc/geyser/session/cache/tags/ItemTag.java +++ b/core/src/main/java/org/geysermc/geyser/session/cache/tags/ItemTag.java @@ -36,8 +36,6 @@ import java.util.Map; */ @SuppressWarnings("unused") public final class ItemTag { - public static final Map ALL_ITEM_TAGS = new HashMap<>(); - public static final Tag WOOL = register("wool"); public static final Tag PLANKS = register("planks"); public static final Tag STONE_BRICKS = register("stone_bricks"); @@ -189,10 +187,10 @@ public final class ItemTag { private ItemTag() {} private static Tag register(String name) { - Key identifier = MinecraftKey.key(name); - int geyserId = ALL_ITEM_TAGS.size(); - Tag tag = new VanillaTag(TagRegistry.ITEM, identifier, geyserId); - ALL_ITEM_TAGS.put(MinecraftKey.key(name), tag); - return tag; + return TagRegistry.ITEM.registerVanillaTag(MinecraftKey.key(name)); + } + + public static void init() { + // no-op } } diff --git a/core/src/main/java/org/geysermc/geyser/session/cache/tags/TagRegistry.java b/core/src/main/java/org/geysermc/geyser/session/cache/tags/TagRegistry.java index 6734baa7b..ac969cbce 100644 --- a/core/src/main/java/org/geysermc/geyser/session/cache/tags/TagRegistry.java +++ b/core/src/main/java/org/geysermc/geyser/session/cache/tags/TagRegistry.java @@ -25,8 +25,8 @@ 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; @@ -34,29 +34,43 @@ 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 add a map for all the vanilla tags in the registry. These vanilla tags - * can be stored in a vanilla tag class, like {@link BlockTag} and {@link ItemTag}. + * 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. */ -@Getter public enum TagRegistry { - BLOCK("block", BlockTag.ALL_BLOCK_TAGS), - ITEM("item", ItemTag.ALL_ITEM_TAGS), - ENCHANTMENT("enchantment", EnchantmentTag.ALL_ENCHANTMENT_TAGS); + BLOCK("block"), + ITEM("item"), + ENCHANTMENT("enchantment"); private final Key registryKey; private final Map vanillaTags; - TagRegistry(String registry, Map vanillaTags) { + TagRegistry(String registry) { this.registryKey = MinecraftKey.key(registry); - this.vanillaTags = vanillaTags; + 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; + } + + public Map getVanillaTags() { + return Map.copyOf(vanillaTags); } public static boolean shouldLoad(Key registryKey) { - return valueOf(registryKey) != null; + return fromKey(registryKey) != null; } @Nullable - public static TagRegistry valueOf(Key registryKey) { + public static TagRegistry fromKey(Key registryKey) { for (TagRegistry registry : TagRegistry.values()) { if (registry.registryKey.equals(registryKey)) { return registry; @@ -64,4 +78,10 @@ public enum TagRegistry { } return null; } + + public static void init() { + BlockTag.init(); + ItemTag.init(); + EnchantmentTag.init(); + } } From e5bcab1ec3dccff60727cdf768b2dfee4f987a70 Mon Sep 17 00:00:00 2001 From: Eclipse Date: Fri, 12 Jul 2024 09:06:55 +0000 Subject: [PATCH 10/12] Fix all issues with vanilla and non-vanilla tags, fix documentation a bit. --- .../geyser/session/cache/TagCache.java | 37 +++++++++---------- .../geyser/session/cache/tags/BlockTag.java | 4 -- .../session/cache/tags/EnchantmentTag.java | 1 - .../geyser/session/cache/tags/ItemTag.java | 4 -- .../session/cache/tags/TagRegistry.java | 2 +- 5 files changed, 18 insertions(+), 30 deletions(-) diff --git a/core/src/main/java/org/geysermc/geyser/session/cache/TagCache.java b/core/src/main/java/org/geysermc/geyser/session/cache/TagCache.java index 26f40c192..0f33218e5 100644 --- a/core/src/main/java/org/geysermc/geyser/session/cache/TagCache.java +++ b/core/src/main/java/org/geysermc/geyser/session/cache/TagCache.java @@ -28,7 +28,6 @@ package org.geysermc.geyser.session.cache; import it.unimi.dsi.fastutil.objects.Object2IntMap; import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap; import net.kyori.adventure.key.Key; -import org.geysermc.geyser.GeyserImpl; import org.geysermc.geyser.GeyserLogger; import org.geysermc.geyser.inventory.GeyserItemStack; import org.geysermc.geyser.item.type.Item; @@ -42,7 +41,6 @@ import org.geysermc.geyser.util.MinecraftKey; import org.geysermc.mcprotocollib.protocol.packet.common.clientbound.ClientboundUpdateTagsPacket; import javax.annotation.ParametersAreNonnullByDefault; -import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -53,22 +51,20 @@ import java.util.Map; @ParametersAreNonnullByDefault public final class TagCache { // Stores the indexes of non-vanilla tag keys in the tags array. - private List> tagIndexMaps = new ArrayList<>(); + private Object2IntMap[] tagIndexMaps = new Object2IntMap[TagRegistry.values().length]; private int[][][] tags = new int[TagRegistry.values().length][][]; public void loadPacket(GeyserSession session, ClientboundUpdateTagsPacket packet) { Map> allTags = packet.getTags(); - int tagsLoading = (int) allTags.keySet().stream().filter(TagRegistry::shouldLoad).count(); GeyserLogger logger = session.getGeyser().getLogger(); - this.tagIndexMaps = new ArrayList<>(tagsLoading); - this.tags = new int[tagsLoading][][]; + this.tagIndexMaps = new Object2IntMap[TagRegistry.values().length]; + this.tags = new int[TagRegistry.values().length][][]; - int i = 0; for (Key registryKey : allTags.keySet()) { TagRegistry registry = TagRegistry.fromKey(registryKey); if (registry == null) { - GeyserImpl.getInstance().getLogger().debug("Not loading tags for registry " + registryKey + " (registry is not defined in TagRegistry enum)"); + logger.debug("Not loading tags for registry " + registryKey + " (registry is not defined in TagRegistry enum)"); continue; } @@ -92,28 +88,29 @@ public final class TagCache { } Object2IntMap tagIndexMap = new Object2IntOpenHashMap<>(); - this.tags[i] = loadTags(registryTags, tagIndexMap, registry); - this.tagIndexMaps.add(tagIndexMap); - i++; + this.tags[registry.ordinal()] = loadTags(registryTags, tagIndexMap, registry); + this.tagIndexMaps[registry.ordinal()] = tagIndexMap; } } private int[][] loadTags(Map packetTags, Object2IntMap tagIndexMap, TagRegistry registry) { - List vanillaTagKeys = List.copyOf(registry.getVanillaTags().keySet()); - List nonVanillaTagKeys = packetTags.keySet().stream().filter(tag -> !vanillaTagKeys.contains(tag)).toList(); + Map vanillaTags = registry.getVanillaTags(); + List nonVanillaTagKeys = packetTags.keySet().stream().filter(tag -> !vanillaTags.containsKey(tag)).toList(); - List tagsBuilder = new ArrayList<>(vanillaTagKeys.size() + nonVanillaTagKeys.size()); + int[][] tags = new int[vanillaTags.size() + nonVanillaTagKeys.size()][]; - for (Key vanillaTagKey : registry.getVanillaTags().keySet()) { - tagsBuilder.add(packetTags.getOrDefault(vanillaTagKey, new int[0])); + for (Map.Entry vanillaTag : vanillaTags.entrySet()) { + tags[((VanillaTag) vanillaTag.getValue()).ordinal()] = packetTags.getOrDefault(vanillaTag.getKey(), new int[0]); } + int tagIndex = vanillaTags.size(); for (Key nonVanillaTagKey : nonVanillaTagKeys) { - tagIndexMap.put(nonVanillaTagKey, tagsBuilder.size()); - tagsBuilder.add(packetTags.get(nonVanillaTagKey)); + tags[tagIndex] = packetTags.get(nonVanillaTagKey); + tagIndexMap.put(nonVanillaTagKey, tagIndex); + tagIndex++; } - return tagsBuilder.toArray(new int[0][]); + return tags; } /** @@ -155,7 +152,7 @@ public final class TagCache { } int registryIndex = tag.registry().ordinal(); - Object2IntMap tagIndexMap = this.tagIndexMaps.get(registryIndex); + Object2IntMap tagIndexMap = this.tagIndexMaps[registryIndex]; if (!tagIndexMap.containsKey(tag.tag())) { return new int[0]; } diff --git a/core/src/main/java/org/geysermc/geyser/session/cache/tags/BlockTag.java b/core/src/main/java/org/geysermc/geyser/session/cache/tags/BlockTag.java index 86f361742..63320d723 100644 --- a/core/src/main/java/org/geysermc/geyser/session/cache/tags/BlockTag.java +++ b/core/src/main/java/org/geysermc/geyser/session/cache/tags/BlockTag.java @@ -25,12 +25,8 @@ package org.geysermc.geyser.session.cache.tags; -import net.kyori.adventure.key.Key; import org.geysermc.geyser.util.MinecraftKey; -import java.util.HashMap; -import java.util.Map; - /** * Lists vanilla block tags. */ diff --git a/core/src/main/java/org/geysermc/geyser/session/cache/tags/EnchantmentTag.java b/core/src/main/java/org/geysermc/geyser/session/cache/tags/EnchantmentTag.java index 1632efce9..eb638aaa6 100644 --- a/core/src/main/java/org/geysermc/geyser/session/cache/tags/EnchantmentTag.java +++ b/core/src/main/java/org/geysermc/geyser/session/cache/tags/EnchantmentTag.java @@ -25,7 +25,6 @@ package org.geysermc.geyser.session.cache.tags; -import net.kyori.adventure.key.Key; import org.geysermc.geyser.util.MinecraftKey; /** diff --git a/core/src/main/java/org/geysermc/geyser/session/cache/tags/ItemTag.java b/core/src/main/java/org/geysermc/geyser/session/cache/tags/ItemTag.java index 8291b6947..c731c99ea 100644 --- a/core/src/main/java/org/geysermc/geyser/session/cache/tags/ItemTag.java +++ b/core/src/main/java/org/geysermc/geyser/session/cache/tags/ItemTag.java @@ -25,12 +25,8 @@ package org.geysermc.geyser.session.cache.tags; -import net.kyori.adventure.key.Key; import org.geysermc.geyser.util.MinecraftKey; -import java.util.HashMap; -import java.util.Map; - /** * Lists vanilla item tags. */ diff --git a/core/src/main/java/org/geysermc/geyser/session/cache/tags/TagRegistry.java b/core/src/main/java/org/geysermc/geyser/session/cache/tags/TagRegistry.java index ac969cbce..d20fd61b0 100644 --- a/core/src/main/java/org/geysermc/geyser/session/cache/tags/TagRegistry.java +++ b/core/src/main/java/org/geysermc/geyser/session/cache/tags/TagRegistry.java @@ -35,7 +35,7 @@ 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 + * 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 { From 7fa4f27c5a16a86a2d0057f75c755430774b9c54 Mon Sep 17 00:00:00 2001 From: Eclipse Date: Fri, 12 Jul 2024 09:23:47 +0000 Subject: [PATCH 11/12] Small cleanup --- .../main/java/org/geysermc/geyser/session/cache/TagCache.java | 1 + .../org/geysermc/geyser/session/cache/tags/TagRegistry.java | 4 ---- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/core/src/main/java/org/geysermc/geyser/session/cache/TagCache.java b/core/src/main/java/org/geysermc/geyser/session/cache/TagCache.java index 0f33218e5..e235a72fd 100644 --- a/core/src/main/java/org/geysermc/geyser/session/cache/TagCache.java +++ b/core/src/main/java/org/geysermc/geyser/session/cache/TagCache.java @@ -99,6 +99,7 @@ public final class TagCache { 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 vanillaTag : vanillaTags.entrySet()) { tags[((VanillaTag) vanillaTag.getValue()).ordinal()] = packetTags.getOrDefault(vanillaTag.getKey(), new int[0]); } diff --git a/core/src/main/java/org/geysermc/geyser/session/cache/tags/TagRegistry.java b/core/src/main/java/org/geysermc/geyser/session/cache/tags/TagRegistry.java index d20fd61b0..9e57ea5ab 100644 --- a/core/src/main/java/org/geysermc/geyser/session/cache/tags/TagRegistry.java +++ b/core/src/main/java/org/geysermc/geyser/session/cache/tags/TagRegistry.java @@ -65,10 +65,6 @@ public enum TagRegistry { return Map.copyOf(vanillaTags); } - public static boolean shouldLoad(Key registryKey) { - return fromKey(registryKey) != null; - } - @Nullable public static TagRegistry fromKey(Key registryKey) { for (TagRegistry registry : TagRegistry.values()) { From 1c5819328ac0388a999d0eca444cc601ce475065 Mon Sep 17 00:00:00 2001 From: Eclipse Date: Fri, 19 Jul 2024 14:42:00 +0000 Subject: [PATCH 12/12] Use IllegalArgumentException instead of asserting and make TagRegistry#getVanillaTags return original map --- .../org/geysermc/geyser/session/cache/TagCache.java | 8 ++++++-- .../geyser/session/cache/tags/TagRegistry.java | 12 ++++++++---- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/core/src/main/java/org/geysermc/geyser/session/cache/TagCache.java b/core/src/main/java/org/geysermc/geyser/session/cache/TagCache.java index e235a72fd..4c312b416 100644 --- a/core/src/main/java/org/geysermc/geyser/session/cache/TagCache.java +++ b/core/src/main/java/org/geysermc/geyser/session/cache/TagCache.java @@ -118,7 +118,9 @@ public final class TagCache { * @return true if the block tag is present and contains this block mapping's Java ID. */ public boolean is(Tag tag, Block block) { - assert tag.registry() == TagRegistry.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()); } @@ -133,7 +135,9 @@ public final class TagCache { * @return true if the item tag is present and contains this item's Java ID. */ public boolean is(Tag tag, Item item) { - assert tag.registry() == TagRegistry.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()); } diff --git a/core/src/main/java/org/geysermc/geyser/session/cache/tags/TagRegistry.java b/core/src/main/java/org/geysermc/geyser/session/cache/tags/TagRegistry.java index 9e57ea5ab..37c6b6aba 100644 --- a/core/src/main/java/org/geysermc/geyser/session/cache/tags/TagRegistry.java +++ b/core/src/main/java/org/geysermc/geyser/session/cache/tags/TagRegistry.java @@ -27,6 +27,7 @@ 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; @@ -44,6 +45,13 @@ public enum TagRegistry { 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 vanillaTags; TagRegistry(String registry) { @@ -61,10 +69,6 @@ public enum TagRegistry { return tag; } - public Map getVanillaTags() { - return Map.copyOf(vanillaTags); - } - @Nullable public static TagRegistry fromKey(Key registryKey) { for (TagRegistry registry : TagRegistry.values()) {