diff --git a/src/main/java/com/seibel/lod/core/builders/bufferBuilding/CubicLodTemplate.java b/src/main/java/com/seibel/lod/core/builders/bufferBuilding/CubicLodTemplate.java index 2a7198973..a3307ce65 100644 --- a/src/main/java/com/seibel/lod/core/builders/bufferBuilding/CubicLodTemplate.java +++ b/src/main/java/com/seibel/lod/core/builders/bufferBuilding/CubicLodTemplate.java @@ -134,7 +134,7 @@ public class CubicLodTemplate color = vertexOptimizer.getColor(lodDirection); addPosAndColor(buffer, vertexOptimizer.getX(lodDirection, vertexIndex), - vertexOptimizer.getY(lodDirection, vertexIndex, verticalFaceIndex) + DataPointUtil.VERTICAL_OFFSET, + vertexOptimizer.getY(lodDirection, vertexIndex, verticalFaceIndex), vertexOptimizer.getZ(lodDirection, vertexIndex), color, skyLight, blockLight ); } diff --git a/src/main/java/com/seibel/lod/core/builders/lodBuilding/LodBuilder.java b/src/main/java/com/seibel/lod/core/builders/lodBuilding/LodBuilder.java index 805fd1015..247b8b6c0 100644 --- a/src/main/java/com/seibel/lod/core/builders/lodBuilding/LodBuilder.java +++ b/src/main/java/com/seibel/lod/core/builders/lodBuilding/LodBuilder.java @@ -285,7 +285,7 @@ public class LodBuilder lightSky = (light >> 4) & 0b1111; isDefault = ((light >> 8)) == 1; - dataToMerge[index * verticalData + count] = DataPointUtil.createDataPoint(height - DataPointUtil.VERTICAL_OFFSET, depth - DataPointUtil.VERTICAL_OFFSET, color, lightSky, lightBlock, generation, isDefault); + dataToMerge[index * verticalData + count] = DataPointUtil.createDataPoint(height, depth, color, lightSky, lightBlock, generation, isDefault); topBlock = false; yAbs = depth - 1; count++; 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 f8e5e1f1e..830ae7230 100644 --- a/src/main/java/com/seibel/lod/core/handlers/LodDimensionFileHandler.java +++ b/src/main/java/com/seibel/lod/core/handlers/LodDimensionFileHandler.java @@ -78,7 +78,7 @@ public class LodDimensionFileHandler * file handler, older versions (smaller numbers) will be deleted and overwritten, * newer versions (larger numbers) will be ignored and won't be read. */ - public static final int LOD_SAVE_FILE_VERSION = 7; + public static final int LOD_SAVE_FILE_VERSION = 8; /** * Allow saving asynchronously, but never try to save multiple regions @@ -208,14 +208,14 @@ public class LodDimensionFileHandler break; } - else if (fileVersion == 6) + else if (fileVersion < LOD_SAVE_FILE_VERSION) { //this is old, but readable version byte[] data = ThreadMapUtil.getSaveContainer(tempDetailLevel); inputStream.read(data); inputStream.close(); // add the data to our region - region.addLevelContainer(new VerticalLevelContainer(data, 6)); + region.addLevelContainer(new VerticalLevelContainer(data, fileVersion)); } else { // this file is a readable version, 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 2f1c19548..f45bb047c 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 @@ -24,6 +24,7 @@ import com.seibel.lod.core.util.DetailDistanceUtil; import com.seibel.lod.core.util.LevelPosUtil; import com.seibel.lod.core.util.LodUtil; import com.seibel.lod.core.util.ThreadMapUtil; +import com.seibel.lod.forge.wrappers.VersionConstants; /** * @@ -123,6 +124,7 @@ public class VerticalLevelContainer implements LevelContainer size = 1 << (LodUtil.REGION_DETAIL_LEVEL - detailLevel); int x = size * size * tempMaxVerticalData; long[] tempDataContainer = new long[x]; + short minHeight = (short) VersionConstants.INSTANCE.getMinimumWorldHeight(); if (version == 6) { @@ -138,17 +140,17 @@ public class VerticalLevelContainer implements LevelContainer DataPointUtil.getRed(newData), DataPointUtil.getGreen(newData), DataPointUtil.getBlue(newData), - DataPointUtil.getHeight(newData) - DataPointUtil.VERTICAL_OFFSET, - DataPointUtil.getDepth(newData) - DataPointUtil.VERTICAL_OFFSET, + DataPointUtil.getHeight(newData) - minHeight, + DataPointUtil.getDepth(newData) - minHeight, DataPointUtil.getLightSky(newData), DataPointUtil.getLightBlock(newData), DataPointUtil.getGenerationMode(newData), - DataPointUtil.getFlag(newData) - ); + DataPointUtil.getFlag(newData)); + tempDataContainer[i] = newData; } } - else //if (version == 7) + else if (version == 7) { for (int i = 0; i < x; i++) { @@ -156,9 +158,63 @@ public class VerticalLevelContainer implements LevelContainer for (tempIndex = 0; tempIndex < 8; tempIndex++) newData += (((long) inputData[index + tempIndex]) & 0xff) << (8 * tempIndex); index += 8; + + newData = DataPointUtil.createDataPoint( + DataPointUtil.getAlpha(newData), + DataPointUtil.getRed(newData), + DataPointUtil.getGreen(newData), + DataPointUtil.getBlue(newData), + DataPointUtil.getHeight(newData) - 64 - minHeight, + DataPointUtil.getDepth(newData) - 64 - minHeight, + DataPointUtil.getLightSky(newData), + DataPointUtil.getLightBlock(newData), + DataPointUtil.getGenerationMode(newData), + DataPointUtil.getFlag(newData)); + tempDataContainer[i] = newData; } } + else //if (version == 8) + { + short tempMinHeight = inputData[index]; + index++; + tempMinHeight |= inputData[index] << 8; + index++; + if (tempMinHeight != minHeight) + { + for (int i = 0; i < x; i++) + { + newData = 0; + for (tempIndex = 0; tempIndex < 8; tempIndex++) + newData |= ((long) inputData[index + tempIndex]) << (8 * tempIndex); + index += 8; + newData = DataPointUtil.createDataPoint( + DataPointUtil.getAlpha(newData), + DataPointUtil.getRed(newData), + DataPointUtil.getGreen(newData), + DataPointUtil.getBlue(newData), + DataPointUtil.getHeight(newData) + tempMinHeight - minHeight, + DataPointUtil.getDepth(newData) + tempMinHeight - minHeight, + DataPointUtil.getLightSky(newData), + DataPointUtil.getLightBlock(newData), + DataPointUtil.getGenerationMode(newData), + DataPointUtil.getFlag(newData)); + + tempDataContainer[i] = newData; + } + } + else + { + for (int i = 0; i < x; i++) + { + newData = 0; + for (tempIndex = 0; tempIndex < 8; tempIndex++) + newData |= ((long) inputData[index + tempIndex]) << (8 * tempIndex); + index += 8; + tempDataContainer[i] = newData; + } + } + } if (tempMaxVerticalData > DetailDistanceUtil.getMaxVerticalData(detailLevel)) { @@ -221,11 +277,17 @@ public class VerticalLevelContainer implements LevelContainer long current; boolean allGenerated = true; byte[] tempData = ThreadMapUtil.getSaveContainer(detailLevel); + short minHeight = (short) VersionConstants.INSTANCE.getMinimumWorldHeight(); tempData[index] = detailLevel; index++; tempData[index] = (byte) maxVerticalData; index++; + tempData[index] = (byte) (minHeight & 0xFF); + index++; + tempData[index] = (byte) ((minHeight >> 8) & 0xFF); + index++; + int j; for (int i = 0; i < x; i++) { diff --git a/src/main/java/com/seibel/lod/core/util/ThreadMapUtil.java b/src/main/java/com/seibel/lod/core/util/ThreadMapUtil.java index 7cf8405b3..f2bc10781 100644 --- a/src/main/java/com/seibel/lod/core/util/ThreadMapUtil.java +++ b/src/main/java/com/seibel/lod/core/util/ThreadMapUtil.java @@ -145,7 +145,7 @@ public class ThreadMapUtil int size = 1; for (int i = LodUtil.DETAIL_OPTIONS - 1; i >= 0; i--) { - array[i] = new byte[2 + 8 * size * size * DetailDistanceUtil.getMaxVerticalData(i)]; + array[i] = new byte[4 + 8 * size * size * DetailDistanceUtil.getMaxVerticalData(i)]; size = size << 1; } saveContainer.put(Thread.currentThread().getName(), array);