Move reader writer updating to a listener based system.

This commit is contained in:
raoulvdberge
2018-06-18 18:56:24 +02:00
parent 7a1954d84b
commit 0c19860bba
19 changed files with 133 additions and 74 deletions

View File

@@ -29,7 +29,7 @@ public interface IReaderWriterChannel {
* @param tag the tag to write to
* @return the written tag
*/
NBTTagCompound writeToNBT(NBTTagCompound tag);
NBTTagCompound writeToNbt(NBTTagCompound tag);
/**
* Reads this channel from NBT.

View File

@@ -59,7 +59,7 @@ public interface IReaderWriterHandler {
* @param tag the tag to write to
* @return the written tag
*/
NBTTagCompound writeToNBT(NBTTagCompound tag);
NBTTagCompound writeToNbt(NBTTagCompound tag);
/**
* @return the id of this writer, as assigned to the {@link IReaderWriterHandlerRegistry}

View File

@@ -0,0 +1,16 @@
package com.raoulvdberge.refinedstorage.api.network.readerwriter;
/**
* A listener for reader writers.
*/
public interface IReaderWriterListener {
/**
* Called when the listener is attached.
*/
void onAttached();
/**
* Called when a reader writer channel has changed.
*/
void onChanged();
}

View File

@@ -1,9 +1,9 @@
package com.raoulvdberge.refinedstorage.api.network.readerwriter;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.nbt.NBTTagCompound;
import javax.annotation.Nullable;
import java.util.Collection;
/**
* A manager for the reader writer.
@@ -36,24 +36,31 @@ public interface IReaderWriterManager {
void removeChannel(String name);
/**
* Sends a channel update to all players watching a reader or writer.
* @return a collection of channels
*/
void sendUpdate();
Collection<String> getChannels();
/**
* Sends a channel update to a specific player.
* Adds a listener.
*
* @param player the player to send to
* @param listener the listener
*/
void sendUpdateTo(EntityPlayerMP player);
void addListener(IReaderWriterListener listener);
/**
* Removes a listener.
*
* @param listener the listener
*/
void removeListener(IReaderWriterListener listener);
/**
* @param tag the tag to write to
*/
void writeToNBT(NBTTagCompound tag);
void writeToNbt(NBTTagCompound tag);
/**
* @param tag the tag to read from
*/
void readFromNBT(NBTTagCompound tag);
void readFromNbt(NBTTagCompound tag);
}

View File

@@ -4,8 +4,6 @@ import com.raoulvdberge.refinedstorage.RS;
import com.raoulvdberge.refinedstorage.api.network.readerwriter.IReader;
import com.raoulvdberge.refinedstorage.tile.TileReader;
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;
import net.minecraft.world.World;
@@ -83,10 +81,4 @@ public class NetworkNodeReader extends NetworkNode implements IReader, IGuiReade
return tag;
}
public void onOpened(EntityPlayer entity) {
if (network != null) {
network.getReaderWriterManager().sendUpdateTo((EntityPlayerMP) entity);
}
}
}

View File

@@ -7,8 +7,6 @@ import com.raoulvdberge.refinedstorage.api.network.readerwriter.IReaderWriterHan
import com.raoulvdberge.refinedstorage.api.network.readerwriter.IWriter;
import com.raoulvdberge.refinedstorage.tile.TileWriter;
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;
import net.minecraft.world.World;
@@ -115,10 +113,4 @@ public class NetworkNodeWriter extends NetworkNode implements IWriter, IGuiReade
return tag;
}
public void onOpened(EntityPlayer entity) {
if (network != null) {
network.getReaderWriterManager().sendUpdateTo((EntityPlayerMP) entity);
}
}
}

View File

@@ -45,9 +45,9 @@ public class ReaderWriterChannel implements IReaderWriterChannel {
}
@Override
public NBTTagCompound writeToNBT(NBTTagCompound tag) {
public NBTTagCompound writeToNbt(NBTTagCompound tag) {
for (IReaderWriterHandler handler : handlers) {
tag.setTag(String.format(NBT_HANDLER, handler.getId()), handler.writeToNBT(new NBTTagCompound()));
tag.setTag(String.format(NBT_HANDLER, handler.getId()), handler.writeToNbt(new NBTTagCompound()));
}
return tag;

View File

@@ -74,7 +74,7 @@ public class ReaderWriterHandlerFluids implements IReaderWriterHandler {
}
@Override
public NBTTagCompound writeToNBT(NBTTagCompound tag) {
public NBTTagCompound writeToNbt(NBTTagCompound tag) {
tank.writeToNBT(tag);
return tag;

View File

@@ -75,7 +75,7 @@ public class ReaderWriterHandlerItems implements IReaderWriterHandler {
}
@Override
public NBTTagCompound writeToNBT(NBTTagCompound tag) {
public NBTTagCompound writeToNbt(NBTTagCompound tag) {
StackUtils.writeItems(items, 0, tag);
return tag;

View File

@@ -60,7 +60,7 @@ public class ReaderWriterHandlerRedstone implements IReaderWriterHandler {
}
@Override
public NBTTagCompound writeToNBT(NBTTagCompound tag) {
public NBTTagCompound writeToNbt(NBTTagCompound tag) {
return tag;
}

View File

@@ -1,34 +1,28 @@
package com.raoulvdberge.refinedstorage.apiimpl.network.readerwriter;
import com.raoulvdberge.refinedstorage.RS;
import com.raoulvdberge.refinedstorage.api.network.INetwork;
import com.raoulvdberge.refinedstorage.api.network.readerwriter.IReaderWriterChannel;
import com.raoulvdberge.refinedstorage.api.network.readerwriter.IReaderWriterHandler;
import com.raoulvdberge.refinedstorage.api.network.readerwriter.IReaderWriterListener;
import com.raoulvdberge.refinedstorage.api.network.readerwriter.IReaderWriterManager;
import com.raoulvdberge.refinedstorage.apiimpl.API;
import com.raoulvdberge.refinedstorage.container.ContainerReaderWriter;
import com.raoulvdberge.refinedstorage.network.MessageReaderWriterUpdate;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList;
import net.minecraftforge.common.util.Constants;
import javax.annotation.Nullable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.*;
public class ReaderWriterManager implements IReaderWriterManager {
private static final String NBT_CHANNELS = "ReaderWriterChannels";
private static final String NBT_NAME = "Name";
private INetwork network;
private Runnable listener;
private Map<String, IReaderWriterChannel> channels = new HashMap<>();
private Set<IReaderWriterListener> listeners = new HashSet<>();
public ReaderWriterManager(INetwork network, Runnable listener) {
public ReaderWriterManager(INetwork network) {
this.network = network;
this.listener = listener;
}
@Override
@@ -50,9 +44,7 @@ public class ReaderWriterManager implements IReaderWriterManager {
public void addChannel(String name) {
channels.put(name, API.instance().createReaderWriterChannel(name, network));
listener.run();
sendUpdate();
listeners.forEach(IReaderWriterListener::onChanged);
}
@Override
@@ -65,33 +57,33 @@ public class ReaderWriterManager implements IReaderWriterManager {
channels.remove(name);
listener.run();
sendUpdate();
listeners.forEach(IReaderWriterListener::onChanged);
}
}
@Override
public void sendUpdate() {
// @todo: Move to a listener system
network.world().getMinecraftServer().getPlayerList().getPlayers().stream()
.filter(player -> player.openContainer instanceof ContainerReaderWriter &&
((ContainerReaderWriter) player.openContainer).getReaderWriter().getNetwork() != null &&
network.getPosition().equals(((ContainerReaderWriter) player.openContainer).getReaderWriter().getNetwork().getPosition()))
.forEach(this::sendUpdateTo);
public Collection<String> getChannels() {
return channels.keySet();
}
@Override
public void sendUpdateTo(EntityPlayerMP player) {
RS.INSTANCE.network.sendTo(new MessageReaderWriterUpdate(new ArrayList<>(channels.keySet())), player);
public void addListener(IReaderWriterListener listener) {
listeners.add(listener);
listener.onAttached();
}
@Override
public void writeToNBT(NBTTagCompound tag) {
public void removeListener(IReaderWriterListener listener) {
listeners.remove(listener);
}
@Override
public void writeToNbt(NBTTagCompound tag) {
NBTTagList readerWriterChannelsList = new NBTTagList();
for (Map.Entry<String, IReaderWriterChannel> entry : channels.entrySet()) {
NBTTagCompound channelTag = entry.getValue().writeToNBT(new NBTTagCompound());
NBTTagCompound channelTag = entry.getValue().writeToNbt(new NBTTagCompound());
channelTag.setString(NBT_NAME, entry.getKey());
@@ -102,7 +94,7 @@ public class ReaderWriterManager implements IReaderWriterManager {
}
@Override
public void readFromNBT(NBTTagCompound tag) {
public void readFromNbt(NBTTagCompound tag) {
if (tag.hasKey(NBT_CHANNELS)) {
NBTTagList readerWriterChannelsList = tag.getTagList(NBT_CHANNELS, Constants.NBT.TAG_COMPOUND);

View File

@@ -45,8 +45,8 @@ public class BlockReader extends BlockCable {
channel.getHandlers().stream().map(h -> h.getStatusReader(reader, channel)).flatMap(List::stream).forEach(player::sendMessage);
}
}
} else if (tryOpenNetworkGui(RSGui.READER_WRITER, player, world, pos, side)) {
reader.onOpened(player);
} else {
tryOpenNetworkGui(RSGui.READER_WRITER, player, world, pos, side);
}
}

View File

@@ -46,8 +46,8 @@ public class BlockWriter extends BlockCable {
channel.getHandlers().stream().map(h -> h.getStatusWriter(writer, channel)).flatMap(List::stream).forEach(player::sendMessage);
}
}
} else if (tryOpenNetworkGui(RSGui.READER_WRITER, player, world, pos, side)) {
writer.onOpened(player);
} else {
tryOpenNetworkGui(RSGui.READER_WRITER, player, world, pos, side);
}
}

View File

@@ -1,11 +1,17 @@
package com.raoulvdberge.refinedstorage.container;
import com.raoulvdberge.refinedstorage.RS;
import com.raoulvdberge.refinedstorage.api.network.readerwriter.IReaderWriterListener;
import com.raoulvdberge.refinedstorage.api.network.readerwriter.IReaderWriterManager;
import com.raoulvdberge.refinedstorage.apiimpl.network.node.IGuiReaderWriter;
import com.raoulvdberge.refinedstorage.network.MessageReaderWriterUpdate;
import com.raoulvdberge.refinedstorage.tile.TileBase;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
public class ContainerReaderWriter extends ContainerBase {
public class ContainerReaderWriter extends ContainerBase implements IReaderWriterListener {
private IGuiReaderWriter readerWriter;
private boolean addedListener;
public ContainerReaderWriter(IGuiReaderWriter readerWriter, TileBase tile, EntityPlayer player) {
super(tile, player);
@@ -18,4 +24,40 @@ public class ContainerReaderWriter extends ContainerBase {
public IGuiReaderWriter getReaderWriter() {
return readerWriter;
}
@Override
public void detectAndSendChanges() {
super.detectAndSendChanges();
IReaderWriterManager manager = readerWriter.getNetwork() == null ? null : readerWriter.getNetwork().getReaderWriterManager();
if (!getPlayer().world.isRemote) {
if (manager != null && !addedListener) {
manager.addListener(this);
this.addedListener = true;
} else if (manager == null && addedListener) {
this.addedListener = false;
}
}
}
@Override
public void onContainerClosed(EntityPlayer player) {
super.onContainerClosed(player);
IReaderWriterManager manager = readerWriter.getNetwork() == null ? null : readerWriter.getNetwork().getReaderWriterManager();
if (!player.getEntityWorld().isRemote && manager != null && addedListener) {
manager.removeListener(this);
}
}
@Override
public void onAttached() {
onChanged();
}
@Override
public void onChanged() {
RS.INSTANCE.network.sendTo(new MessageReaderWriterUpdate(readerWriter.getNetwork().getReaderWriterManager().getChannels()), (EntityPlayerMP) getPlayer());
}
}

View File

@@ -25,6 +25,7 @@ public class GuiReaderWriter extends GuiBase {
private static final int ITEM_HEIGHT = 18;
private List<String> channels = Collections.emptyList();
private String currentChannelToSet;
private GuiButton add;
private GuiButton remove;
@@ -54,8 +55,6 @@ public class GuiReaderWriter extends GuiBase {
name.setTextColor(16777215);
name.setCanLoseFocus(true);
name.setFocused(false);
updateSelection(readerWriter.getChannelParameter().getValue());
}
private List<String> getChannels() {
@@ -64,6 +63,11 @@ public class GuiReaderWriter extends GuiBase {
public void setChannels(List<String> channels) {
this.channels = channels;
// In case we get the current channel packet earlier than our channel list.
if (currentChannelToSet != null) {
setCurrentChannel(currentChannelToSet);
}
}
@Override
@@ -197,8 +201,9 @@ public class GuiReaderWriter extends GuiBase {
}
}
public void updateSelection(String channel) {
public void setCurrentChannel(String channel) {
this.itemSelected = getChannels().indexOf(channel);
this.name.setText(itemSelected != -1 ? getChannels().get(itemSelected) : "");
this.currentChannelToSet = channel;
}
}

View File

@@ -90,7 +90,7 @@ public class ReaderWriterHandlerForgeEnergy implements IReaderWriterHandler {
}
@Override
public NBTTagCompound writeToNBT(NBTTagCompound tag) {
public NBTTagCompound writeToNbt(NBTTagCompound tag) {
tag.setInteger(NBT_ENERGY_STORED, storage.getEnergyStored());
return tag;

View File

@@ -9,6 +9,7 @@ import net.minecraftforge.fml.common.network.simpleimpl.IMessageHandler;
import net.minecraftforge.fml.common.network.simpleimpl.MessageContext;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
public class MessageReaderWriterUpdate implements IMessage, IMessageHandler<MessageReaderWriterUpdate, IMessage> {
@@ -17,8 +18,8 @@ public class MessageReaderWriterUpdate implements IMessage, IMessageHandler<Mess
public MessageReaderWriterUpdate() {
}
public MessageReaderWriterUpdate(List<String> channels) {
this.channels = channels;
public MessageReaderWriterUpdate(Collection<String> channels) {
this.channels = new ArrayList<>(channels);
}
@Override

View File

@@ -11,6 +11,7 @@ import com.raoulvdberge.refinedstorage.api.network.grid.handler.IItemGridHandler
import com.raoulvdberge.refinedstorage.api.network.item.INetworkItemHandler;
import com.raoulvdberge.refinedstorage.api.network.node.INetworkNode;
import com.raoulvdberge.refinedstorage.api.network.node.INetworkNodeProxy;
import com.raoulvdberge.refinedstorage.api.network.readerwriter.IReaderWriterListener;
import com.raoulvdberge.refinedstorage.api.network.readerwriter.IReaderWriterManager;
import com.raoulvdberge.refinedstorage.api.network.security.ISecurityManager;
import com.raoulvdberge.refinedstorage.api.storage.AccessType;
@@ -131,7 +132,7 @@ public class TileController extends TileBase implements ITickable, INetwork, IRe
private IStorageCache<FluidStack> fluidStorage = new StorageCacheFluid(this);
private StorageTrackerFluid fluidStorageTracker = new StorageTrackerFluid(this::markDirty);
private IReaderWriterManager readerWriterManager = new ReaderWriterManager(this, this::markDirty);
private IReaderWriterManager readerWriterManager = new ReaderWriterManager(this);
private EnergyForge energy = new EnergyForge(RS.INSTANCE.config.controllerCapacity);
@@ -150,6 +151,17 @@ public class TileController extends TileBase implements ITickable, INetwork, IRe
dataManager.addWatchedParameter(ENERGY_STORED);
dataManager.addParameter(ENERGY_CAPACITY);
dataManager.addParameter(NODES);
readerWriterManager.addListener(new IReaderWriterListener() {
@Override
public void onAttached() {
}
@Override
public void onChanged() {
markDirty();
}
});
}
public EnergyForge getEnergy() {
@@ -484,7 +496,7 @@ public class TileController extends TileBase implements ITickable, INetwork, IRe
craftingManager.readFromNbt(tag);
readerWriterManager.readFromNBT(tag);
readerWriterManager.readFromNbt(tag);
if (tag.hasKey(NBT_ITEM_STORAGE_TRACKER)) {
itemStorageTracker.readFromNBT(tag.getTagList(NBT_ITEM_STORAGE_TRACKER, Constants.NBT.TAG_COMPOUND));
@@ -505,7 +517,7 @@ public class TileController extends TileBase implements ITickable, INetwork, IRe
craftingManager.writeToNBT(tag);
readerWriterManager.writeToNBT(tag);
readerWriterManager.writeToNbt(tag);
tag.setTag(NBT_ITEM_STORAGE_TRACKER, itemStorageTracker.serializeNBT());
tag.setTag(NBT_FLUID_STORAGE_TRACKER, fluidStorageTracker.serializeNBT());

View File

@@ -27,7 +27,7 @@ public class TileReader extends TileNode<NetworkNodeReader> {
((IGuiReaderWriter) t.getNode()).setChannel(v);
t.getNode().markDirty();
}, (initial, p) -> GuiBase.executeLater(GuiReaderWriter.class, readerWriter -> readerWriter.updateSelection(p)));
}, (initial, p) -> GuiBase.executeLater(GuiReaderWriter.class, readerWriter -> readerWriter.setCurrentChannel(p)));
}
public static final TileDataParameter<String, TileReader> CHANNEL = createChannelParameter();