diff --git a/src/main/java/com/seibel/lod/builders/LodBufferBuilder.java b/src/main/java/com/seibel/lod/builders/LodBufferBuilder.java index 898620df8..486932a3b 100644 --- a/src/main/java/com/seibel/lod/builders/LodBufferBuilder.java +++ b/src/main/java/com/seibel/lod/builders/LodBufferBuilder.java @@ -18,7 +18,9 @@ package com.seibel.lod.builders; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; +import java.util.Set; import java.util.concurrent.Callable; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -167,17 +169,27 @@ public class LodBufferBuilder Callable bufferBuildingThread = () -> { - List posListToRender = new ArrayList<>(); + byte detailToRender; + boolean zFix; + Set posListToRender = new HashSet<>(); for (byte detail = detailLevel; detail <= LodUtil.REGION_DETAIL_LEVEL; detail++) { + detailToRender = detail; + if(detail > detailToRender){ + zFix = false; + }else{ + detailToRender = detail; + zFix = true; + } posListToRender.addAll(lodDim.getDataToRender( regionPos, playerBlockPosRounded.getX(), playerBlockPosRounded.getZ(), DetailDistanceUtil.getDistanceRendering(detail), DetailDistanceUtil.getDistanceRendering(detail + 1), - detail)); + detailToRender, + zFix)); } @@ -366,7 +378,6 @@ public class LodBufferBuilder * Called from the LodRenderer to create the * BufferBuilders at the right size. * - * @param bufferMaxCapacity */ private void uploadBuffers() { diff --git a/src/main/java/com/seibel/lod/builders/worldGeneration/LodWorldGenerator.java b/src/main/java/com/seibel/lod/builders/worldGeneration/LodWorldGenerator.java index 3ec07fd43..de30c380b 100644 --- a/src/main/java/com/seibel/lod/builders/worldGeneration/LodWorldGenerator.java +++ b/src/main/java/com/seibel/lod/builders/worldGeneration/LodWorldGenerator.java @@ -129,50 +129,49 @@ public class LodWorldGenerator //=======================================// // start by generating half-region sized blocks... + int farRequesting = maxChunkGenRequests/2; + int nearRequesting; + + //we firstly make sure that the world is filled with half region wide block + for (byte detailGen = LodConfig.CLIENT.maxGenerationDetail.get().detailLevel; detailGen <= LodUtil.REGION_DETAIL_LEVEL; detailGen++) { - if (requesting == 0) - break; - + if (farRequesting <= 0) break; levelPosListToGen = lodDim.getDataToGenerate( playerBlockPosRounded.getX(), playerBlockPosRounded.getZ(), DetailDistanceUtil.getDistanceGeneration(detailGen), DetailDistanceUtil.getDistanceGeneration(detailGen + 1), - LodConfig.CLIENT.distanceGenerationMode.get().complexity, + DetailDistanceUtil.getDistanceGenerationMode(detailGen).complexity, (byte) 9, - requesting / 2); - - for (LevelPos levelPos : levelPosListToGen) - { - generationRequestList.add(new GenerationRequest(levelPos, LodConfig.CLIENT.distanceGenerationMode.get(), DetailDistanceUtil.getLodDetail(detailGen))); + farRequesting); + for(LevelPos levelPos : levelPosListToGen){ + generationRequestList.add(new GenerationRequest(levelPos,DetailDistanceUtil.getDistanceGenerationMode(detailGen), DetailDistanceUtil.getLodDetail(detailGen))); } - requesting = maxChunkGenRequests - generationRequestList.size(); - + farRequesting = farRequesting - generationRequestList.size(); + } // ...then once the world is filled with half-region sized blocks // fill in the rest + + nearRequesting = maxChunkGenRequests - farRequesting; + //we then fill the world with the rest of the block for (byte detailGen = LodConfig.CLIENT.maxGenerationDetail.get().detailLevel; detailGen <= LodUtil.REGION_DETAIL_LEVEL; detailGen++) { - if (requesting == 0) - break; - + if (nearRequesting <= 0) break; levelPosListToGen = lodDim.getDataToGenerate( playerBlockPosRounded.getX(), playerBlockPosRounded.getZ(), DetailDistanceUtil.getDistanceGeneration(detailGen), DetailDistanceUtil.getDistanceGeneration(detailGen + 1), - LodConfig.CLIENT.distanceGenerationMode.get().complexity, + DetailDistanceUtil.getDistanceGenerationMode(detailGen).complexity, DetailDistanceUtil.getLodDetail(detailGen).detailLevel, - maxChunkGenRequests); - - for (LevelPos levelPos : levelPosListToGen) - { - generationRequestList.add(new GenerationRequest(levelPos, LodConfig.CLIENT.distanceGenerationMode.get(), DetailDistanceUtil.getLodDetail(detailGen))); + nearRequesting); + for(LevelPos levelPos : levelPosListToGen){ + generationRequestList.add(new GenerationRequest(levelPos,DetailDistanceUtil.getDistanceGenerationMode(detailGen), DetailDistanceUtil.getLodDetail(detailGen))); } - - requesting = maxChunkGenRequests - generationRequestList.size(); + nearRequesting = nearRequesting - generationRequestList.size(); } diff --git a/src/main/java/com/seibel/lod/handlers/LodDimensionFileHandler.java b/src/main/java/com/seibel/lod/handlers/LodDimensionFileHandler.java index 0376948d9..5cc751bd8 100644 --- a/src/main/java/com/seibel/lod/handlers/LodDimensionFileHandler.java +++ b/src/main/java/com/seibel/lod/handlers/LodDimensionFileHandler.java @@ -113,116 +113,127 @@ public class LodDimensionFileHandler // read from file // //================// - - /** - * Return the LodRegion region at the given coordinates. - * (null if the file doesn't exist) - */ - public LodRegion loadRegionFromFile(RegionPos regionPos, byte detailLevel) + /** + * Return the LodRegion region at the given coordinates. + * (null if the file doesn't exist) + */ + public LodRegion loadRegionFromFile(RegionPos regionPos, byte detailLevel) { - int regionX = regionPos.x; - int regionZ = regionPos.z; - String fileName = getFileNameAndPathForRegion(regionX, regionZ, detailLevel); - - // if the fileName was null that means the folder is inaccessible - // for some reason - if (fileName == null) - return null; - - - File f = new File(fileName); - - if (!f.exists()) + int regionX = regionPos.x; + int regionZ = regionPos.z; + LodRegion region = null; + for (byte tempDetailLevel = detailLevel; tempDetailLevel <= LodUtil.REGION_DETAIL_LEVEL; tempDetailLevel++) { - // there wasn't a file, don't - // return anything - return null; - } - String data = ""; - try - { - BufferedReader bufferedReader = new BufferedReader(new FileReader(f)); - data = bufferedReader.readLine(); - int fileVersion = -1; - - if (data != null && !data.isEmpty()) + try { - // try to get the file version - try + String fileName = getFileNameAndPathForRegion(regionX, regionZ, tempDetailLevel); + + // if the fileName was null that means the folder is inaccessible + // for some reason + if (fileName == null) + throw new IllegalArgumentException("Game folder is not accessible"); + + + File f = new File(fileName); + + if (!f.exists()) { - fileVersion = Integer.parseInt(data.substring(data.indexOf(' ')).trim()); + // there wasn't a file, don't + // return anything + continue; } - catch (NumberFormatException | StringIndexOutOfBoundsException e) + String data = ""; + BufferedReader bufferedReader = new BufferedReader(new FileReader(f)); + data = bufferedReader.readLine(); + int fileVersion = -1; + + if (data != null && !data.isEmpty()) { - // this file doesn't have a version - // keep the version as -1 - fileVersion = -1; - } - - // check if this file can be read by this file handler - if (fileVersion < LOD_SAVE_FILE_VERSION) + // try to get the file version + try + { + fileVersion = Integer.parseInt(data.substring(data.indexOf(' ')).trim()); + } catch (NumberFormatException | StringIndexOutOfBoundsException e) + { + // this file doesn't have a version + // keep the version as -1 + fileVersion = -1; + } + + // check if this file can be read by this file handler + if (fileVersion < LOD_SAVE_FILE_VERSION) + { + // the file we are reading is an older version, + // close the reader and delete the file. + bufferedReader.close(); + f.delete(); + ClientProxy.LOGGER.info("Outdated LOD region file for region: (" + regionX + "," + regionZ + ") version: " + fileVersion + + ", version requested: " + LOD_SAVE_FILE_VERSION + + " File was been deleted."); + + continue; + } else if (fileVersion > LOD_SAVE_FILE_VERSION) + { + // the file we are reading is a newer version, + // close the reader and ignore the file, we don't + // want to accidently delete anything the user may want. + bufferedReader.close(); + ClientProxy.LOGGER.info("Newer LOD region file for region: (" + regionX + "," + regionZ + ") version: " + fileVersion + + ", version requested: " + LOD_SAVE_FILE_VERSION + + " this region will not be written to in order to protect the newer file."); + + continue; + } + } else { - // the file we are reading is an older version, - // close the reader and delete the file. + // there is no data in this file bufferedReader.close(); - f.delete(); - ClientProxy.LOGGER.info("Outdated LOD region file for region: (" + regionX + "," + regionZ + ") version: " + fileVersion + - ", version requested: " + LOD_SAVE_FILE_VERSION + - " File was been deleted."); - - return null; + continue; } - else if (fileVersion > LOD_SAVE_FILE_VERSION) - { - // the file we are reading is a newer version, - // close the reader and ignore the file, we don't - // want to accidently delete anything the user may want. - bufferedReader.close(); - ClientProxy.LOGGER.info("Newer LOD region file for region: (" + regionX + "," + regionZ + ") version: " + fileVersion + - ", version requested: " + LOD_SAVE_FILE_VERSION + - " this region will not be written to in order to protect the newer file."); - - return null; - } - } - else - { - // there is no data in this file + + // this file is a readable version, begin reading the file + data = bufferedReader.readLine(); + bufferedReader.close(); - return null; + region = new LodRegion(new LevelContainer(data), regionPos); + if (tempDetailLevel >= detailLevel) + region.expand(detailLevel); + break; + } catch (Exception e) + { + // the buffered reader encountered a + // problem reading the file + e.printStackTrace(); } - - // this file is a readable version, begin reading the file - data = bufferedReader.readLine(); - - bufferedReader.close(); + /*catch (IOException e) + { + // the buffered reader encountered a + // problem reading the file + e.printStackTrace(); + } catch (IllegalArgumentException e) + { + e.printStackTrace(); + }*/ } - catch (IOException e) - { - // the buffered reader encountered a - // problem reading the file - return null; - } - - return new LodRegion(new LevelContainer(data), regionPos); + return region; } - //==============// - // Save to File // - //==============// + //==============// + // Save to File // + //==============// - /** - * Save all dirty regions in this LodDimension to file. - */ - public void saveDirtyRegionsToFileAsync() - { - fileWritingThreadPool.execute(saveDirtyRegionsThread); - } + /** + * Save all dirty regions in this LodDimension to file. + */ + public void saveDirtyRegionsToFileAsync() + { + fileWritingThreadPool.execute(saveDirtyRegionsThread); + } - private Thread saveDirtyRegionsThread = new Thread(() -> - { - try + private Thread saveDirtyRegionsThread = new Thread(() -> + { + try { for (int i = 0; i < loadedDimension.getWidth(); i++) { @@ -235,25 +246,26 @@ public class LodDimensionFileHandler } } } - }catch (Exception e){ - e.printStackTrace(); + } catch (Exception e) + { + e.printStackTrace(); } - }); + }); - /** - * Save a specific region to disk.
- * Note:
- * 1. If a file already exists for a newer version - * the file won't be written.
- * 2. This will save to the LodDimension that this - * handler is associated with. - */ - private void saveRegionToFile(LodRegion region) - { - // convert to region coordinates - int x = region.regionPosX; - int z = region.regionPosZ; - for(byte detailLevel = region.getMinDetailLevel(); detailLevel <= LodUtil.REGION_DETAIL_LEVEL; detailLevel++) + /** + * Save a specific region to disk.
+ * Note:
+ * 1. If a file already exists for a newer version + * the file won't be written.
+ * 2. This will save to the LodDimension that this + * handler is associated with. + */ + private void saveRegionToFile(LodRegion region) + { + // convert to region coordinates + int x = region.regionPosX; + int z = region.regionPosZ; + for (byte detailLevel = region.getMinDetailLevel(); detailLevel <= LodUtil.REGION_DETAIL_LEVEL; detailLevel++) { String fileName = getFileNameAndPathForRegion(x, z, detailLevel); File oldFile = new File(fileName); @@ -334,7 +346,7 @@ public class LodDimensionFileHandler e.printStackTrace(); } } - } + } //================// diff --git a/src/main/java/com/seibel/lod/proxy/ClientProxy.java b/src/main/java/com/seibel/lod/proxy/ClientProxy.java index ff0ab3bc5..e7d550f81 100644 --- a/src/main/java/com/seibel/lod/proxy/ClientProxy.java +++ b/src/main/java/com/seibel/lod/proxy/ClientProxy.java @@ -144,7 +144,7 @@ public class ClientProxy } // LodConfig.CLIENT.drawLODs.set(true); - LodConfig.CLIENT.debugMode.set(true); + LodConfig.CLIENT.debugMode.set(false); LodConfig.CLIENT.maxDrawDetail.set(LodDetail.FULL); LodConfig.CLIENT.maxGenerationDetail.set(LodDetail.FULL);