diff --git a/common/src/main/java/org/vivecraft/client_vr/render/helpers/VREffectsHelper.java b/common/src/main/java/org/vivecraft/client_vr/render/helpers/VREffectsHelper.java index 4e1cb5ec2..c8bcf7c27 100644 --- a/common/src/main/java/org/vivecraft/client_vr/render/helpers/VREffectsHelper.java +++ b/common/src/main/java/org/vivecraft/client_vr/render/helpers/VREffectsHelper.java @@ -19,6 +19,7 @@ import net.minecraft.network.chat.HoverEvent; import net.minecraft.resources.ResourceLocation; import net.minecraft.util.Mth; +import net.minecraft.world.level.Level; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.BlockHitResult; @@ -70,15 +71,17 @@ public static boolean isInsideOpaqueBlock(Vec3 in) { } public static Triple getNearOpaqueBlock(Vec3 in, double dist) { - if (mc.level == null) { + // Prefer mc.player.level() to prevent getting the head stuck in block with ImmersivePortals. + Level level = mc.player != null && mc.player.level() != null ? mc.player.level() : mc.level; + if (level == null) { return null; } else { AABB aabb = new AABB(in.subtract(dist, dist, dist), in.add(dist, dist, dist)); Stream stream = BlockPos.betweenClosedStream(aabb).filter((bp) -> - mc.level.getBlockState(bp).isSolidRender(mc.level, bp)); + level.getBlockState(bp).isSolidRender(level, bp)); Optional optional = stream.findFirst(); return optional.isPresent() - ? Triple.of(1.0F, mc.level.getBlockState(optional.get()), optional.get()) + ? Triple.of(1.0F, level.getBlockState(optional.get()), optional.get()) : null; } } diff --git a/common/src/main/java/org/vivecraft/mod_compat_vr/immersiveportals/mixin/McHelperMixin.java b/common/src/main/java/org/vivecraft/mod_compat_vr/immersiveportals/mixin/McHelperMixin.java new file mode 100644 index 000000000..378933200 --- /dev/null +++ b/common/src/main/java/org/vivecraft/mod_compat_vr/immersiveportals/mixin/McHelperMixin.java @@ -0,0 +1,23 @@ +package org.vivecraft.mod_compat_vr.immersiveportals.mixin; + +import net.minecraft.world.entity.Entity; +import net.minecraft.world.phys.Vec3; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.vivecraft.client_vr.gameplay.VRPlayer; +import qouteall.imm_ptl.core.McHelper; + +@Mixin(McHelper.class) +public class McHelperMixin { + + @Inject(at = @At("HEAD"), method = "updateBoundingBox") + private static void updateBoundingBox(Entity player, CallbackInfo ci) { + if (VRPlayer.get() != null) { + Vec3 newPos = player.position(); + VRPlayer.get().setRoomOrigin(newPos.x, newPos.y, newPos.z, true); + } + } + +} diff --git a/common/src/main/resources/vivecraft.immersiveportals.mixins.json b/common/src/main/resources/vivecraft.immersiveportals.mixins.json new file mode 100644 index 000000000..2f2cc3f84 --- /dev/null +++ b/common/src/main/resources/vivecraft.immersiveportals.mixins.json @@ -0,0 +1,10 @@ +{ + "required": false, + "package": "org.vivecraft.mod_compat_vr.immersiveportals.mixin", + "plugin": "org.vivecraft.MixinConfig", + "compatibilityLevel": "JAVA_17", + "client": [ + "McHelperMixin" + ], + "minVersion": "0.8.4" +} diff --git a/fabric/src/main/resources/fabric.mod.json b/fabric/src/main/resources/fabric.mod.json index e235eb601..2090e76a7 100644 --- a/fabric/src/main/resources/fabric.mod.json +++ b/fabric/src/main/resources/fabric.mod.json @@ -36,6 +36,7 @@ "vivecraft.dynamicfps.mixins.json", "vivecraft.sodium.mixins.json", "vivecraft.fabric.sodium.mixins.json", + "vivecraft.immersiveportals.mixins.json", "vivecraft.iris.mixins.json", "vivecraft.modmenu.mixins.json", "vivecraft.physicsmod.mixins.json", diff --git a/forge/build.gradle b/forge/build.gradle index e1786b939..1787121bb 100644 --- a/forge/build.gradle +++ b/forge/build.gradle @@ -22,6 +22,7 @@ loom { mixinConfig "vivecraft.sodium.mixins.json" mixinConfig "vivecraft.forge.sodium.mixins.json" mixinConfig "vivecraft.iris.mixins.json" + mixinConfig "vivecraft.immersiveportals.mixins.json" mixinConfig "vivecraft.physicsmod.mixins.json" mixinConfig "vivecraft.rei.mixins.json" mixinConfig "vivecraft.resolutioncontrol.mixins.json"