diff --git a/src/corrodias/minecraft/landgenerator/Main.java b/src/corrodias/minecraft/landgenerator/Main.java index 4b11a72..2331782 100644 --- a/src/corrodias/minecraft/landgenerator/Main.java +++ b/src/corrodias/minecraft/landgenerator/Main.java @@ -53,7 +53,7 @@ public class Main { // Version Number! private static final String PROG_NAME = "Minecraft Land Generator"; - private static final String VERSION = "1.6.1"; + private static final String VERSION = "1.6.11"; private static final String AUTHORS = "Corrodias, Morlok8k, pr0f1x"; private static final String fileSeparator = System.getProperty("file.separator"); @@ -129,6 +129,7 @@ public class Main { private static final String github_MLG_jar_URL = github_URL + MLG_JarFile; private static Boolean recheckFlag = false; + private static long startTime = 0L; ////// @@ -145,6 +146,7 @@ public class Main { * the command line arguments */ public static void main(String[] args) { + startTime = System.currentTimeMillis(); (new Main()).run(args); // Why? this avoids "static" compiling issues. } @@ -443,6 +445,8 @@ public class Main { try { out("Launching server once to make sure there is a world."); + long generationStartTimeTracking = System.currentTimeMillis(); //Start of time remaining calculations. + runMinecraft(verbose, alternate); if ((xRange == 0) & (zRange == 0)) { //If the server is launched with an X and a Z of zero, then we just shutdown MLG after the initial launch. @@ -484,59 +488,63 @@ public class Main { int currentIteration = 0; long differenceTime = System.currentTimeMillis(); - Long[] timeTracking = - new Long[] { differenceTime, differenceTime, differenceTime, differenceTime }; + //Long[] timeTracking = new Long[] { differenceTime, differenceTime, differenceTime, differenceTime }; + Long timeTracking = 0L; + for (int currentX = 0 - xRange / 2; currentX <= xRange / 2; currentX += increment) { for (int currentZ = 0 - zRange / 2; currentZ <= zRange / 2; currentZ += increment) { currentIteration++; - out("Setting spawn to [" - + Integer.toString(currentX + xOffset) - + ", " - + Integer.toString(currentZ + zOffset) - + "] (" - + currentIteration - + "/" - + totalIterations - + ") " - + Float.toString((Float.parseFloat(Integer.toString(currentIteration)) / Float - .parseFloat(Integer.toString(totalIterations))) * 100) + String curX = Integer.toString(currentX + xOffset); + //String curY = "64"; //Y is always set to 64 + String curZ = Integer.toString(currentZ + zOffset); + String percentDone = + Float.toString((Float.parseFloat(Integer.toString(currentIteration)) / Float + .parseFloat(Integer.toString(totalIterations))) * 100); + int percentIndex = + ((percentDone.indexOf(".") + 3) > percentDone.length()) ? percentDone + .length() : (percentDone.indexOf(".") + 3); //fix index on numbers like 12.3 + percentDone = + percentDone.substring(0, + (percentDone.indexOf(".") == -1 ? percentDone.length() + : percentIndex)); //Trim output, unless whole number + + out("Setting spawn to (X,Y,Z): [" + curX + ", 64, " + curZ + "] (" + + currentIteration + "/" + totalIterations + ") " + percentDone + "% Done"); // Time Remaining estimate - timeTracking[0] = timeTracking[1]; - timeTracking[1] = timeTracking[2]; - timeTracking[2] = timeTracking[3]; - timeTracking[3] = System.currentTimeMillis(); + //timeTracking[0] = timeTracking[1]; + //timeTracking[1] = timeTracking[2]; + //timeTracking[2] = timeTracking[3]; + timeTracking = System.currentTimeMillis(); - //TODO: update this time remaining section, so it doesnt do last 4 runs, but all runs. + //NEW CODE: + differenceTime = + (timeTracking - generationStartTimeTracking) / (currentIteration + 1); // Updated. we now count all runs, instead of the last 4. + differenceTime *= 1 + (totalIterations - currentIteration); //this should provide a more accurate result. + out("Estimated time remaining: " + displayTime(differenceTime)); + //OLD CODE: + /* if (currentIteration >= 4) { differenceTime = (timeTracking[3] - timeTracking[0]) / 3; // well, this is what it boils down to differenceTime *= 1 + (totalIterations - currentIteration); - out(String.format("Estimated time remaining: %dh%dm%ds", differenceTime - / (1000 * 60 * 60), (differenceTime % (1000 * 60 * 60)) - / (1000 * 60), - ((differenceTime % (1000 * 60 * 60)) % (1000 * 60)) / 1000)); - } else if (currentIteration == 3) { + out("Estimated time remaining: " + displayEstimatedTime(differenceTime)); + } else if (currentIteration == 3) { differenceTime = (timeTracking[3] - timeTracking[1]) / 2; // well, this is what it boils down to differenceTime *= 1 + (totalIterations - currentIteration); - out(String.format("Estimated time remaining: %dh%dm%ds", differenceTime - / (1000 * 60 * 60), (differenceTime % (1000 * 60 * 60)) - / (1000 * 60), - ((differenceTime % (1000 * 60 * 60)) % (1000 * 60)) / 1000)); + out("Estimated time remaining: " + displayEstimatedTime(differenceTime)); } else if (currentIteration == 2) { differenceTime = (timeTracking[3] - timeTracking[2]); // well, this is what it boils down to differenceTime *= 1 + (totalIterations - currentIteration); - out(String.format("Estimated time remaining: %dh%dm%ds", differenceTime - / (1000 * 60 * 60), (differenceTime % (1000 * 60 * 60)) - / (1000 * 60), - ((differenceTime % (1000 * 60 * 60)) % (1000 * 60)) / 1000)); + out("Estimated time remaining: " + displayEstimatedTime(differenceTime)); } else if (currentIteration <= 1) { out("Estimated time remaining: Calculating..."); } + */ // Set the spawn point - setSpawn(serverLevel, currentX + xOffset, 128, currentZ + zOffset); + setSpawn(serverLevel, currentX + xOffset, 64, currentZ + zOffset); // Launch the server runMinecraft(verbose, alternate); @@ -548,7 +556,8 @@ public class Main { copyFile(backupLevel, serverLevel); backupLevel.delete(); out("Restored original level.dat."); - finishedImage(); + //finishedImage(); //disabled, because I didn't care for it - it didn't flow well with MLG + out("Generation complete in: " + displayTime(startTime, System.currentTimeMillis())); waitTenSec(false); } catch (IOException ex) { Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); @@ -1032,7 +1041,7 @@ public class Main { + "The JNLP library is included (inside the .jar). It is not public domain. Its license is included, as LICENSE.TXT." + newLine + "It is also available at: http://jnbt.sourceforge.net/" + newLine + newLine - + "The \"unescape\" method/function is also not Public Domain. Its License is the W3C® Software License, and located here: http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231" + + "The \"unescape\" method/function is also not Public Domain. Its License is the W3C® Software License, and located here: http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231" + newLine + "Other Public Domain code has been used in this program, and references to sources are included in the comments of " + PROG_NAME + "'s source code." + newLine @@ -1040,6 +1049,12 @@ public class Main { + newLine + "Version History:" + newLine + "Morlok8k:" + newLine + + "1.6.11" + newLine + + "- Removed End-of-Generation ASCII-Graphic - It didn't really fit with MLG." + newLine + + "- Updated Time Output." + newLine + + "- Changed estimated time remaining to count all runs, not just the last four." + newLine + + "- Added the time it took to complete at the end of generation." + newLine + + newLine + "1.6.1" + newLine + "- Added some modifications for scripting (Mainly for a new Initial setup script)" + newLine + "- Changed MLG's Y to Z. Now it matches Minecraft. Y in the game is Height." + newLine @@ -1229,11 +1244,11 @@ public class Main { outP(newLine); out(count + " byte(s) copied"); } + timeTracking[1] = System.currentTimeMillis(); - differenceTime = (timeTracking[1] - timeTracking[0]) / 2; + //differenceTime = (timeTracking[1] - timeTracking[0]); if (Output) { - out(String.format(MLG + "Elapsed Time: %dm%ds", (differenceTime % (1000 * 60 * 60)) - / (1000 * 60), ((differenceTime % (1000 * 60 * 60)) % (1000 * 60)) / 1000)); + out("Elapsed Time: " + displayTime(timeTracking[0], timeTracking[1])); } } catch (FileNotFoundException e) { e.printStackTrace(); @@ -1298,7 +1313,7 @@ public class Main { try { MLG_Current_Hash = fileMD5(MLGFileName); - // out(hash + " " + MLGFileName);® + // out(hash + " " + MLGFileName);® } catch (Exception e) { out("Error: MD5 from file failed"); e.printStackTrace(); @@ -2125,6 +2140,7 @@ public class Main { } + /* private static void finishedImage() { System.out.println(newLine + " .l0kkKMl lMKkk0l. " + newLine + ".;kMc ;KK; .,,lkkkkkkkl,,. ;KK, cMk,." + newLine @@ -2147,6 +2163,59 @@ public class Main { + " oKl;;kMk. .,,,,;. .kMk,,lKo " + newLine + " .0MMMMO' .OMMMMO. "); } + */ + + /** + * Returns the time in a readable format between two points of time given in Millis. + * + * @param startTimeMillis + * @param endTimeMillis + * @author Morlok8k + * @return String of Readable Time + */ + private static String displayTime(long startTimeMillis, long endTimeMillis) { + + long millis = (endTimeMillis - startTimeMillis); + long seconds = millis / 1000; + long minutes = seconds / 60; + long hours = minutes / 60; + long days = hours / 24; + long years = days / 365; + + String took = + (years > 0 ? String.format("%d Years, ", years) : "") + + (days > 0 ? String.format("%d Days, ", days % 365) : "") + + (hours > 0 ? String.format("%d Hours, ", hours % 24) : "") + + (minutes > 0 ? String.format("%d Minutes, ", minutes % 60) : "") + + String.format("%d Seconds", seconds % 60); + + return (took); + } + + /** + * Returns the time in a readable format given in Millis. + * + * @param timeMillis + * @author Morlok8k + * @return String of Readable Time + */ + private static String displayTime(long timeMillis) { + + long seconds = timeMillis / 1000; + long minutes = seconds / 60; + long hours = minutes / 60; + long days = hours / 24; + long years = days / 365; + + String took = + (years > 0 ? String.format("%d Years, ", years) : "") + + (days > 0 ? String.format("%d Days, ", days % 365) : "") + + (hours > 0 ? String.format("%d Hours, ", hours % 24) : "") + + (minutes > 0 ? String.format("%d Minutes, ", minutes % 60) : "") + + String.format("%d Seconds", seconds % 60); + + return (took); + } /* Morlok8k: * Just a note about this unescape method: @@ -2163,8 +2232,8 @@ public class Main { *
* unescape: http://www.w3.org/International/unescape.java
*
- * Copyright © 1997 World Wide Web Consortium, (Massachusetts Institute of Technology, European Research Consortium for Informatics and Mathematics, Keio University). All Rights Reserved. This - * work is distributed under the W3C® Software License [1] in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A + * Copyright © 1997 World Wide Web Consortium, (Massachusetts Institute of Technology, European Research Consortium for Informatics and Mathematics, Keio University). All Rights Reserved. This + * work is distributed under the W3C® Software License [1] in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A * PARTICULAR PURPOSE.
*
* [1] http://www.w3.org/Consortium/Legal/2002/copyright-software-20021231