From f4ab1014033b411774f99fcbdf850b03f776b50e Mon Sep 17 00:00:00 2001 From: James Seibel Date: Fri, 17 Oct 2025 07:21:16 -0500 Subject: [PATCH] Dh and level wrapper refactoring and commenting --- .../core/api/internal/SharedApi.java | 3 +- .../fullData/sources/FullDataSourceV1.java | 6 +-- .../render/bufferBuilding/ColumnBox.java | 2 +- .../bufferBuilding/ColumnRenderBuffer.java | 17 ++++--- .../ColumnRenderBufferBuilder.java | 2 +- .../core/generation/WorldGenerationQueue.java | 13 ++++-- .../core/level/AbstractDhLevel.java | 13 ++---- .../core/level/AbstractDhServerLevel.java | 10 +--- .../core/level/DhClientLevel.java | 11 ++--- .../core/level/DhClientServerLevel.java | 2 +- .../core/level/IDhClientLevel.java | 4 ++ .../distanthorizons/core/level/IDhLevel.java | 26 +++++++++-- .../messages/base/LevelInitMessage.java | 4 +- .../core/render/renderer/LodRenderer.java | 2 +- .../world/IClientLevelWrapper.java | 9 ---- .../world/ILevelWrapper.java | 46 +++++++++++++------ .../world/IServerLevelWrapper.java | 2 +- 17 files changed, 92 insertions(+), 80 deletions(-) diff --git a/core/src/main/java/com/seibel/distanthorizons/core/api/internal/SharedApi.java b/core/src/main/java/com/seibel/distanthorizons/core/api/internal/SharedApi.java index b62d0a617..a7c3943dc 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/api/internal/SharedApi.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/api/internal/SharedApi.java @@ -491,6 +491,7 @@ public class SharedApi IChunkWrapper chunkWrapper = updateData.chunkWrapper; IDhLevel dhLevel = updateData.dhLevel; + ILevelWrapper levelWrapper = dhLevel.getLevelWrapper(); // having a list of the nearby chunks is needed for lighting and beacon generation @Nullable ArrayList nearbyChunkList = updateData.neighborChunkList; @@ -504,7 +505,7 @@ public class SharedApi try { // sky lighting is populated later at the data source level - DhLightingEngine.INSTANCE.bakeChunkBlockLighting(chunkWrapper, nearbyChunkList, dhLevel.hasSkyLight() ? LodUtil.MAX_MC_LIGHT : LodUtil.MIN_MC_LIGHT); + DhLightingEngine.INSTANCE.bakeChunkBlockLighting(chunkWrapper, nearbyChunkList, levelWrapper.hasSkyLight() ? LodUtil.MAX_MC_LIGHT : LodUtil.MIN_MC_LIGHT); dhLevel.updateBeaconBeamsForChunk(chunkWrapper, nearbyChunkList); diff --git a/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/fullData/sources/FullDataSourceV1.java b/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/fullData/sources/FullDataSourceV1.java index a3dc3c868..3d2955dee 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/fullData/sources/FullDataSourceV1.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/fullData/sources/FullDataSourceV1.java @@ -198,7 +198,7 @@ public class FullDataSourceV1 implements IDataSource { outputStream.writeInt(this.getDataDetailLevel()); outputStream.writeInt(WIDTH); - outputStream.writeInt(level.getMinY()); + outputStream.writeInt(level.getLevelWrapper().getMinHeight()); outputStream.writeByte(this.worldGenStep.value); } @@ -217,9 +217,9 @@ public class FullDataSourceV1 implements IDataSource } int minY = inputStream.readInt(); - if (minY != level.getMinY()) + if (minY != level.getLevelWrapper().getMinHeight()) { - LOGGER.warn("Data minY mismatch: [" + minY + "] != [" + level.getMinY() + "]. Will ignore data's y level"); + LOGGER.warn("Data minY mismatch: [" + minY + "] != [" + level.getLevelWrapper().getMinHeight() + "]. Will ignore data's y level"); } byte worldGenByte = inputStream.readByte(); diff --git a/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/render/bufferBuilding/ColumnBox.java b/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/render/bufferBuilding/ColumnBox.java index e68706c1c..ec8b4fe29 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/render/bufferBuilding/ColumnBox.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/render/bufferBuilding/ColumnBox.java @@ -89,7 +89,7 @@ public class ColumnBox int caveCullingMaxY = Integer.MIN_VALUE; if (Config.Client.Advanced.Graphics.Culling.enableCaveCulling.get()) { - caveCullingMaxY = Config.Client.Advanced.Graphics.Culling.caveCullingHeight.get() - clientLevel.getMinY(); + caveCullingMaxY = Config.Client.Advanced.Graphics.Culling.caveCullingHeight.get() - clientLevel.getLevelWrapper().getMinHeight(); } diff --git a/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/render/bufferBuilding/ColumnRenderBuffer.java b/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/render/bufferBuilding/ColumnRenderBuffer.java index 1e2fec6b4..8bc21b436 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/render/bufferBuilding/ColumnRenderBuffer.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/render/bufferBuilding/ColumnRenderBuffer.java @@ -29,7 +29,6 @@ import com.seibel.distanthorizons.core.render.renderer.LodRenderer; import com.seibel.distanthorizons.core.util.LodUtil; import com.seibel.distanthorizons.core.util.objects.StatsMap; import com.seibel.distanthorizons.api.enums.config.EDhApiGpuUploadMethod; -import com.seibel.distanthorizons.core.logging.DhLogger; import org.lwjgl.system.MemoryUtil; import java.nio.ByteBuffer; @@ -53,8 +52,8 @@ public class ColumnRenderBuffer implements AutoCloseable public static final int FULL_SIZED_BUFFER = MAX_QUADS_PER_BUFFER * QUADS_BYTE_SIZE; - - public final DhBlockPos blockPos; + /** the position closest to minimum X/Z infinity and the level's lowest Y */ + public final DhBlockPos minCornerBlockPos; public boolean buffersUploaded = false; @@ -69,9 +68,9 @@ public class ColumnRenderBuffer implements AutoCloseable // constructors // //==============// - public ColumnRenderBuffer(DhBlockPos blockPos) + public ColumnRenderBuffer(DhBlockPos minCornerBlockPos) { - this.blockPos = blockPos; + this.minCornerBlockPos = minCornerBlockPos; this.vbos = new GLVertexBuffer[0]; this.vbosTransparent = new GLVertexBuffer[0]; } @@ -134,7 +133,7 @@ public class ColumnRenderBuffer implements AutoCloseable } catch (Exception e) { - LOGGER.error("Unexpected issue uploading buffer ["+this.blockPos +"], error: ["+e.getMessage()+"].", e); + LOGGER.error("Unexpected issue uploading buffer ["+this.minCornerBlockPos +"], error: ["+e.getMessage()+"].", e); this.uploadFuture.completeExceptionally(e); this.uploadFuture = null; @@ -231,7 +230,7 @@ public class ColumnRenderBuffer implements AutoCloseable public boolean renderOpaque(LodRenderer renderContext, DhApiRenderParam renderEventParam) { boolean hasRendered = false; - renderContext.setModelViewMatrixOffset(this.blockPos, renderEventParam); + renderContext.setModelViewMatrixOffset(this.minCornerBlockPos, renderEventParam); for (GLVertexBuffer vbo : this.vbos) { if (vbo == null) @@ -258,7 +257,7 @@ public class ColumnRenderBuffer implements AutoCloseable try { // can throw an IllegalStateException if the GL program was freed before it should've been - renderContext.setModelViewMatrixOffset(this.blockPos, renderEventParam); + renderContext.setModelViewMatrixOffset(this.minCornerBlockPos, renderEventParam); for (GLVertexBuffer vbo : this.vbosTransparent) { @@ -278,7 +277,7 @@ public class ColumnRenderBuffer implements AutoCloseable } catch (IllegalStateException e) { - LOGGER.error("renderContext program doesn't exist for pos: "+this.blockPos, e); + LOGGER.error("renderContext program doesn't exist for pos: "+this.minCornerBlockPos, e); } return hasRendered; diff --git a/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/render/bufferBuilding/ColumnRenderBufferBuilder.java b/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/render/bufferBuilding/ColumnRenderBufferBuilder.java index 6638eaf40..5439d2946 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/render/bufferBuilding/ColumnRenderBufferBuilder.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/render/bufferBuilding/ColumnRenderBufferBuilder.java @@ -61,7 +61,7 @@ public class ColumnRenderBufferBuilder LodQuadBuilder quadBuilder ) { - ColumnRenderBuffer buffer = new ColumnRenderBuffer(new DhBlockPos(DhSectionPos.getMinCornerBlockX(pos), clientLevel.getMinY(), DhSectionPos.getMinCornerBlockZ(pos))); + ColumnRenderBuffer buffer = new ColumnRenderBuffer(new DhBlockPos(DhSectionPos.getMinCornerBlockX(pos), clientLevel.getLevelWrapper().getMinHeight(), DhSectionPos.getMinCornerBlockZ(pos))); CompletableFuture uploadFuture = buffer.makeAndUploadBuffersAsync(quadBuilder, GLProxy.getInstance().getGpuUploadMethod()); uploadFuture.whenComplete((uploadedBuffer, exception) -> { diff --git a/core/src/main/java/com/seibel/distanthorizons/core/generation/WorldGenerationQueue.java b/core/src/main/java/com/seibel/distanthorizons/core/generation/WorldGenerationQueue.java index ea052d226..bc502a521 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/generation/WorldGenerationQueue.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/generation/WorldGenerationQueue.java @@ -416,7 +416,7 @@ public class WorldGenerationQueue implements IFullDataSourceRetrievalQueue, IDeb // but this should work for now ArrayList nearbyChunkList = new ArrayList(); nearbyChunkList.add(chunkWrapper); - DhLightingEngine.INSTANCE.bakeChunkBlockLighting(chunkWrapper, nearbyChunkList, this.level.hasSkyLight() ? LodUtil.MAX_MC_LIGHT : LodUtil.MIN_MC_LIGHT); + DhLightingEngine.INSTANCE.bakeChunkBlockLighting(chunkWrapper, nearbyChunkList, this.level.getLevelWrapper().hasSkyLight() ? LodUtil.MAX_MC_LIGHT : LodUtil.MIN_MC_LIGHT); try (FullDataSourceV2 dataSource = LodDataBuilder.createFromChunk(this.level.getLevelWrapper(), chunkWrapper)) { @@ -663,24 +663,27 @@ public class WorldGenerationQueue implements IFullDataSourceRetrievalQueue, IDeb @Override public void debugRender(DebugRenderer renderer) { + int levelMinY = this.level.getLevelWrapper().getMinHeight(); + int levelMaxY = this.level.getLevelWrapper().getMaxHeight(); + // show the wireframe a bit lower than world max height, // since most worlds don't render all the way up to the max height - int levelHeightRange = (this.level.getMaxY() - this.level.getMinY()); - int maxY = this.level.getMaxY() - (levelHeightRange / 2); + int levelHeightRange = (levelMaxY - levelMinY); + int maxY = levelMaxY - (levelHeightRange / 2); // blue - queued this.waitingTasks.keySet().forEach((pos) -> { renderer.renderBox( - new DebugRenderer.Box(pos, this.level.getMinY(), maxY, 0.05f, Color.blue)); + new DebugRenderer.Box(pos, levelMinY, maxY, 0.05f, Color.blue)); }); // red - in progress this.inProgressGenTasksByLodPos.forEach((pos, t) -> { renderer.renderBox( - new DebugRenderer.Box(pos, this.level.getMinY(), maxY, 0.05f, Color.red)); + new DebugRenderer.Box(pos, levelMinY, maxY, 0.05f, Color.red)); }); } diff --git a/core/src/main/java/com/seibel/distanthorizons/core/level/AbstractDhLevel.java b/core/src/main/java/com/seibel/distanthorizons/core/level/AbstractDhLevel.java index f4fa1dd31..482259b00 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/level/AbstractDhLevel.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/level/AbstractDhLevel.java @@ -86,8 +86,6 @@ public abstract class AbstractDhLevel implements IDhLevel @Nullable protected CloudRenderHandler cloudRenderHandler; - private IDhApiRenderableBoxGroup unexploredFogRenderableBoxGroup; - //=============// @@ -187,7 +185,7 @@ public abstract class AbstractDhLevel implements IDhLevel // block lights should have been populated at the chunkWrapper stage // waiting to populate the data source's skylight at this stage prevents re-lighting and // allows us to reduce cross-chunk lighting issues by lighting the whole 4x4 LOD at once - DhLightingEngine.INSTANCE.bakeDataSourceSkyLight(fullDataSource, this.hasSkyLight() ? LodUtil.MAX_MC_LIGHT : LodUtil.MIN_MC_LIGHT); + DhLightingEngine.INSTANCE.bakeDataSourceSkyLight(fullDataSource, this.getLevelWrapper().hasSkyLight() ? LodUtil.MAX_MC_LIGHT : LodUtil.MIN_MC_LIGHT); return this.updateDataSourcesAsync(fullDataSource) @@ -393,15 +391,10 @@ public abstract class AbstractDhLevel implements IDhLevel } - GenericObjectRenderer genericRenderer = this.getGenericRenderer(); - if (genericRenderer != null - && this.unexploredFogRenderableBoxGroup != null) - { - genericRenderer.remove(this.unexploredFogRenderableBoxGroup.getId()); - } - this.delayedFullDataSourceSaveCache.close(); } + + } diff --git a/core/src/main/java/com/seibel/distanthorizons/core/level/AbstractDhServerLevel.java b/core/src/main/java/com/seibel/distanthorizons/core/level/AbstractDhServerLevel.java index 7bef82b34..511bcf230 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/level/AbstractDhServerLevel.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/level/AbstractDhServerLevel.java @@ -27,6 +27,7 @@ import com.seibel.distanthorizons.core.wrapperInterfaces.misc.IServerPlayerWrapp import com.seibel.distanthorizons.core.wrapperInterfaces.world.ILevelWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.world.IServerLevelWrapper; import com.seibel.distanthorizons.core.logging.DhLogger; +import org.jetbrains.annotations.NotNull; import javax.annotation.Nullable; import java.util.List; @@ -326,15 +327,11 @@ public abstract class AbstractDhServerLevel extends AbstractDhLevel implements I // getters // //=========// - @Override - public int getMinY() { return this.getLevelWrapper().getMinHeight(); } - @Override - public int getMaxY() { return this.getLevelWrapper().getMaxHeight(); } - @Override public IServerLevelWrapper getServerLevelWrapper() { return this.serverLevelWrapper; } @Override + @NotNull public ILevelWrapper getLevelWrapper() { return this.getServerLevelWrapper(); } @Override @@ -343,9 +340,6 @@ public abstract class AbstractDhServerLevel extends AbstractDhLevel implements I @Override public ISaveStructure getSaveStructure() { return this.serverside.saveStructure; } - @Override - public boolean hasSkyLight() { return this.serverLevelWrapper.hasSkyLight(); } - //==========// diff --git a/core/src/main/java/com/seibel/distanthorizons/core/level/DhClientLevel.java b/core/src/main/java/com/seibel/distanthorizons/core/level/DhClientLevel.java index a3394d36b..313d1b5a1 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/level/DhClientLevel.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/level/DhClientLevel.java @@ -45,6 +45,7 @@ import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftCli import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IProfilerWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.world.IClientLevelWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.world.ILevelWrapper; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.annotation.CheckForNull; @@ -76,6 +77,7 @@ public class DhClientLevel extends AbstractDhLevel implements IDhClientLevel @Nullable private final ScopedNetworkEventSource networkEventSource; + /** used when connected to a DH supported server so we don't process the same chunks multiple times */ private final Set loadedOnceChunks = Collections.newSetFromMap( CacheBuilder.newBuilder() .expireAfterWrite(10, TimeUnit.MINUTES) @@ -297,25 +299,18 @@ public class DhClientLevel extends AbstractDhLevel implements IDhClientLevel public void clearRenderCache() { this.clientside.clearRenderCache(); } @Override + @NotNull public ILevelWrapper getLevelWrapper() { return this.levelWrapper; } @Override public CompletableFuture updateDataSourcesAsync(FullDataSourceV2 data) { return this.clientside.updateDataSourcesAsync(data); } - @Override - public int getMinY() { return this.levelWrapper.getMinHeight(); } - @Override - public int getMaxY() { return this.levelWrapper.getMaxHeight(); } - @Override public FullDataSourceProviderV2 getFullDataProvider() { return this.dataFileHandler; } @Override public ISaveStructure getSaveStructure() { return this.saveStructure; } - @Override - public boolean hasSkyLight() { return this.levelWrapper.hasSkyLight(); } - @Override public GenericObjectRenderer getGenericRenderer() { return this.clientside.genericRenderer; } @Override diff --git a/core/src/main/java/com/seibel/distanthorizons/core/level/DhClientServerLevel.java b/core/src/main/java/com/seibel/distanthorizons/core/level/DhClientServerLevel.java index 4fd8b0a35..44d72a81a 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/level/DhClientServerLevel.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/level/DhClientServerLevel.java @@ -41,7 +41,7 @@ import java.awt.*; import java.util.List; import java.util.concurrent.CompletableFuture; -/** The level used on a singleplayer world */ +/** The level used for a singleplayer world */ public class DhClientServerLevel extends AbstractDhServerLevel implements IDhClientLevel { private static final IMinecraftClientWrapper MC_CLIENT = SingletonInjector.INSTANCE.get(IMinecraftClientWrapper.class); diff --git a/core/src/main/java/com/seibel/distanthorizons/core/level/IDhClientLevel.java b/core/src/main/java/com/seibel/distanthorizons/core/level/IDhClientLevel.java index 5f486cf06..44aee3554 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/level/IDhClientLevel.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/level/IDhClientLevel.java @@ -27,6 +27,10 @@ import com.seibel.distanthorizons.core.wrapperInterfaces.world.IBiomeWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.world.IClientLevelWrapper; import org.jetbrains.annotations.Nullable; +/** + * Used when running in singleplayer + * or when connected to a server. + */ public interface IDhClientLevel extends IDhLevel { void clientTick(); diff --git a/core/src/main/java/com/seibel/distanthorizons/core/level/IDhLevel.java b/core/src/main/java/com/seibel/distanthorizons/core/level/IDhLevel.java index 16346b09a..7a33f067a 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/level/IDhLevel.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/level/IDhLevel.java @@ -21,6 +21,8 @@ package com.seibel.distanthorizons.core.level; import com.seibel.distanthorizons.api.interfaces.render.IDhApiRenderableBoxGroup; import com.seibel.distanthorizons.api.objects.render.DhApiRenderableBox; +import com.seibel.distanthorizons.core.api.internal.ClientApi; +import com.seibel.distanthorizons.core.api.internal.ServerApi; import com.seibel.distanthorizons.core.dataObjects.fullData.sources.FullDataSourceV2; import com.seibel.distanthorizons.core.file.fullDatafile.FullDataSourceProviderV2; import com.seibel.distanthorizons.core.file.fullDatafile.GeneratedFullDataSourceProvider; @@ -33,23 +35,39 @@ import com.seibel.distanthorizons.core.sql.repo.BeaconBeamRepo; import com.seibel.distanthorizons.core.wrapperInterfaces.chunk.IChunkWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.world.IClientLevelWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.world.ILevelWrapper; +import com.seibel.distanthorizons.core.wrapperInterfaces.world.IServerLevelWrapper; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.List; import java.util.concurrent.CompletableFuture; +/** + * A DH Level handles all DH-centric logic related to a given MC level. + * A Level in this context is defined as a Minecraft dimension the player can play in + * (IE the overworld, nether, end, etc.).

+ * + * This is different from a {@link ILevelWrapper} + * in the following ways:
+ * - a DH level is created after a MC level is wrapped and passed into the {@link ClientApi} or {@link ServerApi} respectively
+ * - a DH level doesn't handle any MC level logic (IE getting the min/max world height)
+ * - a DH level keeps track of DH's database file paths and rendering
+ * + * @see ILevelWrapper + * @see IDhClientLevel + * @see IDhServerLevel + */ public interface IDhLevel extends AutoCloseable, GeneratedFullDataSourceProvider.IOnWorldGenCompleteListener { + @Deprecated void worldGenTick(); - int getMinY(); - int getMaxY(); - /** * May return either a client or server level wrapper.
* Should not return null */ + @NotNull ILevelWrapper getLevelWrapper(); /** @return 0 if no hash is known */ @@ -72,8 +90,6 @@ public interface IDhLevel extends AutoCloseable, GeneratedFullDataSourceProvider ISaveStructure getSaveStructure(); - boolean hasSkyLight(); - CompletableFuture updateDataSourcesAsync(FullDataSourceV2 data); void addDebugMenuStringsToList(List messageList); 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 fa3c108fe..a5fc61f27 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 @@ -8,12 +8,12 @@ public class LevelInitMessage extends AbstractNetworkMessage { public static final int MAX_LENGTH = 150; - public static final String PART_ALLOWED_CHARS_REGEX = "a-zA-Z0-9-_"; + public static final String ALLOWED_CHARS_REGEX = "a-zA-Z0-9-_"; // prefix@namespace:path // 1-150 characters in total, all parts except namespace can be omitted public static final String VALIDATION_REGEX = String.format("^(?=.{1,%s}$)([%s]+@)?[%s]+(:[%s]+)?$", - MAX_LENGTH, PART_ALLOWED_CHARS_REGEX, PART_ALLOWED_CHARS_REGEX, PART_ALLOWED_CHARS_REGEX); + MAX_LENGTH, ALLOWED_CHARS_REGEX, ALLOWED_CHARS_REGEX, ALLOWED_CHARS_REGEX); public String levelKey; diff --git a/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/LodRenderer.java b/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/LodRenderer.java index be97bddf2..4f20f1a3d 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/LodRenderer.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/render/renderer/LodRenderer.java @@ -474,7 +474,7 @@ public class LodRenderer { if (RATE_LIMITED_LOGGER.canLog()) // can log check to prevent creating a bunch of strings unnecessarily { - RATE_LIMITED_LOGGER.warn("Attempted to draw invalid buffer: [" + vbo.getId() + "], expected size: ["+vbo.getSize()+"], upload complete: [" + parentBufferContainer.buffersUploaded + "], upload in progress: [" + parentBufferContainer.uploadInProgress() + "], buffer blockPos: ["+parentBufferContainer.blockPos+"]."); + RATE_LIMITED_LOGGER.warn("Attempted to draw invalid buffer: [" + vbo.getId() + "], expected size: ["+vbo.getSize()+"], upload complete: [" + parentBufferContainer.buffersUploaded + "], upload in progress: [" + parentBufferContainer.uploadInProgress() + "], buffer blockPos: ["+parentBufferContainer.minCornerBlockPos +"]."); } return; } diff --git a/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/world/IClientLevelWrapper.java b/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/world/IClientLevelWrapper.java index d58a8f0c4..e0bc88e0b 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/world/IClientLevelWrapper.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/world/IClientLevelWrapper.java @@ -26,9 +26,6 @@ import org.jetbrains.annotations.Nullable; import java.awt.*; -/** - * @version 2022-9-16 - */ public interface IClientLevelWrapper extends ILevelWrapper { @@ -38,14 +35,8 @@ public interface IClientLevelWrapper extends ILevelWrapper int getBlockColor(DhBlockPos pos, IBiomeWrapper biome, FullDataSourceV2 fullDataSource, IBlockStateWrapper blockState); /** @return -1 if there was a problem getting the color */ int getDirtBlockColor(); - /** @return -1 if there was a problem getting the color */ - int getWaterBlockColor(); void clearBlockColorCache(); - /** Will return null if there was an issue finding the biome. */ - @Nullable - IBiomeWrapper getPlainsBiomeWrapper(); - Color getCloudColor(float tickDelta); } diff --git a/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/world/ILevelWrapper.java b/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/world/ILevelWrapper.java index dab41a292..2374f83b6 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/world/ILevelWrapper.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/world/ILevelWrapper.java @@ -21,15 +21,37 @@ package com.seibel.distanthorizons.core.wrapperInterfaces.world; import com.google.common.io.BaseEncoding; import com.google.common.primitives.Longs; +import com.seibel.distanthorizons.api.DhApi; import com.seibel.distanthorizons.api.interfaces.world.IDhApiLevelWrapper; +import com.seibel.distanthorizons.core.api.internal.ClientApi; +import com.seibel.distanthorizons.core.api.internal.ServerApi; +import com.seibel.distanthorizons.core.level.IDhClientLevel; import com.seibel.distanthorizons.core.level.IDhLevel; +import com.seibel.distanthorizons.core.level.IDhServerLevel; import com.seibel.distanthorizons.core.pos.blockPos.DhBlockPos; import com.seibel.distanthorizons.core.pos.DhChunkPos; import com.seibel.distanthorizons.core.wrapperInterfaces.block.IBlockStateWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.chunk.IChunkWrapper; import com.seibel.distanthorizons.coreapi.interfaces.dependencyInjection.IBindable; -/** Can be either a Server world or a Client world. */ +/** + * A Level wrapper handles all MC related logic related to a given MC level. + * A Level in this context is defined as a Minecraft dimension the player can play in + * (IE the overworld, nether, end, etc.).

+ * + * This is different from a {@link IDhLevel} + * in the following ways:
+ * - A level wrapper holds a specific MC level object and will exist before a corresponding {@link IDhLevel} is created
+ * - A level wrapper handles all MC logic (IE getting min/max world height)
+ * - A level wrapper is accessible via the {@link DhApi}
+ * - A level wrapper can access some DH logic when the API needs it + * (in general DH logic should be handled via a {@link IDhLevel} but due to how the API is currently configured + * it's easier to handle that logic here).
+ * + * @see IDhLevel + * @see IClientLevelWrapper + * @see IServerLevelWrapper + */ public interface ILevelWrapper extends IDhApiLevelWrapper, IBindable { @Override @@ -49,9 +71,7 @@ public interface ILevelWrapper extends IDhApiLevelWrapper, IBindable return encoded.substring(0, 13).toLowerCase(); // Remaining 3 chars are padding } - /** - * A string intended to uniquely identify this level. - */ + /** A string that uniquely identifies this level. */ @Override String getDhIdentifier(); @@ -64,23 +84,19 @@ public interface ILevelWrapper extends IDhApiLevelWrapper, IBindable @Override int getMaxHeight(); @Override - default int getMinHeight() { return 0; } + int getMinHeight(); default IChunkWrapper tryGetChunk(DhChunkPos pos) { return null; } - boolean hasChunkLoaded(int chunkX, int chunkZ); - - @Deprecated - IBlockStateWrapper getBlockState(DhBlockPos pos); - - @Deprecated - IBiomeWrapper getBiome(DhBlockPos pos); - /** Fired when the level is being unloaded. Doesn't unload the level. */ void onUnload(); - // TODO James doesn't like this circular reference, can we merge the level wrapper and DhLevels? - @Deprecated + /** + * Used so we can access DH related methods/objects + * from the {@link DhApi}. + */ void setParentLevel(IDhLevel parentLevel); + + } diff --git a/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/world/IServerLevelWrapper.java b/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/world/IServerLevelWrapper.java index 54653bf31..ed98dcd26 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/world/IServerLevelWrapper.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/world/IServerLevelWrapper.java @@ -43,7 +43,7 @@ public interface IServerLevelWrapper extends ILevelWrapper if (SharedApi.getEnvironment() == EWorldEnvironment.CLIENT_SERVER) { String cleanWorldFolderName = this.getWorldFolderName() - .replaceAll("[^" + LevelInitMessage.PART_ALLOWED_CHARS_REGEX + " ]", "") + .replaceAll("[^" + LevelInitMessage.ALLOWED_CHARS_REGEX + " ]", "") .replaceAll(" ", "_"); levelKeyPrefix += (!levelKeyPrefix.isEmpty() ? "_" : "") + cleanWorldFolderName