package game.network; import java.util.Map; import game.collect.BiMap; import game.collect.HashBiMap; import game.collect.Maps; import game.packet.CPacketAction; import game.packet.CPacketBook; import game.packet.CPacketBreak; import game.packet.CPacketCheat; import game.packet.CPacketClick; import game.packet.CPacketComplete; import game.packet.CPacketInput; import game.packet.CPacketKeepAlive; import game.packet.CPacketMessage; import game.packet.CPacketPlace; import game.packet.CPacketPlayer; import game.packet.CPacketSign; import game.packet.CPacketSkin; import game.packet.HPacketHandshake; import game.packet.LPacketPasswordResponse; import game.packet.RPacketDisconnect; import game.packet.RPacketEnableCompression; import game.packet.RPacketLoginSuccess; import game.packet.S14PacketEntity; import game.packet.S18PacketEntityTeleport; import game.packet.S19PacketEntityHeadLook; import game.packet.S1APacketEntityStatus; import game.packet.S1BPacketEntityAttach; import game.packet.S1CPacketEntityMetadata; import game.packet.S1DPacketEntityEffect; import game.packet.S1EPacketRemoveEntityEffect; import game.packet.S20PacketEntityProperties; import game.packet.S27PacketExplosion; import game.packet.S28PacketEffect; import game.packet.S29PacketSoundEffect; import game.packet.S2APacketParticles; import game.packet.S2BPacketChangeGameState; import game.packet.S2CPacketSpawnGlobalEntity; import game.packet.S2DPacketOpenWindow; import game.packet.S2EPacketCloseWindow; import game.packet.S2FPacketSetSlot; import game.packet.S30PacketWindowItems; import game.packet.S31PacketWindowProperty; import game.packet.S32PacketConfirmTransaction; import game.packet.S33PacketUpdateSign; import game.packet.S35PacketUpdateTileEntity; import game.packet.S36PacketSignEditorOpen; import game.packet.S38PacketPlayerListItem; import game.packet.S39PacketPlayerAbilities; import game.packet.S3APacketTabComplete; import game.packet.S43PacketUpdateEntityNBT; import game.packet.SPacketAnimation; import game.packet.SPacketBiomes; import game.packet.SPacketBlockAction; import game.packet.SPacketBlockBreakAnim; import game.packet.SPacketBlockChange; import game.packet.SPacketCamera; import game.packet.SPacketCharacterList; import game.packet.SPacketChunkData; import game.packet.SPacketCollectItem; import game.packet.SPacketDestroyEntities; import game.packet.SPacketDimensionName; import game.packet.SPacketDisconnect; import game.packet.SPacketEntityEquipment; import game.packet.SPacketEntityVelocity; import game.packet.SPacketHeldItemChange; import game.packet.SPacketJoinGame; import game.packet.SPacketKeepAlive; import game.packet.SPacketMapChunkBulk; import game.packet.SPacketMessage; import game.packet.SPacketMultiBlockChange; import game.packet.SPacketPlayerPosLook; import game.packet.SPacketRespawn; import game.packet.SPacketSetExperience; import game.packet.SPacketSkin; import game.packet.SPacketSpawnMob; import game.packet.SPacketSpawnObject; import game.packet.SPacketSpawnPlayer; import game.packet.SPacketTimeUpdate; import game.packet.SPacketTrades; import game.packet.SPacketUpdateHealth; import game.packet.SPacketWorld; public enum PacketRegistry { HANDSHAKE { { this.client(HPacketHandshake.class); } }, LOGIN { { this.server(RPacketDisconnect.class); this.server(RPacketLoginSuccess.class); this.server(RPacketEnableCompression.class); // this.server(RPacketPasswordRequest.class); // this.client(LPacketLoginStart.class); this.client(LPacketPasswordResponse.class); } }, PLAY { { this.server(SPacketKeepAlive.class); this.server(SPacketJoinGame.class); this.server(SPacketMessage.class); // this.server(SPacketMessage.class); this.server(SPacketTimeUpdate.class); this.server(SPacketEntityEquipment.class); this.server(SPacketUpdateHealth.class); this.server(SPacketRespawn.class); this.server(SPacketPlayerPosLook.class); this.server(SPacketHeldItemChange.class); this.server(SPacketAnimation.class); this.server(SPacketSpawnPlayer.class); this.server(SPacketCollectItem.class); this.server(SPacketSpawnObject.class); this.server(SPacketSpawnMob.class); // this.server(SPacketSpawnPainting.class); // this.server(SPacketSpawnExperienceOrb.class); this.server(SPacketEntityVelocity.class); this.server(SPacketDestroyEntities.class); this.server(S14PacketEntity.class); this.server(S14PacketEntity.S15PacketEntityRelMove.class); this.server(S14PacketEntity.S16PacketEntityLook.class); this.server(S14PacketEntity.S17PacketEntityLookMove.class); this.server(S18PacketEntityTeleport.class); this.server(S19PacketEntityHeadLook.class); this.server(S1APacketEntityStatus.class); this.server(S1BPacketEntityAttach.class); this.server(S1CPacketEntityMetadata.class); this.server(S1DPacketEntityEffect.class); this.server(S1EPacketRemoveEntityEffect.class); this.server(SPacketSetExperience.class); this.server(S20PacketEntityProperties.class); this.server(SPacketChunkData.class); this.server(SPacketMultiBlockChange.class); this.server(SPacketBlockChange.class); this.server(SPacketBlockAction.class); this.server(SPacketBlockBreakAnim.class); this.server(SPacketMapChunkBulk.class); this.server(S27PacketExplosion.class); this.server(S28PacketEffect.class); this.server(S29PacketSoundEffect.class); this.server(S2APacketParticles.class); this.server(S2BPacketChangeGameState.class); this.server(S2CPacketSpawnGlobalEntity.class); this.server(S2DPacketOpenWindow.class); this.server(S2EPacketCloseWindow.class); this.server(S2FPacketSetSlot.class); this.server(S30PacketWindowItems.class); this.server(S31PacketWindowProperty.class); this.server(S32PacketConfirmTransaction.class); this.server(S33PacketUpdateSign.class); // this.server(S34PacketMaps.class); this.server(S35PacketUpdateTileEntity.class); this.server(S36PacketSignEditorOpen.class); // this.server(S37PacketStatistics.class); this.server(S38PacketPlayerListItem.class); this.server(S39PacketPlayerAbilities.class); this.server(S3APacketTabComplete.class); // this.server(SPacketDisplay.class); this.server(SPacketSkin.class); this.server(SPacketDisconnect.class); this.server(SPacketWorld.class); // this.server(SPacketCapes.class); this.server(SPacketCamera.class); this.server(SPacketBiomes.class); // this.server(S42PacketTitle.class); this.server(S43PacketUpdateEntityNBT.class); // this.server(SPacketBook.class); this.server(SPacketTrades.class); // this.server(SPacketNotify.class); this.server(SPacketDimensionName.class); this.server(SPacketCharacterList.class); this.client(CPacketKeepAlive.class); this.client(CPacketMessage.class); this.client(CPacketAction.class); this.client(CPacketPlayer.class); this.client(CPacketPlayer.C04PacketPlayerPosition.class); this.client(CPacketPlayer.C05PacketPlayerLook.class); this.client(CPacketPlayer.C06PacketPlayerPosLook.class); this.client(CPacketBreak.class); this.client(CPacketPlace.class); this.client(CPacketInput.class); this.client(CPacketClick.class); this.client(CPacketCheat.class); this.client(CPacketComplete.class); this.client(CPacketSkin.class); this.client(CPacketSign.class); this.client(CPacketBook.class); // this.client(CPacketCmdBlock.class); } }; private static final Map, PacketRegistry> STATES = Maps., PacketRegistry>newHashMap(); private final BiMap> server = HashBiMap.>create(); private final BiMap> client = HashBiMap.>create(); protected void server(Class clazz) { if(this.server.containsValue(clazz)) throw new IllegalArgumentException("S-Paket " + clazz + " ist bereits bekannt unter ID " + this.server.inverse().get(clazz)); this.server.put(Integer.valueOf(this.server.size()), clazz); } protected void client(Class clazz) { if(this.client.containsValue(clazz)) throw new IllegalArgumentException("C-Paket " + clazz + " ist bereits bekannt unter ID " + this.client.inverse().get(clazz)); this.client.put(Integer.valueOf(this.client.size()), clazz); } public Integer getId(boolean client, Packet packet) { return (client ? this.client : this.server).inverse().get(packet.getClass()); } public Packet getPacket(boolean client, int id) throws InstantiationException, IllegalAccessException { Class oclass = (client ? this.client : this.server).get(id); return oclass == null ? null : oclass.newInstance(); } public static PacketRegistry getType(Packet packetIn) { return STATES.get(packetIn.getClass()); } static { for(PacketRegistry reg : values()) { for(BiMap> map : new BiMap[] {reg.server, reg.client}) { for(Class clazz : map.values()) { if(STATES.containsKey(clazz) && STATES.get(clazz) != reg) { throw new Error("Paket " + clazz + " ist bereits zu ID " + STATES.get(clazz) + " zugewiesen - kann nicht auf " + reg + " neu zuweisen"); } try { clazz.newInstance(); } catch(Throwable e) { throw new Error("Paket " + clazz + " kann nicht instanziert werden!"); } STATES.put(clazz, reg); } } } } }