package net.minecraft.client.network; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import java.io.IOException; import java.net.DatagramPacket; import java.net.InetAddress; import java.net.MulticastSocket; import java.net.SocketTimeoutException; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ThreadLanServerPing; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @SideOnly(Side.CLIENT) public class LanServerDetector { private static final AtomicInteger field_148551_a = new AtomicInteger(0); private static final Logger logger = LogManager.getLogger(); private static final String __OBFID = "CL_00001133"; @SideOnly(Side.CLIENT) public static class LanServer { private String lanServerMotd; private String lanServerIpPort; /** Last time this LanServer was seen. */ private long timeLastSeen; private static final String __OBFID = "CL_00001134"; public LanServer(String p_i1319_1_, String p_i1319_2_) { this.lanServerMotd = p_i1319_1_; this.lanServerIpPort = p_i1319_2_; this.timeLastSeen = Minecraft.getSystemTime(); } public String getServerMotd() { return this.lanServerMotd; } public String getServerIpPort() { return this.lanServerIpPort; } /** * Updates the time this LanServer was last seen. */ public void updateLastSeen() { this.timeLastSeen = Minecraft.getSystemTime(); } } @SideOnly(Side.CLIENT) public static class LanServerList { private ArrayList listOfLanServers = new ArrayList(); boolean wasUpdated; private static final String __OBFID = "CL_00001136"; public synchronized boolean getWasUpdated() { return this.wasUpdated; } public synchronized void setWasNotUpdated() { this.wasUpdated = false; } public synchronized List getLanServers() { return Collections.unmodifiableList(this.listOfLanServers); } public synchronized void func_77551_a(String p_77551_1_, InetAddress p_77551_2_) { String s1 = ThreadLanServerPing.getMotdFromPingResponse(p_77551_1_); String s2 = ThreadLanServerPing.getAdFromPingResponse(p_77551_1_); if (s2 != null) { s2 = p_77551_2_.getHostAddress() + ":" + s2; boolean flag = false; Iterator iterator = this.listOfLanServers.iterator(); while (iterator.hasNext()) { LanServerDetector.LanServer lanserver = (LanServerDetector.LanServer)iterator.next(); if (lanserver.getServerIpPort().equals(s2)) { lanserver.updateLastSeen(); flag = true; break; } } if (!flag) { this.listOfLanServers.add(new LanServerDetector.LanServer(s1, s2)); this.wasUpdated = true; } } } } @SideOnly(Side.CLIENT) public static class ThreadLanServerFind extends Thread { /** The LanServerList */ private final LanServerDetector.LanServerList localServerList; /** InetAddress for 224.0.2.60 */ private final InetAddress broadcastAddress; /** The socket we're using to receive packets on. */ private final MulticastSocket socket; private static final String __OBFID = "CL_00001135"; public ThreadLanServerFind(LanServerDetector.LanServerList p_i1320_1_) throws IOException { super("LanServerDetector #" + LanServerDetector.field_148551_a.incrementAndGet()); this.localServerList = p_i1320_1_; this.setDaemon(true); this.socket = new MulticastSocket(4445); this.broadcastAddress = InetAddress.getByName("224.0.2.60"); this.socket.setSoTimeout(5000); this.socket.joinGroup(this.broadcastAddress); } public void run() { byte[] abyte = new byte[1024]; while (!this.isInterrupted()) { DatagramPacket datagrampacket = new DatagramPacket(abyte, abyte.length); try { this.socket.receive(datagrampacket); } catch (SocketTimeoutException sockettimeoutexception) { continue; } catch (IOException ioexception1) { LanServerDetector.logger.error("Couldn\'t ping server", ioexception1); break; } String s = new String(datagrampacket.getData(), datagrampacket.getOffset(), datagrampacket.getLength()); LanServerDetector.logger.debug(datagrampacket.getAddress() + ": " + s); this.localServerList.func_77551_a(s, datagrampacket.getAddress()); } try { this.socket.leaveGroup(this.broadcastAddress); } catch (IOException ioexception) { ; } this.socket.close(); } } }