Tweaked portal loading and fix portals not being detected to disable fading until entered at least once.

This commit is contained in:
Acuadragon100
2026-04-23 19:52:03 +02:00
parent ca550a0a57
commit 0e340e4558
9 changed files with 102 additions and 109 deletions
@@ -102,6 +102,7 @@ public class ClientLevelWrapper implements IClientLevelWrapper
//==================//
//region
@Override
public synchronized void markRendered() {
this.lastRenderTime = System.currentTimeMillis();
}
@@ -155,6 +156,9 @@ public class ClientLevelWrapper implements IClientLevelWrapper
{
LOGGER.debug("Unloading level " + wrapper.getDhIdentifier() + " due to inactivity");
ClientApi.INSTANCE.clientLevelUnloadEvent(wrapper);
if (wrapper.isDhLevelLoaded()) {
wrapper.onUnload();
}
}
}
}
@@ -116,7 +116,7 @@ public class FabricMain extends AbstractModInitializer implements ClientModIniti
this.tryCreateModCompatAccessor("optifine", IOptifineAccessor.class, OptifineAccessor::new);
this.tryCreateModCompatAccessor("bclib", IBCLibAccessor.class, BCLibAccessor::new);
this.tryCreateModCompatAccessor("c2me", IC2meAccessor.class, C2meAccessor::new);
this.tryCreateModCompatAccessor("imm_ptl_core", IImmersivePortalsAccessor.class, ImmersivePortalsAccessor::new);
this.tryCreateModCompatAccessor("imm_ptl_core", IImmersivePortalsAccessor.class, ImmersivePortalsAccessorFabric::new);
#if MC_VER >= MC_1_19_4
// 1.19.4 is the lowest version Iris supports DH
this.tryCreateModCompatAccessor("iris", IIrisAccessor.class, IrisAccessor::new);
@@ -27,7 +27,6 @@ import com.mojang.math.Matrix4f;
import org.lwjgl.opengl.GL32;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
#elif MC_VER < MC_1_21_6
import com.seibel.distanthorizons.core.util.math.Mat4f;
import net.minecraft.client.renderer.RenderType;
import com.mojang.blaze3d.vertex.PoseStack;
import org.joml.Matrix4f;
@@ -75,10 +74,7 @@ import com.seibel.distanthorizons.common.wrappers.minecraft.MinecraftRenderWrapp
import com.seibel.distanthorizons.common.wrappers.McObjectConverter;
import com.seibel.distanthorizons.common.wrappers.world.ClientLevelWrapper;
import com.seibel.distanthorizons.core.api.internal.ClientApi;
import com.seibel.distanthorizons.core.dependencyInjection.ModAccessorInjector;
import com.seibel.distanthorizons.coreapi.ModInfo;
import com.seibel.distanthorizons.core.logging.DhLoggerBuilder;
import com.seibel.distanthorizons.core.wrapperInterfaces.modAccessor.IImmersivePortalsAccessor;
import net.minecraft.client.multiplayer.ClientLevel;
import net.minecraft.client.renderer.LevelRenderer;
@@ -173,25 +169,6 @@ public class MixinLevelRenderer
ClientApi.RENDER_STATE.partialTickTime = MinecraftRenderWrapper.INSTANCE.getPartialTickTime();
ClientApi.RENDER_STATE.clientLevelWrapper = ClientLevelWrapper.getWrapperIfDifferent(ClientApi.RENDER_STATE.clientLevelWrapper, this.level);
if (ClientApi.RENDER_STATE.clientLevelWrapper instanceof ClientLevelWrapper)
{
ClientLevelWrapper wrapper = (ClientLevelWrapper) ClientApi.RENDER_STATE.clientLevelWrapper;
// Apply Immersive Portals compatibility only when IP is detected
if (ModAccessorInjector.INSTANCE.get(IImmersivePortalsAccessor.class) != null)
{
if (!wrapper.isDhLevelLoaded())
{
LOGGER.debug("IP detected - On-demand loading level " + wrapper.getDhIdentifier() + " during rendering");
ClientApi.INSTANCE.clientLevelLoadEvent(wrapper);
}
}
wrapper.markRendered();
}
#if MC_VER < MC_1_21_6
if (renderType.equals(RenderType.translucent()))
{
@@ -0,0 +1,47 @@
package com.seibel.distanthorizons.fabric.wrappers.modAccessor;
import com.google.common.base.Suppliers;
import com.mojang.blaze3d.systems.RenderSystem;
import com.seibel.distanthorizons.core.api.internal.ClientApi;
import com.seibel.distanthorizons.core.wrapperInterfaces.modAccessor.ImmersivePortalsAbstractAccessor;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.culling.Frustum;
import net.minecraft.world.level.Level;
import net.minecraft.world.phys.Vec3;
import java.util.function.Supplier;
public class ImmersivePortalsAccessorFabric extends ImmersivePortalsAbstractAccessor
{
@Override
protected Object getClientLevel()
{
return Minecraft.getInstance().level;
}
@Override
protected Class<?> getLevelClass()
{
return Level.class;
}
@Override
protected Iterable<?> getEntitiesForRendering()
{
return Minecraft.getInstance().level.entitiesForRendering();
}
@Override
protected Supplier<?> getFrustumSupplier()
{
return Suppliers.memoize(() -> {
Frustum frustum = new Frustum(
ClientApi.RENDER_STATE.mcModelViewMatrix.createJomlMatrix(),
RenderSystem.getProjectionMatrix()
);
Vec3 cameraPos = Minecraft.getInstance().gameRenderer.getMainCamera().getPosition();
frustum.prepare(cameraPos.x, cameraPos.y, cameraPos.z);
return frustum;
});
}
}
@@ -134,29 +134,6 @@ public class ForgeClientProxy implements AbstractModInitializer.IEventProxy
IClientLevelWrapper clientLevelWrapper = ClientLevelWrapper.getWrapper(clientLevel, true);
ClientApi.INSTANCE.clientLevelLoadEvent(clientLevelWrapper);
}
@SubscribeEvent
#if MC_VER < MC_1_19_2
public void clientLevelUnloadEvent(WorldEvent.Unload event)
#else
public void clientLevelUnloadEvent(LevelEvent.Unload event)
#endif
{
LOGGER.info("level unload");
#if MC_VER < MC_1_19_2
LevelAccessor level = event.getWorld();
#else
LevelAccessor level = event.getLevel();
#endif
if (!(level instanceof ClientLevel))
{
return;
}
ClientLevel clientLevel = (ClientLevel) level;
IClientLevelWrapper clientLevelWrapper = ClientLevelWrapper.getWrapper(clientLevel);
ClientApi.INSTANCE.clientLevelUnloadEvent(clientLevelWrapper);
}
@@ -27,6 +27,7 @@ import com.seibel.distanthorizons.core.wrapperInterfaces.misc.IPluginPacketSende
import com.seibel.distanthorizons.core.wrapperInterfaces.modAccessor.*;
import com.seibel.distanthorizons.coreapi.ModInfo;
import com.seibel.distanthorizons.forge.wrappers.modAccessor.ImmersivePortalsAccessorForge;
import com.seibel.distanthorizons.forge.wrappers.modAccessor.ModChecker;
import com.seibel.distanthorizons.forge.wrappers.modAccessor.OptifineAccessor;
import com.seibel.distanthorizons.forge.wrappers.modAccessor.OculusAccessor;
@@ -102,7 +103,7 @@ public class ForgeMain extends AbstractModInitializer
{
this.tryCreateModCompatAccessor("optifine", IOptifineAccessor.class, OptifineAccessor::new);
this.tryCreateModCompatAccessor("oculus", IIrisAccessor.class, OculusAccessor::new);
this.tryCreateModCompatAccessor("imm_ptl_core", IImmersivePortalsAccessor.class, ImmersivePortalsAccessor::new);
this.tryCreateModCompatAccessor("imm_ptl_core", IImmersivePortalsAccessor.class, ImmersivePortalsAccessorForge::new);
#if MC_VER < MC_1_17_1
ModLoadingContext.get().registerExtensionPoint(ExtensionPoint.CONFIGGUIFACTORY,
@@ -0,0 +1,47 @@
package com.seibel.distanthorizons.forge.wrappers.modAccessor;
import com.google.common.base.Suppliers;
import com.mojang.blaze3d.systems.RenderSystem;
import com.seibel.distanthorizons.core.api.internal.ClientApi;
import com.seibel.distanthorizons.core.wrapperInterfaces.modAccessor.ImmersivePortalsAbstractAccessor;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.culling.Frustum;
import net.minecraft.world.level.Level;
import net.minecraft.world.phys.Vec3;
import java.util.function.Supplier;
public class ImmersivePortalsAccessorForge extends ImmersivePortalsAbstractAccessor
{
@Override
protected Object getClientLevel()
{
return Minecraft.getInstance().level;
}
@Override
protected Class<?> getLevelClass()
{
return Level.class;
}
@Override
protected Iterable<?> getEntitiesForRendering()
{
return Minecraft.getInstance().level.entitiesForRendering();
}
@Override
protected Supplier<?> getFrustumSupplier()
{
return Suppliers.memoize(() -> {
Frustum frustum = new Frustum(
ClientApi.RENDER_STATE.mcModelViewMatrix.createJomlMatrix(),
RenderSystem.getProjectionMatrix()
);
Vec3 cameraPos = Minecraft.getInstance().gameRenderer.getMainCamera().getPosition();
frustum.prepare(cameraPos.x, cameraPos.y, cameraPos.z);
return frustum;
});
}
}
@@ -94,21 +94,6 @@ public class NeoforgeClientProxy implements AbstractModInitializer.IEventProxy
IClientLevelWrapper clientLevelWrapper = ClientLevelWrapper.getWrapper(clientLevel, true);
ClientApi.INSTANCE.clientLevelLoadEvent(clientLevelWrapper);
}
@SubscribeEvent
public void clientLevelUnloadEvent(LevelEvent.Unload event)
{
LOGGER.info("level unload");
LevelAccessor level = event.getLevel();
if (!(level instanceof ClientLevel))
{
return;
}
ClientLevel clientLevel = (ClientLevel) level;
IClientLevelWrapper clientLevelWrapper = ClientLevelWrapper.getWrapper(clientLevel);
ClientApi.INSTANCE.clientLevelUnloadEvent(clientLevelWrapper);
}
@@ -241,21 +226,6 @@ public class NeoforgeClientProxy implements AbstractModInitializer.IEventProxy
// handled via the same mixin as fabric for consistency
#endif
if (ClientApi.RENDER_STATE.clientLevelWrapper instanceof ClientLevelWrapper)
{
ClientLevelWrapper wrapper = (ClientLevelWrapper) ClientApi.RENDER_STATE.clientLevelWrapper;
if (ModAccessorInjector.INSTANCE.get(IImmersivePortalsAccessor.class) != null)
{
if (!wrapper.isDhLevelLoaded())
{
LOGGER.debug("IP detected - On-demand loading level " + wrapper.getDhIdentifier() + " during rendering");
ClientApi.INSTANCE.clientLevelLoadEvent(wrapper);
}
}
wrapper.markRendered();
}
ClientApi.INSTANCE.renderFadeOpaque();
}
@@ -270,21 +240,6 @@ public class NeoforgeClientProxy implements AbstractModInitializer.IEventProxy
#else
// handled via the same mixin as fabric for consistency
#endif
if (ClientApi.RENDER_STATE.clientLevelWrapper instanceof ClientLevelWrapper)
{
ClientLevelWrapper wrapper = (ClientLevelWrapper) ClientApi.RENDER_STATE.clientLevelWrapper;
if (ModAccessorInjector.INSTANCE.get(IImmersivePortalsAccessor.class) != null)
{
if (!wrapper.isDhLevelLoaded())
{
LOGGER.debug("IP detected - On-demand loading level " + wrapper.getDhIdentifier() + " during rendering");
ClientApi.INSTANCE.clientLevelLoadEvent(wrapper);
}
}
wrapper.markRendered();
}
}
@SubscribeEvent
@@ -298,21 +253,6 @@ public class NeoforgeClientProxy implements AbstractModInitializer.IEventProxy
// handled via the same mixin as fabric for consistency
#endif
if (ClientApi.RENDER_STATE.clientLevelWrapper instanceof ClientLevelWrapper)
{
ClientLevelWrapper wrapper = (ClientLevelWrapper) ClientApi.RENDER_STATE.clientLevelWrapper;
if (ModAccessorInjector.INSTANCE.get(IImmersivePortalsAccessor.class) != null)
{
if (!wrapper.isDhLevelLoaded())
{
LOGGER.debug("IP detected - On-demand loading level " + wrapper.getDhIdentifier() + " during rendering");
ClientApi.INSTANCE.clientLevelLoadEvent(wrapper);
}
}
wrapper.markRendered();
}
try
{
// should generally only need to be set once per game session