Avoid reloading levels when unnecessary

This commit is contained in:
s809
2024-06-14 16:25:20 +05:00
parent 7c705015e6
commit acb299530d
2 changed files with 31 additions and 13 deletions
@@ -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);
}
});
}
@@ -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<DhServerLevel, RateLimiterSet> 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));