From acb299530d112530fa61b46cec162f09c897ea4a Mon Sep 17 00:00:00 2001 From: s809 <43530948+s809@users.noreply.github.com> Date: Fri, 14 Jun 2024 16:25:20 +0500 Subject: [PATCH] Avoid reloading levels when unnecessary --- .../api/internal/ClientPluginChannelApi.java | 34 ++++++++++++++----- .../multiplayer/server/ServerPlayerState.java | 10 +++--- 2 files changed, 31 insertions(+), 13 deletions(-) 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 7565f0b20..d3452ec37 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 @@ -55,25 +55,41 @@ public class ClientPluginChannelApi private void onCurrentLevelKeyMessage(CurrentLevelKeyMessage msg) { - if (!msg.levelKey.matches("[a-zA-Z0-9_]+")) + if (!msg.levelKey.matches("[a-zA-Z0-9_]{1,50}")) { - throw new IllegalArgumentException("Server sent invalid world key name."); + throw new IllegalArgumentException("Server sent invalid level key."); } - LOGGER.info("Server level change event received, changing the level to [" + msg.levelKey + "]."); + LOGGER.info("Server level key received: " + msg.levelKey); MC.executeOnRenderThread(() -> { IClientLevelWrapper clientLevel = MC.getWrappedClientLevel(true); - - if (clientLevel != null) + IServerKeyedClientLevel existingKeyedClientLevel = KEYED_CLIENT_LEVEL_MANAGER.getServerKeyedLevel(); + + if (existingKeyedClientLevel != null) { - // In either case only one of them will have an effect. + 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.getDimensionType().getDimensionName()); this.levelUnloadHandler.accept(clientLevel); - this.levelUnloadHandler.accept(KEYED_CLIENT_LEVEL_MANAGER.getServerKeyedLevel()); } - IServerKeyedClientLevel keyedLevel = KEYED_CLIENT_LEVEL_MANAGER.setServerKeyedLevel(clientLevel, msg.levelKey); - this.multiverseLevelLoadHandler.accept(keyedLevel); + if (existingKeyedClientLevel == null || !existingKeyedClientLevel.getServerLevelKey().equals(msg.levelKey)) + { + LOGGER.info("Loading level with key: " + msg.levelKey); + IServerKeyedClientLevel keyedLevel = KEYED_CLIENT_LEVEL_MANAGER.setServerKeyedLevel(clientLevel, msg.levelKey); + this.multiverseLevelLoadHandler.accept(keyedLevel); + } }); } diff --git a/core/src/main/java/com/seibel/distanthorizons/core/multiplayer/server/ServerPlayerState.java b/core/src/main/java/com/seibel/distanthorizons/core/multiplayer/server/ServerPlayerState.java index f5e75a877..540624b34 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/multiplayer/server/ServerPlayerState.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/multiplayer/server/ServerPlayerState.java @@ -1,8 +1,6 @@ package com.seibel.distanthorizons.core.multiplayer.server; -import com.seibel.distanthorizons.core.config.Config; import com.seibel.distanthorizons.core.level.DhServerLevel; -import com.seibel.distanthorizons.core.logging.ConfigBasedLogger; import com.seibel.distanthorizons.core.multiplayer.config.MultiplayerConfig; import com.seibel.distanthorizons.core.multiplayer.config.MultiplayerConfigChangeListener; import com.seibel.distanthorizons.core.network.messages.plugin.CurrentLevelKeyMessage; @@ -13,7 +11,6 @@ import com.seibel.distanthorizons.core.network.messages.plugin.fullData.FullData import com.seibel.distanthorizons.core.network.plugin.PluginChannelSession; import com.seibel.distanthorizons.core.util.ratelimiting.SupplierBasedRateAndConcurrencyLimiter; import com.seibel.distanthorizons.core.wrapperInterfaces.misc.IServerPlayerWrapper; -import org.apache.logging.log4j.LogManager; import org.jetbrains.annotations.NotNull; import java.util.concurrent.ConcurrentHashMap; @@ -28,6 +25,7 @@ public class ServerPlayerState @NotNull public ConstrainedMultiplayerConfig config = new ConstrainedMultiplayerConfig(); private final MultiplayerConfigChangeListener configChangeListener = new MultiplayerConfigChangeListener(this::onConfigChanged); + private String lastLevelKey = ""; private final ConcurrentHashMap rateLimiterSets = new ConcurrentHashMap<>(); public RateLimiterSet getRateLimiterSet(DhServerLevel level) @@ -64,7 +62,11 @@ public class ServerPlayerState levelKey = dimensionName; } - this.session.sendMessage(new CurrentLevelKeyMessage(levelKey)); + if (!levelKey.equals(this.lastLevelKey)) + { + this.lastLevelKey = levelKey; + this.session.sendMessage(new CurrentLevelKeyMessage(levelKey)); + } } this.session.sendMessage(new RemotePlayerConfigMessage(this.config));