From e3e8ef705a4688dfd43763cff461b625c619215c Mon Sep 17 00:00:00 2001 From: Leonardo Date: Sat, 28 Aug 2021 12:22:09 +0200 Subject: [PATCH] geneartionType is no longer used in LodRegion. Every region has a generationMode (+ server) --- 1.4 release notes.txt | Bin 5576 -> 6416 bytes .../com/seibel/lod/builders/LodBuilder.java | 1 - .../lod/handlers/LodDimensionFileHandler.java | 12 +- .../seibel/lod/objects/LevelContainer.java | 12 +- .../com/seibel/lod/objects/LodDimension.java | 48 ++------ .../com/seibel/lod/objects/LodRegion.java | 106 ++++-------------- 6 files changed, 41 insertions(+), 138 deletions(-) diff --git a/1.4 release notes.txt b/1.4 release notes.txt index 1591cf32aa56e62bac7ab25bbe39751664c7bc97..46d4df2f8540834c95f605acfcf95dae334a36dc 100644 GIT binary patch delta 734 zcmZ8f+e*Vg5FM+aC}K+~zNiFzsHLTd;177EPl5>gnl{@sv`w^4tv;3hfsh{&`VE4g zWF!IhT`_q3czTG&(nmbPKFtnlwM8QD zxSwD}KpSZR*9UHb?^rV=Zd;+)+WS zdIDgkICZJxM5zk+KRK&r`E=uwjyhU}`s?7f3DhyfzEDVKj2Q{&E<38U_ULG?YU1p8 z=kS5KR_&|$AsZPO_cfPZ*)L{A>Z|C9^F`+d>ppwit}f`3{bkHoelm>Ix69yN2tImX zg)^=00h0jBNm=Ar8nQ3DID7KEroi!}d1b05Pbel^Zc&5nIQas3T&u=O`Z}i=cXVpx zL$kSeb78(^>>)M-w^4q_YyT4d8SH2mh@x|$Bv(1yN84<%yy*Zt3fD9hjW)2Y92m|F4I(v6n}x*xF#-TrH3vBW diff --git a/src/main/java/com/seibel/lod/builders/LodBuilder.java b/src/main/java/com/seibel/lod/builders/LodBuilder.java index 0ef114ea1..1348187e2 100644 --- a/src/main/java/com/seibel/lod/builders/LodBuilder.java +++ b/src/main/java/com/seibel/lod/builders/LodBuilder.java @@ -193,7 +193,6 @@ public class LodBuilder data = DataPoint.createDataPoint(height, depth, color[0], color[1], color[2]); lodDim.addData(levelPos, data, - config.distanceGenerationMode, false); } //levelPos.changeParameters(LodUtil.CHUNK_DETAIL_LEVEL, chunk.getPos().x, chunk.getPos().z); diff --git a/src/main/java/com/seibel/lod/handlers/LodDimensionFileHandler.java b/src/main/java/com/seibel/lod/handlers/LodDimensionFileHandler.java index 346399c9c..8dfe98099 100644 --- a/src/main/java/com/seibel/lod/handlers/LodDimensionFileHandler.java +++ b/src/main/java/com/seibel/lod/handlers/LodDimensionFileHandler.java @@ -27,6 +27,7 @@ import java.nio.file.StandardCopyOption; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; +import com.seibel.lod.enums.DistanceGenerationMode; import com.seibel.lod.objects.LevelContainer; import com.seibel.lod.objects.LodDimension; import com.seibel.lod.objects.LodRegion; @@ -125,16 +126,16 @@ public class LodDimensionFileHandler * Return the LodRegion region at the given coordinates. * (null if the file doesn't exist) */ - public LodRegion loadRegionFromFile(byte detailLevel, RegionPos regionPos) + public LodRegion loadRegionFromFile(byte detailLevel, RegionPos regionPos, DistanceGenerationMode generationMode) { int regionX = regionPos.x; int regionZ = regionPos.z; - LodRegion region = new LodRegion(LodUtil.REGION_DETAIL_LEVEL,regionPos); + LodRegion region = new LodRegion(LodUtil.REGION_DETAIL_LEVEL,regionPos, generationMode); for (byte tempDetailLevel = LodUtil.REGION_DETAIL_LEVEL; tempDetailLevel >= detailLevel; tempDetailLevel--) { try { - String fileName = getFileNameAndPathForRegion(regionX, regionZ, tempDetailLevel); + String fileName = getFileNameAndPathForRegion(regionX, regionZ, generationMode, tempDetailLevel); // if the fileName was null that means the folder is inaccessible // for some reason @@ -266,7 +267,7 @@ public class LodDimensionFileHandler int z = region.regionPosZ; for (byte detailLevel = region.getMinDetailLevel(); detailLevel <= LodUtil.REGION_DETAIL_LEVEL; detailLevel++) { - String fileName = getFileNameAndPathForRegion(x, z, detailLevel); + String fileName = getFileNameAndPathForRegion(x, z, region.getGenerationMode(), detailLevel); File oldFile = new File(fileName); // if the fileName was null that means the folder is inaccessible @@ -362,7 +363,7 @@ public class LodDimensionFileHandler *

* Returns null if there is an IO Exception. */ - private String getFileNameAndPathForRegion(int regionX, int regionZ, byte detailLevel) + private String getFileNameAndPathForRegion(int regionX, int regionZ, DistanceGenerationMode generationMode, byte detailLevel) { try { @@ -371,6 +372,7 @@ public class LodDimensionFileHandler // or // ".\Super Flat\data" return dimensionDataSaveFolder.getCanonicalPath() + File.separatorChar + + generationMode.toString() + File.separatorChar + DETAIL_FOLDER_NAME_PREFIX + detailLevel + File.separatorChar + FILE_NAME_PREFIX + "." + regionX + "." + regionZ + FILE_EXTENSION; } catch (IOException | SecurityException e) diff --git a/src/main/java/com/seibel/lod/objects/LevelContainer.java b/src/main/java/com/seibel/lod/objects/LevelContainer.java index 75795b064..da1d47aae 100644 --- a/src/main/java/com/seibel/lod/objects/LevelContainer.java +++ b/src/main/java/com/seibel/lod/objects/LevelContainer.java @@ -17,17 +17,14 @@ public class LevelContainer implements Serializable public final short[][] depth; - public final byte[][] generationType; - public final boolean[][] dataExistence; - public LevelContainer(byte detailLevel, byte[][][] colors, short[][] height, short[][] depth, byte[][] generationType, boolean[][] dataExistence) + public LevelContainer(byte detailLevel, byte[][][] colors, short[][] height, short[][] depth, boolean[][] dataExistence) { this.detailLevel = detailLevel; this.colors = colors; this.height = height; this.depth = depth; - this.generationType = generationType; this.dataExistence = dataExistence; } @@ -45,7 +42,6 @@ public class LevelContainer implements Serializable this.colors = new byte[size][size][3]; this.height = new short[size][size]; this.depth = new short[size][size]; - this.generationType = new byte[size][size]; this.dataExistence = new boolean[size][size]; int intCol; for (int x = 0; x < size; x++) @@ -67,10 +63,6 @@ public class LevelContainer implements Serializable index = data.indexOf(DATA_DELIMITER, lastIndex + 1); depth[x][z] = Short.parseShort(data.substring(lastIndex + 1, index), 16); - lastIndex = index; - index = data.indexOf(DATA_DELIMITER, lastIndex + 1); - generationType[x][z] = Byte.parseByte(data.substring(lastIndex + 1, index), 16); - lastIndex = index; index = data.indexOf(DATA_DELIMITER, lastIndex + 1); dataExistence[x][z] = Boolean.parseBoolean(data.substring(lastIndex + 1, index)); @@ -99,8 +91,6 @@ public class LevelContainer implements Serializable stringBuilder.append(DATA_DELIMITER); stringBuilder.append(Integer.toHexString(depth[x][z] & 0xffff)); stringBuilder.append(DATA_DELIMITER); - stringBuilder.append(Integer.toHexString(generationType[x][z] & 0xffff)); - stringBuilder.append(DATA_DELIMITER); stringBuilder.append(dataExistence[x][z]); stringBuilder.append(DATA_DELIMITER); } diff --git a/src/main/java/com/seibel/lod/objects/LodDimension.java b/src/main/java/com/seibel/lod/objects/LodDimension.java index 58e8af8c3..9881c4e13 100644 --- a/src/main/java/com/seibel/lod/objects/LodDimension.java +++ b/src/main/java/com/seibel/lod/objects/LodDimension.java @@ -28,6 +28,7 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import com.seibel.lod.enums.DistanceGenerationMode; +import com.seibel.lod.handlers.LodConfig; import com.seibel.lod.handlers.LodDimensionFileHandler; import com.seibel.lod.objects.LevelPos.LevelPos; import com.seibel.lod.util.DetailDistanceUtil; @@ -367,7 +368,7 @@ public class LodDimension */ public void treeGenerator(int playerPosX, int playerPosZ) { - + DistanceGenerationMode generationMode = LodConfig.CLIENT.distanceGenerationMode.get(); ChunkPos newPlayerChunk = (new LevelPos((byte) 0, playerPosX, playerPosZ)).getChunkPos(); if (lastGenChunk == null) @@ -399,17 +400,17 @@ public class LodDimension minDistance = levelPos.minDistance(playerPosX, playerPosZ); detail = DetailDistanceUtil.getDistanceTreeGenInverse(minDistance); levelToGen = DetailDistanceUtil.getLodDetail(detail).detailLevel; - if (region == null) + if (region == null || region.getGenerationMode() != generationMode) { //First case, region has to be initialized //We check if there is a file at the target level - regions[x][z] = getRegionFromFile(regionPos, levelToGen); + regions[x][z] = getRegionFromFile(regionPos, levelToGen, generationMode); //if there is no file we initialize the region if (regions[x][z] == null) { - regions[x][z] = new LodRegion(levelToGen, regionPos); + regions[x][z] = new LodRegion(levelToGen, regionPos, generationMode); } } else if (region.getMinDetailLevel() > levelToGen) @@ -430,7 +431,7 @@ public class LodDimension * stored in the LOD. If an LOD already exists at the given * coordinates it will be overwritten. */ - public synchronized Boolean addData(LevelPos levelPos, short[] lodDataPoint, DistanceGenerationMode generationMode, boolean dontSave) + public synchronized Boolean addData(LevelPos levelPos, short[] lodDataPoint, boolean dontSave) { // don't continue if the region can't be saved @@ -442,7 +443,7 @@ public class LodDimension LodRegion region = getRegion(levelPos); - boolean nodeAdded = region.addData(levelPos, lodDataPoint, generationMode.complexity); + boolean nodeAdded = region.addData(levelPos, lodDataPoint); // only save valid LODs to disk if (!dontSave && fileHandler != null) { @@ -590,22 +591,6 @@ public class LodDimension region.updateArea(levelPos); } - /** - * return true if and only if the node at that position exist - */ - - public boolean hasThisPositionBeenGenerated(LevelPos levelPos) - { - LodRegion region = getRegion(levelPos); - - if (region == null) - { - return false; - } - - return region.hasDataBeenGenerated(levelPos); - } - /** * return true if and only if the node at that position exist */ @@ -627,29 +612,14 @@ public class LodDimension } } - /** - * return true if and only if the node at that position exist - */ - public DistanceGenerationMode getGenerationMode(LevelPos levelPos) - { - LodRegion region = getRegion(levelPos); - - if (region == null) - { - return DistanceGenerationMode.NONE; - } - - return region.getGenerationMode(levelPos); - } - /** * Get the region at the given X and Z coordinates from the * RegionFileHandler. */ - public LodRegion getRegionFromFile(RegionPos regionPos, byte detailLevel) + public LodRegion getRegionFromFile(RegionPos regionPos, byte detailLevel, DistanceGenerationMode generationMode) { if (fileHandler != null) - return fileHandler.loadRegionFromFile(detailLevel, regionPos); + return fileHandler.loadRegionFromFile(detailLevel, regionPos, generationMode); else return null; } diff --git a/src/main/java/com/seibel/lod/objects/LodRegion.java b/src/main/java/com/seibel/lod/objects/LodRegion.java index 5233ec10a..f76178a03 100644 --- a/src/main/java/com/seibel/lod/objects/LodRegion.java +++ b/src/main/java/com/seibel/lod/objects/LodRegion.java @@ -28,7 +28,7 @@ public class LodRegion implements Serializable private byte minDetailLevel; private static final byte POSSIBLE_LOD = 10; private int numberOfPoints; - + private DistanceGenerationMode generationMode; //For each of the following field the first slot is for the level of detail //Important: byte have a [-128, 127] range. When converting from or to int a 128 should be added or removed //If there is a bug with color then it's probably caused by this. @@ -39,17 +39,14 @@ public class LodRegion implements Serializable private short[][][] depth; - //a new node will have 0 as generationType - //a node with 1 is node - private byte[][][] generationType; - private boolean[][][] dataExistence; public final int regionPosX; public final int regionPosZ; - public LodRegion(LevelContainer levelContainer, RegionPos regionPos) + public LodRegion(LevelContainer levelContainer, RegionPos regionPos, DistanceGenerationMode generationMode) { + this.generationMode = generationMode; this.regionPosX = regionPos.x; this.regionPosZ = regionPos.z; this.minDetailLevel = levelContainer.detailLevel; @@ -60,13 +57,11 @@ public class LodRegion implements Serializable //Arrays of matrices height = new short[POSSIBLE_LOD][][]; depth = new short[POSSIBLE_LOD][][]; - generationType = new byte[POSSIBLE_LOD][][]; dataExistence = new boolean[POSSIBLE_LOD][][]; colors[minDetailLevel] = levelContainer.colors; height[minDetailLevel] = levelContainer.height; depth[minDetailLevel] = levelContainer.depth; - generationType[minDetailLevel] = levelContainer.generationType; dataExistence[minDetailLevel] = levelContainer.dataExistence; //Initialize all the different matrices @@ -76,7 +71,6 @@ public class LodRegion implements Serializable colors[lod] = new byte[size][size][3]; height[lod] = new short[size][size]; depth[lod] = new short[size][size]; - generationType[lod] = new byte[size][size]; dataExistence[lod] = new boolean[size][size]; } int width; @@ -95,8 +89,9 @@ public class LodRegion implements Serializable } } - public LodRegion(byte minDetailLevel, RegionPos regionPos) + public LodRegion(byte minDetailLevel, RegionPos regionPos, DistanceGenerationMode generationMode) { + this.generationMode = generationMode; this.minDetailLevel = minDetailLevel; this.regionPosX = regionPos.x; this.regionPosZ = regionPos.z; @@ -107,7 +102,6 @@ public class LodRegion implements Serializable //Arrays of matrices height = new short[POSSIBLE_LOD][][]; depth = new short[POSSIBLE_LOD][][]; - generationType = new byte[POSSIBLE_LOD][][]; dataExistence = new boolean[POSSIBLE_LOD][][]; @@ -118,7 +112,6 @@ public class LodRegion implements Serializable colors[lod] = new byte[size][size][3]; height[lod] = new short[size][size]; depth[lod] = new short[size][size]; - generationType[lod] = new byte[size][size]; dataExistence[lod] = new boolean[size][size]; } @@ -129,13 +122,12 @@ public class LodRegion implements Serializable * * @param levelPos * @param dataPoint - * @param generationType * @return */ - public boolean addData(LevelPos levelPos, short[] dataPoint, byte generationType) + public boolean addData(LevelPos levelPos, short[] dataPoint) { levelPos.performRegionModule(); - if ((this.generationType[levelPos.detailLevel][levelPos.posX][levelPos.posZ] == 0) || (generationType >= this.generationType[levelPos.detailLevel][levelPos.posX][levelPos.posZ])) + if (!doesDataExist(levelPos)) { //update the number of node present @@ -147,7 +139,6 @@ public class LodRegion implements Serializable this.colors[levelPos.detailLevel][levelPos.posX][levelPos.posZ][0] = (byte) (DataPoint.getRed(dataPoint) - 128); this.colors[levelPos.detailLevel][levelPos.posX][levelPos.posZ][1] = (byte) (DataPoint.getGreen(dataPoint) - 128); this.colors[levelPos.detailLevel][levelPos.posX][levelPos.posZ][2] = (byte) (DataPoint.getBlue(dataPoint) - 128); - this.generationType[levelPos.detailLevel][levelPos.posX][levelPos.posZ] = generationType; this.dataExistence[levelPos.detailLevel][levelPos.posX][levelPos.posZ] = true; return true; } else @@ -241,7 +232,7 @@ public class LodRegion implements Serializable } else if (DetailDistanceUtil.getDistanceGenerationInverse(maxDistance,targetDetailLevel) == levelPos.detailLevel) { - if (generationType[detailLevel][posX][posZ] < generation) + if (!doesDataExist(levelPos)) { levelPosList.add(new LevelPos(detailLevel, posX + regionPosX * size, posZ + regionPosZ * size)); } @@ -258,7 +249,7 @@ public class LodRegion implements Serializable { levelPos.changeParameters((byte) (detailLevel - 1), childPosX + x, childPosZ + z); - if (generationType[levelPos.detailLevel][levelPos.posX][levelPos.posZ] < generation || !doesDataExist(levelPos)) + if (!doesDataExist(levelPos)) { num++; levelPosList.add(new LevelPos(levelPos.detailLevel, levelPos.posX + regionPosX * childSize, levelPos.posZ + regionPosZ * childSize)); @@ -284,7 +275,7 @@ public class LodRegion implements Serializable { levelPos.changeParameters(levelPos.detailLevel, levelPos.posX, levelPos.posZ); levelPos.convert((byte) (levelPos.detailLevel - 1)); - if (generationType[levelPos.detailLevel][levelPos.posX][levelPos.posZ] < generation) + if (!doesDataExist(levelPos)) { levelPosList.add(new LevelPos(levelPos.detailLevel, levelPos.posX + regionPosX * childSize, levelPos.posZ + regionPosZ * childSize)); } else @@ -296,7 +287,6 @@ public class LodRegion implements Serializable } } } - return; } @@ -406,7 +396,6 @@ public class LodRegion implements Serializable int numberOfChildren = 0; int numberOfVoidChildren = 0; - byte minGenerationType = 5; int tempRed = 0; int tempGreen = 0; int tempBlue = 0; @@ -426,7 +415,7 @@ public class LodRegion implements Serializable newPosZ = 2 * posZ + z; newDetailLevel = (byte) (detailLevel - 1); levelPos.changeParameters(newDetailLevel, newPosX, newPosZ); - if (hasDataBeenGenerated(levelPos)) + if (doesDataExist(levelPos)) { if (height[newDetailLevel][newPosX][newPosZ] != LodBuilder.DEFAULT_HEIGHT && depth[newDetailLevel][newPosX][newPosZ] != LodBuilder.DEFAULT_DEPTH) @@ -444,8 +433,6 @@ public class LodRegion implements Serializable // and represent a LOD with no blocks in it numberOfVoidChildren++; } - - minGenerationType = (byte) Math.min(minGenerationType, generationType[newDetailLevel][newPosX][newPosZ]); } } } @@ -457,7 +444,6 @@ public class LodRegion implements Serializable colors[detailLevel][posX][posZ][2] = (byte) (tempBlue / numberOfChildren); height[detailLevel][posX][posZ] = (short) (tempHeight / numberOfChildren); depth[detailLevel][posX][posZ] = (short) (tempDepth / numberOfChildren); - generationType[detailLevel][posX][posZ] = minGenerationType; dataExistence[detailLevel][posX][posZ] = true; } else if (numberOfVoidChildren > 0) { @@ -468,7 +454,6 @@ public class LodRegion implements Serializable height[detailLevel][posX][posZ] = LodBuilder.DEFAULT_HEIGHT; depth[detailLevel][posX][posZ] = LodBuilder.DEFAULT_DEPTH; - generationType[detailLevel][posX][posZ] = minGenerationType; dataExistence[detailLevel][posX][posZ] = true; } } @@ -511,63 +496,23 @@ public class LodRegion implements Serializable */ public boolean doesDataExist(LevelPos levelPos) { - levelPos = levelPos.getRegionModuleLevelPos(); - return dataExistence[levelPos.detailLevel][levelPos.posX][levelPos.posZ]; - } - - /** - * @param levelPos - * @return - */ - public DistanceGenerationMode getGenerationMode(LevelPos levelPos) - { - levelPos = levelPos.getRegionModuleLevelPos(); - DistanceGenerationMode generationMode = DistanceGenerationMode.NONE; - switch (generationType[levelPos.detailLevel][levelPos.posX][levelPos.posZ]) - { - case 0: - generationMode = DistanceGenerationMode.NONE; - break; - case 1: - generationMode = DistanceGenerationMode.BIOME_ONLY; - break; - case 2: - generationMode = DistanceGenerationMode.BIOME_ONLY_SIMULATE_HEIGHT; - break; - case 3: - generationMode = DistanceGenerationMode.SURFACE; - break; - case 4: - generationMode = DistanceGenerationMode.FEATURES; - break; - case 5: - generationMode = DistanceGenerationMode.SERVER; - break; - default: - generationMode = DistanceGenerationMode.NONE; - break; - - } - return generationMode; - } - - /** - * @param levelPos - * @return - */ - public boolean hasDataBeenGenerated(LevelPos levelPos) - { - levelPos.performRegionModule(); try { - return (generationType[levelPos.detailLevel][levelPos.posX][levelPos.posZ] != 0); - } catch (Exception e) - { - e.printStackTrace(); - throw e; + levelPos = levelPos.getRegionModuleLevelPos(); + return dataExistence[levelPos.detailLevel][levelPos.posX][levelPos.posZ]; + }catch (NullPointerException e){ + return false; } } + /** + * @return + */ + public DistanceGenerationMode getGenerationMode() + { + return generationMode; + } + public byte getMinDetailLevel() { return minDetailLevel; @@ -585,7 +530,7 @@ public class LodRegion implements Serializable { throw new IllegalArgumentException("getLevel asked for a level that does not exist: minimum " + minDetailLevel + " level requested " + detailLevel); } - return new LevelContainer(detailLevel, colors[detailLevel], height[detailLevel], depth[detailLevel], generationType[detailLevel], dataExistence[detailLevel]); + return new LevelContainer(detailLevel, colors[detailLevel], height[detailLevel], depth[detailLevel], dataExistence[detailLevel]); } /** @@ -601,7 +546,6 @@ public class LodRegion implements Serializable colors[levelContainer.detailLevel] = levelContainer.colors; height[levelContainer.detailLevel] = levelContainer.height; depth[levelContainer.detailLevel] = levelContainer.depth; - generationType[levelContainer.detailLevel] = levelContainer.generationType; dataExistence[levelContainer.detailLevel] = levelContainer.dataExistence; } @@ -618,7 +562,6 @@ public class LodRegion implements Serializable colors[tempLod] = new byte[0][0][0]; height[tempLod] = new short[0][0]; depth[tempLod] = new short[0][0]; - generationType[tempLod] = new byte[0][0]; dataExistence[tempLod] = new boolean[0][0]; } minDetailLevel = detailLevel; @@ -638,7 +581,6 @@ public class LodRegion implements Serializable colors[tempLod] = new byte[size][size][3]; height[tempLod] = new short[size][size]; depth[tempLod] = new short[size][size]; - generationType[tempLod] = new byte[size][size]; dataExistence[tempLod] = new boolean[size][size]; } minDetailLevel = detailLevel;