From 74e58f50439904996830c1abd5c8e8cb2aa19e24 Mon Sep 17 00:00:00 2001 From: TomTheFurry Date: Thu, 23 Jun 2022 11:19:57 +0800 Subject: [PATCH] Finish up the level split of 3 type of levels: ClientOnly, ClientServer, and ServerOnly --- .../lod/core/a7/data/DataSourceLoader.java | 3 +- .../a7/datatype/column/Alpha6DataLoader.java | 2 +- .../a7/datatype/column/ColumnDataLoader.java | 4 +- .../a7/datatype/column/DataSourceSaver.java | 2 +- .../seibel/lod/core/a7/io/FileScanner.java | 4 - .../lod/core/a7/io/LevelFileHandler.java | 4 - .../lod/core/a7/level/DhClientLevel.java | 7 +- .../core/a7/level/DhClientServerLevel.java | 11 ++- .../lod/core/a7/level/DhServerLevel.java | 9 +- .../lod/core/a7/level/IClientLevel.java | 1 - .../lod/core/a7/level/IServerLevel.java | 1 + .../a7/{ => save}/io/DHFolderHandler.java | 2 +- .../lod/core/a7/save/io/FileScanner.java | 45 ++++++++++ .../lod/core/a7/save/io/LevelFileHandler.java | 4 + .../a7/{ => save}/io/LevelToFileMatcher.java | 16 ++-- .../lod/core/a7/{ => save}/io/MetaFile.java | 2 +- .../a7/{ => save}/io/file/DataMetaFile.java | 6 +- .../io/file/DataSourceProvider.java | 6 +- .../io/file/LocalDataFileHandler.java | 4 +- .../io/file/RemoteDataFileHandler.java | 9 +- .../io/render/RenderFileHandler.java | 11 ++- .../{ => save}/io/render/RenderMetaFile.java | 4 +- .../io/render/RenderSourceProvider.java | 5 +- .../structure/ClientOnlySaveStructure.java | 85 +++++++++---------- .../a7/save/structure/LocalSaveStructure.java | 27 ++++-- .../core/a7/save/structure/SaveStructure.java | 10 ++- .../core/a7/world/DhClientServerWorld.java | 20 ++--- .../lod/core/a7/world/DhClientWorld.java | 33 ++++--- .../lod/core/a7/world/DhServerWorld.java | 46 ++++------ .../com/seibel/lod/core/a7/world/DhWorld.java | 5 +- 30 files changed, 227 insertions(+), 161 deletions(-) delete mode 100644 src/main/java/com/seibel/lod/core/a7/io/FileScanner.java delete mode 100644 src/main/java/com/seibel/lod/core/a7/io/LevelFileHandler.java rename src/main/java/com/seibel/lod/core/a7/{ => save}/io/DHFolderHandler.java (99%) create mode 100644 src/main/java/com/seibel/lod/core/a7/save/io/FileScanner.java create mode 100644 src/main/java/com/seibel/lod/core/a7/save/io/LevelFileHandler.java rename src/main/java/com/seibel/lod/core/a7/{ => save}/io/LevelToFileMatcher.java (95%) rename src/main/java/com/seibel/lod/core/a7/{ => save}/io/MetaFile.java (99%) rename src/main/java/com/seibel/lod/core/a7/{ => save}/io/file/DataMetaFile.java (97%) rename src/main/java/com/seibel/lod/core/a7/{ => save}/io/file/DataSourceProvider.java (74%) rename src/main/java/com/seibel/lod/core/a7/{ => save}/io/file/LocalDataFileHandler.java (98%) rename src/main/java/com/seibel/lod/core/a7/{ => save}/io/file/RemoteDataFileHandler.java (77%) rename src/main/java/com/seibel/lod/core/a7/{ => save}/io/render/RenderFileHandler.java (85%) rename src/main/java/com/seibel/lod/core/a7/{ => save}/io/render/RenderMetaFile.java (77%) rename src/main/java/com/seibel/lod/core/a7/{ => save}/io/render/RenderSourceProvider.java (72%) diff --git a/src/main/java/com/seibel/lod/core/a7/data/DataSourceLoader.java b/src/main/java/com/seibel/lod/core/a7/data/DataSourceLoader.java index 4422d1ad3..88207a338 100644 --- a/src/main/java/com/seibel/lod/core/a7/data/DataSourceLoader.java +++ b/src/main/java/com/seibel/lod/core/a7/data/DataSourceLoader.java @@ -1,8 +1,7 @@ package com.seibel.lod.core.a7.data; import com.google.common.collect.HashMultimap; -import com.seibel.lod.core.a7.level.DhClientServerLevel; -import com.seibel.lod.core.a7.io.file.DataMetaFile; +import com.seibel.lod.core.a7.save.io.file.DataMetaFile; import com.seibel.lod.core.a7.level.ILevel; import java.io.File; diff --git a/src/main/java/com/seibel/lod/core/a7/datatype/column/Alpha6DataLoader.java b/src/main/java/com/seibel/lod/core/a7/datatype/column/Alpha6DataLoader.java index f4b9b6167..2108a121e 100644 --- a/src/main/java/com/seibel/lod/core/a7/datatype/column/Alpha6DataLoader.java +++ b/src/main/java/com/seibel/lod/core/a7/datatype/column/Alpha6DataLoader.java @@ -7,7 +7,7 @@ import com.seibel.lod.core.a7.pos.DhSectionPos; import com.seibel.lod.core.enums.config.EVerticalQuality; import com.seibel.lod.core.a7.level.DhClientServerLevel; import com.seibel.lod.core.objects.a7.data.*; -import com.seibel.lod.core.a7.io.file.DataMetaFile; +import com.seibel.lod.core.a7.save.io.file.DataMetaFile; import org.apache.commons.compress.compressors.xz.XZCompressorInputStream; import java.io.*; diff --git a/src/main/java/com/seibel/lod/core/a7/datatype/column/ColumnDataLoader.java b/src/main/java/com/seibel/lod/core/a7/datatype/column/ColumnDataLoader.java index ab2d75001..5703c2913 100644 --- a/src/main/java/com/seibel/lod/core/a7/datatype/column/ColumnDataLoader.java +++ b/src/main/java/com/seibel/lod/core/a7/datatype/column/ColumnDataLoader.java @@ -2,12 +2,12 @@ package com.seibel.lod.core.a7.datatype.column; import com.seibel.lod.core.a7.data.DataFileHandler; import com.seibel.lod.core.a7.data.LodDataSource; -import com.seibel.lod.core.a7.io.MetaFile; +import com.seibel.lod.core.a7.save.io.MetaFile; import com.seibel.lod.core.a7.pos.DhSectionPos; import com.seibel.lod.core.config.Config; import com.seibel.lod.core.enums.config.EVerticalQuality; import com.seibel.lod.core.a7.level.DhClientServerLevel; -import com.seibel.lod.core.a7.io.file.DataMetaFile; +import com.seibel.lod.core.a7.save.io.file.DataMetaFile; import java.io.*; import java.util.ArrayList; diff --git a/src/main/java/com/seibel/lod/core/a7/datatype/column/DataSourceSaver.java b/src/main/java/com/seibel/lod/core/a7/datatype/column/DataSourceSaver.java index 5d63803dd..f7647dd38 100644 --- a/src/main/java/com/seibel/lod/core/a7/datatype/column/DataSourceSaver.java +++ b/src/main/java/com/seibel/lod/core/a7/datatype/column/DataSourceSaver.java @@ -3,7 +3,7 @@ package com.seibel.lod.core.a7.datatype.column; import com.seibel.lod.core.a7.data.DataFileHandler; import com.seibel.lod.core.a7.data.DataSourceLoader; import com.seibel.lod.core.a7.data.LodDataSource; -import com.seibel.lod.core.a7.io.MetaFile; +import com.seibel.lod.core.a7.save.io.MetaFile; import com.seibel.lod.core.a7.level.ILevel; import com.seibel.lod.core.a7.pos.DhSectionPos; import com.seibel.lod.core.a7.level.DhClientServerLevel; diff --git a/src/main/java/com/seibel/lod/core/a7/io/FileScanner.java b/src/main/java/com/seibel/lod/core/a7/io/FileScanner.java deleted file mode 100644 index 34518e7d2..000000000 --- a/src/main/java/com/seibel/lod/core/a7/io/FileScanner.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.seibel.lod.core.a7.io; - -public class FileScanner { -} diff --git a/src/main/java/com/seibel/lod/core/a7/io/LevelFileHandler.java b/src/main/java/com/seibel/lod/core/a7/io/LevelFileHandler.java deleted file mode 100644 index 9371e2055..000000000 --- a/src/main/java/com/seibel/lod/core/a7/io/LevelFileHandler.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.seibel.lod.core.a7.io; - -public class LevelFileHandler { -} diff --git a/src/main/java/com/seibel/lod/core/a7/level/DhClientLevel.java b/src/main/java/com/seibel/lod/core/a7/level/DhClientLevel.java index c9c972883..4b24aee5b 100644 --- a/src/main/java/com/seibel/lod/core/a7/level/DhClientLevel.java +++ b/src/main/java/com/seibel/lod/core/a7/level/DhClientLevel.java @@ -1,8 +1,9 @@ package com.seibel.lod.core.a7.level; import com.seibel.lod.core.a7.LodQuadTree; -import com.seibel.lod.core.a7.io.file.RemoteDataFileHandler; -import com.seibel.lod.core.a7.io.render.RenderFileHandler; +import com.seibel.lod.core.a7.save.io.FileScanner; +import com.seibel.lod.core.a7.save.io.file.RemoteDataFileHandler; +import com.seibel.lod.core.a7.save.io.render.RenderFileHandler; import com.seibel.lod.core.a7.pos.DhBlockPos2D; import com.seibel.lod.core.a7.render.RenderBufferHandler; import com.seibel.lod.core.a7.save.structure.ClientOnlySaveStructure; @@ -14,6 +15,7 @@ import com.seibel.lod.core.wrapperInterfaces.minecraft.IMinecraftClientWrapper; import com.seibel.lod.core.wrapperInterfaces.minecraft.IProfilerWrapper; import com.seibel.lod.core.wrapperInterfaces.world.ILevelWrapper; +import java.util.Scanner; import java.util.concurrent.CompletableFuture; public class DhClientLevel implements IClientLevel { @@ -34,6 +36,7 @@ public class DhClientLevel implements IClientLevel { MC_CLIENT.getPlayerBlockPos().x, MC_CLIENT.getPlayerBlockPos().z, renderFileHandler); renderBufferHandler = new RenderBufferHandler(tree); this.level = level; + FileScanner.scanFile(save, level, dataFileHandler, renderFileHandler); } public void tick() { diff --git a/src/main/java/com/seibel/lod/core/a7/level/DhClientServerLevel.java b/src/main/java/com/seibel/lod/core/a7/level/DhClientServerLevel.java index 9b6fe778c..c4ebd5bef 100644 --- a/src/main/java/com/seibel/lod/core/a7/level/DhClientServerLevel.java +++ b/src/main/java/com/seibel/lod/core/a7/level/DhClientServerLevel.java @@ -1,8 +1,9 @@ package com.seibel.lod.core.a7.level; import com.seibel.lod.core.a7.LodQuadTree; -import com.seibel.lod.core.a7.io.file.LocalDataFileHandler; -import com.seibel.lod.core.a7.io.render.RenderFileHandler; +import com.seibel.lod.core.a7.save.io.FileScanner; +import com.seibel.lod.core.a7.save.io.file.LocalDataFileHandler; +import com.seibel.lod.core.a7.save.io.render.RenderFileHandler; import com.seibel.lod.core.a7.pos.DhBlockPos2D; import com.seibel.lod.core.a7.render.RenderBufferHandler; import com.seibel.lod.core.a7.save.structure.LocalSaveStructure; @@ -34,6 +35,7 @@ public class DhClientServerLevel implements IClientLevel, IServerLevel { tree = new LodQuadTree(Config.Client.Graphics.Quality.lodChunkRenderDistance.get()*16, MC_CLIENT.getPlayerBlockPos().x, MC_CLIENT.getPlayerBlockPos().z, renderFileHandler); renderBufferHandler = new RenderBufferHandler(tree); + FileScanner.scanFile(save, level, dataFileHandler, renderFileHandler); } public void tick() { @@ -86,4 +88,9 @@ public class DhClientServerLevel implements IClientLevel, IServerLevel { renderFileHandler.close(); //Note: Closing renderFileHandler will also close the dataFileHandler. } + + @Override + public void doWorldGen() { + //TODO + } } diff --git a/src/main/java/com/seibel/lod/core/a7/level/DhServerLevel.java b/src/main/java/com/seibel/lod/core/a7/level/DhServerLevel.java index 1d2736c89..bb3df023a 100644 --- a/src/main/java/com/seibel/lod/core/a7/level/DhServerLevel.java +++ b/src/main/java/com/seibel/lod/core/a7/level/DhServerLevel.java @@ -1,6 +1,7 @@ package com.seibel.lod.core.a7.level; -import com.seibel.lod.core.a7.io.file.LocalDataFileHandler; +import com.seibel.lod.core.a7.save.io.FileScanner; +import com.seibel.lod.core.a7.save.io.file.LocalDataFileHandler; import com.seibel.lod.core.a7.save.structure.LocalSaveStructure; import com.seibel.lod.core.wrapperInterfaces.world.ILevelWrapper; @@ -15,6 +16,7 @@ public class DhServerLevel implements IServerLevel { this.save = save; this.level = level; dataFileHandler = new LocalDataFileHandler(this, save.getDataFolder(level)); + FileScanner.scanFile(save, level, dataFileHandler, null); } public void tick() { @@ -38,4 +40,9 @@ public class DhServerLevel implements IServerLevel { public CompletableFuture save() { return dataFileHandler.flushAndSave(); } + + @Override + public void doWorldGen() { + + } } diff --git a/src/main/java/com/seibel/lod/core/a7/level/IClientLevel.java b/src/main/java/com/seibel/lod/core/a7/level/IClientLevel.java index 18dd695da..7880b00df 100644 --- a/src/main/java/com/seibel/lod/core/a7/level/IClientLevel.java +++ b/src/main/java/com/seibel/lod/core/a7/level/IClientLevel.java @@ -1,6 +1,5 @@ package com.seibel.lod.core.a7.level; -import com.seibel.lod.core.a7.io.render.RenderSourceProvider; import com.seibel.lod.core.a7.render.RenderBufferHandler; import com.seibel.lod.core.objects.math.Mat4f; import com.seibel.lod.core.wrapperInterfaces.minecraft.IProfilerWrapper; diff --git a/src/main/java/com/seibel/lod/core/a7/level/IServerLevel.java b/src/main/java/com/seibel/lod/core/a7/level/IServerLevel.java index dc379ff00..c910f7fa0 100644 --- a/src/main/java/com/seibel/lod/core/a7/level/IServerLevel.java +++ b/src/main/java/com/seibel/lod/core/a7/level/IServerLevel.java @@ -1,4 +1,5 @@ package com.seibel.lod.core.a7.level; public interface IServerLevel extends ILevel { + void doWorldGen(); } diff --git a/src/main/java/com/seibel/lod/core/a7/io/DHFolderHandler.java b/src/main/java/com/seibel/lod/core/a7/save/io/DHFolderHandler.java similarity index 99% rename from src/main/java/com/seibel/lod/core/a7/io/DHFolderHandler.java rename to src/main/java/com/seibel/lod/core/a7/save/io/DHFolderHandler.java index 406a2d3ac..853975a68 100644 --- a/src/main/java/com/seibel/lod/core/a7/io/DHFolderHandler.java +++ b/src/main/java/com/seibel/lod/core/a7/save/io/DHFolderHandler.java @@ -1,4 +1,4 @@ -package com.seibel.lod.core.a7.io; +package com.seibel.lod.core.a7.save.io; import com.seibel.lod.core.config.Config; import com.seibel.lod.core.enums.config.EServerFolderNameMode; diff --git a/src/main/java/com/seibel/lod/core/a7/save/io/FileScanner.java b/src/main/java/com/seibel/lod/core/a7/save/io/FileScanner.java new file mode 100644 index 000000000..16e3642d4 --- /dev/null +++ b/src/main/java/com/seibel/lod/core/a7/save/io/FileScanner.java @@ -0,0 +1,45 @@ +package com.seibel.lod.core.a7.save.io; + +import com.seibel.lod.core.a7.save.io.file.DataSourceProvider; +import com.seibel.lod.core.a7.save.io.render.RenderSourceProvider; +import com.seibel.lod.core.a7.save.structure.SaveStructure; +import com.seibel.lod.core.logging.DhLoggerBuilder; +import com.seibel.lod.core.wrapperInterfaces.world.ILevelWrapper; +import org.apache.logging.log4j.Logger; + +import javax.annotation.Nullable; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +// Static util class?? +public class FileScanner { + private static final Logger LOGGER = DhLoggerBuilder.getLogger(); + public static final int MAX_SCAN_DEPTH = 5; + public static final String LOD_FILE_POSTFIX = ".lod"; + public static void scanFile(SaveStructure save, ILevelWrapper level, + @Nullable DataSourceProvider dataSource, + @Nullable RenderSourceProvider renderSource) { + if (dataSource != null) { + try (Stream pathStream = Files.walk(save.getDataFolder(level).toPath(), MAX_SCAN_DEPTH)) { + dataSource.addScannedFile(pathStream.filter(( + path -> path.endsWith(LOD_FILE_POSTFIX) && path.toFile().isFile()) + ).map(Path::toFile).collect(Collectors.toList()) + ); + } catch (Exception e) { + LOGGER.error("Failed to scan and collect data files for {} in {}", level, save); + } + } + if (renderSource != null) { + try (Stream pathStream = Files.walk(save.getRenderCacheFolder(level).toPath(), MAX_SCAN_DEPTH)) { + renderSource.addScannedFile(pathStream.filter(( + path -> path.endsWith(LOD_FILE_POSTFIX) && path.toFile().isFile()) + ).map(Path::toFile).collect(Collectors.toList()) + ); + } catch (Exception e) { + LOGGER.error("Failed to scan and collect data files for {} in {}", level, save); + } + } + } +} diff --git a/src/main/java/com/seibel/lod/core/a7/save/io/LevelFileHandler.java b/src/main/java/com/seibel/lod/core/a7/save/io/LevelFileHandler.java new file mode 100644 index 000000000..d6a54d1da --- /dev/null +++ b/src/main/java/com/seibel/lod/core/a7/save/io/LevelFileHandler.java @@ -0,0 +1,4 @@ +package com.seibel.lod.core.a7.save.io; + +public class LevelFileHandler { +} diff --git a/src/main/java/com/seibel/lod/core/a7/io/LevelToFileMatcher.java b/src/main/java/com/seibel/lod/core/a7/save/io/LevelToFileMatcher.java similarity index 95% rename from src/main/java/com/seibel/lod/core/a7/io/LevelToFileMatcher.java rename to src/main/java/com/seibel/lod/core/a7/save/io/LevelToFileMatcher.java index ccfc95021..7a38cd910 100644 --- a/src/main/java/com/seibel/lod/core/a7/io/LevelToFileMatcher.java +++ b/src/main/java/com/seibel/lod/core/a7/save/io/LevelToFileMatcher.java @@ -1,4 +1,4 @@ -package com.seibel.lod.core.a7.io; +package com.seibel.lod.core.a7.save.io; import com.seibel.lod.core.a7.world.DhClientWorld; import com.seibel.lod.core.builders.lodBuilding.LodBuilder; @@ -36,27 +36,24 @@ public class LevelToFileMatcher implements AutoCloseable { /** If true the LodDimensionFileHelper is attempting to determine the folder for this dimension */ private final AtomicBoolean determiningWorldFolder = new AtomicBoolean(false); private final ILevelWrapper currentLevel; - private final DhClientWorld world; - private volatile DhClientServerLevel foundLevel = null; + private volatile File foundLevel = null; private final File[] potentialFiles; private final File levelsFolder; - public LevelToFileMatcher(DhClientWorld DhWorld, ILevelWrapper targetWorld, File levelsFolder, File[] potentialFiles) { + public LevelToFileMatcher(ILevelWrapper targetWorld, File levelsFolder, File[] potentialFiles) { this.currentLevel = targetWorld; - this.world = DhWorld; this.potentialFiles = potentialFiles; this.levelsFolder = levelsFolder; if (potentialFiles.length == 0) { String newId = UUID.randomUUID().toString(); LOGGER.info("No potential level files found. Creating a new sub dimension with ID {}...", LodUtil.shortenString(newId, 8)); - File folder = new File(levelsFolder, newId); - foundLevel = new DhClientServerLevel(world, folder, targetWorld); + foundLevel = new File(levelsFolder, newId); } } // May return null, where at this moment the level is not yet known - public DhClientServerLevel tryGetLevel() { + public File tryGetLevel() { tick(); return foundLevel; } @@ -74,8 +71,7 @@ public class LevelToFileMatcher implements AutoCloseable { try { // attempt to get the file handler File saveDir = attemptToDetermineSubDimensionFolder(); - if (saveDir == null) return; - foundLevel = new DhClientServerLevel(world, saveDir, currentLevel); + if (saveDir != null) foundLevel = saveDir; } catch (IOException e) { LOGGER.error("Unable to set the dimension file handler for level [" + currentLevel + "]. Error: ", e); } finally { diff --git a/src/main/java/com/seibel/lod/core/a7/io/MetaFile.java b/src/main/java/com/seibel/lod/core/a7/save/io/MetaFile.java similarity index 99% rename from src/main/java/com/seibel/lod/core/a7/io/MetaFile.java rename to src/main/java/com/seibel/lod/core/a7/save/io/MetaFile.java index 8c085abde..0a042b93c 100644 --- a/src/main/java/com/seibel/lod/core/a7/io/MetaFile.java +++ b/src/main/java/com/seibel/lod/core/a7/save/io/MetaFile.java @@ -1,4 +1,4 @@ -package com.seibel.lod.core.a7.io; +package com.seibel.lod.core.a7.save.io; import java.io.*; import java.nio.ByteBuffer; diff --git a/src/main/java/com/seibel/lod/core/a7/io/file/DataMetaFile.java b/src/main/java/com/seibel/lod/core/a7/save/io/file/DataMetaFile.java similarity index 97% rename from src/main/java/com/seibel/lod/core/a7/io/file/DataMetaFile.java rename to src/main/java/com/seibel/lod/core/a7/save/io/file/DataMetaFile.java index 38865b196..c36c95f3a 100644 --- a/src/main/java/com/seibel/lod/core/a7/io/file/DataMetaFile.java +++ b/src/main/java/com/seibel/lod/core/a7/save/io/file/DataMetaFile.java @@ -1,4 +1,4 @@ -package com.seibel.lod.core.a7.io.file; +package com.seibel.lod.core.a7.save.io.file; import java.io.*; import java.lang.ref.SoftReference; @@ -14,12 +14,10 @@ import java.util.function.BiConsumer; import com.seibel.lod.core.a7.data.DataSourceLoader; import com.seibel.lod.core.a7.data.LodDataSource; import com.seibel.lod.core.a7.datatype.full.FullDatatype; -import com.seibel.lod.core.a7.io.MetaFile; +import com.seibel.lod.core.a7.save.io.MetaFile; import com.seibel.lod.core.a7.level.ILevel; -import com.seibel.lod.core.a7.level.IServerLevel; import com.seibel.lod.core.a7.pos.DhSectionPos; import com.seibel.lod.core.logging.DhLoggerBuilder; -import com.seibel.lod.core.a7.level.DhClientServerLevel; import com.seibel.lod.core.a7.datatype.column.DataSourceSaver; import com.seibel.lod.core.a7.datatype.column.OldDataSourceLoader; import com.seibel.lod.core.util.LodUtil; diff --git a/src/main/java/com/seibel/lod/core/a7/io/file/DataSourceProvider.java b/src/main/java/com/seibel/lod/core/a7/save/io/file/DataSourceProvider.java similarity index 74% rename from src/main/java/com/seibel/lod/core/a7/io/file/DataSourceProvider.java rename to src/main/java/com/seibel/lod/core/a7/save/io/file/DataSourceProvider.java index 58b8fec6c..392bdffc8 100644 --- a/src/main/java/com/seibel/lod/core/a7/io/file/DataSourceProvider.java +++ b/src/main/java/com/seibel/lod/core/a7/save/io/file/DataSourceProvider.java @@ -1,12 +1,16 @@ -package com.seibel.lod.core.a7.io.file; +package com.seibel.lod.core.a7.save.io.file; import com.seibel.lod.core.a7.data.LodDataSource; import com.seibel.lod.core.a7.datatype.full.FullDatatype; import com.seibel.lod.core.a7.pos.DhSectionPos; +import java.io.File; +import java.util.Collection; import java.util.concurrent.CompletableFuture; public interface DataSourceProvider extends AutoCloseable { + void addScannedFile(Collection detectedFiles); + CompletableFuture read(DhSectionPos pos); void write(DhSectionPos sectionPos, FullDatatype chunkData); CompletableFuture flushAndSave(); diff --git a/src/main/java/com/seibel/lod/core/a7/io/file/LocalDataFileHandler.java b/src/main/java/com/seibel/lod/core/a7/save/io/file/LocalDataFileHandler.java similarity index 98% rename from src/main/java/com/seibel/lod/core/a7/io/file/LocalDataFileHandler.java rename to src/main/java/com/seibel/lod/core/a7/save/io/file/LocalDataFileHandler.java index 9696ccece..e7b997191 100644 --- a/src/main/java/com/seibel/lod/core/a7/io/file/LocalDataFileHandler.java +++ b/src/main/java/com/seibel/lod/core/a7/save/io/file/LocalDataFileHandler.java @@ -1,4 +1,4 @@ -package com.seibel.lod.core.a7.io.file; +package com.seibel.lod.core.a7.save.io.file; import com.google.common.collect.HashMultimap; import com.seibel.lod.core.a7.data.LodDataSource; @@ -6,7 +6,6 @@ import com.seibel.lod.core.a7.datatype.full.FullDatatype; import com.seibel.lod.core.a7.level.IServerLevel; import com.seibel.lod.core.a7.pos.DhSectionPos; import com.seibel.lod.core.logging.DhLoggerBuilder; -import com.seibel.lod.core.a7.level.DhClientServerLevel; import com.seibel.lod.core.util.LodUtil; import org.apache.logging.log4j.Logger; @@ -40,6 +39,7 @@ public class LocalDataFileHandler implements DataSourceProvider { * Caller must ensure that this method is called only once, * and that this object is not used before this method is called. */ + @Override public void addScannedFile(Collection detectedFiles) { HashMultimap filesByPos = HashMultimap.create(); { // Sort files by pos. diff --git a/src/main/java/com/seibel/lod/core/a7/io/file/RemoteDataFileHandler.java b/src/main/java/com/seibel/lod/core/a7/save/io/file/RemoteDataFileHandler.java similarity index 77% rename from src/main/java/com/seibel/lod/core/a7/io/file/RemoteDataFileHandler.java rename to src/main/java/com/seibel/lod/core/a7/save/io/file/RemoteDataFileHandler.java index b0b1b8eed..52884803e 100644 --- a/src/main/java/com/seibel/lod/core/a7/io/file/RemoteDataFileHandler.java +++ b/src/main/java/com/seibel/lod/core/a7/save/io/file/RemoteDataFileHandler.java @@ -1,12 +1,19 @@ -package com.seibel.lod.core.a7.io.file; +package com.seibel.lod.core.a7.save.io.file; import com.seibel.lod.core.a7.data.LodDataSource; import com.seibel.lod.core.a7.datatype.full.FullDatatype; import com.seibel.lod.core.a7.pos.DhSectionPos; +import java.io.File; +import java.util.Collection; import java.util.concurrent.CompletableFuture; public class RemoteDataFileHandler implements DataSourceProvider { + @Override + public void addScannedFile(Collection detectedFiles) { + + } + @Override public CompletableFuture read(DhSectionPos pos) { return null; diff --git a/src/main/java/com/seibel/lod/core/a7/io/render/RenderFileHandler.java b/src/main/java/com/seibel/lod/core/a7/save/io/render/RenderFileHandler.java similarity index 85% rename from src/main/java/com/seibel/lod/core/a7/io/render/RenderFileHandler.java rename to src/main/java/com/seibel/lod/core/a7/save/io/render/RenderFileHandler.java index 3ed788f0e..923856353 100644 --- a/src/main/java/com/seibel/lod/core/a7/io/render/RenderFileHandler.java +++ b/src/main/java/com/seibel/lod/core/a7/save/io/render/RenderFileHandler.java @@ -1,8 +1,7 @@ -package com.seibel.lod.core.a7.io.render; +package com.seibel.lod.core.a7.save.io.render; -import com.seibel.lod.core.a7.RenderDataProvider; import com.seibel.lod.core.a7.datatype.full.FullDatatype; -import com.seibel.lod.core.a7.io.file.DataSourceProvider; +import com.seibel.lod.core.a7.save.io.file.DataSourceProvider; import com.seibel.lod.core.a7.pos.DhSectionPos; import com.seibel.lod.core.logging.DhLoggerBuilder; import com.seibel.lod.core.a7.render.RenderDataSource; @@ -11,6 +10,7 @@ import com.seibel.lod.core.util.LodUtil; import org.apache.logging.log4j.Logger; import java.io.File; +import java.util.Collection; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutorService; @@ -30,6 +30,11 @@ public class RenderFileHandler implements RenderSourceProvider { return null; } + @Override + public void addScannedFile(Collection detectedFiles) { + + } + @Override public void write(DhSectionPos sectionPos, FullDatatype chunkData) { diff --git a/src/main/java/com/seibel/lod/core/a7/io/render/RenderMetaFile.java b/src/main/java/com/seibel/lod/core/a7/save/io/render/RenderMetaFile.java similarity index 77% rename from src/main/java/com/seibel/lod/core/a7/io/render/RenderMetaFile.java rename to src/main/java/com/seibel/lod/core/a7/save/io/render/RenderMetaFile.java index 3ad35fe0e..195b154d7 100644 --- a/src/main/java/com/seibel/lod/core/a7/io/render/RenderMetaFile.java +++ b/src/main/java/com/seibel/lod/core/a7/save/io/render/RenderMetaFile.java @@ -1,6 +1,6 @@ -package com.seibel.lod.core.a7.io.render; +package com.seibel.lod.core.a7.save.io.render; -import com.seibel.lod.core.a7.io.MetaFile; +import com.seibel.lod.core.a7.save.io.MetaFile; import com.seibel.lod.core.a7.pos.DhSectionPos; import java.io.File; diff --git a/src/main/java/com/seibel/lod/core/a7/io/render/RenderSourceProvider.java b/src/main/java/com/seibel/lod/core/a7/save/io/render/RenderSourceProvider.java similarity index 72% rename from src/main/java/com/seibel/lod/core/a7/io/render/RenderSourceProvider.java rename to src/main/java/com/seibel/lod/core/a7/save/io/render/RenderSourceProvider.java index 1781e7747..4d9b508ae 100644 --- a/src/main/java/com/seibel/lod/core/a7/io/render/RenderSourceProvider.java +++ b/src/main/java/com/seibel/lod/core/a7/save/io/render/RenderSourceProvider.java @@ -1,12 +1,15 @@ -package com.seibel.lod.core.a7.io.render; +package com.seibel.lod.core.a7.save.io.render; import com.seibel.lod.core.a7.RenderDataProvider; import com.seibel.lod.core.a7.datatype.full.FullDatatype; import com.seibel.lod.core.a7.pos.DhSectionPos; +import java.io.File; +import java.util.Collection; import java.util.concurrent.CompletableFuture; public interface RenderSourceProvider extends RenderDataProvider, AutoCloseable { + void addScannedFile(Collection detectedFiles); void write(DhSectionPos sectionPos, FullDatatype chunkData); CompletableFuture flushAndSave(); } diff --git a/src/main/java/com/seibel/lod/core/a7/save/structure/ClientOnlySaveStructure.java b/src/main/java/com/seibel/lod/core/a7/save/structure/ClientOnlySaveStructure.java index 40919de2f..c9602d7c9 100644 --- a/src/main/java/com/seibel/lod/core/a7/save/structure/ClientOnlySaveStructure.java +++ b/src/main/java/com/seibel/lod/core/a7/save/structure/ClientOnlySaveStructure.java @@ -1,12 +1,8 @@ package com.seibel.lod.core.a7.save.structure; -import com.seibel.lod.core.a7.io.LevelToFileMatcher; -import com.seibel.lod.core.a7.level.DhClientServerLevel; -import com.seibel.lod.core.a7.level.IServerLevel; -import com.seibel.lod.core.a7.world.DhClientWorld; +import com.seibel.lod.core.a7.save.io.LevelToFileMatcher; import com.seibel.lod.core.config.Config; import com.seibel.lod.core.enums.config.EServerFolderNameMode; -import com.seibel.lod.core.enums.config.EVerticalQuality; import com.seibel.lod.core.handlers.dependencyInjection.SingletonHandler; import com.seibel.lod.core.objects.ParsedIp; import com.seibel.lod.core.util.LodUtil; @@ -16,6 +12,7 @@ import com.seibel.lod.core.wrapperInterfaces.world.ILevelWrapper; import javax.annotation.Nullable; import java.io.File; import java.util.Arrays; +import java.util.HashMap; import java.util.Optional; import java.util.stream.Stream; @@ -72,39 +69,37 @@ public class ClientOnlySaveStructure extends SaveStructure { } LevelToFileMatcher fileMatcher = null; - final DhClientWorld world; + final HashMap levelToFileMap = new HashMap<>(); // Fit for Client_Only environment - public ClientOnlySaveStructure(DhClientWorld world) { + public ClientOnlySaveStructure() { folder = new File(MC_CLIENT.getGameDirectory().getPath() + File.separatorChar + "Distant_Horizons_server_data" + File.separatorChar + getServerFolderName()); if (!folder.exists()) folder.mkdirs(); //TODO: Deal with errors - this.world = world; } - //FIXME: how do i deal with either creating a ClientServerLevel, or a ServerLevel here??? @Override - public IServerLevel tryGetLevel(ILevelWrapper wrapper) { - if (Config.Client.Multiplayer.multiDimensionRequiredSimilarity.get() == 0) { - if (fileMatcher != null) { + public File tryGetLevelFolder(ILevelWrapper level) { + return levelToFileMap.computeIfAbsent(level, (l) -> { + if (Config.Client.Multiplayer.multiDimensionRequiredSimilarity.get() == 0) { + if (fileMatcher != null) { + fileMatcher.close(); + fileMatcher = null; + } + return getLevelFolderWithoutSimilarityMatching(l); + } + if (fileMatcher == null || !fileMatcher.isFindingLevel(l)) { + LOGGER.info("Loading level for world " + l.getDimensionType().getDimensionName()); + fileMatcher = new LevelToFileMatcher(l, folder, + (File[]) getMatchingLevelFolders(l).toArray()); + } + File levelFile = fileMatcher.tryGetLevel(); + if (levelFile != null) { fileMatcher.close(); fileMatcher = null; } - return new DhClientServerLevel(world, getLevelFolderWithoutSimilarityMatching(wrapper), wrapper); - } - - if (fileMatcher == null || !fileMatcher.isFindingLevel(wrapper)) { - LOGGER.info("Loading level for world " + wrapper.getDimensionType().getDimensionName()); - fileMatcher = new LevelToFileMatcher(world, wrapper, folder, - (File[]) getMatchingLevelFolders(wrapper).toArray()); - } - - DhClientServerLevel level = fileMatcher.tryGetLevel(); - if (level != null) { - fileMatcher.close(); - fileMatcher = null; - } - return level; + return levelFile; + }); } private File getLevelFolderWithoutSimilarityMatching(ILevelWrapper level) @@ -139,36 +134,34 @@ public class ClientOnlySaveStructure extends SaveStructure { // it needs to be a folder return false; - if (potentialFolder.listFiles() == null) - // it needs to have folders in it - return false; - - // check if there is at least one VerticalQuality folder in this directory - for (File internalFolder : potentialFolder.listFiles()) - { - if (EVerticalQuality.getByName(internalFolder.getName()) != null) - { - // one of the internal folders is a VerticalQuality folder - return true; - } - } - - return false; + File[] files = potentialFolder.listFiles((f) -> f.isDirectory() && + (f.getName().equalsIgnoreCase(RENDER_CACHE_FOLDER) || f.getName().equalsIgnoreCase(DATA_FOLDER))); + // it needs to have folders with specified names in it + return files != null && files.length != 0; } @Override - public File getRenderCacheFolder(ILevelWrapper world) { - return null; + public File getRenderCacheFolder(ILevelWrapper level) { + File levelFolder = levelToFileMap.get(level); + if (levelFolder == null) return null; + return new File(levelFolder, RENDER_CACHE_FOLDER); } @Override - public File getDataFolder(ILevelWrapper world) { - return null; + public File getDataFolder(ILevelWrapper level) { + File levelFolder = levelToFileMap.get(level); + if (levelFolder == null) return null; + return new File(levelFolder, DATA_FOLDER); } @Override public void close() { fileMatcher.close(); } + + @Override + public String toString() { + return "[ClientOnlySave@"+folder.getName()+"]"; + } } diff --git a/src/main/java/com/seibel/lod/core/a7/save/structure/LocalSaveStructure.java b/src/main/java/com/seibel/lod/core/a7/save/structure/LocalSaveStructure.java index 5a27da3fd..001c8bc4f 100644 --- a/src/main/java/com/seibel/lod/core/a7/save/structure/LocalSaveStructure.java +++ b/src/main/java/com/seibel/lod/core/a7/save/structure/LocalSaveStructure.java @@ -1,6 +1,7 @@ package com.seibel.lod.core.a7.save.structure; import com.seibel.lod.core.handlers.dependencyInjection.SingletonHandler; +import com.seibel.lod.core.util.LodUtil; import com.seibel.lod.core.wrapperInterfaces.minecraft.IMinecraftRenderWrapper; import com.seibel.lod.core.wrapperInterfaces.minecraft.IMinecraftSharedWrapper; import com.seibel.lod.core.wrapperInterfaces.world.ILevelWrapper; @@ -10,20 +11,32 @@ import java.io.File; public class LocalSaveStructure extends SaveStructure { private static final IMinecraftSharedWrapper MC = SingletonHandler.get(IMinecraftSharedWrapper.class); - private final File folder; - // Fit for Client_Server & Server_Only environment public LocalSaveStructure() { - folder = MC.getInstallationDirectory(); } @Override - public File getRenderCacheFolder(ILevelWrapper world) { - return null; + public File tryGetLevelFolder(ILevelWrapper wrapper) { + return new File(wrapper.getSaveFolder(), "Distant_Horizons"); } @Override - public File getDataFolder(ILevelWrapper world) { - return null; + public File getRenderCacheFolder(ILevelWrapper level) { + return new File(new File(level.getSaveFolder(), "Distant_Horizons"), RENDER_CACHE_FOLDER); + } + + @Override + public File getDataFolder(ILevelWrapper level) { + return new File(new File(level.getSaveFolder(), "Distant_Horizons"), DATA_FOLDER); + } + + @Override + public void close() throws Exception { + + } + + @Override + public String toString() { + return "[LocalSave]"; } } diff --git a/src/main/java/com/seibel/lod/core/a7/save/structure/SaveStructure.java b/src/main/java/com/seibel/lod/core/a7/save/structure/SaveStructure.java index 9d1ecaec2..a93a1e6f3 100644 --- a/src/main/java/com/seibel/lod/core/a7/save/structure/SaveStructure.java +++ b/src/main/java/com/seibel/lod/core/a7/save/structure/SaveStructure.java @@ -1,6 +1,5 @@ package com.seibel.lod.core.a7.save.structure; -import com.seibel.lod.core.a7.level.DhClientServerLevel; import com.seibel.lod.core.logging.DhLoggerBuilder; import com.seibel.lod.core.wrapperInterfaces.world.ILevelWrapper; import org.apache.logging.log4j.Logger; @@ -9,11 +8,14 @@ import java.io.File; public abstract class SaveStructure implements AutoCloseable { + public static final String RENDER_CACHE_FOLDER = "cache"; + public static final String DATA_FOLDER = "data"; + protected static final Logger LOGGER = DhLoggerBuilder.getLogger(); - public abstract DhClientServerLevel tryGetLevel(ILevelWrapper wrapper); + public abstract File tryGetLevelFolder(ILevelWrapper wrapper); - protected abstract File getRenderCacheFolder(ILevelWrapper world); - protected abstract File getDataFolder(ILevelWrapper world); + public abstract File getRenderCacheFolder(ILevelWrapper world); + public abstract File getDataFolder(ILevelWrapper world); } diff --git a/src/main/java/com/seibel/lod/core/a7/world/DhClientServerWorld.java b/src/main/java/com/seibel/lod/core/a7/world/DhClientServerWorld.java index 5e113f793..2f40bd4c2 100644 --- a/src/main/java/com/seibel/lod/core/a7/world/DhClientServerWorld.java +++ b/src/main/java/com/seibel/lod/core/a7/world/DhClientServerWorld.java @@ -4,9 +4,10 @@ import com.seibel.lod.core.a7.WorldEnvironment; import com.seibel.lod.core.a7.level.DhClientServerLevel; import com.seibel.lod.core.a7.save.structure.LocalSaveStructure; import com.seibel.lod.core.config.Config; -import com.seibel.lod.core.util.DetailDistanceUtil; +import com.seibel.lod.core.util.LodUtil; import com.seibel.lod.core.wrapperInterfaces.world.ILevelWrapper; +import java.io.File; import java.util.HashMap; import java.util.Iterator; import java.util.concurrent.CompletableFuture; @@ -23,13 +24,11 @@ public class DhClientServerWorld extends DhWorld implements IClientWorld, IServe @Override public DhClientServerLevel getOrLoadLevel(ILevelWrapper wrapper) { - if (!levels.containsKey(wrapper)) { - DhClientServerLevel level = saveStructure.tryGetLevel(wrapper); - if (level != null) { - levels.put(wrapper, level); - } - return level; - } else return levels.get(wrapper); + return levels.computeIfAbsent(wrapper, (w) -> { + File levelFile = saveStructure.tryGetLevelFolder(w); + LodUtil.assertTrue(levelFile != null); + return new DhClientServerLevel(saveStructure, w); + }); } @Override @@ -56,11 +55,12 @@ public class DhClientServerWorld extends DhWorld implements IClientWorld, IServe iterator.remove(); } } - DetailDistanceUtil.updateSettings(); + //DetailDistanceUtil.updateSettings(); + levels.values().forEach(DhClientServerLevel::tick); } public void doWorldGen() { - + levels.values().forEach(DhClientServerLevel::doWorldGen); } @Override diff --git a/src/main/java/com/seibel/lod/core/a7/world/DhClientWorld.java b/src/main/java/com/seibel/lod/core/a7/world/DhClientWorld.java index 08b42a2db..34e242a91 100644 --- a/src/main/java/com/seibel/lod/core/a7/world/DhClientWorld.java +++ b/src/main/java/com/seibel/lod/core/a7/world/DhClientWorld.java @@ -1,7 +1,7 @@ package com.seibel.lod.core.a7.world; import com.seibel.lod.core.a7.WorldEnvironment; -import com.seibel.lod.core.a7.level.DhClientServerLevel; +import com.seibel.lod.core.a7.level.DhClientLevel; import com.seibel.lod.core.a7.save.structure.ClientOnlySaveStructure; import com.seibel.lod.core.config.Config; import com.seibel.lod.core.util.DetailDistanceUtil; @@ -9,6 +9,7 @@ import com.seibel.lod.core.util.EventLoop; import com.seibel.lod.core.util.LodUtil; import com.seibel.lod.core.wrapperInterfaces.world.ILevelWrapper; +import java.io.File; import java.util.HashMap; import java.util.Iterator; import java.util.concurrent.CompletableFuture; @@ -16,7 +17,7 @@ import java.util.concurrent.ExecutorService; public class DhClientWorld extends DhWorld implements IClientWorld { - private final HashMap levels; + private final HashMap levels; public final ClientOnlySaveStructure saveStructure; public ExecutorService dhTickerThread = LodUtil.makeSingleThreadPool("DHTickerThread", 2); @@ -24,23 +25,21 @@ public class DhClientWorld extends DhWorld implements IClientWorld { public DhClientWorld() { super(WorldEnvironment.Client_Only); - saveStructure = new ClientOnlySaveStructure(this); + saveStructure = new ClientOnlySaveStructure(); levels = new HashMap<>(); } @Override - public DhClientServerLevel getOrLoadLevel(ILevelWrapper wrapper) { - if (!levels.containsKey(wrapper)) { - DhClientWorld level = saveStructure.tryGetLevel(wrapper); - if (level != null) { - levels.put(wrapper, level); - } - return level; - } else return levels.get(wrapper); + public DhClientLevel getOrLoadLevel(ILevelWrapper wrapper) { + return levels.computeIfAbsent(wrapper, (w) -> { + File level = saveStructure.tryGetLevelFolder(wrapper); + if (level == null) return null; + return new DhClientLevel(saveStructure, w); + }); } @Override - public DhClientServerLevel getLevel(ILevelWrapper wrapper) { + public DhClientLevel getLevel(ILevelWrapper wrapper) { return levels.get(wrapper); } @@ -55,10 +54,10 @@ public class DhClientWorld extends DhWorld implements IClientWorld { private void tick() { int newViewDistance = Config.Client.Graphics.Quality.lodChunkRenderDistance.get() * 16; - Iterator iterator = levels.values().iterator(); + Iterator iterator = levels.values().iterator(); while (iterator.hasNext()) { - DhClientWorld level = iterator.next(); - if (level.viewDistance != newViewDistance) { + DhClientLevel level = iterator.next(); + if (level.tree.viewDistance != newViewDistance) { level.close(); iterator.remove(); } @@ -72,13 +71,13 @@ public class DhClientWorld extends DhWorld implements IClientWorld { @Override public CompletableFuture saveAndFlush() { - return CompletableFuture.allOf(levels.values().stream().map(DhClientServerLevel::save).toArray(CompletableFuture[]::new)); + return CompletableFuture.allOf(levels.values().stream().map(DhClientLevel::save).toArray(CompletableFuture[]::new)); } @Override public void close() { saveAndFlush().join(); - for (DhClientServerLevel level : levels.values()) { + for (DhClientLevel level : levels.values()) { LOGGER.info("Unloading level for world " + level.level.getDimensionType().getDimensionName()); level.close(); } diff --git a/src/main/java/com/seibel/lod/core/a7/world/DhServerWorld.java b/src/main/java/com/seibel/lod/core/a7/world/DhServerWorld.java index 0c3b31e3e..f7f18d6a9 100644 --- a/src/main/java/com/seibel/lod/core/a7/world/DhServerWorld.java +++ b/src/main/java/com/seibel/lod/core/a7/world/DhServerWorld.java @@ -1,17 +1,17 @@ package com.seibel.lod.core.a7.world; import com.seibel.lod.core.a7.WorldEnvironment; -import com.seibel.lod.core.a7.level.DhClientServerLevel; +import com.seibel.lod.core.a7.level.DhServerLevel; import com.seibel.lod.core.a7.save.structure.LocalSaveStructure; -import com.seibel.lod.core.config.Config; -import com.seibel.lod.core.util.DetailDistanceUtil; +import com.seibel.lod.core.util.LodUtil; import com.seibel.lod.core.wrapperInterfaces.world.ILevelWrapper; +import java.io.File; import java.util.HashMap; -import java.util.Iterator; +import java.util.concurrent.CompletableFuture; public class DhServerWorld extends DhWorld implements IServerWorld { - private final HashMap levels; + private final HashMap levels; public final LocalSaveStructure saveStructure; public DhServerWorld() { @@ -21,18 +21,16 @@ public class DhServerWorld extends DhWorld implements IServerWorld { } @Override - public DhClientServerLevel getOrLoadLevel(ILevelWrapper wrapper) { - if (!levels.containsKey(wrapper)) { - DhClientServerLevel level = saveStructure.tryGetLevel(wrapper); - if (level != null) { - levels.put(wrapper, level); - } - return level; - } else return levels.get(wrapper); + public DhServerLevel getOrLoadLevel(ILevelWrapper wrapper) { + return levels.computeIfAbsent(wrapper, (w) -> { + File levelFile = saveStructure.tryGetLevelFolder(wrapper); + LodUtil.assertTrue(levelFile != null); + return new DhServerLevel(saveStructure, w); + }); } @Override - public DhClientServerLevel getLevel(ILevelWrapper wrapper) { + public DhServerLevel getLevel(ILevelWrapper wrapper) { return levels.get(wrapper); } @@ -46,32 +44,22 @@ public class DhServerWorld extends DhWorld implements IServerWorld { } public void tick() { - int newViewDistance = Config.Client.Graphics.Quality.lodChunkRenderDistance.get() * 16; - Iterator iterator = levels.values().iterator(); - while (iterator.hasNext()) { - DhClientServerLevel level = iterator.next(); - if (level.viewDistance != newViewDistance) { - level.close(); - iterator.remove(); - } - } - DetailDistanceUtil.updateSettings(); + levels.values().forEach(DhServerLevel::tick); } public void doWorldGen() { + levels.values().forEach(DhServerLevel::doWorldGen); } @Override - public void saveAndFlush() { - for (DhClientServerLevel level : levels.values()) { - level.saveFlush(); - } + public CompletableFuture saveAndFlush() { + return CompletableFuture.allOf(levels.values().stream().map(DhServerLevel::save).toArray(CompletableFuture[]::new)); } @Override public void close() { - for (DhClientServerLevel level : levels.values()) { + for (DhServerLevel level : levels.values()) { LOGGER.info("Unloading level for world " + level.level.getDimensionType().getDimensionName()); level.close(); } diff --git a/src/main/java/com/seibel/lod/core/a7/world/DhWorld.java b/src/main/java/com/seibel/lod/core/a7/world/DhWorld.java index 3d0e4ac3b..0a7a402b4 100644 --- a/src/main/java/com/seibel/lod/core/a7/world/DhWorld.java +++ b/src/main/java/com/seibel/lod/core/a7/world/DhWorld.java @@ -2,6 +2,7 @@ package com.seibel.lod.core.a7.world; import com.seibel.lod.core.a7.WorldEnvironment; import com.seibel.lod.core.a7.level.DhClientServerLevel; +import com.seibel.lod.core.a7.level.ILevel; import com.seibel.lod.core.logging.DhLoggerBuilder; import com.seibel.lod.core.wrapperInterfaces.world.ILevelWrapper; import org.apache.logging.log4j.Logger; @@ -17,9 +18,9 @@ public abstract class DhWorld implements Closeable { protected DhWorld(WorldEnvironment environment) { this.environment = environment; } - public abstract DhClientServerLevel getOrLoadLevel(ILevelWrapper wrapper); + public abstract ILevel getOrLoadLevel(ILevelWrapper wrapper); - public abstract DhClientServerLevel getLevel(ILevelWrapper wrapper); + public abstract ILevel getLevel(ILevelWrapper wrapper); public abstract void unloadLevel(ILevelWrapper wrapper); public abstract CompletableFuture saveAndFlush();