Add original level resource to level init

This commit is contained in:
s809
2026-06-07 01:32:41 +05:00
parent 8a4f991906
commit 4e99594a3f
6 changed files with 37 additions and 62 deletions
@@ -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);
}
}
}
});
@@ -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();
@@ -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();
}
@@ -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);
@@ -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);
}