Add original level resource to level init
This commit is contained in:
@@ -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)
|
||||
|
||||
+12
-10
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
+3
-3
@@ -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();
|
||||
|
||||
+14
-46
@@ -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<String> 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<String> 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();
|
||||
}
|
||||
|
||||
+6
-1
@@ -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);
|
||||
|
||||
+1
-1
@@ -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);
|
||||
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user