diff --git a/src/main/java/com/raoulvdberge/refinedstorage/api/IRSAPI.java b/src/main/java/com/raoulvdberge/refinedstorage/api/IRSAPI.java index 1e916b8b2..6f377d7ae 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/api/IRSAPI.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/api/IRSAPI.java @@ -4,6 +4,8 @@ import com.raoulvdberge.refinedstorage.api.autocrafting.craftingmonitor.ICraftin import com.raoulvdberge.refinedstorage.api.autocrafting.craftingmonitor.ICraftingMonitorElementRegistry; import com.raoulvdberge.refinedstorage.api.autocrafting.preview.ICraftingPreviewElementRegistry; import com.raoulvdberge.refinedstorage.api.autocrafting.registry.ICraftingTaskRegistry; +import com.raoulvdberge.refinedstorage.api.network.readerwriter.IReaderWriterChannel; +import com.raoulvdberge.refinedstorage.api.network.readerwriter.IReaderWriterHandlerRegistry; import com.raoulvdberge.refinedstorage.api.solderer.ISoldererRegistry; import com.raoulvdberge.refinedstorage.api.util.IComparer; import com.raoulvdberge.refinedstorage.api.util.IFluidStackList; @@ -48,6 +50,18 @@ public interface IRSAPI { @Nonnull ICraftingPreviewElementRegistry getCraftingPreviewElementRegistry(); + /** + * @return the reader writer handler registry + */ + @Nonnull + IReaderWriterHandlerRegistry getReaderWriterHandlerRegistry(); + + /** + * @return a new reader writer channel + */ + @Nonnull + IReaderWriterChannel createReaderWriterChannel(); + /** * @return an empty item stack list */ diff --git a/src/main/java/com/raoulvdberge/refinedstorage/api/network/INetworkMaster.java b/src/main/java/com/raoulvdberge/refinedstorage/api/network/INetworkMaster.java index cef88c899..9094048f7 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/api/network/INetworkMaster.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/api/network/INetworkMaster.java @@ -6,6 +6,7 @@ import com.raoulvdberge.refinedstorage.api.autocrafting.task.ICraftingTask; import com.raoulvdberge.refinedstorage.api.network.grid.IFluidGridHandler; import com.raoulvdberge.refinedstorage.api.network.grid.IItemGridHandler; import com.raoulvdberge.refinedstorage.api.network.item.INetworkItemHandler; +import com.raoulvdberge.refinedstorage.api.network.readerwriter.IReaderWriterChannel; import com.raoulvdberge.refinedstorage.api.storage.fluid.IFluidStorageCache; import com.raoulvdberge.refinedstorage.api.storage.item.IItemStorageCache; import com.raoulvdberge.refinedstorage.api.util.IComparer; @@ -19,6 +20,7 @@ import net.minecraftforge.fluids.FluidStack; import javax.annotation.Nonnull; import javax.annotation.Nullable; import java.util.List; +import java.util.Map; /** * Represents a network master, usually is a controller. @@ -225,6 +227,11 @@ public interface INetworkMaster { */ void sendCraftingMonitorUpdate(EntityPlayerMP player); + /** + * @return a map with the reader and writer channels + */ + Map getReaderWriterChannels(); + /** * Inserts an item in this network. * diff --git a/src/main/java/com/raoulvdberge/refinedstorage/api/network/readerwriter/IReader.java b/src/main/java/com/raoulvdberge/refinedstorage/api/network/readerwriter/IReader.java new file mode 100755 index 000000000..f34620688 --- /dev/null +++ b/src/main/java/com/raoulvdberge/refinedstorage/api/network/readerwriter/IReader.java @@ -0,0 +1,7 @@ +package com.raoulvdberge.refinedstorage.api.network.readerwriter; + +import com.raoulvdberge.refinedstorage.api.network.INetworkNode; + +public interface IReader extends INetworkNode { + int getRedstoneStrength(); +} diff --git a/src/main/java/com/raoulvdberge/refinedstorage/api/network/readerwriter/IReaderWriterChannel.java b/src/main/java/com/raoulvdberge/refinedstorage/api/network/readerwriter/IReaderWriterChannel.java new file mode 100755 index 000000000..8d218386b --- /dev/null +++ b/src/main/java/com/raoulvdberge/refinedstorage/api/network/readerwriter/IReaderWriterChannel.java @@ -0,0 +1,15 @@ +package com.raoulvdberge.refinedstorage.api.network.readerwriter; + +import net.minecraft.nbt.NBTTagCompound; + +import java.util.List; + +public interface IReaderWriterChannel { + void addHandlers(); + + List getHandlers(); + + NBTTagCompound writeToNBT(NBTTagCompound tag); + + void readFromNBT(NBTTagCompound tag); +} diff --git a/src/main/java/com/raoulvdberge/refinedstorage/api/network/readerwriter/IReaderWriterHandler.java b/src/main/java/com/raoulvdberge/refinedstorage/api/network/readerwriter/IReaderWriterHandler.java new file mode 100755 index 000000000..d5cd46e07 --- /dev/null +++ b/src/main/java/com/raoulvdberge/refinedstorage/api/network/readerwriter/IReaderWriterHandler.java @@ -0,0 +1,12 @@ +package com.raoulvdberge.refinedstorage.api.network.readerwriter; + +import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.common.capabilities.ICapabilityProvider; + +public interface IReaderWriterHandler extends ICapabilityProvider { + void update(IReader reader, IWriter writer); + + NBTTagCompound writeToNBT(NBTTagCompound tag); + + String getId(); +} diff --git a/src/main/java/com/raoulvdberge/refinedstorage/api/network/readerwriter/IReaderWriterHandlerFactory.java b/src/main/java/com/raoulvdberge/refinedstorage/api/network/readerwriter/IReaderWriterHandlerFactory.java new file mode 100755 index 000000000..0967bcb9b --- /dev/null +++ b/src/main/java/com/raoulvdberge/refinedstorage/api/network/readerwriter/IReaderWriterHandlerFactory.java @@ -0,0 +1,11 @@ +package com.raoulvdberge.refinedstorage.api.network.readerwriter; + +import net.minecraft.nbt.NBTTagCompound; + +import javax.annotation.Nonnull; +import javax.annotation.Nullable; + +public interface IReaderWriterHandlerFactory { + @Nonnull + IReaderWriterHandler create(@Nullable NBTTagCompound tag); +} diff --git a/src/main/java/com/raoulvdberge/refinedstorage/api/network/readerwriter/IReaderWriterHandlerRegistry.java b/src/main/java/com/raoulvdberge/refinedstorage/api/network/readerwriter/IReaderWriterHandlerRegistry.java new file mode 100755 index 000000000..52cea1503 --- /dev/null +++ b/src/main/java/com/raoulvdberge/refinedstorage/api/network/readerwriter/IReaderWriterHandlerRegistry.java @@ -0,0 +1,13 @@ +package com.raoulvdberge.refinedstorage.api.network.readerwriter; + +import javax.annotation.Nullable; +import java.util.Collection; + +public interface IReaderWriterHandlerRegistry { + void add(String id, IReaderWriterHandlerFactory factory); + + @Nullable + IReaderWriterHandlerFactory getFactory(String id); + + Collection getFactories(); +} diff --git a/src/main/java/com/raoulvdberge/refinedstorage/api/network/readerwriter/IWriter.java b/src/main/java/com/raoulvdberge/refinedstorage/api/network/readerwriter/IWriter.java new file mode 100755 index 000000000..172d6997d --- /dev/null +++ b/src/main/java/com/raoulvdberge/refinedstorage/api/network/readerwriter/IWriter.java @@ -0,0 +1,14 @@ +package com.raoulvdberge.refinedstorage.api.network.readerwriter; + +import com.raoulvdberge.refinedstorage.api.network.INetworkNode; +import net.minecraft.util.EnumFacing; + +public interface IWriter extends INetworkNode { + int getRedstoneStrength(); + + void setRedstoneStrength(int strength); + + EnumFacing getDirection(); + + boolean hasStackUpgrade(); +} diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/API.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/API.java index 995609a54..9a47fe070 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/API.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/API.java @@ -6,6 +6,7 @@ import com.raoulvdberge.refinedstorage.api.autocrafting.craftingmonitor.ICraftin import com.raoulvdberge.refinedstorage.api.autocrafting.craftingmonitor.ICraftingMonitorElementRegistry; import com.raoulvdberge.refinedstorage.api.autocrafting.preview.ICraftingPreviewElementRegistry; import com.raoulvdberge.refinedstorage.api.autocrafting.registry.ICraftingTaskRegistry; +import com.raoulvdberge.refinedstorage.api.network.readerwriter.IReaderWriterHandlerRegistry; import com.raoulvdberge.refinedstorage.api.solderer.ISoldererRegistry; import com.raoulvdberge.refinedstorage.api.util.IComparer; import com.raoulvdberge.refinedstorage.api.util.IFluidStackList; @@ -14,6 +15,7 @@ import com.raoulvdberge.refinedstorage.apiimpl.autocrafting.craftingmonitor.Craf import com.raoulvdberge.refinedstorage.apiimpl.autocrafting.craftingmonitor.CraftingMonitorElementRegistry; import com.raoulvdberge.refinedstorage.apiimpl.autocrafting.preview.CraftingPreviewElementRegistry; import com.raoulvdberge.refinedstorage.apiimpl.autocrafting.registry.CraftingTaskRegistry; +import com.raoulvdberge.refinedstorage.apiimpl.network.readerwriter.ReaderWriterHandlerRegistry; import com.raoulvdberge.refinedstorage.apiimpl.solderer.SoldererRegistry; import com.raoulvdberge.refinedstorage.apiimpl.util.Comparer; import com.raoulvdberge.refinedstorage.apiimpl.util.FluidStackList; @@ -34,6 +36,7 @@ public class API implements IRSAPI { private ICraftingTaskRegistry craftingTaskRegistry = new CraftingTaskRegistry(); private ICraftingMonitorElementRegistry craftingMonitorElementRegistry = new CraftingMonitorElementRegistry(); private ICraftingPreviewElementRegistry craftingPreviewElementRegistry = new CraftingPreviewElementRegistry(); + private IReaderWriterHandlerRegistry readerWriterHandlerRegistry = new ReaderWriterHandlerRegistry(); @Nonnull @Override @@ -65,6 +68,12 @@ public class API implements IRSAPI { return craftingPreviewElementRegistry; } + @Nonnull + @Override + public IReaderWriterHandlerRegistry getReaderWriterHandlerRegistry() { + return readerWriterHandlerRegistry; + } + @Nonnull @Override public IItemStackList createItemStackList() { diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/readerwriter/ReaderWriterChannel.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/readerwriter/ReaderWriterChannel.java new file mode 100755 index 000000000..f04af3dac --- /dev/null +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/readerwriter/ReaderWriterChannel.java @@ -0,0 +1,68 @@ +package com.raoulvdberge.refinedstorage.apiimpl.network.readerwriter; + +import com.raoulvdberge.refinedstorage.api.network.readerwriter.IReaderWriterChannel; +import com.raoulvdberge.refinedstorage.api.network.readerwriter.IReaderWriterHandler; +import com.raoulvdberge.refinedstorage.api.network.readerwriter.IReaderWriterHandlerFactory; +import com.raoulvdberge.refinedstorage.apiimpl.API; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraftforge.common.util.Constants; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +public class ReaderWriterChannel implements IReaderWriterChannel { + private static final String NBT_HANDLER_ID = "HandlerID"; + private static final String NBT_HANDLERS = "Handlers"; + + private List handlers = new ArrayList<>(); + + @Override + public void addHandlers() { + handlers.addAll(API.instance().getReaderWriterHandlerRegistry().getFactories().stream().map(f -> f.create(null)).collect(Collectors.toList())); + } + + @Override + public List getHandlers() { + return handlers; + } + + @Override + public NBTTagCompound writeToNBT(NBTTagCompound tag) { + NBTTagList handlersList = new NBTTagList(); + + for (IReaderWriterHandler handler : handlers) { + NBTTagCompound handlerTag = handler.writeToNBT(new NBTTagCompound()); + + handlerTag.setString(NBT_HANDLER_ID, handler.getId()); + + handlersList.appendTag(handlerTag); + } + + tag.setTag(NBT_HANDLERS, handlersList); + + return tag; + } + + @Override + public void readFromNBT(NBTTagCompound tag) { + if (!tag.hasKey(NBT_HANDLER_ID)) { + return; + } + + NBTTagList handlersList = tag.getTagList(NBT_HANDLERS, Constants.NBT.TAG_COMPOUND); + + for (int i = 0; i < handlersList.tagCount(); ++i) { + NBTTagCompound handlerTag = handlersList.getCompoundTagAt(i); + + String id = handlerTag.getString(NBT_HANDLER_ID); + + IReaderWriterHandlerFactory factory = API.instance().getReaderWriterHandlerRegistry().getFactory(id); + + if (factory != null) { + handlers.add(factory.create(tag)); + } + } + } +} diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/readerwriter/ReaderWriterHandlerItems.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/readerwriter/ReaderWriterHandlerItems.java new file mode 100755 index 000000000..f4b4e7f71 --- /dev/null +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/readerwriter/ReaderWriterHandlerItems.java @@ -0,0 +1,90 @@ +package com.raoulvdberge.refinedstorage.apiimpl.network.readerwriter; + +import com.raoulvdberge.refinedstorage.RSUtils; +import com.raoulvdberge.refinedstorage.api.network.readerwriter.IReader; +import com.raoulvdberge.refinedstorage.api.network.readerwriter.IReaderWriterHandler; +import com.raoulvdberge.refinedstorage.api.network.readerwriter.IWriter; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.util.EnumFacing; +import net.minecraftforge.common.capabilities.Capability; +import net.minecraftforge.items.CapabilityItemHandler; +import net.minecraftforge.items.IItemHandler; +import net.minecraftforge.items.ItemHandlerHelper; +import net.minecraftforge.items.ItemStackHandler; + +import javax.annotation.Nullable; + +public class ReaderWriterHandlerItems implements IReaderWriterHandler { + public static final String ID = "items"; + + private ItemStackHandler internalInv; + + public ReaderWriterHandlerItems(@Nullable NBTTagCompound tag) { + this.internalInv = new ItemHandlerReaderWriter(4); + + if (tag != null) { + RSUtils.readItems(internalInv, 0, tag); + } + } + + @Override + public void update(IReader reader, IWriter writer) { + IItemHandler handler = RSUtils.getItemHandler(writer.getNodeWorld().getTileEntity(writer.getPosition().offset(writer.getDirection())), writer.getDirection().getOpposite()); + + if (handler != null) { + for (int i = 0; i < internalInv.getSlots(); ++i) { + ItemStack slot = internalInv.getStackInSlot(i); + + if (slot != null) { + ItemStack toInsert = ItemHandlerHelper.copyStackWithSize(slot, writer.hasStackUpgrade() ? 64 : 1); + + if (ItemHandlerHelper.insertItem(handler, toInsert, true) == null) { + ItemHandlerHelper.insertItem(handler, toInsert, false); + + internalInv.getStackInSlot(i).stackSize -= toInsert.stackSize; + + if (internalInv.getStackInSlot(i).stackSize <= 0) { + internalInv.setStackInSlot(i, null); + } + } + + break; + } + } + } + } + + @Override + public NBTTagCompound writeToNBT(NBTTagCompound tag) { + RSUtils.writeItems(internalInv, 0, tag); + + return tag; + } + + @Override + public String getId() { + return ID; + } + + @Override + public boolean hasCapability(Capability capability, @Nullable EnumFacing facing) { + return capability == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY; + } + + @Override + public T getCapability(Capability capability, @Nullable EnumFacing facing) { + return (T) internalInv; + } + + private class ItemHandlerReaderWriter extends ItemStackHandler { + private ItemHandlerReaderWriter(int size) { + super(size); + } + + @Override + public ItemStack extractItem(int slot, int amount, boolean simulate) { + return null; + } + } +} diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/readerwriter/ReaderWriterHandlerRegistry.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/readerwriter/ReaderWriterHandlerRegistry.java new file mode 100755 index 000000000..7486d2ccc --- /dev/null +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/readerwriter/ReaderWriterHandlerRegistry.java @@ -0,0 +1,29 @@ +package com.raoulvdberge.refinedstorage.apiimpl.network.readerwriter; + +import com.raoulvdberge.refinedstorage.api.network.readerwriter.IReaderWriterHandlerFactory; +import com.raoulvdberge.refinedstorage.api.network.readerwriter.IReaderWriterHandlerRegistry; + +import javax.annotation.Nullable; +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; + +public class ReaderWriterHandlerRegistry implements IReaderWriterHandlerRegistry { + private Map factories = new HashMap<>(); + + @Override + public void add(String id, IReaderWriterHandlerFactory factory) { + factories.put(id, factory); + } + + @Nullable + @Override + public IReaderWriterHandlerFactory getFactory(String id) { + return factories.get(id); + } + + @Override + public Collection getFactories() { + return factories.values(); + } +} diff --git a/src/main/java/com/raoulvdberge/refinedstorage/proxy/ProxyCommon.java b/src/main/java/com/raoulvdberge/refinedstorage/proxy/ProxyCommon.java index 71773acc2..61dd308b8 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/proxy/ProxyCommon.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/proxy/ProxyCommon.java @@ -9,6 +9,7 @@ import com.raoulvdberge.refinedstorage.apiimpl.autocrafting.craftingmonitor.*; import com.raoulvdberge.refinedstorage.apiimpl.autocrafting.preview.CraftingPreviewElementFluidStack; import com.raoulvdberge.refinedstorage.apiimpl.autocrafting.preview.CraftingPreviewElementItemStack; import com.raoulvdberge.refinedstorage.apiimpl.autocrafting.registry.CraftingTaskFactory; +import com.raoulvdberge.refinedstorage.apiimpl.network.readerwriter.ReaderWriterHandlerItems; import com.raoulvdberge.refinedstorage.apiimpl.solderer.*; import com.raoulvdberge.refinedstorage.apiimpl.storage.fluid.FluidStorageNBT; import com.raoulvdberge.refinedstorage.apiimpl.storage.item.ItemStorageNBT; @@ -73,6 +74,8 @@ public class ProxyCommon { API.instance().getCraftingPreviewElementRegistry().add(CraftingPreviewElementItemStack.ID, CraftingPreviewElementItemStack::fromByteBuf); API.instance().getCraftingPreviewElementRegistry().add(CraftingPreviewElementFluidStack.ID, CraftingPreviewElementFluidStack::fromByteBuf); + API.instance().getReaderWriterHandlerRegistry().add(ReaderWriterHandlerItems.ID, tag -> new ReaderWriterHandlerItems(tag)); + int id = 0; RS.INSTANCE.network.registerMessage(MessageTileDataParameter.class, MessageTileDataParameter.class, id++, Side.CLIENT); diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileController.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileController.java index b07007035..4c4bec700 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileController.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileController.java @@ -18,6 +18,7 @@ import com.raoulvdberge.refinedstorage.api.network.INetworkNodeGraph; import com.raoulvdberge.refinedstorage.api.network.grid.IFluidGridHandler; import com.raoulvdberge.refinedstorage.api.network.grid.IItemGridHandler; import com.raoulvdberge.refinedstorage.api.network.item.INetworkItemHandler; +import com.raoulvdberge.refinedstorage.api.network.readerwriter.IReaderWriterChannel; import com.raoulvdberge.refinedstorage.api.storage.AccessType; import com.raoulvdberge.refinedstorage.api.storage.IStorage; import com.raoulvdberge.refinedstorage.api.storage.fluid.IFluidStorage; @@ -141,6 +142,9 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR private static final String NBT_CRAFTING_TASKS = "CraftingTasks"; + private static final String NBT_READER_WRITER_CHANNELS = "ReaderWriterChannels"; + private static final String NBT_READER_WRITER_NAME = "Name"; + private static final Comparator CLIENT_NODE_COMPARATOR = (left, right) -> { if (left.getEnergyUsage() == right.getEnergyUsage()) { return 0; @@ -165,6 +169,8 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR private IItemStorageCache itemStorage = new ItemStorageCache(this); private IFluidStorageCache fluidStorage = new FluidStorageCache(this); + private Map readerWriterChannels = new HashMap<>(); + private List patterns = new ArrayList<>(); private List craftingTasks = new ArrayList<>(); @@ -278,10 +284,10 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR if (craftingTasksChanged) { craftingMonitorUpdateRequested = true; } + } - if (!craftingTasks.isEmpty()) { - markDirty(); - } + if (!craftingTasks.isEmpty() || !readerWriterChannels.isEmpty()) { + markDirty(); } if (craftingMonitorUpdateRequested) { @@ -550,6 +556,11 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR RS.INSTANCE.network.sendTo(new MessageCraftingMonitorElements(getElements()), player); } + @Override + public Map getReaderWriterChannels() { + return readerWriterChannels; + } + private List getElements() { return craftingTasks.stream().flatMap(t -> t.getCraftingMonitorElements().stream()).collect(Collectors.toList()); } @@ -797,6 +808,20 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR craftingTasksToRead.add(taskList.getCompoundTagAt(i)); } } + + if (tag.hasKey(NBT_READER_WRITER_CHANNELS)) { + NBTTagList readerWriterChannelsList = tag.getTagList(NBT_READER_WRITER_CHANNELS, Constants.NBT.TAG_COMPOUND); + + for (int i = 0; i < readerWriterChannelsList.tagCount(); ++i) { + NBTTagCompound channelTag = readerWriterChannelsList.getCompoundTagAt(i); + + IReaderWriterChannel channel = API.instance().createReaderWriterChannel(); + + channel.readFromNBT(channelTag); + + readerWriterChannels.put(channelTag.getString(NBT_READER_WRITER_NAME), channel); + } + } } @Override @@ -807,13 +832,25 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR redstoneMode.write(tag); - NBTTagList list = new NBTTagList(); + NBTTagList craftingTaskList = new NBTTagList(); for (ICraftingTask task : craftingTasks) { - list.appendTag(task.writeToNBT(new NBTTagCompound())); + craftingTaskList.appendTag(task.writeToNBT(new NBTTagCompound())); } - tag.setTag(NBT_CRAFTING_TASKS, list); + tag.setTag(NBT_CRAFTING_TASKS, craftingTaskList); + + NBTTagList readerWriterChannelsList = new NBTTagList(); + + for (Map.Entry entry : readerWriterChannels.entrySet()) { + NBTTagCompound channelTag = entry.getValue().writeToNBT(new NBTTagCompound()); + + channelTag.setString(NBT_READER_WRITER_NAME, entry.getKey()); + + readerWriterChannelsList.appendTag(channelTag); + } + + tag.setTag(NBT_READER_WRITER_CHANNELS, readerWriterChannelsList); return tag; }