From 44dc7c96af01526479788c6ea6f6a3b81ca1329a Mon Sep 17 00:00:00 2001 From: cola98765 Date: Thu, 2 Dec 2021 17:26:05 +0100 Subject: [PATCH] UNTESTED: when loading and no save was found it will try to look in better DistanceGenerationMode AND VerticalQuality --- .../handlers/LodDimensionFileHandler.java | 44 +++++++++------ .../objects/lod/VerticalLevelContainer.java | 56 +++++++++++-------- 2 files changed, 62 insertions(+), 38 deletions(-) diff --git a/src/main/java/com/seibel/lod/core/handlers/LodDimensionFileHandler.java b/src/main/java/com/seibel/lod/core/handlers/LodDimensionFileHandler.java index e9312ade8..f8e5e1f1e 100644 --- a/src/main/java/com/seibel/lod/core/handlers/LodDimensionFileHandler.java +++ b/src/main/java/com/seibel/lod/core/handlers/LodDimensionFileHandler.java @@ -130,28 +130,40 @@ public class LodDimensionFileHandler { //there is no file for current gen mode //search others above current from the most to the least detailed - DistanceGenerationMode tempGenMode = DistanceGenerationMode.FULL; - while (tempGenMode != generationMode) - { - fileName = getFileNameAndPathForRegion(regionX, regionZ, tempGenMode, tempDetailLevel, verticalQuality); + VerticalQuality tempVerticalQuality = VerticalQuality.HIGH; + do { + DistanceGenerationMode tempGenMode = DistanceGenerationMode.FULL; + do { + fileName = getFileNameAndPathForRegion(regionX, regionZ, tempGenMode, tempDetailLevel, verticalQuality); + if (fileName != null) + { + file = new File(fileName); + if (file.exists()) + break; + } + //decrease gen mode + if (tempGenMode == DistanceGenerationMode.FULL) + tempGenMode = DistanceGenerationMode.FEATURES; + else if (tempGenMode == DistanceGenerationMode.FEATURES) + tempGenMode = DistanceGenerationMode.SURFACE; + else if (tempGenMode == DistanceGenerationMode.SURFACE) + tempGenMode = DistanceGenerationMode.BIOME_ONLY_SIMULATE_HEIGHT; + else if (tempGenMode == DistanceGenerationMode.BIOME_ONLY_SIMULATE_HEIGHT) + tempGenMode = DistanceGenerationMode.BIOME_ONLY; + else if (tempGenMode == DistanceGenerationMode.BIOME_ONLY) + tempGenMode = DistanceGenerationMode.NONE; + } while (tempGenMode != generationMode); if (fileName != null) { file = new File(fileName); if (file.exists()) break; } - //decrease gen mode - if (tempGenMode == DistanceGenerationMode.FULL) - tempGenMode = DistanceGenerationMode.FEATURES; - else if (tempGenMode == DistanceGenerationMode.FEATURES) - tempGenMode = DistanceGenerationMode.SURFACE; - else if (tempGenMode == DistanceGenerationMode.SURFACE) - tempGenMode = DistanceGenerationMode.BIOME_ONLY_SIMULATE_HEIGHT; - else if (tempGenMode == DistanceGenerationMode.BIOME_ONLY_SIMULATE_HEIGHT) - tempGenMode = DistanceGenerationMode.BIOME_ONLY; - else if (tempGenMode == DistanceGenerationMode.BIOME_ONLY) - tempGenMode = DistanceGenerationMode.NONE; - } + if (tempVerticalQuality == VerticalQuality.HIGH) + tempVerticalQuality = VerticalQuality.MEDIUM; + else if (tempVerticalQuality == VerticalQuality.MEDIUM) + tempVerticalQuality = VerticalQuality.LOW; + } while (tempVerticalQuality != verticalQuality); if (!file.exists()) //there wasn't a file, don't return anything continue; diff --git a/src/main/java/com/seibel/lod/core/objects/lod/VerticalLevelContainer.java b/src/main/java/com/seibel/lod/core/objects/lod/VerticalLevelContainer.java index 8dd318186..f813a9a86 100644 --- a/src/main/java/com/seibel/lod/core/objects/lod/VerticalLevelContainer.java +++ b/src/main/java/com/seibel/lod/core/objects/lod/VerticalLevelContainer.java @@ -124,18 +124,20 @@ public class VerticalLevelContainer implements LevelContainer public VerticalLevelContainer(byte[] inputData, int version) { + int tempMaxVerticalData; + int tempIndex; + int index = 0; + long newData; + detailLevel = inputData[index]; + index++; + tempMaxVerticalData = inputData[index] & 0b01111111; + index++; + size = 1 << (LodUtil.REGION_DETAIL_LEVEL - detailLevel); + int x = size * size * tempMaxVerticalData; + long[] tempDataContainer = new long[x]; + if (version == 6) { - int tempIndex; - int index = 0; - long newData; - detailLevel = inputData[index]; - index++; - maxVerticalData = inputData[index] & 0b01111111; - index++; - size = 1 << (LodUtil.REGION_DETAIL_LEVEL - detailLevel); - int x = size * size * maxVerticalData; - this.dataContainer = new long[x]; for (int i = 0; i < x; i++) { newData = 0; @@ -155,30 +157,40 @@ public class VerticalLevelContainer implements LevelContainer DataPointUtil.getGenerationMode(newData), DataPointUtil.getFlag(newData) ); - dataContainer[i] = newData; + tempDataContainer[i] = newData; } } else //if (version == 7) { - int tempIndex; - int index = 0; - long newData; - detailLevel = inputData[index]; - index++; - maxVerticalData = inputData[index] & 0b01111111; - index++; - size = 1 << (LodUtil.REGION_DETAIL_LEVEL - detailLevel); - int x = size * size * maxVerticalData; - this.dataContainer = new long[x]; for (int i = 0; i < x; i++) { newData = 0; for (tempIndex = 0; tempIndex < 8; tempIndex++) newData += (((long) inputData[index + tempIndex]) & 0xff) << (8 * tempIndex); index += 8; - dataContainer[i] = newData; + tempDataContainer[i] = newData; } } + + if (tempMaxVerticalData > DetailDistanceUtil.getMaxVerticalData(detailLevel)) + { + int tempMaxVerticalData2 = DetailDistanceUtil.getMaxVerticalData(detailLevel); + long[] dataToMerge = new long[tempMaxVerticalData]; + long[] tempDataContainer2 = new long[size * size * tempMaxVerticalData2]; + for (int i = 0; i < size * size; i++) + { + System.arraycopy(tempDataContainer, i * tempMaxVerticalData, dataToMerge, 0, tempMaxVerticalData); + dataToMerge = DataPointUtil.mergeMultiData(dataToMerge, tempMaxVerticalData, tempMaxVerticalData2); + System.arraycopy(dataToMerge, 0, tempDataContainer2, i * tempMaxVerticalData2, tempMaxVerticalData2); + } + maxVerticalData = tempMaxVerticalData2; + this.dataContainer = tempDataContainer2; + } + else + { + maxVerticalData = tempMaxVerticalData; + this.dataContainer = tempDataContainer; + } } @Override