diff --git a/CHANGELOG.md b/CHANGELOG.md index a33ae3866..b6ae198e9 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,7 +6,7 @@ WIP **TODO** - Saving crafting task state - Cancelling crafting tasks -- "Craft if needed" upgrade on exporter, constructor and interface +- "Craft if needed" upgrade on constructor and interface - Textures - Update wiki diff --git a/src/main/java/refinedstorage/container/ContainerExporter.java b/src/main/java/refinedstorage/container/ContainerExporter.java index 050d0dc31..5bb244247 100755 --- a/src/main/java/refinedstorage/container/ContainerExporter.java +++ b/src/main/java/refinedstorage/container/ContainerExporter.java @@ -21,7 +21,7 @@ public class ContainerExporter extends ContainerBase { addSlotToContainer(new SlotFiltered(exporter.getUpgradesInventory(), i, 187, 6 + (i * 18), new IItemValidator() { @Override public boolean isValid(ItemStack stack) { - return stack.getItem() == RefinedStorageItems.UPGRADE && stack.getMetadata() == ItemUpgrade.TYPE_SPEED; + return stack.getItem() == RefinedStorageItems.UPGRADE && (stack.getMetadata() == ItemUpgrade.TYPE_SPEED || stack.getMetadata() == ItemUpgrade.TYPE_CRAFTING); } })); } diff --git a/src/main/java/refinedstorage/item/ItemUpgrade.java b/src/main/java/refinedstorage/item/ItemUpgrade.java index 2ec1c317a..0872ecbf1 100755 --- a/src/main/java/refinedstorage/item/ItemUpgrade.java +++ b/src/main/java/refinedstorage/item/ItemUpgrade.java @@ -9,6 +9,7 @@ import java.util.List; public class ItemUpgrade extends ItemBase { public static final int TYPE_RANGE = 1; public static final int TYPE_SPEED = 2; + public static final int TYPE_CRAFTING = 3; public ItemUpgrade() { super("upgrade"); @@ -20,7 +21,7 @@ public class ItemUpgrade extends ItemBase { @Override public void getSubItems(Item item, CreativeTabs tab, List list) { - for (int i = 0; i <= 2; ++i) { + for (int i = 0; i <= 3; ++i) { list.add(new ItemStack(item, 1, i)); } } diff --git a/src/main/java/refinedstorage/tile/TileController.java b/src/main/java/refinedstorage/tile/TileController.java index 27b2d7e58..af1af758f 100755 --- a/src/main/java/refinedstorage/tile/TileController.java +++ b/src/main/java/refinedstorage/tile/TileController.java @@ -260,6 +260,16 @@ public class TileController extends TileBase implements IEnergyReceiver, INetwor craftingTasksToAdd.add(task); } + public boolean hasCraftingTaskWithPattern(CraftingPattern pattern, int flags) { + for (int i = 0; i < craftingTasks.size(); ++i) { + if (craftingTasks.get(i).getPattern().comparePattern(pattern, flags)) { + return true; + } + } + + return false; + } + public void addCraftingTaskForPattern(CraftingPattern pattern) { if (pattern.isProcessing()) { addCraftingTask(new ProcessingCraftingTask(pattern)); @@ -273,9 +283,13 @@ public class TileController extends TileBase implements IEnergyReceiver, INetwor } public CraftingPattern getPatternForItem(ItemStack stack) { + return getPatternForItem(stack, InventoryUtils.COMPARE_DAMAGE | InventoryUtils.COMPARE_NBT); + } + + public CraftingPattern getPatternForItem(ItemStack stack, int flags) { for (CraftingPattern pattern : getPatterns()) { for (ItemStack output : pattern.getOutputs()) { - if (InventoryUtils.compareStackNoQuantity(output, stack)) { + if (InventoryUtils.compareStack(output, stack, flags)) { return pattern; } } diff --git a/src/main/java/refinedstorage/tile/TileExporter.java b/src/main/java/refinedstorage/tile/TileExporter.java index 6ff75b3a6..9116da565 100755 --- a/src/main/java/refinedstorage/tile/TileExporter.java +++ b/src/main/java/refinedstorage/tile/TileExporter.java @@ -9,6 +9,7 @@ import net.minecraft.tileentity.TileEntity; import net.minecraft.tileentity.TileEntityHopper; import refinedstorage.container.ContainerExporter; import refinedstorage.inventory.InventorySimple; +import refinedstorage.tile.autocrafting.CraftingPattern; import refinedstorage.tile.config.ICompareConfig; import refinedstorage.util.InventoryUtils; @@ -48,6 +49,12 @@ public class TileExporter extends TileMachine implements ICompareConfig { if (remaining != null) { controller.push(remaining); } + } else if (TileInterface.hasCrafting(upgradesInventory)) { + CraftingPattern pattern = controller.getPatternForItem(slot, compare); + + if (pattern != null && !controller.hasCraftingTaskWithPattern(pattern, compare)) { + controller.addCraftingTaskForPattern(pattern); + } } } } diff --git a/src/main/java/refinedstorage/tile/TileInterface.java b/src/main/java/refinedstorage/tile/TileInterface.java index 495750017..f1fbe1a0f 100755 --- a/src/main/java/refinedstorage/tile/TileInterface.java +++ b/src/main/java/refinedstorage/tile/TileInterface.java @@ -11,6 +11,7 @@ import net.minecraft.util.EnumFacing; import net.minecraft.util.text.ITextComponent; import refinedstorage.container.ContainerInterface; import refinedstorage.inventory.InventorySimple; +import refinedstorage.item.ItemUpgrade; import refinedstorage.tile.config.ICompareConfig; import refinedstorage.util.InventoryUtils; @@ -40,7 +41,7 @@ public class TileInterface extends TileMachine implements ICompareConfig, ISided int upgrades = 0; for (int i = 0; i < upgradesInventory.getSizeInventory(); ++i) { - if (upgradesInventory.getStackInSlot(i) != null) { + if (upgradesInventory.getStackInSlot(i) != null && upgradesInventory.getStackInSlot(i).getMetadata() == ItemUpgrade.TYPE_SPEED) { upgrades++; } } @@ -48,6 +49,16 @@ public class TileInterface extends TileMachine implements ICompareConfig, ISided return 9 - (upgrades * 2); } + public static boolean hasCrafting(InventorySimple upgradesInventory) { + for (int i = 0; i < upgradesInventory.getSizeInventory(); ++i) { + if (upgradesInventory.getStackInSlot(i) != null && upgradesInventory.getStackInSlot(i).getMetadata() == ItemUpgrade.TYPE_CRAFTING) { + return true; + } + } + + return false; + } + @Override public void updateMachine() { if (currentSlot > 8) { @@ -93,16 +104,18 @@ public class TileInterface extends TileMachine implements ICompareConfig, ISided int needed = got == null ? wanted.stackSize : wanted.stackSize - got.stackSize; - ItemStack goingToTake = wanted.copy(); - goingToTake.stackSize = needed; + if (needed > 0) { + ItemStack goingToTake = wanted.copy(); + goingToTake.stackSize = needed; - ItemStack took = controller.take(goingToTake, compare); + ItemStack took = controller.take(goingToTake, compare); - if (took != null) { - if (got == null) { - inventory.setInventorySlotContents(i + 9, took); - } else { - got.stackSize += took.stackSize; + if (took != null) { + if (got == null) { + inventory.setInventorySlotContents(i + 9, took); + } else { + got.stackSize += took.stackSize; + } } } } diff --git a/src/main/java/refinedstorage/tile/TileSolderer.java b/src/main/java/refinedstorage/tile/TileSolderer.java index 171f309a2..492dd4bb7 100755 --- a/src/main/java/refinedstorage/tile/TileSolderer.java +++ b/src/main/java/refinedstorage/tile/TileSolderer.java @@ -49,7 +49,7 @@ public class TileSolderer extends TileMachine implements IInventory, ISidedInven } else if (newRecipe != recipe) { boolean isSameItem = inventory.getStackInSlot(3) != null ? InventoryUtils.compareStackNoQuantity(inventory.getStackInSlot(3), newRecipe.getResult()) : false; - if (inventory.getStackInSlot(3) == null || (isSameItem && ((inventory.getStackInSlot(3).stackSize + newRecipe.getResult().stackSize) < inventory.getStackInSlot(3).getMaxStackSize()))) { + if (inventory.getStackInSlot(3) == null || (isSameItem && ((inventory.getStackInSlot(3).stackSize + newRecipe.getResult().stackSize) <= inventory.getStackInSlot(3).getMaxStackSize()))) { recipe = newRecipe; progress = 0; working = true; diff --git a/src/main/java/refinedstorage/tile/autocrafting/CraftingPattern.java b/src/main/java/refinedstorage/tile/autocrafting/CraftingPattern.java index 22faca752..aa7f9c109 100755 --- a/src/main/java/refinedstorage/tile/autocrafting/CraftingPattern.java +++ b/src/main/java/refinedstorage/tile/autocrafting/CraftingPattern.java @@ -1,6 +1,7 @@ package refinedstorage.tile.autocrafting; import net.minecraft.item.ItemStack; +import refinedstorage.util.InventoryUtils; public class CraftingPattern { private TileCrafter crafter; @@ -30,4 +31,31 @@ public class CraftingPattern { public ItemStack[] getOutputs() { return outputs; } + + public boolean comparePattern(CraftingPattern otherPattern, int flags) { + if (otherPattern == this) { + return true; + } + + if (otherPattern.getInputs().length != inputs.length || + otherPattern.getOutputs().length != outputs.length || + otherPattern.isProcessing() != processing || + !otherPattern.getCrafter().getPos().equals(crafter.getPos())) { + return false; + } + + for (int i = 0; i < inputs.length; ++i) { + if (!InventoryUtils.compareStack(inputs[i], otherPattern.getInputs()[i], flags)) { + return false; + } + } + + for (int i = 0; i < outputs.length; ++i) { + if (!InventoryUtils.compareStack(outputs[i], otherPattern.getOutputs()[i], flags)) { + return false; + } + } + + return true; + } } diff --git a/src/main/java/refinedstorage/tile/solderer/SoldererRecipeUpgrade.java b/src/main/java/refinedstorage/tile/solderer/SoldererRecipeUpgrade.java index 4d62c1a59..b957a6710 100755 --- a/src/main/java/refinedstorage/tile/solderer/SoldererRecipeUpgrade.java +++ b/src/main/java/refinedstorage/tile/solderer/SoldererRecipeUpgrade.java @@ -1,5 +1,6 @@ package refinedstorage.tile.solderer; +import net.minecraft.init.Blocks; import net.minecraft.init.Items; import net.minecraft.item.ItemStack; import refinedstorage.RefinedStorageItems; @@ -30,7 +31,7 @@ public class SoldererRecipeUpgrade implements ISoldererRecipe { case ItemUpgrade.TYPE_RANGE: return new ItemStack(Items.ender_pearl); case ItemUpgrade.TYPE_SPEED: - return new ItemStack(Items.redstone); + return new ItemStack(Blocks.redstone_block); } return null; diff --git a/src/main/resources/assets/refinedstorage/lang/en_US.lang b/src/main/resources/assets/refinedstorage/lang/en_US.lang index 42c44686b..6adefe62e 100755 --- a/src/main/resources/assets/refinedstorage/lang/en_US.lang +++ b/src/main/resources/assets/refinedstorage/lang/en_US.lang @@ -131,4 +131,5 @@ item.refinedstorage:storage_part.3.name=64k Storage Part item.refinedstorage:pattern.name=Pattern item.refinedstorage:upgrade.0.name=Upgrade item.refinedstorage:upgrade.1.name=Range Upgrade -item.refinedstorage:upgrade.2.name=Speed Upgrade \ No newline at end of file +item.refinedstorage:upgrade.2.name=Speed Upgrade +item.refinedstorage:upgrade.3.name=Crafting Upgrade \ No newline at end of file diff --git a/src/main/resources/assets/refinedstorage/lang/nl_NL.lang b/src/main/resources/assets/refinedstorage/lang/nl_NL.lang index f76a46acb..95d823718 100755 --- a/src/main/resources/assets/refinedstorage/lang/nl_NL.lang +++ b/src/main/resources/assets/refinedstorage/lang/nl_NL.lang @@ -131,4 +131,5 @@ item.refinedstorage:storage_part.3.name=64k Opslagdeel item.refinedstorage:pattern.name=Patroon item.refinedstorage:upgrade.0.name=Upgrade item.refinedstorage:upgrade.1.name=Afstand Upgrade -item.refinedstorage:upgrade.2.name=Snelheid Upgrade \ No newline at end of file +item.refinedstorage:upgrade.2.name=Snelheid Upgrade +item.refinedstorage:upgrade.3.name=Crafting Upgrade \ No newline at end of file