geneartionType is no longer used in LodRegion. Every region has a generationMode (+ server)

This commit is contained in:
Leonardo
2021-08-28 12:22:09 +02:00
parent e1a425dbcc
commit e3e8ef705a
6 changed files with 41 additions and 138 deletions
@@ -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);
@@ -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
* <p>
* 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)
@@ -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);
}
@@ -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;
}
@@ -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;