001    package net.minecraft.server.integrated;
002    
003    import cpw.mods.fml.common.network.FMLNetworkHandler;
004    import cpw.mods.fml.relauncher.Side;
005    import cpw.mods.fml.relauncher.SideOnly;
006    import java.io.IOException;
007    import java.net.InetAddress;
008    import net.minecraft.entity.player.EntityPlayerMP;
009    import net.minecraft.network.MemoryConnection;
010    import net.minecraft.network.NetworkListenThread;
011    import net.minecraft.network.packet.NetHandler;
012    import net.minecraft.server.MinecraftServer;
013    import net.minecraft.server.ServerListenThread;
014    import net.minecraft.util.HttpUtil;
015    
016    @SideOnly(Side.CLIENT)
017    public class IntegratedServerListenThread extends NetworkListenThread
018    {
019        private final MemoryConnection netMemoryConnection = new MemoryConnection((NetHandler)null);
020        private MemoryConnection theMemoryConnection;
021        private String field_71759_e;
022        private boolean field_71756_f = false;
023        private ServerListenThread myServerListenThread;
024    
025        public IntegratedServerListenThread(IntegratedServer par1IntegratedServer) throws IOException
026        {
027            super(par1IntegratedServer);
028        }
029    
030        public void func_71754_a(MemoryConnection par1MemoryConnection, String par2Str)
031        {
032            this.theMemoryConnection = par1MemoryConnection;
033            this.field_71759_e = par2Str;
034        }
035    
036        public String func_71755_c() throws IOException
037        {
038            if (this.myServerListenThread == null)
039            {
040                int var1 = -1;
041    
042                try
043                {
044                    var1 = HttpUtil.func_76181_a();
045                }
046                catch (IOException var4)
047                {
048                    ;
049                }
050    
051                if (var1 <= 0)
052                {
053                    var1 = 25564;
054                }
055    
056                try
057                {
058                    this.myServerListenThread = new ServerListenThread(this, (InetAddress)null, var1);
059                    this.myServerListenThread.start();
060                }
061                catch (IOException var3)
062                {
063                    throw var3;
064                }
065            }
066    
067            return FMLNetworkHandler.computeLocalHost().getHostAddress() + ":" + this.myServerListenThread.getMyPort();
068        }
069    
070        public void stopListening()
071        {
072            super.stopListening();
073    
074            if (this.myServerListenThread != null)
075            {
076                System.out.println("Stopping server connection");
077                this.myServerListenThread.func_71768_b();
078                this.myServerListenThread.interrupt();
079                this.myServerListenThread = null;
080            }
081        }
082    
083        /**
084         * processes packets and pending connections
085         */
086        public void networkTick()
087        {
088            if (this.theMemoryConnection != null)
089            {
090                EntityPlayerMP var1 = this.getIntergatedServerMinecraftServerInstance().getConfigurationManager().createPlayerForUser(this.field_71759_e);
091    
092                if (var1 != null)
093                {
094                    this.netMemoryConnection.pairWith(this.theMemoryConnection);
095                    this.field_71756_f = true;
096                    this.getIntergatedServerMinecraftServerInstance().getConfigurationManager().initializeConnectionToPlayer(this.netMemoryConnection, var1);
097                }
098    
099                this.theMemoryConnection = null;
100                this.field_71759_e = null;
101            }
102    
103            if (this.myServerListenThread != null)
104            {
105                this.myServerListenThread.processPendingConnections();
106            }
107    
108            super.networkTick();
109        }
110    
111        /**
112         * Gets MinecraftServer instance.
113         */
114        public IntegratedServer getIntergatedServerMinecraftServerInstance()
115        {
116            return (IntegratedServer)super.getServer();
117        }
118    
119        public boolean isGamePaused()
120        {
121            return this.field_71756_f && this.netMemoryConnection.getPairedConnection().isConnectionActive() && this.netMemoryConnection.getPairedConnection().isGamePaused();
122        }
123    
124        public MinecraftServer getServer()
125        {
126            return this.getIntergatedServerMinecraftServerInstance();
127        }
128    }