From bd162821de1d48764dc6a37b36fc9bb9a16710da Mon Sep 17 00:00:00 2001 From: Morlok8k Date: Fri, 27 May 2011 02:26:13 -0700 Subject: [PATCH] 1.4.5 (1.5.0 beta) -- untested --- README | 58 ++-- bin/MinecraftLandGenerator.jar | Bin 44757 -> 35661 bytes .../minecraft/landgenerator/Main.java | 297 ++++++++++++------ 3 files changed, 238 insertions(+), 117 deletions(-) diff --git a/README b/README index f7ea414..02ff3d5 100644 --- a/README +++ b/README @@ -1,15 +1,13 @@ -Minecraft Land Generator version 1.4.4 +Minecraft Land Generator version 1.5.0 -Updated May 15, 2011 +Updated May 27, 2011 Original Code by Corrodias November 2010 Enhanced Code by Morlok8k Feb. 2011 to Now (or at least to the date listed above!) -Forum: http://www.minecraftforum.net/viewtopic.php?f=1022&t=203394 +Forum: http://www.minecraftforum.net/topic/187737-minecraft-land-generator/ Source: https://github.com/Morlok8k/MinecraftLandGenerator -Original Forum (Now Locked): http://www.minecraftforum.net/viewtopic.php?f=1012&t=76563&start=60#p1299186 - ----------------------------------------------- This program lets you generate an area of land with your Minecraft Beta SMP server (and is prossibly future-proof for newer versions). You set up your java command line and minecraft server paths in the MinecraftLandGenerator.conf file, set up the server's server.properties file with the name of the world you wish to use, and then run this program. @@ -26,6 +24,14 @@ The JNLP library is included (inside the .jar) as jnbt-1.1.jar. It is not public Version History: Morlok8k: +1.5.0 +- Supports Server Beta 1.6.4 +- Added "-a","-alt" to use alternate method (a simplier version of 1.3.0's code) +- Added world specific output for 9 dimensions (DIM-1 is the Nether, DIM-2 through DIM-9 dont exist yet, but when they do, you can configure it's text) +- Updated Config File for these Dimensions. +- Reads and outputs the Seed to the output. (If you had used text for the Seed, Minecraft converts it into a number. This outputs the number.) +- Changed the default 300 blocks to 380. The server now makes a 400x400 square block terrain instead of 320x320 + 1.4.4 - Added ablilty to ignore [WARNING] and [SEVERE] errors with "-w" @@ -72,23 +78,25 @@ Corrodias: ----------------------------------------------- -Minecraft Land Generator version 1.4.4 +Minecraft Land Generator version 1.5.0 Uses a Minecraft server to generate square land of a specified size. Usage: java -jar MinecraftLandGenerator.jar x y [serverpath] [switches] Arguments: - x : X range to generate - y : Y range to generate - serverpath : the path to the directory in which the server runs (takes precedence over the config file setting) + x : X range to generate + y : Y range to generate + serverpath : the path to the directory in which the server runs (takes precedence over the config file setting) Switches: - -verbose : causes the application to output the server's messages to the console - -v : same as -verbose - -w : Ignore [WARNING] and [SEVERE] messages. - -i# : override the iteration spawn offset increment (default 300) (example: -i100) - -x# : set the X offset to generate land around (example: -x0) - -y# : set the X offset to generate land around (example: -y0) + -verbose : causes the application to output the server's messages to the console + -v : same as -verbose + -w : Ignore [WARNING] and [SEVERE] messages. + -alt : alternate server launch sequence + -a : same as -alt + -i# : override the iteration spawn offset increment (default 300) (example: -i100) + -x# : set the X offset to generate land around (example: -x0) + -y# : set the X offset to generate land around (example: -y0) Other options: java -jar MinecraftLandGenerator.jar -printspawn @@ -107,17 +115,27 @@ When launched with the -conf switch, this application creates a MinecraftLandGen If this file does not exist or does not contain all required properties, the application will not run. MinecraftLandGenerator.conf properties: - Java : The command line to use to launch the server - ServerPath : The path to the directory in which the server runs (can be overridden by the serverpath argument) - Done_Text : The output from the server that tells us that we are done -Preparing_Text : The output from the server that tells us the percentage + Java : The command line to use to launch the server + ServerPath : The path to the directory in which the server runs (can be overridden by the serverpath argument) + Done_Text : The output from the server that tells us that we are done + Preparing_Text : The output from the server that tells us the percentage +Preparing_Level : The output from the server that tells us the level it is working on + DIM-1 : Name of DIM-1: Nether + DIM-2 : Name of DIM-2: (Future Level) + DIM-3 : Name of DIM-3: (Future Level) + DIM-4 : Name of DIM-4: (Future Level) + DIM-5 : Name of DIM-5: (Future Level) + DIM-6 : Name of DIM-6: (Future Level) + DIM-7 : Name of DIM-7: (Future Level) + DIM-8 : Name of DIM-8: (Future Level) + DIM-9 : Name of DIM-9: (Future Level) ----------------------------------------------- Notes: -This doesn't touch the nether unless you specify hellworld=true in server.properties +Due to changes in server beta 1.6, it now generates the nether as well as the world at the same time. I recommend using MCE or MCEDIT to relight the map after you generate it. This will take a long time, but should fix all those incorrectly dark spots in your level. diff --git a/bin/MinecraftLandGenerator.jar b/bin/MinecraftLandGenerator.jar index b6c86068d5f378d2d3f5afda5a43683788d3d23d..6c88b834610a8bf896ce403cf0515a8036c6bf2f 100644 GIT binary patch delta 12785 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

f$1%G^80i%B4@NZ55S8d{w(f#YGM- zhk)XwMe*rZJLm9Wi#~Z3Dx?J%aG~O+Un2HvPB86J)YBGVwg(kP>XW7MoI z*V>{QO}h%Fh2u{E?xJ3{ZXan&@`qLt_$yFQn5p6m%^ZBY6BDr%JiPXYTCc5Idi^q6K^ zT{Z0b)%&%QUn8K+(@*1F2OV^2iBcwp zh}z^XlFtV}*Q*LJecp!!c!zqaIbbS}O$=Tiaqe4t2dy%r^*3NU*{Vjq(4 zOFk!g$qG>$CDep#ALS0&-VxqXKX*ShyvZ0)_n=*mI-bP}P;9&Vd(G^j5c6#Aqr2~I zN_8XY8l3B+hd$XNX`ldRNHGSD^JG{KQFRsVk#Ha~kJ#F>n6l~syQ%avaL#>RiToo( zcn0>8qDu>z7V!`ARIMzpqP-`jK@YKPxNr)!71Nu_nkktXb1A>_{3q)Xw=Fb@ff zY26T!$)5$Z3#hif1tB@1q!9UE49upkBMp4A5dtG$+e$65ssA03fg{{K`-1B?Pnss^ z-m9t?#4Z~tT(tWepjLVx0`Z$HO*kMu*(rl=tprC@Xs93uX|>`$N_58HWa<;f5w97O z?v-Z9q0CqlXYq7q?0aFY;WBoD680J=ZsghmhVguou`0%+fimSA-k<+ z>-Xg-vkQ`rnxsaTPIwl&oOF-W?=>7mo`*Q$b5PbIFy%K;rEn!Yi(44M#5m$3u$A>c z-r%TgIcT)#1?X--xnA-d54b78h3piYloAg4rd*jwr>l)(SABYWH#ZJa|(>c4I8# z7Okun0zOY%Bz0p-|C9LAD##jhJWqTlkk9`Ji%Kv9l}&6nIwyN9}nEx<7$ zqBz-|aAESJKG_51 zB}N{1*-L;A7F`*nX_HX^Mh*G4Nif7OnbsLl0hCHA4iwmmEyvUcf4Ds;s|L6r5gX8> z9tQx*%&^3ay^JXvAQ1eeljf3dxSn6BI1oI_8xz1IPct@4qeoDWt{uT7;sTY(tyt3O zl*CCL0*dJnL%fhC)ifZ4Yz;xcm;=Wma|TmMcM4o)<;3%GAYzs36m0|m$2RD>lyKh2Wv43IScbUISi!^3q}IPygj&ym}Ecm*A%RO4ai-2zG+ zOe)q4y#3Dh>2<~H^S^U@hf&J8{ry3;L&IRSN8Q>ofPkdv{>55@f?d_(|4z#PgR}oX5&# F{vXcT5v%|J delta 21828 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 diff --git a/src/corrodias/minecraft/landgenerator/Main.java b/src/corrodias/minecraft/landgenerator/Main.java index 8580deb..db76fc9 100644 --- a/src/corrodias/minecraft/landgenerator/Main.java +++ b/src/corrodias/minecraft/landgenerator/Main.java @@ -23,12 +23,13 @@ import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util.LinkedHashMap; -import java.util.Locale; +//import java.util.Locale; import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; import org.jnbt.CompoundTag; import org.jnbt.IntTag; +import org.jnbt.LongTag; import org.jnbt.NBTInputStream; import org.jnbt.NBTOutputStream; import org.jnbt.Tag; @@ -42,21 +43,31 @@ import org.jnbt.Tag; public class Main { //Version Number! - private static final String VERSION = "1.4.4"; + private static final String VERSION = "1.4.5 (pre-1.5.0)"; private static final String separator = System.getProperty("file.separator"); //private static final String classpath = System.getProperty("java.class.path"); //private static final String javaPath = System.getProperty("java.home") + separator + "bin" + separator + "java"; - private int increment = 300; + private int increment = 380; private ProcessBuilder minecraft = null; private String javaLine = null; private String serverPath = null; private String worldPath = null; - private String worldName = null; + private static String worldName = "world"; private static String doneText = null; private static String preparingText = null; - private String hell = null; + private static String preparingLevel = null; +// private static String level_0 = null; //the world + private static String level_1 = null; //the nether + private static String level_2 = null; //future worlds + private static String level_3 = null; + private static String level_4 = null; + private static String level_5 = null; + private static String level_6 = null; + private static String level_7 = null; + private static String level_8 = null; + private static String level_9 = null; private int xRange = 0; private int yRange = 0; private Integer xOffset = null; @@ -64,6 +75,7 @@ public class Main { private boolean verbose = false; private boolean alternate = false; private static boolean ignoreWarnings = false; + private static LongTag randomSeed = null; /** @@ -86,19 +98,19 @@ public class Main { System.out.println("Usage: java -jar MinecraftLandGenerator.jar x y [serverpath] [switches]"); System.out.println(""); System.out.println("Arguments:"); - System.out.println(" x : X range to generate"); - System.out.println(" y : Y range to generate"); - System.out.println(" serverpath : the path to the directory in which the server runs (takes precedence over the config file setting)"); + System.out.println(" x : X range to generate"); + System.out.println(" y : Y range to generate"); + System.out.println(" serverpath : the path to the directory in which the server runs (takes precedence over the config file setting)"); System.out.println(""); System.out.println("Switches:"); - System.out.println(" -verbose : causes the application to output the server's messages to the console"); - System.out.println(" -v : same as -verbose"); - System.out.println(" -w : Ignore [WARNING] and [SEVERE] messages."); - //System.out.println(" -alt : alternate server launch sequence"); - //System.out.println(" -a : same as -alt"); - System.out.println(" -i# : override the iteration spawn offset increment (default 300) (example: -i100)"); - System.out.println(" -x# : set the X offset to generate land around (example: -x0)"); - System.out.println(" -y# : set the X offset to generate land around (example: -y0)"); + System.out.println(" -verbose : causes the application to output the server's messages to the console"); + System.out.println(" -v : same as -verbose"); + System.out.println(" -w : Ignore [WARNING] and [SEVERE] messages."); + System.out.println(" -alt : alternate server launch sequence"); + System.out.println(" -a : same as -alt"); + System.out.println(" -i# : override the iteration spawn offset increment (default 300) (example: -i100)"); + System.out.println(" -x# : set the X offset to generate land around (example: -x0)"); + System.out.println(" -y# : set the X offset to generate land around (example: -y0)"); System.out.println(""); System.out.println("Other options:"); System.out.println(" java -jar MinecraftLandGenerator.jar -printspawn"); @@ -117,10 +129,20 @@ public class Main { System.out.println("If this file does not exist or does not contain all required properties, the application will not run."); System.out.println(""); System.out.println("MinecraftLandGenerator.conf properties:"); - System.out.println(" Java : The command line to use to launch the server"); - System.out.println(" ServerPath : The path to the directory in which the server runs (can be overridden by the serverpath argument)"); - System.out.println(" Done_Text : The output from the server that tells us that we are done"); - System.out.println("Preparing_Text : The output from the server that tells us the percentage"); + System.out.println(" Java : The command line to use to launch the server"); + System.out.println(" ServerPath : The path to the directory in which the server runs (can be overridden by the serverpath argument)"); + System.out.println(" Done_Text : The output from the server that tells us that we are done"); + System.out.println(" Preparing_Text : The output from the server that tells us the percentage"); + System.out.println("Preparing_Level : The output from the server that tells us the level it is working on"); + System.out.println(" DIM-1 : Name of DIM-1: Nether"); + System.out.println(" DIM-2 : Name of DIM-2: (Future Level)"); + System.out.println(" DIM-3 : Name of DIM-3: (Future Level)"); + System.out.println(" DIM-4 : Name of DIM-4: (Future Level)"); + System.out.println(" DIM-5 : Name of DIM-5: (Future Level)"); + System.out.println(" DIM-6 : Name of DIM-6: (Future Level)"); + System.out.println(" DIM-7 : Name of DIM-7: (Future Level)"); + System.out.println(" DIM-8 : Name of DIM-8: (Future Level)"); + System.out.println(" DIM-9 : Name of DIM-9: (Future Level)"); return; } @@ -144,15 +166,44 @@ public class Main { out.newLine(); out.write("#Auto-Generated: " + dateFormat.format(date)); out.newLine(); + out.newLine(); + out.write("#Line to run server:"); + out.newLine(); out.write("Java=java -Djline.terminal=jline.UnsupportedTerminal -Duser.language=en -Xms1024m -Xmx1024m -Xincgc -jar minecraft_server.jar nogui"); // I added the jline tag for future proofing... out.newLine(); + out.newLine(); + out.write("#Location of server. use \".\" for the same folder as MLG"); + out.newLine(); out.write("ServerPath=."); out.newLine(); + out.newLine(); + out.write("#Strings read from the server"); + out.newLine(); out.write("Done_Text=[INFO] Done"); out.newLine(); out.write("Preparing_Text=[INFO] Preparing spawn area:"); out.newLine(); + out.write("Preparing_Level=[INFO] Preparing start region for"); + out.newLine(); + out.write("DIM-1=Nether"); + out.newLine(); + out.write("DIM-2=DIM-2"); + out.newLine(); + out.write("DIM-3=DIM-3"); + out.newLine(); + out.write("DIM-4=DIM-4"); + out.newLine(); + out.write("DIM-5=DIM-5"); + out.newLine(); + out.write("DIM-6=DIM-6"); + out.newLine(); + out.write("DIM-7=DIM-7"); + out.newLine(); + out.write("DIM-8=DIM-8"); + out.newLine(); + out.write("DIM-9=DIM-9"); + out.newLine(); out.close(); System.out.println("MinecraftLandGenerator.conf file created."); return; @@ -176,16 +227,14 @@ public class Main { while ((line = in.readLine()) != null) { 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){ // If hash is before the '=', we may have a issue... it should be fine, cause we check for issues next, but lets make sure. end = line.length(); } - + if (pos != -1) { if (line.substring(0, pos).toLowerCase().equals("serverpath")) { serverPath = line.substring(pos + 1, end); @@ -195,6 +244,26 @@ public class Main { doneText = line.substring(pos + 1, end); } else if (line.substring(0, pos).toLowerCase().equals("preparing_text")) { preparingText = line.substring(pos + 1, end); + } else if (line.substring(0, pos).toLowerCase().equals("preparing_level")) { + preparingLevel = line.substring(pos + 1, end); + } else if (line.substring(0, pos).toLowerCase().equals("DIM-1")) { + level_1 = line.substring(pos + 1, end); + } else if (line.substring(0, pos).toLowerCase().equals("DIM-2")) { + level_2 = line.substring(pos + 1, end); + } else if (line.substring(0, pos).toLowerCase().equals("DIM-3")) { + level_3 = line.substring(pos + 1, end); + } else if (line.substring(0, pos).toLowerCase().equals("DIM-4")) { + level_4 = line.substring(pos + 1, end); + } else if (line.substring(0, pos).toLowerCase().equals("DIM-5")) { + level_5 = line.substring(pos + 1, end); + } else if (line.substring(0, pos).toLowerCase().equals("DIM-6")) { + level_6 = line.substring(pos + 1, end); + } else if (line.substring(0, pos).toLowerCase().equals("DIM-7")) { + level_7 = line.substring(pos + 1, end); + } else if (line.substring(0, pos).toLowerCase().equals("DIM-8")) { + level_8 = line.substring(pos + 1, end); + } else if (line.substring(0, pos).toLowerCase().equals("DIM-9")) { + level_9 = line.substring(pos + 1, end); } } } @@ -205,7 +274,7 @@ public class Main { return; } - if (doneText == null || preparingText == null) { + if (doneText == null || preparingText == null || preparingLevel == null || level_1 == null || level_9 == null) { System.err.println("Old Version of MinecraftLandGenerator.conf found. Updating..."); try { File configUpdate = new File("MinecraftLandGenerator.conf"); @@ -224,6 +293,26 @@ public class Main { out.newLine(); out.write("Preparing_Text=[INFO] Preparing spawn area:"); out.newLine(); + out.write("Preparing_Level=[INFO] Preparing start region for"); + out.newLine(); + out.write("DIM-1=Nether"); + out.newLine(); + out.write("DIM-2=DIM-2"); + out.newLine(); + out.write("DIM-3=DIM-3"); + out.newLine(); + out.write("DIM-4=DIM-4"); + out.newLine(); + out.write("DIM-5=DIM-5"); + out.newLine(); + out.write("DIM-6=DIM-6"); + out.newLine(); + out.write("DIM-7=DIM-7"); + out.newLine(); + out.write("DIM-8=DIM-8"); + out.newLine(); + out.write("DIM-9=DIM-9"); + out.newLine(); out.close(); System.out.println("MinecraftLandGenerator.conf file created."); return; @@ -264,11 +353,8 @@ public class Main { } else if (nextSwitch.startsWith("-w")) { ignoreWarnings = true; } else if (nextSwitch.equals("-alt") || nextSwitch.equals("-a")) { - // System.out.println("Using Alternate Launching..."); - System.out.println("Alternate Launch Disabled."); - // This is a failed attempt to fix issues with Windows XP 32bit. - // alternate = true; - alternate = false; // force Alt to be off, just in case + System.out.println("Using Alternate Launching..."); + alternate = true; } else if (nextSwitch.startsWith("-x")) { xOffset = Integer.valueOf(args[i + 2].substring(2)); } else if (nextSwitch.startsWith("-y")) { @@ -301,9 +387,6 @@ public class Main { if (line.substring(0, pos).toLowerCase().equals("level-name")) { worldPath = serverPath + separator + line.substring(pos + 1); worldName = line.substring(pos + 1); - } else if (line.substring(0, pos).toLowerCase().equals("hellworld")) { - hell = line.substring(pos + 1); - hell = hell.toLowerCase(Locale.ENGLISH); } } @@ -331,11 +414,8 @@ public class Main { // ===================================================================== System.out.println("Processing world \"" + worldPath + "\", in " + increment + " block increments, with: " + javaLine); - if (hell.contains("true")){ - System.out.println("Processing The Nether of \"" + worldName + "\"... (DIM-1)"); - } else if (hell.contains("false")) { - System.out.println("Processing \"" + worldName + "\"..."); - } + //System.out.println("Processing \"" + worldName + "\"..."); + System.out.println(""); // prepare our two ProcessBuilders @@ -343,9 +423,7 @@ public class Main { minecraft = new ProcessBuilder(javaLine.split("\\s")); // is this always going to work? i don't know. minecraft.directory(new File(serverPath)); minecraft.redirectErrorStream(true); - - try { System.out.println("Launching server once to make sure there is a world."); runMinecraft(minecraft, verbose, alternate, javaLine); @@ -386,6 +464,9 @@ public class Main { for (int currentX = 0 - xRange / 2; currentX <= xRange / 2; currentX += increment) { for (int currentY = 0 - yRange / 2; currentY <= yRange / 2; currentY += increment) { currentIteration++; + + System.out.println(Integer.toString(currentIteration / totalIterations) + "% Done"); + System.out.println("Setting spawn to [" + Integer.toString(currentX + xOffset) + ", " + Integer.toString(currentY + yOffset) + "] (" + currentIteration + "/" + totalIterations + ")"); // Time Remaining estimate @@ -431,7 +512,12 @@ public class Main { IntTag spawnX = (IntTag) newData.get("SpawnX"); IntTag spawnY = (IntTag) newData.get("SpawnY"); IntTag spawnZ = (IntTag) newData.get("SpawnZ"); - + + randomSeed = (LongTag) newData.get("RandomSeed"); + if (randomSeed.getValue() != 0) { + System.out.println("Seed: " + randomSeed.getValue()); //lets output the seed, cause why not? + } + Integer[] ret = new Integer[]{spawnX.getValue(), spawnY.getValue(), spawnZ.getValue()}; return ret; } catch (ClassCastException ex) { @@ -442,7 +528,7 @@ public class Main { } /** - * Changes the spawn point in the given Alpha level to the given coordinates. + * Changes the spawn point in the given Alpha/Beta level to the given coordinates. * Note that, in Minecraft levels, the Y coordinate is height, while Z is * what may normally be thought of as Y. * @param level the level file to change the spawn point in @@ -474,7 +560,7 @@ public class Main { // * TAG_Int("SpawnX"): X coordinate of the player's spawn position. Default is 0. // * TAG_Int("SpawnY"): Y coordinate of the player's spawn position. Default is 64. // * TAG_Int("SpawnZ"): Z coordinate of the player's spawn position. Default is 0. -// * TAG_Byte("SnowCovered"): 1 enables, 0 disables, see Winter Mode +// * TAG_Byte("SnowCovered"): 1 enables, 0 disables, see Winter Mode //Old! // * TAG_Long("SizeOnDisk"): Estimated size of the entire world in bytes. // * TAG_Long("RandomSeed"): Random number providing the Random Seed for the terrain. // @@ -483,12 +569,14 @@ public class Main { // This is our map of data. It is an unmodifiable map, for some reason, so we have to make a copy. Map newData = new LinkedHashMap(originalData); // .get() a couple of values, just to make sure we're dealing with a valid level file, here. Good for debugging, too. + @SuppressWarnings("unused") - IntTag spawnX = (IntTag) newData.get("SpawnX"); //we never use these... + IntTag spawnX = (IntTag) newData.get("SpawnX"); // we never use these... Its only here for potential debugging. @SuppressWarnings("unused") - IntTag spawnY = (IntTag) newData.get("SpawnY"); //but whatever... + IntTag spawnY = (IntTag) newData.get("SpawnY"); // but whatever... so I (Morlok8k) suppressed these warnings. @SuppressWarnings("unused") - IntTag spawnZ = (IntTag) newData.get("SpawnZ"); + IntTag spawnZ = (IntTag) newData.get("SpawnZ"); // I don't want to remove existing code, either by myself (Morlok8k) or Corrodias + newData.put("SpawnX", new IntTag("SpawnX", x)); newData.put("SpawnY", new IntTag("SpawnY", y)); newData.put("SpawnZ", new IntTag("SpawnZ", z)); @@ -532,43 +620,25 @@ public class Main { // So, here is a bunch of duplicate code... // Stupid compile errors... - if (alternate) { //Alternate is currently disabled. - // Runtime minecraftAlt = Runtime.getRuntime(); - // Process process = minecraftAlt.exec(javaLine.split("\\s")); - // //InputStream is = processAlt.getInputStream(); - // // this didn't work - Minecraft Server uses the error stream for almost all the output. - // // the input stream only reads the amount of recipes the server has, for instance, beta 1.4 reports: "144 recipes" - // // with the standard way, ProcessBuilder, we can combine Error and Input. - // //InputStreamReader isr = new InputStreamReader(is); - // //BufferedReader pOut = new BufferedReader(isr); - // BufferedReader pOut = new BufferedReader(new InputStreamReader(process.getErrorStream())); - // - // String line = null; - // - // byte[] stop = {'s', 't', 'o', 'p', '\r', '\n'}; //Moved here, so this code wont run every loop, thus Faster! - // //and no, i can't use a string here! - // - // while ((line = pOut.readLine()) != null) { - // if (verbose) { - // System.out.println(line); - // } - // if (line.contains("[INFO] Done")) { //EDITED By Morlok8k for Minecraft 1.3+ Beta - // System.out.println("Stopping server."); - // OutputStream outputStream = process.getOutputStream(); - // outputStream.write(stop); - // outputStream.flush(); - // outputStream.close(); - // } - // if (line.contains("[SEVERE]")) { //If we have a severe error, stop... - // System.out.println("Severe error found: Stopping server."); - // OutputStream outputStream = process.getOutputStream(); - // outputStream.write(stop); - // outputStream.flush(); - // outputStream.close(); - System.exit(1); - // //Quit! - // } - // } + if (alternate) { //Alternate - a replication of MLG 1.3.0's code. simplest code possible. + System.out.println("Starting server."); + Process process = minecraft.start(); + + // monitor output and print to console where required. + // STOP the server when it's done. + BufferedReader pOut = new BufferedReader(new InputStreamReader(process.getInputStream())); + String line; + while ((line = pOut.readLine()) != null) { + System.out.println(line); + if (line.contains("[INFO] Done")) { //EDITED By Morlok8k for Minecraft 1.3+ Beta + System.out.println("Stopping server."); + byte[] stop = {'s', 't', 'o', 'p', '\r', '\n'}; + OutputStream outputStream = process.getOutputStream(); + outputStream.write(stop); + outputStream.flush(); + } + } + // readLine() returns null when the process exits } else { //start minecraft server normally! Process process = minecraft.start(); @@ -581,12 +651,14 @@ public class Main { System.out.println("Accessing Server Output..."); } - String line = null; byte[] stop = {'s', 't', 'o', 'p', '\r', '\n'}; //Moved here, so this code wont run every loop, thus Faster! //and no, i can't use a string here! + OutputStream outputStream = process.getOutputStream(); //moved here to remove some redundancy + + while ((line = pOut.readLine()) != null) { if (verbose) { if (line.contains("[INFO]")){ @@ -596,51 +668,82 @@ public class Main { } } else if (line.contains(preparingText)){ System.out.print(line.substring(line.length() - 3, line.length()) + "... "); + } else if (line.contains(preparingLevel)){ + if (line.contains("level 0")) { //"Preparing start region for level 0" + System.out.println("\r\n" + worldName + ":"); + } else if (line.contains("level 1")) { //"Preparing start region for level 1" + System.out.println("\r\n" + level_1 + ":"); + } else if (line.contains("level 2")) { //"Preparing start region for level 2" + System.out.println("\r\n" + level_2 + ":"); + } else if (line.contains("level 3")) { //"Preparing start region for level 3" + System.out.println("\r\n" + level_3 + ":"); + } else if (line.contains("level 4")) { //"Preparing start region for level 4" + System.out.println("\r\n" + level_4 + ":"); + } else if (line.contains("level 5")) { //"Preparing start region for level 5" + System.out.println("\r\n" + level_5 + ":"); + } else if (line.contains("level 6")) { //"Preparing start region for level 6" + System.out.println("\r\n" + level_6 + ":"); + } else if (line.contains("level 7")) { //"Preparing start region for level 7" + System.out.println("\r\n" + level_7 + ":"); + } else if (line.contains("level 8")) { //"Preparing start region for level 8" + System.out.println("\r\n" + level_8 + ":"); + } else if (line.contains("level 9")) { //"Preparing start region for level 9" + System.out.println("\r\n" + level_9 + ":"); + } } - + if (line.contains(doneText)) { // now this is configurable! System.out.println(""); System.out.println("Stopping server."); - OutputStream outputStream = process.getOutputStream(); + //OutputStream outputStream = process.getOutputStream(); outputStream.write(stop); outputStream.flush(); - outputStream.close(); + //outputStream.close(); } if (ignoreWarnings == false) { if (line.contains("[WARNING]")) { //If we have a severe error, stop... System.out.println(""); System.out.println("Warning found: Stopping Minecraft Land Generator"); System.out.println(""); - OutputStream outputStream = process.getOutputStream(); - outputStream.write(stop); //if the warning was a fail to bind to port, we may need to write stop twice! (but since we write stop every time we see a warning, we should be fine.) + //OutputStream outputStream = process.getOutputStream(); + outputStream.write(stop); //if the warning was a fail to bind to port, we may need to write stop twice! outputStream.flush(); - outputStream.close(); + outputStream.write(stop); + outputStream.flush(); + //outputStream.close(); warning = true; + //System.exit(1); } if (line.contains("[SEVERE]")) { //If we have a severe error, stop... System.out.println(""); System.out.println("Severe error found: Stopping server."); - OutputStream outputStream = process.getOutputStream(); + System.out.println(""); + //OutputStream outputStream = process.getOutputStream(); outputStream.write(stop); outputStream.flush(); - outputStream.close(); - System.exit(1); + outputStream.write(stop); //sometimes we need to do stop twice... + outputStream.flush(); + //outputStream.close(); + warning = true; + //System.exit(1); //Quit! } } } - if (warning == true){ + if (warning == true){ //in 1.4.4 we had a issue. tried to write stop twice, but we had closed the stream already. this, and other lines should fix this. + outputStream.flush(); + outputStream.close(); System.exit(1); } + outputStream.close(); } - - // readLine() returns null when the process exits } - + + // Corrodias: // I'd love to use nio, but it requires Java 7. // I could use Apache Commons, but i don't want to include a library for one little thing. // Copies src file to dst file.