From df434a63af08d75dd638f7df9a3090bb399b3be2 Mon Sep 17 00:00:00 2001 From: Chrise2024 Date: Mon, 30 Mar 2026 15:11:10 +0800 Subject: [PATCH 1/3] Add blacklist to DragonRod and BlockDevourer(#3379) --- .../data/anvilcraft/tags/block/devour_blacklist.json | 6 ++++++ .../dubhe/anvilcraft/anvil/BlockDevourerBehavior.java | 2 +- .../dubhe/anvilcraft/block/BlockDevourerBlock.java | 11 ++++++++++- .../dubhe/anvilcraft/data/tags/BlockTagLoader.java | 4 ++++ .../dubhe/anvilcraft/event/PlayerEventListener.java | 3 ++- .../dev/dubhe/anvilcraft/init/block/ModBlockTags.java | 1 + .../java/dev/dubhe/anvilcraft/item/DragonRodItem.java | 4 +++- 7 files changed, 27 insertions(+), 4 deletions(-) create mode 100644 src/generated/resources/data/anvilcraft/tags/block/devour_blacklist.json diff --git a/src/generated/resources/data/anvilcraft/tags/block/devour_blacklist.json b/src/generated/resources/data/anvilcraft/tags/block/devour_blacklist.json new file mode 100644 index 0000000000..82f8f49599 --- /dev/null +++ b/src/generated/resources/data/anvilcraft/tags/block/devour_blacklist.json @@ -0,0 +1,6 @@ +{ + "values": [ + "#c:chests/trapped", + "#c:chests/wooden" + ] +} \ No newline at end of file diff --git a/src/main/java/dev/dubhe/anvilcraft/anvil/BlockDevourerBehavior.java b/src/main/java/dev/dubhe/anvilcraft/anvil/BlockDevourerBehavior.java index 2be085aa52..7e280262fb 100644 --- a/src/main/java/dev/dubhe/anvilcraft/anvil/BlockDevourerBehavior.java +++ b/src/main/java/dev/dubhe/anvilcraft/anvil/BlockDevourerBehavior.java @@ -33,7 +33,7 @@ public boolean handle(Level level, BlockPos hitBlockPos, BlockState hitBlockStat ); if ( hitBlockState.getValue(BlockDevourerBlock.FACING) == Direction.DOWN - && level.getBlockState(hitBlockPos.below()).getBlock().defaultDestroyTime() >= 0 + && BlockDevourerBlock.canDevour(level.getBlockState(hitBlockPos.below())) ) { level.setBlockAndUpdate(hitBlockPos, Blocks.AIR.defaultBlockState()); level.setBlockAndUpdate(hitBlockPos.below(), hitBlockState.setValue(BlockDevourerBlock.TRIGGERED, true)); diff --git a/src/main/java/dev/dubhe/anvilcraft/block/BlockDevourerBlock.java b/src/main/java/dev/dubhe/anvilcraft/block/BlockDevourerBlock.java index d15f33dea5..fb3a8335e3 100644 --- a/src/main/java/dev/dubhe/anvilcraft/block/BlockDevourerBlock.java +++ b/src/main/java/dev/dubhe/anvilcraft/block/BlockDevourerBlock.java @@ -254,6 +254,15 @@ public void devourBlock( } } + /** + * 检查目标位置是否可以破坏 + * + * @param devourBlockState 目标方块 + * */ + public static boolean canDevour(BlockState devourBlockState){ + return !devourBlockState.is(ModBlockTags.DEVOUR_BLACKLIST) && devourBlockState.getBlock().defaultDestroyTime() >= 0; + } + private static void devourSingleBlockInternalLogic( ServerLevel level, @Nullable Block anvil, BlockPos devourBlockPos, List filteredBlockPosList, @Nullable List itemHandlerList, Vec3 center @@ -265,7 +274,7 @@ private static void devourSingleBlockInternalLogic( if (filteredBlockPosList.contains(devourBlockPos)) return; BlockState devourBlockState = level.getBlockState(devourBlockPos); if (devourBlockState.isAir()) return; - if (devourBlockState.getBlock().defaultDestroyTime() < 0) return; + if (!canDevour(devourBlockState)) return; if ( !(anvil instanceof FrostAnvilBlock) && devourBlockState.is(ModBlockTags.BLOCK_DEVOURER_PROBABILITY_DROPPING) diff --git a/src/main/java/dev/dubhe/anvilcraft/data/tags/BlockTagLoader.java b/src/main/java/dev/dubhe/anvilcraft/data/tags/BlockTagLoader.java index d25d24432e..5ace9f9db8 100644 --- a/src/main/java/dev/dubhe/anvilcraft/data/tags/BlockTagLoader.java +++ b/src/main/java/dev/dubhe/anvilcraft/data/tags/BlockTagLoader.java @@ -221,6 +221,10 @@ public static void init(RegistrumTagsProvider provider) { .addTag(Tags.Blocks.CHESTS_ENDER) .addTag(Tags.Blocks.CHESTS_TRAPPED) .addTag(Tags.Blocks.CHESTS_WOODEN); + provider.addTag(ModBlockTags.DEVOUR_BLACKLIST) + .addTag(Tags.Blocks.CHESTS_TRAPPED) + .addTag(Tags.Blocks.CHESTS_WOODEN); + provider.addTag(ModBlockTags.FELLING_APPLICABLE) .addTag(BlockTags.LOGS) .addTag(BlockTags.WART_BLOCKS) diff --git a/src/main/java/dev/dubhe/anvilcraft/event/PlayerEventListener.java b/src/main/java/dev/dubhe/anvilcraft/event/PlayerEventListener.java index 984806dce4..938486ed97 100644 --- a/src/main/java/dev/dubhe/anvilcraft/event/PlayerEventListener.java +++ b/src/main/java/dev/dubhe/anvilcraft/event/PlayerEventListener.java @@ -3,6 +3,7 @@ import dev.dubhe.anvilcraft.AnvilCraft; import dev.dubhe.anvilcraft.api.amulet.AmuletManager; import dev.dubhe.anvilcraft.api.power.PowerGrid; +import dev.dubhe.anvilcraft.block.BlockDevourerBlock; import dev.dubhe.anvilcraft.block.item.ResinBlockItem; import dev.dubhe.anvilcraft.entity.MagnetizedNodeEntity; import dev.dubhe.anvilcraft.init.block.ModBlocks; @@ -126,7 +127,7 @@ public static void handleDragonRod(PlayerInteractEvent.LeftClickBlock event) { if (blockFace == null) return; if (state.getDestroySpeed(level, pos) == 0.0F) return; if (!stack.has(ModComponents.DEVOUR_RANGE)) return; - if (!DragonRodItem.canDevour(player, stack)) event.setCanceled(true); + if (!DragonRodItem.canDevour(player, stack) || !BlockDevourerBlock.canDevour(state)) event.setCanceled(true); if (event.getAction() == PlayerInteractEvent.LeftClickBlock.Action.START && !level.isClientSide) { DragonRodItem.devourBlock((ServerLevel) level, player, hand, pos, state, blockFace); diff --git a/src/main/java/dev/dubhe/anvilcraft/init/block/ModBlockTags.java b/src/main/java/dev/dubhe/anvilcraft/init/block/ModBlockTags.java index 21b4f00551..d7293316b9 100644 --- a/src/main/java/dev/dubhe/anvilcraft/init/block/ModBlockTags.java +++ b/src/main/java/dev/dubhe/anvilcraft/init/block/ModBlockTags.java @@ -100,6 +100,7 @@ public class ModBlockTags { public static final TagKey NEEDS_TRANSCENDIUM_TOOL = bind("needs_transcendium_tool"); public static final TagKey ANVIL_HAMMER_BLACKLIST = bind("anvil_hammer_blacklist"); + public static final TagKey DEVOUR_BLACKLIST = bind("devour_blacklist"); public static final TagKey FELLING_APPLICABLE = bind("felling_applicable"); public static final TagKey CLEANING_APPLICABLE = bind("cleaning_applicable"); diff --git a/src/main/java/dev/dubhe/anvilcraft/item/DragonRodItem.java b/src/main/java/dev/dubhe/anvilcraft/item/DragonRodItem.java index f78eb8ce46..1cbfa5c22d 100644 --- a/src/main/java/dev/dubhe/anvilcraft/item/DragonRodItem.java +++ b/src/main/java/dev/dubhe/anvilcraft/item/DragonRodItem.java @@ -1,6 +1,7 @@ package dev.dubhe.anvilcraft.item; import com.google.common.collect.Streams; +import dev.dubhe.anvilcraft.block.BlockDevourerBlock; import dev.dubhe.anvilcraft.init.block.ModBlockTags; import dev.dubhe.anvilcraft.init.item.ModComponents; import dev.dubhe.anvilcraft.init.item.ModItems; @@ -98,6 +99,7 @@ public static void devourBlock( ServerLevel level, Player player, InteractionHand hand, BlockPos centerPos, BlockState centerState, Direction clickedSide ) { + if (centerState.is(ModBlockTags.DEVOUR_BLACKLIST)) return; if (centerState.getDestroySpeed(level, centerPos) == 0.0F) return; ItemStack dragonRod = player.getItemInHand(hand); if (!canDevour(player, dragonRod)) return; @@ -125,7 +127,7 @@ public static void devourBlock( for (BlockPos devouringPos : devouringPoses) { BlockState devouringState = level.getBlockState(devouringPos); if (devouringState.isAir()) continue; - if (devouringState.getBlock().defaultDestroyTime() < 0) continue; + if (!BlockDevourerBlock.canDevour(devouringState)) continue; if (devouringState.is(ModBlockTags.BLOCK_DEVOURER_PROBABILITY_DROPPING) && level.random.nextDouble() > 0.05) { level.destroyBlock(devouringPos, false); From 5abf4629932474cdcdc871e6a77354d4bacfe2a1 Mon Sep 17 00:00:00 2001 From: Shigure <157289864+Chrise2024@users.noreply.github.com> Date: Mon, 30 Mar 2026 18:58:53 +0800 Subject: [PATCH 2/3] Fix code format --- .../java/dev/dubhe/anvilcraft/block/BlockDevourerBlock.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/dev/dubhe/anvilcraft/block/BlockDevourerBlock.java b/src/main/java/dev/dubhe/anvilcraft/block/BlockDevourerBlock.java index fb3a8335e3..7850083bd0 100644 --- a/src/main/java/dev/dubhe/anvilcraft/block/BlockDevourerBlock.java +++ b/src/main/java/dev/dubhe/anvilcraft/block/BlockDevourerBlock.java @@ -259,7 +259,7 @@ public void devourBlock( * * @param devourBlockState 目标方块 * */ - public static boolean canDevour(BlockState devourBlockState){ + public static boolean canDevour(BlockState devourBlockState) { return !devourBlockState.is(ModBlockTags.DEVOUR_BLACKLIST) && devourBlockState.getBlock().defaultDestroyTime() >= 0; } From 0564a408be23f5a954067541201fd7ef6826b582 Mon Sep 17 00:00:00 2001 From: Chrise2024 Date: Mon, 30 Mar 2026 19:38:17 +0800 Subject: [PATCH 3/3] Fix incorrect destroy speed judgment --- .../dev/dubhe/anvilcraft/block/BlockDevourerBlock.java | 2 +- .../dev/dubhe/anvilcraft/event/PlayerEventListener.java | 7 +++++-- src/main/java/dev/dubhe/anvilcraft/item/DragonRodItem.java | 2 +- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/main/java/dev/dubhe/anvilcraft/block/BlockDevourerBlock.java b/src/main/java/dev/dubhe/anvilcraft/block/BlockDevourerBlock.java index 7850083bd0..c391738d30 100644 --- a/src/main/java/dev/dubhe/anvilcraft/block/BlockDevourerBlock.java +++ b/src/main/java/dev/dubhe/anvilcraft/block/BlockDevourerBlock.java @@ -274,7 +274,7 @@ private static void devourSingleBlockInternalLogic( if (filteredBlockPosList.contains(devourBlockPos)) return; BlockState devourBlockState = level.getBlockState(devourBlockPos); if (devourBlockState.isAir()) return; - if (!canDevour(devourBlockState)) return; + if (!BlockDevourerBlock.canDevour(devourBlockState)) return; if ( !(anvil instanceof FrostAnvilBlock) && devourBlockState.is(ModBlockTags.BLOCK_DEVOURER_PROBABILITY_DROPPING) diff --git a/src/main/java/dev/dubhe/anvilcraft/event/PlayerEventListener.java b/src/main/java/dev/dubhe/anvilcraft/event/PlayerEventListener.java index 938486ed97..e8caf63ac3 100644 --- a/src/main/java/dev/dubhe/anvilcraft/event/PlayerEventListener.java +++ b/src/main/java/dev/dubhe/anvilcraft/event/PlayerEventListener.java @@ -125,9 +125,12 @@ public static void handleDragonRod(PlayerInteractEvent.LeftClickBlock event) { final Direction blockFace = event.getFace(); if (blockFace == null) return; - if (state.getDestroySpeed(level, pos) == 0.0F) return; + if (state.getDestroySpeed(level, pos) < 0.0F) return; if (!stack.has(ModComponents.DEVOUR_RANGE)) return; - if (!DragonRodItem.canDevour(player, stack) || !BlockDevourerBlock.canDevour(state)) event.setCanceled(true); + if (!DragonRodItem.canDevour(player, stack) || !BlockDevourerBlock.canDevour(state)) { + event.setCanceled(true); + return; + } if (event.getAction() == PlayerInteractEvent.LeftClickBlock.Action.START && !level.isClientSide) { DragonRodItem.devourBlock((ServerLevel) level, player, hand, pos, state, blockFace); diff --git a/src/main/java/dev/dubhe/anvilcraft/item/DragonRodItem.java b/src/main/java/dev/dubhe/anvilcraft/item/DragonRodItem.java index 1cbfa5c22d..af8a2f03d4 100644 --- a/src/main/java/dev/dubhe/anvilcraft/item/DragonRodItem.java +++ b/src/main/java/dev/dubhe/anvilcraft/item/DragonRodItem.java @@ -100,7 +100,7 @@ public static void devourBlock( BlockPos centerPos, BlockState centerState, Direction clickedSide ) { if (centerState.is(ModBlockTags.DEVOUR_BLACKLIST)) return; - if (centerState.getDestroySpeed(level, centerPos) == 0.0F) return; + if (centerState.getDestroySpeed(level, centerPos) < 0.0F) return; ItemStack dragonRod = player.getItemInHand(hand); if (!canDevour(player, dragonRod)) return; int range = dragonRod.getOrDefault(ModComponents.DEVOUR_RANGE, -1);