From ae0179be8f6e314f00b6c740ddb60107e0e5108d Mon Sep 17 00:00:00 2001 From: Sollace Date: Sun, 11 Feb 2024 14:01:07 +0000 Subject: [PATCH 1/4] Fix compatibility with Synatra Connector / Froge --- gradle.properties | 2 +- lib/reach-entity-attributes-2.3.3.jar | Bin 23920 -> 0 bytes lib/reach-entity-attributes-2.3.4.jar | Bin 0 -> 25242 bytes .../unicopia/UnicopiaMixinPlugin.java | 3 + .../entity/collision/EntityCollisions.java | 4 +- .../unicopia/mixin/MixinBoatEntity.java | 7 ++- .../unicopia/mixin/MixinEntityView.java | 32 +++++++++++ .../unicopia/mixin/MixinWorld.java | 21 ------- .../mixin/forgified/MixinIForgeBoat.java | 54 ++++++++++++++++++ src/main/resources/unicopia.mixin.json | 4 +- 10 files changed, 101 insertions(+), 26 deletions(-) delete mode 100644 lib/reach-entity-attributes-2.3.3.jar create mode 100644 lib/reach-entity-attributes-2.3.4.jar create mode 100644 src/main/java/com/minelittlepony/unicopia/mixin/MixinEntityView.java create mode 100644 src/main/java/com/minelittlepony/unicopia/mixin/forgified/MixinIForgeBoat.java diff --git a/gradle.properties b/gradle.properties index 14c41bd3..950040b3 100644 --- a/gradle.properties +++ b/gradle.properties @@ -24,7 +24,7 @@ org.gradle.daemon=false modmenu_version=7.0.0-beta.2 minelp_version=4.10.4+1.20.1 kirin_version=1.15.4+1.20 - reach_attributes_version=2.3.3 + reach_attributes_version=2.3.4 trinkets_version=3.7.1 terraformer_api_version=7.0.0-beta.1 diff --git a/lib/reach-entity-attributes-2.3.3.jar b/lib/reach-entity-attributes-2.3.3.jar deleted file mode 100644 index 40ddce2185dccbe38e21947af9a73a1dce125160..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23920 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 GfByp}IYv?d literal 0 HcmV?d00001 diff --git a/src/main/java/com/minelittlepony/unicopia/UnicopiaMixinPlugin.java b/src/main/java/com/minelittlepony/unicopia/UnicopiaMixinPlugin.java index df5394d9..8f33d14a 100644 --- a/src/main/java/com/minelittlepony/unicopia/UnicopiaMixinPlugin.java +++ b/src/main/java/com/minelittlepony/unicopia/UnicopiaMixinPlugin.java @@ -38,6 +38,9 @@ public class UnicopiaMixinPlugin implements IMixinConfigPlugin { if (mixinClassName.indexOf("minelp") != -1) { return FabricLoader.getInstance().isModLoaded("minelp"); } + if (mixinClassName.indexOf("forgified") != -1) { + return FabricLoader.getInstance().isModLoaded("connectormod"); + } } return true; } diff --git a/src/main/java/com/minelittlepony/unicopia/entity/collision/EntityCollisions.java b/src/main/java/com/minelittlepony/unicopia/entity/collision/EntityCollisions.java index 9bad7931..d2d65f3e 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/collision/EntityCollisions.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/collision/EntityCollisions.java @@ -17,7 +17,7 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Box; import net.minecraft.util.shape.VoxelShape; import net.minecraft.util.shape.VoxelShapes; -import net.minecraft.world.WorldAccess; +import net.minecraft.world.EntityView; public class EntityCollisions { @@ -40,7 +40,7 @@ public class EntityCollisions { } } - public static List getColissonShapes(@Nullable Entity entity, WorldAccess world, Box box) { + public static List getColissonShapes(@Nullable Entity entity, EntityView world, Box box) { ShapeContext ctx = entity == null ? ShapeContext.absent() : ShapeContext.of(entity); return collectCollisionBoxes(box, collector -> { world.getOtherEntities(entity, box.expand(50), e -> { diff --git a/src/main/java/com/minelittlepony/unicopia/mixin/MixinBoatEntity.java b/src/main/java/com/minelittlepony/unicopia/mixin/MixinBoatEntity.java index 392cf967..76ba1b29 100644 --- a/src/main/java/com/minelittlepony/unicopia/mixin/MixinBoatEntity.java +++ b/src/main/java/com/minelittlepony/unicopia/mixin/MixinBoatEntity.java @@ -31,7 +31,12 @@ abstract class MixinBoatEntity extends Entity implements LavaAffine { "fall", "canAddPassenger" }, - at = @At(value = "FIELD", target = "net/minecraft/registry/tag/FluidTags.WATER:Lnet/minecraft/registry/tag/TagKey;", opcode = Opcodes.GETSTATIC) + at = @At( + value = "FIELD", + target = "net/minecraft/registry/tag/FluidTags.WATER:Lnet/minecraft/registry/tag/TagKey;", + opcode = Opcodes.GETSTATIC + ), + require = 0 // Forge ) private TagKey redirectFluidTag() { return isLavaAffine() ? FluidTags.LAVA : FluidTags.WATER; diff --git a/src/main/java/com/minelittlepony/unicopia/mixin/MixinEntityView.java b/src/main/java/com/minelittlepony/unicopia/mixin/MixinEntityView.java new file mode 100644 index 00000000..c2de6378 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/mixin/MixinEntityView.java @@ -0,0 +1,32 @@ +package com.minelittlepony.unicopia.mixin; + +import java.util.List; +import java.util.stream.Stream; + +import org.jetbrains.annotations.Nullable; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import com.minelittlepony.unicopia.entity.collision.EntityCollisions; + +import net.minecraft.entity.Entity; +import net.minecraft.util.math.Box; +import net.minecraft.util.shape.VoxelShape; +import net.minecraft.world.EntityView; + +@Mixin(EntityView.class) +interface MixinEntityView { + @Inject(method = "getEntityCollisions(Lnet/minecraft/entity/Entity;Lnet/minecraft/util/math/Box;)Ljava/util/List;", at = @At("RETURN"), cancellable = true) + private void onGetEntityCollisions(@Nullable Entity entity, Box box, CallbackInfoReturnable> info) { + if (box.getAverageSideLength() < 1.0E-7D) { + return; + } + + List shapes = EntityCollisions.getColissonShapes(entity, (EntityView)this, box); + if (!shapes.isEmpty()) { + info.setReturnValue(Stream.concat(shapes.stream(), info.getReturnValue().stream()).toList()); + } + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/mixin/MixinWorld.java b/src/main/java/com/minelittlepony/unicopia/mixin/MixinWorld.java index d3237ca4..eda9c5b4 100644 --- a/src/main/java/com/minelittlepony/unicopia/mixin/MixinWorld.java +++ b/src/main/java/com/minelittlepony/unicopia/mixin/MixinWorld.java @@ -1,26 +1,17 @@ package com.minelittlepony.unicopia.mixin; -import java.util.List; import java.util.Stack; import java.util.function.Supplier; -import java.util.stream.Stream; - -import org.jetbrains.annotations.Nullable; - import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.ModifyVariable; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import com.minelittlepony.unicopia.entity.collision.EntityCollisions; import com.minelittlepony.unicopia.entity.duck.RotatedView; import com.minelittlepony.unicopia.server.world.BlockDestructionManager; import net.minecraft.block.BlockState; -import net.minecraft.entity.Entity; import net.minecraft.util.math.BlockPos; -import net.minecraft.util.math.Box; -import net.minecraft.util.shape.VoxelShape; import net.minecraft.world.World; import net.minecraft.world.WorldAccess; @@ -47,18 +38,6 @@ abstract class MixinWorld implements WorldAccess, BlockDestructionManager.Source return destructions.get(); } - @Override - public List getEntityCollisions(@Nullable Entity entity, Box box) { - if (box.getAverageSideLength() >= 1.0E-7D) { - List shapes = EntityCollisions.getColissonShapes(entity, this, box); - if (!shapes.isEmpty()) { - return Stream.concat(shapes.stream(), WorldAccess.super.getEntityCollisions(entity, box).stream()).toList(); - } - } - - return WorldAccess.super.getEntityCollisions(entity, box); - } - @ModifyVariable(method = "setBlockState(Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;II)Z", at = @At("HEAD")) private BlockPos modifyBlockPos(BlockPos pos) { pos = applyRotation(pos); diff --git a/src/main/java/com/minelittlepony/unicopia/mixin/forgified/MixinIForgeBoat.java b/src/main/java/com/minelittlepony/unicopia/mixin/forgified/MixinIForgeBoat.java new file mode 100644 index 00000000..dd7abfe8 --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/mixin/forgified/MixinIForgeBoat.java @@ -0,0 +1,54 @@ +package com.minelittlepony.unicopia.mixin.forgified; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Pseudo; +import org.spongepowered.asm.mixin.injection.*; +import com.minelittlepony.unicopia.entity.duck.LavaAffine; +import net.minecraft.fluid.Fluid; +import net.minecraft.fluid.FluidState; +import net.minecraft.fluid.Fluids; +import net.minecraft.registry.tag.FluidTags; + +@Pseudo +@Mixin(targets = "net.minecraftforge.common.extensions.IForgeBoat") +interface MixinIForgeBoat { + @ModifyVariable( + method = "canBoatInFluid(Lnet/minecraft/fluid/FluidState;)Z", + at = @At("HEAD"), + ordinal = 0, + argsOnly = true, + require = 0 + ) + private FluidState modifyFluidState(FluidState incoming) { + if (this instanceof LavaAffine a && a.isLavaAffine()) { + if (incoming.isIn(FluidTags.WATER)) { + return Fluids.LAVA.getDefaultState(); + } + if (incoming.isIn(FluidTags.LAVA)) { + return Fluids.WATER.getDefaultState(); + } + } + + return incoming; + } + @SuppressWarnings("deprecation") + @ModifyVariable( + method = "canBoatInFluid(Lnet/minecraft/fluid/Fluid;)Z", + at = @At("HEAD"), + ordinal = 0, + argsOnly = true, + require = 0 + ) + private Fluid modifyFluid(Fluid incoming) { + if (this instanceof LavaAffine a && a.isLavaAffine()) { + if (incoming.isIn(FluidTags.WATER)) { + return Fluids.LAVA; + } + if (incoming.isIn(FluidTags.LAVA)) { + return Fluids.WATER; + } + } + + return incoming; + } +} diff --git a/src/main/resources/unicopia.mixin.json b/src/main/resources/unicopia.mixin.json index 81c55c34..549625a7 100644 --- a/src/main/resources/unicopia.mixin.json +++ b/src/main/resources/unicopia.mixin.json @@ -20,6 +20,7 @@ "MixinEnchantmentHelper", "MixinFallLocation", "MixinEntity", + "MixinEntityView", "MixinEntityShapeContext", "MixinFallingBlock", "MixinFallingBlockEntity", @@ -57,7 +58,8 @@ "trinkets.MixinTrinketInventory", "trinkets.MixinScreenHandler", "seasons.MixinFertilizableUtil", - "ad_astra.MixinOxygenUtils" + "ad_astra.MixinOxygenUtils", + "forgified.MixinIForgeBoat" ], "client": [ "client.MixinAnimalModel", From 623d231f2f858e186debc57543f68d01d40561eb Mon Sep 17 00:00:00 2001 From: Sollace Date: Sun, 11 Feb 2024 14:51:29 +0000 Subject: [PATCH 2/4] Fix the mimic spell recipe --- src/main/resources/data/unicopia/recipes/spells/mimic.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/resources/data/unicopia/recipes/spells/mimic.json b/src/main/resources/data/unicopia/recipes/spells/mimic.json index eca1681a..546c0908 100644 --- a/src/main/resources/data/unicopia/recipes/spells/mimic.json +++ b/src/main/resources/data/unicopia/recipes/spells/mimic.json @@ -4,7 +4,9 @@ "traits": { "knowledge": 19, "life": 10, "chaos": 4 }, - "ingredients": [], + "ingredients": [ + { "item": "unicopia:gemstone", "spell": "unicopia:transformation" } + ], "result": { "item": "unicopia:gemstone", "spell": "unicopia:mimic" From 80c31b4a1d5d9b886a7ad568da423d2260179907 Mon Sep 17 00:00:00 2001 From: Sollace Date: Sun, 11 Feb 2024 20:31:37 +0000 Subject: [PATCH 3/4] Fix items with heartbound not being restored if it had only 1 enchantment level before dying --- .../unicopia/entity/player/Pony.java | 4 +- .../item/enchantment/EnchantmentUtil.java | 3 +- .../HeartboundEnchantmentUtil.java | 51 +++++++++++++++++++ .../unicopia/mixin/MixinPlayerInventory.java | 38 ++++---------- 4 files changed, 64 insertions(+), 32 deletions(-) create mode 100644 src/main/java/com/minelittlepony/unicopia/item/enchantment/HeartboundEnchantmentUtil.java diff --git a/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java b/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java index fab87347..181fd53d 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java @@ -28,6 +28,7 @@ import com.minelittlepony.unicopia.entity.mob.UEntityAttributes; import com.minelittlepony.unicopia.entity.player.MagicReserves.Bar; import com.minelittlepony.unicopia.item.FriendshipBraceletItem; import com.minelittlepony.unicopia.item.UItems; +import com.minelittlepony.unicopia.item.enchantment.EnchantmentUtil; import com.minelittlepony.unicopia.item.enchantment.UEnchantments; import com.minelittlepony.unicopia.util.*; import com.minelittlepony.unicopia.network.*; @@ -39,7 +40,6 @@ import com.minelittlepony.common.util.animation.Interpolator; import com.mojang.authlib.GameProfile; import net.minecraft.enchantment.Enchantment; -import net.minecraft.enchantment.EnchantmentHelper; import net.minecraft.enchantment.Enchantments; import net.minecraft.entity.*; import net.minecraft.entity.attribute.DefaultAttributeContainer; @@ -919,7 +919,7 @@ public class Pony extends Living implements Copyable, Update PlayerInventory inventory = oldPlayer.asEntity().getInventory(); for (int i = 0; i < inventory.size(); i++) { ItemStack stack = inventory.getStack(i); - if (EnchantmentHelper.getLevel(UEnchantments.HEART_BOUND, stack) > 0) { + if (EnchantmentUtil.consumeEnchantment(UEnchantments.HEART_BOUND, 1, stack, entity.getWorld().random, EnchantmentUtil.getLuck(3, oldPlayer.asEntity()))) { asEntity().getInventory().setStack(i, stack); } } diff --git a/src/main/java/com/minelittlepony/unicopia/item/enchantment/EnchantmentUtil.java b/src/main/java/com/minelittlepony/unicopia/item/enchantment/EnchantmentUtil.java index 5bc6d8f2..f518d5d3 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/enchantment/EnchantmentUtil.java +++ b/src/main/java/com/minelittlepony/unicopia/item/enchantment/EnchantmentUtil.java @@ -16,6 +16,7 @@ import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.random.Random; public interface EnchantmentUtil { + String HEART_BOUND_CONSUMED_FLAG = "unicopia:heart_bound_consumed"; static boolean consumeEnchantment(Enchantment enchantment, int levels, ItemStack stack) { return consumeEnchantment(enchantment, levels, stack, null, 0); @@ -33,7 +34,7 @@ public interface EnchantmentUtil { if (level == 0) { enchantments.remove(enchantment); } else { - enchantments.put(enchantment, level - 1); + enchantments.put(enchantment, level); } EnchantmentHelper.set(enchantments, stack); } diff --git a/src/main/java/com/minelittlepony/unicopia/item/enchantment/HeartboundEnchantmentUtil.java b/src/main/java/com/minelittlepony/unicopia/item/enchantment/HeartboundEnchantmentUtil.java new file mode 100644 index 00000000..b27dd3ad --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/item/enchantment/HeartboundEnchantmentUtil.java @@ -0,0 +1,51 @@ +package com.minelittlepony.unicopia.item.enchantment; + +import java.util.List; + +import net.minecraft.enchantment.EnchantmentHelper; +import net.minecraft.enchantment.Enchantments; +import net.minecraft.item.ItemStack; +import net.minecraft.util.collection.DefaultedList; + +public interface HeartboundEnchantmentUtil { + static InventorySnapshot createSnapshot(List> combinedInventory) { + List> storedCombinedInventory = combinedInventory.stream().map(l -> DefaultedList.ofSize(l.size(), ItemStack.EMPTY)).toList(); + boolean empty = true; + for (int group = 0; group < combinedInventory.size(); group++) { + var original = combinedInventory.get(group); + for (int i = 0; i < original.size(); i++) { + ItemStack stack = original.get(i); + if (EnchantmentHelper.getLevel(Enchantments.BINDING_CURSE, stack) == 0 + && EnchantmentHelper.getLevel(UEnchantments.HEART_BOUND, stack) > 0) { + original.set(i, ItemStack.EMPTY); + storedCombinedInventory.get(group).set(i, stack); + empty = false; + } + } + } + return empty ? InventorySnapshot.EMPTY : new InventorySnapshot(storedCombinedInventory); + } + + public record InventorySnapshot(List> combinedInventory) { + public static InventorySnapshot EMPTY = new InventorySnapshot(List.of()); + + public boolean empty() { + return combinedInventory.isEmpty(); + } + + public void restoreInto(List> combinedInventory) { + if (empty()) { + return; + } + for (int group = 0; group < combinedInventory.size(); group++) { + var original = combinedInventory.get(group); + for (int i = 0; i < original.size(); i++) { + ItemStack stored = this.combinedInventory.get(group).get(i); + if (!stored.isEmpty()) { + original.set(i, stored); + } + } + } + } + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/mixin/MixinPlayerInventory.java b/src/main/java/com/minelittlepony/unicopia/mixin/MixinPlayerInventory.java index 5debbac8..e2311fef 100644 --- a/src/main/java/com/minelittlepony/unicopia/mixin/MixinPlayerInventory.java +++ b/src/main/java/com/minelittlepony/unicopia/mixin/MixinPlayerInventory.java @@ -11,11 +11,7 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import com.minelittlepony.unicopia.advancement.UCriteria; -import com.minelittlepony.unicopia.item.enchantment.EnchantmentUtil; -import com.minelittlepony.unicopia.item.enchantment.UEnchantments; - -import net.minecraft.enchantment.EnchantmentHelper; -import net.minecraft.enchantment.Enchantments; +import com.minelittlepony.unicopia.item.enchantment.HeartboundEnchantmentUtil; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerInventory; import net.minecraft.inventory.Inventory; @@ -31,37 +27,21 @@ abstract class MixinPlayerInventory implements Inventory, Nameable { private @Final List> combinedInventory; @Nullable - private List> storedCombinedInventory; + private HeartboundEnchantmentUtil.InventorySnapshot inventorySnapshot; @Inject(method = "dropAll()V", at = @At("HEAD")) public void beforeDropAll(CallbackInfo info) { - storedCombinedInventory = combinedInventory.stream().map(l -> DefaultedList.ofSize(l.size(), ItemStack.EMPTY)).toList(); - for (int group = 0; group < combinedInventory.size(); group++) { - var original = combinedInventory.get(group); - for (int i = 0; i < original.size(); i++) { - ItemStack stack = original.get(i); - if (EnchantmentHelper.getLevel(Enchantments.BINDING_CURSE, stack) == 0 - && EnchantmentUtil.consumeEnchantment(UEnchantments.HEART_BOUND, 1, stack, player.getWorld().random, EnchantmentUtil.getLuck(3, player))) { - original.set(i, ItemStack.EMPTY); - UCriteria.USE_SOULMATE.trigger(player); - storedCombinedInventory.get(group).set(i, stack); - } - } + inventorySnapshot = HeartboundEnchantmentUtil.createSnapshot(combinedInventory); + if (!inventorySnapshot.empty()) { + UCriteria.USE_SOULMATE.trigger(player); } } - @Inject(method = "dropAll()V", at = @At("TAIL")) + @Inject(method = "dropAll()V", at = @At("RETURN")) public void afterDropAll(CallbackInfo info) { - if (storedCombinedInventory != null) { - for (int group = 0; group < combinedInventory.size(); group++) { - var original = combinedInventory.get(group); - for (int i = 0; i < original.size(); i++) { - ItemStack stored = storedCombinedInventory.get(group).get(i); - if (!stored.isEmpty()) { - original.set(i, stored); - } - } - } + if (inventorySnapshot != null) { + inventorySnapshot.restoreInto(combinedInventory); + inventorySnapshot = null; } } } From a9db2490f5fbb407f10398edde2bdfe970d478d5 Mon Sep 17 00:00:00 2001 From: Sollace Date: Sun, 11 Feb 2024 20:51:12 +0000 Subject: [PATCH 4/4] Make common enchantments less common --- .../unicopia/item/enchantment/UEnchantments.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/minelittlepony/unicopia/item/enchantment/UEnchantments.java b/src/main/java/com/minelittlepony/unicopia/item/enchantment/UEnchantments.java index 3414e340..559e9406 100644 --- a/src/main/java/com/minelittlepony/unicopia/item/enchantment/UEnchantments.java +++ b/src/main/java/com/minelittlepony/unicopia/item/enchantment/UEnchantments.java @@ -30,12 +30,12 @@ public interface UEnchantments { /** * Protects against wall collisions and earth pony attacks! */ - Enchantment PADDED = register("padded", new SimpleEnchantment(Options.armor().rarity(Rarity.COMMON).maxLevel(3))); + Enchantment PADDED = register("padded", new SimpleEnchantment(Options.armor().rarity(Rarity.UNCOMMON).maxLevel(3))); /** * Heavy players move more slowly but are less likely to be flung around wildly. */ - Enchantment HEAVY = register("heavy", new AttributedEnchantment(Options.armor().rarity(Rarity.COMMON).maxLevel(4))) + Enchantment HEAVY = register("heavy", new AttributedEnchantment(Options.armor().rarity(Rarity.UNCOMMON).maxLevel(4))) .addModifier(EntityAttributes.GENERIC_MOVEMENT_SPEED, (user, level) -> { return new EntityAttributeModifier(UUID.fromString("a3d5a94f-4c40-48f6-a343-558502a13e10"), "Heavyness", (1 - level/(float)10) - 1, Operation.MULTIPLY_TOTAL); }); @@ -83,7 +83,7 @@ public interface UEnchantments { * Items with loyalty are kept after death. * Only works if they don't also have curse of binding. */ - Enchantment HEART_BOUND = register("heart_bound", new SimpleEnchantment(Options.create(EnchantmentTarget.VANISHABLE, UEnchantmentValidSlots.ANY).rarity(Rarity.COMMON).maxLevel(5))); + Enchantment HEART_BOUND = register("heart_bound", new SimpleEnchantment(Options.create(EnchantmentTarget.VANISHABLE, UEnchantmentValidSlots.ANY).rarity(Rarity.UNCOMMON).maxLevel(5))); /** * Consumes drops whilst mining and produces experience instead