From a7502a6b3aa6c7260b3106e4cbeeca605d99f577 Mon Sep 17 00:00:00 2001 From: Eclipse Date: Fri, 28 Mar 2025 18:19:43 +0000 Subject: [PATCH] Adventure mode predicate hashing --- .../geyser/item/hashing/DataComponentHashers.java | 3 ++- .../org/geysermc/geyser/item/hashing/RegistryHasher.java | 9 +++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/org/geysermc/geyser/item/hashing/DataComponentHashers.java b/core/src/main/java/org/geysermc/geyser/item/hashing/DataComponentHashers.java index 90a9067f6..cfbc7912b 100644 --- a/core/src/main/java/org/geysermc/geyser/item/hashing/DataComponentHashers.java +++ b/core/src/main/java/org/geysermc/geyser/item/hashing/DataComponentHashers.java @@ -97,7 +97,8 @@ public class DataComponentHashers { register(DataComponentTypes.RARITY, MinecraftHasher.RARITY); register(DataComponentTypes.ENCHANTMENTS, RegistryHasher.ITEM_ENCHANTMENTS); - // TODO can place on/can break on, complicated + register(DataComponentTypes.CAN_PLACE_ON, RegistryHasher.ADVENTURE_MODE_PREDICATE); + register(DataComponentTypes.CAN_BREAK, RegistryHasher.ADVENTURE_MODE_PREDICATE); // TODO needs tests register(DataComponentTypes.ATTRIBUTE_MODIFIERS, RegistryHasher.ATTRIBUTE_MODIFIER_ENTRY.list().convert(ItemAttributeModifiers::getModifiers)); // TODO needs tests registerMap(DataComponentTypes.CUSTOM_MODEL_DATA, builder -> builder diff --git a/core/src/main/java/org/geysermc/geyser/item/hashing/RegistryHasher.java b/core/src/main/java/org/geysermc/geyser/item/hashing/RegistryHasher.java index 4f948c847..4b38bfaad 100644 --- a/core/src/main/java/org/geysermc/geyser/item/hashing/RegistryHasher.java +++ b/core/src/main/java/org/geysermc/geyser/item/hashing/RegistryHasher.java @@ -50,6 +50,7 @@ import org.geysermc.mcprotocollib.protocol.data.game.entity.attribute.ModifierOp import org.geysermc.mcprotocollib.protocol.data.game.entity.metadata.PaintingVariant; import org.geysermc.mcprotocollib.protocol.data.game.entity.type.EntityType; import org.geysermc.mcprotocollib.protocol.data.game.item.ItemStack; +import org.geysermc.mcprotocollib.protocol.data.game.item.component.AdventureModePredicate; import org.geysermc.mcprotocollib.protocol.data.game.item.component.ArmorTrim; import org.geysermc.mcprotocollib.protocol.data.game.item.component.BannerPatternLayer; import org.geysermc.mcprotocollib.protocol.data.game.item.component.BeehiveOccupant; @@ -153,6 +154,14 @@ public interface RegistryHasher extends MinecraftHasher { MinecraftHasher ITEM_ENCHANTMENTS = MinecraftHasher.map(RegistryHasher.ENCHANTMENT, MinecraftHasher.INT).convert(ItemEnchantments::getEnchantments); + MinecraftHasher BLOCK_PREDICATE = MinecraftHasher.mapBuilder(builder -> builder + .optionalNullable("blocks", BLOCK.holderSet(), AdventureModePredicate.BlockPredicate::getBlocks) + .optionalNullable("nbt", NBT_MAP, AdventureModePredicate.BlockPredicate::getNbt)); // Property and data component matchers are, unfortunately, too complicated to include here + + // Encode as a single element if the list only has one element + MinecraftHasher ADVENTURE_MODE_PREDICATE = MinecraftHasher.either(BLOCK_PREDICATE, + predicate -> predicate.getPredicates().size() == 1 ? predicate.getPredicates().getFirst() : null, BLOCK_PREDICATE.list(), AdventureModePredicate::getPredicates); + MinecraftHasher ATTRIBUTE_MODIFIER_OPERATION = MinecraftHasher.fromEnum(operation -> switch (operation) { case ADD -> "add_value"; case ADD_MULTIPLIED_BASE -> "add_multiplied_base";