geforkt von Mirrors/Paper
b1f6d16bfa
Refactoring dependencies 'changes' the string literal in the code. This commit changes the literal to instead use a char[] to initialize a new String. On a bytecode level, there will not exist a String literal for these two values; the shade plugin will no longer refactor them. Refactoring jline also changes the other String literals we use for notifying jline of the current state. To insure that our local code reflects the inner logic in jline, the key value was changed to the static final variable located in TerminalFactory. Likewise, UnsupportedTerminal uses the explicit class name (as reflection is used later with the value that has been set).
163 Zeilen
6.6 KiB
Java
163 Zeilen
6.6 KiB
Java
package org.bukkit.craftbukkit;
|
|
|
|
import java.io.File;
|
|
import java.io.IOException;
|
|
import java.text.SimpleDateFormat;
|
|
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 boolean useJline = true;
|
|
public static boolean useConsole = true;
|
|
|
|
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-dir", "universe", "world-container"), "World container")
|
|
.withRequiredArg()
|
|
.ofType(File.class)
|
|
.describedAs("Directory containing worlds");
|
|
|
|
acceptsAll(asList("w", "world", "level-name"), "World name")
|
|
.withRequiredArg()
|
|
.ofType(String.class)
|
|
.describedAs("World name");
|
|
|
|
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");
|
|
|
|
acceptsAll(asList("d", "date-format"), "Format of the date to display in the console (for log entries)")
|
|
.withRequiredArg()
|
|
.ofType(SimpleDateFormat.class)
|
|
.describedAs("Log date format");
|
|
|
|
acceptsAll(asList("log-pattern"), "Specfies the log filename pattern")
|
|
.withRequiredArg()
|
|
.ofType(String.class)
|
|
.defaultsTo("server.log")
|
|
.describedAs("Log filename");
|
|
|
|
acceptsAll(asList("log-limit"), "Limits the maximum size of the log file (0 = unlimited)")
|
|
.withRequiredArg()
|
|
.ofType(Integer.class)
|
|
.defaultsTo(0)
|
|
.describedAs("Max log size");
|
|
|
|
acceptsAll(asList("log-count"), "Specified how many log files to cycle through")
|
|
.withRequiredArg()
|
|
.ofType(Integer.class)
|
|
.defaultsTo(1)
|
|
.describedAs("Log count");
|
|
|
|
acceptsAll(asList("log-append"), "Whether to append to the log file")
|
|
.withRequiredArg()
|
|
.ofType(Boolean.class)
|
|
.defaultsTo(true)
|
|
.describedAs("Log append");
|
|
|
|
acceptsAll(asList("log-strip-color"), "Strips color codes from log file");
|
|
|
|
acceptsAll(asList("b", "bukkit-settings"), "File for bukkit settings")
|
|
.withRequiredArg()
|
|
.ofType(File.class)
|
|
.defaultsTo(new File("bukkit.yml"))
|
|
.describedAs("Yml file");
|
|
|
|
acceptsAll(asList("nojline"), "Disables jline and emulates the vanilla console");
|
|
|
|
acceptsAll(asList("noconsole"), "Disables the console");
|
|
|
|
acceptsAll(asList("v", "version"), "Show the CraftBukkit Version");
|
|
|
|
acceptsAll(asList("demo"), "Demo mode");
|
|
}
|
|
};
|
|
|
|
OptionSet options = null;
|
|
|
|
try {
|
|
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 if (options.has("v")) {
|
|
System.out.println(CraftServer.class.getPackage().getImplementationVersion());
|
|
} else {
|
|
try {
|
|
// This trick bypasses Maven Shade's clever rewriting of our getProperty call when using String literals
|
|
String jline_UnsupportedTerminal = new String(new char[] {'j','l','i','n','e','.','U','n','s','u','p','p','o','r','t','e','d','T','e','r','m','i','n','a','l'});
|
|
String jline_terminal = new String(new char[] {'j','l','i','n','e','.','t','e','r','m','i','n','a','l'});
|
|
|
|
useJline = !(jline_UnsupportedTerminal).equals(System.getProperty(jline_terminal));
|
|
|
|
if (options.has("nojline")) {
|
|
System.setProperty("user.language", "en");
|
|
useJline = false;
|
|
}
|
|
|
|
if (!useJline) {
|
|
// This ensures the terminal literal will always match the jline implementation
|
|
System.setProperty(jline.TerminalFactory.JLINE_TERMINAL, jline.UnsupportedTerminal.class.getName());
|
|
}
|
|
|
|
|
|
if (options.has("noconsole")) {
|
|
useConsole = false;
|
|
}
|
|
|
|
MinecraftServer.main(options);
|
|
} catch (Throwable t) {
|
|
t.printStackTrace();
|
|
}
|
|
}
|
|
}
|
|
|
|
private static List<String> asList(String... params) {
|
|
return Arrays.asList(params);
|
|
}
|
|
}
|