001package net.minecraft.network;
002
003import java.io.IOException;
004import java.util.ArrayList;
005import java.util.Collections;
006import java.util.List;
007import java.util.logging.Level;
008
009import cpw.mods.fml.common.FMLLog;
010import net.minecraft.crash.CrashReport;
011import net.minecraft.server.MinecraftServer;
012import net.minecraft.util.ReportedException;
013
014public abstract class NetworkListenThread
015{
016    /** Reference to the MinecraftServer object. */
017    private final MinecraftServer mcServer;
018    private final List connections = Collections.synchronizedList(new ArrayList());
019
020    /** Whether the network listener object is listening. */
021    public volatile boolean isListening = false;
022
023    public NetworkListenThread(MinecraftServer par1MinecraftServer) throws IOException
024    {
025        this.mcServer = par1MinecraftServer;
026        this.isListening = true;
027    }
028
029    /**
030     * adds this connection to the list of currently connected players
031     */
032    public void addPlayer(NetServerHandler par1NetServerHandler)
033    {
034        this.connections.add(par1NetServerHandler);
035    }
036
037    public void stopListening()
038    {
039        this.isListening = false;
040    }
041
042    /**
043     * processes packets and pending connections
044     */
045    public void networkTick()
046    {
047        for (int i = 0; i < this.connections.size(); ++i)
048        {
049            NetServerHandler netserverhandler = (NetServerHandler)this.connections.get(i);
050
051            try
052            {
053                netserverhandler.networkTick();
054            }
055            catch (Exception exception)
056            {
057                if (netserverhandler.netManager instanceof MemoryConnection)
058                {
059                    CrashReport crashreport = CrashReport.makeCrashReport(exception, "Ticking memory connection");
060                    throw new ReportedException(crashreport);
061                }
062
063                FMLLog.log(Level.SEVERE, exception, "A critical server error occured handling a packet, kicking %s", netserverhandler.getPlayer().entityId);
064                this.mcServer.getLogAgent().func_98235_b("Failed to handle packet for " + netserverhandler.playerEntity.getEntityName() + "/" + netserverhandler.playerEntity.getPlayerIP() + ": " + exception, exception);
065                netserverhandler.kickPlayerFromServer("Internal server error");
066            }
067
068            if (netserverhandler.connectionClosed)
069            {
070                this.connections.remove(i--);
071            }
072
073            netserverhandler.netManager.wakeThreads();
074        }
075    }
076
077    public MinecraftServer getServer()
078    {
079        return this.mcServer;
080    }
081}