Add reader / writer API

This commit is contained in:
Raoul Van den Berge
2016-11-10 23:48:40 +01:00
parent bdaa4d9554
commit cf5fc7b855
14 changed files with 335 additions and 6 deletions

View File

@@ -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.craftingmonitor.ICraftingMonitorElementRegistry;
import com.raoulvdberge.refinedstorage.api.autocrafting.preview.ICraftingPreviewElementRegistry; import com.raoulvdberge.refinedstorage.api.autocrafting.preview.ICraftingPreviewElementRegistry;
import com.raoulvdberge.refinedstorage.api.autocrafting.registry.ICraftingTaskRegistry; 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.solderer.ISoldererRegistry;
import com.raoulvdberge.refinedstorage.api.util.IComparer; import com.raoulvdberge.refinedstorage.api.util.IComparer;
import com.raoulvdberge.refinedstorage.api.util.IFluidStackList; import com.raoulvdberge.refinedstorage.api.util.IFluidStackList;
@@ -48,6 +50,18 @@ public interface IRSAPI {
@Nonnull @Nonnull
ICraftingPreviewElementRegistry getCraftingPreviewElementRegistry(); 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 * @return an empty item stack list
*/ */

View File

@@ -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.IFluidGridHandler;
import com.raoulvdberge.refinedstorage.api.network.grid.IItemGridHandler; import com.raoulvdberge.refinedstorage.api.network.grid.IItemGridHandler;
import com.raoulvdberge.refinedstorage.api.network.item.INetworkItemHandler; 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.fluid.IFluidStorageCache;
import com.raoulvdberge.refinedstorage.api.storage.item.IItemStorageCache; import com.raoulvdberge.refinedstorage.api.storage.item.IItemStorageCache;
import com.raoulvdberge.refinedstorage.api.util.IComparer; import com.raoulvdberge.refinedstorage.api.util.IComparer;
@@ -19,6 +20,7 @@ import net.minecraftforge.fluids.FluidStack;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import java.util.List; import java.util.List;
import java.util.Map;
/** /**
* Represents a network master, usually is a controller. * Represents a network master, usually is a controller.
@@ -225,6 +227,11 @@ public interface INetworkMaster {
*/ */
void sendCraftingMonitorUpdate(EntityPlayerMP player); void sendCraftingMonitorUpdate(EntityPlayerMP player);
/**
* @return a map with the reader and writer channels
*/
Map<String, IReaderWriterChannel> getReaderWriterChannels();
/** /**
* Inserts an item in this network. * Inserts an item in this network.
* *

View File

@@ -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();
}

View File

@@ -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<IReaderWriterHandler> getHandlers();
NBTTagCompound writeToNBT(NBTTagCompound tag);
void readFromNBT(NBTTagCompound tag);
}

View File

@@ -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();
}

View File

@@ -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);
}

View File

@@ -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<IReaderWriterHandlerFactory> getFactories();
}

View File

@@ -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();
}

View File

@@ -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.craftingmonitor.ICraftingMonitorElementRegistry;
import com.raoulvdberge.refinedstorage.api.autocrafting.preview.ICraftingPreviewElementRegistry; import com.raoulvdberge.refinedstorage.api.autocrafting.preview.ICraftingPreviewElementRegistry;
import com.raoulvdberge.refinedstorage.api.autocrafting.registry.ICraftingTaskRegistry; 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.solderer.ISoldererRegistry;
import com.raoulvdberge.refinedstorage.api.util.IComparer; import com.raoulvdberge.refinedstorage.api.util.IComparer;
import com.raoulvdberge.refinedstorage.api.util.IFluidStackList; 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.craftingmonitor.CraftingMonitorElementRegistry;
import com.raoulvdberge.refinedstorage.apiimpl.autocrafting.preview.CraftingPreviewElementRegistry; import com.raoulvdberge.refinedstorage.apiimpl.autocrafting.preview.CraftingPreviewElementRegistry;
import com.raoulvdberge.refinedstorage.apiimpl.autocrafting.registry.CraftingTaskRegistry; 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.solderer.SoldererRegistry;
import com.raoulvdberge.refinedstorage.apiimpl.util.Comparer; import com.raoulvdberge.refinedstorage.apiimpl.util.Comparer;
import com.raoulvdberge.refinedstorage.apiimpl.util.FluidStackList; import com.raoulvdberge.refinedstorage.apiimpl.util.FluidStackList;
@@ -34,6 +36,7 @@ public class API implements IRSAPI {
private ICraftingTaskRegistry craftingTaskRegistry = new CraftingTaskRegistry(); private ICraftingTaskRegistry craftingTaskRegistry = new CraftingTaskRegistry();
private ICraftingMonitorElementRegistry craftingMonitorElementRegistry = new CraftingMonitorElementRegistry(); private ICraftingMonitorElementRegistry craftingMonitorElementRegistry = new CraftingMonitorElementRegistry();
private ICraftingPreviewElementRegistry craftingPreviewElementRegistry = new CraftingPreviewElementRegistry(); private ICraftingPreviewElementRegistry craftingPreviewElementRegistry = new CraftingPreviewElementRegistry();
private IReaderWriterHandlerRegistry readerWriterHandlerRegistry = new ReaderWriterHandlerRegistry();
@Nonnull @Nonnull
@Override @Override
@@ -65,6 +68,12 @@ public class API implements IRSAPI {
return craftingPreviewElementRegistry; return craftingPreviewElementRegistry;
} }
@Nonnull
@Override
public IReaderWriterHandlerRegistry getReaderWriterHandlerRegistry() {
return readerWriterHandlerRegistry;
}
@Nonnull @Nonnull
@Override @Override
public IItemStackList createItemStackList() { public IItemStackList createItemStackList() {

View File

@@ -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<IReaderWriterHandler> 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<IReaderWriterHandler> 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));
}
}
}
}

View File

@@ -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> T getCapability(Capability<T> 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;
}
}
}

View File

@@ -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<String, IReaderWriterHandlerFactory> 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<IReaderWriterHandlerFactory> getFactories() {
return factories.values();
}
}

View File

@@ -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.CraftingPreviewElementFluidStack;
import com.raoulvdberge.refinedstorage.apiimpl.autocrafting.preview.CraftingPreviewElementItemStack; import com.raoulvdberge.refinedstorage.apiimpl.autocrafting.preview.CraftingPreviewElementItemStack;
import com.raoulvdberge.refinedstorage.apiimpl.autocrafting.registry.CraftingTaskFactory; 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.solderer.*;
import com.raoulvdberge.refinedstorage.apiimpl.storage.fluid.FluidStorageNBT; import com.raoulvdberge.refinedstorage.apiimpl.storage.fluid.FluidStorageNBT;
import com.raoulvdberge.refinedstorage.apiimpl.storage.item.ItemStorageNBT; 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(CraftingPreviewElementItemStack.ID, CraftingPreviewElementItemStack::fromByteBuf);
API.instance().getCraftingPreviewElementRegistry().add(CraftingPreviewElementFluidStack.ID, CraftingPreviewElementFluidStack::fromByteBuf); API.instance().getCraftingPreviewElementRegistry().add(CraftingPreviewElementFluidStack.ID, CraftingPreviewElementFluidStack::fromByteBuf);
API.instance().getReaderWriterHandlerRegistry().add(ReaderWriterHandlerItems.ID, tag -> new ReaderWriterHandlerItems(tag));
int id = 0; int id = 0;
RS.INSTANCE.network.registerMessage(MessageTileDataParameter.class, MessageTileDataParameter.class, id++, Side.CLIENT); RS.INSTANCE.network.registerMessage(MessageTileDataParameter.class, MessageTileDataParameter.class, id++, Side.CLIENT);

View File

@@ -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.IFluidGridHandler;
import com.raoulvdberge.refinedstorage.api.network.grid.IItemGridHandler; import com.raoulvdberge.refinedstorage.api.network.grid.IItemGridHandler;
import com.raoulvdberge.refinedstorage.api.network.item.INetworkItemHandler; 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.AccessType;
import com.raoulvdberge.refinedstorage.api.storage.IStorage; import com.raoulvdberge.refinedstorage.api.storage.IStorage;
import com.raoulvdberge.refinedstorage.api.storage.fluid.IFluidStorage; 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_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<ClientNode> CLIENT_NODE_COMPARATOR = (left, right) -> { private static final Comparator<ClientNode> CLIENT_NODE_COMPARATOR = (left, right) -> {
if (left.getEnergyUsage() == right.getEnergyUsage()) { if (left.getEnergyUsage() == right.getEnergyUsage()) {
return 0; return 0;
@@ -165,6 +169,8 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR
private IItemStorageCache itemStorage = new ItemStorageCache(this); private IItemStorageCache itemStorage = new ItemStorageCache(this);
private IFluidStorageCache fluidStorage = new FluidStorageCache(this); private IFluidStorageCache fluidStorage = new FluidStorageCache(this);
private Map<String, IReaderWriterChannel> readerWriterChannels = new HashMap<>();
private List<ICraftingPattern> patterns = new ArrayList<>(); private List<ICraftingPattern> patterns = new ArrayList<>();
private List<ICraftingTask> craftingTasks = new ArrayList<>(); private List<ICraftingTask> craftingTasks = new ArrayList<>();
@@ -278,10 +284,10 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR
if (craftingTasksChanged) { if (craftingTasksChanged) {
craftingMonitorUpdateRequested = true; craftingMonitorUpdateRequested = true;
} }
}
if (!craftingTasks.isEmpty()) { if (!craftingTasks.isEmpty() || !readerWriterChannels.isEmpty()) {
markDirty(); markDirty();
}
} }
if (craftingMonitorUpdateRequested) { if (craftingMonitorUpdateRequested) {
@@ -550,6 +556,11 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR
RS.INSTANCE.network.sendTo(new MessageCraftingMonitorElements(getElements()), player); RS.INSTANCE.network.sendTo(new MessageCraftingMonitorElements(getElements()), player);
} }
@Override
public Map<String, IReaderWriterChannel> getReaderWriterChannels() {
return readerWriterChannels;
}
private List<ICraftingMonitorElement> getElements() { private List<ICraftingMonitorElement> getElements() {
return craftingTasks.stream().flatMap(t -> t.getCraftingMonitorElements().stream()).collect(Collectors.toList()); 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)); 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 @Override
@@ -807,13 +832,25 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR
redstoneMode.write(tag); redstoneMode.write(tag);
NBTTagList list = new NBTTagList(); NBTTagList craftingTaskList = new NBTTagList();
for (ICraftingTask task : craftingTasks) { 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<String, IReaderWriterChannel> 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; return tag;
} }