From e9ca702a276ce8bdcfde3c962d6dde20c56244fb Mon Sep 17 00:00:00 2001 From: cdqtzrc <3286637847@qq.com> Date: Fri, 24 May 2024 00:46:35 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=BC=90=E6=9C=A8?= =?UTF-8?q?=E9=99=84=E9=AD=94=E5=AF=BC=E8=87=B4=E6=B8=B8=E6=88=8F=E8=BF=9B?= =?UTF-8?q?=E5=85=A5=E6=AD=BB=E5=BE=AA=E7=8E=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../item/enchantment/FellingEnchantment.java | 43 ++++++++++--------- 1 file changed, 22 insertions(+), 21 deletions(-) diff --git a/common/src/main/java/dev/dubhe/anvilcraft/item/enchantment/FellingEnchantment.java b/common/src/main/java/dev/dubhe/anvilcraft/item/enchantment/FellingEnchantment.java index 1165303df..1c300d00b 100644 --- a/common/src/main/java/dev/dubhe/anvilcraft/item/enchantment/FellingEnchantment.java +++ b/common/src/main/java/dev/dubhe/anvilcraft/item/enchantment/FellingEnchantment.java @@ -3,6 +3,7 @@ import dev.dubhe.anvilcraft.AnvilCraft; import dev.dubhe.anvilcraft.init.ModEnchantments; import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; import net.minecraft.tags.BlockTags; import net.minecraft.world.entity.EquipmentSlot; import net.minecraft.world.entity.player.Player; @@ -12,14 +13,8 @@ import net.minecraft.world.item.enchantment.EnchantmentCategory; import net.minecraft.world.item.enchantment.EnchantmentHelper; import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.level.block.state.BlockState; import org.jetbrains.annotations.NotNull; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; import java.util.Map; public class FellingEnchantment extends ModEnchantment { @@ -66,21 +61,27 @@ public static void felling(@NotNull Player player, Level level, BlockPos pos, It Map enchantments = EnchantmentHelper.getEnchantments(tool); if (!enchantments.containsKey(ModEnchantments.FELLING.get())) return; int max = (enchantments.get(ModEnchantments.FELLING.get()) * AnvilCraft.config.fellingBlockPerLevel) - 1; - while (max > 0) { - for (BlockPos offset : OFFSET) { - BlockPos offsetPos = pos.offset(offset); - BlockState state = level.getBlockState(offsetPos); - if (!state.is(BlockTags.LOGS)) continue; - if (max-- < 0) break; - Block block = state.getBlock(); - boolean bl = level.removeBlock(offsetPos, false); - if (bl) { - block.destroy(level, offsetPos, state); - } - if (player.isCreative()) continue; - BlockEntity entity = level.getBlockEntity(offsetPos); - block.playerDestroy(level, player, offsetPos, state, entity, tool); + FellingEnchantment.chainMine(level, pos, max); + } + + /** + * 连锁破坏原木 + * + * @param level 世界 + * @param sourceBlock 源方块坐标 + * @param max 最大采集数量 + */ + private static void chainMine(Level level, BlockPos sourceBlock, int max) { + BlockPos.breadthFirstTraversal(sourceBlock, Integer.MAX_VALUE, max, (blockPos, blockPosConsumer) -> { + for (Direction direction : Direction.values()) { + blockPosConsumer.accept(blockPos.relative(direction)); + } + }, blockPos -> { + if (level.getBlockState(blockPos).is(BlockTags.LOGS)) { + level.destroyBlock(blockPos, true); + return true; } - } + return sourceBlock.equals(blockPos); + }); } } From 1f45c4ef53a53ae1d0c40fb5b8a9bec9b13e17d0 Mon Sep 17 00:00:00 2001 From: cdqtzrc <3286637847@qq.com> Date: Fri, 24 May 2024 01:19:06 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E5=AF=B9=E4=B8=8A=E4=B8=80=E4=B8=AA?= =?UTF-8?q?=E6=8F=90=E4=BA=A4=E7=9A=84=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../item/enchantment/FellingEnchantment.java | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/common/src/main/java/dev/dubhe/anvilcraft/item/enchantment/FellingEnchantment.java b/common/src/main/java/dev/dubhe/anvilcraft/item/enchantment/FellingEnchantment.java index 1c300d00b..f867eebb6 100644 --- a/common/src/main/java/dev/dubhe/anvilcraft/item/enchantment/FellingEnchantment.java +++ b/common/src/main/java/dev/dubhe/anvilcraft/item/enchantment/FellingEnchantment.java @@ -13,6 +13,8 @@ import net.minecraft.world.item.enchantment.EnchantmentCategory; import net.minecraft.world.item.enchantment.EnchantmentHelper; import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; import org.jetbrains.annotations.NotNull; import java.util.Map; @@ -61,7 +63,7 @@ public static void felling(@NotNull Player player, Level level, BlockPos pos, It Map enchantments = EnchantmentHelper.getEnchantments(tool); if (!enchantments.containsKey(ModEnchantments.FELLING.get())) return; int max = (enchantments.get(ModEnchantments.FELLING.get()) * AnvilCraft.config.fellingBlockPerLevel) - 1; - FellingEnchantment.chainMine(level, pos, max); + FellingEnchantment.chainMine(level, player, pos, max, tool); } /** @@ -71,14 +73,17 @@ public static void felling(@NotNull Player player, Level level, BlockPos pos, It * @param sourceBlock 源方块坐标 * @param max 最大采集数量 */ - private static void chainMine(Level level, BlockPos sourceBlock, int max) { + private static void chainMine(Level level, Player player, BlockPos sourceBlock, int max, ItemStack tool) { BlockPos.breadthFirstTraversal(sourceBlock, Integer.MAX_VALUE, max, (blockPos, blockPosConsumer) -> { for (Direction direction : Direction.values()) { blockPosConsumer.accept(blockPos.relative(direction)); } }, blockPos -> { - if (level.getBlockState(blockPos).is(BlockTags.LOGS)) { - level.destroyBlock(blockPos, true); + BlockState blockState = level.getBlockState(blockPos); + if (blockState.is(BlockTags.LOGS)) { + BlockEntity blockEntity = level.getBlockEntity(blockPos); + level.removeBlock(blockPos, false); + blockState.getBlock().playerDestroy(level, player, blockPos, blockState, blockEntity, tool); return true; } return sourceBlock.equals(blockPos);