diff --git a/src/corrodias/minecraft/landgenerator/MLG_WorldVerify.java b/src/corrodias/minecraft/landgenerator/MLG_WorldVerify.java index 37e2af4..44e92b3 100644 --- a/src/corrodias/minecraft/landgenerator/MLG_WorldVerify.java +++ b/src/corrodias/minecraft/landgenerator/MLG_WorldVerify.java @@ -15,14 +15,14 @@ public class MLG_WorldVerify { */ static void verifyWorld() { //TODO: element comment - + // verify that we ended up with a good server path, either from the file or from an argument. File file = new File(Main.serverPath); if (!file.exists() || !file.isDirectory()) { Main.err("The server directory is invalid: " + Main.serverPath); return; } - + try { // read the name of the current world from the server.properties file BufferedReader props = @@ -32,25 +32,25 @@ public class MLG_WorldVerify { while ((line = props.readLine()) != null) { String property = ""; String value = ""; - + int pos = line.indexOf('='); - + int end = line.lastIndexOf('#'); // comments, ignored lines - + if (end == -1) { // If we have no hash sign, then we read till the end of the line end = line.length(); - + } if (end <= (pos + 1)) { // If hash is before the '=', we may have an issue... it should be fine, cause we check for issues next, but lets make sure. end = line.length(); pos = -1; } - + if (end == 0) { //hash is first char, meaning entire line is a comment end = line.length(); pos = 0; } - + if (pos != -1) { if (line.length() == 0) { property = ""; @@ -59,14 +59,14 @@ public class MLG_WorldVerify { property = line.substring(0, pos).toLowerCase(); value = line.substring(pos + 1); } - + if (property.equals("level-name")) { Main.worldPath = Main.serverPath + Main.fileSeparator + value; Main.worldName = value; } if (Main.useRCON) { if (property.equals("enable-rcon")) { - + if (value.contains("true")) { Main.rcon_Enabled = true; Main.out("RCON is set to be Enabled on the server."); @@ -91,13 +91,13 @@ public class MLG_WorldVerify { IP = "0.0.0.0"; } Main.rcon_IPaddress = IP; - + } } - + } } - + } catch (FileNotFoundException ex) { Main.err("Could not open " + Main.serverPath + Main.fileSeparator + "server.properties"); return; @@ -105,13 +105,13 @@ public class MLG_WorldVerify { Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); return; } - + File level = new File(Main.worldPath + Main.fileSeparator + "level.dat"); if (!level.exists() || !level.isFile()) { - Main.err("The currently-configured world does not exist. Please launch the server once, first."); + Main.err("The currently-configured world does not exist."); return; } - + } } diff --git a/src/corrodias/minecraft/landgenerator/Main.java b/src/corrodias/minecraft/landgenerator/Main.java index 3f4f393..9b0889f 100644 --- a/src/corrodias/minecraft/landgenerator/Main.java +++ b/src/corrodias/minecraft/landgenerator/Main.java @@ -39,10 +39,10 @@ public class Main { // // // Public Vars: - public static boolean testing = false; // display more output when debugging + public static boolean testing = false; // display more output when debugging public static final String PROG_NAME = "Minecraft Land Generator"; // Program Name - public static final String VERSION = "1.6.99 (1.7.0 test3)"; // Version Number! + public static final String VERSION = "1.7.0 test7"; // Version Number! public static final String AUTHORS = "Corrodias, Morlok8k, pr0f1x"; // Authors public static final String fileSeparator = System.getProperty("file.separator"); @@ -120,6 +120,9 @@ public class Main { public static final String github_MLG_BuildID_URL = github_URL + buildIDFile; public static final String github_MLG_jar_URL = github_URL + MLG_JarFile; + public static int resumeX = 0; //resume data, if needed. + public static int resumeZ = 0; + // // //Private Vars: @@ -142,7 +145,7 @@ public class Main { public static boolean useRCON = false; //use RCON to communicate with server. ***Experimental*** public static boolean rcon_Enabled = false; //is server is set to use RCON? public static String rcon_IPaddress = "0.0.0.0"; //default is 0.0.0.0 - public static String rcon_Port = "25575"; //default is 25575, we are just initializing here. + public static String rcon_Port = "25575"; //default is 25575, we are just initializing here. public static String rcon_Password = "test"; //default is "", but a password must be entered. ////////////////////////////////////////////////////////// @@ -443,6 +446,16 @@ public class Main { try { xRange = Integer.parseInt(args[0]); zRange = Integer.parseInt(args[1]); + + if ((xRange < 1000) && (xRange != 0)) { + xRange = 1000; //if less than 1000, (and not 0) set to 1000 (Calculations don't work well on very small maps) + err("X size too small - Changing X to 1000"); + } + if ((zRange < 1000) && (zRange != 0)) { + zRange = 1000; + err("Z size too small - Changing Z to 1000"); + } + } catch (NumberFormatException ex) { err("Invalid X or Z argument."); err("Please Enter the size of world you want. Example: X:1000 Z:1000"); @@ -511,14 +524,33 @@ public class Main { { File backupLevel = new File(worldPath + fileSeparator + "level_backup.dat"); if (backupLevel.exists()) { - err("There is a level_backup.dat file left over from a previous attempt that failed. You should go determine whether to keep the current level.dat" - + " or restore the backup."); - err("You most likely will want to restore the backup!"); - MLG_Time.waitTenSec(false); + //err("There is a level_backup.dat file left over from a previous attempt that failed. You should go determine whether to keep the current level.dat" + // + " or restore the backup."); + //err("You most likely will want to restore the backup!"); + //MLG_Time.waitTenSec(false); - //TODO: use resume data + err("There is a level_backup.dat file left over from a previous attempt that failed."); + out("Resuming..."); + + //use resume data + File serverLevel = new File(worldPath + fileSeparator + "level.dat"); + try { + MLG_Misc.copyFile(backupLevel, serverLevel); + } catch (IOException e) { + e.printStackTrace(); + } + backupLevel.delete(); + + //return; + + MLG_FileRead.readArrayListCoordLog(worldPath + fileSeparator + + "MinecraftLandGenerator.log"); // we read the .log just for any resume data, if any. + + System.gc(); //run the garbage collector - hopefully free up some memory! + + xRange = resumeX; + zRange = resumeZ; - return; } } @@ -543,20 +575,25 @@ public class Main { long generationStartTimeTracking = System.currentTimeMillis(); //Start of time remaining calculations. - MLG_Server.runMinecraft(alternate); + boolean serverLaunch = MLG_Server.runMinecraft(alternate); + + if (!(serverLaunch)) { + System.exit(1); // we got a warning or severe error + } 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. return; } + xRange = (int) (Math.ceil(((double) xRange) / ((double) 16))) * 16; //say xRange was entered as 1000. this changes it to be 1008, a multiple of 16. (the size of a chunk) + zRange = (int) (Math.ceil(((double) zRange) / ((double) 16))) * 16; //say zRange was entered as 2000. there is no change, as it already is a multiple of 16. + MLG_FileWrite.AppendTxtFile( worldPath + fileSeparator + "MinecraftLandGenerator.log", "# " + PROG_NAME + " " + VERSION + " - " + MLG_SelfAware.JVMinfo() + newLine + "# " + MC_Server_Version + newLine + "# Started: " - + dateFormat.format(generationStartTimeTracking) + newLine); - - xRange = (int) (Math.ceil(((double) xRange) / ((double) 16))) * 16; //say xRange was entered as 1000. this changes it to be 1008, a multiple of 16. (the size of a chunk) - zRange = (int) (Math.ceil(((double) zRange) / ((double) 16))) * 16; //say zRange was entered as 2000. there is no change, as it already is a multiple of 16. + + dateFormat.format(generationStartTimeTracking) + newLine + + "##Size: X" + xRange + "Z" + zRange + newLine); out(""); @@ -593,6 +630,10 @@ public class Main { out(""); double xLoops, zLoops; + int curXloops = 0; + int curZloops = 0; + int xRangeAdj = 0; + int zRangeAdj = 0; // have main loop make an arraylist of spawnpoints // read from a file if MLG has run before on this world. save to arraylist @@ -601,28 +642,28 @@ public class Main { // X xLoops = ((double) xRange / (double) increment); //How many loops do we need? - xLoops = Math.ceil(xLoops); //round up to find out! + xLoops = Math.ceil(xLoops); //round up to find out! + xRangeAdj = (int) (xLoops * increment); + xLoops = xLoops + 1; // Z zLoops = ((double) zRange / (double) increment); //How many loops do we need? - zLoops = Math.ceil(zLoops); //round up to find out! + zLoops = Math.ceil(zLoops); //round up to find out! + zRangeAdj = (int) (zLoops * increment); + zLoops = zLoops + 1; out("Calculating Spawn Points..."); int totalIterations = (int) (xLoops * zLoops); int currentIteration = 0; - int curXloops = 0; - int curZloops = 0; - long differenceTime = System.currentTimeMillis(); Long timeTracking = 0L; ArrayList launchList = new ArrayList(totalIterations); - for (int currentX = (int) ((Math.ceil((((0 - xRange) / 2) / increment))) * increment); currentX <= (xRange / 2); currentX += - increment) { + for (int currentX = 0; currentX <= (xRangeAdj / 2); currentX += increment) { curXloops++; if (curXloops == 1) { currentX = (((0 - xRange) / 2) + (increment / 2) + 16); @@ -630,9 +671,7 @@ public class Main { currentX = (xRange / 2) - (increment / 2); } - for (int currentZ = - (int) ((Math.ceil((((0 - zRange) / 2) / increment))) * increment); currentZ <= (zRange / 2); currentZ += - increment) { + for (int currentZ = 0; currentZ <= (zRangeAdj / 2); currentZ += increment) { currentIteration++; curZloops++; @@ -642,20 +681,25 @@ public class Main { currentZ = (zRange / 2) - (increment / 2); } - // add coords to arraylist here - Coordinates tempCoords = - new Coordinates(currentX + xOffset, 64, currentZ + zOffset); - launchList.add(tempCoords); + { + // add Coordinates to arraylist here + Coordinates tempCoords = + new Coordinates(currentX + xOffset, 64, currentZ + zOffset); + launchList.add(tempCoords); + + //TODO: remove this before release: + System.out.println(tempCoords); + } if (curZloops == 1) { currentZ = - (int) ((Math.ceil((((0 - zRange) / 2) / increment))) * increment); + (int) ((Math.ceil((((0 - zRangeAdj) / 2) / increment))) * increment); } } curZloops = 0; if (curXloops == 1) { - currentX = (int) ((Math.ceil((((0 - xRange) / 2) / increment))) * increment); + currentX = (int) ((Math.ceil((((0 - xRangeAdj) / 2) / increment))) * increment); } } @@ -668,11 +712,6 @@ public class Main { MLG_ArrayList.arrayListRemove(launchList, removeList); } - int numRemoved = totalIterations - launchList.size(); - if (numRemoved > 0) { - out("Reduced number of server launches by: " + numRemoved); - } - removeList.clear(); // we are done with this now. System.gc(); //run the garbage collector - hopefully free up some memory! @@ -738,12 +777,12 @@ public class Main { MLG_Misc.copyFile(backupLevel, serverLevel); backupLevel.delete(); out("Restored original level.dat."); - //finishedImage(); //disabled, because I didn't care for it - it didn't flow well with MLG + out("Generation complete in: " + MLG_Time.displayTime(startTime, System.currentTimeMillis())); MLG_Time.waitTenSec(false); } catch (IOException ex) { - Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex); + Logger.getLogger(Main.class.getName()).log(Level.SEVERE, ex.getMessage(), ex); } } diff --git a/src/morlok8k/minecraft/landgenerator/Coordinates.java b/src/morlok8k/minecraft/landgenerator/Coordinates.java index e60299a..8c457e9 100644 --- a/src/morlok8k/minecraft/landgenerator/Coordinates.java +++ b/src/morlok8k/minecraft/landgenerator/Coordinates.java @@ -94,31 +94,58 @@ public class Coordinates { int x = 0, y = 0, z = 0; //TODO: add validity checks: - //TODO: add short version... (Y = 0) + //TODO: add short version... (Y = 64) int start = 0, end = 0, firstComma = 0, secComma = 0; - String sX = "", sY = "", sZ = ""; + boolean shortMode = false, notCoords = false; start = StringOfCoords.indexOf("["); end = StringOfCoords.indexOf("]"); - StringOfCoords = StringOfCoords.substring(start, end); + if ((start == -1) || (end == -1)) { + start = StringOfCoords.indexOf("("); + end = StringOfCoords.indexOf(")"); - firstComma = StringOfCoords.indexOf(","); - secComma = StringOfCoords.lastIndexOf(","); + if ((start != -1) || (end != -1)) { + shortMode = true; + } else { + notCoords = true; + } + } - //System.out.println(start + " " + end + " " + firstComma + " " + secComma); + if (notCoords) { return new Coordinates(0, 0, 0); } - sX = StringOfCoords.substring(start + 1, firstComma); - sY = StringOfCoords.substring(firstComma + 1, secComma); - sZ = StringOfCoords.substring(secComma + 1, end); + if (shortMode) { - //System.out.println(sX + " " + sY + " " + sZ); + StringOfCoords = StringOfCoords.substring(start, end); - x = Integer.parseInt(sX); - y = Integer.parseInt(sY); - z = Integer.parseInt(sZ); + firstComma = StringOfCoords.indexOf(","); + + sX = StringOfCoords.substring(start + 1, firstComma); + sY = "64"; + sZ = StringOfCoords.substring(firstComma + 1, end); + + } else { + + StringOfCoords = StringOfCoords.substring(start, end); + + firstComma = StringOfCoords.indexOf(","); + secComma = StringOfCoords.lastIndexOf(","); + + sX = StringOfCoords.substring(start + 1, firstComma); + sY = StringOfCoords.substring(firstComma + 1, secComma); + sZ = StringOfCoords.substring(secComma + 1, end); + + } + + try { + x = Integer.parseInt(sX); + y = Integer.parseInt(sY); + z = Integer.parseInt(sZ); + } catch (NumberFormatException e) { + return new Coordinates(0, 0, 0); + } return new Coordinates(x, y, z); } diff --git a/src/morlok8k/minecraft/landgenerator/MLG_FileRead.java b/src/morlok8k/minecraft/landgenerator/MLG_FileRead.java index 9e0d841..61b2e39 100644 --- a/src/morlok8k/minecraft/landgenerator/MLG_FileRead.java +++ b/src/morlok8k/minecraft/landgenerator/MLG_FileRead.java @@ -20,6 +20,9 @@ public class MLG_FileRead { String line = ""; while ((line = in.readLine()) != null) { + + line = line.trim(); + int end = line.indexOf('#'); // comments, ignored lines boolean ignoreLine = false; Coordinates c = new Coordinates(); @@ -35,10 +38,19 @@ public class MLG_FileRead { if (!(ignoreLine)) { c = Coordinates.parseString(line.substring(0, end)); Return.add(c); - } /* else { - // other future stuff may go here. + } else { + if (line.startsWith("##Size:")) { // Potential Resume data. + int xx = 0; + int zz = 0; + + xx = line.indexOf('X'); + zz = line.indexOf('Z'); + + Main.resumeX = Integer.parseInt(line.substring(xx + 1, zz)); + Main.resumeZ = Integer.parseInt(line.substring(zz + 1)); + } - */ + } } in.close(); diff --git a/src/morlok8k/minecraft/landgenerator/MLG_input_CLI.java b/src/morlok8k/minecraft/landgenerator/MLG_input_CLI.java index bb64a82..fd08701 100644 --- a/src/morlok8k/minecraft/landgenerator/MLG_input_CLI.java +++ b/src/morlok8k/minecraft/landgenerator/MLG_input_CLI.java @@ -14,11 +14,22 @@ public class MLG_input_CLI { */ public static int getInt(String msg) { + int Return = 0; + while (!(Main.sc.hasNextInt())) { Main.sc.nextLine(); Main.outP(Main.MLG + "Invalid Input. " + msg); } - return Main.sc.nextInt(); + + Return = Main.sc.nextInt(); + + if (Return < 1000) { + Main.out("Input must be 1000 or larger."); + Main.outP(Main.MLG + msg); + Return = getInt(msg); + } + + return Return; }