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