diff --git a/fabric/src/main/java/me/lambdaurora/lambdacontrols/client/mixin/WorldRendererMixin.java b/fabric/src/main/java/me/lambdaurora/lambdacontrols/client/mixin/WorldRendererMixin.java index b38b9ae..b06b9b1 100644 --- a/fabric/src/main/java/me/lambdaurora/lambdacontrols/client/mixin/WorldRendererMixin.java +++ b/fabric/src/main/java/me/lambdaurora/lambdacontrols/client/mixin/WorldRendererMixin.java @@ -28,7 +28,6 @@ import net.minecraft.util.hit.HitResult; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.Matrix4f; import net.minecraft.util.math.Vec3d; -import net.minecraft.util.profiler.Profiler; import net.minecraft.util.shape.VoxelShape; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; @@ -53,6 +52,10 @@ public abstract class WorldRendererMixin @Shadow private ClientWorld world; + @Shadow + @Final + private BufferBuilderStorage bufferBuilders; + @Shadow private static void drawShapeOutline(MatrixStack matrixStack, VertexConsumer vertexConsumer, VoxelShape voxelShape, double d, double e, double f, float g, float h, float i, float j) { @@ -65,13 +68,10 @@ public abstract class WorldRendererMixin target = "Lnet/minecraft/client/MinecraftClient;crosshairTarget:Lnet/minecraft/util/hit/HitResult;", ordinal = 1, shift = At.Shift.AFTER - ), - locals = LocalCapture.CAPTURE_FAILEXCEPTION + ) ) private void onOutlineRender(MatrixStack matrices, float tickDelta, long limitTime, boolean renderBlockOutline, Camera camera, GameRenderer gameRenderer, - LightmapTextureManager lightmapTextureManager, Matrix4f matrix4f, CallbackInfo ci, - Profiler profiler, Vec3d cameraPos, double x, double y, double z, Matrix4f modelMatrix, boolean bl, Frustum frustum2, boolean bl3, - VertexConsumerProvider.Immediate immediate) + LightmapTextureManager lightmapTextureManager, Matrix4f matrix4f, CallbackInfo ci) { if (this.client.crosshairTarget == null || this.client.crosshairTarget.getType() != HitResult.Type.MISS || !LambdaControlsClient.get().config.shouldRenderReacharoundOutline()) return; @@ -83,16 +83,23 @@ public abstract class WorldRendererMixin ItemStack stack = this.client.player.getStackInHand(Hand.MAIN_HAND); if (stack == null || !(stack.getItem() instanceof BlockItem)) return; + Block block = ((BlockItem) stack.getItem()).getBlock(); result = LambdaReacharound.withSideForReacharound(result, block); ItemPlacementContext context = new ItemPlacementContext(new ItemUsageContext(this.client.player, Hand.MAIN_HAND, result)); - VertexConsumer vertexConsumer = immediate.getBuffer(RenderLayer.getLines()); + BlockState placementState = block.getPlacementState(context); if (placementState == null) return; + Vec3d pos = camera.getPos(); + VoxelShape outlineShape = placementState.getOutlineShape(this.client.world, blockPos, ShapeContext.of(camera.getFocusedEntity())); int[] color = LambdaControlsClient.get().config.getReacharoundOutlineColor(); - drawShapeOutline(matrices, vertexConsumer, outlineShape, (double) blockPos.getX() - x, (double) blockPos.getY() - y, (double) blockPos.getZ() - z, color[0] / 255.f, color[1] / 255.f, color[2] / 255.f, color[3] / 255.f); + + VertexConsumer vertexConsumer = this.bufferBuilders.getEntityVertexConsumers().getBuffer(RenderLayer.getLines()); + drawShapeOutline(matrices, vertexConsumer, outlineShape, + (double) blockPos.getX() - pos.getX(), (double) blockPos.getY() - pos.getY(), (double) blockPos.getZ() - pos.getZ(), + color[0] / 255.f, color[1] / 255.f, color[2] / 255.f, color[3] / 255.f); } } }