Skip to content

Commit

Permalink
jackhammer: holding shift shouldn't prevent block breaking entirely
Browse files Browse the repository at this point in the history
It now just suppresses breaking of extra blocks, but still always allows
the targeted block to be broken.

#1214
  • Loading branch information
desht committed Sep 12, 2023
1 parent addefa3 commit 6f1141b
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 12 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ public enum AreaRenderManager {
private List<AreaRenderer> 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;

Expand Down Expand Up @@ -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<BlockPos> 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);
}
Expand Down Expand Up @@ -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;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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));
Expand All @@ -182,8 +182,7 @@ public boolean onBlockStartBreak(ItemStack itemstack, BlockPos pos, Player playe
// sanity check
digMode = DigMode.MODE_1X1;
}
Set<BlockPos> brokenPos = getBreakPositions(level, pos, blockHitResult.getDirection(), player.getDirection(), digMode);
brokenPos.remove(pos); // start pos already broken
Set<BlockPos> brokenPos = getBreakPositions(level, pos, blockHitResult.getDirection(), player, digMode);

float air = airHandler.getAir();
float air0 = air;
Expand Down Expand Up @@ -247,11 +246,15 @@ private static void magnetHarvest(Block block, Level level, Player player, Block
}
}

public static Set<BlockPos> getBreakPositions(Level world, BlockPos pos, Direction dir, Direction playerHoriz, DigMode digMode) {
public static Set<BlockPos> 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<BlockPos> res = new HashSet<>();
if (digMode.atLeast(DigMode.MODE_1X2)) {
res.add(dir.getAxis() == Direction.Axis.Y ? pos.relative(playerHoriz) : pos.below());
Expand Down Expand Up @@ -303,6 +306,8 @@ public static Set<BlockPos> getBreakPositions(Level world, BlockPos pos, Directi
}
}
}

res.remove(pos);
return res;
}

Expand Down

0 comments on commit 6f1141b

Please sign in to comment.