diff --git a/pom.xml b/pom.xml
index 59d9f90a04..aa623a25b1 100644
--- a/pom.xml
+++ b/pom.xml
@@ -27,6 +27,11 @@
jar
compile
+
+ net.sf.jopt-simple
+ jopt-simple
+ 3.2
+
diff --git a/src/main/java/net/minecraft/server/MinecraftServer.java b/src/main/java/net/minecraft/server/MinecraftServer.java
index 333e00900f..c3b2568cf4 100644
--- a/src/main/java/net/minecraft/server/MinecraftServer.java
+++ b/src/main/java/net/minecraft/server/MinecraftServer.java
@@ -11,6 +11,7 @@ import java.util.Iterator;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
+import joptsimple.OptionSet;
import org.bukkit.craftbukkit.CraftServer;
@@ -37,14 +38,18 @@ implements ICommandListener, Runnable {
public boolean n;
public CraftServer server; // CraftBukkit
+ public OptionSet options; // CraftBukkit
- public MinecraftServer() {
+ // CraftBukkit: Added arg "OptionSet options"
+ public MinecraftServer(final OptionSet options) {
o = true;
g = false;
h = 0;
p = new ArrayList();
q = Collections.synchronizedList(new ArrayList());
new ThreadSleepForever(this);
+
+ this.options = options; // CraftBukkit
}
// CraftBukkit: added throws UnknownHostException
@@ -60,7 +65,7 @@ implements ICommandListener, Runnable {
a.warning("To start the server with more ram, launch it as \"java -Xmx1024M -Xms1024M -jar minecraft_server.jar\"");
}
a.info("Loading properties");
- d = new PropertyManager(new File("server.properties"));
+ d = new PropertyManager(options); // Craftbukkit
String s = d.a("server-ip", "");
l = d.a("online-mode", true);
@@ -450,18 +455,17 @@ implements ICommandListener, Runnable {
p.add(iupdateplayerlistbox);
}
- public static void main(String args[]) {
+ // Craftbukkit start - replaces main(String args[])
+ public static void main(final OptionSet options) {
try {
- MinecraftServer minecraftserver = new MinecraftServer();
+ MinecraftServer minecraftserver = new MinecraftServer(options);
- if (!java.awt.GraphicsEnvironment.isHeadless() && (args.length <= 0 || !args[0].equals("nogui"))) {
- ServerGUI.a(minecraftserver);
- }
(new ThreadServerApplication("Server thread", minecraftserver)).start();
} catch (Exception exception) {
a.log(Level.SEVERE, "Failed to start the minecraft server", exception);
}
}
+ // Craftbukkit end
public File a(String s) {
return new File(s);
diff --git a/src/main/java/net/minecraft/server/PropertyManager.java b/src/main/java/net/minecraft/server/PropertyManager.java
new file mode 100644
index 0000000000..4be80a802b
--- /dev/null
+++ b/src/main/java/net/minecraft/server/PropertyManager.java
@@ -0,0 +1,92 @@
+package net.minecraft.server;
+
+
+import java.io.*;
+import java.util.Properties;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import joptsimple.OptionSet;
+
+
+public class PropertyManager {
+
+ public static Logger a = Logger.getLogger("Minecraft");
+ private Properties b;
+ private File c;
+
+ private OptionSet options = null; // Craftbukkit
+
+ public PropertyManager(File file) {
+ b = new Properties();
+ c = file;
+ if (file.exists()) {
+ try {
+ b.load(new FileInputStream(file));
+ } catch (Exception exception) {
+ a.log(Level.WARNING, (new StringBuilder()).append("Failed to load ").append(file).toString(), exception);
+ a();
+ }
+ } else {
+ a.log(Level.WARNING, (new StringBuilder()).append(file).append(" does not exist").toString());
+ a();
+ }
+ }
+
+ // Craftbukkit start
+ public PropertyManager(final OptionSet options) {
+ this((File)options.valueOf("config"));
+
+ this.options = options;
+ }
+
+ private T getOverride(String name, T value) {
+ if ((options != null) && (options.has(name))) {
+ return (T)options.valueOf(name);
+ }
+
+ return value;
+ }
+ // Craftbukkit end
+
+ public void a() {
+ a.log(Level.INFO, "Generating new properties file");
+ b();
+ }
+
+ public void b() {
+ try {
+ b.store(new FileOutputStream(c), "Minecraft server properties");
+ } catch (Exception exception) {
+ a.log(Level.WARNING, (new StringBuilder()).append("Failed to save ").append(c).toString(), exception);
+ a();
+ }
+ }
+
+ public String a(String s, String s1) {
+ if (!b.containsKey(s)) {
+ b.setProperty(s, getOverride(s, s1)); // Craftbukkit
+ b();
+ }
+ return getOverride(s, b.getProperty(s, s1)); // Craftbukkit
+ }
+
+ public int a(String s, int i) {
+ try {
+ return getOverride(s, Integer.parseInt(a(s, String.valueOf(i)))); // Craftbukkit
+ } catch (Exception exception) {
+ b.setProperty(s, getOverride(s, i).toString()); // Craftbukkit
+ }
+ return getOverride(s, i); // Craftbukkit
+ }
+
+ public boolean a(String s, boolean flag) {
+ try {
+ return getOverride(s, Boolean.parseBoolean(a(s, String.valueOf(flag)))); // Craftbukkit
+ } catch (Exception exception) {
+ b.setProperty(s, getOverride(s, flag).toString()); // Craftbukkit
+ }
+ return getOverride(s, flag); // Craftbukkit
+ }
+
+}
+
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftServer.java b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
index e575805136..216a26b6e5 100644
--- a/src/main/java/org/bukkit/craftbukkit/CraftServer.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftServer.java
@@ -27,7 +27,7 @@ public final class CraftServer implements Server {
pluginManager.RegisterInterface(JavaPluginLoader.class);
- File pluginFolder = new File("plugins");
+ File pluginFolder = (File)console.options.valueOf("plugins");
if (pluginFolder.exists()) {
try {
diff --git a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
index 5cd587b200..31b9d0f0e3 100644
--- a/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
+++ b/src/main/java/org/bukkit/craftbukkit/CraftWorld.java
@@ -42,6 +42,10 @@ public class CraftWorld implements World {
return block;
}
+
+ public int getHighestBlockYAt(int x, int z) {
+ return world.d(x, z);
+ }
public Chunk getChunkAt(int x, int z) {
ChunkCoordinate loc = new ChunkCoordinate(x, z);
diff --git a/src/main/java/org/bukkit/craftbukkit/Main.java b/src/main/java/org/bukkit/craftbukkit/Main.java
index 786e56d840..db33837468 100644
--- a/src/main/java/org/bukkit/craftbukkit/Main.java
+++ b/src/main/java/org/bukkit/craftbukkit/Main.java
@@ -1,16 +1,86 @@
package org.bukkit.craftbukkit;
+import java.io.File;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.List;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import joptsimple.OptionParser;
+import joptsimple.OptionSet;
import net.minecraft.server.MinecraftServer;
public class Main {
public static void main(String[] args) {
// Todo: Installation script
+ OptionParser parser = new OptionParser() {
+ {
+ acceptsAll(asList("?", "help"), "Show the help");
+
+ acceptsAll(asList("c", "config"), "Properties file to use")
+ .withRequiredArg()
+ .ofType(File.class)
+ .defaultsTo(new File("server.properties"))
+ .describedAs("Properties file");
+
+ acceptsAll(asList("P", "plugins"), "Plugin directory to use")
+ .withRequiredArg()
+ .ofType(File.class)
+ .defaultsTo(new File("plugins"))
+ .describedAs("Plugin directory");
+
+ acceptsAll(asList("h", "host", "server-ip"), "Host to listen on")
+ .withRequiredArg()
+ .ofType(String.class)
+ .describedAs("Hostname or IP");
+
+ acceptsAll(asList("w", "world", "level-name"), "World directory")
+ .withRequiredArg()
+ .ofType(String.class)
+ .describedAs("World dir");
+
+ acceptsAll(asList("p", "port", "server-port"), "Port to listen on")
+ .withRequiredArg()
+ .ofType(Integer.class)
+ .describedAs("Port");
+
+ acceptsAll(asList("o", "online-mode"), "Whether to use online authentication")
+ .withRequiredArg()
+ .ofType(Boolean.class)
+ .describedAs("Authentication");
+
+ acceptsAll(asList("s", "size", "max-players"), "Maximum amount of players")
+ .withRequiredArg()
+ .ofType(Integer.class)
+ .describedAs("Server size");
+ }
+ };
+
+ OptionSet options = null;
try {
- MinecraftServer.main(args);
- } catch (Throwable t) {
- t.printStackTrace();
+ options = parser.parse(args);
+ } catch (joptsimple.OptionException ex) {
+ Logger.getLogger(Main.class.getName()).log(Level.SEVERE, ex.getLocalizedMessage());
+ }
+
+ if ((options == null) || (options.has("?"))) {
+ try {
+ parser.printHelpOn(System.out);
+ } catch (IOException ex) {
+ Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
+ }
+ } else {
+ try {
+ MinecraftServer.main(options);
+ } catch (Throwable t) {
+ t.printStackTrace();
+ }
}
}
+
+ private static List asList(String... params) {
+ return Arrays.asList(params);
+ }
}