From 6f1141b8240db5e2d5d7001c6f4f40930ea09af7 Mon Sep 17 00:00:00 2001 From: Des Herriott Date: Tue, 12 Sep 2023 11:26:40 +0100 Subject: [PATCH] jackhammer: holding shift shouldn't prevent block breaking entirely It now just suppresses breaking of extra blocks, but still always allows the targeted block to be broken. #1214 --- .../client/render/area/AreaRenderManager.java | 15 +++++++-------- .../common/item/JackHammerItem.java | 13 +++++++++---- 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/src/main/java/me/desht/pneumaticcraft/client/render/area/AreaRenderManager.java b/src/main/java/me/desht/pneumaticcraft/client/render/area/AreaRenderManager.java index 81a0211db..91c40186d 100644 --- a/src/main/java/me/desht/pneumaticcraft/client/render/area/AreaRenderManager.java +++ b/src/main/java/me/desht/pneumaticcraft/client/render/area/AreaRenderManager.java @@ -73,7 +73,7 @@ public enum AreaRenderManager { private List cachedPositionProviderShowers; private AreaRenderer camoPositionShower; private AreaRenderer jackhammerPositionShower; - private LastJackhammerDetails lastJackhammerDetails = new LastJackhammerDetails(BlockPos.ZERO, null, null); + private LastJackhammerDetails lastJackhammerDetails = new LastJackhammerDetails(BlockPos.ZERO, null, null, false); private BlockPos lastPlayerPos; private int lastItemHashCode = 0; @@ -257,16 +257,16 @@ private void maybeRenderJackhammer(PoseStack matrixStack, MultiBufferSource.Buff BlockHitResult brtr = (BlockHitResult) Minecraft.getInstance().hitResult; if (!level.isLoaded(brtr.getBlockPos()) || level.getBlockState(brtr.getBlockPos()).isAir()) return; - if (!lastJackhammerDetails.matches(brtr.getBlockPos(), brtr.getDirection(), digMode)) { + if (!lastJackhammerDetails.matches(brtr.getBlockPos(), brtr.getDirection(), digMode, player.isShiftKeyDown())) { BlockState state = level.getBlockState(brtr.getBlockPos()); Set posSet = level.getBlockEntity(brtr.getBlockPos()) == null && !(state.getBlock() instanceof LiquidBlock) ? - JackHammerItem.getBreakPositions(level, brtr.getBlockPos(), brtr.getDirection(), player.getDirection(), digMode) : + JackHammerItem.getBreakPositions(level, brtr.getBlockPos(), brtr.getDirection(), player, digMode) : Collections.emptySet(); if (!posSet.isEmpty()) posSet.add(brtr.getBlockPos()); AreaRenderer.Builder b = AreaRenderer.builder().withColor(0x20FFFFFF).withSize(1.01f).disableWriteMask(); if (state.getShape(level, brtr.getBlockPos()) != (Shapes.block())) b = b.drawShapes(); jackhammerPositionShower = b.build(posSet); - lastJackhammerDetails = new LastJackhammerDetails(brtr.getBlockPos(), brtr.getDirection(), digMode); + lastJackhammerDetails = new LastJackhammerDetails(brtr.getBlockPos(), brtr.getDirection(), digMode, player.isShiftKeyDown()); } jackhammerPositionShower.render(matrixStack, buffer); } @@ -307,10 +307,9 @@ public void clearPosProviderCache() { * Used to determine when the jackhammer preview area needs to be recalculated. */ private record LastJackhammerDetails(BlockPos pos, Direction face, - JackHammerItem.DigMode digMode) { - - private boolean matches(BlockPos pos, Direction face, JackHammerItem.DigMode digMode) { - return face == this.face && digMode == this.digMode && pos.equals(this.pos); + JackHammerItem.DigMode digMode, boolean shift) { + private boolean matches(BlockPos pos, Direction face, JackHammerItem.DigMode digMode, boolean shift) { + return face == this.face && digMode == this.digMode && pos.equals(this.pos) && shift == this.shift; } } } diff --git a/src/main/java/me/desht/pneumaticcraft/common/item/JackHammerItem.java b/src/main/java/me/desht/pneumaticcraft/common/item/JackHammerItem.java index b67bb74b1..0e2999b4d 100644 --- a/src/main/java/me/desht/pneumaticcraft/common/item/JackHammerItem.java +++ b/src/main/java/me/desht/pneumaticcraft/common/item/JackHammerItem.java @@ -165,7 +165,7 @@ public boolean onEntitySwing(ItemStack stack, LivingEntity entity) { public boolean onBlockStartBreak(ItemStack itemstack, BlockPos pos, Player player) { MutableBoolean didWork = new MutableBoolean(false); - if (player instanceof ServerPlayer serverPlayer && !player.isShiftKeyDown()) { + if (player instanceof ServerPlayer serverPlayer) { Level level = serverPlayer.getCommandSenderWorld(); HitResult hitResult = RayTraceUtils.getEntityLookedObject(player, PneumaticCraftUtils.getPlayerReachDistance(player)); @@ -182,8 +182,7 @@ public boolean onBlockStartBreak(ItemStack itemstack, BlockPos pos, Player playe // sanity check digMode = DigMode.MODE_1X1; } - Set brokenPos = getBreakPositions(level, pos, blockHitResult.getDirection(), player.getDirection(), digMode); - brokenPos.remove(pos); // start pos already broken + Set brokenPos = getBreakPositions(level, pos, blockHitResult.getDirection(), player, digMode); float air = airHandler.getAir(); float air0 = air; @@ -247,11 +246,15 @@ private static void magnetHarvest(Block block, Level level, Player player, Block } } - public static Set getBreakPositions(Level world, BlockPos pos, Direction dir, Direction playerHoriz, DigMode digMode) { + public static Set getBreakPositions(Level world, BlockPos pos, Direction dir, Player player, DigMode digMode) { + if (player.isShiftKeyDown()) { + return new HashSet<>(); + } if (digMode.isVeinMining()) { return new HashSet<>(getVeinPositions(world, pos, digMode)); } + Direction playerHoriz = player.getDirection(); Set res = new HashSet<>(); if (digMode.atLeast(DigMode.MODE_1X2)) { res.add(dir.getAxis() == Direction.Axis.Y ? pos.relative(playerHoriz) : pos.below()); @@ -303,6 +306,8 @@ public static Set getBreakPositions(Level world, BlockPos pos, Directi } } } + + res.remove(pos); return res; }