diff --git a/src/main/java/com/seibel/lod/builders/worldGeneration/LodNodeGenWorker.java b/src/main/java/com/seibel/lod/builders/worldGeneration/LodNodeGenWorker.java index 519527b8d..1b5c3074e 100644 --- a/src/main/java/com/seibel/lod/builders/worldGeneration/LodNodeGenWorker.java +++ b/src/main/java/com/seibel/lod/builders/worldGeneration/LodNodeGenWorker.java @@ -32,6 +32,7 @@ import com.seibel.lod.builders.lodBuilding.LodBuilder; import com.seibel.lod.builders.lodBuilding.LodBuilderConfig; import com.seibel.lod.config.LodConfig; import com.seibel.lod.enums.DistanceGenerationMode; +import com.seibel.lod.handlers.ChunkLoader; import com.seibel.lod.objects.LodDimension; import com.seibel.lod.proxy.ClientProxy; import com.seibel.lod.util.LodUtil; @@ -183,29 +184,36 @@ public class LodNodeGenWorker implements IWorker if (lodDim.regionIsInRange(pos.x / LodUtil.REGION_WIDTH_IN_CHUNKS, pos.z / LodUtil.REGION_WIDTH_IN_CHUNKS)) { // long startTime = System.currentTimeMillis(); - - switch (generationMode) + IChunk loadedChunk = ChunkLoader.getChunkFromFile(pos); + if(loadedChunk == null) { - case NONE: - // don't generate - break; - case BIOME_ONLY: - case BIOME_ONLY_SIMULATE_HEIGHT: - // fastest - generateUsingBiomesOnly(); - break; - case SURFACE: - // faster - generateUsingSurface(); - break; - case FEATURES: - // fast - generateUsingFeatures(); - break; - case SERVER: - // very slow - generateWithServer(); - break; + switch (generationMode) + { + case NONE: + // don't generate + break; + case BIOME_ONLY: + case BIOME_ONLY_SIMULATE_HEIGHT: + // fastest + generateUsingBiomesOnly(); + break; + case SURFACE: + // faster + generateUsingSurface(); + break; + case FEATURES: + // fast + generateUsingFeatures(); + break; + case SERVER: + // very slow + generateWithServer(); + break; + } + } + else + { + lodBuilder.generateLodNodeFromChunk(lodDim, loadedChunk, new LodBuilderConfig(DistanceGenerationMode.SERVER)); } //lodRenderer.regenerateLODsNextFrame(); diff --git a/src/main/java/com/seibel/lod/handlers/ChunkLoader.java b/src/main/java/com/seibel/lod/handlers/ChunkLoader.java new file mode 100644 index 000000000..dd08d0945 --- /dev/null +++ b/src/main/java/com/seibel/lod/handlers/ChunkLoader.java @@ -0,0 +1,48 @@ +package com.seibel.lod.handlers; + +import com.seibel.lod.util.LodUtil; +import com.seibel.lod.wrappers.MinecraftWrapper; +import net.minecraft.client.world.ClientWorld; +import net.minecraft.nbt.CompoundNBT; +import net.minecraft.util.datafix.DataFixesManager; +import net.minecraft.util.math.ChunkPos; +import net.minecraft.world.chunk.IChunk; +import net.minecraft.world.chunk.storage.ChunkSerializer; +import net.minecraft.world.server.ServerWorld; + +import java.io.File; + +public class ChunkLoader +{ + public static IChunk getChunkFromFile(ChunkPos pos){ + + ClientWorld clientWorld = MinecraftWrapper.INSTANCE.getClientWorld(); + if (clientWorld == null) + return null; + ServerWorld serverWorld = LodUtil.getServerWorldFromDimension(clientWorld.dimensionType()); + try + { + IChunk loadedChunk = ChunkSerializer.read( + serverWorld, + serverWorld.getStructureManager(), + serverWorld.getPoiManager(), + pos, + serverWorld.getChunkSource().chunkMap.read(pos) + ); + boolean emptyChunk = true; + for(int i = 0; i < 16; i++){ + for(int j = 0; j < 16; j++){ + emptyChunk &= loadedChunk.isYSpaceEmpty(i,j); + } + } + if(emptyChunk) + return null; + else + return loadedChunk; + } + catch (Exception e) + { + return null; + } + } +}