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; } }