package WayofTime.alchemicalWizardry.common; import io.netty.buffer.ByteBuf; import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import java.util.EnumMap; import net.minecraft.network.Packet; import net.minecraft.tileentity.TileEntity; import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; import WayofTime.alchemicalWizardry.AlchemicalWizardry; import WayofTime.alchemicalWizardry.common.tileEntity.TEAltar; import WayofTime.alchemicalWizardry.common.tileEntity.TEOrientable; import WayofTime.alchemicalWizardry.common.tileEntity.TEPedestal; import WayofTime.alchemicalWizardry.common.tileEntity.TEPlinth; import WayofTime.alchemicalWizardry.common.tileEntity.TESocket; import WayofTime.alchemicalWizardry.common.tileEntity.TETeleposer; import WayofTime.alchemicalWizardry.common.tileEntity.TEWritingTable; import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.common.network.FMLEmbeddedChannel; import cpw.mods.fml.common.network.FMLIndexedMessageToMessageCodec; import cpw.mods.fml.common.network.NetworkRegistry; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; /** * Handles the packet wrangling for IronChest * @author cpw * */ public enum NewPacketHandler { INSTANCE; /** * Our channel "pair" from {@link NetworkRegistry} */ private EnumMap channels; /** * Make our packet handler, and add an {@link IronChestCodec} always */ private NewPacketHandler() { // request a channel pair for IronChest from the network registry // Add the IronChestCodec as a member of both channel pipelines this.channels = NetworkRegistry.INSTANCE.newChannel("BloodMagic", new TEAltarCodec(), new TEOrientableCodec(), new TEPedestalCodec(), new TEPlinthCodec(), new TESocketCodec()); if (FMLCommonHandler.instance().getSide() == Side.CLIENT) { addClientHandler(); } } /** * This is only called on the client side - it adds an * {@link IronChestMessageHandler} to the client side pipeline, since the * only place we expect to handle messages is on the client. */ @SideOnly(Side.CLIENT) private void addClientHandler() { FMLEmbeddedChannel clientChannel = this.channels.get(Side.CLIENT); // These two lines find the existing codec (Ironchestcodec) and insert our message handler after it // in the pipeline String tileAltarCodec = clientChannel.findChannelHandlerNameForType(TEAltarCodec.class); clientChannel.pipeline().addAfter(tileAltarCodec, "TEAltarHandler", new TEAltarMessageHandler()); String tileOrientableCodec = clientChannel.findChannelHandlerNameForType(TEOrientableCodec.class); clientChannel.pipeline().addAfter(tileOrientableCodec, "TEOrientableHandler", new TEOrientableMessageHandler()); String tilePedestalCodec = clientChannel.findChannelHandlerNameForType(TEPedestalCodec.class); clientChannel.pipeline().addAfter(tilePedestalCodec, "TEPedestalHandler", new TEPedestalMessageHandler()); String tilePlinthCodec = clientChannel.findChannelHandlerNameForType(TEPlinthCodec.class); clientChannel.pipeline().addAfter(tilePlinthCodec, "TEPlinthHandler", new TEPlinthMessageHandler()); String tileSocketCodec = clientChannel.findChannelHandlerNameForType(TESocketCodec.class); clientChannel.pipeline().addAfter(tileSocketCodec, "TESocketHandler", new TESocketMessageHandler()); } /** * This class simply handles the {@link IronChestMessage} when it's received * at the client side It can contain client only code, because it's only run * on the client. * * @author cpw * */ private static class TEAltarMessageHandler extends SimpleChannelInboundHandler { @Override protected void channelRead0(ChannelHandlerContext ctx, TEAltarMessage msg) throws Exception { World world = AlchemicalWizardry.proxy.getClientWorld(); TileEntity te = world.getTileEntity(msg.x, msg.y, msg.z); if (te instanceof TEAltar) { TEAltar altar = (TEAltar) te; altar.handlePacketData(msg.items, msg.fluids, msg.capacity); } } } private static class TEOrientableMessageHandler extends SimpleChannelInboundHandler { @Override protected void channelRead0(ChannelHandlerContext ctx, TEOrientableMessage msg) throws Exception { World world = AlchemicalWizardry.proxy.getClientWorld(); TileEntity te = world.getTileEntity(msg.x, msg.y, msg.z); if (te instanceof TEOrientable) { TEOrientable tile = (TEOrientable)te; ((TEOrientable) te).setInputDirection(ForgeDirection.getOrientation(msg.input)); ((TEOrientable) te).setOutputDirection(ForgeDirection.getOrientation(msg.output)); } } } private static class TEPedestalMessageHandler extends SimpleChannelInboundHandler { @Override protected void channelRead0(ChannelHandlerContext ctx, TEPedestalMessage msg) throws Exception { World world = AlchemicalWizardry.proxy.getClientWorld(); TileEntity te = world.getTileEntity(msg.x, msg.y, msg.z); if (te instanceof TEPedestal) { TEPedestal pedestal = (TEPedestal) te; pedestal.handlePacketData(msg.items); } } } private static class TEPlinthMessageHandler extends SimpleChannelInboundHandler { @Override protected void channelRead0(ChannelHandlerContext ctx, TEPlinthMessage msg) throws Exception { World world = AlchemicalWizardry.proxy.getClientWorld(); TileEntity te = world.getTileEntity(msg.x, msg.y, msg.z); if (te instanceof TEPlinth) { TEPlinth Plinth = (TEPlinth) te; Plinth.handlePacketData(msg.items); } } } private static class TESocketMessageHandler extends SimpleChannelInboundHandler { @Override protected void channelRead0(ChannelHandlerContext ctx, TESocketMessage msg) throws Exception { World world = AlchemicalWizardry.proxy.getClientWorld(); TileEntity te = world.getTileEntity(msg.x, msg.y, msg.z); if (te instanceof TESocket) { TESocket Socket = (TESocket) te; Socket.handlePacketData(msg.items); } } } private static class TETeleposerMessageHandler extends SimpleChannelInboundHandler { @Override protected void channelRead0(ChannelHandlerContext ctx, TETeleposerMessage msg) throws Exception { World world = AlchemicalWizardry.proxy.getClientWorld(); TileEntity te = world.getTileEntity(msg.x, msg.y, msg.z); if (te instanceof TETeleposer) { TETeleposer Teleposer = (TETeleposer) te; Teleposer.handlePacketData(msg.items); } } } private static class TEWritingTableMessageHandler extends SimpleChannelInboundHandler { @Override protected void channelRead0(ChannelHandlerContext ctx, TEWritingTableMessage msg) throws Exception { World world = AlchemicalWizardry.proxy.getClientWorld(); TileEntity te = world.getTileEntity(msg.x, msg.y, msg.z); if (te instanceof TEWritingTable) { TEWritingTable WritingTable = (TEWritingTable) te; WritingTable.handlePacketData(msg.items); } } } public static class TEAltarMessage { int x; int y; int z; int[] items; int[] fluids; int capacity; } public static class TEOrientableMessage { int x; int y; int z; int input; int output; } public static class TEPedestalMessage { int x; int y; int z; int[] items; } public static class TEPlinthMessage { int x; int y; int z; int[] items; } public static class TESocketMessage { int x; int y; int z; int[] items; } public static class TETeleposerMessage { int x; int y; int z; int[] items; } public static class TEWritingTableMessage { int x; int y; int z; int[] items; } private class TEAltarCodec extends FMLIndexedMessageToMessageCodec { public TEAltarCodec() { addDiscriminator(0, TEAltarMessage.class); } @Override public void encodeInto(ChannelHandlerContext ctx, TEAltarMessage msg, ByteBuf target) throws Exception { target.writeInt(msg.x); target.writeInt(msg.y); target.writeInt(msg.z); target.writeBoolean(msg.items != null); if (msg.items != null) { int[] items = msg.items; for (int j = 0; j < items.length; j++) { int i = items[j]; target.writeInt(i); } } if(msg.fluids != null) { int[] fluids = msg.fluids; for (int j = 0; j < fluids.length; j++) { int i = fluids[j]; target.writeInt(i); } } target.writeInt(msg.capacity); } @Override public void decodeInto(ChannelHandlerContext ctx, ByteBuf dat, TEAltarMessage msg) { msg.x = dat.readInt(); msg.y = dat.readInt(); msg.z = dat.readInt(); int typDat = dat.readByte(); boolean hasStacks = dat.readBoolean(); msg.items = new int[TEAltar.sizeInv*3]; if (hasStacks) { msg.items = new int[TEAltar.sizeInv*3]; for (int i = 0; i < msg.items.length; i++) { msg.items[i] = dat.readInt(); } } msg.fluids = new int[6]; for (int i = 0; i < msg.fluids.length; i++) { msg.fluids[i] = dat.readInt(); } msg.capacity = dat.readInt(); } } private class TEOrientableCodec extends FMLIndexedMessageToMessageCodec { public TEOrientableCodec() { addDiscriminator(0, TEOrientableMessage.class); } @Override public void encodeInto(ChannelHandlerContext ctx, TEOrientableMessage msg, ByteBuf target) throws Exception { target.writeInt(msg.x); target.writeInt(msg.y); target.writeInt(msg.z); target.writeInt(msg.input); target.writeInt(msg.output); } @Override public void decodeInto(ChannelHandlerContext ctx, ByteBuf dat, TEOrientableMessage msg) { msg.x = dat.readInt(); msg.y = dat.readInt(); msg.z = dat.readInt(); msg.input = dat.readInt(); msg.output = dat.readInt(); } } private class TEPedestalCodec extends FMLIndexedMessageToMessageCodec { public TEPedestalCodec() { addDiscriminator(0, TEPedestalMessage.class); } @Override public void encodeInto(ChannelHandlerContext ctx, TEPedestalMessage msg, ByteBuf target) throws Exception { target.writeInt(msg.x); target.writeInt(msg.y); target.writeInt(msg.z); target.writeBoolean(msg.items != null); if (msg.items != null) { int[] items = msg.items; for (int j = 0; j < items.length; j++) { int i = items[j]; target.writeInt(i); } } } @Override public void decodeInto(ChannelHandlerContext ctx, ByteBuf dat, TEPedestalMessage msg) { msg.x = dat.readInt(); msg.y = dat.readInt(); msg.z = dat.readInt(); int typDat = dat.readByte(); boolean hasStacks = dat.readBoolean(); msg.items = new int[TEPedestal.sizeInv*3]; if (hasStacks) { msg.items = new int[TEPedestal.sizeInv*3]; for (int i = 0; i < msg.items.length; i++) { msg.items[i] = dat.readInt(); } } } } private class TEPlinthCodec extends FMLIndexedMessageToMessageCodec { public TEPlinthCodec() { addDiscriminator(0, TEPlinthMessage.class); } @Override public void encodeInto(ChannelHandlerContext ctx, TEPlinthMessage msg, ByteBuf target) throws Exception { target.writeInt(msg.x); target.writeInt(msg.y); target.writeInt(msg.z); target.writeBoolean(msg.items != null); if (msg.items != null) { int[] items = msg.items; for (int j = 0; j < items.length; j++) { int i = items[j]; target.writeInt(i); } } } @Override public void decodeInto(ChannelHandlerContext ctx, ByteBuf dat, TEPlinthMessage msg) { msg.x = dat.readInt(); msg.y = dat.readInt(); msg.z = dat.readInt(); int typDat = dat.readByte(); boolean hasStacks = dat.readBoolean(); msg.items = new int[TEPlinth.sizeInv*3]; if (hasStacks) { msg.items = new int[TEPlinth.sizeInv*3]; for (int i = 0; i < msg.items.length; i++) { msg.items[i] = dat.readInt(); } } } } private class TESocketCodec extends FMLIndexedMessageToMessageCodec { public TESocketCodec() { addDiscriminator(0, TESocketMessage.class); } @Override public void encodeInto(ChannelHandlerContext ctx, TESocketMessage msg, ByteBuf target) throws Exception { target.writeInt(msg.x); target.writeInt(msg.y); target.writeInt(msg.z); target.writeBoolean(msg.items != null); if (msg.items != null) { int[] items = msg.items; for (int j = 0; j < items.length; j++) { int i = items[j]; target.writeInt(i); } } } @Override public void decodeInto(ChannelHandlerContext ctx, ByteBuf dat, TESocketMessage msg) { msg.x = dat.readInt(); msg.y = dat.readInt(); msg.z = dat.readInt(); int typDat = dat.readByte(); boolean hasStacks = dat.readBoolean(); msg.items = new int[TESocket.sizeInv*3]; if (hasStacks) { msg.items = new int[TESocket.sizeInv*3]; for (int i = 0; i < msg.items.length; i++) { msg.items[i] = dat.readInt(); } } } } private class TETeleposerCodec extends FMLIndexedMessageToMessageCodec { public TETeleposerCodec() { addDiscriminator(0, TETeleposerMessage.class); } @Override public void encodeInto(ChannelHandlerContext ctx, TETeleposerMessage msg, ByteBuf target) throws Exception { target.writeInt(msg.x); target.writeInt(msg.y); target.writeInt(msg.z); target.writeBoolean(msg.items != null); if (msg.items != null) { int[] items = msg.items; for (int j = 0; j < items.length; j++) { int i = items[j]; target.writeInt(i); } } } @Override public void decodeInto(ChannelHandlerContext ctx, ByteBuf dat, TETeleposerMessage msg) { msg.x = dat.readInt(); msg.y = dat.readInt(); msg.z = dat.readInt(); int typDat = dat.readByte(); boolean hasStacks = dat.readBoolean(); msg.items = new int[TETeleposer.sizeInv*3]; if (hasStacks) { msg.items = new int[TETeleposer.sizeInv*3]; for (int i = 0; i < msg.items.length; i++) { msg.items[i] = dat.readInt(); } } } } private class TEWritingTableCodec extends FMLIndexedMessageToMessageCodec { public TEWritingTableCodec() { addDiscriminator(0, TEWritingTableMessage.class); } @Override public void encodeInto(ChannelHandlerContext ctx, TEWritingTableMessage msg, ByteBuf target) throws Exception { target.writeInt(msg.x); target.writeInt(msg.y); target.writeInt(msg.z); target.writeBoolean(msg.items != null); if (msg.items != null) { int[] items = msg.items; for (int j = 0; j < items.length; j++) { int i = items[j]; target.writeInt(i); } } } @Override public void decodeInto(ChannelHandlerContext ctx, ByteBuf dat, TEWritingTableMessage msg) { msg.x = dat.readInt(); msg.y = dat.readInt(); msg.z = dat.readInt(); int typDat = dat.readByte(); boolean hasStacks = dat.readBoolean(); msg.items = new int[TEWritingTable.sizeInv*3]; if (hasStacks) { msg.items = new int[TEWritingTable.sizeInv*3]; for (int i = 0; i < msg.items.length; i++) { msg.items[i] = dat.readInt(); } } } } //Packets to be obtained public static Packet getPacket(TEAltar tileAltar) { TEAltarMessage msg = new TEAltarMessage(); msg.x = tileAltar.xCoord; msg.y = tileAltar.yCoord; msg.z = tileAltar.zCoord; msg.items = tileAltar.buildIntDataList(); msg.fluids = tileAltar.buildFluidList(); msg.capacity = tileAltar.getCapacity(); return INSTANCE.channels.get(Side.SERVER).generatePacketFrom(msg); } public static Packet getPacket(TEOrientable tileOrientable) { TEOrientableMessage msg = new TEOrientableMessage(); msg.x = tileOrientable.xCoord; msg.y = tileOrientable.yCoord; msg.z = tileOrientable.zCoord; msg.input = tileOrientable.getIntForForgeDirection(tileOrientable.getInputDirection()); msg.output = tileOrientable.getIntForForgeDirection(tileOrientable.getOutputDirection()); return INSTANCE.channels.get(Side.SERVER).generatePacketFrom(msg); } public static Packet getPacket(TEPedestal tilePedestal) { TEPedestalMessage msg = new TEPedestalMessage(); msg.x = tilePedestal.xCoord; msg.y = tilePedestal.yCoord; msg.z = tilePedestal.zCoord; msg.items = tilePedestal.buildIntDataList(); return INSTANCE.channels.get(Side.SERVER).generatePacketFrom(msg); } public static Packet getPacket(TEPlinth tilePlinth) { TEPlinthMessage msg = new TEPlinthMessage(); msg.x = tilePlinth.xCoord; msg.y = tilePlinth.yCoord; msg.z = tilePlinth.zCoord; msg.items = tilePlinth.buildIntDataList(); return INSTANCE.channels.get(Side.SERVER).generatePacketFrom(msg); } public static Packet getPacket(TESocket tileSocket) { TESocketMessage msg = new TESocketMessage(); msg.x = tileSocket.xCoord; msg.y = tileSocket.yCoord; msg.z = tileSocket.zCoord; msg.items = tileSocket.buildIntDataList(); return INSTANCE.channels.get(Side.SERVER).generatePacketFrom(msg); } public static Packet getPacket(TETeleposer tileTeleposer) { TETeleposerMessage msg = new TETeleposerMessage(); msg.x = tileTeleposer.xCoord; msg.y = tileTeleposer.yCoord; msg.z = tileTeleposer.zCoord; msg.items = tileTeleposer.buildIntDataList(); return INSTANCE.channels.get(Side.SERVER).generatePacketFrom(msg); } public static Packet getPacket(TEWritingTable tileWritingTable) { TEWritingTableMessage msg = new TEWritingTableMessage(); msg.x = tileWritingTable.xCoord; msg.y = tileWritingTable.yCoord; msg.z = tileWritingTable.zCoord; msg.items = tileWritingTable.buildIntDataList(); return INSTANCE.channels.get(Side.SERVER).generatePacketFrom(msg); } }