Refactor crafting monitor update/listening system.

This commit is contained in:
raoulvdberge
2018-06-01 19:24:55 +02:00
parent 3f360705f2
commit 0846465151
13 changed files with 169 additions and 105 deletions

View File

@@ -1,8 +1,8 @@
package com.raoulvdberge.refinedstorage.api.autocrafting; 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.autocrafting.task.ICraftingTask;
import com.raoulvdberge.refinedstorage.api.util.IComparer; import com.raoulvdberge.refinedstorage.api.util.IComparer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagCompound;
import net.minecraftforge.items.IItemHandlerModifiable; import net.minecraftforge.items.IItemHandlerModifiable;
@@ -98,24 +98,17 @@ public interface ICraftingManager {
NBTTagCompound writeToNBT(NBTTagCompound tag); 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 addListener(ICraftingMonitorListener listener);
void markCraftingMonitorForUpdate();
/** /**
* Sends a crafting monitor update to all players that are watching a crafting monitor. * @param listener the listener
* <p>
* WARNING: In most cases, you should just use {@link ICraftingManager#markCraftingMonitorForUpdate()}, if not, you can get high bandwidth usage.
*/ */
// TODO: rework system to be subscribed-based void removeListener(ICraftingMonitorListener listener);
void sendCraftingMonitorUpdate();
/** /**
* Sends a crafting monitor update to a specific player. * Calls all {@link ICraftingMonitorListener}s.
*
* @param player the player
*/ */
// TODO: rework system to be subscribed-based void onTaskChanged();
void sendCraftingMonitorUpdate(EntityPlayerMP player);
} }

View File

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

View File

@@ -1,28 +1,22 @@
package com.raoulvdberge.refinedstorage.apiimpl.autocrafting; package com.raoulvdberge.refinedstorage.apiimpl.autocrafting;
import com.raoulvdberge.refinedstorage.RS;
import com.raoulvdberge.refinedstorage.api.autocrafting.ICraftingManager; import com.raoulvdberge.refinedstorage.api.autocrafting.ICraftingManager;
import com.raoulvdberge.refinedstorage.api.autocrafting.ICraftingPattern; import com.raoulvdberge.refinedstorage.api.autocrafting.ICraftingPattern;
import com.raoulvdberge.refinedstorage.api.autocrafting.ICraftingPatternContainer; 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.registry.ICraftingTaskFactory;
import com.raoulvdberge.refinedstorage.api.autocrafting.task.ICraftingTask; import com.raoulvdberge.refinedstorage.api.autocrafting.task.ICraftingTask;
import com.raoulvdberge.refinedstorage.api.network.node.INetworkNode; import com.raoulvdberge.refinedstorage.api.network.node.INetworkNode;
import com.raoulvdberge.refinedstorage.api.util.IComparer; import com.raoulvdberge.refinedstorage.api.util.IComparer;
import com.raoulvdberge.refinedstorage.apiimpl.API; 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 com.raoulvdberge.refinedstorage.tile.TileController;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagCompound;
import net.minecraftforge.items.IItemHandlerModifiable; import net.minecraftforge.items.IItemHandlerModifiable;
import javax.annotation.Nonnull; import javax.annotation.Nonnull;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import java.util.ArrayList; import java.util.*;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
public class CraftingManager implements ICraftingManager { public class CraftingManager implements ICraftingManager {
private TileController network; private TileController network;
@@ -35,7 +29,7 @@ public class CraftingManager implements ICraftingManager {
private List<ICraftingTask> tasksToAdd = new ArrayList<>(); private List<ICraftingTask> tasksToAdd = new ArrayList<>();
private List<ICraftingTask> tasksToCancel = new ArrayList<>(); private List<ICraftingTask> tasksToCancel = new ArrayList<>();
private boolean updateRequested; private Set<ICraftingMonitorListener> listeners = new HashSet<>();
public CraftingManager(TileController network) { public CraftingManager(TileController network) {
this.network = network; this.network = network;
@@ -86,38 +80,49 @@ public class CraftingManager implements ICraftingManager {
if (network.canRun()) { if (network.canRun()) {
boolean changed = !tasksToCancel.isEmpty() || !tasksToAdd.isEmpty(); boolean changed = !tasksToCancel.isEmpty() || !tasksToAdd.isEmpty();
tasksToCancel.forEach(ICraftingTask::onCancelled); this.tasksToCancel.forEach(ICraftingTask::onCancelled);
tasks.removeAll(tasksToCancel); this.tasks.removeAll(tasksToCancel);
tasksToCancel.clear(); this.tasksToCancel.clear();
tasksToAdd.stream().filter(ICraftingTask::isValid).forEach(tasks::add); this.tasksToAdd.stream().filter(ICraftingTask::isValid).forEach(tasks::add);
tasksToAdd.clear(); this.tasksToAdd.clear();
boolean anyFinished = tasks.removeIf(ICraftingTask::update); boolean anyFinished = tasks.removeIf(ICraftingTask::update);
if (changed || anyFinished) { if (changed || anyFinished) {
markCraftingMonitorForUpdate(); onTaskChanged();
} }
} }
if (updateRequested) {
updateRequested = false;
sendCraftingMonitorUpdate();
}
} }
@Override @Override
// TODO
public void readFromNBT(NBTTagCompound tag) { public void readFromNBT(NBTTagCompound tag) {
// TODO
} }
@Override @Override
// TODO
public NBTTagCompound writeToNBT(NBTTagCompound tag) { public NBTTagCompound writeToNBT(NBTTagCompound tag) {
// TODO
return tag; 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 @Override
@Nullable @Nullable
public ICraftingTask schedule(ItemStack stack, int toSchedule, int compare) { public ICraftingTask schedule(ItemStack stack, int toSchedule, int compare) {
@@ -135,9 +140,8 @@ public class CraftingManager implements ICraftingManager {
if (task != null) { if (task != null) {
task.calculate(); task.calculate();
add(task); this.add(task);
this.onTaskChanged();
markCraftingMonitorForUpdate();
return task; return task;
} }
@@ -148,13 +152,19 @@ public class CraftingManager implements ICraftingManager {
@Override @Override
public void track(ItemStack stack, int size) { public void track(ItemStack stack, int size) {
int initialSize = size;
for (ICraftingTask task : tasks) { for (ICraftingTask task : tasks) {
size = task.onTrackedItemInserted(stack, size); size = task.onTrackedItemInserted(stack, size);
if (size == 0) { if (size == 0) {
return; break;
} }
} }
if (size != initialSize) {
this.onTaskChanged();
}
} }
@Override @Override
@@ -164,18 +174,18 @@ public class CraftingManager implements ICraftingManager {
@Override @Override
public void rebuild() { public void rebuild() {
patterns.clear(); this.patterns.clear();
containerInventories.clear(); this.containerInventories.clear();
for (INetworkNode node : network.getNodeGraph().all()) { for (INetworkNode node : network.getNodeGraph().all()) {
if (node instanceof ICraftingPatternContainer && node.canUpdate()) { if (node instanceof ICraftingPatternContainer && node.canUpdate()) {
ICraftingPatternContainer container = (ICraftingPatternContainer) node; ICraftingPatternContainer container = (ICraftingPatternContainer) node;
patterns.addAll(container.getPatterns()); this.patterns.addAll(container.getPatterns());
IItemHandlerModifiable handler = container.getPatternInventory(); IItemHandlerModifiable handler = container.getPatternInventory();
if (handler != null) { 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; 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);
}
} }

View File

@@ -31,21 +31,32 @@ public class CraftingExtractor {
return status; return status;
} }
// TODO: send crafting monitor update when this changes
public void updateStatus() { public void updateStatus() {
boolean updated = false;
for (int i = 0; i < items.size(); ++i) { for (int i = 0; i < items.size(); ++i) {
if (status.get(i) != CraftingExtractorItemStatus.EXTRACTED) { if (status.get(i) != CraftingExtractorItemStatus.EXTRACTED) {
ItemStack stack = items.get(i); ItemStack stack = items.get(i);
ItemStack inNetwork = network.extractItem(stack, stack.getCount(), true); ItemStack inNetwork = network.extractItem(stack, stack.getCount(), true);
CraftingExtractorItemStatus previousStatus = status.get(i);
if (inNetwork == null || inNetwork.getCount() < stack.getCount()) { if (inNetwork == null || inNetwork.getCount() < stack.getCount()) {
status.set(i, CraftingExtractorItemStatus.MISSING); status.set(i, CraftingExtractorItemStatus.MISSING);
} else { } else {
status.set(i, CraftingExtractorItemStatus.AVAILABLE); status.set(i, CraftingExtractorItemStatus.AVAILABLE);
} }
if (previousStatus != status.get(i)) {
updated = true;
}
} }
} }
if (updated) {
network.getCraftingManager().onTaskChanged();
}
} }
public boolean isAllAvailable() { public boolean isAllAvailable() {
@@ -56,7 +67,6 @@ public class CraftingExtractor {
return !items.isEmpty() && status.stream().allMatch(s -> s == CraftingExtractorItemStatus.EXTRACTED); return !items.isEmpty() && status.stream().allMatch(s -> s == CraftingExtractorItemStatus.EXTRACTED);
} }
// TODO: send crafting monitor update when this changes
public void extractOne() { public void extractOne() {
for (int i = 0; i < items.size(); ++i) { for (int i = 0; i < items.size(); ++i) {
if (status.get(i) == CraftingExtractorItemStatus.AVAILABLE) { if (status.get(i) == CraftingExtractorItemStatus.AVAILABLE) {
@@ -67,23 +77,26 @@ public class CraftingExtractor {
status.set(i, CraftingExtractorItemStatus.EXTRACTED); status.set(i, CraftingExtractorItemStatus.EXTRACTED);
network.getCraftingManager().onTaskChanged();
return; return;
} }
} }
} }
// TODO: send crafting monitor update when this changes public void extractOneAndInsert(@Nullable IItemHandler handler) {
public void extractOneAndInsert(@Nullable IItemHandler dest) {
for (int i = 0; i < items.size(); ++i) { 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); ItemStack extracted = network.extractItem(items.get(i), items.get(i).getCount(), true);
if (extracted == null) { if (extracted == null) {
throw new IllegalStateException("Extraction simulation failed while available"); throw new IllegalStateException("Extraction simulation failed while available");
} }
if (dest == null) { if (handler == null) {
status.set(i, CraftingExtractorItemStatus.MACHINE_NONE); 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); extracted = network.extractItem(items.get(i), items.get(i).getCount(), false);
if (extracted == null) { if (extracted == null) {
throw new IllegalStateException("Did not extract anything while available"); throw new IllegalStateException("Did not extract anything while available");
@@ -94,6 +107,10 @@ public class CraftingExtractor {
status.set(i, CraftingExtractorItemStatus.MACHINE_DOES_NOT_ACCEPT); status.set(i, CraftingExtractorItemStatus.MACHINE_DOES_NOT_ACCEPT);
} }
if (previousStatus != status.get(i)) {
network.getCraftingManager().onTaskChanged();
}
return; return;
} }
} }

View File

@@ -18,13 +18,15 @@ public class CraftingInserter {
public void insert(ItemStack stack) { public void insert(ItemStack stack) {
items.addLast(new CraftingInserterItem(stack, CraftingInserterItemStatus.WAITING)); items.addLast(new CraftingInserterItem(stack, CraftingInserterItemStatus.WAITING));
network.getCraftingManager().sendCraftingMonitorUpdate(); network.getCraftingManager().onTaskChanged();
} }
public void insertSingle() { public void insertOne() {
CraftingInserterItem item = items.peekFirst(); CraftingInserterItem item = items.peekFirst();
if (item != null) { if (item != null) {
CraftingInserterItemStatus currentStatus = item.getStatus();
if (network.insertItem(item.getStack(), item.getStack().getCount(), true) == null) { if (network.insertItem(item.getStack(), item.getStack().getCount(), true) == null) {
ItemStack inserted = network.insertItem(item.getStack(), item.getStack().getCount(), false); ItemStack inserted = network.insertItem(item.getStack(), item.getStack().getCount(), false);
if (inserted != null) { if (inserted != null) {
@@ -32,11 +34,13 @@ public class CraftingInserter {
} }
items.pop(); 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();
}
} }
} }

View File

@@ -179,12 +179,12 @@ public class CraftingTask implements ICraftingTask {
if (ticks % getTickInterval(step.getPattern().getContainer().getSpeedUpgradeCount()) == 0 && step.canExecute() && step.execute()) { if (ticks % getTickInterval(step.getPattern().getContainer().getSpeedUpgradeCount()) == 0 && step.canExecute() && step.execute()) {
step.setCompleted(); step.setCompleted();
network.getCraftingManager().sendCraftingMonitorUpdate(); network.getCraftingManager().onTaskChanged();
} }
} }
} }
inserter.insertSingle(); inserter.insertOne();
ticks++; ticks++;
@@ -192,8 +192,8 @@ public class CraftingTask implements ICraftingTask {
} }
@Override @Override
// TODO
public void onCancelled() { public void onCancelled() {
// TODO
} }
@Override @Override

View File

@@ -10,11 +10,13 @@ import net.minecraft.item.ItemStack;
import java.util.List; import java.util.List;
public class CraftingStepProcess extends CraftingStep { public class CraftingStepProcess extends CraftingStep {
private INetwork network;
private CraftingExtractor extractor; private CraftingExtractor extractor;
private IStackList<ItemStack> itemsToReceive = API.instance().createItemStackList(); private IStackList<ItemStack> itemsToReceive = API.instance().createItemStackList();
public CraftingStepProcess(ICraftingPattern pattern, INetwork network, List<ItemStack> toExtract) { public CraftingStepProcess(ICraftingPattern pattern, INetwork network, List<ItemStack> toExtract) {
super(pattern); super(pattern);
this.network = network;
this.extractor = new CraftingExtractor(network, toExtract); this.extractor = new CraftingExtractor(network, toExtract);
for (ItemStack output : pattern.getOutputs()) { for (ItemStack output : pattern.getOutputs()) {

View File

@@ -10,7 +10,6 @@ import com.raoulvdberge.refinedstorage.api.network.security.Permission;
import com.raoulvdberge.refinedstorage.item.ItemWirelessCraftingMonitor; import com.raoulvdberge.refinedstorage.item.ItemWirelessCraftingMonitor;
import com.raoulvdberge.refinedstorage.util.WorldUtils; import com.raoulvdberge.refinedstorage.util.WorldUtils;
import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.util.EnumHand; import net.minecraft.util.EnumHand;
import net.minecraftforge.energy.CapabilityEnergy; 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); 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); drainEnergy(RS.INSTANCE.config.wirelessCraftingMonitorOpenUsage);
return true; return true;

View File

@@ -1,6 +1,7 @@
package com.raoulvdberge.refinedstorage.apiimpl.network.node; package com.raoulvdberge.refinedstorage.apiimpl.network.node;
import com.raoulvdberge.refinedstorage.RS; 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.autocrafting.task.ICraftingTask;
import com.raoulvdberge.refinedstorage.api.network.grid.IGrid; import com.raoulvdberge.refinedstorage.api.network.grid.IGrid;
import com.raoulvdberge.refinedstorage.tile.craftingmonitor.ICraftingMonitor; import com.raoulvdberge.refinedstorage.tile.craftingmonitor.ICraftingMonitor;
@@ -74,21 +75,15 @@ public class NetworkNodeCraftingMonitor extends NetworkNode implements ICrafting
return TileCraftingMonitor.REDSTONE_MODE; return TileCraftingMonitor.REDSTONE_MODE;
} }
@Nullable
@Override
public BlockPos getNetworkPosition() {
return network != null ? network.getPosition() : null;
}
@Override @Override
public List<ICraftingTask> getTasks() { public List<ICraftingTask> getTasks() {
return network != null ? network.getCraftingManager().getTasks() : Collections.emptyList(); return network != null ? network.getCraftingManager().getTasks() : Collections.emptyList();
} }
public void onOpened(EntityPlayer player) { @Nullable
if (network != null) { @Override
network.getCraftingManager().sendCraftingMonitorUpdate((EntityPlayerMP) player); public ICraftingManager getCraftingManager() {
} return network != null ? network.getCraftingManager() : null;
} }
@Override @Override

View File

@@ -23,8 +23,8 @@ public class BlockCraftingMonitor extends BlockNode {
@Override @Override
public boolean onBlockActivated(World world, BlockPos pos, IBlockState state, EntityPlayer player, EnumHand hand, EnumFacing side, float hitX, float hitY, float hitZ) { 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)) { if (!world.isRemote) {
((TileCraftingMonitor) world.getTileEntity(pos)).getNode().onOpened(player); tryOpenNetworkGui(RSGui.CRAFTING_MONITOR, player, world, pos, side, Permission.MODIFY, Permission.AUTOCRAFTING);
} }
return true; return true;

View File

@@ -1,18 +1,24 @@
package com.raoulvdberge.refinedstorage.container; 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.gui.IResizableDisplay;
import com.raoulvdberge.refinedstorage.network.MessageCraftingMonitorElements;
import com.raoulvdberge.refinedstorage.tile.craftingmonitor.ICraftingMonitor; import com.raoulvdberge.refinedstorage.tile.craftingmonitor.ICraftingMonitor;
import com.raoulvdberge.refinedstorage.tile.craftingmonitor.TileCraftingMonitor; import com.raoulvdberge.refinedstorage.tile.craftingmonitor.TileCraftingMonitor;
import com.raoulvdberge.refinedstorage.tile.craftingmonitor.WirelessCraftingMonitor; import com.raoulvdberge.refinedstorage.tile.craftingmonitor.WirelessCraftingMonitor;
import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.inventory.Slot; import net.minecraft.inventory.Slot;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import javax.annotation.Nullable; import javax.annotation.Nullable;
public class ContainerCraftingMonitor extends ContainerBase { public class ContainerCraftingMonitor extends ContainerBase implements ICraftingMonitorListener {
private ICraftingMonitor craftingMonitor; private ICraftingMonitor craftingMonitor;
private IResizableDisplay resizableDisplay; private IResizableDisplay resizableDisplay;
private boolean addedListener;
public ContainerCraftingMonitor(ICraftingMonitor craftingMonitor, @Nullable TileCraftingMonitor craftingMonitorTile, EntityPlayer player, IResizableDisplay resizableDisplay) { public ContainerCraftingMonitor(ICraftingMonitor craftingMonitor, @Nullable TileCraftingMonitor craftingMonitorTile, EntityPlayer player, IResizableDisplay resizableDisplay) {
super(craftingMonitorTile, player); super(craftingMonitorTile, player);
@@ -30,12 +36,31 @@ public class ContainerCraftingMonitor extends ContainerBase {
addPlayerInventory(8, resizableDisplay.getYPlayerInventory()); 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 @Override
public void onContainerClosed(EntityPlayer player) { public void onContainerClosed(EntityPlayer player) {
super.onContainerClosed(player); super.onContainerClosed(player);
if (!player.getEntityWorld().isRemote) { ICraftingManager manager = craftingMonitor.getCraftingManager();
craftingMonitor.onClosed(player); 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() { protected boolean isHeldItemDisabled() {
return craftingMonitor instanceof WirelessCraftingMonitor; 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());
}
} }

View File

@@ -1,10 +1,10 @@
package com.raoulvdberge.refinedstorage.tile.craftingmonitor; 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.api.autocrafting.task.ICraftingTask;
import com.raoulvdberge.refinedstorage.tile.data.TileDataParameter; import com.raoulvdberge.refinedstorage.tile.data.TileDataParameter;
import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.util.math.BlockPos;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import java.util.List; import java.util.List;
@@ -16,11 +16,11 @@ public interface ICraftingMonitor {
TileDataParameter<Integer, ?> getRedstoneModeParameter(); TileDataParameter<Integer, ?> getRedstoneModeParameter();
@Nullable
BlockPos getNetworkPosition();
List<ICraftingTask> getTasks(); List<ICraftingTask> getTasks();
@Nullable
ICraftingManager getCraftingManager();
int getSize(); int getSize();
void onSizeChanged(int size); void onSizeChanged(int size);

View File

@@ -1,6 +1,7 @@
package com.raoulvdberge.refinedstorage.tile.craftingmonitor; package com.raoulvdberge.refinedstorage.tile.craftingmonitor;
import com.raoulvdberge.refinedstorage.RS; 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.autocrafting.task.ICraftingTask;
import com.raoulvdberge.refinedstorage.api.network.INetwork; import com.raoulvdberge.refinedstorage.api.network.INetwork;
import com.raoulvdberge.refinedstorage.gui.GuiBase; import com.raoulvdberge.refinedstorage.gui.GuiBase;
@@ -16,6 +17,7 @@ import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraftforge.common.DimensionManager; import net.minecraftforge.common.DimensionManager;
import javax.annotation.Nullable;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
@@ -52,11 +54,6 @@ public class WirelessCraftingMonitor implements ICraftingMonitor {
return null; return null;
} }
@Override
public BlockPos getNetworkPosition() {
return network;
}
@Override @Override
public List<ICraftingTask> getTasks() { public List<ICraftingTask> getTasks() {
INetwork network = getNetwork(); INetwork network = getNetwork();
@@ -68,6 +65,18 @@ public class WirelessCraftingMonitor implements ICraftingMonitor {
return Collections.emptyList(); return Collections.emptyList();
} }
@Nullable
@Override
public ICraftingManager getCraftingManager() {
INetwork network = getNetwork();
if (network != null) {
return network.getCraftingManager();
}
return null;
}
@Override @Override
public int getSize() { public int getSize() {
return size; return size;