diff --git a/api/src/main/java/com/seibel/distanthorizons/coreapi/ModInfo.java b/api/src/main/java/com/seibel/distanthorizons/coreapi/ModInfo.java index a91c1a792..c9002afa8 100644 --- a/api/src/main/java/com/seibel/distanthorizons/coreapi/ModInfo.java +++ b/api/src/main/java/com/seibel/distanthorizons/coreapi/ModInfo.java @@ -31,7 +31,7 @@ public final class ModInfo public static final String DEDICATED_SERVER_INITIAL_PATH = "dedicated_server_initial"; /** Incremented every time any packets are added, changed or removed, with a few exceptions. */ - public static final int PROTOCOL_VERSION = 14; + public static final int PROTOCOL_VERSION = 15; /** * The full plugin channel name (RESOURCE_NAMESPACE:WRAPPER_PACKET_PATH) 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 79902676d..52c850074 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 @@ -17,7 +17,6 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.Objects; -import java.util.function.Consumer; /** * This class is used to manage the level keys. @@ -84,23 +83,26 @@ public class ClientPluginChannelApi throw new IllegalArgumentException("Server sent invalid level key."); } - LOGGER.info("Server level key received: [" + msg.levelKey + "]."); + LOGGER.info("Level init received for [" + msg.dimensionResourceLocation + "]: server key [" + msg.serverKey + "], level key [" + msg.levelKey + "]"); RenderThreadTaskHandler.INSTANCE.queueRunningOnRenderThread("ClientPluginChannelApi onLevelInitMessage", () -> { IClientLevelWrapper clientLevel = MC.getWrappedClientLevel(true); - IServerKeyedClientLevel existingKeyedClientLevel = KEYED_CLIENT_LEVEL_MANAGER.getServerKeyedLevel(); + IServerKeyedClientLevel existingKeyedClientLevel = KEYED_CLIENT_LEVEL_MANAGER.getServerKeyedLevel(clientLevel); if (existingKeyedClientLevel == null - || !existingKeyedClientLevel.getServerKey().equals(msg.serverKey) - || !existingKeyedClientLevel.getServerLevelKey().equals(msg.levelKey)) + || !existingKeyedClientLevel.getServerKey().equals(msg.serverKey) + || !existingKeyedClientLevel.getServerLevelKey().equals(msg.levelKey)) { LOGGER.info("Loading level with key: [" + msg.levelKey + "]."); - IServerKeyedClientLevel keyedLevel = KEYED_CLIENT_LEVEL_MANAGER.setServerKeyedLevel(clientLevel, msg.serverKey, msg.levelKey); - AbstractDhWorld world = SharedApi.getAbstractDhWorld(); - if (world != null) - { - world.getOrLoadLevel(keyedLevel); + + IServerKeyedClientLevel keyedLevel = KEYED_CLIENT_LEVEL_MANAGER.setServerKeyedLevel(clientLevel, msg.dimensionResourceLocation, msg.serverKey, msg.levelKey); + + if (keyedLevel != null) { + AbstractDhWorld world = SharedApi.getAbstractDhWorld(); + if (world != null) { + world.getOrLoadLevel(keyedLevel); + } } } }); diff --git a/core/src/main/java/com/seibel/distanthorizons/core/level/IKeyedClientLevelManager.java b/core/src/main/java/com/seibel/distanthorizons/core/level/IKeyedClientLevelManager.java index ca66ebcb6..ca534703e 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/level/IKeyedClientLevelManager.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/level/IKeyedClientLevelManager.java @@ -28,9 +28,9 @@ import com.seibel.distanthorizons.coreapi.interfaces.dependencyInjection.IBindab */ public interface IKeyedClientLevelManager extends IBindable { - IServerKeyedClientLevel getServerKeyedLevel(); - /** Called when a client level is wrapped by a ServerEnhancedClientLevel, for integration into mod internals. */ - IServerKeyedClientLevel setServerKeyedLevel(IClientLevelWrapper clientLevel, String serverKey, String levelKey); + IServerKeyedClientLevel getServerKeyedLevel(IClientLevelWrapper levelWrapper); + /** Called when a client level is wrapped by a ServerKeyedClientLevel, for integration into mod internals. */ + IServerKeyedClientLevel setServerKeyedLevel(IClientLevelWrapper clientLevel, String dimensionResource, String serverKey, String levelKey); void clearKeyedLevel(); boolean isEnabled(); 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 6ac87b895..3e2589bd6 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,7 +1,6 @@ package com.seibel.distanthorizons.core.multiplayer.server; import com.seibel.distanthorizons.core.config.Config; -import com.seibel.distanthorizons.core.config.listeners.ConfigChangeListener; import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector; import com.seibel.distanthorizons.core.level.AbstractDhServerLevel; import com.seibel.distanthorizons.core.multiplayer.config.SessionConfig; @@ -16,7 +15,6 @@ import com.seibel.distanthorizons.core.network.event.internal.CloseInternalEvent import com.seibel.distanthorizons.core.network.exceptions.RateLimitedException; import com.seibel.distanthorizons.core.network.messages.fullData.FullDataSourceRequestMessage; import com.seibel.distanthorizons.core.network.session.NetworkSession; -import com.seibel.distanthorizons.core.util.LodUtil; import com.seibel.distanthorizons.core.util.ratelimiting.SupplierBasedRateAndConcurrencyLimiter; import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftSharedWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.misc.IServerPlayerWrapper; @@ -25,22 +23,17 @@ import org.jetbrains.annotations.NotNull; import java.io.Closeable; import java.util.concurrent.ConcurrentHashMap; -import java.util.function.Supplier; public class ServerPlayerState implements Closeable { private final IMinecraftSharedWrapper MC_SHARED = SingletonInjector.INSTANCE.get(IMinecraftSharedWrapper.class); - private final ConfigChangeListener levelKeyPrefixChangeListener - = new ConfigChangeListener<>(Config.Server.levelKeyPrefix, this::onLevelKeyPrefixConfigChanged); private final SessionConfig.AnyChangeListener configAnyChangeListener = new SessionConfig.AnyChangeListener(this::sendConfigMessage); - private final String serverKeyWithoutId = Config.Server.serverKey.get(); private final String serverKey = (this.serverKeyWithoutId.isEmpty() ? "" : Config.Server.serverId.get() + "_" + this.serverKeyWithoutId.trim()) .replaceAll("[^" + LevelInitMessage.ALLOWED_CHARS_REGEX + " ]", "") .replaceAll(" ", "_"); - private String lastLevelKey = ""; public final NetworkSession networkSession; @@ -72,9 +65,21 @@ public class ServerPlayerState implements Closeable this.sendConfigMessage(); }); - this.networkSession.registerHandler(RequestLevelInitMessage.class, (requestLevelInitMessage) -> + this.networkSession.registerHandler(RequestLevelInitMessage.class, msg -> { - sendLevelKey(requestLevelInitMessage.dimensionResourceLocation); + if (!Config.Server.sendLevelKeys.get()) + { + return; + } + + IServerLevelWrapper serverLevelWrapper = MC_SHARED.getLevelWrapper(msg.dimensionResourceLocation); + if (serverLevelWrapper == null) + { + return; + } + + String levelKey = serverLevelWrapper.getKeyedLevelDimensionName(); + this.networkSession.sendMessage(new LevelInitMessage(msg.dimensionResourceLocation, this.serverKey, levelKey)); }); @@ -96,42 +101,6 @@ public class ServerPlayerState implements Closeable // client updating // //=================// - private void onLevelKeyPrefixConfigChanged(String newLevelKey) { this.sendLevelKey(); } - - private void sendLevelKey(String dimensionResourceLocation) - { - sendLevelKey(() -> - { - IServerLevelWrapper serverLevelWrapper = MC_SHARED.getWrappedServerLevelWithDimensionResourceLocation(dimensionResourceLocation); - if (serverLevelWrapper == null) - { - LodUtil.assertNotReach("Unable to get server level from"); - } - - return serverLevelWrapper.getKeyedLevelDimensionName(); - }); - } - private void sendLevelKey() - { - sendLevelKey(() -> - this.getServerPlayer() - .getLevel() - .getKeyedLevelDimensionName()); - } - private void sendLevelKey(Supplier levelKeySupplier) - { - if (Config.Server.sendLevelKeys.get()) - { - String levelKey = levelKeySupplier.get(); - // let the client's know about the change - if (!levelKey.equals(this.lastLevelKey)) - { - this.lastLevelKey = levelKey; - this.networkSession.sendMessage(new LevelInitMessage(this.serverKey, levelKey)); - } - } - } - private void sendConfigMessage() { double coordinateScale = this.getServerPlayer().getLevel().getDimensionType().getCoordinateScale(); @@ -151,7 +120,6 @@ public class ServerPlayerState implements Closeable public void close() { this.fullDataPayloadSender.close(); - this.levelKeyPrefixChangeListener.close(); this.configAnyChangeListener.close(); this.networkSession.close(); } diff --git a/core/src/main/java/com/seibel/distanthorizons/core/network/messages/base/LevelInitMessage.java b/core/src/main/java/com/seibel/distanthorizons/core/network/messages/base/LevelInitMessage.java index e5f1285d7..ad8db6b54 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/network/messages/base/LevelInitMessage.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/network/messages/base/LevelInitMessage.java @@ -21,6 +21,7 @@ public class LevelInitMessage extends AbstractNetworkMessage MAX_LENGTH, ALLOWED_CHARS_REGEX, ALLOWED_CHARS_REGEX, ALLOWED_CHARS_REGEX); + public String dimensionResourceLocation; public String serverKey; public String levelKey; public long serverTime; @@ -32,8 +33,9 @@ public class LevelInitMessage extends AbstractNetworkMessage //==============// public LevelInitMessage() { } - public LevelInitMessage(String serverKey, String levelKey) + public LevelInitMessage(String dimensionResourceLocation, String serverKey, String levelKey) { + this.dimensionResourceLocation = dimensionResourceLocation; this.serverKey = serverKey; this.levelKey = levelKey; this.serverTime = System.currentTimeMillis(); @@ -48,6 +50,7 @@ public class LevelInitMessage extends AbstractNetworkMessage @Override public void encode(ByteBuf out) { + this.writeString(this.dimensionResourceLocation, out); this.writeString(this.serverKey, out); this.writeString(this.levelKey, out); out.writeLong(this.serverTime); @@ -56,6 +59,7 @@ public class LevelInitMessage extends AbstractNetworkMessage @Override public void decode(ByteBuf in) { + this.dimensionResourceLocation = this.readString(in); this.serverKey = this.readString(in); this.levelKey = this.readString(in); this.serverTime = in.readLong(); @@ -71,6 +75,7 @@ public class LevelInitMessage extends AbstractNetworkMessage public MoreObjects.ToStringHelper toStringHelper() { return super.toStringHelper() + .add("dimensionResourceLocation", this.dimensionResourceLocation) .add("serverKey", this.serverKey) .add("levelKey", this.levelKey) .add("serverTime", this.serverTime); diff --git a/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/minecraft/IMinecraftSharedWrapper.java b/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/minecraft/IMinecraftSharedWrapper.java index 5c7437c9a..9fecf2778 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/minecraft/IMinecraftSharedWrapper.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/minecraft/IMinecraftSharedWrapper.java @@ -35,7 +35,7 @@ public interface IMinecraftSharedWrapper extends IBindable /** If used on the client will only return a non-null object if the client is hosting a LAN server */ @Nullable - IServerLevelWrapper getWrappedServerLevelWithDimensionResourceLocation(String dimensionResourceLocation); + IServerLevelWrapper getLevelWrapper(String dimensionResourceLocation); }