diff --git a/1.10.2/src/main/java/net/teamfruit/serverobserver/Compat.java b/1.10.2/src/main/java/net/teamfruit/serverobserver/Compat.java index 1fb6670..019547f 100644 --- a/1.10.2/src/main/java/net/teamfruit/serverobserver/Compat.java +++ b/1.10.2/src/main/java/net/teamfruit/serverobserver/Compat.java @@ -1,5 +1,6 @@ package net.teamfruit.serverobserver; +import java.net.SocketAddress; import java.util.List; import java.util.concurrent.ThreadPoolExecutor; @@ -19,6 +20,7 @@ import net.minecraft.client.multiplayer.ServerData; import net.minecraft.client.multiplayer.ServerList; import net.minecraft.init.SoundEvents; +import net.minecraft.network.NetworkManager; import net.minecraft.util.ResourceLocation; import net.minecraft.util.SoundCategory; import net.minecraftforge.client.event.GuiScreenEvent.ActionPerformedEvent; @@ -114,11 +116,21 @@ public GuiButton createSkeletonButton(final int buttonId, final int x, final int return new SkeletonButton(this, buttonId, x, y, widthIn, heightIn, buttonText, inside); } + @Override + public NetworkManager getClientToServerNetworkManager() { + return FMLClientHandler.instance().getClientToServerNetworkManager(); + } + @Override public ThreadPoolExecutor getThreadPool() { return ServerListEntryNormal.EXECUTOR; } + @Override + public SocketAddress getSocketAddress(final NetworkManager netManager) { + return netManager.getRemoteAddress(); + } + public static class SkeletonButton extends GuiButton { private final SkeletonButtonDrawInside inside; private final ICompat compat; diff --git a/1.11.2/src/main/java/net/teamfruit/serverobserver/Compat.java b/1.11.2/src/main/java/net/teamfruit/serverobserver/Compat.java index 1fb6670..019547f 100644 --- a/1.11.2/src/main/java/net/teamfruit/serverobserver/Compat.java +++ b/1.11.2/src/main/java/net/teamfruit/serverobserver/Compat.java @@ -1,5 +1,6 @@ package net.teamfruit.serverobserver; +import java.net.SocketAddress; import java.util.List; import java.util.concurrent.ThreadPoolExecutor; @@ -19,6 +20,7 @@ import net.minecraft.client.multiplayer.ServerData; import net.minecraft.client.multiplayer.ServerList; import net.minecraft.init.SoundEvents; +import net.minecraft.network.NetworkManager; import net.minecraft.util.ResourceLocation; import net.minecraft.util.SoundCategory; import net.minecraftforge.client.event.GuiScreenEvent.ActionPerformedEvent; @@ -114,11 +116,21 @@ public GuiButton createSkeletonButton(final int buttonId, final int x, final int return new SkeletonButton(this, buttonId, x, y, widthIn, heightIn, buttonText, inside); } + @Override + public NetworkManager getClientToServerNetworkManager() { + return FMLClientHandler.instance().getClientToServerNetworkManager(); + } + @Override public ThreadPoolExecutor getThreadPool() { return ServerListEntryNormal.EXECUTOR; } + @Override + public SocketAddress getSocketAddress(final NetworkManager netManager) { + return netManager.getRemoteAddress(); + } + public static class SkeletonButton extends GuiButton { private final SkeletonButtonDrawInside inside; private final ICompat compat; diff --git a/1.12.2/src/main/java/net/teamfruit/serverobserver/Compat.java b/1.12.2/src/main/java/net/teamfruit/serverobserver/Compat.java index 6786246..619784d 100644 --- a/1.12.2/src/main/java/net/teamfruit/serverobserver/Compat.java +++ b/1.12.2/src/main/java/net/teamfruit/serverobserver/Compat.java @@ -1,5 +1,6 @@ package net.teamfruit.serverobserver; +import java.net.SocketAddress; import java.util.List; import java.util.concurrent.ThreadPoolExecutor; @@ -19,6 +20,7 @@ import net.minecraft.client.multiplayer.ServerData; import net.minecraft.client.multiplayer.ServerList; import net.minecraft.init.SoundEvents; +import net.minecraft.network.NetworkManager; import net.minecraft.util.ResourceLocation; import net.minecraft.util.SoundCategory; import net.minecraftforge.client.event.GuiScreenEvent.ActionPerformedEvent; @@ -119,6 +121,16 @@ public ThreadPoolExecutor getThreadPool() { return ServerListEntryNormal.EXECUTOR; } + @Override + public NetworkManager getClientToServerNetworkManager() { + return FMLClientHandler.instance().getClientToServerNetworkManager(); + } + + @Override + public SocketAddress getSocketAddress(final NetworkManager netManager) { + return netManager.getRemoteAddress(); + } + public static class SkeletonButton extends GuiButton { private final SkeletonButtonDrawInside inside; private final ICompat compat; diff --git a/1.7.10/src/main/java/net/teamfruit/serverobserver/Compat.java b/1.7.10/src/main/java/net/teamfruit/serverobserver/Compat.java index 7b552d5..6433a67 100644 --- a/1.7.10/src/main/java/net/teamfruit/serverobserver/Compat.java +++ b/1.7.10/src/main/java/net/teamfruit/serverobserver/Compat.java @@ -1,5 +1,6 @@ package net.teamfruit.serverobserver; +import java.net.SocketAddress; import java.util.List; import java.util.concurrent.ThreadPoolExecutor; @@ -18,6 +19,7 @@ import net.minecraft.client.gui.ServerListEntryNormal; import net.minecraft.client.multiplayer.ServerData; import net.minecraft.client.multiplayer.ServerList; +import net.minecraft.network.NetworkManager; import net.minecraft.util.ResourceLocation; import net.minecraftforge.client.event.GuiScreenEvent.ActionPerformedEvent; import net.minecraftforge.client.event.GuiScreenEvent.InitGuiEvent; @@ -119,6 +121,16 @@ public GuiButton createSkeletonButton(final int buttonId, final int x, final int return new SkeletonButton(this, buttonId, x, y, widthIn, heightIn, buttonText, inside); } + @Override + public NetworkManager getClientToServerNetworkManager() { + return FMLClientHandler.instance().getClientToServerNetworkManager(); + } + + @Override + public SocketAddress getSocketAddress(final NetworkManager netManager) { + return netManager.getSocketAddress(); + } + public static class SkeletonButton extends GuiButton { private final SkeletonButtonDrawInside inside; private final ICompat compat; diff --git a/1.8.9/src/main/java/net/teamfruit/serverobserver/Compat.java b/1.8.9/src/main/java/net/teamfruit/serverobserver/Compat.java index 958a163..13a8a15 100644 --- a/1.8.9/src/main/java/net/teamfruit/serverobserver/Compat.java +++ b/1.8.9/src/main/java/net/teamfruit/serverobserver/Compat.java @@ -1,5 +1,6 @@ package net.teamfruit.serverobserver; +import java.net.SocketAddress; import java.util.List; import java.util.concurrent.ThreadPoolExecutor; @@ -17,6 +18,7 @@ import net.minecraft.client.gui.ServerListEntryNormal; import net.minecraft.client.multiplayer.ServerData; import net.minecraft.client.multiplayer.ServerList; +import net.minecraft.network.NetworkManager; import net.minecraft.util.ResourceLocation; import net.minecraftforge.client.event.GuiScreenEvent.ActionPerformedEvent; import net.minecraftforge.client.event.GuiScreenEvent.InitGuiEvent; @@ -118,6 +120,16 @@ public ThreadPoolExecutor getThreadPool() { return ServerListEntryNormal.field_148302_b; } + @Override + public NetworkManager getClientToServerNetworkManager() { + return FMLClientHandler.instance().getClientToServerNetworkManager(); + } + + @Override + public SocketAddress getSocketAddress(final NetworkManager netManager) { + return netManager.getRemoteAddress(); + } + public static class SkeletonButton extends GuiButton { private final SkeletonButtonDrawInside inside; private final ICompat compat; diff --git a/1.9.4/src/main/java/net/teamfruit/serverobserver/Compat.java b/1.9.4/src/main/java/net/teamfruit/serverobserver/Compat.java index 1fb6670..69bc6ea 100644 --- a/1.9.4/src/main/java/net/teamfruit/serverobserver/Compat.java +++ b/1.9.4/src/main/java/net/teamfruit/serverobserver/Compat.java @@ -1,5 +1,6 @@ package net.teamfruit.serverobserver; +import java.net.SocketAddress; import java.util.List; import java.util.concurrent.ThreadPoolExecutor; @@ -19,6 +20,7 @@ import net.minecraft.client.multiplayer.ServerData; import net.minecraft.client.multiplayer.ServerList; import net.minecraft.init.SoundEvents; +import net.minecraft.network.NetworkManager; import net.minecraft.util.ResourceLocation; import net.minecraft.util.SoundCategory; import net.minecraftforge.client.event.GuiScreenEvent.ActionPerformedEvent; @@ -119,6 +121,16 @@ public ThreadPoolExecutor getThreadPool() { return ServerListEntryNormal.EXECUTOR; } + @Override + public NetworkManager getClientToServerNetworkManager() { + return FMLClientHandler.instance().getClientToServerNetworkManager(); + } + + @Override + public SocketAddress getSocketAddress(final NetworkManager netManager) { + return netManager.getRemoteAddress(); + } + public static class SkeletonButton extends GuiButton { private final SkeletonButtonDrawInside inside; private final ICompat compat; diff --git a/src/main/java/net/teamfruit/serverobserver/GuiHandler.java b/src/main/java/net/teamfruit/serverobserver/GuiHandler.java index 64148e1..96a4281 100644 --- a/src/main/java/net/teamfruit/serverobserver/GuiHandler.java +++ b/src/main/java/net/teamfruit/serverobserver/GuiHandler.java @@ -2,6 +2,8 @@ import java.awt.Color; import java.io.File; +import java.net.InetSocketAddress; +import java.net.SocketAddress; import java.net.UnknownHostException; import java.util.List; import java.util.Set; @@ -20,12 +22,14 @@ import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.gui.GuiButton; import net.minecraft.client.gui.GuiDisconnected; +import net.minecraft.client.gui.GuiIngameMenu; import net.minecraft.client.gui.GuiMainMenu; import net.minecraft.client.gui.GuiMultiplayer; import net.minecraft.client.gui.GuiScreen; import net.minecraft.client.multiplayer.ServerData; import net.minecraft.client.multiplayer.ServerList; import net.minecraft.client.resources.I18n; +import net.minecraft.network.NetworkManager; import net.minecraft.util.ResourceLocation; import net.minecraftforge.client.event.GuiScreenEvent.ActionPerformedEvent; import net.minecraftforge.client.event.GuiScreenEvent.DrawScreenEvent; @@ -43,6 +47,8 @@ public class GuiHandler { private GuiButton disableBackButton; private @Nullable GuiButton mainMenuButtonMulti; + private GuiMultiplayer lastGuiMultiplayer; + public GuiHandler(final ICompat compat) { this.compat = compat; } @@ -62,7 +68,7 @@ public void open(final InitGuiEvent.Post e) { final List buttons = this.compat.getButtonList(e); // Log.log.info(String.format("opened: %s, buttons: %s", screen, buttons)); if (screen instanceof GuiMultiplayer) { - final GuiMultiplayer mpgui = (GuiMultiplayer) screen; + final GuiMultiplayer mpgui = this.lastGuiMultiplayer = (GuiMultiplayer) screen; buttons.add(this.compat.createSkeletonButton(BUTTON_ID, mpgui.width-(5+180), 5, 180, 23, I18n.format("serverobserver.gui.mode"), ( button, mc, mouseX, mouseY, x, y @@ -80,6 +86,23 @@ public void open(final InitGuiEvent.Post e) { })); selectTarget(mpgui, this.target.getServerIP()); reset(Config.getConfig().durationPing); + } else if (screen instanceof GuiIngameMenu) { + final GuiIngameMenu imgui = (GuiIngameMenu) screen; + buttons.add(this.compat.createSkeletonButton(BUTTON_ID, imgui.width-(5+180), 5, 180, 23, I18n.format("serverobserver.gui.mode"), + ( + button, mc, mouseX, mouseY, x, y + ) -> { + final ServerData serverData = this.target.get(null); + final FontRenderer font = GuiHandler.this.compat.font(mc); + GuiHandler.this.displayText = serverData!=null ? GuiHandler.this.autologin.is() ? "serverobserver.gui.mode.1" : "serverobserver.gui.mode.2" : "serverobserver.gui.mode.3"; + imgui.drawString(font, I18n.format(GuiHandler.this.displayText, ""), x+4, y+3, Color.WHITE.getRGB()); + if (serverData!=null) { + final String text = font.trimStringToWidth(serverData.serverName, button.width-(4*2+font.getStringWidth("..."))); + imgui.drawString(font, text, x+4, y+12, Color.GRAY.getRGB()); + if (!StringUtils.equals(serverData.serverName, text)) + imgui.drawString(font, "...", x+4+font.getStringWidth(text), y+12, Color.GRAY.getRGB()); + } + })); } else if (screen instanceof GuiDisconnected) { final GuiDisconnected dcgui = (GuiDisconnected) screen; if (this.target.getServerIP()!=null) @@ -93,9 +116,9 @@ public void open(final InitGuiEvent.Post e) { if (Config.getConfig().startAndConnect.get()) { final ServerData server = this.target.get(null); if (server!=null) - this.compat.connectToServer(new GuiMultiplayer(screen), server); + this.compat.connectToServer(newGuiMultiplayer(screen), server); } else if (Config.getConfig().startWithMultiplayerMenu.get()) - this.mc.displayGuiScreen(new GuiMultiplayer(screen)); + this.mc.displayGuiScreen(newGuiMultiplayer(screen)); for (final GuiButton button : buttons) if (button.id==2) this.mainMenuButtonMulti = button; @@ -110,6 +133,7 @@ public void open(final InitGuiEvent.Post e) { public void draw(final DrawScreenEvent.Post e) { final GuiScreen gui = this.mc.currentScreen; if (gui instanceof GuiMultiplayer) { + } else if (gui instanceof GuiIngameMenu) { } else if (gui instanceof GuiDisconnected) { if (this.disableBackButton!=null&&Config.getConfig().durationDisconnected.get()>=10) this.disableBackButton.displayString = I18n.format("serverobserver.gui.backandstop.time", I18n.format("serverobserver.gui.backandstop"), timeremain()); @@ -120,6 +144,10 @@ public void draw(final DrawScreenEvent.Post e) { } } + private GuiMultiplayer newGuiMultiplayer(final GuiScreen parent) { + return this.lastGuiMultiplayer = new GuiMultiplayer(parent); + } + private String displayText = "Disabled"; private String displayTime = ""; private Boolean targetServerStatus; @@ -161,6 +189,22 @@ public void init(final File root) { } } + public @Nullable InetSocketAddress getConnectedServer() { + try { + final NetworkManager t = this.compat.getClientToServerNetworkManager(); + if (t!=null) { + final SocketAddress socketAddress = this.compat.getSocketAddress(t); + if (socketAddress!=null&&socketAddress instanceof InetSocketAddress) { + final InetSocketAddress inetAddr = (InetSocketAddress) socketAddress; + return inetAddr; + } + } + } catch (final Throwable e) { + Log.log.error("Couldn\'t get server name: ", e); + } + return null; + } + @CoreEvent public void action(final ActionPerformedEvent.Pre e) { this.manual = true; @@ -191,6 +235,34 @@ public void action(final ActionPerformedEvent.Post e) { } } else selectTarget(mpgui, this.target.getServerIP()); + } else if (screen instanceof GuiIngameMenu&&id==BUTTON_ID) { + final InetSocketAddress serverInet = getConnectedServer(); + ServerData server = null; + if (serverInet!=null) { + ServerData serverData; + final GuiMultiplayer mpgui = this.lastGuiMultiplayer; + final String serverHost = serverInet.getHostName(); + final int serverPort = serverInet.getPort(); + if (serverPort==25565) { + if (this.lastGuiMultiplayer==null||getTarget(this.lastGuiMultiplayer, serverHost)!=-1) + serverData = getServerData(mpgui, serverHost, serverHost, false); + else + serverData = getServerData(mpgui, serverHost+":"+serverPort, serverHost+":"+serverPort, false); + } else + serverData = getServerData(mpgui, serverHost+":"+serverPort, serverHost+":"+serverPort, false); + server = serverData; + } + if (server!=null) + if (!StringUtils.equals(this.target.getServerIP(), server.serverIP)) { + this.autologin.set(false); + this.target.set(server); + } else if (!this.autologin.is()) { + this.autologin.set(true); + this.target.set(server); + } else { + this.autologin.set(false); + this.target.set(null); + } } else if (screen instanceof GuiDisconnected&&id==DISABLE_BACK_BUTTON_ID) { final GuiDisconnected dcgui = (GuiDisconnected) screen; this.autologin.set(false); @@ -303,7 +375,7 @@ else if (this.autologin.is()) if (this.timer.getTime()>0) { GuiScreen screen2 = this.compat.getParentScreen(dcgui); if (!(screen2 instanceof GuiMultiplayer)) - screen2 = new GuiMultiplayer(screen2); + screen2 = newGuiMultiplayer(screen2); this.mc.displayGuiScreen(screen2); final GuiMultiplayer mpgui = (GuiMultiplayer) screen2; final ServerData serverData = this.target.get(mpgui); @@ -313,7 +385,7 @@ else if (this.autologin.is()) } else if (screen instanceof GuiMainMenu) if (this.target.getServerIP()!=null&&!this.manualOpen&&Config.getConfig().durationDisconnected.get()>=10) if (this.timer.getTime()>0) - this.mc.displayGuiScreen(new GuiMultiplayer(screen)); + this.mc.displayGuiScreen(newGuiMultiplayer(screen)); } private void reset(final ConfigProperty time) { @@ -337,6 +409,8 @@ private void selectTarget(final GuiMultiplayer mpgui, final String serverIP) { private int getTarget(final GuiMultiplayer mpgui, final String serverIP) { final ServerList serverList = this.compat.getServerList(mpgui); + if (serverList==null) + return -2; final int countserver = serverList.countServers(); for (int i = 0; i