diff --git a/common/src/main/java/org/vivecraft/client/render/VRPlayerRenderer.java b/common/src/main/java/org/vivecraft/client/render/VRPlayerRenderer.java index 27a0f052b..c2fa7de0e 100644 --- a/common/src/main/java/org/vivecraft/client/render/VRPlayerRenderer.java +++ b/common/src/main/java/org/vivecraft/client/render/VRPlayerRenderer.java @@ -10,8 +10,10 @@ import net.minecraft.client.renderer.entity.player.PlayerRenderer; import net.minecraft.world.phys.Vec3; import org.vivecraft.client.VRPlayersClient; +import org.vivecraft.client.Xplat; import org.vivecraft.client_vr.ClientDataHolderVR; import org.vivecraft.client_vr.render.RenderPass; +import org.vivecraft.mod_compat_vr.immersiveportals.ImmersivePortalsHelper; import java.util.UUID; @@ -36,7 +38,10 @@ public VRPlayerRenderer(EntityRendererProvider.Context context, boolean slim, bo @Override public void render(AbstractClientPlayer entityIn, float pEntityYaw, float pPartialTicks, PoseStack matrixStackIn, MultiBufferSource pBuffer, int pPackedLight) { - + if (Xplat.isModLoaded("immersive_portals") && entityIn == Minecraft.getInstance().player + && ImmersivePortalsHelper.isStandingInPortal()) { + return; + } VRPlayersClient.RotInfo playermodelcontroller$rotinfo = VRPlayersClient.getInstance().getRotationsForPlayer(entityIn.getUUID()); if (playermodelcontroller$rotinfo != null) { 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 f1f4e4200..19f4d7247 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/ImmersivePortalsHelper.java b/common/src/main/java/org/vivecraft/mod_compat_vr/immersiveportals/ImmersivePortalsHelper.java index ca9585d0a..003cef30f 100644 --- a/common/src/main/java/org/vivecraft/mod_compat_vr/immersiveportals/ImmersivePortalsHelper.java +++ b/common/src/main/java/org/vivecraft/mod_compat_vr/immersiveportals/ImmersivePortalsHelper.java @@ -1,6 +1,11 @@ package org.vivecraft.mod_compat_vr.immersiveportals; +import net.minecraft.client.Minecraft; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.phys.AABB; import qouteall.imm_ptl.core.IPGlobal; +import qouteall.imm_ptl.core.portal.Mirror; +import qouteall.imm_ptl.core.portal.Portal; import qouteall.imm_ptl.core.render.context_management.PortalRendering; public class ImmersivePortalsHelper { @@ -11,4 +16,10 @@ public static boolean isRenderingPortal() { public static boolean shouldRenderSelf() { return IPGlobal.renderYourselfInPortal && isRenderingPortal(); } + + public static boolean isStandingInPortal() { + Player player = Minecraft.getInstance().player; + return !player.level().getEntities(player, AABB.ofSize(player.position(), 0.1, 0.1, 0.1), + (entity -> entity instanceof Portal && !(entity instanceof Mirror))).isEmpty(); + } } diff --git a/common/src/main/java/org/vivecraft/mod_compat_vr/immersiveportals/mixin/ClientTeleportationManagerMixin.java b/common/src/main/java/org/vivecraft/mod_compat_vr/immersiveportals/mixin/ClientTeleportationManagerMixin.java new file mode 100644 index 000000000..b2856afdd --- /dev/null +++ b/common/src/main/java/org/vivecraft/mod_compat_vr/immersiveportals/mixin/ClientTeleportationManagerMixin.java @@ -0,0 +1,26 @@ +package org.vivecraft.mod_compat_vr.immersiveportals.mixin; + +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import qouteall.imm_ptl.core.portal.Portal; +import qouteall.imm_ptl.core.teleportation.ClientTeleportationManager; +import qouteall.imm_ptl.core.teleportation.TeleportationUtil; + +@Mixin(ClientTeleportationManager.class) +public class ClientTeleportationManagerMixin { + @Shadow + private static long lastTeleportGameTime; + + @Shadow + public static long tickTimeForTeleportation; + + @Inject(method = "teleportPlayer", at = @At("HEAD"), remap = false, cancellable = true) + private static void onlyOneTpPerFrame(TeleportationUtil.Teleportation teleportation, float partialTicks, CallbackInfo ci) { + if (lastTeleportGameTime == tickTimeForTeleportation) { + ci.cancel(); + } + } +} diff --git a/common/src/main/java/org/vivecraft/mod_compat_vr/immersiveportals/mixin/CrossPortalViewRenderingMixin.java b/common/src/main/java/org/vivecraft/mod_compat_vr/immersiveportals/mixin/CrossPortalViewRenderingMixin.java new file mode 100644 index 000000000..a0c9f6360 --- /dev/null +++ b/common/src/main/java/org/vivecraft/mod_compat_vr/immersiveportals/mixin/CrossPortalViewRenderingMixin.java @@ -0,0 +1,32 @@ +package org.vivecraft.mod_compat_vr.immersiveportals.mixin; + +import net.minecraft.client.Camera; +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.Redirect; +import org.vivecraft.client_vr.ClientDataHolderVR; +import org.vivecraft.client_vr.VRState; +import org.vivecraft.client_vr.gameplay.VRPlayer; +import qouteall.imm_ptl.core.render.CrossPortalViewRendering; +import qouteall.imm_ptl.core.teleportation.ClientTeleportationManager; + +@Mixin(CrossPortalViewRendering.class) +public class CrossPortalViewRenderingMixin { + + @Redirect(method = "renderCrossPortalView", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/Camera;getPosition()Lnet/minecraft/world/phys/Vec3;"), remap = false) + private static Vec3 getPlayerCameraPos(Camera camera) { + if (VRState.vrRunning && ClientDataHolderVR.getInstance() != null && VRPlayer.get() != null) { + return VRPlayer.get().vrdata_world_render.getEye(ClientDataHolderVR.getInstance().currentPass).getPosition(); + } + return camera.getPosition(); + } + + @Redirect(method = "renderCrossPortalView", at = @At(value = "INVOKE", target = "Lqouteall/imm_ptl/core/render/TransformationManager;getIsometricAdjustedCameraPos(Lnet/minecraft/client/Camera;)Lnet/minecraft/world/phys/Vec3;"), remap = false) + private static Vec3 getPlayerCameraPos2(Camera camera) { + if (VRState.vrRunning && ClientDataHolderVR.getInstance() != null && VRPlayer.get() != null) { + return VRPlayer.get().vrdata_world_render.getEye(ClientDataHolderVR.getInstance().currentPass).getPosition(); + } + return camera.getPosition(); + } +} 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..55b0b4437 --- /dev/null +++ b/common/src/main/java/org/vivecraft/mod_compat_vr/immersiveportals/mixin/McHelperMixin.java @@ -0,0 +1,27 @@ +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(); + Vec3 offset = newPos.subtract(VRPlayer.get().roomOrigin); + VRPlayer.get().vrdata_world_render.origin = VRPlayer.get().vrdata_world_render.origin.add(offset); + VRPlayer.get().vrdata_world_pre.origin = VRPlayer.get().vrdata_world_pre.origin.add(offset); + VRPlayer.get().vrdata_world_post.origin = VRPlayer.get().vrdata_world_post.origin.add(offset); + 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..2d16d3368 --- /dev/null +++ b/common/src/main/resources/vivecraft.immersiveportals.mixins.json @@ -0,0 +1,12 @@ +{ + "required": false, + "package": "org.vivecraft.mod_compat_vr.immersiveportals.mixin", + "plugin": "org.vivecraft.MixinConfig", + "compatibilityLevel": "JAVA_17", + "client": [ + "ClientTeleportationManagerMixin", + "CrossPortalViewRenderingMixin", + "McHelperMixin" + ], + "minVersion": "0.8.4" +} diff --git a/fabric/src/main/resources/fabric.mod.json b/fabric/src/main/resources/fabric.mod.json index a221ccfb8..87c4c996e 100644 --- a/fabric/src/main/resources/fabric.mod.json +++ b/fabric/src/main/resources/fabric.mod.json @@ -35,6 +35,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 8ac8c2ee3..ccd0b87d0 100644 --- a/forge/build.gradle +++ b/forge/build.gradle @@ -21,6 +21,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"