diff --git a/core/src/main/java/com/seibel/distanthorizons/core/api/internal/ClientApi.java b/core/src/main/java/com/seibel/distanthorizons/core/api/internal/ClientApi.java index 83b81ef18..ef4289643 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/api/internal/ClientApi.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/api/internal/ClientApi.java @@ -119,7 +119,7 @@ public class ClientApi public boolean rendererDisabledBecauseOfExceptions = false; - private final ClientPluginChannelApi pluginChannelApi = new ClientPluginChannelApi(this::clientLevelLoadEvent, this::clientLevelUnloadEvent); + private final ClientPluginChannelApi pluginChannelApi = new ClientPluginChannelApi(); /** Delay loading the first level to give the server some time to respond with level to actually load */ private Timer firstLevelLoadTimer; @@ -204,14 +204,6 @@ public class ClientApi this.pluginChannelApi.onJoinServer(world.networkState.getSession()); world.networkState.sendConfigMessage(); - - LOGGER.info("Loading [" + this.waitingClientLevels.size() + "] waiting client level wrappers."); - for (IClientLevelWrapper level : this.waitingClientLevels) - { - this.clientLevelLoadEvent(level); - } - - this.waitingClientLevels.clear(); } } @@ -238,7 +230,6 @@ public class ClientApi // remove any waiting items this.waitingChunkByClientLevelAndPos.clear(); - this.waitingClientLevels.clear(); } //endregion @@ -250,95 +241,7 @@ public class ClientApi //==============// //region - public void clientLevelUnloadEvent(IClientLevelWrapper level) - { - try - { - LOGGER.info("Unloading client level [" + level.getClass().getSimpleName() + "]-[" + level.getDhIdentifier() + "]."); - - if (level instanceof IServerKeyedClientLevel) - { - this.pluginChannelApi.onClientLevelUnload(); - } - - AbstractDhWorld world = SharedApi.getAbstractDhWorld(); - if (world != null) - { - world.unloadLevel(level); - ApiEventInjector.INSTANCE.fireAllEvents(DhApiLevelUnloadEvent.class, new DhApiLevelUnloadEvent.EventParam(level)); - } - else - { - this.waitingClientLevels.remove(level); - } - } - catch (Exception e) - { - // handle errors here to prevent blowing up a mixin or API up stream - LOGGER.error("Unexpected error in ClientApi.clientLevelUnloadEvent(), error: "+e.getMessage(), e); - } - } - - public void clientLevelLoadEvent(@Nullable IClientLevelWrapper levelWrapper) - { - // can happen if there was an issue during level load - if (levelWrapper == null) - { - return; - } - - - // wait a moment before loading the level to give the server a chance to handle the client's login request - if (MC_CLIENT.clientConnectedToDedicatedServer()) - { - if (this.firstLevelLoadTimer == null) - { - this.firstLevelLoadTimer = TimerUtil.CreateTimer("FirstLevelLoadTimer"); - this.firstLevelLoadTimer.schedule(new TimerTask() - { - @Override - public void run() { ClientApi.this.clientLevelLoadEvent(levelWrapper); } - }, FIRST_LEVEL_LOAD_DELAY_IN_MS); - return; - } - this.firstLevelLoadTimer.cancel(); - } - - - try - { - LOGGER.info("Loading client level [" + levelWrapper + "]-[" + levelWrapper.getDhIdentifier() + "]."); - - AbstractDhWorld world = SharedApi.getAbstractDhWorld(); - if (world != null) - { - if (!this.pluginChannelApi.allowLevelLoading(levelWrapper)) - { - LOGGER.info("Levels in this connection are managed by the server, skipping auto-load."); - - // Instead of attempting to load themselves, send the config and wait for a server provided level key. - ((DhClientWorld) world).networkState.sendConfigMessage(); - return; - } - - - world.getOrLoadLevel(levelWrapper); - ApiEventInjector.INSTANCE.fireAllEvents(DhApiLevelLoadEvent.class, new DhApiLevelLoadEvent.EventParam(levelWrapper)); - - this.loadWaitingChunksForLevel(levelWrapper); - } - else - { - this.waitingClientLevels.add(levelWrapper); - } - } - catch (Exception e) - { - // handle errors here to prevent blowing up a mixin or API up stream - LOGGER.error("Unexpected error in ClientApi.clientLevelLoadEvent(), error: "+e.getMessage(), e); - } - } - private void loadWaitingChunksForLevel(IClientLevelWrapper level) + public void loadWaitingChunksForLevel(IClientLevelWrapper level) { HashSet> keysToRemove = new HashSet<>(); for (Pair levelChunkPair : this.waitingChunkByClientLevelAndPos.keySet()) diff --git a/core/src/main/java/com/seibel/distanthorizons/core/api/internal/ClientPluginChannelApi.java b/core/src/main/java/com/seibel/distanthorizons/core/api/internal/ClientPluginChannelApi.java index f70438f61..b3b18a78e 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/api/internal/ClientPluginChannelApi.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/api/internal/ClientPluginChannelApi.java @@ -10,6 +10,7 @@ import com.seibel.distanthorizons.core.network.event.internal.CloseInternalEvent import com.seibel.distanthorizons.core.network.messages.base.LevelInitMessage; import com.seibel.distanthorizons.core.network.session.NetworkSession; import com.seibel.distanthorizons.core.render.RenderThreadTaskHandler; +import com.seibel.distanthorizons.core.world.AbstractDhWorld; import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftClientWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.world.IClientLevelWrapper; import org.jetbrains.annotations.NotNull; @@ -30,9 +31,6 @@ public class ClientPluginChannelApi private static final IMinecraftClientWrapper MC = SingletonInjector.INSTANCE.get(IMinecraftClientWrapper.class); private static final IKeyedClientLevelManager KEYED_CLIENT_LEVEL_MANAGER = SingletonInjector.INSTANCE.get(IKeyedClientLevelManager.class); - private final Consumer levelLoadHandler; - private final Consumer levelUnloadHandler; - @Nullable public NetworkSession networkSession; @@ -42,10 +40,8 @@ public class ClientPluginChannelApi // constructor // //=============// - public ClientPluginChannelApi(Consumer levelLoadHandler, Consumer levelUnloadHandler) + public ClientPluginChannelApi() { - this.levelLoadHandler = levelLoadHandler; - this.levelUnloadHandler = levelUnloadHandler; } @@ -94,24 +90,6 @@ public class ClientPluginChannelApi { IClientLevelWrapper clientLevel = MC.getWrappedClientLevel(true); IServerKeyedClientLevel existingKeyedClientLevel = KEYED_CLIENT_LEVEL_MANAGER.getServerKeyedLevel(); - - if (existingKeyedClientLevel != null) - { - if (!existingKeyedClientLevel.getServerLevelKey().equals(msg.levelKey)) - { - LOGGER.info("Unloading previous level with key: [" + existingKeyedClientLevel.getServerLevelKey() + "]."); - this.levelUnloadHandler.accept(existingKeyedClientLevel); - } - else - { - LOGGER.info("Level key matches the previous level key, ignoring the message."); - } - } - else - { - LOGGER.info("Unloading non-keyed level: [" + clientLevel.getDhIdentifier() + "]."); - this.levelUnloadHandler.accept(clientLevel); - } if (existingKeyedClientLevel == null || !existingKeyedClientLevel.getServerKey().equals(msg.serverKey) @@ -119,7 +97,10 @@ public class ClientPluginChannelApi { LOGGER.info("Loading level with key: [" + msg.levelKey + "]."); IServerKeyedClientLevel keyedLevel = KEYED_CLIENT_LEVEL_MANAGER.setServerKeyedLevel(clientLevel, msg.serverKey, msg.levelKey); - this.levelLoadHandler.accept(keyedLevel); + AbstractDhWorld world = SharedApi.getAbstractDhWorld(); + if (world != null) { + world.getOrLoadLevel(keyedLevel); + } } }); } diff --git a/core/src/main/java/com/seibel/distanthorizons/core/api/internal/ServerApi.java b/core/src/main/java/com/seibel/distanthorizons/core/api/internal/ServerApi.java index bbfa2536e..06dd5b302 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/api/internal/ServerApi.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/api/internal/ServerApi.java @@ -78,33 +78,6 @@ public class ServerApi - //==============// - // level events // - //==============// - - public void serverLevelLoadEvent(IServerLevelWrapper levelWrapper) - { - LOGGER.debug("Server Level " + levelWrapper + " loading"); - - AbstractDhWorld serverWorld = SharedApi.getAbstractDhWorld(); - if (serverWorld != null) - { - serverWorld.getOrLoadLevel(levelWrapper); - ApiEventInjector.INSTANCE.fireAllEvents(DhApiLevelLoadEvent.class, new DhApiLevelLoadEvent.EventParam(levelWrapper)); - } - } - public void serverLevelUnloadEvent(IServerLevelWrapper level) - { - LOGGER.debug("Server Level " + level + " unloading"); - - AbstractDhWorld serverWorld = SharedApi.getAbstractDhWorld(); - if (serverWorld != null) - { - serverWorld.unloadLevel(level); - ApiEventInjector.INSTANCE.fireAllEvents(DhApiLevelUnloadEvent.class, new DhApiLevelUnloadEvent.EventParam(level)); - } - } - //=======================// diff --git a/core/src/main/java/com/seibel/distanthorizons/core/world/DhClientServerWorld.java b/core/src/main/java/com/seibel/distanthorizons/core/world/DhClientServerWorld.java index 987b750b6..505e5a644 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/world/DhClientServerWorld.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/world/DhClientServerWorld.java @@ -19,6 +19,8 @@ package com.seibel.distanthorizons.core.world; +import com.seibel.distanthorizons.api.methods.events.abstractEvents.DhApiLevelLoadEvent; +import com.seibel.distanthorizons.api.methods.events.abstractEvents.DhApiLevelUnloadEvent; import com.seibel.distanthorizons.core.api.internal.ClientApi; import com.seibel.distanthorizons.core.enums.MinecraftTextFormat; import com.seibel.distanthorizons.core.level.DhClientServerLevel; @@ -27,6 +29,7 @@ import com.seibel.distanthorizons.core.util.LodUtil; import com.seibel.distanthorizons.core.wrapperInterfaces.world.IClientLevelWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.world.ILevelWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.world.IServerLevelWrapper; +import com.seibel.distanthorizons.coreapi.DependencyInjection.ApiEventInjector; import org.jetbrains.annotations.NotNull; import java.util.*; @@ -76,6 +79,7 @@ public class DhClientServerWorld extends AbstractDhServerWorld { try { - return new DhServerLevel(this.saveStructure, (IServerLevelWrapper) serverLevelWrapper, this.getServerPlayerStateManager()); + DhServerLevel level = new DhServerLevel(this.saveStructure, (IServerLevelWrapper) serverLevelWrapper, this.getServerPlayerStateManager()); + ApiEventInjector.INSTANCE.fireAllEvents(DhApiLevelLoadEvent.class, new DhApiLevelLoadEvent.EventParam(wrapper)); + return level; } catch (Exception e) { @@ -92,6 +97,7 @@ public class DhServerWorld extends AbstractDhServerWorld DhServerLevel level = this.dhLevelByLevelWrapper.get(wrapper); wrapper.onUnload(); this.dhLevelByLevelWrapper.remove(wrapper).close(); + ApiEventInjector.INSTANCE.fireAllEvents(DhApiLevelUnloadEvent.class, new DhApiLevelUnloadEvent.EventParam(wrapper)); } } diff --git a/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/modAccessor/ImmersivePortalsAbstractAccessor.java b/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/modAccessor/ImmersivePortalsAbstractAccessor.java index 893a6694b..18fb69959 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/modAccessor/ImmersivePortalsAbstractAccessor.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/modAccessor/ImmersivePortalsAbstractAccessor.java @@ -225,7 +225,7 @@ public abstract class ImmersivePortalsAbstractAccessor implements IImmersivePort } // Simply checking portal visibility right now is not sufficient, that will still render the fading on top of the portal. // Instead, we check if a portal was rendered during the last second or so. - return false; + return portalVisible; } @Override