From e6aa318e3c2bc3302944c59b9563b3f5e5aa198d Mon Sep 17 00:00:00 2001 From: Raoul Van den Berge Date: Thu, 9 Jun 2016 17:28:28 +0200 Subject: [PATCH] Fixes #94 "multiple recipies" --- CHANGELOG.md | 1 + .../autocrafting/CraftingTaskScheduler.java | 2 +- .../autocrafting/task/BasicCraftingTask.java | 2 +- .../task/ProcessingCraftingTask.java | 2 +- .../tile/controller/StorageHandler.java | 2 +- .../tile/controller/TileController.java | 43 +++++++++++++++++-- 6 files changed, 44 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 93d50d6fa..556de7535 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ **Features** - Added an API - Added Storage Drawers integration +- Added handling for patterns that return the same item - Increased cable recipe to 12 cables ### 0.7.8 diff --git a/src/main/java/refinedstorage/autocrafting/CraftingTaskScheduler.java b/src/main/java/refinedstorage/autocrafting/CraftingTaskScheduler.java index 494114c49..63bb0687f 100755 --- a/src/main/java/refinedstorage/autocrafting/CraftingTaskScheduler.java +++ b/src/main/java/refinedstorage/autocrafting/CraftingTaskScheduler.java @@ -15,7 +15,7 @@ public class CraftingTaskScheduler { } public void schedule(TileController controller, int compare, ItemStack item) { - CraftingPattern pattern = controller.getPattern(item, compare); + CraftingPattern pattern = controller.getPatternWithBestScore(item, compare); if (pattern != null) { scheduledItem = item; diff --git a/src/main/java/refinedstorage/autocrafting/task/BasicCraftingTask.java b/src/main/java/refinedstorage/autocrafting/task/BasicCraftingTask.java index bc3ec70e1..a5dc3c32d 100755 --- a/src/main/java/refinedstorage/autocrafting/task/BasicCraftingTask.java +++ b/src/main/java/refinedstorage/autocrafting/task/BasicCraftingTask.java @@ -71,7 +71,7 @@ public class BasicCraftingTask implements ICraftingTask { satisfied[i] = true; } else if (!childTasks[i]) { - CraftingPattern pattern = controller.getPattern(input); + CraftingPattern pattern = controller.getPatternWithBestScore(input); if (pattern != null) { controller.addCraftingTask(controller.createCraftingTask(pattern)); diff --git a/src/main/java/refinedstorage/autocrafting/task/ProcessingCraftingTask.java b/src/main/java/refinedstorage/autocrafting/task/ProcessingCraftingTask.java index 45b559caf..cdbb05480 100755 --- a/src/main/java/refinedstorage/autocrafting/task/ProcessingCraftingTask.java +++ b/src/main/java/refinedstorage/autocrafting/task/ProcessingCraftingTask.java @@ -64,7 +64,7 @@ public class ProcessingCraftingTask implements ICraftingTask { controller.push(took, took.stackSize, false); } } else if (!childTasks[i]) { - CraftingPattern pattern = controller.getPattern(input); + CraftingPattern pattern = controller.getPatternWithBestScore(input); if (pattern != null) { childTasks[i] = true; diff --git a/src/main/java/refinedstorage/tile/controller/StorageHandler.java b/src/main/java/refinedstorage/tile/controller/StorageHandler.java index f378daefd..3357b799c 100755 --- a/src/main/java/refinedstorage/tile/controller/StorageHandler.java +++ b/src/main/java/refinedstorage/tile/controller/StorageHandler.java @@ -105,7 +105,7 @@ public class StorageHandler { int quantityPerRequest = 0; - CraftingPattern pattern = controller.getPattern(requested); + CraftingPattern pattern = controller.getPatternWithBestScore(requested); if (pattern != null) { for (ItemStack output : pattern.getOutputs()) { diff --git a/src/main/java/refinedstorage/tile/controller/TileController.java b/src/main/java/refinedstorage/tile/controller/TileController.java index c5fb136db..be84c6040 100755 --- a/src/main/java/refinedstorage/tile/controller/TileController.java +++ b/src/main/java/refinedstorage/tile/controller/TileController.java @@ -229,20 +229,55 @@ public class TileController extends TileBase implements IEnergyReceiver, ISynchr return patterns; } - public CraftingPattern getPattern(ItemStack pattern) { + public List getPattern(ItemStack pattern) { return getPattern(pattern, CompareFlags.COMPARE_DAMAGE | CompareFlags.COMPARE_NBT); } - public CraftingPattern getPattern(ItemStack pattern, int flags) { + public List getPattern(ItemStack pattern, int flags) { + List patterns = new ArrayList(); + for (CraftingPattern craftingPattern : getPatterns()) { for (ItemStack output : craftingPattern.getOutputs()) { if (RefinedStorageUtils.compareStack(output, pattern, flags)) { - return craftingPattern; + patterns.add(craftingPattern); } } } - return null; + return patterns; + } + + public CraftingPattern getPatternWithBestScore(ItemStack pattern) { + return getPatternWithBestScore(pattern, CompareFlags.COMPARE_DAMAGE | CompareFlags.COMPARE_NBT); + } + + public CraftingPattern getPatternWithBestScore(ItemStack pattern, int flags) { + List patterns = getPattern(pattern, flags); + + if (patterns.isEmpty()) { + return null; + } else if (patterns.size() == 1) { + return patterns.get(0); + } + + int[] scores = new int[patterns.size()]; + int highestScore = 0; + int highestPattern = 0; + + for (int i = 0; i < patterns.size(); ++i) { + for (ItemStack input : patterns.get(i).getInputs()) { + ItemStack stored = getItem(input, CompareFlags.COMPARE_DAMAGE | CompareFlags.COMPARE_NBT); + + scores[i] += stored != null ? stored.stackSize : 0; + } + + if (scores[i] > highestScore) { + highestScore = scores[i]; + highestPattern = i; + } + } + + return patterns.get(highestPattern); } private void syncMachines() {