diff --git a/fabric-mining-level-api-v1/src/main/java/net/fabricmc/fabric/api/mininglevel/v1/MiningLevelManager.java b/fabric-mining-level-api-v1/src/main/java/net/fabricmc/fabric/api/mininglevel/v1/MiningLevelManager.java index cca2d0865..8221488a0 100644 --- a/fabric-mining-level-api-v1/src/main/java/net/fabricmc/fabric/api/mininglevel/v1/MiningLevelManager.java +++ b/fabric-mining-level-api-v1/src/main/java/net/fabricmc/fabric/api/mininglevel/v1/MiningLevelManager.java @@ -16,7 +16,12 @@ package net.fabricmc.fabric.api.mininglevel.v1; +import net.minecraft.block.Block; import net.minecraft.block.BlockState; +import net.minecraft.tag.BlockTags; +import net.minecraft.tag.TagKey; +import net.minecraft.util.Identifier; +import net.minecraft.util.registry.Registry; import net.fabricmc.fabric.impl.mininglevel.MiningLevelManagerImpl; @@ -54,4 +59,26 @@ public final class MiningLevelManager { public static int getRequiredMiningLevel(BlockState state) { return MiningLevelManagerImpl.getRequiredMiningLevel(state); } + + /** + * Gets the mining level block tag corresponding to a given integer mining level. + * More precisely, return the corresponding vanilla tag ({@code #minecraft:needs_x_tool}) for levels 1 to 3, + * and the Fabric tag ({@code #fabric:needs_tool_level_N}) for levels above 3. + * + * @param miningLevel the integer mining level + * @return the corresponding mining level block tag + * @throws IllegalArgumentException if a negative or zero mining level is passed + */ + public static TagKey<Block> getBlockTag(int miningLevel) { + if (miningLevel <= 0) { + throw new IllegalArgumentException("Mining level tags only exist for mining levels > 0, received: " + miningLevel); + } + + return switch (miningLevel) { + case 1 -> BlockTags.NEEDS_STONE_TOOL; + case 2 -> BlockTags.NEEDS_IRON_TOOL; + case 3 -> BlockTags.NEEDS_DIAMOND_TOOL; + default -> TagKey.of(Registry.BLOCK_KEY, new Identifier("fabric", "needs_tool_level_" + miningLevel)); + }; + } }