Refactor crafting monitor update/listening system.
This commit is contained in:
@@ -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);
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
|
}
|
||||||
@@ -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);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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()) {
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user