From 21e921ef2f11e25c8bca75047dc0f4aeda424640 Mon Sep 17 00:00:00 2001 From: Morlok8k Date: Thu, 28 Apr 2011 04:33:58 -0700 Subject: [PATCH] MLG v1.4.0 --- bin/MinecraftLandGenerator.jar | Bin 32622 -> 33865 bytes .../minecraft/landgenerator/Main.java | 256 +++++++++++++++--- 2 files changed, 219 insertions(+), 37 deletions(-) diff --git a/bin/MinecraftLandGenerator.jar b/bin/MinecraftLandGenerator.jar index 04a51442fb55a5724b1ea85203c1a56bfe3dc1cb..934fb0abbb810fdbaa6fd6187085448a5d08f196 100644 GIT binary patch delta 15655 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 diff --git a/src/corrodias/minecraft/landgenerator/Main.java b/src/corrodias/minecraft/landgenerator/Main.java index 9eeb9de..d66b37b 100644 --- a/src/corrodias/minecraft/landgenerator/Main.java +++ b/src/corrodias/minecraft/landgenerator/Main.java @@ -16,9 +16,14 @@ import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; +//import java.io.OutputStreamWriter; +//import java.util.Date; +import java.text.DateFormat; +import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util.LinkedHashMap; +import java.util.Locale; import java.util.Map; import java.util.logging.Level; import java.util.logging.Logger; @@ -27,33 +32,40 @@ import org.jnbt.IntTag; import org.jnbt.NBTInputStream; import org.jnbt.NBTOutputStream; import org.jnbt.Tag; +//import java.io.*; //if we want to import everything... +//import java.util.*; /** * - * @author Corrodias + * @author Corrodias, Morlok8k */ public class Main { 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 static final String VERSION = "1.3.0"; //Morlok8k: Updated + private static final String VERSION = "1.4.0"; private int increment = 300; private ProcessBuilder minecraft = null; private String javaLine = null; private String serverPath = null; private String worldPath = null; + private String worldName = null; + private static String doneText = null; + private static String preparingText = null; + private String hell = null; private int xRange = 0; private int yRange = 0; private Integer xOffset = null; private Integer yOffset = null; private boolean verbose = false; + private boolean alternate = false; /** * @param args the command line arguments */ public static void main(String[] args) { - (new Main()).run(args); + (new Main()).run(args); //Why? idk, but merging this with run() creates errors, and i'm lazy! } private void run(String[] args) { @@ -69,16 +81,18 @@ 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(" -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(" -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"); @@ -97,8 +111,11 @@ 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(" 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"); + return; } @@ -106,14 +123,27 @@ public class Main { // STARTUP AND CONFIG // ===================================================================== + DateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss Z"); + Date date = new Date(); + //dateFormat.format(date); + // the arguments are apparently okay so far. parse the conf file. if (args[0].equalsIgnoreCase("-conf")) { try { File config = new File("MinecraftLandGenerator.conf"); BufferedWriter out = new BufferedWriter(new FileWriter(config)); - out.write("java=java -Xms1024m -Xmx1024m -jar minecraft_server.jar nogui"); + out.write("#Minecraft Land Generator Configuration File:"); out.newLine(); - out.write("serverpath=."); + out.write("#Auto-Generated: " + dateFormat.format(date)); + out.newLine(); + out.write("Java=java -Djline.terminal=jline.UnsupportedTerminal -Xms1024m -Xmx1024m -Xincgc -jar minecraft_server.jar nogui"); + // I added the jline tag for future proofing... + out.newLine(); + out.write("ServerPath=."); + out.newLine(); + out.write("Done_Text=[INFO] Done"); + out.newLine(); + out.write("Preparing_Text=[INFO] Preparing spawn area:"); out.newLine(); out.close(); System.out.println("MinecraftLandGenerator.conf file created."); @@ -137,20 +167,62 @@ public class Main { String line; 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); + serverPath = line.substring(pos + 1, end); } else if (line.substring(0, pos).toLowerCase().equals("java")) { - javaLine = line.substring(pos + 1); + javaLine = line.substring(pos + 1, end); + } else if (line.substring(0, pos).toLowerCase().equals("done_text")) { + doneText = line.substring(pos + 1, end); + } else if (line.substring(0, pos).toLowerCase().equals("preparing_text")) { + preparingText = line.substring(pos + 1, end); } } } in.close(); if (serverPath == null || javaLine == null) { - System.err.println("MinecraftLandGenerator.conf does not contain all requird properties. Please recreate it by running this application with no arguments."); + System.err.println("MinecraftLandGenerator.conf does not contain all required properties. Please recreate it by running this application with -conf."); return; } + + if (doneText == null || preparingText == null) { + System.err.println("Old Version of MinecraftLandGenerator.conf found. Updating..."); + try { + File configUpdate = new File("MinecraftLandGenerator.conf"); + BufferedWriter out = new BufferedWriter(new FileWriter(configUpdate)); + out.write("#Minecraft Land Generator Configuration File:"); + out.newLine(); + out.write("#Auto-Updated: " + dateFormat.format(date)); + out.newLine(); + out.write("Java=" + javaLine); + out.newLine(); + out.write("ServerPath=" + serverPath); + out.newLine(); + out.write("Done_Text=[INFO] Done"); + out.newLine(); + out.write("Preparing_Text=[INFO] Preparing spawn area:"); + out.newLine(); + out.close(); + System.out.println("MinecraftLandGenerator.conf file created."); + return; + } catch (IOException ex) { + System.err.println("Could not create MinecraftLandGenerator.conf."); + return; + } + } + } catch (FileNotFoundException ex) { System.out.println("Could not find MinecraftLandGenerator.conf. It is recommended that you run the application with the -conf option to create it."); return; @@ -167,7 +239,10 @@ public class Main { System.err.println("Invalid X or Y argument."); return; } - + + verbose = false; // Verifing that these vars are false + alternate = false; // before changing them... + // This is embarrassing. Don't look. try { for (int i = 0; i < args.length - 2; i++) { @@ -176,6 +251,12 @@ public class Main { verbose = true; } else if (nextSwitch.startsWith("-i")) { increment = Integer.parseInt(args[i + 2].substring(2)); + } 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 } else if (nextSwitch.startsWith("-x")) { xOffset = Integer.valueOf(args[i + 2].substring(2)); } else if (nextSwitch.startsWith("-y")) { @@ -207,7 +288,12 @@ public class Main { if (pos != -1) { 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); } + } } @@ -233,6 +319,11 @@ 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(""); // prepare our two ProcessBuilders @@ -240,10 +331,12 @@ 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); + runMinecraft(minecraft, verbose, alternate, javaLine); System.out.println(""); File serverLevel = new File(worldPath + separator + "level.dat"); @@ -299,7 +392,7 @@ public class Main { setSpawn(serverLevel, currentX + xOffset, 128, currentY + yOffset); // Launch the server - runMinecraft(minecraft, verbose); + runMinecraft(minecraft, verbose, alternate, javaLine); System.out.println(""); } } @@ -378,7 +471,7 @@ 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. - IntTag spawnX = (IntTag) newData.get("SpawnX"); + IntTag spawnX = (IntTag) newData.get("SpawnX"); //we never use these... IntTag spawnY = (IntTag) newData.get("SpawnY"); IntTag spawnZ = (IntTag) newData.get("SpawnZ"); newData.put("SpawnX", new IntTag("SpawnX", x)); @@ -411,26 +504,101 @@ public class Main { * @param verbose * @throws IOException */ - protected static void runMinecraft(ProcessBuilder minecraft, boolean verbose) throws IOException { + protected static void runMinecraft(ProcessBuilder minecraft, boolean verbose, boolean alternate, String javaLine) throws IOException { 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) { + + // Damn it Java! I hate you so much! + // I can't reuse code the way I want to, like in other langauges. + // 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! + // } + // } + + } else { //start minecraft server normally! + Process process = minecraft.start(); if (verbose) { - System.out.println(line); + System.out.println("Started Server."); } - 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(); + BufferedReader pOut = new BufferedReader(new InputStreamReader(process.getInputStream())); + if (verbose) { + 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! + + while ((line = pOut.readLine()) != null) { + if (verbose) { + if (line.contains("[INFO]")){ + System.out.println(line.substring(line.lastIndexOf("]") + 2)); + } else { + System.out.println(line); + } + } else if (line.contains(preparingText)){ + System.out.println(line.substring(line.length() - 3, line.length())); + } + + if (line.contains(doneText)) { // now this is configurable! + 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! + } } } + + + // readLine() returns null when the process exits } @@ -464,12 +632,26 @@ public class Main { BufferedReader in = new BufferedReader(new FileReader(config)); String line; while ((line = in.readLine()) != null) { + int ignoreLine = line.indexOf('#'); + if (ignoreLine == -1){ + ignoreLine = 1; + } else if (ignoreLine == 0){ + ignoreLine = 1; + } else if (ignoreLine == 1){ + ignoreLine = 1; + } else { + ignoreLine = line.length(); + } + if (ignoreLine != 1){ + ignoreLine = line.length(); + } + int pos = line.indexOf('='); if (pos != -1) { if (line.substring(0, pos).toLowerCase().equals("serverpath")) { - serverPath = line.substring(pos + 1); + serverPath = line.substring(pos + 1, ignoreLine); } else if (line.substring(0, pos).toLowerCase().equals("java")) { - javaLine = line.substring(pos + 1); + javaLine = line.substring(pos + 1, ignoreLine); } } }