From 18e239985d8597a8d5e4ed45ddde292e5256a5d8 Mon Sep 17 00:00:00 2001 From: Raoul Van den Berge Date: Fri, 11 Nov 2016 11:47:23 +0100 Subject: [PATCH] API improvements to the reader writer stuff --- .../api/network/readerwriter/IReader.java | 6 ++ .../readerwriter/IReaderWriterChannel.java | 29 +++++++++- .../readerwriter/IReaderWriterHandler.java | 26 ++++++++- .../IReaderWriterHandlerFactory.java | 9 +++ .../IReaderWriterHandlerRegistry.java | 18 ++++++ .../api/network/readerwriter/IWriter.java | 15 +++++ .../readerwriter/ReaderWriterChannel.java | 58 +++++++++---------- .../ReaderWriterHandlerItems.java | 32 +++++----- .../refinedstorage/tile/TileController.java | 14 ++++- .../refinedstorage/tile/TileReader.java | 19 ++++++ 10 files changed, 175 insertions(+), 51 deletions(-) create mode 100755 src/main/java/com/raoulvdberge/refinedstorage/tile/TileReader.java 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 index f34620688..cfcfb3c3d 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/api/network/readerwriter/IReader.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/api/network/readerwriter/IReader.java @@ -2,6 +2,12 @@ package com.raoulvdberge.refinedstorage.api.network.readerwriter; import com.raoulvdberge.refinedstorage.api.network.INetworkNode; +/** + * Represents a reader block in the world. + */ public interface IReader extends INetworkNode { + /** + * @return the redstone strength this reader is receiving + */ 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 index 8d218386b..7606e820d 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/api/network/readerwriter/IReaderWriterChannel.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/api/network/readerwriter/IReaderWriterChannel.java @@ -4,12 +4,37 @@ import net.minecraft.nbt.NBTTagCompound; import java.util.List; +/** + * Represents a reader writer channel in the RS network. + */ public interface IReaderWriterChannel { - void addHandlers(); - + /** + * @return the handlers that this channel has + */ List getHandlers(); + /** + * @return a list of readers using this channel + */ + List getReaders(); + + /** + * @return a list of writers using this channel + */ + List getWriters(); + + /** + * Writes this channel to NBT. + * + * @param tag the tag to write to + * @return the written tag + */ NBTTagCompound writeToNBT(NBTTagCompound tag); + /** + * Reads this channel from NBT. + * + * @param tag the tag to read from + */ 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 index d5cd46e07..547a363bb 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/api/network/readerwriter/IReaderWriterHandler.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/api/network/readerwriter/IReaderWriterHandler.java @@ -3,10 +3,34 @@ package com.raoulvdberge.refinedstorage.api.network.readerwriter; import net.minecraft.nbt.NBTTagCompound; import net.minecraftforge.common.capabilities.ICapabilityProvider; +/** + * Represents a reader writer handler. Can be for example: items, fluids, energy, ... + */ public interface IReaderWriterHandler extends ICapabilityProvider { - void update(IReader reader, IWriter writer); + /** + * Updates this reader writer handler. + * + * @param channel the channel this reader writer handler is assigned to + */ + void update(IReaderWriterChannel channel); + /** + * Called when the network connection state changes. + * + * @param state the new connection state + */ + void onConnectionChange(boolean state); + + /** + * Writes this reader writer handler to NBT. + * + * @param tag the tag to write to + * @return the written tag + */ NBTTagCompound writeToNBT(NBTTagCompound tag); + /** + * @return the id of this writer, as assigned to the {@link IReaderWriterHandlerRegistry} + */ 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 index 0967bcb9b..b73533762 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/api/network/readerwriter/IReaderWriterHandlerFactory.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/api/network/readerwriter/IReaderWriterHandlerFactory.java @@ -5,7 +5,16 @@ import net.minecraft.nbt.NBTTagCompound; import javax.annotation.Nonnull; import javax.annotation.Nullable; +/** + * A factory that is able to create reader writer handlers. + */ public interface IReaderWriterHandlerFactory { + /** + * Creates a reader writer handler (based on NBT tag if there is any). + * + * @param tag the tag to read from, null if this reader writer handler is created on demand + * @return the reader writer handler + */ @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 index 52cea1503..815dee294 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/api/network/readerwriter/IReaderWriterHandlerRegistry.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/api/network/readerwriter/IReaderWriterHandlerRegistry.java @@ -3,11 +3,29 @@ package com.raoulvdberge.refinedstorage.api.network.readerwriter; import javax.annotation.Nullable; import java.util.Collection; +/** + * A registry for reader writer handler factories. + */ public interface IReaderWriterHandlerRegistry { + /** + * Adds a factory to the registry. + * + * @param id the id of this reader writer handler. Analog to {@link IReaderWriterHandler#getId()} + * @param factory the factory + */ void add(String id, IReaderWriterHandlerFactory factory); + /** + * Gets a factory from the registry. + * + * @param id the id of the factory to get + * @return the factory, or null if no factory was found + */ @Nullable IReaderWriterHandlerFactory getFactory(String id); + /** + * @return a list of reader writer handler factories + */ 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 index 172d6997d..4de8381e5 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/api/network/readerwriter/IWriter.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/api/network/readerwriter/IWriter.java @@ -3,12 +3,27 @@ package com.raoulvdberge.refinedstorage.api.network.readerwriter; import com.raoulvdberge.refinedstorage.api.network.INetworkNode; import net.minecraft.util.EnumFacing; +/** + * Represents a writer block in the world. + */ public interface IWriter extends INetworkNode { + /** + * @return the redstone strength this writer block is emitting + */ int getRedstoneStrength(); + /** + * @param strength the redstone strength to set to be emitted + */ void setRedstoneStrength(int strength); + /** + * @return the direction of the writer + */ EnumFacing getDirection(); + /** + * @return true if this writer has a stack upgrade, false otherwise + */ boolean hasStackUpgrade(); } 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 index f04af3dac..b07051961 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/readerwriter/ReaderWriterChannel.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/readerwriter/ReaderWriterChannel.java @@ -1,26 +1,24 @@ 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.api.network.INetworkMaster; +import com.raoulvdberge.refinedstorage.api.network.readerwriter.*; 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 static final String NBT_HANDLER = "Handler_%s"; + + private INetworkMaster network; private List handlers = new ArrayList<>(); - @Override - public void addHandlers() { - handlers.addAll(API.instance().getReaderWriterHandlerRegistry().getFactories().stream().map(f -> f.create(null)).collect(Collectors.toList())); + public ReaderWriterChannel(INetworkMaster network) { + this.network = network; + this.handlers.addAll(API.instance().getReaderWriterHandlerRegistry().getFactories().stream().map(f -> f.create(null)).collect(Collectors.toList())); } @Override @@ -28,40 +26,36 @@ public class ReaderWriterChannel implements IReaderWriterChannel { return handlers; } + @Override + public List getReaders() { + return network.getNodeGraph().all().stream().filter(n -> n instanceof IReader).map(n -> (IReader) n).collect(Collectors.toList()); + } + + @Override + public List getWriters() { + return network.getNodeGraph().all().stream().filter(n -> n instanceof IWriter).map(n -> (IWriter) n).collect(Collectors.toList()); + } + @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(String.format(NBT_HANDLER, handler.getId()), handler.writeToNBT(new NBTTagCompound())); } - tag.setTag(NBT_HANDLERS, handlersList); - return tag; } @Override public void readFromNBT(NBTTagCompound tag) { - if (!tag.hasKey(NBT_HANDLER_ID)) { - return; - } + for (IReaderWriterHandler handler : handlers) { + String id = String.format(NBT_HANDLER, handler.getId()); - NBTTagList handlersList = tag.getTagList(NBT_HANDLERS, Constants.NBT.TAG_COMPOUND); + if (tag.hasKey(id)) { + IReaderWriterHandlerFactory factory = API.instance().getReaderWriterHandlerRegistry().getFactory(id); - 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)); + if (factory != null) { + handlers.add(factory.create(tag.getCompoundTag(id))); + } } } } 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 index f4b4e7f71..2baee4c3d 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/readerwriter/ReaderWriterHandlerItems.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/readerwriter/ReaderWriterHandlerItems.java @@ -1,7 +1,7 @@ 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.IReaderWriterChannel; import com.raoulvdberge.refinedstorage.api.network.readerwriter.IReaderWriterHandler; import com.raoulvdberge.refinedstorage.api.network.readerwriter.IWriter; import net.minecraft.item.ItemStack; @@ -29,27 +29,29 @@ public class ReaderWriterHandlerItems implements IReaderWriterHandler { } @Override - public void update(IReader reader, IWriter writer) { - IItemHandler handler = RSUtils.getItemHandler(writer.getNodeWorld().getTileEntity(writer.getPosition().offset(writer.getDirection())), writer.getDirection().getOpposite()); + public void update(IReaderWriterChannel channel) { + for (IWriter writer : channel.getWriters()) { + 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 (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 (slot != null) { + ItemStack toInsert = ItemHandlerHelper.copyStackWithSize(slot, writer.hasStackUpgrade() ? 64 : 1); - if (ItemHandlerHelper.insertItem(handler, toInsert, true) == null) { - ItemHandlerHelper.insertItem(handler, toInsert, false); + if (ItemHandlerHelper.insertItem(handler, toInsert, true) == null) { + ItemHandlerHelper.insertItem(handler, toInsert, false); - internalInv.getStackInSlot(i).stackSize -= toInsert.stackSize; + internalInv.getStackInSlot(i).stackSize -= toInsert.stackSize; - if (internalInv.getStackInSlot(i).stackSize <= 0) { - internalInv.setStackInSlot(i, null); + if (internalInv.getStackInSlot(i).stackSize <= 0) { + internalInv.setStackInSlot(i, null); + } } - } - break; + break; + } } } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileController.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileController.java index 4c4bec700..6d0afbd2c 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileController.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileController.java @@ -19,6 +19,7 @@ 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.network.readerwriter.IReaderWriterHandler; import com.raoulvdberge.refinedstorage.api.storage.AccessType; import com.raoulvdberge.refinedstorage.api.storage.IStorage; import com.raoulvdberge.refinedstorage.api.storage.fluid.IFluidStorage; @@ -286,6 +287,12 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR } } + for (IReaderWriterChannel channel : readerWriterChannels.values()) { + for (IReaderWriterHandler handler : channel.getHandlers()) { + handler.update(channel); + } + } + if (!craftingTasks.isEmpty() || !readerWriterChannels.isEmpty()) { markDirty(); } @@ -295,7 +302,6 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR sendCraftingMonitorUpdate(); } - } networkItemHandler.update(); @@ -315,6 +321,12 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR if (couldRun != canRun()) { couldRun = canRun(); + for (IReaderWriterChannel channel : readerWriterChannels.values()) { + for (IReaderWriterHandler handler : channel.getHandlers()) { + handler.onConnectionChange(couldRun); + } + } + nodeGraph.rebuild(); } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileReader.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileReader.java new file mode 100755 index 000000000..d330d1d00 --- /dev/null +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileReader.java @@ -0,0 +1,19 @@ +package com.raoulvdberge.refinedstorage.tile; + +import com.raoulvdberge.refinedstorage.api.network.readerwriter.IReader; + +public class TileReader extends TileNode implements IReader { + @Override + public int getEnergyUsage() { + return 0; // @TODO + } + + @Override + public void updateNode() { + } + + @Override + public int getRedstoneStrength() { + return worldObj.getRedstonePower(pos, getDirection().getOpposite()); + } +}