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 }