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 }