diff --git a/CHANGELOG.md b/CHANGELOG.md index a3a8e417e..f2f0b8a59 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ - Added support for ore dictionary substitutions in Crafting Patterns (raoulvdberge) - Added Disk Manipulator (way2muchnoise) - Added ingame config (way2muchnoise) +- When a machine is in use by a crafting pattern, inserting of items from other patterns will be avoided (raoulvdberge) - Updated Dutch translation (raoulvdberge) ### 1.0.4 diff --git a/src/main/java/refinedstorage/api/autocrafting/ICraftingPatternContainer.java b/src/main/java/refinedstorage/api/autocrafting/ICraftingPatternContainer.java index ea787b03c..c7b8a4249 100755 --- a/src/main/java/refinedstorage/api/autocrafting/ICraftingPatternContainer.java +++ b/src/main/java/refinedstorage/api/autocrafting/ICraftingPatternContainer.java @@ -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 diff --git a/src/main/java/refinedstorage/apiimpl/autocrafting/CraftingPattern.java b/src/main/java/refinedstorage/apiimpl/autocrafting/CraftingPattern.java index 27f064905..98707caec 100755 --- a/src/main/java/refinedstorage/apiimpl/autocrafting/CraftingPattern.java +++ b/src/main/java/refinedstorage/apiimpl/autocrafting/CraftingPattern.java @@ -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; + } } diff --git a/src/main/java/refinedstorage/apiimpl/autocrafting/registry/CraftingTaskFactoryProcessing.java b/src/main/java/refinedstorage/apiimpl/autocrafting/registry/CraftingTaskFactoryProcessing.java index 9dc185c33..37fec4b7a 100755 --- a/src/main/java/refinedstorage/apiimpl/autocrafting/registry/CraftingTaskFactoryProcessing.java +++ b/src/main/java/refinedstorage/apiimpl/autocrafting/registry/CraftingTaskFactoryProcessing.java @@ -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 took = new ArrayList<>(); NBTTagList tookTag = tag.getTagList(CraftingTask.NBT_TOOK, Constants.NBT.TAG_COMPOUND); diff --git a/src/main/java/refinedstorage/apiimpl/autocrafting/task/CraftingTaskProcessing.java b/src/main/java/refinedstorage/apiimpl/autocrafting/task/CraftingTaskProcessing.java index 2f297a324..702c6fc89 100755 --- a/src/main/java/refinedstorage/apiimpl/autocrafting/task/CraftingTaskProcessing.java +++ b/src/main/java/refinedstorage/apiimpl/autocrafting/task/CraftingTaskProcessing.java @@ -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(); diff --git a/src/main/java/refinedstorage/gui/GuiCraftingMonitor.java b/src/main/java/refinedstorage/gui/GuiCraftingMonitor.java index deed419af..ac17bb13b 100755 --- a/src/main/java/refinedstorage/gui/GuiCraftingMonitor.java +++ b/src/main/java/refinedstorage/gui/GuiCraftingMonitor.java @@ -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; diff --git a/src/main/java/refinedstorage/tile/TileBase.java b/src/main/java/refinedstorage/tile/TileBase.java index c15170411..f28795b59 100755 --- a/src/main/java/refinedstorage/tile/TileBase.java +++ b/src/main/java/refinedstorage/tile/TileBase.java @@ -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; } diff --git a/src/main/java/refinedstorage/tile/TileCrafter.java b/src/main/java/refinedstorage/tile/TileCrafter.java index 8d97d130f..6ff79e946 100755 --- a/src/main/java/refinedstorage/tile/TileCrafter.java +++ b/src/main/java/refinedstorage/tile/TileCrafter.java @@ -157,7 +157,7 @@ public class TileCrafter extends TileNode implements ICraftingPatternContainer { } @Override - public IItemHandler getConnectedItems() { + public IItemHandler getFacingInventory() { return getItemHandler(getFacingTile(), getDirection().getOpposite()); } diff --git a/src/main/resources/assets/refinedstorage/lang/de_DE.lang b/src/main/resources/assets/refinedstorage/lang/de_DE.lang index 408f217f4..649f8f52d 100755 --- a/src/main/resources/assets/refinedstorage/lang/de_DE.lang +++ b/src/main/resources/assets/refinedstorage/lang/de_DE.lang @@ -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 diff --git a/src/main/resources/assets/refinedstorage/lang/en_US.lang b/src/main/resources/assets/refinedstorage/lang/en_US.lang index 19458e8f4..02ac1c492 100755 --- a/src/main/resources/assets/refinedstorage/lang/en_US.lang +++ b/src/main/resources/assets/refinedstorage/lang/en_US.lang @@ -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 diff --git a/src/main/resources/assets/refinedstorage/lang/fr_FR.lang b/src/main/resources/assets/refinedstorage/lang/fr_FR.lang index f8d0c38bd..5b9479e1d 100755 --- a/src/main/resources/assets/refinedstorage/lang/fr_FR.lang +++ b/src/main/resources/assets/refinedstorage/lang/fr_FR.lang @@ -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 diff --git a/src/main/resources/assets/refinedstorage/lang/nl_NL.lang b/src/main/resources/assets/refinedstorage/lang/nl_NL.lang index 3ebc7aa06..fce520800 100755 --- a/src/main/resources/assets/refinedstorage/lang/nl_NL.lang +++ b/src/main/resources/assets/refinedstorage/lang/nl_NL.lang @@ -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 diff --git a/src/main/resources/assets/refinedstorage/lang/pt_BR.lang b/src/main/resources/assets/refinedstorage/lang/pt_BR.lang index 48512e268..cbfc79cc3 100755 --- a/src/main/resources/assets/refinedstorage/lang/pt_BR.lang +++ b/src/main/resources/assets/refinedstorage/lang/pt_BR.lang @@ -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 diff --git a/src/main/resources/assets/refinedstorage/lang/ru_RU.lang b/src/main/resources/assets/refinedstorage/lang/ru_RU.lang index fdfbf7894..5707f7659 100755 --- a/src/main/resources/assets/refinedstorage/lang/ru_RU.lang +++ b/src/main/resources/assets/refinedstorage/lang/ru_RU.lang @@ -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=Крафтер diff --git a/src/main/resources/assets/refinedstorage/lang/zh_CN.lang b/src/main/resources/assets/refinedstorage/lang/zh_CN.lang index f93534c96..ad4302126 100755 --- a/src/main/resources/assets/refinedstorage/lang/zh_CN.lang +++ b/src/main/resources/assets/refinedstorage/lang/zh_CN.lang @@ -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=装配室