diff --git a/src/client/java/pl/xyundy/squaredadditions/mixin/client/ClientPlayerInteractionManagerMixin.java b/src/client/java/pl/xyundy/squaredadditions/mixin/client/ClientPlayerInteractionManagerMixin.java index d0ad84f..bd49d55 100644 --- a/src/client/java/pl/xyundy/squaredadditions/mixin/client/ClientPlayerInteractionManagerMixin.java +++ b/src/client/java/pl/xyundy/squaredadditions/mixin/client/ClientPlayerInteractionManagerMixin.java @@ -1,5 +1,6 @@ package pl.xyundy.squaredadditions.mixin.client; +import pl.xyundy.squaredadditions.block.MixedSlabBlock; import pl.xyundy.squaredadditions.slabs.PlacementUtil; import net.minecraft.block.BlockState; import net.minecraft.block.SlabBlock; @@ -20,7 +21,9 @@ // https://github.com/Oliver-makes-code/autoslab/blob/1.19/src/main/java/olivermakesco/de/autoslab/mixin/Mixin_ClientPlayerInteractionManager.java @Mixin(ClientPlayerInteractionManager.class) public class ClientPlayerInteractionManagerMixin { - @Shadow @Final private MinecraftClient client; + @Shadow + @Final + private MinecraftClient client; @Redirect(method = "breakBlock", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/World;setBlockState(Lnet/minecraft/util/math/BlockPos;Lnet/minecraft/block/BlockState;I)Z")) private boolean squaredadditions$tryBreakSlab(World instance, BlockPos pos, BlockState state, int flags) { @@ -32,9 +35,28 @@ public class ClientPlayerInteractionManagerMixin { assert clientPlayer != null; if (clientPlayer.isSneaking()) return instance.setBlockState(pos, state, flags); - SlabType breakType = PlacementUtil.calcKleeSlab(breakState, PlacementUtil.calcRaycast(clientPlayer)); - return instance.setBlockState(pos, breakState.with(SlabBlock.TYPE, breakType), flags); + SlabType remainingSlabType = PlacementUtil.calcKleeSlab(breakState, PlacementUtil.calcRaycast(clientPlayer)); + return instance.setBlockState(pos, breakState.with(SlabBlock.TYPE, remainingSlabType), flags); } + + if (breakState.getBlock() instanceof MixedSlabBlock mixedSlabBlock) { + ClientPlayerEntity clientPlayer = client.player; + assert clientPlayer != null; + if (clientPlayer.isSneaking()) return instance.setBlockState(pos, state, flags); + + SlabType remainingSlabType = PlacementUtil.calcKleeSlab(breakState, PlacementUtil.calcRaycast(clientPlayer)); + + System.out.println("client remainingSlabType: " + remainingSlabType); + + return switch (remainingSlabType) { + case TOP -> + instance.setBlockState(pos, mixedSlabBlock.getTopSlabState().with(SlabBlock.TYPE, remainingSlabType), flags); + case BOTTOM -> + instance.setBlockState(pos, mixedSlabBlock.getBottomSlabState().with(SlabBlock.TYPE, remainingSlabType), flags); + case DOUBLE -> instance.setBlockState(pos, state, flags); + }; + } + return instance.setBlockState(pos, state, flags); } } \ No newline at end of file diff --git a/src/client/resources/squaredadditions.client.mixins.json b/src/client/resources/squaredadditions.client.mixins.json index 99a9d28..1f8e924 100644 --- a/src/client/resources/squaredadditions.client.mixins.json +++ b/src/client/resources/squaredadditions.client.mixins.json @@ -1,11 +1,12 @@ { - "required": true, - "package": "pl.xyundy.squaredadditions.mixin.client", - "compatibilityLevel": "JAVA_17", - "client": [ - "WorldRendererMixin" - ], - "injectors": { - "defaultRequire": 1 + "required": true, + "package": "pl.xyundy.squaredadditions.mixin.client", + "compatibilityLevel": "JAVA_17", + "client": [ + "ClientPlayerInteractionManagerMixin", + "WorldRendererMixin" + ], + "injectors": { + "defaultRequire": 1 } } \ No newline at end of file diff --git a/src/main/java/pl/xyundy/squaredadditions/mixin/ServerPlayerInteractionManagerMixin.java b/src/main/java/pl/xyundy/squaredadditions/mixin/ServerPlayerInteractionManagerMixin.java index d6bedf1..9d9d6ab 100644 --- a/src/main/java/pl/xyundy/squaredadditions/mixin/ServerPlayerInteractionManagerMixin.java +++ b/src/main/java/pl/xyundy/squaredadditions/mixin/ServerPlayerInteractionManagerMixin.java @@ -1,5 +1,6 @@ package pl.xyundy.squaredadditions.mixin; +import pl.xyundy.squaredadditions.block.MixedSlabBlock; import pl.xyundy.squaredadditions.slabs.PlacementUtil; import net.minecraft.block.BlockState; import net.minecraft.block.SlabBlock; @@ -37,6 +38,25 @@ public class ServerPlayerInteractionManagerMixin { world.setBlockState(pos, breakState.with(SlabBlock.TYPE, breakType)); return isRemoved; } + + if (breakState.getBlock() instanceof MixedSlabBlock mixedSlabBlock) { + ServerPlayerEntity serverPlayer = player; + assert serverPlayer != null; + if (serverPlayer.isSneaking()) return instance.removeBlock(pos, b); + + SlabType remainingSlabType = PlacementUtil.calcKleeSlab(breakState, PlacementUtil.calcRaycast(serverPlayer)); + boolean isRemoved = instance.removeBlock(pos, b); + + System.out.println("server remainingSlabType: " + remainingSlabType); + + switch (remainingSlabType) { + case TOP -> world.setBlockState(pos, mixedSlabBlock.getTopSlabState().with(SlabBlock.TYPE, remainingSlabType)); + case BOTTOM -> world.setBlockState(pos, mixedSlabBlock.getBottomSlabState().with(SlabBlock.TYPE, remainingSlabType)); + } + + return isRemoved; + } + return instance.removeBlock(pos, b); } } \ No newline at end of file