Avoid reloading levels when unnecessary
This commit is contained in:
+25
-9
@@ -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);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
+6
-4
@@ -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));
|
||||
|
||||
Reference in New Issue
Block a user