package crazypants.enderio.conduit.gui.item; import io.netty.buffer.ByteBuf; import java.util.List; import net.minecraft.item.ItemStack; import net.minecraftforge.common.util.ForgeDirection; import cpw.mods.fml.common.network.simpleimpl.IMessage; import cpw.mods.fml.common.network.simpleimpl.IMessageHandler; import cpw.mods.fml.common.network.simpleimpl.MessageContext; import crazypants.enderio.conduit.item.IItemConduit; import crazypants.enderio.conduit.item.ItemConduitNetwork; import crazypants.enderio.conduit.item.NetworkedInventory; import crazypants.enderio.conduit.item.filter.ExistingItemFilter; import crazypants.enderio.conduit.packet.AbstractConduitPacket; import crazypants.enderio.conduit.packet.ConTypeEnum; public class PacketExistingItemFilterSnapshot extends AbstractConduitPacket<IItemConduit> implements IMessageHandler<PacketExistingItemFilterSnapshot, IMessage> { public static enum Opcode { CLEAR, SET, MERGE, SET_BLACK, UNSET_BLACK } private ForgeDirection dir; private Opcode opcode; private boolean isInput; public PacketExistingItemFilterSnapshot() { } public PacketExistingItemFilterSnapshot(IItemConduit con, ForgeDirection dir, boolean isInput, Opcode opcode) { super(con.getBundle().getEntity(), ConTypeEnum.ITEM); this.dir = dir; this.isInput= isInput; this.opcode = opcode; } @Override public void fromBytes(ByteBuf buf) { super.fromBytes(buf); dir = ForgeDirection.values()[buf.readShort()]; isInput = buf.readBoolean(); opcode = Opcode.values()[buf.readByte() & 255]; } @Override public void toBytes(ByteBuf buf) { super.toBytes(buf); buf.writeShort(dir.ordinal()); buf.writeBoolean(isInput); buf.writeByte(opcode.ordinal()); } @Override public PacketExistingItemFilterSnapshot onMessage(PacketExistingItemFilterSnapshot message, MessageContext ctx) { IItemConduit conduit = message.getTileCasted(ctx); if(conduit == null) { return null; } ExistingItemFilter filter; if(message.isInput) { filter = (ExistingItemFilter)conduit.getInputFilter(message.dir); } else { filter = (ExistingItemFilter)conduit.getOutputFilter(message.dir); } switch (message.opcode) { case CLEAR: filter.setSnapshot((List<ItemStack>)null); System.out.println("PacketExistingItemFilterSnapshot.onMessage: Cleared snapshot"); break; case SET: { ItemConduitNetwork icn = (ItemConduitNetwork)conduit.getNetwork(); NetworkedInventory inv = icn.getInventory(conduit, message.dir); inv.updateInventory(); filter.setSnapshot(inv); break; } case MERGE: { ItemConduitNetwork icn = (ItemConduitNetwork)conduit.getNetwork(); NetworkedInventory inv = icn.getInventory(conduit, message.dir); filter.mergeSnapshot(inv); break; } case SET_BLACK: filter.setBlacklist(true); break; case UNSET_BLACK: filter.setBlacklist(false); break; default: throw new AssertionError(); } if(message.isInput) { conduit.setInputFilter(message.dir, filter); } else { conduit.setOutputFilter(message.dir, filter); } return null; } }