From 8a7c5c7cd9ad37425630355eb2076c8abe03eca0 Mon Sep 17 00:00:00 2001 From: Raoul Van den Berge Date: Tue, 12 Apr 2016 17:57:37 +0200 Subject: [PATCH] Got the first autocraft to work! --- .../java/refinedstorage/item/ItemPattern.java | 24 +++++++++ .../refinedstorage/tile/TileController.java | 49 +++++++++++++----- .../tile/autocrafting/CraftingTask.java | 50 ++++++++----------- .../refinedstorage/tile/grid/TileGrid.java | 8 +++ 4 files changed, 91 insertions(+), 40 deletions(-) diff --git a/src/main/java/refinedstorage/item/ItemPattern.java b/src/main/java/refinedstorage/item/ItemPattern.java index 6dc5bfbf6..bd887e869 100755 --- a/src/main/java/refinedstorage/item/ItemPattern.java +++ b/src/main/java/refinedstorage/item/ItemPattern.java @@ -8,6 +8,7 @@ import java.util.List; public class ItemPattern extends ItemBase { public static final String NBT_RESULT = "Result"; + public static final String NBT_SLOT = "Slot_%d"; public ItemPattern() { super("pattern"); @@ -20,6 +21,29 @@ public class ItemPattern extends ItemBase { } } + public static void setSlot(ItemStack pattern, int slot, ItemStack stack) { + if (pattern.getTagCompound() == null) { + pattern.setTagCompound(new NBTTagCompound()); + } + + NBTTagCompound tag = new NBTTagCompound(); + stack.writeToNBT(tag); + + pattern.getTagCompound().setTag(String.format(NBT_SLOT, slot), tag); + } + + public static ItemStack getSlot(ItemStack pattern, int slot) { + if (pattern.getTagCompound() == null) { + return null; + } + + if (pattern.getTagCompound().hasKey(String.format(NBT_SLOT, slot))) { + return ItemStack.loadItemStackFromNBT(pattern.getTagCompound().getCompoundTag(String.format(NBT_SLOT, slot))); + } + + return null; + } + public static void setResult(ItemStack pattern, ItemStack stack) { if (pattern.getTagCompound() == null) { pattern.setTagCompound(new NBTTagCompound()); diff --git a/src/main/java/refinedstorage/tile/TileController.java b/src/main/java/refinedstorage/tile/TileController.java index c8d696faa..bacd63c7d 100755 --- a/src/main/java/refinedstorage/tile/TileController.java +++ b/src/main/java/refinedstorage/tile/TileController.java @@ -241,12 +241,8 @@ public class TileController extends TileBase implements IEnergyReceiver, INetwor craftingTasksToAdd.add(task); } - private void syncItems() { - itemGroups.clear(); - - for (IStorage storage : storages) { - storage.addItems(itemGroups); - } + public List getPatterns() { + List patterns = new ArrayList(); for (TileMachine machine : machines) { if (machine instanceof TileInterface) { @@ -256,14 +252,38 @@ public class TileController extends TileBase implements IEnergyReceiver, INetwor ItemStack pattern = tile.getStackInSlot(i); if (pattern != null) { - ItemGroup patternGroup = new ItemGroup(ItemPattern.getResult(pattern)); - patternGroup.setQuantity(0); - itemGroups.add(patternGroup); + patterns.add(pattern); } } } } + return patterns; + } + + public ItemStack getPatternForItem(ItemStack stack) { + for (ItemStack pattern : getPatterns()) { + if (InventoryUtils.compareStackNoQuantity(ItemPattern.getResult(pattern), stack)) { + return pattern; + } + } + + return null; + } + + private void syncItems() { + itemGroups.clear(); + + for (IStorage storage : storages) { + storage.addItems(itemGroups); + } + + for (ItemStack pattern : getPatterns()) { + ItemGroup patternGroup = new ItemGroup(ItemPattern.getResult(pattern)); + patternGroup.setQuantity(0); + itemGroups.add(patternGroup); + } + combineItems(); } @@ -655,10 +675,15 @@ public class TileController extends TileBase implements IEnergyReceiver, INetwor public void onCraftingRequested(int id, int quantity) { if (id >= 0 && id < itemGroups.size() && quantity > 0) { + System.out.println("Start for " + quantity); for (int i = 0; i < quantity; ++i) { - ItemStack toCraft = itemGroups.get(id).toItemStack(); - toCraft.stackSize = 1; - addCraftingTask(CraftingTask.create(toCraft)); + ItemStack pattern = getPatternForItem(itemGroups.get(id).toItemStack()); + + if (pattern != null) { + addCraftingTask(CraftingTask.createFromPattern(pattern)); + } else { + System.out.println("Pattern not found !"); + } } } } diff --git a/src/main/java/refinedstorage/tile/autocrafting/CraftingTask.java b/src/main/java/refinedstorage/tile/autocrafting/CraftingTask.java index a7f291bbf..73945e608 100755 --- a/src/main/java/refinedstorage/tile/autocrafting/CraftingTask.java +++ b/src/main/java/refinedstorage/tile/autocrafting/CraftingTask.java @@ -1,11 +1,8 @@ package refinedstorage.tile.autocrafting; import net.minecraft.item.ItemStack; -import net.minecraft.item.crafting.CraftingManager; -import net.minecraft.item.crafting.IRecipe; -import net.minecraft.item.crafting.ShapedRecipes; +import refinedstorage.item.ItemPattern; import refinedstorage.tile.TileController; -import refinedstorage.util.InventoryUtils; import java.util.ArrayList; import java.util.List; @@ -29,11 +26,20 @@ public class CraftingTask { ItemStack took = controller.take(ingredient.getStack().copy()); if (took != null) { + System.out.println("Ingredient " + ingredient.getStack() + " SATISFIED"); ingredient.setSatisfied(); } else if (!ingredient.isSubtaskCreated()) { - CraftingTask subTask = CraftingTask.create(ingredient.getStack()); - ingredient.setSubtaskCreated(); - controller.addCraftingTask(subTask); + System.out.println("Ingredient " + ingredient.getStack() + " NOT SATISFIED, creating subtask"); + + ItemStack pattern = controller.getPatternForItem(ingredient.getStack()); + + if (pattern != null) { + System.out.println("Found a pattern for this!"); + CraftingTask subTask = CraftingTask.createFromPattern(pattern); + ingredient.setSubtaskCreated(); + controller.addCraftingTask(subTask); + break; + } } } } @@ -47,31 +53,19 @@ public class CraftingTask { return true; } - public static CraftingTask create(ItemStack result) { + public static CraftingTask createFromPattern(ItemStack pattern) { + System.out.println("Creating crafting task for " + ItemPattern.getResult(pattern)); List ingredients = new ArrayList(); - addCraftingIngredients(ingredients, result); + for (int i = 0; i < 9; ++i) { + ItemStack ingredient = ItemPattern.getSlot(pattern, i); - return new CraftingTask(result, ingredients); - } - - private static void addCraftingIngredients(List ingredients, ItemStack result) { - for (IRecipe recipe : CraftingManager.getInstance().getRecipeList()) { - if (recipe instanceof ShapedRecipes) { - ItemStack output = recipe.getRecipeOutput(); - // this may seem unnecessary but keep it, some mods return a null itemstack - if (output != null && output.getItem() != null) { - // first check if the output is the stack we're adding the ingredients for - if (InventoryUtils.compareStack(output, result)) { - // now get all the ingredients from that recipe - for (ItemStack ingredient : ((ShapedRecipes) recipe).recipeItems) { - if (ingredient != null) { - ingredients.add(new CraftingIngredient(ingredient)); - } - } - } - } + if (ingredient != null) { + System.out.println("Ingredient #" + i + ": " + ingredient); + ingredients.add(new CraftingIngredient(ingredient)); } } + + return new CraftingTask(ItemPattern.getResult(pattern), ingredients); } } diff --git a/src/main/java/refinedstorage/tile/grid/TileGrid.java b/src/main/java/refinedstorage/tile/grid/TileGrid.java index 12b6d03c9..4e39f9e5b 100755 --- a/src/main/java/refinedstorage/tile/grid/TileGrid.java +++ b/src/main/java/refinedstorage/tile/grid/TileGrid.java @@ -171,6 +171,14 @@ public class TileGrid extends TileMachine implements IGrid { ItemStack pattern = new ItemStack(RefinedStorageItems.PATTERN); ItemPattern.setResult(pattern, crafted); + for (int i = 0; i < 9; ++i) { + ItemStack ingredient = craftingInventory.getStackInSlot(i); + + if (ingredient != null) { + ItemPattern.setSlot(pattern, i, ingredient); + } + } + patternsInventory.setInventorySlotContents(1, pattern); } }