001 package cpw.mods.fml.common.network; 002 003 import java.util.Arrays; 004 import java.util.logging.Level; 005 006 import net.minecraft.src.NetHandler; 007 import net.minecraft.src.INetworkManager; 008 009 import com.google.common.base.Throwables; 010 import com.google.common.primitives.Bytes; 011 import com.google.common.primitives.UnsignedBytes; 012 013 import cpw.mods.fml.common.FMLLog; 014 015 public abstract class FMLPacket 016 { 017 enum Type 018 { 019 /** 020 * Opening salutation from the server to the client -> request all mods from the client 021 */ 022 MOD_LIST_REQUEST(ModListRequestPacket.class), 023 /** 024 * The client responds with the list of mods and versions it has. This is verified by the server. 025 */ 026 MOD_LIST_RESPONSE(ModListResponsePacket.class), 027 /** 028 * At which point the server tells the client the mod identifiers for this session. 029 */ 030 MOD_IDENTIFIERS(ModIdentifiersPacket.class), 031 /** 032 * Or, if there is missing stuff, the server tells the client what's missing and drops the connection. 033 */ 034 MOD_MISSING(ModMissingPacket.class), 035 /** 036 * Open a GUI on the client from the server 037 */ 038 GUIOPEN(OpenGuiPacket.class), 039 /** 040 * Spawn an entity on the client from the server 041 */ 042 ENTITYSPAWN(EntitySpawnPacket.class), 043 /** 044 * Fixes entity location data after spawning 045 */ 046 ENTITYSPAWNADJUSTMENT(EntitySpawnAdjustmentPacket.class); 047 048 049 private Class<? extends FMLPacket> packetType; 050 051 private Type(Class<? extends FMLPacket> clazz) 052 { 053 this.packetType = clazz; 054 } 055 056 FMLPacket make() 057 { 058 try 059 { 060 return this.packetType.newInstance(); 061 } 062 catch (Exception e) 063 { 064 Throwables.propagateIfPossible(e); 065 FMLLog.log(Level.SEVERE, e, "A bizarre critical error occured during packet encoding"); 066 throw new FMLNetworkException(e); 067 } 068 } 069 } 070 071 private Type type; 072 073 public static byte[] makePacket(Type type, Object... data) 074 { 075 byte[] packetData = type.make().generatePacket(data); 076 return Bytes.concat(new byte[] { UnsignedBytes.checkedCast(type.ordinal()) }, packetData ); 077 } 078 079 public static FMLPacket readPacket(byte[] payload) 080 { 081 int type = UnsignedBytes.toInt(payload[0]); 082 return Type.values()[type].make().consumePacket(Arrays.copyOfRange(payload, 1, payload.length)); 083 } 084 085 public FMLPacket(Type type) 086 { 087 this.type = type; 088 } 089 090 public abstract byte[] generatePacket(Object... data); 091 092 public abstract FMLPacket consumePacket(byte[] data); 093 094 public abstract void execute(INetworkManager network, FMLNetworkHandler handler, NetHandler netHandler, String userName); 095 { 096 // TODO Auto-generated method stub 097 098 } 099 }