diff --git a/src/main/java/org/betterx/bclib/api/v2/DiggerItemSpeed.java b/src/main/java/org/betterx/bclib/api/v2/DiggerItemSpeed.java new file mode 100644 index 00000000..c469d76c --- /dev/null +++ b/src/main/java/org/betterx/bclib/api/v2/DiggerItemSpeed.java @@ -0,0 +1,35 @@ +package org.betterx.bclib.api.v2; + +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.state.BlockState; + +import java.util.LinkedList; +import java.util.List; +import java.util.Optional; + +public class DiggerItemSpeed { + public static final List modifiers = new LinkedList<>(); + + @FunctionalInterface + public interface SpeedModifier { + Optional calculateSpeed(ItemStack stack, BlockState state, float initialSpeed, float currentSpeed); + } + + public static void addModifier(SpeedModifier mod) { + modifiers.add(mod); + } + + public static Optional getModifiedSpeed(ItemStack stack, BlockState state, float initialSpeed) { + float currentSpeed = initialSpeed; + Optional speed = Optional.empty(); + for (SpeedModifier mod : modifiers) { + Optional res = mod.calculateSpeed(stack, state, initialSpeed, currentSpeed); + if (res.isPresent()) { + currentSpeed = res.get(); + speed = res; + } + } + + return speed; + } +} diff --git a/src/main/java/org/betterx/bclib/mixin/common/DiggerItemMixin.java b/src/main/java/org/betterx/bclib/mixin/common/DiggerItemMixin.java new file mode 100644 index 00000000..1fa10a78 --- /dev/null +++ b/src/main/java/org/betterx/bclib/mixin/common/DiggerItemMixin.java @@ -0,0 +1,25 @@ +package org.betterx.bclib.mixin.common; + +import org.betterx.bclib.api.v2.DiggerItemSpeed; + +import net.minecraft.world.item.DiggerItem; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.state.BlockState; + +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 java.util.Optional; + +@Mixin(DiggerItem.class) +public class DiggerItemMixin { + @Inject(method = "getDestroySpeed", at = @At(value = "RETURN"), cancellable = true) + void bn_getDestroySpeed(ItemStack stack, BlockState state, CallbackInfoReturnable cir) { + final Optional newSpeed = DiggerItemSpeed.getModifiedSpeed(stack, state, cir.getReturnValue()); + if (newSpeed.isPresent()) { + cir.setReturnValue(newSpeed.get()); + } + } +} diff --git a/src/main/resources/bclib.mixins.common.json b/src/main/resources/bclib.mixins.common.json index 49b27c46..094f5e4d 100644 --- a/src/main/resources/bclib.mixins.common.json +++ b/src/main/resources/bclib.mixins.common.json @@ -17,6 +17,7 @@ "CraftingMenuMixin", "DedicatedServerPropertiesMixin", "DiggerItemAccessor", + "DiggerItemMixin", "EnchantingTableBlockMixin", "ItemStackMixin", "LayerLightSectionStorageMixin",