package net.minecraft.client.gui;
import com.google.common.base.Splitter;
import com.google.common.collect.Lists;
import cpw.mods.fml.client.FMLClientHandler;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import java.util.List;
import net.minecraft.client.multiplayer.GuiConnecting;
import net.minecraft.client.multiplayer.ServerData;
import net.minecraft.client.multiplayer.ServerList;
import net.minecraft.client.network.LanServerDetector;
import net.minecraft.client.network.OldServerPinger;
import net.minecraft.client.resources.I18n;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.lwjgl.input.Keyboard;
@SideOnly(Side.CLIENT)
public class GuiMultiplayer extends GuiScreen implements GuiYesNoCallback
{
private static final Logger logger = LogManager.getLogger();
private final OldServerPinger oldServerPinger = new OldServerPinger();
private GuiScreen parentScreen;
private ServerSelectionList serverListSelector;
private ServerList savedServerList;
private GuiButton btnEditServer;
private GuiButton btnSelectServer;
private GuiButton btnDeleteServer;
private boolean deletingServer;
private boolean addingServer;
private boolean editingServer;
private boolean directConnect;
private String field_146812_y;
private ServerData selectedServer;
private LanServerDetector.LanServerList lanServerList;
private LanServerDetector.ThreadLanServerFind lanServerDetector;
private boolean initialized;
private static final String __OBFID = "CL_00000814";
public GuiMultiplayer(GuiScreen parentScreen)
{
this.parentScreen = parentScreen;
FMLClientHandler.instance().setupServerList();
}
/**
* Adds the buttons (and other controls) to the screen in question.
*/
public void initGui()
{
Keyboard.enableRepeatEvents(true);
this.buttonList.clear();
if (!this.initialized)
{
this.initialized = true;
this.savedServerList = new ServerList(this.mc);
this.savedServerList.loadServerList();
this.lanServerList = new LanServerDetector.LanServerList();
try
{
this.lanServerDetector = new LanServerDetector.ThreadLanServerFind(this.lanServerList);
this.lanServerDetector.start();
}
catch (Exception exception)
{
logger.warn("Unable to start LAN server detection: " + exception.getMessage());
}
this.serverListSelector = new ServerSelectionList(this, this.mc, this.width, this.height, 32, this.height - 64, 36);
this.serverListSelector.func_148195_a(this.savedServerList);
}
else
{
this.serverListSelector.setDimensions(this.width, this.height, 32, this.height - 64);
}
this.createButtons();
}
public void createButtons()
{
this.buttonList.add(this.btnEditServer = new GuiButton(7, this.width / 2 - 154, this.height - 28, 70, 20, I18n.format("selectServer.edit", new Object[0])));
this.buttonList.add(this.btnDeleteServer = new GuiButton(2, this.width / 2 - 74, this.height - 28, 70, 20, I18n.format("selectServer.delete", new Object[0])));
this.buttonList.add(this.btnSelectServer = new GuiButton(1, this.width / 2 - 154, this.height - 52, 100, 20, I18n.format("selectServer.select", new Object[0])));
this.buttonList.add(new GuiButton(4, this.width / 2 - 50, this.height - 52, 100, 20, I18n.format("selectServer.direct", new Object[0])));
this.buttonList.add(new GuiButton(3, this.width / 2 + 4 + 50, this.height - 52, 100, 20, I18n.format("selectServer.add", new Object[0])));
this.buttonList.add(new GuiButton(8, this.width / 2 + 4, this.height - 28, 70, 20, I18n.format("selectServer.refresh", new Object[0])));
this.buttonList.add(new GuiButton(0, this.width / 2 + 4 + 76, this.height - 28, 75, 20, I18n.format("gui.cancel", new Object[0])));
this.selectServer(this.serverListSelector.func_148193_k());
}
/**
* Called from the main game loop to update the screen.
*/
public void updateScreen()
{
super.updateScreen();
if (this.lanServerList.getWasUpdated())
{
List list = this.lanServerList.getLanServers();
this.lanServerList.setWasNotUpdated();
this.serverListSelector.func_148194_a(list);
}
this.oldServerPinger.pingPendingNetworks();
}
/**
* Called when the screen is unloaded. Used to disable keyboard repeat events
*/
public void onGuiClosed()
{
Keyboard.enableRepeatEvents(false);
if (this.lanServerDetector != null)
{
this.lanServerDetector.interrupt();
this.lanServerDetector = null;
}
this.oldServerPinger.clearPendingNetworks();
}
protected void actionPerformed(GuiButton button)
{
if (button.enabled)
{
GuiListExtended.IGuiListEntry iguilistentry = this.serverListSelector.func_148193_k() < 0 ? null : this.serverListSelector.getListEntry(this.serverListSelector.func_148193_k());
if (button.id == 2 && iguilistentry instanceof ServerListEntryNormal)
{
String s4 = ((ServerListEntryNormal)iguilistentry).getServerData().serverName;
if (s4 != null)
{
this.deletingServer = true;
String s = I18n.format("selectServer.deleteQuestion", new Object[0]);
String s1 = "\'" + s4 + "\' " + I18n.format("selectServer.deleteWarning", new Object[0]);
String s2 = I18n.format("selectServer.deleteButton", new Object[0]);
String s3 = I18n.format("gui.cancel", new Object[0]);
GuiYesNo guiyesno = new GuiYesNo(this, s, s1, s2, s3, this.serverListSelector.func_148193_k());
this.mc.displayGuiScreen(guiyesno);
}
}
else if (button.id == 1)
{
this.connectToSelected();
}
else if (button.id == 4)
{
this.directConnect = true;
this.mc.displayGuiScreen(new GuiScreenServerList(this, this.selectedServer = new ServerData(I18n.format("selectServer.defaultName", new Object[0]), "")));
}
else if (button.id == 3)
{
this.addingServer = true;
this.mc.displayGuiScreen(new GuiScreenAddServer(this, this.selectedServer = new ServerData(I18n.format("selectServer.defaultName", new Object[0]), "")));
}
else if (button.id == 7 && iguilistentry instanceof ServerListEntryNormal)
{
this.editingServer = true;
ServerData serverdata = ((ServerListEntryNormal)iguilistentry).getServerData();
this.selectedServer = new ServerData(serverdata.serverName, serverdata.serverIP);
this.selectedServer.copyFrom(serverdata);
this.mc.displayGuiScreen(new GuiScreenAddServer(this, this.selectedServer));
}
else if (button.id == 0)
{
this.mc.displayGuiScreen(this.parentScreen);
}
else if (button.id == 8)
{
this.refreshServerList();
}
}
}
private void refreshServerList()
{
this.mc.displayGuiScreen(new GuiMultiplayer(this.parentScreen));
}
public void confirmClicked(boolean result, int id)
{
GuiListExtended.IGuiListEntry iguilistentry = this.serverListSelector.func_148193_k() < 0 ? null : this.serverListSelector.getListEntry(this.serverListSelector.func_148193_k());
if (this.deletingServer)
{
this.deletingServer = false;
if (result && iguilistentry instanceof ServerListEntryNormal)
{
this.savedServerList.removeServerData(this.serverListSelector.func_148193_k());
this.savedServerList.saveServerList();
this.serverListSelector.func_148192_c(-1);
this.serverListSelector.func_148195_a(this.savedServerList);
}
this.mc.displayGuiScreen(this);
}
else if (this.directConnect)
{
this.directConnect = false;
if (result)
{
this.connectToServer(this.selectedServer);
}
else
{
this.mc.displayGuiScreen(this);
}
}
else if (this.addingServer)
{
this.addingServer = false;
if (result)
{
this.savedServerList.addServerData(this.selectedServer);
this.savedServerList.saveServerList();
this.serverListSelector.func_148192_c(-1);
this.serverListSelector.func_148195_a(this.savedServerList);
}
this.mc.displayGuiScreen(this);
}
else if (this.editingServer)
{
this.editingServer = false;
if (result && iguilistentry instanceof ServerListEntryNormal)
{
ServerData serverdata = ((ServerListEntryNormal)iguilistentry).getServerData();
serverdata.serverName = this.selectedServer.serverName;
serverdata.serverIP = this.selectedServer.serverIP;
serverdata.copyFrom(this.selectedServer);
this.savedServerList.saveServerList();
this.serverListSelector.func_148195_a(this.savedServerList);
}
this.mc.displayGuiScreen(this);
}
}
/**
* Fired when a key is typed (except F11 who toggle full screen). This is the equivalent of
* KeyListener.keyTyped(KeyEvent e). Args : character (character on the key), keyCode (lwjgl Keyboard key code)
*/
protected void keyTyped(char typedChar, int keyCode)
{
int j = this.serverListSelector.func_148193_k();
GuiListExtended.IGuiListEntry iguilistentry = j < 0 ? null : this.serverListSelector.getListEntry(j);
if (keyCode == 63)
{
this.refreshServerList();
}
else
{
if (j >= 0)
{
if (keyCode == 200)
{
if (isShiftKeyDown())
{
if (j > 0 && iguilistentry instanceof ServerListEntryNormal)
{
this.savedServerList.swapServers(j, j - 1);
this.selectServer(this.serverListSelector.func_148193_k() - 1);
this.serverListSelector.scrollBy(-this.serverListSelector.getSlotHeight());
this.serverListSelector.func_148195_a(this.savedServerList);
}
}
else if (j > 0)
{
this.selectServer(this.serverListSelector.func_148193_k() - 1);
this.serverListSelector.scrollBy(-this.serverListSelector.getSlotHeight());
if (this.serverListSelector.getListEntry(this.serverListSelector.func_148193_k()) instanceof ServerListEntryLanScan)
{
if (this.serverListSelector.func_148193_k() > 0)
{
this.selectServer(this.serverListSelector.getSize() - 1);
this.serverListSelector.scrollBy(-this.serverListSelector.getSlotHeight());
}
else
{
this.selectServer(-1);
}
}
}
else
{
this.selectServer(-1);
}
}
else if (keyCode == 208)
{
if (isShiftKeyDown())
{
if (j < this.savedServerList.countServers() - 1)
{
this.savedServerList.swapServers(j, j + 1);
this.selectServer(j + 1);
this.serverListSelector.scrollBy(this.serverListSelector.getSlotHeight());
this.serverListSelector.func_148195_a(this.savedServerList);
}
}
else if (j < this.serverListSelector.getSize())
{
this.selectServer(this.serverListSelector.func_148193_k() + 1);
this.serverListSelector.scrollBy(this.serverListSelector.getSlotHeight());
if (this.serverListSelector.getListEntry(this.serverListSelector.func_148193_k()) instanceof ServerListEntryLanScan)
{
if (this.serverListSelector.func_148193_k() < this.serverListSelector.getSize() - 1)
{
this.selectServer(this.serverListSelector.getSize() + 1);
this.serverListSelector.scrollBy(this.serverListSelector.getSlotHeight());
}
else
{
this.selectServer(-1);
}
}
}
else
{
this.selectServer(-1);
}
}
else if (keyCode != 28 && keyCode != 156)
{
super.keyTyped(typedChar, keyCode);
}
else
{
this.actionPerformed((GuiButton)this.buttonList.get(2));
}
}
else
{
super.keyTyped(typedChar, keyCode);
}
}
}
/**
* Draws the screen and all the components in it. Args : mouseX, mouseY, renderPartialTicks
*/
public void drawScreen(int mouseX, int mouseY, float partialTicks)
{
this.field_146812_y = null;
this.drawDefaultBackground();
this.serverListSelector.drawScreen(mouseX, mouseY, partialTicks);
this.drawCenteredString(this.fontRendererObj, I18n.format("multiplayer.title", new Object[0]), this.width / 2, 20, 16777215);
super.drawScreen(mouseX, mouseY, partialTicks);
if (this.field_146812_y != null)
{
this.drawHoveringText(Lists.newArrayList(Splitter.on("\n").split(this.field_146812_y)), mouseX, mouseY);
}
}
public void connectToSelected()
{
GuiListExtended.IGuiListEntry iguilistentry = this.serverListSelector.func_148193_k() < 0 ? null : this.serverListSelector.getListEntry(this.serverListSelector.func_148193_k());
if (iguilistentry instanceof ServerListEntryNormal)
{
this.connectToServer(((ServerListEntryNormal)iguilistentry).getServerData());
}
else if (iguilistentry instanceof ServerListEntryLanDetected)
{
LanServerDetector.LanServer lanserver = ((ServerListEntryLanDetected)iguilistentry).getLanServer();
this.connectToServer(new ServerData(lanserver.getServerMotd(), lanserver.getServerIpPort(), true));
}
}
private void connectToServer(ServerData server)
{
FMLClientHandler.instance().connectToServer(this, server);
}
public void selectServer(int index)
{
this.serverListSelector.func_148192_c(index);
GuiListExtended.IGuiListEntry iguilistentry = index < 0 ? null : this.serverListSelector.getListEntry(index);
this.btnSelectServer.enabled = false;
this.btnEditServer.enabled = false;
this.btnDeleteServer.enabled = false;
if (iguilistentry != null && !(iguilistentry instanceof ServerListEntryLanScan))
{
this.btnSelectServer.enabled = true;
if (iguilistentry instanceof ServerListEntryNormal)
{
this.btnEditServer.enabled = true;
this.btnDeleteServer.enabled = true;
}
}
}
public OldServerPinger getOldServerPinger()
{
return this.oldServerPinger;
}
public void func_146793_a(String p_146793_1_)
{
this.field_146812_y = p_146793_1_;
}
/**
* Called when the mouse is clicked. Args : mouseX, mouseY, clickedButton
*/
protected void mouseClicked(int mouseX, int mouseY, int mouseButton)
{
super.mouseClicked(mouseX, mouseY, mouseButton);
this.serverListSelector.func_148179_a(mouseX, mouseY, mouseButton);
}
/**
* Called when a mouse button is released. Args : mouseX, mouseY, releaseButton
*
* @param state Will be negative to indicate mouse move and will be either 0 or 1 to indicate mouse up.
*/
protected void mouseReleased(int mouseX, int mouseY, int state)
{
super.mouseReleased(mouseX, mouseY, state);
this.serverListSelector.func_148181_b(mouseX, mouseY, state);
}
public ServerList getServerList()
{
return this.savedServerList;
}
}