From 1a4af9036e3c10896c75c2a863ffcfdf81bc1f4e Mon Sep 17 00:00:00 2001 From: MUKSC <68376185+MUKSC@users.noreply.github.com> Date: Tue, 6 Feb 2024 03:11:54 +0900 Subject: [PATCH 1/2] Implement `rotate()` and `mirror()` for vertical slabs --- .../autoslabs/mixin/SlabBlockMixin.java | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/src/main/java/io/github/andrew6rant/autoslabs/mixin/SlabBlockMixin.java b/src/main/java/io/github/andrew6rant/autoslabs/mixin/SlabBlockMixin.java index cac0ad8..287b137 100644 --- a/src/main/java/io/github/andrew6rant/autoslabs/mixin/SlabBlockMixin.java +++ b/src/main/java/io/github/andrew6rant/autoslabs/mixin/SlabBlockMixin.java @@ -11,6 +11,8 @@ import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemPlacementContext; import net.minecraft.item.ItemStack; +import net.minecraft.util.BlockMirror; +import net.minecraft.util.BlockRotation; import net.minecraft.util.hit.BlockHitResult; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Direction; @@ -25,6 +27,8 @@ import static io.github.andrew6rant.autoslabs.Util.TYPE; import static io.github.andrew6rant.autoslabs.Util.VERTICAL_TYPE; +import static io.github.andrew6rant.autoslabs.VerticalType.*; +import static net.minecraft.block.enums.SlabType.BOTTOM; import static net.minecraft.block.enums.SlabType.TOP; @Mixin(SlabBlock.class) @@ -83,4 +87,35 @@ public void afterBreak(World world, PlayerEntity player, BlockPos pos, BlockStat } } + @Override + public BlockState rotate(BlockState state, BlockRotation rotation) { + SlabType slabType = state.get(TYPE); + if (slabType == null) return super.rotate(state, rotation); + if (slabType == SlabType.DOUBLE) return state; + + VerticalType verticalType = state.get(VERTICAL_TYPE); + if (verticalType == null) return super.rotate(state, rotation); + if (verticalType == FALSE || rotation == BlockRotation.NONE) return state; + + return switch (rotation) { + case CLOCKWISE_90 -> state + .with(VERTICAL_TYPE, verticalType == NORTH_SOUTH ? EAST_WEST : NORTH_SOUTH) + .with(TYPE, verticalType == EAST_WEST ? (slabType == TOP ? BOTTOM : TOP) : slabType); + case CLOCKWISE_180 -> state + .with(TYPE, slabType == TOP ? BOTTOM : TOP); + case COUNTERCLOCKWISE_90 -> state + .with(VERTICAL_TYPE, verticalType == NORTH_SOUTH ? EAST_WEST : NORTH_SOUTH) + .with(TYPE, verticalType == NORTH_SOUTH ? (slabType == TOP ? BOTTOM : TOP) : slabType); + default -> state; + }; + } + + @Override + public BlockState mirror(BlockState state, BlockMirror mirror) { + VerticalType verticalType = state.get(VERTICAL_TYPE); + if (verticalType == null) return super.mirror(state, mirror); + if (verticalType == FALSE || mirror == BlockMirror.NONE) return state; + return state.with(TYPE, state.get(TYPE) == TOP ? BOTTOM : TOP); + } + } \ No newline at end of file From c75720074de65e4f5a834893a89d2363c0dad0ba Mon Sep 17 00:00:00 2001 From: MUKSC <68376185+MUKSC@users.noreply.github.com> Date: Sat, 10 Feb 2024 13:23:31 +0900 Subject: [PATCH 2/2] Fix wrong `mirror()` implementation --- .../autoslabs/mixin/SlabBlockMixin.java | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/main/java/io/github/andrew6rant/autoslabs/mixin/SlabBlockMixin.java b/src/main/java/io/github/andrew6rant/autoslabs/mixin/SlabBlockMixin.java index 287b137..fc41d77 100644 --- a/src/main/java/io/github/andrew6rant/autoslabs/mixin/SlabBlockMixin.java +++ b/src/main/java/io/github/andrew6rant/autoslabs/mixin/SlabBlockMixin.java @@ -112,10 +112,25 @@ public BlockState rotate(BlockState state, BlockRotation rotation) { @Override public BlockState mirror(BlockState state, BlockMirror mirror) { + SlabType slabType = state.get(TYPE); + if (slabType == null) return super.mirror(state, mirror); + if (slabType == SlabType.DOUBLE) return state; + VerticalType verticalType = state.get(VERTICAL_TYPE); if (verticalType == null) return super.mirror(state, mirror); if (verticalType == FALSE || mirror == BlockMirror.NONE) return state; - return state.with(TYPE, state.get(TYPE) == TOP ? BOTTOM : TOP); + + return switch (mirror) { + case LEFT_RIGHT -> switch (verticalType) { + case EAST_WEST -> state; + default -> state.with(TYPE, state.get(TYPE) == TOP ? BOTTOM : TOP); + }; + case FRONT_BACK -> switch (verticalType) { + case NORTH_SOUTH -> state; + default -> state.with(TYPE, state.get(TYPE) == TOP ? BOTTOM : TOP); + }; + default -> state; + }; } } \ No newline at end of file