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