Posted June 23, 20187 yr Hey,guys. I want to make a new MainMenu so that I can see if my server is on when I enter the GUIMainMenu. I'm trying to modify the net.minecraft.client.network.ServerPinger to create my own serverpinger. When I use ping(serverdata server) and pass in my own serverdata, the console always says "Can't ping ...(serverIP)", although my server is connectable. Here is the pinger code. package mawmanager.maw.GUI; import com.google.common.base.Splitter; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import com.mojang.authlib.GameProfile; import io.netty.bootstrap.Bootstrap; import io.netty.buffer.ByteBuf; import io.netty.buffer.Unpooled; import io.netty.channel.Channel; import io.netty.channel.ChannelException; import io.netty.channel.ChannelFutureListener; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelInitializer; import io.netty.channel.ChannelOption; import io.netty.channel.SimpleChannelInboundHandler; import io.netty.channel.socket.nio.NioSocketChannel; import java.net.InetAddress; import java.net.UnknownHostException; import java.nio.charset.StandardCharsets; import java.util.Collections; import java.util.Iterator; import java.util.List; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ServerAddress; import net.minecraft.client.multiplayer.ServerData; import net.minecraft.network.EnumConnectionState; import net.minecraft.network.NetworkManager; import net.minecraft.network.ServerStatusResponse; import net.minecraft.network.handshake.client.C00Handshake; import net.minecraft.network.status.INetHandlerStatusClient; import net.minecraft.network.status.client.CPacketPing; import net.minecraft.network.status.client.CPacketServerQuery; import net.minecraft.network.status.server.SPacketPong; import net.minecraft.network.status.server.SPacketServerInfo; import net.minecraft.util.math.MathHelper; import net.minecraft.util.text.ITextComponent; import net.minecraft.util.text.TextComponentString; import net.minecraft.util.text.TextComponentTranslation; import net.minecraft.util.text.TextFormatting; import net.minecraft.util.text.translation.I18n; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; import org.apache.commons.lang3.ArrayUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @SideOnly(Side.CLIENT) public class MawServerPinger { private static final Splitter PING_RESPONSE_SPLITTER = Splitter.on('\u0000').limit(6); private static final Logger LOGGER = LogManager.getLogger(); /** A list of NetworkManagers that have pending pings */ private final List<NetworkManager> pingDestinations = Collections.<NetworkManager>synchronizedList(Lists.newArrayList()); public void ping(final ServerData server) throws UnknownHostException { ServerAddress serveraddress = ServerAddress.fromString(server.serverIP); final NetworkManager networkmanager = NetworkManager.createNetworkManagerAndConnect(InetAddress.getByName(serveraddress.getIP()), serveraddress.getPort(), false); this.pingDestinations.add(networkmanager); server.pingToServer = -1L; server.playerList = null; networkmanager.setNetHandler(new INetHandlerStatusClient() { private boolean successful; private boolean receivedStatus; private long pingSentAt; public void handleServerInfo(SPacketServerInfo packetIn) { if (this.receivedStatus) { networkmanager.closeChannel(new TextComponentTranslation("multiplayer.status.unrequested", new Object[0])); } else { this.receivedStatus = true; ServerStatusResponse serverstatusresponse = packetIn.getResponse(); NewMawMainGui.onlinestate =I18n.translateToLocal("mawnewmenu.mawserveronline"); if (serverstatusresponse.getPlayers() != null) { NewMawMainGui.playercount =I18n.translateToLocal("mawnewmenu.playercount")+serverstatusresponse.getPlayers().getPlayers().length; } net.minecraftforge.fml.client.FMLClientHandler.instance().bindServerListData(server, serverstatusresponse); this.pingSentAt = Minecraft.getSystemTime(); networkmanager.sendPacket(new CPacketPing(this.pingSentAt)); this.successful = true; } } public void handlePong(SPacketPong packetIn) { long i = this.pingSentAt; long j = Minecraft.getSystemTime(); server.pingToServer = j - i; networkmanager.closeChannel(new TextComponentString("Finished")); } /** * Invoked when disconnecting, the parameter is a ChatComponent describing the reason for termination */ public void onDisconnect(ITextComponent reason) { if (!this.successful) { NewMawMainGui.onlinestate = I18n.translateToLocal("mawnewmenu.mawserveroffline"); NewMawMainGui.playercount = I18n.translateToLocal("mawnewmenu.playercount")+0; NewMawMainGui.server.pingToServer = -1L; System.out.println("Connection error(MAWSERVER)"); server.serverMOTD = TextFormatting.DARK_RED + I18n.translateToLocal("multiplayer.status.cannot_connect"); server.populationInfo = ""; MawServerPinger.this.tryCompatibilityPing(server); } } }); try { networkmanager.sendPacket(new C00Handshake(serveraddress.getIP(), serveraddress.getPort(), EnumConnectionState.STATUS, true)); networkmanager.sendPacket(new CPacketServerQuery()); } catch (Throwable throwable) { LOGGER.error(throwable); } } private void tryCompatibilityPing(final ServerData server) { final ServerAddress serveraddress = ServerAddress.fromString(server.serverIP); ((Bootstrap)((Bootstrap)((Bootstrap)(new Bootstrap()).group(NetworkManager.CLIENT_NIO_EVENTLOOP.getValue())).handler(new ChannelInitializer<Channel>() { protected void initChannel(Channel p_initChannel_1_) throws Exception { try { p_initChannel_1_.config().setOption(ChannelOption.TCP_NODELAY, Boolean.valueOf(true)); } catch (ChannelException var3) { ; } p_initChannel_1_.pipeline().addLast(new SimpleChannelInboundHandler<ByteBuf>() { public void channelActive(ChannelHandlerContext p_channelActive_1_) throws Exception { super.channelActive(p_channelActive_1_); ByteBuf bytebuf = Unpooled.buffer(); try { bytebuf.writeByte(254); bytebuf.writeByte(1); bytebuf.writeByte(250); char[] achar = "MC|PingHost".toCharArray(); bytebuf.writeShort(achar.length); for (char c0 : achar) { bytebuf.writeChar(c0); } bytebuf.writeShort(7 + 2 * serveraddress.getIP().length()); bytebuf.writeByte(127); achar = serveraddress.getIP().toCharArray(); bytebuf.writeShort(achar.length); for (char c1 : achar) { bytebuf.writeChar(c1); } bytebuf.writeInt(serveraddress.getPort()); p_channelActive_1_.channel().writeAndFlush(bytebuf).addListener(ChannelFutureListener.CLOSE_ON_FAILURE); } finally { bytebuf.release(); } } protected void channelRead0(ChannelHandlerContext p_channelRead0_1_, ByteBuf p_channelRead0_2_) throws Exception { short short1 = p_channelRead0_2_.readUnsignedByte(); if (short1 == 255) { String s = new String(p_channelRead0_2_.readBytes(p_channelRead0_2_.readShort() * 2).array(), StandardCharsets.UTF_16BE); String[] astring = (String[])Iterables.toArray(MawServerPinger.PING_RESPONSE_SPLITTER.split(s), String.class); if ("\u00a71".equals(astring[0])) { int i = MathHelper.getInt(astring[1], 0); String s1 = astring[2]; String s2 = astring[3]; int j = MathHelper.getInt(astring[4], -1); int k = MathHelper.getInt(astring[5], -1); server.version = -1; server.gameVersion = s1; server.serverMOTD = s2; server.populationInfo = TextFormatting.GRAY + "" + j + "" + TextFormatting.DARK_GRAY + "/" + TextFormatting.GRAY + k; } } p_channelRead0_1_.close(); } public void exceptionCaught(ChannelHandlerContext p_exceptionCaught_1_, Throwable p_exceptionCaught_2_) throws Exception { p_exceptionCaught_1_.close(); } }); } })).channel(NioSocketChannel.class)).connect(serveraddress.getIP(), serveraddress.getPort()); } public void pingPendingNetworks() { synchronized (this.pingDestinations) { Iterator<NetworkManager> iterator = this.pingDestinations.iterator(); while (iterator.hasNext()) { NetworkManager networkmanager = iterator.next(); if (networkmanager.isChannelOpen()) { networkmanager.processReceivedPackets(); } else { iterator.remove(); networkmanager.checkDisconnected(); } } } } public void clearPendingNetworks() { synchronized (this.pingDestinations) { Iterator<NetworkManager> iterator = this.pingDestinations.iterator(); while (iterator.hasNext()) { NetworkManager networkmanager = iterator.next(); if (networkmanager.isChannelOpen()) { iterator.remove(); networkmanager.closeChannel(new TextComponentTranslation("multiplayer.status.cancelled", new Object[0])); } } } } } There is also code that is executed when a refresh Button is pressed in MainMenu private void check(){ threads.submit(new Runnable(){ private static final String __OBFID = "CL_00000818"; public void run() { try { NewMawMainGui.this.serverp.pingPendingNetworks(); onlinestate=I18n.translateToLocal("mawnewmenu.pinging"); NewMawMainGui.this.serverp.ping(server); } catch (Exception exception) { onlinestate = I18n.translateToLocal("mawnewmenu.mawserveroffline"); playercount = I18n.translateToLocal("mawnewmenu.playercount")+0; NewMawMainGui.this.server.pingToServer = -1L; } } }); } The onlinestate and playercount variables are the text that MainMenuGUI displays to let me know if the server is on As the title says, I want to know how to get the code to get whether the server is on or not, and displays it on GuiScreen] Thank you.
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.