From 27e6826db52f8932d43542b54a0930d38a931e43 Mon Sep 17 00:00:00 2001 From: Raoul Van den Berge Date: Fri, 11 Nov 2016 15:44:06 +0100 Subject: [PATCH] Reader / writer selection --- .../refinedstorage/api/IRSAPI.java | 2 +- .../refinedstorage/apiimpl/API.java | 4 +- .../readerwriter/ReaderWriterChannel.java | 15 +++- .../ReaderWriterHandlerItems.java | 2 +- .../refinedstorage/gui/GuiReaderWriter.java | 16 ++++- .../refinedstorage/tile/IReaderWriter.java | 7 ++ .../refinedstorage/tile/TileController.java | 8 ++- .../refinedstorage/tile/TileReader.java | 72 +++++++++++++++++++ .../refinedstorage/tile/TileWriter.java | 45 ++++++++++++ 9 files changed, 160 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/raoulvdberge/refinedstorage/api/IRSAPI.java b/src/main/java/com/raoulvdberge/refinedstorage/api/IRSAPI.java index 85c20bb88..ea70e00cc 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/api/IRSAPI.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/api/IRSAPI.java @@ -61,7 +61,7 @@ public interface IRSAPI { * @return a new reader writer channel */ @Nonnull - IReaderWriterChannel createReaderWriterChannel(INetworkMaster network); + IReaderWriterChannel createReaderWriterChannel(String name, INetworkMaster network); /** * @return an empty item stack list diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/API.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/API.java index 5757e208a..31bcd6c81 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/API.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/API.java @@ -79,8 +79,8 @@ public class API implements IRSAPI { @Nonnull @Override - public IReaderWriterChannel createReaderWriterChannel(INetworkMaster network) { - return new ReaderWriterChannel(network); + public IReaderWriterChannel createReaderWriterChannel(String name, INetworkMaster network) { + return new ReaderWriterChannel(name, network); } @Nonnull 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 b07051961..7ded9c442 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 @@ -3,6 +3,7 @@ package com.raoulvdberge.refinedstorage.apiimpl.network.readerwriter; import com.raoulvdberge.refinedstorage.api.network.INetworkMaster; import com.raoulvdberge.refinedstorage.api.network.readerwriter.*; import com.raoulvdberge.refinedstorage.apiimpl.API; +import com.raoulvdberge.refinedstorage.tile.IReaderWriter; import net.minecraft.nbt.NBTTagCompound; import java.util.ArrayList; @@ -12,11 +13,13 @@ import java.util.stream.Collectors; public class ReaderWriterChannel implements IReaderWriterChannel { private static final String NBT_HANDLER = "Handler_%s"; + private String name; private INetworkMaster network; private List handlers = new ArrayList<>(); - public ReaderWriterChannel(INetworkMaster network) { + public ReaderWriterChannel(String name, INetworkMaster network) { + this.name = name; this.network = network; this.handlers.addAll(API.instance().getReaderWriterHandlerRegistry().getFactories().stream().map(f -> f.create(null)).collect(Collectors.toList())); } @@ -28,12 +31,18 @@ public class ReaderWriterChannel implements IReaderWriterChannel { @Override public List getReaders() { - return network.getNodeGraph().all().stream().filter(n -> n instanceof IReader).map(n -> (IReader) n).collect(Collectors.toList()); + return network.getNodeGraph().all().stream() + .filter(n -> n instanceof IReader && n instanceof IReaderWriter && name.equals(((IReaderWriter) n).getChannel())) + .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()); + return network.getNodeGraph().all().stream() + .filter(n -> n instanceof IWriter && n instanceof IReaderWriter && name.equals(((IReaderWriter) n).getChannel())) + .map(n -> (IWriter) n) + .collect(Collectors.toList()); } @Override 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 5ad091554..89477451f 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 @@ -59,7 +59,7 @@ public class ReaderWriterHandlerItems implements IReaderWriterHandler { @Override public void onConnectionChange(boolean state) { - // NO OP + } @Override diff --git a/src/main/java/com/raoulvdberge/refinedstorage/gui/GuiReaderWriter.java b/src/main/java/com/raoulvdberge/refinedstorage/gui/GuiReaderWriter.java index b5c7bb09f..57e9cc87a 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/gui/GuiReaderWriter.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/gui/GuiReaderWriter.java @@ -5,6 +5,7 @@ import com.raoulvdberge.refinedstorage.container.ContainerReaderWriter; import com.raoulvdberge.refinedstorage.network.MessageReaderWriterChannelAdd; import com.raoulvdberge.refinedstorage.network.MessageReaderWriterChannelRemove; import com.raoulvdberge.refinedstorage.tile.IReaderWriter; +import com.raoulvdberge.refinedstorage.tile.data.TileDataManager; import net.minecraft.client.gui.GuiButton; import net.minecraft.client.gui.GuiTextField; import net.minecraft.client.renderer.GlStateManager; @@ -48,6 +49,8 @@ public class GuiReaderWriter extends GuiBase { name.setTextColor(16777215); name.setCanLoseFocus(true); name.setFocused(false); + + updateSelection(readerWriter.getChannelParameter().getValue()); } @Override @@ -119,6 +122,8 @@ public class GuiReaderWriter extends GuiBase { name.mouseClicked(mouseX, mouseY, mouseButton); + int itemSelectedOld = itemSelected; + itemSelected = -1; if (mouseButton == 0 && inBounds(8, 39, 144, 73, mouseX - guiLeft, mouseY - guiTop)) { @@ -131,10 +136,14 @@ public class GuiReaderWriter extends GuiBase { if (inBounds(ix, iy, ITEM_WIDTH, ITEM_HEIGHT, mouseX - guiLeft, mouseY - guiTop) && (item + i) < getChannels().size()) { itemSelected = item + i; - name.setText(getChannels().get(itemSelected)); + TileDataManager.setParameter(readerWriter.getChannelParameter(), getChannels().get(itemSelected)); } } } + + if (itemSelectedOld != -1 && itemSelected == -1) { + TileDataManager.setParameter(readerWriter.getChannelParameter(), ""); + } } @@ -162,6 +171,11 @@ public class GuiReaderWriter extends GuiBase { } } + public void updateSelection(String channel) { + this.itemSelected = getChannels().indexOf(channel); + this.name.setText(itemSelected != -1 ? getChannels().get(itemSelected) : ""); + } + private List getChannels() { return readerWriter.isConnected() ? CHANNELS : Collections.emptyList(); } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/IReaderWriter.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/IReaderWriter.java index fa4c63040..fdbe58029 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/IReaderWriter.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/IReaderWriter.java @@ -1,10 +1,17 @@ package com.raoulvdberge.refinedstorage.tile; +import com.raoulvdberge.refinedstorage.tile.data.TileDataParameter; import net.minecraft.util.math.BlockPos; public interface IReaderWriter { String getTitle(); + String getChannel(); + + void setChannel(String channel); + + TileDataParameter getChannelParameter(); + void onAdd(String name); void onRemove(String name); diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileController.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileController.java index 4325918ab..eea06f315 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileController.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileController.java @@ -571,7 +571,7 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR @Override public void addReaderWriterChannel(String name) { - readerWriterChannels.put(name, API.instance().createReaderWriterChannel(this)); + readerWriterChannels.put(name, API.instance().createReaderWriterChannel(name, this)); } @Override @@ -845,11 +845,13 @@ public class TileController extends TileBase implements INetworkMaster, IEnergyR for (int i = 0; i < readerWriterChannelsList.tagCount(); ++i) { NBTTagCompound channelTag = readerWriterChannelsList.getCompoundTagAt(i); - IReaderWriterChannel channel = API.instance().createReaderWriterChannel(this); + String name = channelTag.getString(NBT_READER_WRITER_NAME); + + IReaderWriterChannel channel = API.instance().createReaderWriterChannel(name, this); channel.readFromNBT(channelTag); - readerWriterChannels.put(channelTag.getString(NBT_READER_WRITER_NAME), channel); + readerWriterChannels.put(name, channel); } } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileReader.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileReader.java index 354762973..ba2384836 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileReader.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileReader.java @@ -1,11 +1,49 @@ package com.raoulvdberge.refinedstorage.tile; import com.raoulvdberge.refinedstorage.api.network.readerwriter.IReader; +import com.raoulvdberge.refinedstorage.gui.GuiReaderWriter; +import com.raoulvdberge.refinedstorage.tile.data.ITileDataConsumer; +import com.raoulvdberge.refinedstorage.tile.data.ITileDataProducer; +import com.raoulvdberge.refinedstorage.tile.data.TileDataParameter; +import net.minecraft.client.Minecraft; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.network.datasync.DataSerializers; +import net.minecraft.tileentity.TileEntity; import net.minecraft.util.math.BlockPos; public class TileReader extends TileNode implements IReader, IReaderWriter { + private static final String NBT_CHANNEL = "Channel"; + + static TileDataParameter createChannelParameter() { + return new TileDataParameter<>(DataSerializers.STRING, "", new ITileDataProducer() { + @Override + public String getValue(T tile) { + return tile.getChannel(); + } + }, new ITileDataConsumer() { + @Override + public void setValue(T tile, String value) { + tile.setChannel(value); + + tile.markDirty(); + } + }, parameter -> { + if (Minecraft.getMinecraft().currentScreen instanceof GuiReaderWriter) { + ((GuiReaderWriter) Minecraft.getMinecraft().currentScreen).updateSelection(parameter.getValue()); + } + }); + } + + public static final TileDataParameter CHANNEL = createChannelParameter(); + + private String channel = ""; + + public TileReader() { + dataManager.addWatchedParameter(CHANNEL); + } + @Override public int getEnergyUsage() { return 0; // @TODO @@ -25,6 +63,21 @@ public class TileReader extends TileNode implements IReader, IReaderWriter { return "gui.refinedstorage:reader"; } + @Override + public String getChannel() { + return channel; + } + + @Override + public void setChannel(String channel) { + this.channel = channel; + } + + @Override + public TileDataParameter getChannelParameter() { + return CHANNEL; + } + @Override public void onAdd(String name) { if (network != null && !name.isEmpty()) { @@ -53,6 +106,25 @@ public class TileReader extends TileNode implements IReader, IReaderWriter { return true; } + + @Override + public void read(NBTTagCompound tag) { + super.read(tag); + + if (tag.hasKey(NBT_CHANNEL)) { + channel = tag.getString(NBT_CHANNEL); + } + } + + @Override + public NBTTagCompound write(NBTTagCompound tag) { + super.write(tag); + + tag.setString(NBT_CHANNEL, channel); + + return tag; + } + public void onOpened(EntityPlayer entity) { if (isConnected()) { network.sendReaderWriterChannelUpdate((EntityPlayerMP) entity); diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileWriter.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileWriter.java index 75097ed96..56bf03272 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/TileWriter.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/TileWriter.java @@ -2,14 +2,26 @@ package com.raoulvdberge.refinedstorage.tile; import com.raoulvdberge.refinedstorage.RSBlocks; import com.raoulvdberge.refinedstorage.api.network.readerwriter.IWriter; +import com.raoulvdberge.refinedstorage.tile.data.TileDataParameter; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; +import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.math.BlockPos; public class TileWriter extends TileNode implements IWriter, IReaderWriter { + private static final String NBT_CHANNEL = "Channel"; + + private static final TileDataParameter CHANNEL = TileReader.createChannelParameter(); + + private String channel = ""; + private int redstoneStrength; private int lastRedstoneStrength; + public TileWriter() { + dataManager.addWatchedParameter(CHANNEL); + } + @Override public int getEnergyUsage() { return 0; // @TODO @@ -50,6 +62,21 @@ public class TileWriter extends TileNode implements IWriter, IReaderWriter { return "gui.refinedstorage:writer"; } + @Override + public String getChannel() { + return channel; + } + + @Override + public void setChannel(String channel) { + this.channel = channel; + } + + @Override + public TileDataParameter getChannelParameter() { + return CHANNEL; + } + @Override public void onAdd(String name) { if (network != null && !name.isEmpty()) { @@ -78,6 +105,24 @@ public class TileWriter extends TileNode implements IWriter, IReaderWriter { return true; } + @Override + public void read(NBTTagCompound tag) { + super.read(tag); + + if (tag.hasKey(NBT_CHANNEL)) { + channel = tag.getString(NBT_CHANNEL); + } + } + + @Override + public NBTTagCompound write(NBTTagCompound tag) { + super.write(tag); + + tag.setString(NBT_CHANNEL, channel); + + return tag; + } + public void onOpened(EntityPlayer entity) { if (isConnected()) { network.sendReaderWriterChannelUpdate((EntityPlayerMP) entity);