From 08464651514a1f8bb28bd773cd2cfe27df36639d Mon Sep 17 00:00:00 2001 From: raoulvdberge Date: Fri, 1 Jun 2018 19:24:55 +0200 Subject: [PATCH] Refactor crafting monitor update/listening system. --- .../api/autocrafting/ICraftingManager.java | 21 ++--- .../ICraftingMonitorListener.java | 18 ++++ .../apiimpl/autocrafting/CraftingManager.java | 89 +++++++++---------- .../autocrafting/task/CraftingExtractor.java | 31 +++++-- .../autocrafting/task/CraftingInserter.java | 16 ++-- .../autocrafting/task/CraftingTask.java | 6 +- .../task/step/CraftingStepProcess.java | 2 + .../NetworkItemWirelessCraftingMonitor.java | 3 - .../node/NetworkNodeCraftingMonitor.java | 15 ++-- .../block/BlockCraftingMonitor.java | 4 +- .../container/ContainerCraftingMonitor.java | 42 ++++++++- .../craftingmonitor/ICraftingMonitor.java | 8 +- .../WirelessCraftingMonitor.java | 19 ++-- 13 files changed, 169 insertions(+), 105 deletions(-) create mode 100644 src/main/java/com/raoulvdberge/refinedstorage/api/autocrafting/craftingmonitor/ICraftingMonitorListener.java diff --git a/src/main/java/com/raoulvdberge/refinedstorage/api/autocrafting/ICraftingManager.java b/src/main/java/com/raoulvdberge/refinedstorage/api/autocrafting/ICraftingManager.java index 87f5ffaa0..2e76a34af 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/api/autocrafting/ICraftingManager.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/api/autocrafting/ICraftingManager.java @@ -1,8 +1,8 @@ package com.raoulvdberge.refinedstorage.api.autocrafting; +import com.raoulvdberge.refinedstorage.api.autocrafting.craftingmonitor.ICraftingMonitorListener; import com.raoulvdberge.refinedstorage.api.autocrafting.task.ICraftingTask; import com.raoulvdberge.refinedstorage.api.util.IComparer; -import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraftforge.items.IItemHandlerModifiable; @@ -98,24 +98,17 @@ public interface ICraftingManager { NBTTagCompound writeToNBT(NBTTagCompound tag); /** - * Makes the network send a crafting monitor update to all players as soon as it can. + * @param listener the listener */ - // TODO: rework system to be subscribed-based - void markCraftingMonitorForUpdate(); + void addListener(ICraftingMonitorListener listener); /** - * Sends a crafting monitor update to all players that are watching a crafting monitor. - *

- * WARNING: In most cases, you should just use {@link ICraftingManager#markCraftingMonitorForUpdate()}, if not, you can get high bandwidth usage. + * @param listener the listener */ - // TODO: rework system to be subscribed-based - void sendCraftingMonitorUpdate(); + void removeListener(ICraftingMonitorListener listener); /** - * Sends a crafting monitor update to a specific player. - * - * @param player the player + * Calls all {@link ICraftingMonitorListener}s. */ - // TODO: rework system to be subscribed-based - void sendCraftingMonitorUpdate(EntityPlayerMP player); + void onTaskChanged(); } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/api/autocrafting/craftingmonitor/ICraftingMonitorListener.java b/src/main/java/com/raoulvdberge/refinedstorage/api/autocrafting/craftingmonitor/ICraftingMonitorListener.java new file mode 100644 index 000000000..80e73851d --- /dev/null +++ b/src/main/java/com/raoulvdberge/refinedstorage/api/autocrafting/craftingmonitor/ICraftingMonitorListener.java @@ -0,0 +1,18 @@ +package com.raoulvdberge.refinedstorage.api.autocrafting.craftingmonitor; + +import com.raoulvdberge.refinedstorage.api.autocrafting.ICraftingManager; + +/** + * Add this listener to a {@link ICraftingManager} to listen to crafting task changes. + */ +public interface ICraftingMonitorListener { + /** + * Called when this listener is attached to a {@link ICraftingManager}. + */ + void onAttached(); + + /** + * Called when any task changes. + */ + void onChanged(); +} diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/CraftingManager.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/CraftingManager.java index 45cb06ad1..f05daf89b 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/CraftingManager.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/CraftingManager.java @@ -1,28 +1,22 @@ package com.raoulvdberge.refinedstorage.apiimpl.autocrafting; -import com.raoulvdberge.refinedstorage.RS; import com.raoulvdberge.refinedstorage.api.autocrafting.ICraftingManager; import com.raoulvdberge.refinedstorage.api.autocrafting.ICraftingPattern; import com.raoulvdberge.refinedstorage.api.autocrafting.ICraftingPatternContainer; +import com.raoulvdberge.refinedstorage.api.autocrafting.craftingmonitor.ICraftingMonitorListener; import com.raoulvdberge.refinedstorage.api.autocrafting.registry.ICraftingTaskFactory; import com.raoulvdberge.refinedstorage.api.autocrafting.task.ICraftingTask; import com.raoulvdberge.refinedstorage.api.network.node.INetworkNode; import com.raoulvdberge.refinedstorage.api.util.IComparer; import com.raoulvdberge.refinedstorage.apiimpl.API; -import com.raoulvdberge.refinedstorage.container.ContainerCraftingMonitor; -import com.raoulvdberge.refinedstorage.network.MessageCraftingMonitorElements; import com.raoulvdberge.refinedstorage.tile.TileController; -import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraftforge.items.IItemHandlerModifiable; import javax.annotation.Nonnull; import javax.annotation.Nullable; -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; +import java.util.*; public class CraftingManager implements ICraftingManager { private TileController network; @@ -35,7 +29,7 @@ public class CraftingManager implements ICraftingManager { private List tasksToAdd = new ArrayList<>(); private List tasksToCancel = new ArrayList<>(); - private boolean updateRequested; + private Set listeners = new HashSet<>(); public CraftingManager(TileController network) { this.network = network; @@ -86,38 +80,49 @@ public class CraftingManager implements ICraftingManager { if (network.canRun()) { boolean changed = !tasksToCancel.isEmpty() || !tasksToAdd.isEmpty(); - tasksToCancel.forEach(ICraftingTask::onCancelled); - tasks.removeAll(tasksToCancel); - tasksToCancel.clear(); + this.tasksToCancel.forEach(ICraftingTask::onCancelled); + this.tasks.removeAll(tasksToCancel); + this.tasksToCancel.clear(); - tasksToAdd.stream().filter(ICraftingTask::isValid).forEach(tasks::add); - tasksToAdd.clear(); + this.tasksToAdd.stream().filter(ICraftingTask::isValid).forEach(tasks::add); + this.tasksToAdd.clear(); boolean anyFinished = tasks.removeIf(ICraftingTask::update); if (changed || anyFinished) { - markCraftingMonitorForUpdate(); + onTaskChanged(); } } - - if (updateRequested) { - updateRequested = false; - - sendCraftingMonitorUpdate(); - } } @Override + // TODO public void readFromNBT(NBTTagCompound tag) { - // TODO } @Override + // TODO public NBTTagCompound writeToNBT(NBTTagCompound tag) { - // TODO return tag; } + @Override + public void addListener(ICraftingMonitorListener listener) { + listeners.add(listener); + + listener.onAttached(); + } + + @Override + public void removeListener(ICraftingMonitorListener listener) { + listeners.remove(listener); + } + + @Override + public void onTaskChanged() { + listeners.forEach(ICraftingMonitorListener::onChanged); + } + @Override @Nullable public ICraftingTask schedule(ItemStack stack, int toSchedule, int compare) { @@ -135,9 +140,8 @@ public class CraftingManager implements ICraftingManager { if (task != null) { task.calculate(); - add(task); - - markCraftingMonitorForUpdate(); + this.add(task); + this.onTaskChanged(); return task; } @@ -148,13 +152,19 @@ public class CraftingManager implements ICraftingManager { @Override public void track(ItemStack stack, int size) { + int initialSize = size; + for (ICraftingTask task : tasks) { size = task.onTrackedItemInserted(stack, size); if (size == 0) { - return; + break; } } + + if (size != initialSize) { + this.onTaskChanged(); + } } @Override @@ -164,18 +174,18 @@ public class CraftingManager implements ICraftingManager { @Override public void rebuild() { - patterns.clear(); - containerInventories.clear(); + this.patterns.clear(); + this.containerInventories.clear(); for (INetworkNode node : network.getNodeGraph().all()) { if (node instanceof ICraftingPatternContainer && node.canUpdate()) { ICraftingPatternContainer container = (ICraftingPatternContainer) node; - patterns.addAll(container.getPatterns()); + this.patterns.addAll(container.getPatterns()); IItemHandlerModifiable handler = container.getPatternInventory(); if (handler != null) { - containerInventories.computeIfAbsent(container.getName(), k -> new ArrayList<>()).add(handler); + this.containerInventories.computeIfAbsent(container.getName(), k -> new ArrayList<>()).add(handler); } } } @@ -194,21 +204,4 @@ public class CraftingManager implements ICraftingManager { return null; } - - @Override - public void markCraftingMonitorForUpdate() { - this.updateRequested = true; - } - - @Override - public void sendCraftingMonitorUpdate() { - network.world().getMinecraftServer().getPlayerList().getPlayers().stream() - .filter(player -> player.openContainer instanceof ContainerCraftingMonitor && network.getPosition().equals(((ContainerCraftingMonitor) player.openContainer).getCraftingMonitor().getNetworkPosition())) - .forEach(player -> RS.INSTANCE.network.sendTo(new MessageCraftingMonitorElements(((ContainerCraftingMonitor) player.openContainer).getCraftingMonitor()), player)); - } - - @Override - public void sendCraftingMonitorUpdate(EntityPlayerMP player) { - RS.INSTANCE.network.sendTo(new MessageCraftingMonitorElements(((ContainerCraftingMonitor) player.openContainer).getCraftingMonitor()), player); - } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/CraftingExtractor.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/CraftingExtractor.java index f874eaaf6..51bccdcdb 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/CraftingExtractor.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/CraftingExtractor.java @@ -31,21 +31,32 @@ public class CraftingExtractor { return status; } - // TODO: send crafting monitor update when this changes public void updateStatus() { + boolean updated = false; + for (int i = 0; i < items.size(); ++i) { if (status.get(i) != CraftingExtractorItemStatus.EXTRACTED) { ItemStack stack = items.get(i); ItemStack inNetwork = network.extractItem(stack, stack.getCount(), true); + CraftingExtractorItemStatus previousStatus = status.get(i); + if (inNetwork == null || inNetwork.getCount() < stack.getCount()) { status.set(i, CraftingExtractorItemStatus.MISSING); } else { status.set(i, CraftingExtractorItemStatus.AVAILABLE); } + + if (previousStatus != status.get(i)) { + updated = true; + } } } + + if (updated) { + network.getCraftingManager().onTaskChanged(); + } } public boolean isAllAvailable() { @@ -56,7 +67,6 @@ public class CraftingExtractor { return !items.isEmpty() && status.stream().allMatch(s -> s == CraftingExtractorItemStatus.EXTRACTED); } - // TODO: send crafting monitor update when this changes public void extractOne() { for (int i = 0; i < items.size(); ++i) { if (status.get(i) == CraftingExtractorItemStatus.AVAILABLE) { @@ -67,23 +77,26 @@ public class CraftingExtractor { status.set(i, CraftingExtractorItemStatus.EXTRACTED); + network.getCraftingManager().onTaskChanged(); + return; } } } - // TODO: send crafting monitor update when this changes - public void extractOneAndInsert(@Nullable IItemHandler dest) { + public void extractOneAndInsert(@Nullable IItemHandler handler) { for (int i = 0; i < items.size(); ++i) { - if (status.get(i) == CraftingExtractorItemStatus.AVAILABLE) { + CraftingExtractorItemStatus previousStatus = status.get(i); + + if (previousStatus == CraftingExtractorItemStatus.AVAILABLE || previousStatus == CraftingExtractorItemStatus.MACHINE_DOES_NOT_ACCEPT || previousStatus == CraftingExtractorItemStatus.MACHINE_NONE) { ItemStack extracted = network.extractItem(items.get(i), items.get(i).getCount(), true); if (extracted == null) { throw new IllegalStateException("Extraction simulation failed while available"); } - if (dest == null) { + if (handler == null) { status.set(i, CraftingExtractorItemStatus.MACHINE_NONE); - } else if (ItemHandlerHelper.insertItem(dest, extracted, false).isEmpty()) { + } else if (ItemHandlerHelper.insertItem(handler, extracted, false).isEmpty()) { extracted = network.extractItem(items.get(i), items.get(i).getCount(), false); if (extracted == null) { throw new IllegalStateException("Did not extract anything while available"); @@ -94,6 +107,10 @@ public class CraftingExtractor { status.set(i, CraftingExtractorItemStatus.MACHINE_DOES_NOT_ACCEPT); } + if (previousStatus != status.get(i)) { + network.getCraftingManager().onTaskChanged(); + } + return; } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/CraftingInserter.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/CraftingInserter.java index 49eff36df..2a2931dac 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/CraftingInserter.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/CraftingInserter.java @@ -18,13 +18,15 @@ public class CraftingInserter { public void insert(ItemStack stack) { items.addLast(new CraftingInserterItem(stack, CraftingInserterItemStatus.WAITING)); - network.getCraftingManager().sendCraftingMonitorUpdate(); + network.getCraftingManager().onTaskChanged(); } - public void insertSingle() { + public void insertOne() { CraftingInserterItem item = items.peekFirst(); if (item != null) { + CraftingInserterItemStatus currentStatus = item.getStatus(); + if (network.insertItem(item.getStack(), item.getStack().getCount(), true) == null) { ItemStack inserted = network.insertItem(item.getStack(), item.getStack().getCount(), false); if (inserted != null) { @@ -32,11 +34,13 @@ public class CraftingInserter { } items.pop(); - } else { - item.setStatus(CraftingInserterItemStatus.FULL); - } - network.getCraftingManager().sendCraftingMonitorUpdate(); + network.getCraftingManager().onTaskChanged(); + } else if (currentStatus != CraftingInserterItemStatus.FULL) { + item.setStatus(CraftingInserterItemStatus.FULL); + + network.getCraftingManager().onTaskChanged(); + } } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/CraftingTask.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/CraftingTask.java index 6850c4d5d..1d91bb5ad 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/CraftingTask.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/CraftingTask.java @@ -179,12 +179,12 @@ public class CraftingTask implements ICraftingTask { if (ticks % getTickInterval(step.getPattern().getContainer().getSpeedUpgradeCount()) == 0 && step.canExecute() && step.execute()) { step.setCompleted(); - network.getCraftingManager().sendCraftingMonitorUpdate(); + network.getCraftingManager().onTaskChanged(); } } } - inserter.insertSingle(); + inserter.insertOne(); ticks++; @@ -192,8 +192,8 @@ public class CraftingTask implements ICraftingTask { } @Override + // TODO public void onCancelled() { - // TODO } @Override diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/step/CraftingStepProcess.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/step/CraftingStepProcess.java index 365959f6a..eecb743db 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/step/CraftingStepProcess.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/step/CraftingStepProcess.java @@ -10,11 +10,13 @@ import net.minecraft.item.ItemStack; import java.util.List; public class CraftingStepProcess extends CraftingStep { + private INetwork network; private CraftingExtractor extractor; private IStackList itemsToReceive = API.instance().createItemStackList(); public CraftingStepProcess(ICraftingPattern pattern, INetwork network, List toExtract) { super(pattern); + this.network = network; this.extractor = new CraftingExtractor(network, toExtract); for (ItemStack output : pattern.getOutputs()) { diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/item/NetworkItemWirelessCraftingMonitor.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/item/NetworkItemWirelessCraftingMonitor.java index 2fc4816f2..47ccadbfd 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/item/NetworkItemWirelessCraftingMonitor.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/item/NetworkItemWirelessCraftingMonitor.java @@ -10,7 +10,6 @@ import com.raoulvdberge.refinedstorage.api.network.security.Permission; import com.raoulvdberge.refinedstorage.item.ItemWirelessCraftingMonitor; import com.raoulvdberge.refinedstorage.util.WorldUtils; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.item.ItemStack; import net.minecraft.util.EnumHand; import net.minecraftforge.energy.CapabilityEnergy; @@ -46,8 +45,6 @@ public class NetworkItemWirelessCraftingMonitor implements INetworkItem { player.openGui(RS.INSTANCE, RSGui.WIRELESS_CRAFTING_MONITOR, player.getEntityWorld(), hand.ordinal(), network.world().provider.getDimension(), 0); - network.getCraftingManager().sendCraftingMonitorUpdate((EntityPlayerMP) player); - drainEnergy(RS.INSTANCE.config.wirelessCraftingMonitorOpenUsage); return true; diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeCraftingMonitor.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeCraftingMonitor.java index 7a1f4f23b..220ffc2eb 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeCraftingMonitor.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeCraftingMonitor.java @@ -1,6 +1,7 @@ package com.raoulvdberge.refinedstorage.apiimpl.network.node; import com.raoulvdberge.refinedstorage.RS; +import com.raoulvdberge.refinedstorage.api.autocrafting.ICraftingManager; import com.raoulvdberge.refinedstorage.api.autocrafting.task.ICraftingTask; import com.raoulvdberge.refinedstorage.api.network.grid.IGrid; import com.raoulvdberge.refinedstorage.tile.craftingmonitor.ICraftingMonitor; @@ -74,21 +75,15 @@ public class NetworkNodeCraftingMonitor extends NetworkNode implements ICrafting return TileCraftingMonitor.REDSTONE_MODE; } - @Nullable - @Override - public BlockPos getNetworkPosition() { - return network != null ? network.getPosition() : null; - } - @Override public List getTasks() { return network != null ? network.getCraftingManager().getTasks() : Collections.emptyList(); } - public void onOpened(EntityPlayer player) { - if (network != null) { - network.getCraftingManager().sendCraftingMonitorUpdate((EntityPlayerMP) player); - } + @Nullable + @Override + public ICraftingManager getCraftingManager() { + return network != null ? network.getCraftingManager() : null; } @Override diff --git a/src/main/java/com/raoulvdberge/refinedstorage/block/BlockCraftingMonitor.java b/src/main/java/com/raoulvdberge/refinedstorage/block/BlockCraftingMonitor.java index d18ac8e88..15b1ef950 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/block/BlockCraftingMonitor.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/block/BlockCraftingMonitor.java @@ -23,8 +23,8 @@ public class BlockCraftingMonitor extends BlockNode { @Override public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) { - if (!world.isRemote && tryOpenNetworkGui(RSGui.CRAFTING_MONITOR, player, world, pos, side, Permission.MODIFY, Permission.AUTOCRAFTING)) { - ((TileCraftingMonitor) world.getTileEntity(pos)).getNode().onOpened(player); + if (!world.isRemote) { + tryOpenNetworkGui(RSGui.CRAFTING_MONITOR, player, world, pos, side, Permission.MODIFY, Permission.AUTOCRAFTING); } return true; diff --git a/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerCraftingMonitor.java b/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerCraftingMonitor.java index b0b65dc81..5e7f0f990 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerCraftingMonitor.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerCraftingMonitor.java @@ -1,18 +1,24 @@ package com.raoulvdberge.refinedstorage.container; +import com.raoulvdberge.refinedstorage.RS; +import com.raoulvdberge.refinedstorage.api.autocrafting.ICraftingManager; +import com.raoulvdberge.refinedstorage.api.autocrafting.craftingmonitor.ICraftingMonitorListener; import com.raoulvdberge.refinedstorage.gui.IResizableDisplay; +import com.raoulvdberge.refinedstorage.network.MessageCraftingMonitorElements; import com.raoulvdberge.refinedstorage.tile.craftingmonitor.ICraftingMonitor; import com.raoulvdberge.refinedstorage.tile.craftingmonitor.TileCraftingMonitor; import com.raoulvdberge.refinedstorage.tile.craftingmonitor.WirelessCraftingMonitor; import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; import javax.annotation.Nullable; -public class ContainerCraftingMonitor extends ContainerBase { +public class ContainerCraftingMonitor extends ContainerBase implements ICraftingMonitorListener { private ICraftingMonitor craftingMonitor; private IResizableDisplay resizableDisplay; + private boolean addedListener; public ContainerCraftingMonitor(ICraftingMonitor craftingMonitor, @Nullable TileCraftingMonitor craftingMonitorTile, EntityPlayer player, IResizableDisplay resizableDisplay) { super(craftingMonitorTile, player); @@ -30,12 +36,31 @@ public class ContainerCraftingMonitor extends ContainerBase { addPlayerInventory(8, resizableDisplay.getYPlayerInventory()); } + @Override + public void detectAndSendChanges() { + super.detectAndSendChanges(); + + ICraftingManager manager = craftingMonitor.getCraftingManager(); + if (!getPlayer().world.isRemote) { + if (manager != null && !addedListener) { + System.out.println("Added"); + manager.addListener(this); + + this.addedListener = true; + } else if (manager == null && addedListener) { + this.addedListener = false; + } + } + } + @Override public void onContainerClosed(EntityPlayer player) { super.onContainerClosed(player); - if (!player.getEntityWorld().isRemote) { - craftingMonitor.onClosed(player); + ICraftingManager manager = craftingMonitor.getCraftingManager(); + if (!player.getEntityWorld().isRemote && manager != null && addedListener) { + System.out.println("Removed"); + manager.removeListener(this); } } @@ -74,4 +99,15 @@ public class ContainerCraftingMonitor extends ContainerBase { protected boolean isHeldItemDisabled() { return craftingMonitor instanceof WirelessCraftingMonitor; } + + @Override + public void onAttached() { + onChanged(); + } + + @Override + public void onChanged() { + System.out.println("Changed"); + RS.INSTANCE.network.sendTo(new MessageCraftingMonitorElements(craftingMonitor), (EntityPlayerMP) getPlayer()); + } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/craftingmonitor/ICraftingMonitor.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/craftingmonitor/ICraftingMonitor.java index 387038f89..76b5cc701 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/craftingmonitor/ICraftingMonitor.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/craftingmonitor/ICraftingMonitor.java @@ -1,10 +1,10 @@ package com.raoulvdberge.refinedstorage.tile.craftingmonitor; +import com.raoulvdberge.refinedstorage.api.autocrafting.ICraftingManager; import com.raoulvdberge.refinedstorage.api.autocrafting.task.ICraftingTask; import com.raoulvdberge.refinedstorage.tile.data.TileDataParameter; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; -import net.minecraft.util.math.BlockPos; import javax.annotation.Nullable; import java.util.List; @@ -16,11 +16,11 @@ public interface ICraftingMonitor { TileDataParameter getRedstoneModeParameter(); - @Nullable - BlockPos getNetworkPosition(); - List getTasks(); + @Nullable + ICraftingManager getCraftingManager(); + int getSize(); void onSizeChanged(int size); diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/craftingmonitor/WirelessCraftingMonitor.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/craftingmonitor/WirelessCraftingMonitor.java index 3bc49b35b..2e365cf20 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/craftingmonitor/WirelessCraftingMonitor.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/craftingmonitor/WirelessCraftingMonitor.java @@ -1,6 +1,7 @@ package com.raoulvdberge.refinedstorage.tile.craftingmonitor; import com.raoulvdberge.refinedstorage.RS; +import com.raoulvdberge.refinedstorage.api.autocrafting.ICraftingManager; import com.raoulvdberge.refinedstorage.api.autocrafting.task.ICraftingTask; import com.raoulvdberge.refinedstorage.api.network.INetwork; import com.raoulvdberge.refinedstorage.gui.GuiBase; @@ -16,6 +17,7 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraftforge.common.DimensionManager; +import javax.annotation.Nullable; import java.util.Collections; import java.util.List; @@ -52,11 +54,6 @@ public class WirelessCraftingMonitor implements ICraftingMonitor { return null; } - @Override - public BlockPos getNetworkPosition() { - return network; - } - @Override public List getTasks() { INetwork network = getNetwork(); @@ -68,6 +65,18 @@ public class WirelessCraftingMonitor implements ICraftingMonitor { return Collections.emptyList(); } + @Nullable + @Override + public ICraftingManager getCraftingManager() { + INetwork network = getNetwork(); + + if (network != null) { + return network.getCraftingManager(); + } + + return null; + } + @Override public int getSize() { return size;