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