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 000000000..82f8f4959 --- /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 2be085aa5..7e280262f 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 d15f33dea..c391738d3 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 (!BlockDevourerBlock.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 d25d24432..5ace9f9db 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 984806dce..e8caf63ac 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; @@ -124,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)) 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/init/block/ModBlockTags.java b/src/main/java/dev/dubhe/anvilcraft/init/block/ModBlockTags.java index 21b4f0055..d7293316b 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 f78eb8ce4..af8a2f03d 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,7 +99,8 @@ public static void devourBlock( ServerLevel level, Player player, InteractionHand hand, BlockPos centerPos, BlockState centerState, Direction clickedSide ) { - if (centerState.getDestroySpeed(level, centerPos) == 0.0F) return; + 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; int range = dragonRod.getOrDefault(ModComponents.DEVOUR_RANGE, -1); @@ -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);