Use level's ResourceLocation instead of dimension type's

This commit is contained in:
s809
2024-06-28 15:28:33 +05:00
parent a0efe44e8d
commit 083a036666
26 changed files with 97 additions and 86 deletions
@@ -28,10 +28,8 @@ import com.seibel.distanthorizons.api.interfaces.IDhApiUnsafeWrapper;
*/
public interface IDhApiDimensionTypeWrapper extends IDhApiUnsafeWrapper
{
String getDimensionName();
boolean hasCeiling();
boolean hasSkyLight();
}
}
@@ -34,6 +34,8 @@ public interface IDhApiLevelWrapper extends IDhApiUnsafeWrapper
{
IDhApiDimensionTypeWrapper getDimensionType();
String getDimensionName();
EDhApiLevelType getLevelType();
boolean hasCeiling();
@@ -49,4 +51,4 @@ public interface IDhApiLevelWrapper extends IDhApiUnsafeWrapper
*/
default int getMinHeight() { return 0; }
}
}
@@ -177,7 +177,7 @@ public class ClientApi
{
try
{
LOGGER.info("Unloading client level [" + level + "]-["+level.getDimensionType().getDimensionName()+"].");
LOGGER.info("Unloading client level [" + level + "]-["+level.getDimensionName()+"].");
if (level instanceof IServerKeyedClientLevel && !respawn)
{
@@ -206,7 +206,7 @@ public class ClientApi
{
try
{
LOGGER.info("Loading client level [" + level + "]-["+level.getDimensionType().getDimensionName()+"].");
LOGGER.info("Loading client level [" + level + "]-["+level.getDimensionName()+"].");
AbstractDhWorld world = SharedApi.getAbstractDhWorld();
if (world != null)
@@ -55,7 +55,7 @@ public class ClientPluginChannelApi
private void onCurrentLevelKeyMessage(CurrentLevelKeyMessage msg)
{
if (!msg.levelKey.matches("[a-zA-Z0-9_]{1,50}"))
if (!msg.levelKey.matches("^(?=.{1,50}$)([a-zA-Z0-9-_]+@)?[a-zA-Z0-9-_]+(:[a-zA-Z0-9-_]+)?$"))
{
throw new IllegalArgumentException("Server sent invalid level key.");
}
@@ -80,7 +80,7 @@ public class ClientPluginChannelApi
}
else
{
LOGGER.info("Unloading non-keyed level: " + clientLevel.getDimensionType().getDimensionName());
LOGGER.info("Unloading non-keyed level: " + clientLevel.getDimensionName());
this.levelUnloadHandler.accept(clientLevel);
}
@@ -215,7 +215,7 @@ public class FullDataToRenderDataTransformer
if (!brokenPos.contains(fullDataMapping.getPos()))
{
brokenPos.add(fullDataMapping.getPos());
String dimName = level.getLevelWrapper().getDimensionType().getDimensionName();
String dimName = level.getLevelWrapper().getDimensionName();
LOGGER.warn("Unable to get data point with id ["+id+"] " +
"(Max possible ID: ["+fullDataMapping.getMaxValidId()+"]) " +
"for pos ["+fullDataMapping.getPos()+"] in dimension ["+dimName+"]. " +
@@ -321,4 +321,4 @@ public class FullDataToRenderDataTransformer
}
}
}
}
@@ -124,7 +124,7 @@ public class FullDataSourceProviderV2
DebugRenderer.register(this, Config.Client.Advanced.Debugging.DebugWireframe.showFullDataUpdateStatus);
String dimensionName = level.getLevelWrapper().getDimensionType().getDimensionName();
String dimensionName = level.getLevelWrapper().getDimensionName();
// start migrating any legacy data sources present in the background
this.migrationThreadPool = ThreadUtil.makeRateLimitedThreadPool(1, MIGRATION_THREAD_NAME_PREFIX + "[" + dimensionName + "]", Config.Client.Advanced.MultiThreading.runTimeRatioForUpdatePropagatorThreads.get(), Thread.MIN_PRIORITY, (Semaphore) null);
@@ -376,7 +376,7 @@ public class FullDataSourceProviderV2
private void convertLegacyDataSources()
{
String dimensionName = this.level.getLevelWrapper().getDimensionType().getDimensionName();
String dimensionName = this.level.getLevelWrapper().getDimensionName();
LOGGER.info("Attempting to migrate data sources for: [" + dimensionName + "]-[" + this.saveDir + "]...");
@@ -559,7 +559,7 @@ public class FullDataSourceProviderV2
}
this.migrationStartMessageQueued = true;
String dimName = this.level.getLevelWrapper().getDimensionType().getDimensionName();
String dimName = this.level.getLevelWrapper().getDimensionName();
ClientApi.INSTANCE.showChatMessageNextFrame(
"Old Distant Horizons data is being migrated for ["+dimName+"]. \n" +
"While migrating LODs may load slowly \n" +
@@ -570,7 +570,7 @@ public class FullDataSourceProviderV2
private void showMigrationEndMessage(boolean success)
{
String dimName = this.level.getLevelWrapper().getDimensionType().getDimensionName();
String dimName = this.level.getLevelWrapper().getDimensionName();
if (success)
{
@@ -143,7 +143,7 @@ public class GeneratedFullDataSourceProvider extends FullDataSourceProviderV2 im
{
boolean oldQueueExists = this.worldGenQueueRef.compareAndSet(null, newWorldGenQueue);
LodUtil.assertTrue(oldQueueExists, "previous world gen queue is still here!");
LOGGER.info("Set world gen queue for level [" + this.level.getLevelWrapper().getDimensionType().getDimensionName() + "].");
LOGGER.info("Set world gen queue for level [" + this.level.getLevelWrapper().getDimensionName() + "].");
}
@Override
@@ -84,7 +84,7 @@ public class ClientOnlySaveStructure extends AbstractSaveStructure
if (newLevelWrapper instanceof IServerKeyedClientLevel)
{
IServerKeyedClientLevel keyedClientLevel = (IServerKeyedClientLevel) newLevelWrapper;
LOGGER.info("Loading level " + newLevelWrapper.getDimensionType().getDimensionName() + " with key: " + keyedClientLevel.getServerLevelKey());
LOGGER.info("Loading level " + newLevelWrapper.getDimensionName() + " with key: " + keyedClientLevel.getServerLevelKey());
// This world was identified by the server directly, so we can know for sure which folder to use.
return new File(getSaveStructureFolderPath() + File.separatorChar + keyedClientLevel.getServerLevelKey());
}
@@ -98,9 +98,9 @@ public class ClientOnlySaveStructure extends AbstractSaveStructure
// create the matcher if one doesn't exist
if (this.subDimMatcher == null || !this.subDimMatcher.isFindingLevel(newClientLevelWrapper))
{
LOGGER.info("Loading level " + newClientLevelWrapper.getDimensionType().getDimensionName());
LOGGER.info("Loading level " + newClientLevelWrapper.getDimensionName());
List<File> levelFolders = this.getDhDataFoldersForDimension(newClientLevelWrapper.getDimensionType());
List<File> levelFolders = this.getDhDataFoldersForDimension(newClientLevelWrapper);
this.subDimMatcher = new SubDimensionLevelMatcher(newClientLevelWrapper, this.folder, levelFolders);
}
@@ -129,7 +129,7 @@ public class ClientOnlySaveStructure extends AbstractSaveStructure
private File getLevelFolderWithoutSimilarityMatching(ILevelWrapper level)
{
List<File> folders = this.getDhDataFoldersForDimension(level.getDimensionType());
List<File> folders = this.getDhDataFoldersForDimension(level);
if (!folders.isEmpty() && folders.get(0) != null)
{
// use the first existing sub-dimension
@@ -140,12 +140,12 @@ public class ClientOnlySaveStructure extends AbstractSaveStructure
else
{
// no valid sub dimension was found, create a new one
LOGGER.info("Default Sub Dimension not found. Creating: [" + level.getDimensionType().getDimensionName() + "]");
return new File(this.folder, level.getDimensionType().getDimensionName());
LOGGER.info("Default Sub Dimension not found. Creating: [" + level.getDimensionName() + "]");
return new File(this.folder, level.getDimensionName());
}
}
public List<File> getDhDataFoldersForDimension(IDimensionTypeWrapper dimensionType)
public List<File> getDhDataFoldersForDimension(ILevelWrapper level)
{
File[] folders = this.folder.listFiles();
if (folders == null)
@@ -154,7 +154,7 @@ public class ClientOnlySaveStructure extends AbstractSaveStructure
}
// filter by dimension name
String expectedDimName = dimensionType.getDimensionName();
String expectedDimName = level.getDimensionName();
ArrayList<File> possibleDimFolders = new ArrayList<>();
for (File dimFolder : folders)
{
@@ -297,4 +297,4 @@ public class ClientOnlySaveStructure extends AbstractSaveStructure
@Override
public String toString() { return "[" + this.getClass().getSimpleName() + "@" + this.folder.getName() + "]"; }
}
}
@@ -200,7 +200,7 @@ public class SubDimensionLevelMatcher implements AutoCloseable
//================================//
// log the start of this attempt
LOGGER.info("Attempting to determine sub-dimension for [" + MC_CLIENT.getWrappedClientLevel().getDimensionType().getDimensionName() + "]");
LOGGER.info("Attempting to determine sub-dimension for [" + MC_CLIENT.getWrappedClientLevel().getDimensionName() + "]");
LOGGER.info("Player block pos in dimension: [" + this.playerData.playerBlockPos.x + "," + this.playerData.playerBlockPos.y + "," + this.playerData.playerBlockPos.z + "]");
LOGGER.info("Potential Sub Dimension folders: [" + this.potentialLevelFolders.size() + "]");
@@ -379,7 +379,7 @@ public class SubDimensionLevelMatcher implements AutoCloseable
}
private File CreateSubDimFolder(String subDimId) { return new File(this.levelsFolder.getPath() + File.separatorChar + this.currentClientLevel.getDimensionType().getDimensionName(), subDimId); }
private File CreateSubDimFolder(String subDimId) { return new File(this.levelsFolder.getPath() + File.separatorChar + this.currentClientLevel.getDimensionName(), subDimId); }
@Override
public void close() { this.matcherThread.shutdownNow(); }
@@ -252,7 +252,7 @@ public class DhClientLevel extends AbstractDhLevel implements IDhClientLevel
@Override
public void addDebugMenuStringsToList(List<String> messageList)
{
String dimName = this.levelWrapper.getDimensionType().getDimensionName();
String dimName = this.levelWrapper.getDimensionName();
boolean rendering = this.clientside.isRendering();
messageList.add("["+dimName+"] rendering: "+(rendering ? "yes" : "no"));
@@ -165,13 +165,13 @@ public class DhClientServerLevel extends AbstractDhLevel implements IDhClientLev
@Override
public void clearRenderCache()
{
clientside.clearRenderCache();
this.clientside.clearRenderCache();
}
@Override
public IServerLevelWrapper getServerLevelWrapper() { return serverLevelWrapper; }
public IServerLevelWrapper getServerLevelWrapper() { return this.serverLevelWrapper; }
@Override
public ILevelWrapper getLevelWrapper() { return getServerLevelWrapper(); }
public ILevelWrapper getLevelWrapper() { return this.getServerLevelWrapper(); }
@Override
public FullDataSourceProviderV2 getFullDataProvider() { return this.serverside.fullDataFileHandler; }
@@ -179,7 +179,7 @@ public class DhClientServerLevel extends AbstractDhLevel implements IDhClientLev
@Override
public AbstractSaveStructure getSaveStructure()
{
return serverside.saveStructure;
return this.serverside.saveStructure;
}
@Override
@@ -201,7 +201,7 @@ public class DhClientServerLevel extends AbstractDhLevel implements IDhClientLev
public void addDebugMenuStringsToList(List<String> messageList)
{
// header
String dimName = this.serverLevelWrapper.getDimensionType().getDimensionName();
String dimName = this.serverLevelWrapper.getDimensionName();
boolean rendering = this.clientside.isRendering();
messageList.add("["+dimName+"] rendering: "+(rendering ? "yes" : "no"));
@@ -184,7 +184,7 @@ public class DhServerLevel extends AbstractDhLevel implements IDhServerLevel
LodUtil.assertTrue(msg instanceof ILevelRelatedMessage, MessageFormat.format("Received message does not implement {0}: {1}", ILevelRelatedMessage.class.getSimpleName(), msg.getClass().getSimpleName()));
// Handle only in requested dimension
if (!((ILevelRelatedMessage) msg).isSameLevelAs(this.getLevelWrapper()))
if (!((ILevelRelatedMessage) msg).isSameLevelAs(this.getServerLevelWrapper()))
{
return;
}
@@ -199,8 +199,8 @@ public class DhServerLevel extends AbstractDhLevel implements IDhServerLevel
((TrackableMessage) msg).sendResponse(new InvalidLevelException(MessageFormat.format(
"Generation not allowed. Requested dimension: {0}, player dimension: {1}, handler dimension: {2}",
((ILevelRelatedMessage) msg).getLevelName(),
msg.session.serverPlayer.getLevel().getDimensionType().getDimensionName(),
this.getLevelWrapper().getDimensionType().getDimensionName()
msg.session.serverPlayer.getLevel().getDimensionName(),
this.getLevelWrapper().getDimensionName()
)));
}
@@ -392,7 +392,7 @@ public class DhServerLevel extends AbstractDhLevel implements IDhServerLevel
@Override
public void addDebugMenuStringsToList(List<String> messageList)
{
String dimName = this.serverLevelWrapper.getDimensionType().getDimensionName();
String dimName = this.serverLevelWrapper.getDimensionName();
messageList.add("["+dimName+"]");
}
@@ -78,9 +78,9 @@ public class F3Screen
Parent Update #: 12 <br><br>
Client_Server World with 3 levels <br>
[overworld] rendering: Active <br>
[the_end] rendering: Inactive <br>
[the_nether] rendering: Inactive <br><br>
[minecraft:overworld] rendering: Active <br>
[minecraft:the_end] rendering: Inactive <br>
[minecraft:the_nether] rendering: Inactive <br><br>
VBO Render Count: 199/374 <br>
</code>
@@ -241,7 +241,7 @@ public abstract class AbstractFullDataRequestQueue implements IDebugRenderable,
return;
}
messageList.add(this.getQueueName() + " [" + this.level.getClientLevelWrapper().getDimensionType().getDimensionName() + "]");
messageList.add(this.getQueueName() + " [" + this.level.getClientLevelWrapper().getDimensionName() + "]");
messageList.add("Requests: " + this.finishedRequests + " / " + (this.getWaitingTaskCount() + this.finishedRequests.get()) + " (failed: " + this.failedRequests + ", rate limit: " + this.getRequestConcurrencyLimit() + ")");
}
@@ -1,5 +1,6 @@
package com.seibel.distanthorizons.core.multiplayer.server;
import com.seibel.distanthorizons.core.config.listeners.ConfigChangeListener;
import com.seibel.distanthorizons.core.level.DhServerLevel;
import com.seibel.distanthorizons.core.multiplayer.config.MultiplayerConfig;
import com.seibel.distanthorizons.core.multiplayer.config.MultiplayerConfigChangeListener;
@@ -25,8 +26,10 @@ public class ServerPlayerState
@NotNull
public ConstrainedMultiplayerConfig config = new ConstrainedMultiplayerConfig();
private final MultiplayerConfigChangeListener configChangeListener = new MultiplayerConfigChangeListener(this::onConfigChanged);
private String lastLevelKey = "";
private final ConfigChangeListener<String> levelKeyPrefixChangeListener = new ConfigChangeListener<>(ServerNetworking.levelKeyPrefix, this::sendLevelKey);
private final ConcurrentHashMap<DhServerLevel, RateLimiterSet> rateLimiterSets = new ConcurrentHashMap<>();
public RateLimiterSet getRateLimiterSet(DhServerLevel level)
{
@@ -46,29 +49,7 @@ public class ServerPlayerState
this.session.registerHandler(RemotePlayerConfigMessage.class, remotePlayerConfigMessage ->
{
this.config.clientConfig = (MultiplayerConfig) remotePlayerConfigMessage.payload;
if (ServerNetworking.sendLevelKeys.get())
{
String levelKeyPrefix = ServerNetworking.levelKeyPrefix.get();
String dimensionName = serverPlayer.getLevel().getDimensionType().getDimensionName();
String levelKey;
if (!levelKeyPrefix.isEmpty())
{
levelKey = levelKeyPrefix + "_" + dimensionName;
}
else
{
levelKey = dimensionName;
}
if (!levelKey.equals(this.lastLevelKey))
{
this.lastLevelKey = levelKey;
this.session.sendMessage(new CurrentLevelKeyMessage(levelKey));
}
}
this.sendLevelKey(null);
this.session.sendMessage(new RemotePlayerConfigMessage(this.config));
});
@@ -78,7 +59,18 @@ public class ServerPlayerState
}
private void sendLevelKey(String ignored)
{
if (ServerNetworking.sendLevelKeys.get())
{
String levelKey = this.serverPlayer().getLevel().getKeyedLevelDimensionName();
if (!levelKey.equals(this.lastLevelKey))
{
this.lastLevelKey = levelKey;
this.session.sendMessage(new CurrentLevelKeyMessage(levelKey));
}
}
}
private void onConfigChanged()
{
@@ -87,6 +79,7 @@ public class ServerPlayerState
public void close()
{
this.levelKeyPrefixChangeListener.close();
this.configChangeListener.close();
this.session.close();
}
@@ -1,6 +1,6 @@
package com.seibel.distanthorizons.core.network.messages;
import com.seibel.distanthorizons.core.wrapperInterfaces.world.ILevelWrapper;
import com.seibel.distanthorizons.core.wrapperInterfaces.world.IServerLevelWrapper;
public interface ILevelRelatedMessage
{
@@ -10,9 +10,9 @@ public interface ILevelRelatedMessage
* Checks whether the message's level matches the given level.
*/
@SuppressWarnings("BooleanMethodIsAlwaysInverted")
default boolean isSameLevelAs(ILevelWrapper levelWrapper)
default boolean isSameLevelAs(IServerLevelWrapper levelWrapper)
{
return this.getLevelName().equals(levelWrapper.getDimensionType().getDimensionName());
return this.getLevelName().equals(levelWrapper.getKeyedLevelDimensionName());
}
}
@@ -44,7 +44,7 @@ public class FullDataPartialUpdateMessage extends NetworkMessage implements ILev
public FullDataPartialUpdateMessage() { }
public FullDataPartialUpdateMessage(ILevelWrapper level, FullDataSourceV2 fullDataSource)
{
this.levelName = level.getDimensionType().getDimensionName();
this.levelName = level.getDimensionName();
try
{
@@ -43,7 +43,7 @@ public class FullDataSourceRequestMessage extends TrackableMessage implements IL
public FullDataSourceRequestMessage() {}
public FullDataSourceRequestMessage(ILevelWrapper levelWrapper, long sectionPos, @Nullable Long clientTimestamp)
{
this.levelName = levelWrapper.getDimensionType().getDimensionName();
this.levelName = levelWrapper.getDimensionName();
this.sectionPos = sectionPos;
this.clientTimestamp = clientTimestamp;
}
@@ -150,7 +150,7 @@ public class LodQuadTree extends QuadTree<LodRenderSection> implements IDebugRen
}
catch (Exception e)
{
LOGGER.error("Quad Tree tick exception for dimension: " + this.level.getClientLevelWrapper().getDimensionType().getDimensionName() + ", exception: " + e.getMessage(), e);
LOGGER.error("Quad Tree tick exception for dimension: " + this.level.getClientLevelWrapper().getDimensionName() + ", exception: " + e.getMessage(), e);
}
finally
{
@@ -690,4 +690,4 @@ public class LodQuadTree extends QuadTree<LodRenderSection> implements IDebugRen
LOGGER.info("Finished shutting down " + LodQuadTree.class.getSimpleName());
}
}
}
@@ -130,7 +130,7 @@ public class DhApiWorldProxy implements IDhApiWorldProxy
for (IDhLevel dhLevel : world.getAllLoadedLevels())
{
ILevelWrapper levelWrapper = dhLevel.getLevelWrapper();
String levelDimName = levelWrapper.getDimensionType().getDimensionName().toLowerCase();
String levelDimName = levelWrapper.getDimensionName().toLowerCase();
if (levelDimName.contains(soughtDimName))
{
returnList.add(levelWrapper);
@@ -140,4 +140,4 @@ public class DhApiWorldProxy implements IDhApiWorldProxy
return returnList;
}
}
}
@@ -87,7 +87,7 @@ public class DhClientServerWorld extends AbstractDhWorld implements IDhClientWor
LodUtil.assertTrue(serverLevelWrapper != null);
if (!clientLevelWrapper.getDimensionType().equals(serverLevelWrapper.getDimensionType()))
{
LodUtil.assertNotReach("tryGetServerSideWrapper returned a level for a different dimension. ClientLevelWrapper dim: " + clientLevelWrapper.getDimensionType().getDimensionName() + " ServerLevelWrapper dim: " + serverLevelWrapper.getDimensionType().getDimensionName());
LodUtil.assertNotReach("tryGetServerSideWrapper returned a level for a different dimension. ClientLevelWrapper dim: " + clientLevelWrapper.getDimensionName() + " ServerLevelWrapper dim: " + serverLevelWrapper.getDimensionName());
}
@@ -167,7 +167,7 @@ public class DhClientServerWorld extends AbstractDhWorld implements IDhClientWor
// close each level
for (DhClientServerLevel level : levelsToClose)
{
LOGGER.info("Unloading level " + level.getServerLevelWrapper().getDimensionType().getDimensionName());
LOGGER.info("Unloading level " + level.getServerLevelWrapper().getDimensionName());
// level wrapper shouldn't be null, but just in case
IServerLevelWrapper serverLevelWrapper = level.getServerLevelWrapper();
@@ -184,4 +184,4 @@ public class DhClientServerWorld extends AbstractDhWorld implements IDhClientWor
LOGGER.info("Closed DhWorld of type " + this.environment);
}
}
}
@@ -145,7 +145,7 @@ public class DhClientWorld extends AbstractDhWorld implements IDhClientWorld
for (DhClientLevel dhClientLevel : this.levels.values())
{
LOGGER.info("Unloading level " + dhClientLevel.getLevelWrapper().getDimensionType().getDimensionName());
LOGGER.info("Unloading level " + dhClientLevel.getLevelWrapper().getDimensionName());
// level wrapper shouldn't be null, but just in case
IClientLevelWrapper clientLevelWrapper = dhClientLevel.getClientLevelWrapper();
@@ -159,7 +159,7 @@ public class DhServerWorld extends AbstractDhWorld implements IDhServerWorld
{
for (DhServerLevel level : this.levels.values())
{
LOGGER.info("Unloading level " + level.getLevelWrapper().getDimensionType().getDimensionName());
LOGGER.info("Unloading level " + level.getLevelWrapper().getDimensionName());
// level wrapper shouldn't be null, but just in case
IServerLevelWrapper serverLevelWrapper = level.getServerLevelWrapper();
@@ -24,18 +24,14 @@ import com.seibel.distanthorizons.coreapi.interfaces.dependencyInjection.IBindab
public interface IDimensionTypeWrapper extends IDhApiDimensionTypeWrapper, IBindable
{
@Override
String getDimensionName();
@Override
boolean hasCeiling();
@Override
boolean hasSkyLight();
// there's definitely a better way of doing this, but it should work well enough for now
default boolean isTheEnd() { return this.getDimensionName().equalsIgnoreCase("the_end"); }
boolean isTheEnd();
double getTeleportationScale(IDimensionTypeWrapper to);
}
}
@@ -37,6 +37,9 @@ public interface ILevelWrapper extends IDhApiLevelWrapper, IBindable
@Override
IDimensionTypeWrapper getDimensionType();
@Override
String getDimensionName();
@Override
boolean hasCeiling();
@@ -22,11 +22,30 @@ package com.seibel.distanthorizons.core.wrapperInterfaces.world;
import org.jetbrains.annotations.Nullable;
import java.io.File;
import static com.seibel.distanthorizons.core.config.Config.Client.Advanced.Multiplayer.ServerNetworking;
public interface IServerLevelWrapper extends ILevelWrapper
{
@Nullable
IClientLevelWrapper tryGetClientLevelWrapper();
File getSaveFolder();
default String getKeyedLevelDimensionName()
{
String dimensionName = this.getDimensionName();
if (ServerNetworking.sendLevelKeys.get())
{
String levelKeyPrefix = ServerNetworking.levelKeyPrefix.get();
if (!levelKeyPrefix.isEmpty())
{
return levelKeyPrefix + "@" + dimensionName;
}
}
return dimensionName;
}
}
}