From 8065ff41b1584f78c6a6ba633a58bcf35ae85139 Mon Sep 17 00:00:00 2001 From: rjnasers Date: Wed, 2 Oct 2024 20:11:11 -0500 Subject: [PATCH 1/4] Pregen --- .../serverutils/ServerUtilitiesConfig.java | 3 + .../command/ServerUtilitiesCommands.java | 4 + .../serverutils/command/pregen/CmdPregen.java | 14 ++ .../command/pregen/CmdProgress.java | 25 +++ .../serverutils/command/pregen/CmdStart.java | 89 ++++++++ .../serverutils/command/pregen/CmdStop.java | 26 +++ .../ServerUtilitiesServerEventHandler.java | 6 + .../ServerUtilitiesWorldEventHandler.java | 30 +++ .../util/misc/PregeneratorCommandInfo.java | 50 +++++ .../serverutils/pregenerator/ChunkLoader.java | 34 +++ .../pregenerator/ChunkLoaderManager.java | 210 ++++++++++++++++++ .../filemanager/PregeneratorFileManager.java | 110 +++++++++ .../readwriters/FileReadWriter.java | 67 ++++++ .../readwriters/SafeFileReadWriter.java | 85 +++++++ .../assets/serverutilities/lang/en_US.lang | 3 + 15 files changed, 756 insertions(+) create mode 100644 src/main/java/serverutils/command/pregen/CmdPregen.java create mode 100644 src/main/java/serverutils/command/pregen/CmdProgress.java create mode 100644 src/main/java/serverutils/command/pregen/CmdStart.java create mode 100644 src/main/java/serverutils/command/pregen/CmdStop.java create mode 100644 src/main/java/serverutils/lib/util/misc/PregeneratorCommandInfo.java create mode 100644 src/main/java/serverutils/pregenerator/ChunkLoader.java create mode 100644 src/main/java/serverutils/pregenerator/ChunkLoaderManager.java create mode 100644 src/main/java/serverutils/pregenerator/filemanager/PregeneratorFileManager.java create mode 100644 src/main/java/serverutils/pregenerator/filemanager/readwriters/FileReadWriter.java create mode 100644 src/main/java/serverutils/pregenerator/filemanager/readwriters/SafeFileReadWriter.java diff --git a/src/main/java/serverutils/ServerUtilitiesConfig.java b/src/main/java/serverutils/ServerUtilitiesConfig.java index ed7ef30f5..a32955b99 100644 --- a/src/main/java/serverutils/ServerUtilitiesConfig.java +++ b/src/main/java/serverutils/ServerUtilitiesConfig.java @@ -276,6 +276,9 @@ public static class Commands { @Config.DefaultBoolean(true) public boolean dump_stats; + + @Config.DefaultBoolean(true) + public boolean pregen; } public static class Backups { diff --git a/src/main/java/serverutils/command/ServerUtilitiesCommands.java b/src/main/java/serverutils/command/ServerUtilitiesCommands.java index 3ae76c4d4..31f7e9d04 100644 --- a/src/main/java/serverutils/command/ServerUtilitiesCommands.java +++ b/src/main/java/serverutils/command/ServerUtilitiesCommands.java @@ -3,6 +3,7 @@ import cpw.mods.fml.common.event.FMLServerStartingEvent; import serverutils.ServerUtilitiesConfig; import serverutils.command.chunks.CmdChunks; +import serverutils.command.pregen.CmdPregen; import serverutils.command.ranks.CmdRanks; import serverutils.command.team.CmdTeam; import serverutils.command.tp.CmdBack; @@ -143,5 +144,8 @@ public static void registerCommands(FMLServerStartingEvent event) { if (ServerUtilitiesConfig.commands.dump_stats) { event.registerServerCommand(new CmdDumpStats()); } + if (ServerUtilitiesConfig.commands.pregen) { + event.registerServerCommand(new CmdPregen()); + } } } diff --git a/src/main/java/serverutils/command/pregen/CmdPregen.java b/src/main/java/serverutils/command/pregen/CmdPregen.java new file mode 100644 index 000000000..0041470a4 --- /dev/null +++ b/src/main/java/serverutils/command/pregen/CmdPregen.java @@ -0,0 +1,14 @@ +package serverutils.command.pregen; + +import serverutils.lib.command.CmdTreeBase; +import serverutils.lib.command.CmdTreeHelp; + +public class CmdPregen extends CmdTreeBase { + public CmdPregen() { + super("pregen"); + addSubcommand(new CmdProgress()); + addSubcommand(new CmdStart()); + addSubcommand(new CmdStop()); + addSubcommand(new CmdTreeHelp(this)); + } +} diff --git a/src/main/java/serverutils/command/pregen/CmdProgress.java b/src/main/java/serverutils/command/pregen/CmdProgress.java new file mode 100644 index 000000000..0b3d1160a --- /dev/null +++ b/src/main/java/serverutils/command/pregen/CmdProgress.java @@ -0,0 +1,25 @@ +package serverutils.command.pregen; + +import net.minecraft.command.ICommandSender; +import net.minecraft.util.ChatComponentText; +import serverutils.lib.command.CmdBase; +import serverutils.pregenerator.ChunkLoaderManager; + +public class CmdProgress extends CmdBase { + public CmdProgress() { + super("progress", Level.OP); + } + + @Override + public void processCommand(ICommandSender sender, String[] args) + { + if (ChunkLoaderManager.instance.isGenerating()) + { + sender.addChatMessage(new ChatComponentText(ChunkLoaderManager.instance.progressString())); + } + else + { + sender.addChatMessage(new ChatComponentText("No generator running.")); + } + } +} diff --git a/src/main/java/serverutils/command/pregen/CmdStart.java b/src/main/java/serverutils/command/pregen/CmdStart.java new file mode 100644 index 000000000..88a077f0b --- /dev/null +++ b/src/main/java/serverutils/command/pregen/CmdStart.java @@ -0,0 +1,89 @@ +package serverutils.command.pregen; + +import net.minecraft.command.ICommandSender; +import net.minecraft.command.WrongUsageException; +import net.minecraft.server.MinecraftServer; +import net.minecraft.util.ChatComponentText; +import serverutils.lib.command.CmdBase; +import serverutils.lib.util.misc.PregeneratorCommandInfo; +import serverutils.pregenerator.ChunkLoaderManager; + +import java.io.IOException; +import java.util.Objects; + +public class CmdStart extends CmdBase { + public CmdStart() { + super("start", Level.OP); + } + + @Override + public void processCommand(ICommandSender sender, String[] args) + { + checkArgs(sender, args, 3); + if (args.length > 2) + { + double xLoc, zLoc; + if (args[0].equals("~")) + { + xLoc = sender.getPlayerCoordinates().posX; + } + else + { + xLoc = parseDoubleBounded(sender, args[0], -30000000.0D, 30000000.0D); + } + + if (args[1].equals("~")) + { + zLoc = sender.getPlayerCoordinates().posZ; + } + else + { + zLoc = parseDoubleBounded(sender, args[1], -30000000.0D, 30000000.0D); + } + + int radius = parseInt(sender, args[2]); + if (radius > 2000) + { + sender.addChatMessage(new ChatComponentText("Radii larger than 2000 are not permitted. World sizes will be 100's of gbs")); + return; + } + + int dimensionID = sender.getEntityWorld().provider.dimensionId; + PregeneratorCommandInfo commandInfo = new PregeneratorCommandInfo(xLoc, zLoc, radius, dimensionID); + if (!ChunkLoaderManager.instance.isGenerating()) + { + try + { + ChunkLoaderManager.instance.initializePregenerator(commandInfo, MinecraftServer.getServer()); + } + catch (IOException e) + { + e.printStackTrace(); + sender.addChatMessage(new ChatComponentText("Cannot start a pregenerator! File exception when starting pregenerator!")); + } + } + else + { + sender.addChatMessage(new ChatComponentText("Cannot start a pregenerator! There's already generation in progress!")); + } + } + } + + @Override + public void checkArgs(ICommandSender sender, String[] args, int i) + { + if (args.length < i) { + throw new WrongUsageException(getCommandUsage(sender)); + } + if (sender instanceof MinecraftServer) + { + for (int j = 0; i < args.length; i++) + { + if (Objects.equals(args[i], "~")) + { + throw new WrongUsageException(getCommandUsage(sender)); + } + } + } + } +} diff --git a/src/main/java/serverutils/command/pregen/CmdStop.java b/src/main/java/serverutils/command/pregen/CmdStop.java new file mode 100644 index 000000000..69bf64f33 --- /dev/null +++ b/src/main/java/serverutils/command/pregen/CmdStop.java @@ -0,0 +1,26 @@ +package serverutils.command.pregen; + +import net.minecraft.command.ICommandSender; +import net.minecraft.util.ChatComponentText; +import serverutils.lib.command.CmdBase; +import serverutils.pregenerator.ChunkLoaderManager; + +public class CmdStop extends CmdBase { + public CmdStop() { + super("stop", Level.OP); + } + + @Override + public void processCommand(ICommandSender sender, String[] args) + { + if (ChunkLoaderManager.instance.isGenerating()) + { + ChunkLoaderManager.instance.reset(true); + sender.addChatMessage(new ChatComponentText("Cancelling pregeneration.")); + } + else + { + sender.addChatMessage(new ChatComponentText("No generator running.")); + } + } +} diff --git a/src/main/java/serverutils/handlers/ServerUtilitiesServerEventHandler.java b/src/main/java/serverutils/handlers/ServerUtilitiesServerEventHandler.java index 70cceb854..3f4228651 100644 --- a/src/main/java/serverutils/handlers/ServerUtilitiesServerEventHandler.java +++ b/src/main/java/serverutils/handlers/ServerUtilitiesServerEventHandler.java @@ -38,6 +38,7 @@ import serverutils.lib.util.text_components.Notification; import serverutils.lib.util.text_components.TextComponentParser; import serverutils.net.MessageUpdatePlayTime; +import serverutils.pregenerator.ChunkLoaderManager; import serverutils.ranks.Ranks; public class ServerUtilitiesServerEventHandler { @@ -227,6 +228,11 @@ public void onServerTick(TickEvent.ServerTickEvent event) { playerToKickForAfk.playerNetServerHandler .onDisconnect(new ChatComponentTranslation("multiplayer.disconnect.idling")); } + + if (ChunkLoaderManager.instance.isGenerating()) + { + ChunkLoaderManager.instance.queueChunks(1); + } } } diff --git a/src/main/java/serverutils/handlers/ServerUtilitiesWorldEventHandler.java b/src/main/java/serverutils/handlers/ServerUtilitiesWorldEventHandler.java index 83815fdc3..3bc081cc4 100644 --- a/src/main/java/serverutils/handlers/ServerUtilitiesWorldEventHandler.java +++ b/src/main/java/serverutils/handlers/ServerUtilitiesWorldEventHandler.java @@ -23,6 +23,7 @@ import serverutils.data.ClaimedChunks; import serverutils.data.ServerUtilitiesUniverseData; import serverutils.lib.math.ChunkDimPos; +import serverutils.pregenerator.ChunkLoaderManager; public class ServerUtilitiesWorldEventHandler { @@ -95,4 +96,33 @@ public void onExplosionDetonate(ExplosionEvent.Detonate event) { } } } + + @SubscribeEvent + public void onWorldLoad(WorldEvent.Load event) { + if (!event.world.isRemote) + { + int dimensionId = event.world.provider.dimensionId; + MinecraftServer server = MinecraftServer.getServer(); + if (!ChunkLoaderManager.instance.isGenerating() && !ChunkLoaderManager.instance.initializeFromPregeneratorFiles(server, dimensionId)) + { + ChunkLoaderManager.instance.reset(false); + System.out.println("No pregenerator to load for dimension Id: " + dimensionId); + } + else + { + System.out.println("Pregenerator loaded and running for dimension Id: " + dimensionId); + } + } + } + + @SubscribeEvent + public void onWorldUnload(WorldEvent.Unload event) { + if (!event.world.isRemote) + { + if (event.world.provider.dimensionId == ChunkLoaderManager.instance.getDimensionID() && ChunkLoaderManager.instance.isGenerating()) + { + ChunkLoaderManager.instance.reset(false); + } + } + } } diff --git a/src/main/java/serverutils/lib/util/misc/PregeneratorCommandInfo.java b/src/main/java/serverutils/lib/util/misc/PregeneratorCommandInfo.java new file mode 100644 index 000000000..47ca5d2ab --- /dev/null +++ b/src/main/java/serverutils/lib/util/misc/PregeneratorCommandInfo.java @@ -0,0 +1,50 @@ +package serverutils.lib.util.misc; + +import scala.Int; + +import java.util.Optional; + +public class PregeneratorCommandInfo +{ + private final double xLoc; + private final double zLoc; + private final int radius; + private final int dimensionID; + private final int iteration; + + public PregeneratorCommandInfo(double xLoc, double zLoc, int radius, int dimensionID, int iteration) + { + this.xLoc = xLoc; + this.zLoc = zLoc; + this.radius = radius; + this.iteration = iteration; + this.dimensionID = dimensionID; + } + + public PregeneratorCommandInfo(double xLoc, double zLoc, int radius, int dimensionID) + { + this(xLoc, zLoc, radius, dimensionID, -1); + } + + public double getXLoc() { + return xLoc; + } + + public double getZLoc() { + return zLoc; + } + + public int getRadius() { + return radius; + } + + public int getIteration() + { + return this.iteration; + } + + public int getDimensionID() + { + return this.dimensionID; + } +} diff --git a/src/main/java/serverutils/pregenerator/ChunkLoader.java b/src/main/java/serverutils/pregenerator/ChunkLoader.java new file mode 100644 index 000000000..484652902 --- /dev/null +++ b/src/main/java/serverutils/pregenerator/ChunkLoader.java @@ -0,0 +1,34 @@ +package serverutils.pregenerator; + +import net.minecraft.server.MinecraftServer; +import net.minecraft.world.gen.ChunkProviderServer; +import org.apache.commons.lang3.tuple.Pair; +import serverutils.pregenerator.filemanager.PregeneratorFileManager; +import serverutils.ServerUtilities; + +public class ChunkLoader +{ + private PregeneratorFileManager fileManager; + private int loadIteration = 0; + public ChunkLoader(PregeneratorFileManager fileManager) + { + this.fileManager = fileManager; + } + + public void processLoadChunk(MinecraftServer server, int dimensionId, Pair chunk) { + int x = chunk.getLeft(); + int z = chunk.getRight(); + + ChunkProviderServer cps = server.worldServerForDimension(dimensionId).theChunkProviderServer; + cps.loadChunk(x, z, () -> { + ChunkLoaderManager.instance.removeChunkFromList(); + this.fileManager.saveIteration(ChunkLoaderManager.instance.getChunkToLoadSize()); + loadIteration++; + if (loadIteration % 100 == 0) + { + ServerUtilities.LOGGER.info(ChunkLoaderManager.instance.progressString()); + } + }); + } +} + diff --git a/src/main/java/serverutils/pregenerator/ChunkLoaderManager.java b/src/main/java/serverutils/pregenerator/ChunkLoaderManager.java new file mode 100644 index 000000000..2aa743046 --- /dev/null +++ b/src/main/java/serverutils/pregenerator/ChunkLoaderManager.java @@ -0,0 +1,210 @@ +package serverutils.pregenerator; + +import net.minecraft.server.MinecraftServer; +import org.apache.commons.lang3.tuple.Pair; +import serverutils.lib.util.misc.PregeneratorCommandInfo; +import serverutils.pregenerator.filemanager.PregeneratorFileManager; + +import java.io.IOException; +import java.util.Optional; +import java.util.Vector; + +public class ChunkLoaderManager +{ + public final static ChunkLoaderManager instance = new ChunkLoaderManager(); + private boolean isGenerating = false; + private int dimensionID; + private MinecraftServer serverType; + private Vector> chunksToLoad = new Vector<>(1000); + private int totalChunksToLoad; + private int chunkToLoadIndex; + private ChunkLoader loader; + private PregeneratorFileManager fileManager; + + public void initializePregenerator(PregeneratorCommandInfo commandInfo, MinecraftServer server) throws IOException { + findChunksToLoadCircle(commandInfo.getRadius(), commandInfo.getXLoc(), commandInfo.getZLoc()); + this.totalChunksToLoad = chunksToLoad.size(); + this.chunkToLoadIndex = chunksToLoad.size() - 1; + this.dimensionID = commandInfo.getDimensionID(); + this.isGenerating = true; + this.serverType = server; + this.fileManager = new PregeneratorFileManager(this.serverType, commandInfo.getXLoc(), commandInfo.getZLoc(), commandInfo.getRadius(), commandInfo.getDimensionID()); + this.loader = new ChunkLoader(this.fileManager); + } + + public boolean initializeFromPregeneratorFiles(MinecraftServer server, int dimensionToCheck) + { + try + { + this.fileManager = new PregeneratorFileManager(server); + Optional commandInfoOptional = this.fileManager.getCommandInfo(); + if (commandInfoOptional.isPresent()) + { + PregeneratorCommandInfo commandInfo = commandInfoOptional.get(); + if (commandInfo.getDimensionID() != dimensionToCheck) + { + return false; + } + findChunksToLoadCircle(commandInfo.getRadius(), commandInfo.getXLoc(), commandInfo.getZLoc()); + this.totalChunksToLoad = chunksToLoad.size(); + this.chunkToLoadIndex = commandInfo.getIteration() - 1; + this.dimensionID = commandInfo.getDimensionID(); + if (this.chunkToLoadIndex < chunksToLoad.size()) { + this.chunksToLoad.subList(this.chunkToLoadIndex + 1, chunksToLoad.size()).clear(); + this.serverType = server; + this.isGenerating = true; + this.loader = new ChunkLoader(this.fileManager); + return this.fileManager.isReady(); + } + } + } + catch (IOException e) + { + e.printStackTrace(); + } + return false; + } + + public boolean isGenerating() + { + return this.isGenerating; + } + + // Passed in xCenter and passed in zCenter are both in block coordinates. Be sure to transform to chunk coordinates + // I've done a ton of testing with this. It works without duplicates and holes in the raster. + public void findChunksToLoadCircle(int radius, double xCenter, double zCenter) + { + // This is a solved problem. I'll use the wikipedia entry on this: https://en.wikipedia.org/wiki/Midpoint_circle_algorithm + int chunkXCenter = (int) Math.floor(xCenter / 16); + int chunkZCenter = (int) Math.floor(zCenter / 16); + double decisionTracker = 1 - radius; // This is used to tell if we need to step X down. + int x = radius; + int z = 0; + int previousX = radius; + while (x >= z) + { + // Add all symmetrical points + addChunk(chunkXCenter + x, chunkZCenter + z); + addChunk(chunkXCenter - x, chunkZCenter + z); + if (z != x) + { + addChunk(chunkXCenter + z, chunkZCenter + x); + addChunk(chunkXCenter + z, chunkZCenter - x); + } + + + if (z != 0) + { + addChunk(chunkXCenter + x, chunkZCenter - z); + addChunk(chunkXCenter - x, chunkZCenter - z); + if (z != x) + { + addChunk(chunkXCenter - z, chunkZCenter + x); + addChunk(chunkXCenter - z, chunkZCenter - x); + } + + } + + if(x != previousX) + { + addChunksBetween(chunkXCenter + x, chunkZCenter - z, chunkZCenter + z); + addChunksBetween(chunkXCenter - x, chunkZCenter - z, chunkZCenter + z); + } + previousX = x; + + if (x != z) + { + addChunksBetween( chunkXCenter + z, chunkZCenter - x, chunkZCenter + x); + if (z != 0) + { + addChunksBetween(chunkXCenter - z, chunkZCenter - x, chunkZCenter + x); + } + } + + z++; + if (decisionTracker < 0) + { + decisionTracker += 2 * z + 1; + } + else + { + x--; + decisionTracker += 2 * (z - x) + 1; + } + } + System.out.printf("Found %s chunks to load", chunksToLoad.size()); + } + + public void removeChunkFromList() + { + this.chunksToLoad.remove(this.chunksToLoad.size() - 1); + } + + public int getChunkToLoadSize() + { + return this.chunksToLoad.size(); + } + + public int getTotalChunksToLoad() + { + return this.totalChunksToLoad; + } + + public int getDimensionID() + { + return dimensionID; + } + public void queueChunks(int numChunksToQueue) + { + for (int i = 0; i < numChunksToQueue; i++) + { + if (!chunksToLoad.isEmpty()) + { + loader.processLoadChunk(this.serverType, this.dimensionID, chunksToLoad.get(chunkToLoadIndex)); + chunkToLoadIndex--; + } + else + { + fileManager.closeAndRemoveAllFiles(); + isGenerating = false; + } + } + } + public String progressString() + { + int chunksLoaded = totalChunksToLoad - chunksToLoad.size();; + double percentage = (double) chunksLoaded / totalChunksToLoad * 100; + return String.format("Loaded %d chunks of a total of %d. %.1f%% done.", chunksLoaded, totalChunksToLoad, percentage); + } + + public void reset(boolean hardReset) + { + this.isGenerating = false; + this.chunksToLoad.clear(); + this.chunkToLoadIndex = -1; + this.serverType = null; + this.loader = null; + this.dimensionID = Integer.MIN_VALUE; + if (hardReset) + { + fileManager.closeAndRemoveAllFiles(); + } + else + { + fileManager.closeAllFiles(); + } + this.fileManager = null; + } + + private void addChunk(int chunkX, int chunkZ) + { + chunksToLoad.add(Pair.of(chunkX, chunkZ)); + } + + private void addChunksBetween(int xLine, int zMin, int zMax) + { + for (int z = zMin + 1; z <= zMax - 1; z++) { + addChunk(xLine, z); + } + } +} diff --git a/src/main/java/serverutils/pregenerator/filemanager/PregeneratorFileManager.java b/src/main/java/serverutils/pregenerator/filemanager/PregeneratorFileManager.java new file mode 100644 index 000000000..1e490d8d6 --- /dev/null +++ b/src/main/java/serverutils/pregenerator/filemanager/PregeneratorFileManager.java @@ -0,0 +1,110 @@ +package serverutils.pregenerator.filemanager; + +import net.minecraft.server.MinecraftServer; +import serverutils.lib.util.misc.PregeneratorCommandInfo; +import serverutils.pregenerator.filemanager.readwriters.FileReadWriter; +import serverutils.pregenerator.filemanager.readwriters.SafeFileReadWriter; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.Optional; + +public class PregeneratorFileManager +{ + private final FileReadWriter commandReadWriter; + private final SafeFileReadWriter iterationReadWriter; + private final String COMMAND_FOLDER = "pregenerationFiles"; + private final String COMMAND_FILE = "fileCommand"; + private final String COMMAND_ITERATION = "fileIteration"; + public PregeneratorFileManager(MinecraftServer server, double xLoc, double zLoc, int radius, int dimensionID) throws IOException + { + Path temporaryFileSaveFolder = Paths.get("saves").resolve(getWorldFolderPath(server).resolve(COMMAND_FOLDER)); + if (!Files.exists(temporaryFileSaveFolder)) { + Files.createDirectories(temporaryFileSaveFolder); + } + this.iterationReadWriter = new SafeFileReadWriter(temporaryFileSaveFolder.resolve(COMMAND_ITERATION), 100); + this.commandReadWriter = new FileReadWriter(temporaryFileSaveFolder.resolve(COMMAND_FILE)); + + commandReadWriter.clearFile(); + commandReadWriter.writeDouble(xLoc); + commandReadWriter.writeDouble(zLoc); + commandReadWriter.writeInt(radius); + commandReadWriter.writeInt(dimensionID); + commandReadWriter.close(); + } + + // Constructor to load the information from file + public PregeneratorFileManager(MinecraftServer server) throws IOException { + Path temporaryFileSaveFolder = Paths.get("saves").resolve(getWorldFolderPath(server).resolve(COMMAND_FOLDER)); + if (!Files.exists(temporaryFileSaveFolder)) { + Files.createDirectories(temporaryFileSaveFolder); + } + this.iterationReadWriter = new SafeFileReadWriter(temporaryFileSaveFolder.resolve(COMMAND_ITERATION), 100); + this.commandReadWriter = new FileReadWriter(temporaryFileSaveFolder.resolve(COMMAND_FILE)); + } + + public Optional getCommandInfo() + { + try + { + commandReadWriter.openForReading(); + iterationReadWriter.openForReading(); + return Optional.of(new PregeneratorCommandInfo(commandReadWriter.readDouble(), commandReadWriter.readDouble(), commandReadWriter.readInt(), commandReadWriter.readInt(), iterationReadWriter.readInt())); + } + catch (IOException ignored) {} // Ignoring this because often there's just nothing in the file if you're loading a world + return Optional.empty(); + } + + public void saveIteration(int iteration) + { + try + { + iterationReadWriter.writeAndCommitIntAfterIterations(iteration); + } + catch (IOException e) + { + e.printStackTrace(); + } + } + + public void closeAndRemoveAllFiles() + { + try + { + iterationReadWriter.close(); + iterationReadWriter.deleteFile(); + commandReadWriter.close(); + commandReadWriter.deleteFile(); + } + catch (IOException e) + { + e.printStackTrace(); + } + } + + public void closeAllFiles() + { + try + { + iterationReadWriter.close(); + commandReadWriter.close(); + } + catch (IOException e) + { + e.printStackTrace(); + } + } + + public boolean isReady() + { + return true; + } + + + + private Path getWorldFolderPath(MinecraftServer server) { + return Paths.get(server.getFolderName()); + } +} diff --git a/src/main/java/serverutils/pregenerator/filemanager/readwriters/FileReadWriter.java b/src/main/java/serverutils/pregenerator/filemanager/readwriters/FileReadWriter.java new file mode 100644 index 000000000..e24a447f4 --- /dev/null +++ b/src/main/java/serverutils/pregenerator/filemanager/readwriters/FileReadWriter.java @@ -0,0 +1,67 @@ +package serverutils.pregenerator.filemanager.readwriters; + +import java.io.IOException; +import java.io.RandomAccessFile; +import java.nio.file.Files; +import java.nio.file.Path; + +public class FileReadWriter +{ + protected RandomAccessFile randomAccessFile; + protected boolean randomAccessFileIsClosed = false; + protected final Path filePath; + + public FileReadWriter(Path path) throws IOException { + this.filePath = path; + randomAccessFile = new RandomAccessFile(this.filePath.toFile(), "rw"); + } + public void close() throws IOException + { + randomAccessFileIsClosed = true; + randomAccessFile.close(); + } + + public void clearFile() throws IOException { + randomAccessFile.setLength(0); + } + + public void writeDouble(double value) throws IOException + { + randomAccessFile.writeDouble(value); + } + + public void writeInt(int value) throws IOException + { + randomAccessFile.writeInt(value); + } + + public void openForWriting() throws IOException + { + if (randomAccessFile == null || !filePath.toFile().exists() || randomAccessFileIsClosed) { + randomAccessFileIsClosed = false; + randomAccessFile = new RandomAccessFile(filePath.toFile(), "rw"); + } + } + + public void openForReading() throws IOException + { + if (randomAccessFile == null || !filePath.toFile().exists() || randomAccessFileIsClosed) { + randomAccessFileIsClosed = false; + randomAccessFile = new RandomAccessFile(filePath.toFile(), "r"); + } + } + + public int readInt() throws IOException + { + return randomAccessFile.readInt(); + } + + public double readDouble() throws IOException + { + return randomAccessFile.readDouble(); + } + + public void deleteFile() throws IOException { + Files.deleteIfExists(filePath); + } +} diff --git a/src/main/java/serverutils/pregenerator/filemanager/readwriters/SafeFileReadWriter.java b/src/main/java/serverutils/pregenerator/filemanager/readwriters/SafeFileReadWriter.java new file mode 100644 index 000000000..ddbf6dd81 --- /dev/null +++ b/src/main/java/serverutils/pregenerator/filemanager/readwriters/SafeFileReadWriter.java @@ -0,0 +1,85 @@ +package serverutils.pregenerator.filemanager.readwriters; + + +import java.io.IOException; +import java.io.RandomAccessFile; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.StandardCopyOption; + +public class SafeFileReadWriter extends FileReadWriter +{ + private final Path tempFile; + private RandomAccessFile randomAccessFileTemp; + private boolean randomAccessFileTempIsClosed = false; + private final int iterationsBetweenWrites; + private int writeIteration = 0; + + public SafeFileReadWriter(Path path, int iterationsBetweenWrites) throws IOException { + super(path); + this.iterationsBetweenWrites = iterationsBetweenWrites; + this.tempFile = Paths.get(path + ".tmp"); + randomAccessFileTemp = new RandomAccessFile(this.tempFile.toFile(), "rw"); + } + + public void writeAndCommitIntAfterIterations(int value) throws IOException + { + if (writeIteration >= iterationsBetweenWrites) + { + writeIteration = 0; + this.writeInt(value); + this.commit(); + } + else + { + writeIteration++; + } + } + + @Override + public void writeInt(int value) throws IOException + { + if (this.randomAccessFileTempIsClosed) + { + this.openForWriting(); + } + randomAccessFileTemp.seek(0); + randomAccessFileTemp.writeInt(value); + randomAccessFileTemp.getChannel().force(true); + } + + public void commit() throws IOException { + randomAccessFileTemp.close(); + randomAccessFileTempIsClosed = true; + randomAccessFile.close(); + randomAccessFileIsClosed = true; + Files.move(tempFile, filePath, StandardCopyOption.REPLACE_EXISTING, StandardCopyOption.ATOMIC_MOVE); + this.openForWriting(); + } + + @Override + public void clearFile() throws IOException { + randomAccessFile.setLength(0); + randomAccessFileTemp.setLength(0); + } + + @Override + public void close() throws IOException { + randomAccessFileIsClosed = true; + randomAccessFile.close(); + + randomAccessFileTempIsClosed = true; + randomAccessFileTemp.close(); + Files.deleteIfExists(tempFile); + } + + @Override + public void openForWriting() throws IOException + { + if (randomAccessFileTemp == null || !tempFile.toFile().exists() || randomAccessFileTempIsClosed) { + randomAccessFileTempIsClosed = false; + randomAccessFileTemp = new RandomAccessFile(tempFile.toFile(), "rw"); + } + } +} diff --git a/src/main/resources/assets/serverutilities/lang/en_US.lang b/src/main/resources/assets/serverutilities/lang/en_US.lang index bddb1326c..c827ee7f0 100644 --- a/src/main/resources/assets/serverutilities/lang/en_US.lang +++ b/src/main/resources/assets/serverutilities/lang/en_US.lang @@ -435,6 +435,9 @@ commands.god.usage=/god commands.rtp.usage=/rtp commands.dump_chunkloaders.usage=/dump_chunkloaders commands.dump_permissions.usage=/dump_permissions +commands.pregen.start.usage=/pregen start +commands.pregen.stop.usage=/pregen stop +commands.pregen.progress.usage=/pregen progress # Chunks serverutilities.lang.chunks.cant_modify_chunk=Can't modify this chunk! From 6b8ad81dada0a8d87e8d579657d455fa7d72d8dc Mon Sep 17 00:00:00 2001 From: rjnasers Date: Wed, 2 Oct 2024 20:27:34 -0500 Subject: [PATCH 2/4] Spotless --- .../serverutils/ServerUtilitiesConfig.java | 2 +- .../serverutils/command/pregen/CmdPregen.java | 1 + .../command/pregen/CmdProgress.java | 12 +- .../serverutils/command/pregen/CmdStart.java | 75 +++++------ .../serverutils/command/pregen/CmdStop.java | 12 +- .../ServerUtilitiesServerEventHandler.java | 3 +- .../ServerUtilitiesWorldEventHandler.java | 18 +-- .../util/misc/PregeneratorCommandInfo.java | 18 +-- .../serverutils/pregenerator/ChunkLoader.java | 16 +-- .../pregenerator/ChunkLoaderManager.java | 124 +++++++----------- .../filemanager/PregeneratorFileManager.java | 73 +++++------ .../readwriters/FileReadWriter.java | 26 ++-- .../readwriters/SafeFileReadWriter.java | 25 ++-- 13 files changed, 167 insertions(+), 238 deletions(-) diff --git a/src/main/java/serverutils/ServerUtilitiesConfig.java b/src/main/java/serverutils/ServerUtilitiesConfig.java index a32955b99..761e1ef4b 100644 --- a/src/main/java/serverutils/ServerUtilitiesConfig.java +++ b/src/main/java/serverutils/ServerUtilitiesConfig.java @@ -276,7 +276,7 @@ public static class Commands { @Config.DefaultBoolean(true) public boolean dump_stats; - + @Config.DefaultBoolean(true) public boolean pregen; } diff --git a/src/main/java/serverutils/command/pregen/CmdPregen.java b/src/main/java/serverutils/command/pregen/CmdPregen.java index 0041470a4..4bcfb26a7 100644 --- a/src/main/java/serverutils/command/pregen/CmdPregen.java +++ b/src/main/java/serverutils/command/pregen/CmdPregen.java @@ -4,6 +4,7 @@ import serverutils.lib.command.CmdTreeHelp; public class CmdPregen extends CmdTreeBase { + public CmdPregen() { super("pregen"); addSubcommand(new CmdProgress()); diff --git a/src/main/java/serverutils/command/pregen/CmdProgress.java b/src/main/java/serverutils/command/pregen/CmdProgress.java index 0b3d1160a..3abb2d78f 100644 --- a/src/main/java/serverutils/command/pregen/CmdProgress.java +++ b/src/main/java/serverutils/command/pregen/CmdProgress.java @@ -2,23 +2,21 @@ import net.minecraft.command.ICommandSender; import net.minecraft.util.ChatComponentText; + import serverutils.lib.command.CmdBase; import serverutils.pregenerator.ChunkLoaderManager; public class CmdProgress extends CmdBase { + public CmdProgress() { super("progress", Level.OP); } @Override - public void processCommand(ICommandSender sender, String[] args) - { - if (ChunkLoaderManager.instance.isGenerating()) - { + public void processCommand(ICommandSender sender, String[] args) { + if (ChunkLoaderManager.instance.isGenerating()) { sender.addChatMessage(new ChatComponentText(ChunkLoaderManager.instance.progressString())); - } - else - { + } else { sender.addChatMessage(new ChatComponentText("No generator running.")); } } diff --git a/src/main/java/serverutils/command/pregen/CmdStart.java b/src/main/java/serverutils/command/pregen/CmdStart.java index 88a077f0b..cbd51535f 100644 --- a/src/main/java/serverutils/command/pregen/CmdStart.java +++ b/src/main/java/serverutils/command/pregen/CmdStart.java @@ -1,86 +1,77 @@ package serverutils.command.pregen; +import java.io.IOException; +import java.util.Objects; + import net.minecraft.command.ICommandSender; import net.minecraft.command.WrongUsageException; import net.minecraft.server.MinecraftServer; import net.minecraft.util.ChatComponentText; + import serverutils.lib.command.CmdBase; import serverutils.lib.util.misc.PregeneratorCommandInfo; import serverutils.pregenerator.ChunkLoaderManager; -import java.io.IOException; -import java.util.Objects; - public class CmdStart extends CmdBase { + public CmdStart() { super("start", Level.OP); } - + @Override - public void processCommand(ICommandSender sender, String[] args) - { + public void processCommand(ICommandSender sender, String[] args) { checkArgs(sender, args, 3); - if (args.length > 2) - { + if (args.length > 2) { double xLoc, zLoc; - if (args[0].equals("~")) - { + if (args[0].equals("~")) { xLoc = sender.getPlayerCoordinates().posX; - } - else - { + } else { xLoc = parseDoubleBounded(sender, args[0], -30000000.0D, 30000000.0D); } - if (args[1].equals("~")) - { + if (args[1].equals("~")) { zLoc = sender.getPlayerCoordinates().posZ; - } - else - { + } else { zLoc = parseDoubleBounded(sender, args[1], -30000000.0D, 30000000.0D); } int radius = parseInt(sender, args[2]); - if (radius > 2000) - { - sender.addChatMessage(new ChatComponentText("Radii larger than 2000 are not permitted. World sizes will be 100's of gbs")); + if (radius > 2000) { + sender.addChatMessage( + new ChatComponentText( + "Radii larger than 2000 are not permitted. World sizes will be 100's of gbs")); return; } int dimensionID = sender.getEntityWorld().provider.dimensionId; PregeneratorCommandInfo commandInfo = new PregeneratorCommandInfo(xLoc, zLoc, radius, dimensionID); - if (!ChunkLoaderManager.instance.isGenerating()) - { - try - { + if (!ChunkLoaderManager.instance.isGenerating()) { + try { + sender.addChatMessage( + new ChatComponentText( + "Initializing pregenerator. Check progress with '/pregen progress'.")); ChunkLoaderManager.instance.initializePregenerator(commandInfo, MinecraftServer.getServer()); - } - catch (IOException e) - { + } catch (IOException e) { e.printStackTrace(); - sender.addChatMessage(new ChatComponentText("Cannot start a pregenerator! File exception when starting pregenerator!")); + sender.addChatMessage( + new ChatComponentText( + "Cannot start a pregenerator! File exception when starting pregenerator!")); } - } - else - { - sender.addChatMessage(new ChatComponentText("Cannot start a pregenerator! There's already generation in progress!")); + } else { + sender.addChatMessage( + new ChatComponentText("Cannot start a pregenerator! There's already generation in progress!")); } } } - + @Override - public void checkArgs(ICommandSender sender, String[] args, int i) - { + public void checkArgs(ICommandSender sender, String[] args, int i) { if (args.length < i) { throw new WrongUsageException(getCommandUsage(sender)); } - if (sender instanceof MinecraftServer) - { - for (int j = 0; i < args.length; i++) - { - if (Objects.equals(args[i], "~")) - { + if (sender instanceof MinecraftServer) { + for (int j = 0; j < args.length; j++) { + if (Objects.equals(args[i], "~")) { throw new WrongUsageException(getCommandUsage(sender)); } } diff --git a/src/main/java/serverutils/command/pregen/CmdStop.java b/src/main/java/serverutils/command/pregen/CmdStop.java index 69bf64f33..efe1086d0 100644 --- a/src/main/java/serverutils/command/pregen/CmdStop.java +++ b/src/main/java/serverutils/command/pregen/CmdStop.java @@ -2,24 +2,22 @@ import net.minecraft.command.ICommandSender; import net.minecraft.util.ChatComponentText; + import serverutils.lib.command.CmdBase; import serverutils.pregenerator.ChunkLoaderManager; public class CmdStop extends CmdBase { + public CmdStop() { super("stop", Level.OP); } @Override - public void processCommand(ICommandSender sender, String[] args) - { - if (ChunkLoaderManager.instance.isGenerating()) - { + public void processCommand(ICommandSender sender, String[] args) { + if (ChunkLoaderManager.instance.isGenerating()) { ChunkLoaderManager.instance.reset(true); sender.addChatMessage(new ChatComponentText("Cancelling pregeneration.")); - } - else - { + } else { sender.addChatMessage(new ChatComponentText("No generator running.")); } } diff --git a/src/main/java/serverutils/handlers/ServerUtilitiesServerEventHandler.java b/src/main/java/serverutils/handlers/ServerUtilitiesServerEventHandler.java index 3f4228651..4724c4514 100644 --- a/src/main/java/serverutils/handlers/ServerUtilitiesServerEventHandler.java +++ b/src/main/java/serverutils/handlers/ServerUtilitiesServerEventHandler.java @@ -229,8 +229,7 @@ public void onServerTick(TickEvent.ServerTickEvent event) { .onDisconnect(new ChatComponentTranslation("multiplayer.disconnect.idling")); } - if (ChunkLoaderManager.instance.isGenerating()) - { + if (ChunkLoaderManager.instance.isGenerating()) { ChunkLoaderManager.instance.queueChunks(1); } } diff --git a/src/main/java/serverutils/handlers/ServerUtilitiesWorldEventHandler.java b/src/main/java/serverutils/handlers/ServerUtilitiesWorldEventHandler.java index 3bc081cc4..d5d000393 100644 --- a/src/main/java/serverutils/handlers/ServerUtilitiesWorldEventHandler.java +++ b/src/main/java/serverutils/handlers/ServerUtilitiesWorldEventHandler.java @@ -99,17 +99,14 @@ public void onExplosionDetonate(ExplosionEvent.Detonate event) { @SubscribeEvent public void onWorldLoad(WorldEvent.Load event) { - if (!event.world.isRemote) - { + if (!event.world.isRemote) { int dimensionId = event.world.provider.dimensionId; MinecraftServer server = MinecraftServer.getServer(); - if (!ChunkLoaderManager.instance.isGenerating() && !ChunkLoaderManager.instance.initializeFromPregeneratorFiles(server, dimensionId)) - { + if (!ChunkLoaderManager.instance.isGenerating() + && !ChunkLoaderManager.instance.initializeFromPregeneratorFiles(server, dimensionId)) { ChunkLoaderManager.instance.reset(false); System.out.println("No pregenerator to load for dimension Id: " + dimensionId); - } - else - { + } else { System.out.println("Pregenerator loaded and running for dimension Id: " + dimensionId); } } @@ -117,10 +114,9 @@ public void onWorldLoad(WorldEvent.Load event) { @SubscribeEvent public void onWorldUnload(WorldEvent.Unload event) { - if (!event.world.isRemote) - { - if (event.world.provider.dimensionId == ChunkLoaderManager.instance.getDimensionID() && ChunkLoaderManager.instance.isGenerating()) - { + if (!event.world.isRemote) { + if (event.world.provider.dimensionId == ChunkLoaderManager.instance.getDimensionID() + && ChunkLoaderManager.instance.isGenerating()) { ChunkLoaderManager.instance.reset(false); } } diff --git a/src/main/java/serverutils/lib/util/misc/PregeneratorCommandInfo.java b/src/main/java/serverutils/lib/util/misc/PregeneratorCommandInfo.java index 47ca5d2ab..343dc0ac4 100644 --- a/src/main/java/serverutils/lib/util/misc/PregeneratorCommandInfo.java +++ b/src/main/java/serverutils/lib/util/misc/PregeneratorCommandInfo.java @@ -1,19 +1,14 @@ package serverutils.lib.util.misc; -import scala.Int; +public class PregeneratorCommandInfo { -import java.util.Optional; - -public class PregeneratorCommandInfo -{ private final double xLoc; private final double zLoc; private final int radius; private final int dimensionID; private final int iteration; - public PregeneratorCommandInfo(double xLoc, double zLoc, int radius, int dimensionID, int iteration) - { + public PregeneratorCommandInfo(double xLoc, double zLoc, int radius, int dimensionID, int iteration) { this.xLoc = xLoc; this.zLoc = zLoc; this.radius = radius; @@ -21,8 +16,7 @@ public PregeneratorCommandInfo(double xLoc, double zLoc, int radius, int dimensi this.dimensionID = dimensionID; } - public PregeneratorCommandInfo(double xLoc, double zLoc, int radius, int dimensionID) - { + public PregeneratorCommandInfo(double xLoc, double zLoc, int radius, int dimensionID) { this(xLoc, zLoc, radius, dimensionID, -1); } @@ -38,13 +32,11 @@ public int getRadius() { return radius; } - public int getIteration() - { + public int getIteration() { return this.iteration; } - public int getDimensionID() - { + public int getDimensionID() { return this.dimensionID; } } diff --git a/src/main/java/serverutils/pregenerator/ChunkLoader.java b/src/main/java/serverutils/pregenerator/ChunkLoader.java index 484652902..ea4848b7b 100644 --- a/src/main/java/serverutils/pregenerator/ChunkLoader.java +++ b/src/main/java/serverutils/pregenerator/ChunkLoader.java @@ -2,16 +2,18 @@ import net.minecraft.server.MinecraftServer; import net.minecraft.world.gen.ChunkProviderServer; + import org.apache.commons.lang3.tuple.Pair; -import serverutils.pregenerator.filemanager.PregeneratorFileManager; + import serverutils.ServerUtilities; +import serverutils.pregenerator.filemanager.PregeneratorFileManager; + +public class ChunkLoader { -public class ChunkLoader -{ private PregeneratorFileManager fileManager; private int loadIteration = 0; - public ChunkLoader(PregeneratorFileManager fileManager) - { + + public ChunkLoader(PregeneratorFileManager fileManager) { this.fileManager = fileManager; } @@ -24,11 +26,9 @@ public void processLoadChunk(MinecraftServer server, int dimensionId, Pair commandInfoOptional = this.fileManager.getCommandInfo(); - if (commandInfoOptional.isPresent()) - { + if (commandInfoOptional.isPresent()) { PregeneratorCommandInfo commandInfo = commandInfoOptional.get(); - if (commandInfo.getDimensionID() != dimensionToCheck) - { + if (commandInfo.getDimensionID() != dimensionToCheck) { return false; } findChunksToLoadCircle(commandInfo.getRadius(), commandInfo.getXLoc(), commandInfo.getZLoc()); @@ -57,77 +60,63 @@ public boolean initializeFromPregeneratorFiles(MinecraftServer server, int dimen return this.fileManager.isReady(); } } - } - catch (IOException e) - { + } catch (IOException e) { e.printStackTrace(); } return false; } - public boolean isGenerating() - { + public boolean isGenerating() { return this.isGenerating; } // Passed in xCenter and passed in zCenter are both in block coordinates. Be sure to transform to chunk coordinates // I've done a ton of testing with this. It works without duplicates and holes in the raster. - public void findChunksToLoadCircle(int radius, double xCenter, double zCenter) - { - // This is a solved problem. I'll use the wikipedia entry on this: https://en.wikipedia.org/wiki/Midpoint_circle_algorithm + public void findChunksToLoadCircle(int radius, double xCenter, double zCenter) { + // This is a solved problem. I'll use the wikipedia entry on this: + // https://en.wikipedia.org/wiki/Midpoint_circle_algorithm int chunkXCenter = (int) Math.floor(xCenter / 16); int chunkZCenter = (int) Math.floor(zCenter / 16); double decisionTracker = 1 - radius; // This is used to tell if we need to step X down. int x = radius; int z = 0; int previousX = radius; - while (x >= z) - { + while (x >= z) { // Add all symmetrical points addChunk(chunkXCenter + x, chunkZCenter + z); addChunk(chunkXCenter - x, chunkZCenter + z); - if (z != x) - { + if (z != x) { addChunk(chunkXCenter + z, chunkZCenter + x); addChunk(chunkXCenter + z, chunkZCenter - x); } - - if (z != 0) - { + if (z != 0) { addChunk(chunkXCenter + x, chunkZCenter - z); addChunk(chunkXCenter - x, chunkZCenter - z); - if (z != x) - { + if (z != x) { addChunk(chunkXCenter - z, chunkZCenter + x); addChunk(chunkXCenter - z, chunkZCenter - x); } } - if(x != previousX) - { + if (x != previousX) { addChunksBetween(chunkXCenter + x, chunkZCenter - z, chunkZCenter + z); addChunksBetween(chunkXCenter - x, chunkZCenter - z, chunkZCenter + z); } previousX = x; - if (x != z) - { - addChunksBetween( chunkXCenter + z, chunkZCenter - x, chunkZCenter + x); - if (z != 0) - { + if (x != z) { + addChunksBetween(chunkXCenter + z, chunkZCenter - x, chunkZCenter + x); + if (z != 0) { addChunksBetween(chunkXCenter - z, chunkZCenter - x, chunkZCenter + x); } } z++; - if (decisionTracker < 0) - { + if (decisionTracker < 0) { decisionTracker += 2 * z + 1; - } - else - { + } else { x--; decisionTracker += 2 * (z - x) + 1; } @@ -135,74 +124,61 @@ public void findChunksToLoadCircle(int radius, double xCenter, double zCenter) System.out.printf("Found %s chunks to load", chunksToLoad.size()); } - public void removeChunkFromList() - { + public void removeChunkFromList() { this.chunksToLoad.remove(this.chunksToLoad.size() - 1); } - public int getChunkToLoadSize() - { + public int getChunkToLoadSize() { return this.chunksToLoad.size(); } - public int getTotalChunksToLoad() - { + public int getTotalChunksToLoad() { return this.totalChunksToLoad; } - public int getDimensionID() - { + public int getDimensionID() { return dimensionID; } - public void queueChunks(int numChunksToQueue) - { - for (int i = 0; i < numChunksToQueue; i++) - { - if (!chunksToLoad.isEmpty()) - { + + public void queueChunks(int numChunksToQueue) { + for (int i = 0; i < numChunksToQueue; i++) { + if (!chunksToLoad.isEmpty()) { loader.processLoadChunk(this.serverType, this.dimensionID, chunksToLoad.get(chunkToLoadIndex)); chunkToLoadIndex--; - } - else - { + } else { fileManager.closeAndRemoveAllFiles(); isGenerating = false; } } } - public String progressString() - { + + public String progressString() { int chunksLoaded = totalChunksToLoad - chunksToLoad.size();; double percentage = (double) chunksLoaded / totalChunksToLoad * 100; - return String.format("Loaded %d chunks of a total of %d. %.1f%% done.", chunksLoaded, totalChunksToLoad, percentage); + return String + .format("Loaded %d chunks of a total of %d. %.1f%% done.", chunksLoaded, totalChunksToLoad, percentage); } - public void reset(boolean hardReset) - { + public void reset(boolean hardReset) { this.isGenerating = false; this.chunksToLoad.clear(); this.chunkToLoadIndex = -1; this.serverType = null; this.loader = null; this.dimensionID = Integer.MIN_VALUE; - if (hardReset) - { + if (hardReset) { fileManager.closeAndRemoveAllFiles(); - } - else - { + } else { fileManager.closeAllFiles(); } this.fileManager = null; } - private void addChunk(int chunkX, int chunkZ) - { + private void addChunk(int chunkX, int chunkZ) { chunksToLoad.add(Pair.of(chunkX, chunkZ)); } - private void addChunksBetween(int xLine, int zMin, int zMax) - { + private void addChunksBetween(int xLine, int zMin, int zMax) { for (int z = zMin + 1; z <= zMax - 1; z++) { addChunk(xLine, z); } diff --git a/src/main/java/serverutils/pregenerator/filemanager/PregeneratorFileManager.java b/src/main/java/serverutils/pregenerator/filemanager/PregeneratorFileManager.java index 1e490d8d6..367be917f 100644 --- a/src/main/java/serverutils/pregenerator/filemanager/PregeneratorFileManager.java +++ b/src/main/java/serverutils/pregenerator/filemanager/PregeneratorFileManager.java @@ -1,25 +1,27 @@ package serverutils.pregenerator.filemanager; -import net.minecraft.server.MinecraftServer; -import serverutils.lib.util.misc.PregeneratorCommandInfo; -import serverutils.pregenerator.filemanager.readwriters.FileReadWriter; -import serverutils.pregenerator.filemanager.readwriters.SafeFileReadWriter; - import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.Optional; -public class PregeneratorFileManager -{ +import net.minecraft.server.MinecraftServer; + +import serverutils.lib.util.misc.PregeneratorCommandInfo; +import serverutils.pregenerator.filemanager.readwriters.FileReadWriter; +import serverutils.pregenerator.filemanager.readwriters.SafeFileReadWriter; + +public class PregeneratorFileManager { + private final FileReadWriter commandReadWriter; private final SafeFileReadWriter iterationReadWriter; private final String COMMAND_FOLDER = "pregenerationFiles"; private final String COMMAND_FILE = "fileCommand"; private final String COMMAND_ITERATION = "fileIteration"; - public PregeneratorFileManager(MinecraftServer server, double xLoc, double zLoc, int radius, int dimensionID) throws IOException - { + + public PregeneratorFileManager(MinecraftServer server, double xLoc, double zLoc, int radius, int dimensionID) + throws IOException { Path temporaryFileSaveFolder = Paths.get("saves").resolve(getWorldFolderPath(server).resolve(COMMAND_FOLDER)); if (!Files.exists(temporaryFileSaveFolder)) { Files.createDirectories(temporaryFileSaveFolder); @@ -45,65 +47,54 @@ public PregeneratorFileManager(MinecraftServer server) throws IOException { this.commandReadWriter = new FileReadWriter(temporaryFileSaveFolder.resolve(COMMAND_FILE)); } - public Optional getCommandInfo() - { - try - { + public Optional getCommandInfo() { + try { commandReadWriter.openForReading(); iterationReadWriter.openForReading(); - return Optional.of(new PregeneratorCommandInfo(commandReadWriter.readDouble(), commandReadWriter.readDouble(), commandReadWriter.readInt(), commandReadWriter.readInt(), iterationReadWriter.readInt())); - } - catch (IOException ignored) {} // Ignoring this because often there's just nothing in the file if you're loading a world + return Optional.of( + new PregeneratorCommandInfo( + commandReadWriter.readDouble(), + commandReadWriter.readDouble(), + commandReadWriter.readInt(), + commandReadWriter.readInt(), + iterationReadWriter.readInt())); + } catch (IOException ignored) {} // Ignoring this because often there's just nothing in the file if you're + // loading a world return Optional.empty(); } - public void saveIteration(int iteration) - { - try - { + public void saveIteration(int iteration) { + try { iterationReadWriter.writeAndCommitIntAfterIterations(iteration); - } - catch (IOException e) - { + } catch (IOException e) { e.printStackTrace(); } } - public void closeAndRemoveAllFiles() - { - try - { + public void closeAndRemoveAllFiles() { + try { iterationReadWriter.close(); iterationReadWriter.deleteFile(); commandReadWriter.close(); commandReadWriter.deleteFile(); - } - catch (IOException e) - { + } catch (IOException e) { e.printStackTrace(); } } - public void closeAllFiles() - { - try - { + public void closeAllFiles() { + try { iterationReadWriter.close(); commandReadWriter.close(); - } - catch (IOException e) - { + } catch (IOException e) { e.printStackTrace(); } } - public boolean isReady() - { + public boolean isReady() { return true; } - - private Path getWorldFolderPath(MinecraftServer server) { return Paths.get(server.getFolderName()); } diff --git a/src/main/java/serverutils/pregenerator/filemanager/readwriters/FileReadWriter.java b/src/main/java/serverutils/pregenerator/filemanager/readwriters/FileReadWriter.java index e24a447f4..505f44002 100644 --- a/src/main/java/serverutils/pregenerator/filemanager/readwriters/FileReadWriter.java +++ b/src/main/java/serverutils/pregenerator/filemanager/readwriters/FileReadWriter.java @@ -5,8 +5,8 @@ import java.nio.file.Files; import java.nio.file.Path; -public class FileReadWriter -{ +public class FileReadWriter { + protected RandomAccessFile randomAccessFile; protected boolean randomAccessFileIsClosed = false; protected final Path filePath; @@ -15,8 +15,8 @@ public FileReadWriter(Path path) throws IOException { this.filePath = path; randomAccessFile = new RandomAccessFile(this.filePath.toFile(), "rw"); } - public void close() throws IOException - { + + public void close() throws IOException { randomAccessFileIsClosed = true; randomAccessFile.close(); } @@ -25,39 +25,33 @@ public void clearFile() throws IOException { randomAccessFile.setLength(0); } - public void writeDouble(double value) throws IOException - { + public void writeDouble(double value) throws IOException { randomAccessFile.writeDouble(value); } - public void writeInt(int value) throws IOException - { + public void writeInt(int value) throws IOException { randomAccessFile.writeInt(value); } - public void openForWriting() throws IOException - { + public void openForWriting() throws IOException { if (randomAccessFile == null || !filePath.toFile().exists() || randomAccessFileIsClosed) { randomAccessFileIsClosed = false; randomAccessFile = new RandomAccessFile(filePath.toFile(), "rw"); } } - public void openForReading() throws IOException - { + public void openForReading() throws IOException { if (randomAccessFile == null || !filePath.toFile().exists() || randomAccessFileIsClosed) { randomAccessFileIsClosed = false; randomAccessFile = new RandomAccessFile(filePath.toFile(), "r"); } } - public int readInt() throws IOException - { + public int readInt() throws IOException { return randomAccessFile.readInt(); } - public double readDouble() throws IOException - { + public double readDouble() throws IOException { return randomAccessFile.readDouble(); } diff --git a/src/main/java/serverutils/pregenerator/filemanager/readwriters/SafeFileReadWriter.java b/src/main/java/serverutils/pregenerator/filemanager/readwriters/SafeFileReadWriter.java index ddbf6dd81..3e1fdd185 100644 --- a/src/main/java/serverutils/pregenerator/filemanager/readwriters/SafeFileReadWriter.java +++ b/src/main/java/serverutils/pregenerator/filemanager/readwriters/SafeFileReadWriter.java @@ -1,6 +1,5 @@ package serverutils.pregenerator.filemanager.readwriters; - import java.io.IOException; import java.io.RandomAccessFile; import java.nio.file.Files; @@ -8,8 +7,9 @@ import java.nio.file.Paths; import java.nio.file.StandardCopyOption; -public class SafeFileReadWriter extends FileReadWriter -{ +// TODO : MAKE THIS BOUNCE BETWEEN 2 FILES +public class SafeFileReadWriter extends FileReadWriter { + private final Path tempFile; private RandomAccessFile randomAccessFileTemp; private boolean randomAccessFileTempIsClosed = false; @@ -23,25 +23,19 @@ public SafeFileReadWriter(Path path, int iterationsBetweenWrites) throws IOExcep randomAccessFileTemp = new RandomAccessFile(this.tempFile.toFile(), "rw"); } - public void writeAndCommitIntAfterIterations(int value) throws IOException - { - if (writeIteration >= iterationsBetweenWrites) - { + public void writeAndCommitIntAfterIterations(int value) throws IOException { + if (writeIteration >= iterationsBetweenWrites) { writeIteration = 0; this.writeInt(value); this.commit(); - } - else - { + } else { writeIteration++; } } @Override - public void writeInt(int value) throws IOException - { - if (this.randomAccessFileTempIsClosed) - { + public void writeInt(int value) throws IOException { + if (this.randomAccessFileTempIsClosed) { this.openForWriting(); } randomAccessFileTemp.seek(0); @@ -75,8 +69,7 @@ public void close() throws IOException { } @Override - public void openForWriting() throws IOException - { + public void openForWriting() throws IOException { if (randomAccessFileTemp == null || !tempFile.toFile().exists() || randomAccessFileTempIsClosed) { randomAccessFileTempIsClosed = false; randomAccessFileTemp = new RandomAccessFile(tempFile.toFile(), "rw"); From c917fa20b1e7038fcf358ce98b64dcb2d40dbbfc Mon Sep 17 00:00:00 2001 From: rjnasers Date: Mon, 7 Oct 2024 01:08:18 -0500 Subject: [PATCH 3/4] Handling comments except for one --- .../serverutils/command/pregen/CmdStart.java | 96 ++++++++++++------- .../ServerUtilitiesWorldEventHandler.java | 8 +- .../serverutils/pregenerator/ChunkLoader.java | 13 +-- .../pregenerator/ChunkLoaderManager.java | 55 +++++++---- .../filemanager/PregeneratorFileManager.java | 6 +- .../assets/serverutilities/lang/en_US.lang | 3 +- 6 files changed, 112 insertions(+), 69 deletions(-) diff --git a/src/main/java/serverutils/command/pregen/CmdStart.java b/src/main/java/serverutils/command/pregen/CmdStart.java index cbd51535f..0a7dc45fe 100644 --- a/src/main/java/serverutils/command/pregen/CmdStart.java +++ b/src/main/java/serverutils/command/pregen/CmdStart.java @@ -9,6 +9,7 @@ import net.minecraft.util.ChatComponentText; import serverutils.lib.command.CmdBase; +import serverutils.lib.command.ICommandWithParent; import serverutils.lib.util.misc.PregeneratorCommandInfo; import serverutils.pregenerator.ChunkLoaderManager; @@ -20,61 +21,88 @@ public CmdStart() { @Override public void processCommand(ICommandSender sender, String[] args) { - checkArgs(sender, args, 3); - if (args.length > 2) { - double xLoc, zLoc; - if (args[0].equals("~")) { - xLoc = sender.getPlayerCoordinates().posX; - } else { - xLoc = parseDoubleBounded(sender, args[0], -30000000.0D, 30000000.0D); - } + checkArgs(sender, args, 1); + + int radius; + double xLoc, zLoc; + + if (args.length == 3) { + xLoc = parseDoubleBounded(sender, args[0], -30000000.0D, 30000000.0D); + zLoc = parseDoubleBounded(sender, args[1], -30000000.0D, 30000000.0D); - if (args[1].equals("~")) { - zLoc = sender.getPlayerCoordinates().posZ; - } else { - zLoc = parseDoubleBounded(sender, args[1], -30000000.0D, 30000000.0D); + radius = parseInt(sender, args[2]); + if (radius > 2000) { + sender.addChatMessage( + new ChatComponentText( + "Radii larger than 2000 are not permitted. World sizes will be 100's of gbs")); + return; } + } + else + { + xLoc = sender.getPlayerCoordinates().posX; + zLoc = sender.getPlayerCoordinates().posZ; - int radius = parseInt(sender, args[2]); + radius = parseInt(sender, args[0]); if (radius > 2000) { sender.addChatMessage( new ChatComponentText( "Radii larger than 2000 are not permitted. World sizes will be 100's of gbs")); return; } + } - int dimensionID = sender.getEntityWorld().provider.dimensionId; - PregeneratorCommandInfo commandInfo = new PregeneratorCommandInfo(xLoc, zLoc, radius, dimensionID); - if (!ChunkLoaderManager.instance.isGenerating()) { - try { - sender.addChatMessage( - new ChatComponentText( - "Initializing pregenerator. Check progress with '/pregen progress'.")); - ChunkLoaderManager.instance.initializePregenerator(commandInfo, MinecraftServer.getServer()); - } catch (IOException e) { - e.printStackTrace(); - sender.addChatMessage( - new ChatComponentText( - "Cannot start a pregenerator! File exception when starting pregenerator!")); - } - } else { + int dimensionID = sender.getEntityWorld().provider.dimensionId; + PregeneratorCommandInfo commandInfo = new PregeneratorCommandInfo(xLoc, zLoc, radius, dimensionID); + + if (!ChunkLoaderManager.instance.isGenerating()) { + try { sender.addChatMessage( - new ChatComponentText("Cannot start a pregenerator! There's already generation in progress!")); + new ChatComponentText( + "Initializing pregenerator. Check progress with '/pregen progress'.")); + ChunkLoaderManager.instance.initializePregenerator(commandInfo, MinecraftServer.getServer()); + } catch (IOException e) { + e.printStackTrace(); + sender.addChatMessage( + new ChatComponentText( + "Cannot start a pregenerator! File exception when starting pregenerator!")); } + } else { + sender.addChatMessage( + new ChatComponentText("Cannot start a pregenerator! There's already generation in progress!")); } } @Override public void checkArgs(ICommandSender sender, String[] args, int i) { + if (args.length < i) { throw new WrongUsageException(getCommandUsage(sender)); } - if (sender instanceof MinecraftServer) { - for (int j = 0; j < args.length; j++) { - if (Objects.equals(args[i], "~")) { - throw new WrongUsageException(getCommandUsage(sender)); - } + + if (sender instanceof MinecraftServer) + { + if (args.length != 3) + { + throw new WrongUsageException(getCommandUsage(sender)); + } + } + else + { + if (!(args.length == 1 || args.length == 3) ) + { + throw new WrongUsageException(getCommandUsage(sender)); } } } + + @Override + public String getCommandUsage(ICommandSender sender) { + if (sender instanceof MinecraftServer) + { + return "commands." + ICommandWithParent.getCommandPath(this) + ".usage_server"; + } + + return "commands." + ICommandWithParent.getCommandPath(this) + ".usage_client"; + } } diff --git a/src/main/java/serverutils/handlers/ServerUtilitiesWorldEventHandler.java b/src/main/java/serverutils/handlers/ServerUtilitiesWorldEventHandler.java index d5d000393..889609a1c 100644 --- a/src/main/java/serverutils/handlers/ServerUtilitiesWorldEventHandler.java +++ b/src/main/java/serverutils/handlers/ServerUtilitiesWorldEventHandler.java @@ -18,6 +18,7 @@ import net.minecraftforge.event.world.WorldEvent; import cpw.mods.fml.common.eventhandler.SubscribeEvent; +import serverutils.ServerUtilities; import serverutils.ServerUtilitiesConfig; import serverutils.data.ClaimedChunk; import serverutils.data.ClaimedChunks; @@ -103,11 +104,8 @@ public void onWorldLoad(WorldEvent.Load event) { int dimensionId = event.world.provider.dimensionId; MinecraftServer server = MinecraftServer.getServer(); if (!ChunkLoaderManager.instance.isGenerating() - && !ChunkLoaderManager.instance.initializeFromPregeneratorFiles(server, dimensionId)) { - ChunkLoaderManager.instance.reset(false); - System.out.println("No pregenerator to load for dimension Id: " + dimensionId); - } else { - System.out.println("Pregenerator loaded and running for dimension Id: " + dimensionId); + && ChunkLoaderManager.instance.initializeFromPregeneratorFiles(server, dimensionId)) { + ServerUtilities.LOGGER.info("Pregenerator loaded and running for dimension Id: " + dimensionId); } } } diff --git a/src/main/java/serverutils/pregenerator/ChunkLoader.java b/src/main/java/serverutils/pregenerator/ChunkLoader.java index ea4848b7b..0b2714bae 100644 --- a/src/main/java/serverutils/pregenerator/ChunkLoader.java +++ b/src/main/java/serverutils/pregenerator/ChunkLoader.java @@ -3,11 +3,12 @@ import net.minecraft.server.MinecraftServer; import net.minecraft.world.gen.ChunkProviderServer; -import org.apache.commons.lang3.tuple.Pair; - import serverutils.ServerUtilities; import serverutils.pregenerator.filemanager.PregeneratorFileManager; +import static com.gtnewhorizon.gtnhlib.util.CoordinatePacker.unpackX; +import static com.gtnewhorizon.gtnhlib.util.CoordinatePacker.unpackZ; + public class ChunkLoader { private PregeneratorFileManager fileManager; @@ -17,10 +18,10 @@ public ChunkLoader(PregeneratorFileManager fileManager) { this.fileManager = fileManager; } - public void processLoadChunk(MinecraftServer server, int dimensionId, Pair chunk) { - int x = chunk.getLeft(); - int z = chunk.getRight(); - + public void processLoadChunk(MinecraftServer server, int dimensionId, Long chunk) { + int x = unpackX(chunk); + int z = unpackZ(chunk); + ChunkProviderServer cps = server.worldServerForDimension(dimensionId).theChunkProviderServer; cps.loadChunk(x, z, () -> { ChunkLoaderManager.instance.removeChunkFromList(); diff --git a/src/main/java/serverutils/pregenerator/ChunkLoaderManager.java b/src/main/java/serverutils/pregenerator/ChunkLoaderManager.java index 4c22f08a4..48988c2c5 100644 --- a/src/main/java/serverutils/pregenerator/ChunkLoaderManager.java +++ b/src/main/java/serverutils/pregenerator/ChunkLoaderManager.java @@ -1,9 +1,13 @@ package serverutils.pregenerator; import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; import java.util.Optional; import java.util.Vector; +import it.unimi.dsi.fastutil.longs.LongArrayList; import net.minecraft.server.MinecraftServer; import org.apache.commons.lang3.tuple.Pair; @@ -11,13 +15,15 @@ import serverutils.lib.util.misc.PregeneratorCommandInfo; import serverutils.pregenerator.filemanager.PregeneratorFileManager; +import static com.gtnewhorizon.gtnhlib.util.CoordinatePacker.pack; + public class ChunkLoaderManager { public final static ChunkLoaderManager instance = new ChunkLoaderManager(); private boolean isGenerating = false; private int dimensionID; private MinecraftServer serverType; - private Vector> chunksToLoad = new Vector<>(1000); + private LongArrayList chunksToLoad = new LongArrayList(1000); private int totalChunksToLoad; private int chunkToLoadIndex; private ChunkLoader loader; @@ -41,26 +47,35 @@ public void initializePregenerator(PregeneratorCommandInfo commandInfo, Minecraf public boolean initializeFromPregeneratorFiles(MinecraftServer server, int dimensionToCheck) { try { - this.fileManager = new PregeneratorFileManager(server); - Optional commandInfoOptional = this.fileManager.getCommandInfo(); - if (commandInfoOptional.isPresent()) { - PregeneratorCommandInfo commandInfo = commandInfoOptional.get(); - if (commandInfo.getDimensionID() != dimensionToCheck) { - return false; - } - findChunksToLoadCircle(commandInfo.getRadius(), commandInfo.getXLoc(), commandInfo.getZLoc()); - this.totalChunksToLoad = chunksToLoad.size(); - this.chunkToLoadIndex = commandInfo.getIteration() - 1; - this.dimensionID = commandInfo.getDimensionID(); - if (this.chunkToLoadIndex < chunksToLoad.size()) { - this.chunksToLoad.subList(this.chunkToLoadIndex + 1, chunksToLoad.size()).clear(); - this.serverType = server; - this.isGenerating = true; - this.loader = new ChunkLoader(this.fileManager); - return this.fileManager.isReady(); + Path commandFolderPath = Paths.get("saves") + .resolve(server.getFolderName()) + .resolve(PregeneratorFileManager.COMMAND_FOLDER); + if (Files.exists(commandFolderPath.resolve(PregeneratorFileManager.COMMAND_FILE)) && + Files.exists(commandFolderPath.resolve(PregeneratorFileManager.COMMAND_ITERATION))) + { + this.fileManager = new PregeneratorFileManager(server); + Optional commandInfoOptional = this.fileManager.getCommandInfo(); + if (commandInfoOptional.isPresent()) { + PregeneratorCommandInfo commandInfo = commandInfoOptional.get(); + if (commandInfo.getDimensionID() != dimensionToCheck) { + return false; + } + findChunksToLoadCircle(commandInfo.getRadius(), commandInfo.getXLoc(), commandInfo.getZLoc()); + this.totalChunksToLoad = chunksToLoad.size(); + this.chunkToLoadIndex = commandInfo.getIteration() - 1; + this.dimensionID = commandInfo.getDimensionID(); + if (this.chunkToLoadIndex < chunksToLoad.size()) { + this.chunksToLoad.subList(this.chunkToLoadIndex + 1, chunksToLoad.size()).clear(); + this.serverType = server; + this.isGenerating = true; + this.loader = new ChunkLoader(this.fileManager); + return this.fileManager.isReady(); + } } } + } catch (IOException e) { + this.reset(true); e.printStackTrace(); } return false; @@ -143,7 +158,7 @@ public int getDimensionID() { public void queueChunks(int numChunksToQueue) { for (int i = 0; i < numChunksToQueue; i++) { if (!chunksToLoad.isEmpty()) { - loader.processLoadChunk(this.serverType, this.dimensionID, chunksToLoad.get(chunkToLoadIndex)); + loader.processLoadChunk(this.serverType, this.dimensionID, chunksToLoad.getLong(chunkToLoadIndex)); chunkToLoadIndex--; } else { fileManager.closeAndRemoveAllFiles(); @@ -175,7 +190,7 @@ public void reset(boolean hardReset) { } private void addChunk(int chunkX, int chunkZ) { - chunksToLoad.add(Pair.of(chunkX, chunkZ)); + chunksToLoad.add(pack(chunkX, 0, chunkZ)); } private void addChunksBetween(int xLine, int zMin, int zMax) { diff --git a/src/main/java/serverutils/pregenerator/filemanager/PregeneratorFileManager.java b/src/main/java/serverutils/pregenerator/filemanager/PregeneratorFileManager.java index 367be917f..3f9cc778d 100644 --- a/src/main/java/serverutils/pregenerator/filemanager/PregeneratorFileManager.java +++ b/src/main/java/serverutils/pregenerator/filemanager/PregeneratorFileManager.java @@ -16,9 +16,9 @@ public class PregeneratorFileManager { private final FileReadWriter commandReadWriter; private final SafeFileReadWriter iterationReadWriter; - private final String COMMAND_FOLDER = "pregenerationFiles"; - private final String COMMAND_FILE = "fileCommand"; - private final String COMMAND_ITERATION = "fileIteration"; + public static final String COMMAND_FOLDER = "pregenerationFiles"; + public static final String COMMAND_FILE = "fileCommand"; + public static final String COMMAND_ITERATION = "fileIteration"; public PregeneratorFileManager(MinecraftServer server, double xLoc, double zLoc, int radius, int dimensionID) throws IOException { diff --git a/src/main/resources/assets/serverutilities/lang/en_US.lang b/src/main/resources/assets/serverutilities/lang/en_US.lang index c827ee7f0..9e7e83894 100644 --- a/src/main/resources/assets/serverutilities/lang/en_US.lang +++ b/src/main/resources/assets/serverutilities/lang/en_US.lang @@ -435,7 +435,8 @@ commands.god.usage=/god commands.rtp.usage=/rtp commands.dump_chunkloaders.usage=/dump_chunkloaders commands.dump_permissions.usage=/dump_permissions -commands.pregen.start.usage=/pregen start +commands.pregen.start.server_usage=/pregen start +commands.pregen.start.server_client=/pregen start or /pregen commands.pregen.stop.usage=/pregen stop commands.pregen.progress.usage=/pregen progress From f675c88ab59b0162553396c06c7f53458f7af2cc Mon Sep 17 00:00:00 2001 From: rjnasers Date: Mon, 7 Oct 2024 01:11:34 -0500 Subject: [PATCH 4/4] I always forget spotless... --- .../serverutils/command/pregen/CmdStart.java | 36 +++++++------------ .../serverutils/pregenerator/ChunkLoader.java | 8 ++--- .../pregenerator/ChunkLoaderManager.java | 19 ++++------ 3 files changed, 24 insertions(+), 39 deletions(-) diff --git a/src/main/java/serverutils/command/pregen/CmdStart.java b/src/main/java/serverutils/command/pregen/CmdStart.java index 0a7dc45fe..2586ecf5c 100644 --- a/src/main/java/serverutils/command/pregen/CmdStart.java +++ b/src/main/java/serverutils/command/pregen/CmdStart.java @@ -1,7 +1,6 @@ package serverutils.command.pregen; import java.io.IOException; -import java.util.Objects; import net.minecraft.command.ICommandSender; import net.minecraft.command.WrongUsageException; @@ -22,10 +21,10 @@ public CmdStart() { @Override public void processCommand(ICommandSender sender, String[] args) { checkArgs(sender, args, 1); - + int radius; double xLoc, zLoc; - + if (args.length == 3) { xLoc = parseDoubleBounded(sender, args[0], -30000000.0D, 30000000.0D); zLoc = parseDoubleBounded(sender, args[1], -30000000.0D, 30000000.0D); @@ -37,9 +36,7 @@ public void processCommand(ICommandSender sender, String[] args) { "Radii larger than 2000 are not permitted. World sizes will be 100's of gbs")); return; } - } - else - { + } else { xLoc = sender.getPlayerCoordinates().posX; zLoc = sender.getPlayerCoordinates().posZ; @@ -54,12 +51,11 @@ public void processCommand(ICommandSender sender, String[] args) { int dimensionID = sender.getEntityWorld().provider.dimensionId; PregeneratorCommandInfo commandInfo = new PregeneratorCommandInfo(xLoc, zLoc, radius, dimensionID); - + if (!ChunkLoaderManager.instance.isGenerating()) { try { sender.addChatMessage( - new ChatComponentText( - "Initializing pregenerator. Check progress with '/pregen progress'.")); + new ChatComponentText("Initializing pregenerator. Check progress with '/pregen progress'.")); ChunkLoaderManager.instance.initializePregenerator(commandInfo, MinecraftServer.getServer()); } catch (IOException e) { e.printStackTrace(); @@ -79,30 +75,24 @@ public void checkArgs(ICommandSender sender, String[] args, int i) { if (args.length < i) { throw new WrongUsageException(getCommandUsage(sender)); } - - if (sender instanceof MinecraftServer) - { - if (args.length != 3) - { + + if (sender instanceof MinecraftServer) { + if (args.length != 3) { throw new WrongUsageException(getCommandUsage(sender)); } - } - else - { - if (!(args.length == 1 || args.length == 3) ) - { + } else { + if (!(args.length == 1 || args.length == 3)) { throw new WrongUsageException(getCommandUsage(sender)); } } } - + @Override public String getCommandUsage(ICommandSender sender) { - if (sender instanceof MinecraftServer) - { + if (sender instanceof MinecraftServer) { return "commands." + ICommandWithParent.getCommandPath(this) + ".usage_server"; } - + return "commands." + ICommandWithParent.getCommandPath(this) + ".usage_client"; } } diff --git a/src/main/java/serverutils/pregenerator/ChunkLoader.java b/src/main/java/serverutils/pregenerator/ChunkLoader.java index 0b2714bae..5d13fcec8 100644 --- a/src/main/java/serverutils/pregenerator/ChunkLoader.java +++ b/src/main/java/serverutils/pregenerator/ChunkLoader.java @@ -1,14 +1,14 @@ package serverutils.pregenerator; +import static com.gtnewhorizon.gtnhlib.util.CoordinatePacker.unpackX; +import static com.gtnewhorizon.gtnhlib.util.CoordinatePacker.unpackZ; + import net.minecraft.server.MinecraftServer; import net.minecraft.world.gen.ChunkProviderServer; import serverutils.ServerUtilities; import serverutils.pregenerator.filemanager.PregeneratorFileManager; -import static com.gtnewhorizon.gtnhlib.util.CoordinatePacker.unpackX; -import static com.gtnewhorizon.gtnhlib.util.CoordinatePacker.unpackZ; - public class ChunkLoader { private PregeneratorFileManager fileManager; @@ -21,7 +21,7 @@ public ChunkLoader(PregeneratorFileManager fileManager) { public void processLoadChunk(MinecraftServer server, int dimensionId, Long chunk) { int x = unpackX(chunk); int z = unpackZ(chunk); - + ChunkProviderServer cps = server.worldServerForDimension(dimensionId).theChunkProviderServer; cps.loadChunk(x, z, () -> { ChunkLoaderManager.instance.removeChunkFromList(); diff --git a/src/main/java/serverutils/pregenerator/ChunkLoaderManager.java b/src/main/java/serverutils/pregenerator/ChunkLoaderManager.java index 48988c2c5..004bf4e27 100644 --- a/src/main/java/serverutils/pregenerator/ChunkLoaderManager.java +++ b/src/main/java/serverutils/pregenerator/ChunkLoaderManager.java @@ -1,22 +1,19 @@ package serverutils.pregenerator; +import static com.gtnewhorizon.gtnhlib.util.CoordinatePacker.pack; + import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.Optional; -import java.util.Vector; -import it.unimi.dsi.fastutil.longs.LongArrayList; import net.minecraft.server.MinecraftServer; -import org.apache.commons.lang3.tuple.Pair; - +import it.unimi.dsi.fastutil.longs.LongArrayList; import serverutils.lib.util.misc.PregeneratorCommandInfo; import serverutils.pregenerator.filemanager.PregeneratorFileManager; -import static com.gtnewhorizon.gtnhlib.util.CoordinatePacker.pack; - public class ChunkLoaderManager { public final static ChunkLoaderManager instance = new ChunkLoaderManager(); @@ -47,12 +44,10 @@ public void initializePregenerator(PregeneratorCommandInfo commandInfo, Minecraf public boolean initializeFromPregeneratorFiles(MinecraftServer server, int dimensionToCheck) { try { - Path commandFolderPath = Paths.get("saves") - .resolve(server.getFolderName()) + Path commandFolderPath = Paths.get("saves").resolve(server.getFolderName()) .resolve(PregeneratorFileManager.COMMAND_FOLDER); - if (Files.exists(commandFolderPath.resolve(PregeneratorFileManager.COMMAND_FILE)) && - Files.exists(commandFolderPath.resolve(PregeneratorFileManager.COMMAND_ITERATION))) - { + if (Files.exists(commandFolderPath.resolve(PregeneratorFileManager.COMMAND_FILE)) + && Files.exists(commandFolderPath.resolve(PregeneratorFileManager.COMMAND_ITERATION))) { this.fileManager = new PregeneratorFileManager(server); Optional commandInfoOptional = this.fileManager.getCommandInfo(); if (commandInfoOptional.isPresent()) { @@ -73,7 +68,7 @@ public boolean initializeFromPregeneratorFiles(MinecraftServer server, int dimen } } } - + } catch (IOException e) { this.reset(true); e.printStackTrace();