Deprecate BlockData#getDestroySpeed for removal

The method sadly is not usable in 1.21 without a player as all of an
enchantments attribtue modifiers rely on a base value supplied by a
player. The method could only offer a rough estimate based on some
default values, however a better method for this should be added down
the line rather than trying to force such logic into the existing one.
This commit is contained in:
Bjarne Koll 2024-06-16 00:19:10 +02:00
parent 26f246b908
commit a2c7a9b490
3 changed files with 17 additions and 8 deletions

View File

@ -58,7 +58,10 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ * + *
+ * @param itemStack {@link ItemStack} used to mine this Block + * @param itemStack {@link ItemStack} used to mine this Block
+ * @return the speed that this Block will be mined by the given {@link ItemStack} + * @return the speed that this Block will be mined by the given {@link ItemStack}
+ * @deprecated the destroy speed of a block was never purely tied to an item stack. Since 1.21 enchantments
+ * also use complex effects that require a consuming player to compute their effects, including mining efficiency.
+ */ + */
+ @Deprecated(forRemoval = true, since = "1.21")
+ default float getDestroySpeed(final @NotNull ItemStack itemStack) { + default float getDestroySpeed(final @NotNull ItemStack itemStack) {
+ return this.getDestroySpeed(itemStack, false); + return this.getDestroySpeed(itemStack, false);
+ } + }
@ -71,7 +74,10 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ * @param itemStack {@link ItemStack} used to mine this Block + * @param itemStack {@link ItemStack} used to mine this Block
+ * @param considerEnchants true to look at enchants on the itemstack + * @param considerEnchants true to look at enchants on the itemstack
+ * @return the speed that this Block will be mined by the given {@link ItemStack} + * @return the speed that this Block will be mined by the given {@link ItemStack}
+ * @deprecated the destroy speed of a block was never purely tied to an item stack. Since 1.21 enchantments
+ * also use complex effects that require a consuming player to compute their effects, including mining efficiency.
+ */ + */
+ @Deprecated(forRemoval = true, since = "1.21")
+ float getDestroySpeed(@NotNull ItemStack itemStack, boolean considerEnchants); + float getDestroySpeed(@NotNull ItemStack itemStack, boolean considerEnchants);
+ // Paper end - destroy speed API + // Paper end - destroy speed API
} }

View File

@ -55,7 +55,7 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
--- a/src/main/java/org/bukkit/block/data/BlockData.java --- a/src/main/java/org/bukkit/block/data/BlockData.java
+++ b/src/main/java/org/bukkit/block/data/BlockData.java +++ b/src/main/java/org/bukkit/block/data/BlockData.java
@@ -0,0 +0,0 @@ public interface BlockData extends Cloneable { @@ -0,0 +0,0 @@ public interface BlockData extends Cloneable {
*/ @Deprecated(forRemoval = true, since = "1.21")
float getDestroySpeed(@NotNull ItemStack itemStack, boolean considerEnchants); float getDestroySpeed(@NotNull ItemStack itemStack, boolean considerEnchants);
// Paper end - destroy speed API // Paper end - destroy speed API
+ +

View File

@ -20,15 +20,18 @@ index 0000000000000000000000000000000000000000..00000000000000000000000000000000
+ net.minecraft.world.item.ItemStack nmsItemStack = CraftItemStack.unwrap(itemStack); + net.minecraft.world.item.ItemStack nmsItemStack = CraftItemStack.unwrap(itemStack);
+ float speed = nmsItemStack.getDestroySpeed(this.state); + float speed = nmsItemStack.getDestroySpeed(this.state);
+ if (speed > 1.0F && considerEnchants) { + if (speed > 1.0F && considerEnchants) {
+ final org.apache.commons.lang3.mutable.MutableFloat mutableFloat = new org.apache.commons.lang3.mutable.MutableFloat(0); + final net.minecraft.core.Holder<net.minecraft.world.item.enchantment.Enchantment> efficiencyHolder = net.minecraft.server.MinecraftServer
+ net.minecraft.world.item.enchantment.EnchantmentHelper.forEachModifier( + .getServer()
+ nmsItemStack, net.minecraft.world.entity.EquipmentSlotGroup.MAINHAND, + .registryAccess()
+ (attributeHolder, attributeModifier) -> { + .registryOrThrow(net.minecraft.core.registries.Registries.ENCHANTMENT)
+ if (!attributeHolder.is(net.minecraft.world.entity.ai.attributes.Attributes.MINING_EFFICIENCY)) return; + .getHolderOrThrow(net.minecraft.world.item.enchantment.Enchantments.EFFICIENCY);
+ +
+ // TODO do we just attempt to calculate the full "modifier" to the mining efficiency? + final int enchantLevel = net.minecraft.world.item.enchantment.EnchantmentHelper.getItemEnchantmentLevel(
+ } + efficiencyHolder, nmsItemStack
+ ); + );
+ if (enchantLevel > 0) {
+ speed += enchantLevel * enchantLevel + 1;
+ }
+ } + }
+ return speed; + return speed;
+ } + }