When a machine is in use by a crafting pattern, inserting of items from other patterns will be avoided, fixes #367
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
package refinedstorage.api.autocrafting;
|
||||
|
||||
import net.minecraft.tileentity.TileEntity;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraftforge.items.IItemHandler;
|
||||
|
||||
@@ -17,9 +18,14 @@ public interface ICraftingPatternContainer {
|
||||
int getSpeed();
|
||||
|
||||
/**
|
||||
* @return the {@link IItemHandler} that this container is facing
|
||||
* @return the tile that this container is facing
|
||||
*/
|
||||
IItemHandler getConnectedItems();
|
||||
TileEntity getFacingTile();
|
||||
|
||||
/**
|
||||
* @return the inventory that this container is facing
|
||||
*/
|
||||
IItemHandler getFacingInventory();
|
||||
|
||||
/**
|
||||
* @return the patterns stored in this container
|
||||
|
||||
@@ -156,4 +156,31 @@ public class CraftingPattern implements ICraftingPattern {
|
||||
|
||||
return quantity;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(Object other) {
|
||||
if (!(other instanceof CraftingPattern)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
CraftingPattern otherPattern = (CraftingPattern) other;
|
||||
|
||||
if (inputs.size() != otherPattern.inputs.size() || outputs.size() != otherPattern.outputs.size()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
for (int i = 0; i < inputs.size(); ++i) {
|
||||
if (!CompareUtils.compareStack(inputs.get(i), otherPattern.inputs.get(i))) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
for (int i = 0; i < outputs.size(); ++i) {
|
||||
if (!CompareUtils.compareStack(outputs.get(i), otherPattern.outputs.get(i))) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,6 +3,7 @@ package refinedstorage.apiimpl.autocrafting.registry;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
import net.minecraft.nbt.NBTTagList;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraftforge.common.util.Constants;
|
||||
import refinedstorage.api.autocrafting.ICraftingPattern;
|
||||
@@ -30,6 +31,10 @@ public class CraftingTaskFactoryProcessing implements ICraftingTaskFactory {
|
||||
task.setSatisfiedInsertion(CraftingTask.readBooleanArray(tag, CraftingTaskProcessing.NBT_SATISFIED_INSERTION));
|
||||
task.setChecked(CraftingTask.readBooleanArray(tag, CraftingTask.NBT_CHECKED));
|
||||
|
||||
if (tag.hasKey(CraftingTaskProcessing.NBT_TILE_IN_USE)) {
|
||||
task.setTileInUse(BlockPos.fromLong(tag.getLong(CraftingTaskProcessing.NBT_TILE_IN_USE)));
|
||||
}
|
||||
|
||||
List<ItemStack> took = new ArrayList<>();
|
||||
|
||||
NBTTagList tookTag = tag.getTagList(CraftingTask.NBT_TOOK, Constants.NBT.TAG_COMPOUND);
|
||||
|
||||
@@ -2,19 +2,25 @@ package refinedstorage.apiimpl.autocrafting.task;
|
||||
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.world.World;
|
||||
import net.minecraftforge.items.ItemHandlerHelper;
|
||||
import refinedstorage.api.autocrafting.ICraftingPattern;
|
||||
import refinedstorage.api.autocrafting.ICraftingPatternContainer;
|
||||
import refinedstorage.api.autocrafting.task.CraftingTask;
|
||||
import refinedstorage.api.autocrafting.task.ICraftingTask;
|
||||
import refinedstorage.api.network.INetworkMaster;
|
||||
import refinedstorage.api.storage.CompareUtils;
|
||||
import refinedstorage.apiimpl.storage.fluid.FluidUtils;
|
||||
|
||||
public class CraftingTaskProcessing extends CraftingTask {
|
||||
public static final String NBT_SATISFIED_INSERTION = "SatisfiedInsertion";
|
||||
public static final String NBT_TILE_IN_USE = "TileInUse";
|
||||
|
||||
private boolean satisfiedInsertion[];
|
||||
private BlockPos tileInUse;
|
||||
|
||||
private boolean waitingOnTileInUse;
|
||||
|
||||
public CraftingTaskProcessing(ICraftingPattern pattern) {
|
||||
super(pattern);
|
||||
@@ -26,6 +32,10 @@ public class CraftingTaskProcessing extends CraftingTask {
|
||||
this.satisfiedInsertion = satisfiedInsertion;
|
||||
}
|
||||
|
||||
public void setTileInUse(BlockPos tileInUse) {
|
||||
this.tileInUse = tileInUse;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean update(World world, INetworkMaster network) {
|
||||
for (int i = 0; i < pattern.getInputs().size(); ++i) {
|
||||
@@ -54,15 +64,37 @@ public class CraftingTaskProcessing extends CraftingTask {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!took.isEmpty()) {
|
||||
ICraftingPatternContainer container = pattern.getContainer();
|
||||
ICraftingPatternContainer container = pattern.getContainer();
|
||||
|
||||
ItemStack toInsert = took.get(0);
|
||||
if (container.getFacingTile() == null) {
|
||||
tileInUse = null;
|
||||
|
||||
if (ItemHandlerHelper.insertItem(container.getConnectedItems(), toInsert, true) == null) {
|
||||
ItemHandlerHelper.insertItem(container.getConnectedItems(), toInsert, false);
|
||||
waitingOnTileInUse = false;
|
||||
|
||||
took.remove(0);
|
||||
network.updateCraftingTasks();
|
||||
}
|
||||
|
||||
if (!took.isEmpty() && container.getFacingTile() != null) {
|
||||
boolean wasWaitingOnTileInUse = waitingOnTileInUse;
|
||||
|
||||
waitingOnTileInUse = isTileInUse(network);
|
||||
|
||||
if (wasWaitingOnTileInUse != waitingOnTileInUse) {
|
||||
network.updateCraftingTasks();
|
||||
}
|
||||
|
||||
if (!waitingOnTileInUse) {
|
||||
tileInUse = pattern.getContainer().getFacingTile().getPos();
|
||||
|
||||
ItemStack toInsert = took.get(0);
|
||||
|
||||
if (ItemHandlerHelper.insertItem(container.getFacingInventory(), toInsert, true) == null) {
|
||||
ItemHandlerHelper.insertItem(container.getFacingInventory(), toInsert, false);
|
||||
|
||||
took.remove(0);
|
||||
|
||||
network.updateCraftingTasks();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -89,6 +121,32 @@ public class CraftingTaskProcessing extends CraftingTask {
|
||||
return true;
|
||||
}
|
||||
|
||||
private boolean isTileInUse(INetworkMaster network) {
|
||||
for (ICraftingTask task : network.getCraftingTasks()) {
|
||||
if (isTileInUse(task)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
private boolean isTileInUse(ICraftingTask task) {
|
||||
if (task != this && task instanceof CraftingTaskProcessing) {
|
||||
if (task.getChild() != null) {
|
||||
return isTileInUse(task.getChild());
|
||||
}
|
||||
|
||||
CraftingTaskProcessing other = (CraftingTaskProcessing) task;
|
||||
|
||||
if (other.tileInUse != null && other.tileInUse.equals(pattern.getContainer().getFacingTile().getPos()) && !other.pattern.equals(pattern)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean onInserted(ItemStack stack) {
|
||||
if (isReady()) {
|
||||
return false;
|
||||
@@ -101,6 +159,10 @@ public class CraftingTaskProcessing extends CraftingTask {
|
||||
if (CompareUtils.compareStackNoQuantity(output, stack)) {
|
||||
satisfiedInsertion[i] = true;
|
||||
|
||||
if (isReady()) {
|
||||
tileInUse = null;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
@@ -113,6 +175,10 @@ public class CraftingTaskProcessing extends CraftingTask {
|
||||
public NBTTagCompound writeToNBT(NBTTagCompound tag) {
|
||||
super.writeToNBT(tag);
|
||||
|
||||
if (tileInUse != null) {
|
||||
tag.setLong(NBT_TILE_IN_USE, tileInUse.toLong());
|
||||
}
|
||||
|
||||
writeBooleanArray(tag, NBT_SATISFIED_INSERTION, satisfiedInsertion);
|
||||
|
||||
return tag;
|
||||
@@ -160,6 +226,12 @@ public class CraftingTaskProcessing extends CraftingTask {
|
||||
for (int i = 0; i < pattern.getInputs().size(); ++i) {
|
||||
builder.append("T=").append(pattern.getInputs().get(i).getUnlocalizedName()).append(".name\n");
|
||||
}
|
||||
|
||||
if (pattern.getContainer().getFacingTile() == null) {
|
||||
builder.append("B=gui.refinedstorage:crafting_monitor.machine_none");
|
||||
} else if (waitingOnTileInUse) {
|
||||
builder.append("B=gui.refinedstorage:crafting_monitor.machine_in_use");
|
||||
}
|
||||
}
|
||||
|
||||
return builder.toString();
|
||||
|
||||
@@ -133,6 +133,8 @@ public class GuiCraftingMonitor extends GuiBase {
|
||||
line = t(line.substring(2));
|
||||
} else if (line.startsWith("I=")) {
|
||||
line = TextFormatting.YELLOW + t(line.substring(2));
|
||||
} else if (line.startsWith("B=")) {
|
||||
line = TextFormatting.BLUE + t(line.substring(2));
|
||||
}
|
||||
|
||||
lines[j] = line;
|
||||
|
||||
@@ -203,7 +203,7 @@ public abstract class TileBase extends TileEntity implements ITickable {
|
||||
}
|
||||
}
|
||||
|
||||
protected IItemHandler getItemHandler(TileEntity tile, EnumFacing side) {
|
||||
public static IItemHandler getItemHandler(TileEntity tile, EnumFacing side) {
|
||||
if (tile == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -157,7 +157,7 @@ public class TileCrafter extends TileNode implements ICraftingPatternContainer {
|
||||
}
|
||||
|
||||
@Override
|
||||
public IItemHandler getConnectedItems() {
|
||||
public IItemHandler getFacingInventory() {
|
||||
return getItemHandler(getFacingTile(), getDirection().getOpposite());
|
||||
}
|
||||
|
||||
|
||||
@@ -22,7 +22,6 @@ gui.refinedstorage:crafting_monitor=Craftingprozess Überwachung
|
||||
gui.refinedstorage:crafting_monitor.missing_items=Fehlende Items
|
||||
gui.refinedstorage:crafting_monitor.items_crafting=Items werden gecraftet
|
||||
gui.refinedstorage:crafting_monitor.items_processing=Items werden verarbeitet
|
||||
gui.refinedstorage:crafting_monitor.not_started_yet=Noch nicht gestartet
|
||||
gui.refinedstorage:wireless_transmitter=Kabelloser Übermittler
|
||||
gui.refinedstorage:wireless_transmitter.distance=%d Blöcke
|
||||
gui.refinedstorage:crafter=Crafter
|
||||
|
||||
@@ -22,7 +22,8 @@ gui.refinedstorage:crafting_monitor=Crafting Monitor
|
||||
gui.refinedstorage:crafting_monitor.missing_items=Missing items
|
||||
gui.refinedstorage:crafting_monitor.items_crafting=Items crafting
|
||||
gui.refinedstorage:crafting_monitor.items_processing=Items processing
|
||||
gui.refinedstorage:crafting_monitor.not_started_yet=Not started yet
|
||||
gui.refinedstorage:crafting_monitor.machine_in_use=Waiting on machine that is in use by another task
|
||||
gui.refinedstorage:crafting_monitor.machine_none=No machine found
|
||||
gui.refinedstorage:wireless_transmitter=Wireless Transmitter
|
||||
gui.refinedstorage:wireless_transmitter.distance=%d blocks
|
||||
gui.refinedstorage:crafter=Crafter
|
||||
|
||||
@@ -21,7 +21,6 @@ gui.refinedstorage:crafting_monitor=Moniteur de Craft
|
||||
gui.refinedstorage:crafting_monitor.missing_items=Items manquant
|
||||
gui.refinedstorage:crafting_monitor.items_crafting=Items en craft
|
||||
gui.refinedstorage:crafting_monitor.items_processing=Items en traitement
|
||||
gui.refinedstorage:crafting_monitor.not_started_yet=Pas encore commencé
|
||||
gui.refinedstorage:wireless_transmitter=Émetteur sans Fil
|
||||
gui.refinedstorage:wireless_transmitter.distance=%d blocks
|
||||
gui.refinedstorage:crafter=Crafteur
|
||||
|
||||
@@ -22,7 +22,8 @@ gui.refinedstorage:crafting_monitor=Crafting Monitor
|
||||
gui.refinedstorage:crafting_monitor.missing_items=Ontbrekende items
|
||||
gui.refinedstorage:crafting_monitor.items_crafting=Items aan het craften
|
||||
gui.refinedstorage:crafting_monitor.items_processing=Items aan het verwerken
|
||||
gui.refinedstorage:crafting_monitor.not_started_yet=Nog niet begonnen
|
||||
gui.refinedstorage:crafting_monitor.machine_in_use=Wachten op machine die gebruikt wordt door een andere crafting taak
|
||||
gui.refinedstorage:crafting_monitor.machine_none=Geen machine gevonden
|
||||
gui.refinedstorage:wireless_transmitter=Draadloze Zender
|
||||
gui.refinedstorage:wireless_transmitter.distance=%d blokken
|
||||
gui.refinedstorage:crafter=Crafter
|
||||
@@ -66,7 +67,7 @@ misc.refinedstorage:start=Start
|
||||
misc.refinedstorage:clear=Legen
|
||||
misc.refinedstorage:cancel_all=Annuleer alles
|
||||
misc.refinedstorage:priority=Prioriteit
|
||||
misc.refinedstorage:use_oredict=Gebruik ore dict
|
||||
misc.refinedstorage:use_oredict=Gebruik oredict
|
||||
|
||||
sidebutton.refinedstorage:compare.1=Vergelijken op schade
|
||||
sidebutton.refinedstorage:compare.2=Vergelijken op NBT
|
||||
|
||||
@@ -21,7 +21,6 @@ gui.refinedstorage:crafting_monitor=Monitor de Fabricação
|
||||
gui.refinedstorage:crafting_monitor.missing_items=Itens faltantes
|
||||
gui.refinedstorage:crafting_monitor.items_crafting=Itens em construção
|
||||
gui.refinedstorage:crafting_monitor.items_processing=Itens em processamento
|
||||
gui.refinedstorage:crafting_monitor.not_started_yet=Não iniciado
|
||||
gui.refinedstorage:wireless_transmitter=Transmissor Sem Fio
|
||||
gui.refinedstorage:wireless_transmitter.distance=%d blocks
|
||||
gui.refinedstorage:crafter=Fabricador
|
||||
|
||||
@@ -22,7 +22,6 @@ gui.refinedstorage:crafting_monitor=Терминал запросов
|
||||
gui.refinedstorage:crafting_monitor.missing_items=Недостающие предметы
|
||||
gui.refinedstorage:crafting_monitor.items_crafting=Предметы с возможностью крафта
|
||||
gui.refinedstorage:crafting_monitor.items_processing=Предметы с возможностью обработки
|
||||
gui.refinedstorage:crafting_monitor.not_started_yet=Еще не началось
|
||||
gui.refinedstorage:wireless_transmitter=Передатчик
|
||||
gui.refinedstorage:wireless_transmitter.distance=%d блоков
|
||||
gui.refinedstorage:crafter=Крафтер
|
||||
|
||||
@@ -21,7 +21,6 @@ gui.refinedstorage:crafting_monitor=合成监控处理器
|
||||
gui.refinedstorage:crafting_monitor.missing_items=缺少物品
|
||||
gui.refinedstorage:crafting_monitor.items_crafting=正在合成
|
||||
gui.refinedstorage:crafting_monitor.items_processing=正在处理
|
||||
gui.refinedstorage:crafting_monitor.not_started_yet=等待中
|
||||
gui.refinedstorage:wireless_transmitter=无线访问点
|
||||
gui.refinedstorage:wireless_transmitter.distance=%d 方块
|
||||
gui.refinedstorage:crafter=装配室
|
||||
|
||||
Reference in New Issue
Block a user