diff --git a/src/main/java/me/jellysquid/mods/sodium/mixin/core/gui/DownloadingTerrainScreenMixin.java b/src/main/java/me/jellysquid/mods/sodium/mixin/core/gui/DownloadingTerrainScreenMixin.java new file mode 100644 index 0000000000..f1098d29c4 --- /dev/null +++ b/src/main/java/me/jellysquid/mods/sodium/mixin/core/gui/DownloadingTerrainScreenMixin.java @@ -0,0 +1,20 @@ +package me.jellysquid.mods.sodium.mixin.core.gui; + +import net.minecraft.client.gui.screen.DownloadingTerrainScreen; +import net.minecraft.client.network.ClientPlayerEntity; +import net.minecraft.util.math.BlockPos; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Redirect; + +@Mixin(DownloadingTerrainScreen.class) +public class DownloadingTerrainScreenMixin { + @Redirect(method = "tick", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/network/ClientPlayerEntity;getBlockPos()Lnet/minecraft/util/math/BlockPos;")) + private BlockPos redirect$getPlayerBlockPosition(ClientPlayerEntity instance) { + // Ensure the "eye" position (which the chunk rendering code is actually concerned about) is used instead of + // the "feet" position. This solves a problem where the loading screen can become stuck waiting for the chunk + // at the player's feet to load, when it is determined to not be visible due to the true location of the + // player's eyes. + return BlockPos.ofFloored(instance.getX(), instance.getEyeY(), instance.getY()); + } +} diff --git a/src/main/resources/sodium.mixins.json b/src/main/resources/sodium.mixins.json index 2d976ebe97..faa6773239 100644 --- a/src/main/resources/sodium.mixins.json +++ b/src/main/resources/sodium.mixins.json @@ -27,6 +27,7 @@ "core.checks.VertexBufferMixin", "core.checks.VertexFormatMixin", "core.checks.WindowFramebufferMixin", + "core.gui.DownloadingTerrainScreenMixin", "core.model.colors.BlockColorsMixin", "core.model.colors.ItemColorsMixin", "core.model.quad.BakedQuadMixin",