diff --git a/src/main/java/net/shadowfacts/simplemultipart/mixin/client/MixinWorldRenderer.java b/src/main/java/net/shadowfacts/simplemultipart/mixin/client/MixinWorldRenderer.java new file mode 100644 index 0000000..a301d8c --- /dev/null +++ b/src/main/java/net/shadowfacts/simplemultipart/mixin/client/MixinWorldRenderer.java @@ -0,0 +1,36 @@ +package net.shadowfacts.simplemultipart.mixin.client; + +import net.minecraft.block.BlockState; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.render.WorldRenderer; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.shape.VoxelShape; +import net.minecraft.world.BlockView; +import net.shadowfacts.simplemultipart.SimpleMultipart; +import net.shadowfacts.simplemultipart.container.MultipartContainer; +import net.shadowfacts.simplemultipart.util.MultipartHelper; +import net.shadowfacts.simplemultipart.util.MultipartHitResult; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +/** + * @author shadowfacts + */ +@Mixin(WorldRenderer.class) +public class MixinWorldRenderer { + + @Redirect(method = "drawHighlightedBlockOutline", at = @At(value = "INVOKE", target = "getBoundingShape")) + public VoxelShape getHighlightShape(BlockState state, BlockView world, BlockPos pos) { + if (state.getBlock() == SimpleMultipart.containerBlock || state.getBlock() == SimpleMultipart.tickableContainerBlock) { + MultipartContainer container = (MultipartContainer)world.getBlockEntity(pos); + MultipartHitResult result = MultipartHelper.rayTrace(container, world, pos, MinecraftClient.getInstance().player); + if (result != null && result.view != null) { + return result.view.getState().getBoundingShape(result.view); + } + } + + return state.getBoundingShape(world, pos); + } + +} diff --git a/src/main/java/net/shadowfacts/simplemultipart/util/MultipartHelper.java b/src/main/java/net/shadowfacts/simplemultipart/util/MultipartHelper.java index 7155760..08a86ed 100644 --- a/src/main/java/net/shadowfacts/simplemultipart/util/MultipartHelper.java +++ b/src/main/java/net/shadowfacts/simplemultipart/util/MultipartHelper.java @@ -12,6 +12,7 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.MathHelper; import net.minecraft.util.math.Vec3d; import net.minecraft.util.shape.VoxelShape; +import net.minecraft.world.BlockView; import net.minecraft.world.World; import net.shadowfacts.simplemultipart.SimpleMultipart; import net.shadowfacts.simplemultipart.container.MultipartContainer; @@ -37,7 +38,7 @@ public class MultipartHelper { * @param player The player performing the ray trace. * @return A hit result for the hit multipart. {@ode null} if not part was hit. */ - public static MultipartHitResult rayTrace(MultipartContainer container, World world, BlockPos pos, PlayerEntity player) { + public static MultipartHitResult rayTrace(MultipartContainer container, BlockView world, BlockPos pos, PlayerEntity player) { // copied from BoatItem::use float var6 = MathHelper.lerp(1.0F, player.prevPitch, player.pitch); float var7 = MathHelper.lerp(1.0F, player.prevYaw, player.yaw); @@ -67,7 +68,7 @@ public class MultipartHelper { * @param end The end position for the ray. * @return A hit result for the hit multipart. {@code null} if no part was hit. */ - public static MultipartHitResult rayTrace(MultipartContainer container, World world, BlockPos pos, Vec3d start, Vec3d end) { + public static MultipartHitResult rayTrace(MultipartContainer container, BlockView world, BlockPos pos, Vec3d start, Vec3d end) { return container.getParts().stream() .map(view -> { VoxelShape shape = view.getState().getBoundingShape(view); diff --git a/src/main/resources/simplemultipart.client.json b/src/main/resources/simplemultipart.client.json index acb2a51..0785932 100644 --- a/src/main/resources/simplemultipart.client.json +++ b/src/main/resources/simplemultipart.client.json @@ -5,7 +5,8 @@ "mixins": [ "MixinBlockRenderManager", "MixinDebugHud", - "MixinModelLoader" + "MixinModelLoader", + "MixinWorldRenderer" ], "injectors": { "defaultRequire": 1