Spaces:
Build error
Build error
File size: 6,613 Bytes
d46f4a3 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 |
package net.minecraft.server.gui;
import com.google.common.collect.Lists;
import com.mojang.logging.LogQueues;
import com.mojang.logging.LogUtils;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Collection;
import java.util.concurrent.atomic.AtomicBoolean;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JScrollBar;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.border.EtchedBorder;
import javax.swing.border.TitledBorder;
import javax.swing.text.BadLocationException;
import javax.swing.text.Document;
import net.minecraft.DefaultUncaughtExceptionHandler;
import net.minecraft.server.dedicated.DedicatedServer;
import org.slf4j.Logger;
public class MinecraftServerGui extends JComponent {
private static final Font MONOSPACED = new Font("Monospaced", 0, 12);
private static final Logger LOGGER = LogUtils.getLogger();
private static final String TITLE = "Minecraft server";
private static final String SHUTDOWN_TITLE = "Minecraft server - shutting down!";
private final DedicatedServer server;
private Thread logAppenderThread;
private final Collection<Runnable> finalizers = Lists.newArrayList();
final AtomicBoolean isClosing = new AtomicBoolean();
public static MinecraftServerGui showFrameFor(final DedicatedServer p_139922_) {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (Exception exception) {
}
final JFrame jframe = new JFrame("Minecraft server");
final MinecraftServerGui minecraftservergui = new MinecraftServerGui(p_139922_);
jframe.setDefaultCloseOperation(2);
jframe.add(minecraftservergui);
jframe.pack();
jframe.setLocationRelativeTo(null);
jframe.setVisible(true);
jframe.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent p_139944_) {
if (!minecraftservergui.isClosing.getAndSet(true)) {
jframe.setTitle("Minecraft server - shutting down!");
p_139922_.halt(true);
minecraftservergui.runFinalizers();
}
}
});
minecraftservergui.addFinalizer(jframe::dispose);
minecraftservergui.start();
return minecraftservergui;
}
private MinecraftServerGui(DedicatedServer p_139907_) {
this.server = p_139907_;
this.setPreferredSize(new Dimension(854, 480));
this.setLayout(new BorderLayout());
try {
this.add(this.buildChatPanel(), "Center");
this.add(this.buildInfoPanel(), "West");
} catch (Exception exception) {
LOGGER.error("Couldn't build server GUI", (Throwable)exception);
}
}
public void addFinalizer(Runnable p_139910_) {
this.finalizers.add(p_139910_);
}
private JComponent buildInfoPanel() {
JPanel jpanel = new JPanel(new BorderLayout());
StatsComponent statscomponent = new StatsComponent(this.server);
this.finalizers.add(statscomponent::close);
jpanel.add(statscomponent, "North");
jpanel.add(this.buildPlayerPanel(), "Center");
jpanel.setBorder(new TitledBorder(new EtchedBorder(), "Stats"));
return jpanel;
}
private JComponent buildPlayerPanel() {
JList<?> jlist = new PlayerListComponent(this.server);
JScrollPane jscrollpane = new JScrollPane(jlist, 22, 30);
jscrollpane.setBorder(new TitledBorder(new EtchedBorder(), "Players"));
return jscrollpane;
}
private JComponent buildChatPanel() {
JPanel jpanel = new JPanel(new BorderLayout());
JTextArea jtextarea = new JTextArea();
JScrollPane jscrollpane = new JScrollPane(jtextarea, 22, 30);
jtextarea.setEditable(false);
jtextarea.setFont(MONOSPACED);
JTextField jtextfield = new JTextField();
jtextfield.addActionListener(p_358664_ -> {
String s = jtextfield.getText().trim();
if (!s.isEmpty()) {
this.server.handleConsoleInput(s, this.server.createCommandSourceStack());
}
jtextfield.setText("");
});
jtextarea.addFocusListener(new FocusAdapter() {
@Override
public void focusGained(FocusEvent p_139949_) {
}
});
jpanel.add(jscrollpane, "Center");
jpanel.add(jtextfield, "South");
jpanel.setBorder(new TitledBorder(new EtchedBorder(), "Log and chat"));
this.logAppenderThread = new Thread(() -> {
String s;
while ((s = LogQueues.getNextLogEvent("ServerGuiConsole")) != null) {
this.print(jtextarea, jscrollpane, s);
}
});
this.logAppenderThread.setUncaughtExceptionHandler(new DefaultUncaughtExceptionHandler(LOGGER));
this.logAppenderThread.setDaemon(true);
return jpanel;
}
public void start() {
this.logAppenderThread.start();
}
public void close() {
if (!this.isClosing.getAndSet(true)) {
this.runFinalizers();
}
}
void runFinalizers() {
this.finalizers.forEach(Runnable::run);
}
public void print(JTextArea p_139915_, JScrollPane p_139916_, String p_139917_) {
if (!SwingUtilities.isEventDispatchThread()) {
SwingUtilities.invokeLater(() -> this.print(p_139915_, p_139916_, p_139917_));
} else {
Document document = p_139915_.getDocument();
JScrollBar jscrollbar = p_139916_.getVerticalScrollBar();
boolean flag = false;
if (p_139916_.getViewport().getView() == p_139915_) {
flag = (double)jscrollbar.getValue() + jscrollbar.getSize().getHeight() + (double)(MONOSPACED.getSize() * 4) > (double)jscrollbar.getMaximum();
}
try {
document.insertString(document.getLength(), p_139917_, null);
} catch (BadLocationException badlocationexception) {
}
if (flag) {
jscrollbar.setValue(Integer.MAX_VALUE);
}
}
}
} |