From 9d695dd2d4258083168c6faa71ddc447e4259dd3 Mon Sep 17 00:00:00 2001 From: LOOHP Date: Sat, 8 Aug 2020 02:00:24 +0800 Subject: [PATCH] Added a GUI like Minecraft --- pom.xml | 2 +- src/com/loohp/limbo/Console.java | 92 +++++--- .../loohp/limbo/GUI/ConsoleTextOutput.java | 22 ++ src/com/loohp/limbo/GUI/GUI.java | 218 ++++++++++++++++++ src/com/loohp/limbo/GUI/SystemInfo.java | 49 ++++ src/com/loohp/limbo/Limbo.java | 38 ++- 6 files changed, 390 insertions(+), 31 deletions(-) create mode 100644 src/com/loohp/limbo/GUI/ConsoleTextOutput.java create mode 100644 src/com/loohp/limbo/GUI/GUI.java create mode 100644 src/com/loohp/limbo/GUI/SystemInfo.java diff --git a/pom.xml b/pom.xml index f1fe592..3119032 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ 4.0.0 Limbo Limbo - 0.2.0-ALPHA + 0.2.1-ALPHA src diff --git a/src/com/loohp/limbo/Console.java b/src/com/loohp/limbo/Console.java index d5c9851..a5f5e71 100644 --- a/src/com/loohp/limbo/Console.java +++ b/src/com/loohp/limbo/Console.java @@ -1,6 +1,7 @@ package com.loohp.limbo; import java.io.BufferedReader; +import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; @@ -15,6 +16,7 @@ import java.util.Locale; import java.util.stream.Collectors; import com.loohp.limbo.Commands.CommandSender; +import com.loohp.limbo.GUI.ConsoleTextOutput; import com.loohp.limbo.Utils.CustomStringUtils; import net.md_5.bungee.api.chat.BaseComponent; @@ -36,11 +38,21 @@ public class Console implements CommandSender { File logs = new File(dir, fileName); this.logs = new PrintStream(logs); - System.setIn(in); - this.in = in; - System.setOut(new ConsoleOutputStream(out, this.logs)); + System.setIn(in == null ? new ByteArrayInputStream(new byte[0]) : in); + this.in = System.in; + System.setOut(new ConsoleOutputStream(out == null ? new PrintStream(new PrintStream(new OutputStream() { + @Override + public void write(int b) { + //DO NOTHING + } + })) : out, this.logs)); this.out = System.out; - System.setErr(new ConsoleErrorStream(err, this.logs)); + System.setErr(new ConsoleErrorStream(err == null ? new PrintStream(new PrintStream(new OutputStream() { + @Override + public void write(int b) { + //DO NOTHING + } + })) : err, this.logs)); this.err = System.err; } @@ -90,85 +102,97 @@ public class Console implements CommandSender { @Override public PrintStream printf(Locale l, String format, Object... args) { String date = new SimpleDateFormat("HH':'mm':'ss").format(new Date()); - logs.printf(l, "[" + date + " INFO]" + format, args); - return super.printf(l, "[" + date + " INFO]" + format, args); + ConsoleTextOutput.appendText(String.format(l, "[" + date + " Info]" + format, args)); + logs.printf(l, "[" + date + " Info]" + format, args); + return super.printf(l, "[" + date + " Info]" + format, args); } @Override public PrintStream printf(String format, Object... args) { String date = new SimpleDateFormat("HH':'mm':'ss").format(new Date()); - logs.printf("[" + date + " INFO]" + format, args); - return super.printf("[" + date + " INFO]" + format, args); + ConsoleTextOutput.appendText(String.format("[" + date + " Info]" + format, args)); + logs.printf("[" + date + " Info]" + format, args); + return super.printf("[" + date + " Info]" + format, args); } @Override public void println() { String date = new SimpleDateFormat("HH':'mm':'ss").format(new Date()); - logs.println("[" + date + " INFO]"); - super.println("[" + date + " INFO]"); + ConsoleTextOutput.appendText("[" + date + " Info]", true); + logs.println("[" + date + " Info]"); + super.println("[" + date + " Info]"); } @Override public void println(boolean x) { String date = new SimpleDateFormat("HH':'mm':'ss").format(new Date()); - logs.println("[" + date + " INFO]" + x); - super.println("[" + date + " INFO]" + x); + ConsoleTextOutput.appendText("[" + date + " Info] " + x, true); + logs.println("[" + date + " Info]" + x); + super.println("[" + date + " Info]" + x); } @Override public void println(char x) { String date = new SimpleDateFormat("HH':'mm':'ss").format(new Date()); - logs.println("[" + date + " INFO]" + x); - super.println("[" + date + " INFO]" + x); + ConsoleTextOutput.appendText("[" + date + " Info] " + x, true); + logs.println("[" + date + " Info]" + x); + super.println("[" + date + " Info]" + x); } @Override public void println(char[] x) { String date = new SimpleDateFormat("HH':'mm':'ss").format(new Date()); - logs.println("[" + date + " INFO]" + String.valueOf(x)); - super.println("[" + date + " INFO]" + String.valueOf(x)); + ConsoleTextOutput.appendText("[" + date + " Info] " + String.valueOf(x), true); + logs.println("[" + date + " Info]" + String.valueOf(x)); + super.println("[" + date + " Info]" + String.valueOf(x)); } @Override public void println(double x) { String date = new SimpleDateFormat("HH':'mm':'ss").format(new Date()); - logs.println("[" + date + " INFO]" + x); - super.println("[" + date + " INFO]" + x); + ConsoleTextOutput.appendText("[" + date + " Info] " + x, true); + logs.println("[" + date + " Info]" + x); + super.println("[" + date + " Info]" + x); } @Override public void println(float x) { String date = new SimpleDateFormat("HH':'mm':'ss").format(new Date()); - logs.println("[" + date + " INFO]" + x); - super.println("[" + date + " INFO]" + x); + ConsoleTextOutput.appendText("[" + date + " Info] " + x, true); + logs.println("[" + date + " Info]" + x); + super.println("[" + date + " Info]" + x); } @Override public void println(int x) { String date = new SimpleDateFormat("HH':'mm':'ss").format(new Date()); - logs.println("[" + date + " INFO]" + x); - super.println("[" + date + " INFO]" + x); + ConsoleTextOutput.appendText("[" + date + " Info] " + x, true); + logs.println("[" + date + " Info]" + x); + super.println("[" + date + " Info]" + x); } @Override public void println(long x) { String date = new SimpleDateFormat("HH':'mm':'ss").format(new Date()); - logs.println("[" + date + " INFO]" + x); - super.println("[" + date + " INFO]" + x); + ConsoleTextOutput.appendText("[" + date + " Info] " + x, true); + logs.println("[" + date + " Info]" + x); + super.println("[" + date + " Info]" + x); } @Override public void println(Object x) { String date = new SimpleDateFormat("HH':'mm':'ss").format(new Date()); - logs.println("[" + date + " INFO]" + x); - super.println("[" + date + " INFO]" + x); + ConsoleTextOutput.appendText("[" + date + " Info] " + x, true); + logs.println("[" + date + " Info]" + x); + super.println("[" + date + " Info]" + x); } @Override public void println(String string) { String date = new SimpleDateFormat("HH':'mm':'ss").format(new Date()); - logs.println("[" + date + " INFO] " + string); - super.println("[" + date + " INFO] " + string); + ConsoleTextOutput.appendText("[" + date + " Info] " + string, true); + logs.println("[" + date + " Info] " + string); + super.println("[" + date + " Info] " + string); } } @@ -184,6 +208,7 @@ public class Console implements CommandSender { @Override public PrintStream printf(Locale l, String format, Object... args) { String date = new SimpleDateFormat("HH':'mm':'ss").format(new Date()); + ConsoleTextOutput.appendText(String.format(l, "[" + date + " Error]" + format, args)); logs.printf(l, "[" + date + " Error]" + format, args); return super.printf(l, "[" + date + " Error]" + format, args); } @@ -191,6 +216,7 @@ public class Console implements CommandSender { @Override public PrintStream printf(String format, Object... args) { String date = new SimpleDateFormat("HH':'mm':'ss").format(new Date()); + ConsoleTextOutput.appendText(String.format("[" + date + " Error]" + format, args)); logs.printf("[" + date + " Error]" + format, args); return super.printf("[" + date + " Error]" + format, args); } @@ -198,6 +224,7 @@ public class Console implements CommandSender { @Override public void println() { String date = new SimpleDateFormat("HH':'mm':'ss").format(new Date()); + ConsoleTextOutput.appendText("[" + date + " Error]", true); logs.println("[" + date + " Error]"); super.println("[" + date + " Error]"); } @@ -205,6 +232,7 @@ public class Console implements CommandSender { @Override public void println(boolean x) { String date = new SimpleDateFormat("HH':'mm':'ss").format(new Date()); + ConsoleTextOutput.appendText("[" + date + " Error] " + x, true); logs.println("[" + date + " Error]" + x); super.println("[" + date + " Error]" + x); } @@ -212,6 +240,7 @@ public class Console implements CommandSender { @Override public void println(char x) { String date = new SimpleDateFormat("HH':'mm':'ss").format(new Date()); + ConsoleTextOutput.appendText("[" + date + " Error] " + x, true); logs.println("[" + date + " Error]" + x); super.println("[" + date + " Error]" + x); } @@ -219,6 +248,7 @@ public class Console implements CommandSender { @Override public void println(char[] x) { String date = new SimpleDateFormat("HH':'mm':'ss").format(new Date()); + ConsoleTextOutput.appendText("[" + date + " Error] " + String.valueOf(x), true); logs.println("[" + date + " Error]" + String.valueOf(x)); super.println("[" + date + " Error]" + String.valueOf(x)); } @@ -226,6 +256,7 @@ public class Console implements CommandSender { @Override public void println(double x) { String date = new SimpleDateFormat("HH':'mm':'ss").format(new Date()); + ConsoleTextOutput.appendText("[" + date + " Error] " + x, true); logs.println("[" + date + " Error]" + x); super.println("[" + date + " Error]" + x); } @@ -233,6 +264,7 @@ public class Console implements CommandSender { @Override public void println(float x) { String date = new SimpleDateFormat("HH':'mm':'ss").format(new Date()); + ConsoleTextOutput.appendText("[" + date + " Error] " + x, true); logs.println("[" + date + " Error]" + x); super.println("[" + date + " Error]" + x); } @@ -240,6 +272,7 @@ public class Console implements CommandSender { @Override public void println(int x) { String date = new SimpleDateFormat("HH':'mm':'ss").format(new Date()); + ConsoleTextOutput.appendText("[" + date + " Error] " + x, true); logs.println("[" + date + " Error]" + x); super.println("[" + date + " Error]" + x); } @@ -247,6 +280,7 @@ public class Console implements CommandSender { @Override public void println(long x) { String date = new SimpleDateFormat("HH':'mm':'ss").format(new Date()); + ConsoleTextOutput.appendText("[" + date + " Error] " + x, true); logs.println("[" + date + " Error]" + x); super.println("[" + date + " Error]" + x); } @@ -254,6 +288,7 @@ public class Console implements CommandSender { @Override public void println(Object x) { String date = new SimpleDateFormat("HH':'mm':'ss").format(new Date()); + ConsoleTextOutput.appendText("[" + date + " Error] " + x, true); logs.println("[" + date + " Error]" + x); super.println("[" + date + " Error]" + x); } @@ -261,6 +296,7 @@ public class Console implements CommandSender { @Override public void println(String string) { String date = new SimpleDateFormat("HH':'mm':'ss").format(new Date()); + ConsoleTextOutput.appendText("[" + date + " Error] " + string, true); logs.println("[" + date + " Error] " + string); super.println("[" + date + " Error] " + string); } diff --git a/src/com/loohp/limbo/GUI/ConsoleTextOutput.java b/src/com/loohp/limbo/GUI/ConsoleTextOutput.java new file mode 100644 index 0000000..4124743 --- /dev/null +++ b/src/com/loohp/limbo/GUI/ConsoleTextOutput.java @@ -0,0 +1,22 @@ +package com.loohp.limbo.GUI; + +import com.loohp.limbo.Limbo; + +public class ConsoleTextOutput { + + public static void appendText(String string) { + if (!Limbo.noGui) { + GUI.textOutput.setText(GUI.textOutput.getText() + string); + GUI.scrollPane.getVerticalScrollBar().setValue(GUI.scrollPane.getVerticalScrollBar().getMaximum()); + } + } + + public static void appendText(String string, boolean isWriteLine) { + if (isWriteLine) { + appendText(string + "\n"); + } else { + appendText(string); + } + } + +} diff --git a/src/com/loohp/limbo/GUI/GUI.java b/src/com/loohp/limbo/GUI/GUI.java new file mode 100644 index 0000000..aac77aa --- /dev/null +++ b/src/com/loohp/limbo/GUI/GUI.java @@ -0,0 +1,218 @@ +package com.loohp.limbo.GUI; + +import java.awt.Font; +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.Insets; +import java.awt.event.KeyAdapter; +import java.awt.event.KeyEvent; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; +import java.util.ArrayList; +import java.util.List; + +import javax.swing.JButton; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JScrollPane; +import javax.swing.JTextField; +import javax.swing.JTextPane; +import javax.swing.border.EmptyBorder; + +import com.loohp.limbo.Limbo; + +@SuppressWarnings("serial") +public class GUI extends JFrame { + + public static JPanel contentPane; + public static JTextField commandInput; + public static JButton execCommand; + public static JTextPane textOutput; + public static JScrollPane scrollPane; + public static JLabel consoleLabel; + public static JLabel clientLabel; + public static JTextPane clientText; + public static JScrollPane scrollPane_client; + public static JLabel sysLabel; + public static JScrollPane scrollPane_sys; + public static JTextPane sysText; + + public static List history = new ArrayList(); + public static int currenthistory = 0; + + public static boolean loadFinish = false; + + /** + * Launch the application. + */ + public static void main() { + GUI frame = new GUI(); + frame.setVisible(true); + + Thread t1 = new Thread(new Runnable() { + @Override + public void run() { + SystemInfo.printInfo(); + } + }); + t1.start(); + + loadFinish = true; + } + + /** + * Create the frame. + */ + public GUI() { + setTitle("Limbo Minecraft Server"); + addWindowListener(new WindowAdapter() { + @Override + public void windowClosing(WindowEvent e) { + Limbo.getInstance().stopServer(); + } + }); + setBounds(100, 100, 1198, 686); + contentPane = new JPanel(); + contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); + setContentPane(contentPane); + GridBagLayout gbl_contentPane = new GridBagLayout(); + gbl_contentPane.columnWidths = new int[]{243, 10, 36, 111, 0}; + gbl_contentPane.rowHeights = new int[]{0, 160, 0, 10, 33, 33, 0}; + gbl_contentPane.columnWeights = new double[]{0.0, 0.0, 1.0, 0.0, Double.MIN_VALUE}; + gbl_contentPane.rowWeights = new double[]{0.0, 0.0, 0.0, 0.0, 1.0, 0.0, Double.MIN_VALUE}; + contentPane.setLayout(gbl_contentPane); + + sysLabel = new JLabel("System Information"); + sysLabel.setFont(new Font("Arial", Font.BOLD, 11)); + GridBagConstraints gbc_sysLabel = new GridBagConstraints(); + gbc_sysLabel.fill = GridBagConstraints.BOTH; + gbc_sysLabel.insets = new Insets(0, 0, 5, 5); + gbc_sysLabel.gridx = 0; + gbc_sysLabel.gridy = 0; + contentPane.add(sysLabel, gbc_sysLabel); + + consoleLabel = new JLabel("Console Output"); + consoleLabel.setFont(new Font("Arial", Font.BOLD, 11)); + GridBagConstraints gbc_consoleLabel = new GridBagConstraints(); + gbc_consoleLabel.anchor = GridBagConstraints.WEST; + gbc_consoleLabel.insets = new Insets(0, 0, 5, 5); + gbc_consoleLabel.gridx = 2; + gbc_consoleLabel.gridy = 0; + contentPane.add(consoleLabel, gbc_consoleLabel); + + commandInput = new JTextField(); + commandInput.setToolTipText("Input a command"); + commandInput.addKeyListener(new KeyAdapter() { + @Override + public void keyPressed(KeyEvent e) { + if (e.getKeyCode() == 10) { + String cmd = commandInput.getText(); + if (!commandInput.getText().equals("")) { + history.add(cmd); + currenthistory = history.size(); + } + Limbo.getInstance().dispatchCommand(Limbo.getInstance().getConsole(), cmd.trim().replaceAll(" +", " ")); + commandInput.setText(""); + } else if (e.getKeyCode() == 38) { + currenthistory--; + if (currenthistory >= 0) { + commandInput.setText(history.get(currenthistory)); + } else { + currenthistory++; + } + } else if (e.getKeyCode() == 40) { + currenthistory++; + if (currenthistory < history.size()) { + commandInput.setText(history.get(currenthistory)); + } else { + currenthistory--; + } + } + } + }); + + scrollPane_sys = new JScrollPane(); + GridBagConstraints gbc_scrollPane_sys = new GridBagConstraints(); + gbc_scrollPane_sys.insets = new Insets(0, 0, 5, 5); + gbc_scrollPane_sys.fill = GridBagConstraints.BOTH; + gbc_scrollPane_sys.gridx = 0; + gbc_scrollPane_sys.gridy = 1; + contentPane.add(scrollPane_sys, gbc_scrollPane_sys); + + sysText = new JTextPane(); + sysText.setFont(new Font("Consolas", Font.PLAIN, 12)); + sysText.setEditable(false); + scrollPane_sys.setViewportView(sysText); + + clientLabel = new JLabel("Connected Clients"); + clientLabel.setFont(new Font("Arial", Font.BOLD, 11)); + GridBagConstraints gbc_clientLabel = new GridBagConstraints(); + gbc_clientLabel.anchor = GridBagConstraints.WEST; + gbc_clientLabel.insets = new Insets(0, 0, 5, 5); + gbc_clientLabel.gridx = 0; + gbc_clientLabel.gridy = 3; + contentPane.add(clientLabel, gbc_clientLabel); + + scrollPane_client = new JScrollPane(); + GridBagConstraints gbc_scrollPane_client = new GridBagConstraints(); + gbc_scrollPane_client.fill = GridBagConstraints.BOTH; + gbc_scrollPane_client.gridheight = 2; + gbc_scrollPane_client.insets = new Insets(0, 0, 0, 5); + gbc_scrollPane_client.gridx = 0; + gbc_scrollPane_client.gridy = 4; + contentPane.add(scrollPane_client, gbc_scrollPane_client); + + clientText = new JTextPane(); + scrollPane_client.setViewportView(clientText); + clientText.setFont(new Font("Consolas", Font.PLAIN, 12)); + clientText.setEditable(false); + + scrollPane = new JScrollPane(); + GridBagConstraints gbc_scrollPane = new GridBagConstraints(); + gbc_scrollPane.gridheight = 4; + gbc_scrollPane.insets = new Insets(0, 0, 5, 0); + gbc_scrollPane.gridwidth = 2; + gbc_scrollPane.fill = GridBagConstraints.BOTH; + gbc_scrollPane.gridx = 2; + gbc_scrollPane.gridy = 1; + contentPane.add(scrollPane, gbc_scrollPane); + + textOutput = new JTextPane(); + scrollPane.setViewportView(textOutput); + textOutput.setFont(new Font("Consolas", Font.PLAIN, 12)); + textOutput.setEditable(false); + commandInput.setFont(new Font("Tahoma", Font.PLAIN, 19)); + GridBagConstraints gbc_commandInput = new GridBagConstraints(); + gbc_commandInput.insets = new Insets(0, 0, 0, 5); + gbc_commandInput.fill = GridBagConstraints.BOTH; + gbc_commandInput.gridx = 2; + gbc_commandInput.gridy = 5; + contentPane.add(commandInput, gbc_commandInput); + commandInput.setColumns(10); + + execCommand = new JButton("RUN"); + execCommand.setToolTipText("Execute a command"); + execCommand.addMouseListener(new MouseAdapter() { + @Override + public void mouseReleased(MouseEvent e) { + String cmd = commandInput.getText(); + if (!commandInput.getText().equals("")) { + history.add(cmd); + currenthistory = history.size(); + } + Limbo.getInstance().dispatchCommand(Limbo.getInstance().getConsole(), cmd.trim().replaceAll(" +", " ")); + commandInput.setText(""); + } + }); + execCommand.setFont(new Font("Tahoma", Font.PLAIN, 19)); + GridBagConstraints gbc_execCommand = new GridBagConstraints(); + gbc_execCommand.fill = GridBagConstraints.BOTH; + gbc_execCommand.gridx = 3; + gbc_execCommand.gridy = 5; + contentPane.add(execCommand, gbc_execCommand); + } + +} diff --git a/src/com/loohp/limbo/GUI/SystemInfo.java b/src/com/loohp/limbo/GUI/SystemInfo.java new file mode 100644 index 0000000..4eb0720 --- /dev/null +++ b/src/com/loohp/limbo/GUI/SystemInfo.java @@ -0,0 +1,49 @@ +package com.loohp.limbo.GUI; + +import java.lang.management.ManagementFactory; +import java.text.NumberFormat; +import java.util.concurrent.TimeUnit; + +import com.loohp.limbo.Limbo; + +public class SystemInfo { + + public static void printInfo() { + if (!Limbo.noGui) { + while (true) { + Runtime runtime = Runtime.getRuntime(); + + NumberFormat format = NumberFormat.getInstance(); + + StringBuilder sb = new StringBuilder(); + long maxMemory = runtime.maxMemory(); + long allocatedMemory = runtime.totalMemory(); + long freeMemory = runtime.freeMemory(); + + sb.append("Free Memory: " + format.format(freeMemory / 1024 / 1024) + " MB\n"); + sb.append("Allocated Memory: " + format.format(allocatedMemory / 1024 / 1024) + " MB\n"); + sb.append("Max Memory: " + format.format(maxMemory / 1024 / 1024) + " MB\n"); + sb.append("Memory Usage: " + format.format((allocatedMemory - freeMemory) / 1024 / 1024) + "/" + format.format(maxMemory / 1024 / 1024) + " MB (" + Math.round((double) (allocatedMemory - freeMemory) / (double) (maxMemory) * 100) + "%)\n"); + sb.append("\n"); + + try { + @SuppressWarnings("restriction") + com.sun.management.OperatingSystemMXBean operatingSystemMXBean = (com.sun.management.OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean(); + @SuppressWarnings("restriction") + double processLoad = operatingSystemMXBean.getProcessCpuLoad(); + @SuppressWarnings("restriction") + double systemLoad = operatingSystemMXBean.getSystemCpuLoad(); + int processors = runtime.availableProcessors(); + + sb.append("Available Processors: " + processors + "\n"); + sb.append("Process CPU Load: " + Math.round(processLoad * 100) + "%\n"); + sb.append("System CPU Load: " + Math.round(systemLoad * 100) + "%\n"); + GUI.sysText.setText(sb.toString()); + } catch (Exception ignore) {} + + try {TimeUnit.MILLISECONDS.sleep(1000);} catch (InterruptedException e) {} + } + } + } + +} diff --git a/src/com/loohp/limbo/Limbo.java b/src/com/loohp/limbo/Limbo.java index 8d899ca..1623e5a 100644 --- a/src/com/loohp/limbo/Limbo.java +++ b/src/com/loohp/limbo/Limbo.java @@ -1,5 +1,6 @@ package com.loohp.limbo; +import java.awt.GraphicsEnvironment; import java.io.File; import java.io.FileOutputStream; import java.io.FileReader; @@ -26,6 +27,7 @@ import org.json.simple.parser.ParseException; import com.loohp.limbo.Commands.CommandSender; import com.loohp.limbo.Events.EventsManager; import com.loohp.limbo.File.ServerProperties; +import com.loohp.limbo.GUI.GUI; import com.loohp.limbo.Location.Location; import com.loohp.limbo.Permissions.PermissionsManager; import com.loohp.limbo.Player.Player; @@ -47,8 +49,34 @@ import net.querz.nbt.tag.CompoundTag; public class Limbo { private static Limbo instance; + public static boolean noGui = false; - public static void main(String args[]) throws IOException, ParseException, NumberFormatException, ClassNotFoundException { + public static void main(String args[]) throws IOException, ParseException, NumberFormatException, ClassNotFoundException, InterruptedException { + for (String flag : args) { + if (flag.equals("--nogui")) { + noGui = true; + } else { + System.out.println("Accepted flags:"); + System.out.println(" --nogui "); + System.out.println(); + System.out.println("Press [enter] to quit"); + System.exit(0); + } + } + if (GraphicsEnvironment.isHeadless()) { + noGui = true; + } + if (!noGui) { + System.out.println("Launching Server GUI.. Add \"--nogui\" in launch arguments to disable"); + Thread t1 = new Thread(new Runnable() { + @Override + public void run() { + GUI.main(); + } + }); + t1.start(); + } + new Limbo(); } @@ -75,9 +103,15 @@ public class Limbo { public AtomicInteger entityIdCount = new AtomicInteger(); @SuppressWarnings("unchecked") - public Limbo() throws IOException, ParseException, NumberFormatException, ClassNotFoundException { + public Limbo() throws IOException, ParseException, NumberFormatException, ClassNotFoundException, InterruptedException { instance = this; + if (!noGui) { + while (!GUI.loadFinish) { + TimeUnit.MILLISECONDS.sleep(500); + } + } + console = new Console(System.in, System.out, System.err); String spName = "server.properties";