From 823da76896f7fc9d8cd24ef009ab3ca37e936b18 Mon Sep 17 00:00:00 2001 From: TomTheFurry Date: Sat, 30 Jul 2022 00:11:25 +0800 Subject: [PATCH] Fix forge wrong proxies, fix generator shutdown, fix batch gen incorrect timeout, --- .../lod/core/a7/datatype/LodRenderSource.java | 2 + .../a7/datatype/PlaceHolderRenderSource.java | 1 + .../datatype/column/ColumnRenderSource.java | 11 +++- .../column/render/ColumnRenderBuffer.java | 3 + .../transform/FullToColumnTransformer.java | 15 +++-- .../core/a7/generation/GenerationQueue.java | 8 +++ .../lod/core/a7/level/DhClientLevel.java | 18 +++--- .../core/a7/level/DhClientServerLevel.java | 47 ++++++++------ .../lod/core/a7/level/DhServerLevel.java | 7 ++- .../lod/core/a7/level/IClientLevel.java | 6 +- .../com/seibel/lod/core/a7/level/ILevel.java | 2 - .../lod/core/a7/level/IServerLevel.java | 4 +- .../a7/save/structure/LocalSaveStructure.java | 16 +++-- .../core/a7/world/DhClientServerWorld.java | 44 +++++++------ .../lod/core/a7/world/DhClientWorld.java | 11 +++- .../lod/core/a7/world/DhServerWorld.java | 10 ++- .../lod/core/api/internal/a7/ClientApi.java | 21 +++---- .../lod/core/api/internal/a7/ServerApi.java | 23 ++++--- .../com/seibel/lod/core/enums/ELevelType.java | 1 + .../com/seibel/lod/core/util/LodUtil.java | 61 +------------------ .../minecraft/IMinecraftClientWrapper.java | 28 +-------- .../world/IBiomeWrapper.java | 10 --- .../world/IClientLevelWrapper.java | 12 ++++ .../world/ILevelWrapper.java | 13 ++-- .../world/IServerLevelWrapper.java | 11 ++++ 25 files changed, 192 insertions(+), 193 deletions(-) create mode 100644 src/main/java/com/seibel/lod/core/wrapperInterfaces/world/IClientLevelWrapper.java create mode 100644 src/main/java/com/seibel/lod/core/wrapperInterfaces/world/IServerLevelWrapper.java diff --git a/src/main/java/com/seibel/lod/core/a7/datatype/LodRenderSource.java b/src/main/java/com/seibel/lod/core/a7/datatype/LodRenderSource.java index 9598b161d..e6dfa1ae1 100644 --- a/src/main/java/com/seibel/lod/core/a7/datatype/LodRenderSource.java +++ b/src/main/java/com/seibel/lod/core/a7/datatype/LodRenderSource.java @@ -38,6 +38,8 @@ public interface LodRenderSource { byte getRenderVersion(); + void markInvalid(); + /** * Whether this object is still valid. If not, a new one should be created. */ diff --git a/src/main/java/com/seibel/lod/core/a7/datatype/PlaceHolderRenderSource.java b/src/main/java/com/seibel/lod/core/a7/datatype/PlaceHolderRenderSource.java index ee22e2f93..3a5e4c8a5 100644 --- a/src/main/java/com/seibel/lod/core/a7/datatype/PlaceHolderRenderSource.java +++ b/src/main/java/com/seibel/lod/core/a7/datatype/PlaceHolderRenderSource.java @@ -56,6 +56,7 @@ public class PlaceHolderRenderSource implements LodRenderSource { return 0; } + @Override public void markInvalid() { isValid = false; } diff --git a/src/main/java/com/seibel/lod/core/a7/datatype/column/ColumnRenderSource.java b/src/main/java/com/seibel/lod/core/a7/datatype/column/ColumnRenderSource.java index ac8838374..c685031c7 100644 --- a/src/main/java/com/seibel/lod/core/a7/datatype/column/ColumnRenderSource.java +++ b/src/main/java/com/seibel/lod/core/a7/datatype/column/ColumnRenderSource.java @@ -316,6 +316,9 @@ public class ColumnRenderSource implements LodRenderSource, IColumnDatatype { @Override public void update(ChunkSizedData chunkData) { //TODO Update render data directly + + //TEMP DEUBG + isValid = false; } @Override @@ -323,8 +326,14 @@ public class ColumnRenderSource implements LodRenderSource, IColumnDatatype { return LATEST_VERSION; } + private boolean isValid = true; + @Override + public void markInvalid() { + isValid = false; + } + @Override public boolean isValid() { - return true; // For now, this is always valid. + return isValid; } } diff --git a/src/main/java/com/seibel/lod/core/a7/datatype/column/render/ColumnRenderBuffer.java b/src/main/java/com/seibel/lod/core/a7/datatype/column/render/ColumnRenderBuffer.java index db9e9935f..c6b5887bb 100644 --- a/src/main/java/com/seibel/lod/core/a7/datatype/column/render/ColumnRenderBuffer.java +++ b/src/main/java/com/seibel/lod/core/a7/datatype/column/render/ColumnRenderBuffer.java @@ -190,6 +190,9 @@ public class ColumnRenderBuffer extends RenderBuffer { LodQuadBuilder builder = new LodQuadBuilder(true, (short) (skyLightCullingBelow - clientLevel.getMinY())); makeLodRenderData(builder, data, adjData); + if (builder.getCurrentQuadsCount() > 0) { + LOGGER.info("her"); + } EVENT_LOGGER.trace("RenderRegion end QuadBuild @ {}", data.sectionPos); return builder; } catch (UncheckedInterruptedException e) { diff --git a/src/main/java/com/seibel/lod/core/a7/datatype/transform/FullToColumnTransformer.java b/src/main/java/com/seibel/lod/core/a7/datatype/transform/FullToColumnTransformer.java index 1001fbe0a..009b51776 100644 --- a/src/main/java/com/seibel/lod/core/a7/datatype/transform/FullToColumnTransformer.java +++ b/src/main/java/com/seibel/lod/core/a7/datatype/transform/FullToColumnTransformer.java @@ -11,6 +11,7 @@ import com.seibel.lod.core.a7.level.IClientLevel; import com.seibel.lod.core.a7.pos.DhSectionPos; import com.seibel.lod.core.config.Config; import com.seibel.lod.core.handlers.dependencyInjection.SingletonInjector; +import com.seibel.lod.core.objects.DHBlockPos; import com.seibel.lod.core.wrapperInterfaces.IWrapperFactory; import com.seibel.lod.core.wrapperInterfaces.block.IBlockStateWrapper; import com.seibel.lod.core.wrapperInterfaces.world.IBiomeWrapper; @@ -31,11 +32,13 @@ public class FullToColumnTransformer { final ColumnRenderSource columnSource = new ColumnRenderSource(pos, vertSize, level.getMinY()); if (dataDetail == columnSource.getDataDetail()) { + int baseX = pos.getCorner().getCorner().x; + int baseZ = pos.getCorner().getCorner().z; for (int x = 0; x < pos.getWidth(dataDetail).value; x++) { for (int z = 0; z < pos.getWidth(dataDetail).value; z++) { ColumnArrayView columnArrayView = columnSource.getVerticalDataView(x, z); SingleFullArrayView fullArrayView = data.get(x, z); - convertColumnData(level, columnArrayView, fullArrayView); + convertColumnData(level, baseX + x, baseZ + z, columnArrayView, fullArrayView); } } // } else if (dataDetail == 0 && columnSource.getDataDetail() > dataDetail) { @@ -60,7 +63,7 @@ public class FullToColumnTransformer { return columnSource; } - private static void convertColumnData(IClientLevel level, ColumnArrayView columnArrayView, SingleFullArrayView fullArrayView) { + private static void convertColumnData(IClientLevel level, int blockX, int blockZ, ColumnArrayView columnArrayView, SingleFullArrayView fullArrayView) { if (!fullArrayView.doesItExist()) return; // TODO: Set gen mode int genModeValue = 1; @@ -69,14 +72,14 @@ public class FullToColumnTransformer { if (dataTotalLength > columnArrayView.verticalSize()) { ColumnArrayView totalColumnData = new ColumnArrayView(new long[dataTotalLength], dataTotalLength, 0, dataTotalLength); - iterateAndConvert(level, genModeValue, totalColumnData, fullArrayView); + iterateAndConvert(level, blockX, blockZ, genModeValue, totalColumnData, fullArrayView); columnArrayView.changeVerticalSizeFrom(totalColumnData); } else { - iterateAndConvert(level, genModeValue, columnArrayView, fullArrayView); //Directly use the arrayView since it fits. + iterateAndConvert(level, blockX, blockZ, genModeValue, columnArrayView, fullArrayView); //Directly use the arrayView since it fits. } } - private static void iterateAndConvert(IClientLevel level, int genMode, ColumnArrayView column, SingleFullArrayView data) { + private static void iterateAndConvert(IClientLevel level, int blockX, int blockZ, int genMode, ColumnArrayView column, SingleFullArrayView data) { IdBiomeBlockStateMap mapping = data.getMapping(); boolean isVoid = true; for (int i = 0; i < data.getSingleLength(); i++) { @@ -90,7 +93,7 @@ public class FullToColumnTransformer { IBlockStateWrapper block = entry.blockState; if (block.equals(AIR)) continue; isVoid = false; - int color = level.computeBaseColor(biome, block); + int color = level.computeBaseColor(new DHBlockPos(blockX, y + level.getMinY(), blockZ), biome, block); long columnData = ColumnFormat.createDataPoint(y + blockLength, y, color, light, genMode); column.set(i, columnData); } diff --git a/src/main/java/com/seibel/lod/core/a7/generation/GenerationQueue.java b/src/main/java/com/seibel/lod/core/a7/generation/GenerationQueue.java index 402fbb60c..9e1c5a5d0 100644 --- a/src/main/java/com/seibel/lod/core/a7/generation/GenerationQueue.java +++ b/src/main/java/com/seibel/lod/core/a7/generation/GenerationQueue.java @@ -7,6 +7,7 @@ import com.seibel.lod.core.a7.datatype.full.FullDataSource; import com.seibel.lod.core.a7.pos.DhBlockPos2D; import com.seibel.lod.core.a7.pos.DhLodPos; import com.seibel.lod.core.a7.pos.DhSectionPos; +import com.seibel.lod.core.a7.util.UncheckedInterruptedException; import com.seibel.lod.core.logging.DhLoggerBuilder; import com.seibel.lod.core.objects.DHChunkPos; import com.seibel.lod.core.util.LodUtil; @@ -122,6 +123,8 @@ public class GenerationQueue implements PlaceHolderQueue { if (ex instanceof CompletionException) { ex = ex.getCause(); } + if (ex instanceof InterruptedException) return; // Ignore interrupted exceptions. + if (ex instanceof UncheckedInterruptedException) return; // Ignore unchecked interrupted exceptions. logger.error("Error generating data for section {}", pos, ex); return; } @@ -164,6 +167,11 @@ public class GenerationQueue implements PlaceHolderQueue { // } // } }).exceptionally(ex -> { + if (ex instanceof CompletionException) { + ex = ex.getCause(); + } + if (ex instanceof InterruptedException) return null; // Ignore interrupted exceptions. + if (ex instanceof UncheckedInterruptedException) return null; // Ignore unchecked interrupted exceptions. logger.error("Error generating data for {} by {} chunks (at {}) with data detail {}", perCallChunksWidth, perCallChunksWidth, subCallChunkPosMin, dataDetail, ex); return null; diff --git a/src/main/java/com/seibel/lod/core/a7/level/DhClientLevel.java b/src/main/java/com/seibel/lod/core/a7/level/DhClientLevel.java index ad44ea503..0e0333a4a 100644 --- a/src/main/java/com/seibel/lod/core/a7/level/DhClientLevel.java +++ b/src/main/java/com/seibel/lod/core/a7/level/DhClientLevel.java @@ -10,12 +10,14 @@ import com.seibel.lod.core.a7.save.structure.ClientOnlySaveStructure; import com.seibel.lod.core.config.Config; import com.seibel.lod.core.handlers.dependencyInjection.SingletonInjector; import com.seibel.lod.core.logging.DhLoggerBuilder; +import com.seibel.lod.core.objects.DHBlockPos; import com.seibel.lod.core.objects.math.Mat4f; import com.seibel.lod.core.a7.render.a7LodRenderer; import com.seibel.lod.core.wrapperInterfaces.block.IBlockStateWrapper; import com.seibel.lod.core.wrapperInterfaces.minecraft.IMinecraftClientWrapper; import com.seibel.lod.core.wrapperInterfaces.minecraft.IProfilerWrapper; import com.seibel.lod.core.wrapperInterfaces.world.IBiomeWrapper; +import com.seibel.lod.core.wrapperInterfaces.world.IClientLevelWrapper; import com.seibel.lod.core.wrapperInterfaces.world.ILevelWrapper; import org.apache.logging.log4j.Logger; @@ -28,11 +30,11 @@ public class DhClientLevel implements IClientLevel { public final RemoteDataFileHandler dataFileHandler; public final RenderFileHandler renderFileHandler; public final RenderBufferHandler renderBufferHandler; //TODO: Should this be owned by renderer? - public final ILevelWrapper level; + public final IClientLevelWrapper level; public a7LodRenderer renderer = null; public LodQuadTree tree; - public DhClientLevel(ClientOnlySaveStructure save, ILevelWrapper level) { + public DhClientLevel(ClientOnlySaveStructure save, IClientLevelWrapper level) { this.save = save; save.getDataFolder(level).mkdirs(); save.getRenderCacheFolder(level).mkdirs(); @@ -51,11 +53,6 @@ public class DhClientLevel implements IClientLevel { //TODO } - @Override - public ILevelWrapper getLevelWrapper() { - return level; - } - @Override public void clientTick() { tree.tick(new DhBlockPos2D(MC_CLIENT.getPlayerBlockPos())); @@ -76,10 +73,15 @@ public class DhClientLevel implements IClientLevel { } @Override - public int computeBaseColor(IBiomeWrapper biome, IBlockStateWrapper block) { + public int computeBaseColor(DHBlockPos pos, IBiomeWrapper biome, IBlockStateWrapper block) { return 0; //TODO } + @Override + public IClientLevelWrapper getClientLevelWrapper() { + return level; + } + @Override public int getMinY() { return level.getMinHeight(); diff --git a/src/main/java/com/seibel/lod/core/a7/level/DhClientServerLevel.java b/src/main/java/com/seibel/lod/core/a7/level/DhClientServerLevel.java index 782dbc3aa..97a02e1ce 100644 --- a/src/main/java/com/seibel/lod/core/a7/level/DhClientServerLevel.java +++ b/src/main/java/com/seibel/lod/core/a7/level/DhClientServerLevel.java @@ -13,13 +13,16 @@ import com.seibel.lod.core.builders.worldGeneration.BatchGenerator; import com.seibel.lod.core.config.Config; import com.seibel.lod.core.handlers.dependencyInjection.SingletonInjector; import com.seibel.lod.core.logging.DhLoggerBuilder; +import com.seibel.lod.core.objects.DHBlockPos; import com.seibel.lod.core.objects.math.Mat4f; import com.seibel.lod.core.a7.render.a7LodRenderer; import com.seibel.lod.core.wrapperInterfaces.block.IBlockStateWrapper; import com.seibel.lod.core.wrapperInterfaces.minecraft.IMinecraftClientWrapper; import com.seibel.lod.core.wrapperInterfaces.minecraft.IProfilerWrapper; import com.seibel.lod.core.wrapperInterfaces.world.IBiomeWrapper; +import com.seibel.lod.core.wrapperInterfaces.world.IClientLevelWrapper; import com.seibel.lod.core.wrapperInterfaces.world.ILevelWrapper; +import com.seibel.lod.core.wrapperInterfaces.world.IServerLevelWrapper; import org.apache.logging.log4j.Logger; import java.util.concurrent.CompletableFuture; @@ -32,17 +35,19 @@ public class DhClientServerLevel implements IClientLevel, IServerLevel { public GenerationQueue generationQueue = null; public RenderFileHandler renderFileHandler = null; public RenderBufferHandler renderBufferHandler = null; //TODO: Should this be owned by renderer? - public final ILevelWrapper level; + public final IServerLevelWrapper serverLevel; + public IClientLevelWrapper clientLevel; public a7LodRenderer renderer = null; public LodQuadTree tree = null; public IGenerator worldGenerator = null; - public DhClientServerLevel(LocalSaveStructure save, ILevelWrapper level) { - this.level = level; + public DhClientServerLevel(LocalSaveStructure save, IServerLevelWrapper level) { + this.serverLevel = level; this.save = save; save.getDataFolder(level).mkdirs(); save.getRenderCacheFolder(level).mkdirs(); dataFileHandler = new LocalDataFileHandler(this, save.getDataFolder(level)); + FileScanner.scanFile(save, serverLevel, dataFileHandler, null); LOGGER.info("Started DHLevel for {} with saves at {}", level, save); } @@ -57,15 +62,16 @@ public class DhClientServerLevel implements IClientLevel, IServerLevel { public void serverTick() { //TODO Update network packet and stuff or state or etc.. } - public void startRenderer() { - LOGGER.info("Starting renderer for {}", level); - if (renderBufferHandler != null) { - LOGGER.warn("Tried to call startRenderer() on the clientServerLevel {} when renderer is already setup!", level); + public void startRenderer(IClientLevelWrapper clientLevel) { + LOGGER.info("Starting renderer for {}", this); + if (renderBufferHandler != null || this.clientLevel != null) { + LOGGER.warn("Tried to call startRenderer() on {} when renderer is already setup!", this); return; } + this.clientLevel = clientLevel; // FIXME: This A need B and B need A messes needs to be reworked! - renderFileHandler = new RenderFileHandler(dataFileHandler, this, save.getRenderCacheFolder(level)); + renderFileHandler = new RenderFileHandler(dataFileHandler, this, save.getRenderCacheFolder(serverLevel)); final RenderFileHandler f_renderFileHandler = renderFileHandler; generationQueue = new GenerationQueue(f_renderFileHandler::write); renderFileHandler.setPlaceHolderQueue(generationQueue); @@ -73,13 +79,13 @@ public class DhClientServerLevel implements IClientLevel, IServerLevel { tree = new LodQuadTree(this, Config.Client.Graphics.Quality.lodChunkRenderDistance.get()*16, MC_CLIENT.getPlayerBlockPos().x, MC_CLIENT.getPlayerBlockPos().z, renderFileHandler); renderBufferHandler = new RenderBufferHandler(tree); - FileScanner.scanFile(save, level, dataFileHandler, renderFileHandler); + FileScanner.scanFile(save, serverLevel, null, renderFileHandler); } @Override public void render(Mat4f mcModelViewMatrix, Mat4f mcProjectionMatrix, float partialTicks, IProfilerWrapper profiler) { if (renderBufferHandler == null) { - LOGGER.error("Tried to call render() on the clientServerLevel {} when renderer has not been started!", level); + LOGGER.error("Tried to call render() on {} when renderer has not been started!", this); return; } if (renderer == null) { @@ -89,9 +95,9 @@ public class DhClientServerLevel implements IClientLevel, IServerLevel { } public void stopRenderer() { - LOGGER.info("Stopping renderer for {}", level); + LOGGER.info("Stopping renderer for {}", this); if (renderBufferHandler == null) { - LOGGER.warn("Tried to call stopRenderer() on the clientServerLevel {} when renderer is already closed!", level); + LOGGER.warn("Tried to call stopRenderer() on {} when renderer is already closed!", this); return; } renderBufferHandler.close(); @@ -109,8 +115,13 @@ public class DhClientServerLevel implements IClientLevel, IServerLevel { } @Override - public int computeBaseColor(IBiomeWrapper biome, IBlockStateWrapper block) { - return 0; //TODO + public int computeBaseColor(DHBlockPos pos, IBiomeWrapper biome, IBlockStateWrapper block) { + return clientLevel.computeBaseColor(pos, biome, block); + } + + @Override + public IClientLevelWrapper getClientLevelWrapper() { + return clientLevel; } @Override @@ -120,7 +131,7 @@ public class DhClientServerLevel implements IClientLevel, IServerLevel { @Override public int getMinY() { - return level.getMinHeight(); + return serverLevel.getMinHeight(); } @Override @@ -137,7 +148,7 @@ public class DhClientServerLevel implements IClientLevel, IServerLevel { if (renderBufferHandler != null) renderBufferHandler.close(); if (renderFileHandler != null) renderFileHandler.close(); dataFileHandler.close(); - LOGGER.info("Closed DHLevel for {}", level); + LOGGER.info("Closed {}", this); } @@ -155,7 +166,7 @@ public class DhClientServerLevel implements IClientLevel, IServerLevel { } @Override - public ILevelWrapper getLevelWrapper() { - return level; + public IServerLevelWrapper getServerLevelWrapper() { + return serverLevel; } } diff --git a/src/main/java/com/seibel/lod/core/a7/level/DhServerLevel.java b/src/main/java/com/seibel/lod/core/a7/level/DhServerLevel.java index 74ba6618f..62eb2d039 100644 --- a/src/main/java/com/seibel/lod/core/a7/level/DhServerLevel.java +++ b/src/main/java/com/seibel/lod/core/a7/level/DhServerLevel.java @@ -9,6 +9,7 @@ import com.seibel.lod.core.a7.save.structure.LocalSaveStructure; import com.seibel.lod.core.logging.DhLoggerBuilder; import com.seibel.lod.core.objects.DHChunkPos; import com.seibel.lod.core.wrapperInterfaces.world.ILevelWrapper; +import com.seibel.lod.core.wrapperInterfaces.world.IServerLevelWrapper; import org.apache.logging.log4j.Logger; import java.util.concurrent.CompletableFuture; @@ -18,9 +19,9 @@ public class DhServerLevel implements IServerLevel { public final LocalSaveStructure save; public final LocalDataFileHandler dataFileHandler; - public final ILevelWrapper level; + public final IServerLevelWrapper level; - public DhServerLevel(LocalSaveStructure save, ILevelWrapper level) { + public DhServerLevel(LocalSaveStructure save, IServerLevelWrapper level) { this.save = save; this.level = level; save.getDataFolder(level).mkdirs(); @@ -58,7 +59,7 @@ public class DhServerLevel implements IServerLevel { } @Override - public ILevelWrapper getLevelWrapper() { + public IServerLevelWrapper getServerLevelWrapper() { return level; } } diff --git a/src/main/java/com/seibel/lod/core/a7/level/IClientLevel.java b/src/main/java/com/seibel/lod/core/a7/level/IClientLevel.java index fee6c1b99..d994cd86f 100644 --- a/src/main/java/com/seibel/lod/core/a7/level/IClientLevel.java +++ b/src/main/java/com/seibel/lod/core/a7/level/IClientLevel.java @@ -1,10 +1,12 @@ package com.seibel.lod.core.a7.level; import com.seibel.lod.core.a7.render.RenderBufferHandler; +import com.seibel.lod.core.objects.DHBlockPos; import com.seibel.lod.core.objects.math.Mat4f; import com.seibel.lod.core.wrapperInterfaces.block.IBlockStateWrapper; import com.seibel.lod.core.wrapperInterfaces.minecraft.IProfilerWrapper; import com.seibel.lod.core.wrapperInterfaces.world.IBiomeWrapper; +import com.seibel.lod.core.wrapperInterfaces.world.IClientLevelWrapper; public interface IClientLevel extends ILevel { void clientTick(); @@ -13,5 +15,7 @@ public interface IClientLevel extends ILevel { RenderBufferHandler getRenderBufferHandler(); - int computeBaseColor(IBiomeWrapper biome, IBlockStateWrapper block); + int computeBaseColor(DHBlockPos pos, IBiomeWrapper biome, IBlockStateWrapper block); + + IClientLevelWrapper getClientLevelWrapper(); } diff --git a/src/main/java/com/seibel/lod/core/a7/level/ILevel.java b/src/main/java/com/seibel/lod/core/a7/level/ILevel.java index 0516dcbac..5370ca7af 100644 --- a/src/main/java/com/seibel/lod/core/a7/level/ILevel.java +++ b/src/main/java/com/seibel/lod/core/a7/level/ILevel.java @@ -9,6 +9,4 @@ public interface ILevel extends AutoCloseable { CompletableFuture save(); void dumpRamUsage(); - - ILevelWrapper getLevelWrapper(); } diff --git a/src/main/java/com/seibel/lod/core/a7/level/IServerLevel.java b/src/main/java/com/seibel/lod/core/a7/level/IServerLevel.java index 478f13407..9382f6e29 100644 --- a/src/main/java/com/seibel/lod/core/a7/level/IServerLevel.java +++ b/src/main/java/com/seibel/lod/core/a7/level/IServerLevel.java @@ -1,8 +1,10 @@ package com.seibel.lod.core.a7.level; -import com.seibel.lod.core.a7.datatype.full.ChunkSizedData; +import com.seibel.lod.core.wrapperInterfaces.world.IServerLevelWrapper; public interface IServerLevel extends ILevel { void serverTick(); void doWorldGen(); + + IServerLevelWrapper getServerLevelWrapper(); } diff --git a/src/main/java/com/seibel/lod/core/a7/save/structure/LocalSaveStructure.java b/src/main/java/com/seibel/lod/core/a7/save/structure/LocalSaveStructure.java index 40229862d..d2e7bc253 100644 --- a/src/main/java/com/seibel/lod/core/a7/save/structure/LocalSaveStructure.java +++ b/src/main/java/com/seibel/lod/core/a7/save/structure/LocalSaveStructure.java @@ -3,6 +3,7 @@ package com.seibel.lod.core.a7.save.structure; import com.seibel.lod.core.handlers.dependencyInjection.SingletonInjector; import com.seibel.lod.core.wrapperInterfaces.minecraft.IMinecraftSharedWrapper; import com.seibel.lod.core.wrapperInterfaces.world.ILevelWrapper; +import com.seibel.lod.core.wrapperInterfaces.world.IServerLevelWrapper; import java.io.File; @@ -17,20 +18,23 @@ public class LocalSaveStructure extends SaveStructure { @Override public File tryGetLevelFolder(ILevelWrapper wrapper) { - debugPath = new File(wrapper.getSaveFolder(), "Distant_Horizons"); - return new File(wrapper.getSaveFolder(), "Distant_Horizons"); + IServerLevelWrapper serverSide = (IServerLevelWrapper) wrapper; + debugPath = new File(serverSide.getSaveFolder(), "Distant_Horizons"); + return new File(serverSide.getSaveFolder(), "Distant_Horizons"); } @Override public File getRenderCacheFolder(ILevelWrapper level) { - debugPath = new File(level.getSaveFolder(), "Distant_Horizons"); - return new File(new File(level.getSaveFolder(), "Distant_Horizons"), RENDER_CACHE_FOLDER); + IServerLevelWrapper serverSide = (IServerLevelWrapper) level; + debugPath = new File(serverSide.getSaveFolder(), "Distant_Horizons"); + return new File(new File(serverSide.getSaveFolder(), "Distant_Horizons"), RENDER_CACHE_FOLDER); } @Override public File getDataFolder(ILevelWrapper level) { - debugPath = new File(level.getSaveFolder(), "Distant_Horizons"); - return new File(new File(level.getSaveFolder(), "Distant_Horizons"), DATA_FOLDER); + IServerLevelWrapper serverSide = (IServerLevelWrapper) level; + debugPath = new File(serverSide.getSaveFolder(), "Distant_Horizons"); + return new File(new File(serverSide.getSaveFolder(), "Distant_Horizons"), DATA_FOLDER); } @Override diff --git a/src/main/java/com/seibel/lod/core/a7/world/DhClientServerWorld.java b/src/main/java/com/seibel/lod/core/a7/world/DhClientServerWorld.java index 9bdd4a87f..3d79f3f84 100644 --- a/src/main/java/com/seibel/lod/core/a7/world/DhClientServerWorld.java +++ b/src/main/java/com/seibel/lod/core/a7/world/DhClientServerWorld.java @@ -5,7 +5,9 @@ import com.seibel.lod.core.a7.save.structure.LocalSaveStructure; import com.seibel.lod.core.config.Config; import com.seibel.lod.core.util.EventLoop; import com.seibel.lod.core.util.LodUtil; +import com.seibel.lod.core.wrapperInterfaces.world.IClientLevelWrapper; import com.seibel.lod.core.wrapperInterfaces.world.ILevelWrapper; +import com.seibel.lod.core.wrapperInterfaces.world.IServerLevelWrapper; import java.io.File; import java.util.HashMap; @@ -29,11 +31,23 @@ public class DhClientServerWorld extends DhWorld implements IClientWorld, IServe @Override public DhClientServerLevel getOrLoadLevel(ILevelWrapper wrapper) { - return levels.computeIfAbsent(wrapper, (w) -> { - File levelFile = saveStructure.tryGetLevelFolder(w); - LodUtil.assertTrue(levelFile != null); - return new DhClientServerLevel(saveStructure, w); - }); + if (wrapper instanceof IServerLevelWrapper) { + return levels.computeIfAbsent(wrapper, (w) -> { + File levelFile = saveStructure.tryGetLevelFolder(w); + LodUtil.assertTrue(levelFile != null); + return new DhClientServerLevel(saveStructure, (IServerLevelWrapper) w); + }); + } else { + return levels.computeIfAbsent(wrapper, (w) -> { + IClientLevelWrapper clientSide = (IClientLevelWrapper) w; + IServerLevelWrapper serverSide = clientSide.tryGetServerSideWrapper(); + LodUtil.assertTrue(serverSide != null); + DhClientServerLevel level = levels.get(serverSide); + if (level==null) return null; + level.startRenderer(clientSide); + return level; + }); + } } @Override @@ -44,8 +58,12 @@ public class DhClientServerWorld extends DhWorld implements IClientWorld, IServe @Override public void unloadLevel(ILevelWrapper wrapper) { if (levels.containsKey(wrapper)) { - LOGGER.info("Unloading level {} ", levels.get(wrapper)); - levels.remove(wrapper).close(); + if (wrapper instanceof IServerLevelWrapper) { + LOGGER.info("Unloading level {} ", levels.get(wrapper)); + levels.remove(wrapper).close(); + } else { + levels.remove(wrapper).stopRenderer(); // Ignore resource warning. The level obj is referenced elsewhere. + } } } @@ -85,21 +103,11 @@ public class DhClientServerWorld extends DhWorld implements IClientWorld, IServe public void close() { saveAndFlush().join(); for (DhClientServerLevel level : levels.values()) { - LOGGER.info("Unloading level for world " + level.level.getDimensionType().getDimensionName()); + LOGGER.info("Unloading level " + level.serverLevel.getDimensionType().getDimensionName()); level.close(); } levels.clear(); LOGGER.info("Closed DhWorld of type {}", environment); } - public void enableRendering(ILevelWrapper wrapper) { - DhClientServerLevel level = levels.get(wrapper); - if (level==null) return; - level.startRenderer(); - } - public void disableRendering(ILevelWrapper wrapper) { - DhClientServerLevel level = levels.get(wrapper); - if (level==null) return; - level.stopRenderer(); - } } diff --git a/src/main/java/com/seibel/lod/core/a7/world/DhClientWorld.java b/src/main/java/com/seibel/lod/core/a7/world/DhClientWorld.java index ea4a58ec2..06eec718f 100644 --- a/src/main/java/com/seibel/lod/core/a7/world/DhClientWorld.java +++ b/src/main/java/com/seibel/lod/core/a7/world/DhClientWorld.java @@ -7,6 +7,7 @@ import com.seibel.lod.core.config.Config; import com.seibel.lod.core.util.DetailDistanceUtil; import com.seibel.lod.core.util.EventLoop; import com.seibel.lod.core.util.LodUtil; +import com.seibel.lod.core.wrapperInterfaces.world.IClientLevelWrapper; import com.seibel.lod.core.wrapperInterfaces.world.ILevelWrapper; import java.io.File; @@ -16,7 +17,7 @@ import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutorService; public class DhClientWorld extends DhWorld implements IClientWorld { - private final HashMap levels; + private final HashMap levels; public final ClientOnlySaveStructure saveStructure; public ExecutorService dhTickerThread = LodUtil.makeSingleThreadPool("DHTickerThread", 2); public EventLoop eventLoop = new EventLoop(dhTickerThread, this::_clientTick); @@ -30,7 +31,9 @@ public class DhClientWorld extends DhWorld implements IClientWorld { @Override public DhClientLevel getOrLoadLevel(ILevelWrapper wrapper) { - return levels.computeIfAbsent(wrapper, (w) -> { + if (!(wrapper instanceof IClientLevelWrapper)) return null; + + return levels.computeIfAbsent((IClientLevelWrapper) wrapper, (w) -> { File level = saveStructure.tryGetLevelFolder(wrapper); if (level == null) return null; return new DhClientLevel(saveStructure, w); @@ -39,11 +42,13 @@ public class DhClientWorld extends DhWorld implements IClientWorld { @Override public DhClientLevel getLevel(ILevelWrapper wrapper) { + if (!(wrapper instanceof IClientLevelWrapper)) return null; return levels.get(wrapper); } @Override public void unloadLevel(ILevelWrapper wrapper) { + if (!(wrapper instanceof IClientLevelWrapper)) return; if (levels.containsKey(wrapper)) { LOGGER.info("Unloading level {} ", levels.get(wrapper)); levels.remove(wrapper).close(); @@ -77,7 +82,7 @@ public class DhClientWorld extends DhWorld implements IClientWorld { public void close() { saveAndFlush().join(); for (DhClientLevel level : levels.values()) { - LOGGER.info("Unloading level for world " + level.level.getDimensionType().getDimensionName()); + LOGGER.info("Unloading level " + level.level.getDimensionType().getDimensionName()); level.close(); } levels.clear(); diff --git a/src/main/java/com/seibel/lod/core/a7/world/DhServerWorld.java b/src/main/java/com/seibel/lod/core/a7/world/DhServerWorld.java index 5c8ed4c8c..5990ed46b 100644 --- a/src/main/java/com/seibel/lod/core/a7/world/DhServerWorld.java +++ b/src/main/java/com/seibel/lod/core/a7/world/DhServerWorld.java @@ -4,13 +4,14 @@ import com.seibel.lod.core.a7.level.DhServerLevel; import com.seibel.lod.core.a7.save.structure.LocalSaveStructure; import com.seibel.lod.core.util.LodUtil; import com.seibel.lod.core.wrapperInterfaces.world.ILevelWrapper; +import com.seibel.lod.core.wrapperInterfaces.world.IServerLevelWrapper; import java.io.File; import java.util.HashMap; import java.util.concurrent.CompletableFuture; public class DhServerWorld extends DhWorld implements IServerWorld { - private final HashMap levels; + private final HashMap levels; public final LocalSaveStructure saveStructure; public DhServerWorld() { @@ -22,7 +23,8 @@ public class DhServerWorld extends DhWorld implements IServerWorld { @Override public DhServerLevel getOrLoadLevel(ILevelWrapper wrapper) { - return levels.computeIfAbsent(wrapper, (w) -> { + if (!(wrapper instanceof IServerLevelWrapper)) return null; + return levels.computeIfAbsent((IServerLevelWrapper) wrapper, (w) -> { File levelFile = saveStructure.tryGetLevelFolder(wrapper); LodUtil.assertTrue(levelFile != null); return new DhServerLevel(saveStructure, w); @@ -31,11 +33,13 @@ public class DhServerWorld extends DhWorld implements IServerWorld { @Override public DhServerLevel getLevel(ILevelWrapper wrapper) { + if (!(wrapper instanceof IServerLevelWrapper)) return null; return levels.get(wrapper); } @Override public void unloadLevel(ILevelWrapper wrapper) { + if (!(wrapper instanceof IServerLevelWrapper)) return; if (levels.containsKey(wrapper)) { LOGGER.info("Unloading level {} ", levels.get(wrapper)); levels.remove(wrapper).close(); @@ -59,7 +63,7 @@ public class DhServerWorld extends DhWorld implements IServerWorld { @Override public void close() { for (DhServerLevel level : levels.values()) { - LOGGER.info("Unloading level for world " + level.level.getDimensionType().getDimensionName()); + LOGGER.info("Unloading level " + level.level.getDimensionType().getDimensionName()); level.close(); } levels.clear(); diff --git a/src/main/java/com/seibel/lod/core/api/internal/a7/ClientApi.java b/src/main/java/com/seibel/lod/core/api/internal/a7/ClientApi.java index ebff93bcb..053d258f3 100644 --- a/src/main/java/com/seibel/lod/core/api/internal/a7/ClientApi.java +++ b/src/main/java/com/seibel/lod/core/api/internal/a7/ClientApi.java @@ -36,6 +36,7 @@ import com.seibel.lod.core.wrapperInterfaces.chunk.IChunkWrapper; import com.seibel.lod.core.wrapperInterfaces.minecraft.IMinecraftClientWrapper; import com.seibel.lod.core.wrapperInterfaces.minecraft.IMinecraftRenderWrapper; import com.seibel.lod.core.wrapperInterfaces.minecraft.IProfilerWrapper; +import com.seibel.lod.core.wrapperInterfaces.world.IClientLevelWrapper; import com.seibel.lod.core.wrapperInterfaces.world.ILevelWrapper; import org.apache.logging.log4j.Level; import org.apache.logging.log4j.LogManager; @@ -118,35 +119,31 @@ public class ClientApi SharedApi.currentWorld = null; } - public void clientChunkLoadEvent(IChunkWrapper chunk, ILevelWrapper level) + public void clientChunkLoadEvent(IChunkWrapper chunk, IClientLevelWrapper level) { if (SharedApi.getEnvironment() == WorldEnvironment.Client_Only) { //TODO: Implement } } - public void clientChunkSaveEvent(IChunkWrapper chunk, ILevelWrapper level) + public void clientChunkSaveEvent(IChunkWrapper chunk, IClientLevelWrapper level) { if (SharedApi.getEnvironment() == WorldEnvironment.Client_Only) { //TODO: Implement } } - public void clientLevelUnloadEvent(ILevelWrapper level) + public void clientLevelUnloadEvent(IClientLevelWrapper level) { if (ENABLE_EVENT_LOGGING) LOGGER.info("Client level {} unloading.", level); - if (SharedApi.currentWorld instanceof DhClientServerWorld) { - ((DhClientServerWorld)SharedApi.currentWorld).disableRendering(level); - } else if (SharedApi.getEnvironment() == WorldEnvironment.Client_Only) { + if (SharedApi.currentWorld != null) { SharedApi.currentWorld.unloadLevel(level); } } - public void clientLevelLoadEvent(ILevelWrapper level) + public void clientLevelLoadEvent(IClientLevelWrapper level) { if (ENABLE_EVENT_LOGGING) LOGGER.info("Client level {} loading.", level); - if (SharedApi.currentWorld instanceof DhClientServerWorld) { - ((DhClientServerWorld)SharedApi.currentWorld).enableRendering(level); - } else if (SharedApi.getEnvironment() == WorldEnvironment.Client_Only) { - SharedApi.currentWorld.getOrLoadLevel(level); //TODO: This may need to be delayed to after player enters the level + if (SharedApi.currentWorld != null) { + SharedApi.currentWorld.getOrLoadLevel(level); } } @@ -186,7 +183,7 @@ public class ClientApi profiler.pop(); } - public void renderLods(ILevelWrapper levelWrapper, Mat4f mcModelViewMatrix, Mat4f mcProjectionMatrix, float partialTicks) + public void renderLods(IClientLevelWrapper levelWrapper, Mat4f mcModelViewMatrix, Mat4f mcProjectionMatrix, float partialTicks) { IProfilerWrapper profiler = MC.getProfiler(); profiler.pop(); // get out of "terrain" diff --git a/src/main/java/com/seibel/lod/core/api/internal/a7/ServerApi.java b/src/main/java/com/seibel/lod/core/api/internal/a7/ServerApi.java index 7b17454b9..811fb8910 100644 --- a/src/main/java/com/seibel/lod/core/api/internal/a7/ServerApi.java +++ b/src/main/java/com/seibel/lod/core/api/internal/a7/ServerApi.java @@ -23,10 +23,12 @@ import com.seibel.lod.core.a7.world.DhClientServerWorld; import com.seibel.lod.core.a7.world.DhServerWorld; import com.seibel.lod.core.a7.world.IServerWorld; import com.seibel.lod.core.handlers.dependencyInjection.SingletonInjector; +import com.seibel.lod.core.logging.ConfigBasedLogger; import com.seibel.lod.core.logging.DhLoggerBuilder; import com.seibel.lod.core.wrapperInterfaces.IVersionConstants; import com.seibel.lod.core.wrapperInterfaces.chunk.IChunkWrapper; import com.seibel.lod.core.wrapperInterfaces.world.ILevelWrapper; +import com.seibel.lod.core.wrapperInterfaces.world.IServerLevelWrapper; import org.apache.logging.log4j.Logger; import java.lang.invoke.MethodHandles; @@ -42,7 +44,7 @@ public class ServerApi { public static final boolean ENABLE_STACK_DUMP_LOGGING = false; public static final ServerApi INSTANCE = new ServerApi(); - private static final Logger LOGGER = DhLoggerBuilder.getLogger(MethodHandles.lookup().lookupClass().getSimpleName()); + public static final Logger LOGGER = DhLoggerBuilder.getLogger(MethodHandles.lookup().lookupClass().getSimpleName()); private static final IVersionConstants VERSION_CONSTANTS = SingletonInjector.INSTANCE.get(IVersionConstants.class); public static final boolean ENABLE_EVENT_LOGGING = true; @@ -67,6 +69,9 @@ public class ServerApi } } } + public void serverLevelTickEvent(IServerLevelWrapper level) { + //TODO + } //TODO: rename to serverLoadEvent public void serverWorldLoadEvent(boolean isDedicatedEnvironment) { @@ -85,15 +90,15 @@ public class ServerApi SharedApi.currentWorld = null; } - public void serverLevelLoadEvent(ILevelWrapper world) { - if (ENABLE_EVENT_LOGGING) LOGGER.info("Server Level {} loading", world); - if (SharedApi.currentWorld instanceof IServerWorld) - SharedApi.currentWorld.getOrLoadLevel(world); + public void serverLevelLoadEvent(IServerLevelWrapper level) { + if (ENABLE_EVENT_LOGGING) LOGGER.info("Server Level {} loading", level); + if (SharedApi.currentWorld != null) + SharedApi.currentWorld.getOrLoadLevel(level); } - public void serverLevelUnloadEvent(ILevelWrapper world) { - if (ENABLE_EVENT_LOGGING) LOGGER.info("Server Level {} unloading", world); - if (SharedApi.currentWorld instanceof IServerWorld) - SharedApi.currentWorld.unloadLevel(world); + public void serverLevelUnloadEvent(IServerLevelWrapper level) { + if (ENABLE_EVENT_LOGGING) LOGGER.info("Server Level {} unloading", level); + if (SharedApi.currentWorld != null) + SharedApi.currentWorld.unloadLevel(level); } @Deprecated diff --git a/src/main/java/com/seibel/lod/core/enums/ELevelType.java b/src/main/java/com/seibel/lod/core/enums/ELevelType.java index d1d212af0..274dff91e 100644 --- a/src/main/java/com/seibel/lod/core/enums/ELevelType.java +++ b/src/main/java/com/seibel/lod/core/enums/ELevelType.java @@ -27,6 +27,7 @@ package com.seibel.lod.core.enums; * @author James Seibel * @version 2022-7-13 */ +@Deprecated public enum ELevelType { SERVER_LEVEL, diff --git a/src/main/java/com/seibel/lod/core/util/LodUtil.java b/src/main/java/com/seibel/lod/core/util/LodUtil.java index e2b08440d..a66913170 100644 --- a/src/main/java/com/seibel/lod/core/util/LodUtil.java +++ b/src/main/java/com/seibel/lod/core/util/LodUtil.java @@ -24,6 +24,7 @@ import java.util.Iterator; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; +import com.seibel.lod.core.a7.util.UncheckedInterruptedException; import com.seibel.lod.core.config.Config; import com.seibel.lod.core.enums.config.EServerFolderNameMode; import com.seibel.lod.core.enums.config.EVanillaOverdraw; @@ -191,61 +192,7 @@ public class LodUtil return new DHRegionPos(relativePosX, relativePosZ); } - - - /** - * If on single player this will return the name of the user's - * world, if in multiplayer it will return the server name, IP, - * and game version. - */ - public static String getWorldID(ILevelWrapper world) - { - if (MC_CLIENT.hasSinglePlayerServer()) - { - // chop off the dimension ID as it is not needed/wanted - String dimId = getDimensionIDFromWorld(world); - - // get the world name - int saveIndex = dimId.indexOf("saves") + 1 + "saves".length(); - int slashIndex = dimId.indexOf(File.separatorChar, saveIndex); - dimId = dimId.substring(saveIndex, slashIndex); - return dimId; - } - else - { - return getServerFolderName(); - } - } - - - /** - * If on single player this will return the name of the user's - * world and the dimensional save folder, if in multiplayer - * it will return the server name, ip, game version, and dimension.
- *
- * This can be used to determine where to save files for a given - * dimension. - */ - @Deprecated // FIXME: There are soooo many duplicated methods doing the same thing everywhere - public static String getDimensionIDFromWorld(ILevelWrapper world) - { - if (MC_CLIENT.hasSinglePlayerServer()) - { - // this will return the world save location - // and the dimension folder - - ILevelWrapper serverWorld = LodUtil.getServerWorldFromDimension(world.getDimensionType()); - if (serverWorld == null) - throw new NullPointerException("getDimensionIDFromWorld wasn't able to get the WorldWrapper for the dimension " + world.getDimensionType().getDimensionName()); - - return serverWorld.getSaveFolder().toString(); - } - else - { - return getServerFolderName() + File.separatorChar + "dim_" + world.getDimensionType().getDimensionName() + File.separatorChar; - } - } - + /** returns the server name, IP and game version. */ @Deprecated // FIXME: There are soooo many duplicated methods doing the same thing everywhere // Cloned to a7 package's DHFileHandler @@ -421,10 +368,6 @@ public class LodUtil if (Thread.interrupted()) throw new InterruptedException(); } - public static void checkInterruptsUnchecked() { - if (Thread.interrupted()) throw new RuntimeException(new InterruptedException()); - } - /** * Format a given string with params using log4j's MessageFormat * diff --git a/src/main/java/com/seibel/lod/core/wrapperInterfaces/minecraft/IMinecraftClientWrapper.java b/src/main/java/com/seibel/lod/core/wrapperInterfaces/minecraft/IMinecraftClientWrapper.java index 6ae3de528..aeca74939 100644 --- a/src/main/java/com/seibel/lod/core/wrapperInterfaces/minecraft/IMinecraftClientWrapper.java +++ b/src/main/java/com/seibel/lod/core/wrapperInterfaces/minecraft/IMinecraftClientWrapper.java @@ -51,8 +51,6 @@ public interface IMinecraftClientWrapper extends IBindable */ void clearFrameObjectCache(); - - //=================// // method wrappers // //=================// @@ -64,12 +62,6 @@ public interface IMinecraftClientWrapper extends IBindable String getCurrentServerName(); String getCurrentServerIp(); String getCurrentServerVersion(); - - /** Returns the dimension the player is currently in */ - IDimensionTypeWrapper getCurrentDimension(); - - @Deprecated // This should be moved to directly calling the function in core - String getCurrentDimensionId(); //=============// // Simple gets // @@ -80,31 +72,17 @@ public interface IMinecraftClientWrapper extends IBindable DHBlockPos getPlayerBlockPos(); DHChunkPos getPlayerChunkPos(); - - /** - * Attempts to get the ServerWorld for the dimension - * the user is currently in. - * @return null if no ServerWorld is available - */ - ILevelWrapper getWrappedServerWorld(); - + + @Deprecated ILevelWrapper getWrappedClientWorld(); File getGameDirectory(); IProfilerWrapper getProfiler(); - float getSkyDarken(float partialTicks); - - boolean connectedToServer(); - - int getPlayerSkylight(); - /** Returns all worlds available to the server */ ArrayList getAllServerWorlds(); - - void sendChatMessage(String string); /** @@ -118,6 +96,4 @@ public interface IMinecraftClientWrapper extends IBindable void crashMinecraft(String errorMessage, Throwable exception); Object getOptionsObject(); - - File getSinglePlayerServerFolder(); } diff --git a/src/main/java/com/seibel/lod/core/wrapperInterfaces/world/IBiomeWrapper.java b/src/main/java/com/seibel/lod/core/wrapperInterfaces/world/IBiomeWrapper.java index 219b66a1a..7efd44049 100644 --- a/src/main/java/com/seibel/lod/core/wrapperInterfaces/world/IBiomeWrapper.java +++ b/src/main/java/com/seibel/lod/core/wrapperInterfaces/world/IBiomeWrapper.java @@ -27,16 +27,6 @@ import com.seibel.lod.core.handlers.dependencyInjection.IBindable; */ public interface IBiomeWrapper extends IBindable { - /** Returns a color int for the given biome. */ - int getColorForBiome(int x, int z); - String getName(); - - int getGrassTint(int x, int z); - - int getFolliageTint(); - - int getWaterTint(); - String serialize(); } diff --git a/src/main/java/com/seibel/lod/core/wrapperInterfaces/world/IClientLevelWrapper.java b/src/main/java/com/seibel/lod/core/wrapperInterfaces/world/IClientLevelWrapper.java new file mode 100644 index 000000000..a7c61b5be --- /dev/null +++ b/src/main/java/com/seibel/lod/core/wrapperInterfaces/world/IClientLevelWrapper.java @@ -0,0 +1,12 @@ +package com.seibel.lod.core.wrapperInterfaces.world; + +import com.seibel.lod.core.objects.DHBlockPos; +import com.seibel.lod.core.wrapperInterfaces.block.IBlockStateWrapper; + +import javax.annotation.Nullable; + +public interface IClientLevelWrapper extends ILevelWrapper { + @Nullable + IServerLevelWrapper tryGetServerSideWrapper(); + int computeBaseColor(DHBlockPos pos, IBiomeWrapper biome, IBlockStateWrapper blockState); +} diff --git a/src/main/java/com/seibel/lod/core/wrapperInterfaces/world/ILevelWrapper.java b/src/main/java/com/seibel/lod/core/wrapperInterfaces/world/ILevelWrapper.java index 754023868..be052de98 100644 --- a/src/main/java/com/seibel/lod/core/wrapperInterfaces/world/ILevelWrapper.java +++ b/src/main/java/com/seibel/lod/core/wrapperInterfaces/world/ILevelWrapper.java @@ -23,7 +23,9 @@ import java.io.File; import com.seibel.lod.core.enums.ELevelType; import com.seibel.lod.core.handlers.dependencyInjection.IBindable; +import com.seibel.lod.core.objects.DHBlockPos; import com.seibel.lod.core.objects.DHChunkPos; +import com.seibel.lod.core.wrapperInterfaces.block.IBlockStateWrapper; import com.seibel.lod.core.wrapperInterfaces.chunk.IChunkWrapper; /** @@ -36,8 +38,6 @@ public interface ILevelWrapper extends IBindable { IDimensionTypeWrapper getDimensionType(); - ELevelType getLevelType(); - int getBlockLight(int x, int y, int z); int getSkyLight(int x, int y, int z); @@ -48,17 +48,16 @@ public interface ILevelWrapper extends IBindable int getHeight(); - int getSeaLevel(); - default short getMinHeight() { return 0; } - - /** @throws UnsupportedOperationException if the WorldWrapper isn't for a ServerWorld */ - File getSaveFolder() throws UnsupportedOperationException; default IChunkWrapper tryGetChunk(DHChunkPos pos) {return null;} boolean hasChunkLoaded(int chunkX, int chunkZ); + + IBlockStateWrapper getBlockState(DHBlockPos pos); + IBiomeWrapper getBiome(DHBlockPos pos); + Object unwrapLevel(); } diff --git a/src/main/java/com/seibel/lod/core/wrapperInterfaces/world/IServerLevelWrapper.java b/src/main/java/com/seibel/lod/core/wrapperInterfaces/world/IServerLevelWrapper.java new file mode 100644 index 000000000..9c09d0290 --- /dev/null +++ b/src/main/java/com/seibel/lod/core/wrapperInterfaces/world/IServerLevelWrapper.java @@ -0,0 +1,11 @@ +package com.seibel.lod.core.wrapperInterfaces.world; + +import javax.annotation.Nullable; +import java.io.File; + +public interface IServerLevelWrapper extends ILevelWrapper { + @Nullable + IClientLevelWrapper tryGetClientSideWrapper(); + + File getSaveFolder(); +}