base mod created
This commit is contained in:
@@ -0,0 +1,217 @@
|
||||
package net.minecraft.server.gui;
|
||||
|
||||
import com.mojang.util.QueueLogAppender;
|
||||
import java.awt.BorderLayout;
|
||||
import java.awt.Component;
|
||||
import java.awt.Dimension;
|
||||
import java.awt.Font;
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
import java.awt.event.FocusAdapter;
|
||||
import java.awt.event.FocusEvent;
|
||||
import java.awt.event.WindowAdapter;
|
||||
import java.awt.event.WindowEvent;
|
||||
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.AttributeSet;
|
||||
import javax.swing.text.BadLocationException;
|
||||
import javax.swing.text.Document;
|
||||
import net.minecraft.server.dedicated.DedicatedServer;
|
||||
import net.minecraftforge.fml.relauncher.Side;
|
||||
import net.minecraftforge.fml.relauncher.SideOnly;
|
||||
import org.apache.logging.log4j.LogManager;
|
||||
import org.apache.logging.log4j.Logger;
|
||||
|
||||
@SideOnly(Side.SERVER)
|
||||
public class MinecraftServerGui extends JComponent
|
||||
{
|
||||
private static final Font SERVER_GUI_FONT = new Font("Monospaced", 0, 12);
|
||||
private static final Logger LOGGER = LogManager.getLogger();
|
||||
private final DedicatedServer server;
|
||||
|
||||
/**
|
||||
* Creates the server GUI and sets it visible for the user.
|
||||
*/
|
||||
public static void createServerGui(final DedicatedServer serverIn)
|
||||
{
|
||||
try
|
||||
{
|
||||
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
|
||||
}
|
||||
catch (Exception var3)
|
||||
{
|
||||
;
|
||||
}
|
||||
|
||||
MinecraftServerGui minecraftservergui = new MinecraftServerGui(serverIn);
|
||||
JFrame jframe = new JFrame("Minecraft server");
|
||||
jframe.add(minecraftservergui);
|
||||
jframe.pack();
|
||||
jframe.setLocationRelativeTo((Component)null);
|
||||
jframe.setVisible(true);
|
||||
jframe.addWindowListener(new WindowAdapter()
|
||||
{
|
||||
public void windowClosing(WindowEvent p_windowClosing_1_)
|
||||
{
|
||||
serverIn.initiateShutdown();
|
||||
|
||||
while (!serverIn.isServerStopped())
|
||||
{
|
||||
try
|
||||
{
|
||||
Thread.sleep(100L);
|
||||
}
|
||||
catch (InterruptedException interruptedexception)
|
||||
{
|
||||
interruptedexception.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
System.exit(0);
|
||||
}
|
||||
});
|
||||
minecraftservergui.latch.countDown();
|
||||
}
|
||||
|
||||
public MinecraftServerGui(DedicatedServer serverIn)
|
||||
{
|
||||
this.server = serverIn;
|
||||
this.setPreferredSize(new Dimension(854, 480));
|
||||
this.setLayout(new BorderLayout());
|
||||
|
||||
try
|
||||
{
|
||||
this.add(this.getLogComponent(), "Center");
|
||||
this.add(this.getStatsComponent(), "West");
|
||||
}
|
||||
catch (Exception exception)
|
||||
{
|
||||
LOGGER.error("Couldn't build server GUI", (Throwable)exception);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Generates new StatsComponent and returns it.
|
||||
*/
|
||||
private JComponent getStatsComponent() throws Exception
|
||||
{
|
||||
JPanel jpanel = new JPanel(new BorderLayout());
|
||||
jpanel.add(new StatsComponent(this.server), "North");
|
||||
jpanel.add(this.getPlayerListComponent(), "Center");
|
||||
jpanel.setBorder(new TitledBorder(new EtchedBorder(), "Stats"));
|
||||
return jpanel;
|
||||
}
|
||||
|
||||
/**
|
||||
* Generates new PlayerListComponent and returns it.
|
||||
*/
|
||||
private JComponent getPlayerListComponent() throws Exception
|
||||
{
|
||||
JList jlist = new PlayerListComponent(this.server);
|
||||
JScrollPane jscrollpane = new JScrollPane(jlist, 22, 30);
|
||||
jscrollpane.setBorder(new TitledBorder(new EtchedBorder(), "Players"));
|
||||
return jscrollpane;
|
||||
}
|
||||
|
||||
private JComponent getLogComponent() throws Exception
|
||||
{
|
||||
JPanel jpanel = new JPanel(new BorderLayout());
|
||||
final JTextArea jtextarea = new JTextArea();
|
||||
final JScrollPane jscrollpane = new JScrollPane(jtextarea, 22, 30);
|
||||
jtextarea.setEditable(false);
|
||||
jtextarea.setFont(SERVER_GUI_FONT);
|
||||
final JTextField jtextfield = new JTextField();
|
||||
jtextfield.addActionListener(new ActionListener()
|
||||
{
|
||||
public void actionPerformed(ActionEvent p_actionPerformed_1_)
|
||||
{
|
||||
String s = jtextfield.getText().trim();
|
||||
|
||||
if (!s.isEmpty())
|
||||
{
|
||||
MinecraftServerGui.this.server.addPendingCommand(s, MinecraftServerGui.this.server);
|
||||
}
|
||||
|
||||
jtextfield.setText("");
|
||||
}
|
||||
});
|
||||
jtextarea.addFocusListener(new FocusAdapter()
|
||||
{
|
||||
public void focusGained(FocusEvent p_focusGained_1_)
|
||||
{
|
||||
}
|
||||
});
|
||||
jpanel.add(jscrollpane, "Center");
|
||||
jpanel.add(jtextfield, "South");
|
||||
jpanel.setBorder(new TitledBorder(new EtchedBorder(), "Log and chat"));
|
||||
Thread thread = new Thread(new Runnable()
|
||||
{
|
||||
public void run()
|
||||
{
|
||||
String s;
|
||||
|
||||
while ((s = QueueLogAppender.getNextLogEvent("ServerGuiConsole")) != null)
|
||||
{
|
||||
MinecraftServerGui.this.appendLine(jtextarea, jscrollpane, s);
|
||||
}
|
||||
}
|
||||
});
|
||||
thread.setDaemon(true);
|
||||
thread.start();
|
||||
return jpanel;
|
||||
}
|
||||
|
||||
private java.util.concurrent.CountDownLatch latch = new java.util.concurrent.CountDownLatch(1);
|
||||
public void appendLine(final JTextArea textArea, final JScrollPane scrollPane, final String line)
|
||||
{
|
||||
try
|
||||
{
|
||||
latch.await();
|
||||
} catch (InterruptedException e){} //Prevent logging until after constructor has ended.
|
||||
if (!SwingUtilities.isEventDispatchThread())
|
||||
{
|
||||
SwingUtilities.invokeLater(new Runnable()
|
||||
{
|
||||
public void run()
|
||||
{
|
||||
MinecraftServerGui.this.appendLine(textArea, scrollPane, line);
|
||||
}
|
||||
});
|
||||
}
|
||||
else
|
||||
{
|
||||
Document document = textArea.getDocument();
|
||||
JScrollBar jscrollbar = scrollPane.getVerticalScrollBar();
|
||||
boolean flag = false;
|
||||
|
||||
if (scrollPane.getViewport().getView() == textArea)
|
||||
{
|
||||
flag = (double)jscrollbar.getValue() + jscrollbar.getSize().getHeight() + (double)(SERVER_GUI_FONT.getSize() * 4) > (double)jscrollbar.getMaximum();
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
document.insertString(document.getLength(), line, (AttributeSet)null);
|
||||
}
|
||||
catch (BadLocationException var8)
|
||||
{
|
||||
;
|
||||
}
|
||||
|
||||
if (flag)
|
||||
{
|
||||
jscrollbar.setValue(Integer.MAX_VALUE);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
package net.minecraft.server.gui;
|
||||
|
||||
import java.util.Vector;
|
||||
import javax.swing.JList;
|
||||
import net.minecraft.entity.player.EntityPlayerMP;
|
||||
import net.minecraft.server.MinecraftServer;
|
||||
import net.minecraft.util.ITickable;
|
||||
import net.minecraftforge.fml.relauncher.Side;
|
||||
import net.minecraftforge.fml.relauncher.SideOnly;
|
||||
|
||||
@SideOnly(Side.SERVER)
|
||||
public class PlayerListComponent extends JList implements ITickable
|
||||
{
|
||||
private final MinecraftServer server;
|
||||
private int ticks;
|
||||
|
||||
public PlayerListComponent(MinecraftServer server)
|
||||
{
|
||||
this.server = server;
|
||||
server.registerTickable(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Like the old updateEntity(), except more generic.
|
||||
*/
|
||||
public void update()
|
||||
{
|
||||
if (this.ticks++ % 20 == 0)
|
||||
{
|
||||
Vector<String> vector = new Vector<String>();
|
||||
|
||||
for (int i = 0; i < this.server.getPlayerList().getPlayers().size(); ++i)
|
||||
{
|
||||
vector.add(((EntityPlayerMP)this.server.getPlayerList().getPlayers().get(i)).getName());
|
||||
}
|
||||
|
||||
this.setListData(vector);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,86 @@
|
||||
package net.minecraft.server.gui;
|
||||
|
||||
import java.awt.Color;
|
||||
import java.awt.Dimension;
|
||||
import java.awt.Graphics;
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
import java.text.DecimalFormat;
|
||||
import javax.swing.JComponent;
|
||||
import javax.swing.Timer;
|
||||
import net.minecraft.server.MinecraftServer;
|
||||
import net.minecraftforge.fml.relauncher.Side;
|
||||
import net.minecraftforge.fml.relauncher.SideOnly;
|
||||
|
||||
@SideOnly(Side.SERVER)
|
||||
public class StatsComponent extends JComponent
|
||||
{
|
||||
private static final DecimalFormat FORMATTER = new DecimalFormat("########0.000");
|
||||
private final int[] values = new int[256];
|
||||
private int vp;
|
||||
private final String[] msgs = new String[11];
|
||||
private final MinecraftServer server;
|
||||
|
||||
public StatsComponent(MinecraftServer serverIn)
|
||||
{
|
||||
this.server = serverIn;
|
||||
this.setPreferredSize(new Dimension(456, 246));
|
||||
this.setMinimumSize(new Dimension(456, 246));
|
||||
this.setMaximumSize(new Dimension(456, 246));
|
||||
(new Timer(500, new ActionListener()
|
||||
{
|
||||
public void actionPerformed(ActionEvent p_actionPerformed_1_)
|
||||
{
|
||||
StatsComponent.this.tick();
|
||||
}
|
||||
})).start();
|
||||
this.setBackground(Color.BLACK);
|
||||
}
|
||||
|
||||
private void tick()
|
||||
{
|
||||
long i = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
|
||||
System.gc();
|
||||
this.msgs[0] = "Memory use: " + i / 1024L / 1024L + " mb (" + Runtime.getRuntime().freeMemory() * 100L / Runtime.getRuntime().maxMemory() + "% free)";
|
||||
this.msgs[1] = "Avg tick: " + FORMATTER.format(this.mean(this.server.tickTimeArray) * 1.0E-6D) + " ms";
|
||||
this.values[this.vp++ & 255] = (int)(i * 100L / Runtime.getRuntime().maxMemory());
|
||||
this.repaint();
|
||||
}
|
||||
|
||||
private double mean(long[] values)
|
||||
{
|
||||
long i = 0L;
|
||||
|
||||
for (long j : values)
|
||||
{
|
||||
i += j;
|
||||
}
|
||||
|
||||
return (double)i / (double)values.length;
|
||||
}
|
||||
|
||||
public void paint(Graphics p_paint_1_)
|
||||
{
|
||||
p_paint_1_.setColor(new Color(16777215));
|
||||
p_paint_1_.fillRect(0, 0, 456, 246);
|
||||
|
||||
for (int i = 0; i < 256; ++i)
|
||||
{
|
||||
int j = this.values[i + this.vp & 255];
|
||||
p_paint_1_.setColor(new Color(j + 28 << 16));
|
||||
p_paint_1_.fillRect(i, 100 - j, 1, j);
|
||||
}
|
||||
|
||||
p_paint_1_.setColor(Color.BLACK);
|
||||
|
||||
for (int k = 0; k < this.msgs.length; ++k)
|
||||
{
|
||||
String s = this.msgs[k];
|
||||
|
||||
if (s != null)
|
||||
{
|
||||
p_paint_1_.drawString(s, 32, 116 + k * 16);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
// Auto generated package-info by MCP
|
||||
@ParametersAreNonnullByDefault
|
||||
@MethodsReturnNonnullByDefault
|
||||
package net.minecraft.server.gui;
|
||||
|
||||
import mcp.MethodsReturnNonnullByDefault;
|
||||
import javax.annotation.ParametersAreNonnullByDefault;
|
||||
Reference in New Issue
Block a user