diff --git a/src/main/java/refinedstorage/item/ItemPattern.java b/src/main/java/refinedstorage/item/ItemPattern.java index bd887e869..7458a2cf3 100755 --- a/src/main/java/refinedstorage/item/ItemPattern.java +++ b/src/main/java/refinedstorage/item/ItemPattern.java @@ -3,12 +3,14 @@ package refinedstorage.item; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraftforge.common.util.Constants; 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 static final String NBT_INGREDIENTS = "Ingredients"; public ItemPattern() { super("pattern"); @@ -21,27 +23,36 @@ public class ItemPattern extends ItemBase { } } - public static void setSlot(ItemStack pattern, int slot, ItemStack stack) { + public static void addIngredient(ItemStack pattern, ItemStack stack) { if (pattern.getTagCompound() == null) { pattern.setTagCompound(new NBTTagCompound()); } - NBTTagCompound tag = new NBTTagCompound(); - stack.writeToNBT(tag); + if (!pattern.getTagCompound().hasKey(NBT_INGREDIENTS)) { + pattern.getTagCompound().setTag(NBT_INGREDIENTS, new NBTTagList()); + } - pattern.getTagCompound().setTag(String.format(NBT_SLOT, slot), tag); + pattern.getTagCompound().getTagList(NBT_INGREDIENTS, Constants.NBT.TAG_COMPOUND).appendTag(stack.serializeNBT()); } - public static ItemStack getSlot(ItemStack pattern, int slot) { + public static ItemStack[] getIngredients(ItemStack pattern) { 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))); + if (!pattern.getTagCompound().hasKey(NBT_INGREDIENTS)) { + return null; } - return null; + NBTTagList ingredients = pattern.getTagCompound().getTagList(NBT_INGREDIENTS, Constants.NBT.TAG_COMPOUND); + + ItemStack[] ingredientsArray = new ItemStack[ingredients.tagCount()]; + + for (int i = 0; i < ingredients.tagCount(); ++i) { + ingredientsArray[i] = ItemStack.loadItemStackFromNBT(ingredients.getCompoundTagAt(i)); + } + + return ingredientsArray; } public static void setResult(ItemStack pattern, ItemStack stack) { diff --git a/src/main/java/refinedstorage/tile/TileController.java b/src/main/java/refinedstorage/tile/TileController.java index aa23630e5..5df7d196d 100755 --- a/src/main/java/refinedstorage/tile/TileController.java +++ b/src/main/java/refinedstorage/tile/TileController.java @@ -28,6 +28,7 @@ import refinedstorage.network.MessageWirelessGridItems; import refinedstorage.storage.IStorage; import refinedstorage.storage.IStorageProvider; import refinedstorage.storage.ItemGroup; +import refinedstorage.tile.autocrafting.CraftingPattern; import refinedstorage.tile.autocrafting.CraftingTask; import refinedstorage.tile.config.IRedstoneModeConfig; import refinedstorage.tile.config.RedstoneMode; @@ -162,12 +163,10 @@ public class TileController extends TileBase implements IEnergyReceiver, INetwor while (it.hasNext()) { CraftingTask task = it.next(); - task.attemptCraft(this); - - if (task.isDone()) { + if (task.attemptCraft(this)) { it.remove(); - push(task.getResult()); + push(task.getPattern().getResult()); } } } @@ -244,8 +243,8 @@ public class TileController extends TileBase implements IEnergyReceiver, INetwor craftingTasksToAdd.add(task); } - public List getPatterns() { - List patterns = new ArrayList(); + public List getPatterns() { + List patterns = new ArrayList(); Iterator it = machines.iterator(); @@ -257,7 +256,9 @@ public class TileController extends TileBase implements IEnergyReceiver, INetwor for (int i = 0; i < TileCrafter.PATTERN_SLOTS; ++i) { if (crafter.getStackInSlot(i) != null) { - patterns.add(crafter.getStackInSlot(i)); + ItemStack pattern = crafter.getStackInSlot(i); + + patterns.add(new CraftingPattern(ItemPattern.getResult(pattern), ItemPattern.getIngredients(pattern), 20)); } } } @@ -266,9 +267,9 @@ public class TileController extends TileBase implements IEnergyReceiver, INetwor return patterns; } - public ItemStack getPatternForItem(ItemStack stack) { - for (ItemStack pattern : getPatterns()) { - if (InventoryUtils.compareStackNoQuantity(ItemPattern.getResult(pattern), stack)) { + public CraftingPattern getPatternForItem(ItemStack stack) { + for (CraftingPattern pattern : getPatterns()) { + if (InventoryUtils.compareStackNoQuantity(pattern.getResult(), stack)) { return pattern; } } @@ -283,8 +284,8 @@ public class TileController extends TileBase implements IEnergyReceiver, INetwor storage.addItems(itemGroups); } - for (ItemStack pattern : getPatterns()) { - ItemGroup patternGroup = new ItemGroup(ItemPattern.getResult(pattern)); + for (CraftingPattern pattern : getPatterns()) { + ItemGroup patternGroup = new ItemGroup(pattern.getResult()); patternGroup.setQuantity(0); itemGroups.add(patternGroup); } @@ -683,12 +684,12 @@ public class TileController extends TileBase implements IEnergyReceiver, INetwor public void onCraftingRequested(int id, int quantity) { if (id >= 0 && id < itemGroups.size() && quantity > 0) { while (quantity > 0) { - ItemStack pattern = getPatternForItem(itemGroups.get(id).toItemStack()); + CraftingPattern pattern = getPatternForItem(itemGroups.get(id).toItemStack()); if (pattern != null) { - addCraftingTask(CraftingTask.createFromPattern(pattern)); + addCraftingTask(new CraftingTask(pattern)); - quantity -= ItemPattern.getResult(pattern).stackSize; + quantity -= pattern.getResult().stackSize; } else { break; } diff --git a/src/main/java/refinedstorage/tile/autocrafting/CraftingIngredient.java b/src/main/java/refinedstorage/tile/autocrafting/CraftingIngredient.java deleted file mode 100755 index c2622a8d7..000000000 --- a/src/main/java/refinedstorage/tile/autocrafting/CraftingIngredient.java +++ /dev/null @@ -1,33 +0,0 @@ -package refinedstorage.tile.autocrafting; - -import net.minecraft.item.ItemStack; - -public class CraftingIngredient { - private ItemStack stack; - private boolean satisfied; - private boolean childTaskCreated; - - public CraftingIngredient(ItemStack stack) { - this.stack = stack; - } - - public ItemStack getStack() { - return stack; - } - - public boolean isSatisfied() { - return satisfied; - } - - public void setSatisfied() { - this.satisfied = true; - } - - public boolean isChildTaskCreated() { - return childTaskCreated; - } - - public void setChildTaskCreated() { - childTaskCreated = true; - } -} diff --git a/src/main/java/refinedstorage/tile/autocrafting/CraftingPattern.java b/src/main/java/refinedstorage/tile/autocrafting/CraftingPattern.java new file mode 100755 index 000000000..e4406ce00 --- /dev/null +++ b/src/main/java/refinedstorage/tile/autocrafting/CraftingPattern.java @@ -0,0 +1,27 @@ +package refinedstorage.tile.autocrafting; + +import net.minecraft.item.ItemStack; + +public class CraftingPattern { + private ItemStack result; + private ItemStack[] ingredients; + private int speed; + + public CraftingPattern(ItemStack result, ItemStack[] ingredients, int speed) { + this.result = result; + this.ingredients = ingredients; + this.speed = speed; + } + + public ItemStack getResult() { + return result; + } + + public ItemStack[] getIngredients() { + return ingredients; + } + + public int getSpeed() { + return speed; + } +} diff --git a/src/main/java/refinedstorage/tile/autocrafting/CraftingTask.java b/src/main/java/refinedstorage/tile/autocrafting/CraftingTask.java index 06d45386d..b84ca0dd9 100755 --- a/src/main/java/refinedstorage/tile/autocrafting/CraftingTask.java +++ b/src/main/java/refinedstorage/tile/autocrafting/CraftingTask.java @@ -8,32 +8,41 @@ import java.util.ArrayList; import java.util.List; public class CraftingTask { - private ItemStack result; - private List ingredients; + private CraftingPattern pattern; + private boolean satisfied[]; + private boolean childTasks[]; - public CraftingTask(ItemStack result, List ingredients) { - this.result = result; - this.ingredients = ingredients; + public CraftingTask(CraftingPattern pattern) { + this.pattern = pattern; + this.satisfied = new boolean[pattern.getIngredients().length]; + this.childTasks = new boolean[pattern.getIngredients().length]; } - public ItemStack getResult() { - return result; + public CraftingPattern getPattern() { + return pattern; } - public void attemptCraft(TileController controller) { - for (CraftingIngredient ingredient : ingredients) { - if (!ingredient.isSatisfied()) { - ItemStack took = controller.take(ingredient.getStack().copy()); + public boolean attemptCraft(TileController controller) { + boolean done = true; + + for (int i = 0; i < pattern.getIngredients().length; ++i) { + ItemStack ingredient = pattern.getIngredients()[i]; + + if (!satisfied[i]) { + done = false; + + ItemStack took = controller.take(ingredient.copy()); if (took != null) { - ingredient.setSatisfied(); - } else if (!ingredient.isChildTaskCreated()) { - ItemStack pattern = controller.getPatternForItem(ingredient.getStack()); + satisfied[i] = true; + } else if (!childTasks[i]) { + CraftingPattern pattern = controller.getPatternForItem(ingredient); if (pattern != null) { - CraftingTask childTask = CraftingTask.createFromPattern(pattern); - ingredient.setChildTaskCreated(); - controller.addCraftingTask(childTask); + controller.addCraftingTask(new CraftingTask(pattern)); + + childTasks[i] = true; + break; } } else { @@ -41,29 +50,7 @@ public class CraftingTask { } } } - } - public boolean isDone() { - for (CraftingIngredient ingredient : ingredients) { - if (!ingredient.isSatisfied()) { - return false; - } - } - - return true; - } - - public static CraftingTask createFromPattern(ItemStack pattern) { - List ingredients = new ArrayList(); - - for (int i = 0; i < 9; ++i) { - ItemStack ingredient = ItemPattern.getSlot(pattern, i); - - if (ingredient != null) { - ingredients.add(new CraftingIngredient(ingredient)); - } - } - - return new CraftingTask(ItemPattern.getResult(pattern), ingredients); + return done; } } diff --git a/src/main/java/refinedstorage/tile/autocrafting/TileCraftingMonitor.java b/src/main/java/refinedstorage/tile/autocrafting/TileCraftingMonitor.java index 89e6224fe..1756df48d 100755 --- a/src/main/java/refinedstorage/tile/autocrafting/TileCraftingMonitor.java +++ b/src/main/java/refinedstorage/tile/autocrafting/TileCraftingMonitor.java @@ -30,7 +30,7 @@ public class TileCraftingMonitor extends TileMachine { buf.writeInt(controller.getCraftingTasks().size()); for (CraftingTask task : controller.getCraftingTasks()) { - ByteBufUtils.writeItemStack(buf, task.getResult()); + ByteBufUtils.writeItemStack(buf, task.getPattern().getResult()); } } else { buf.writeInt(0); diff --git a/src/main/java/refinedstorage/tile/grid/TileGrid.java b/src/main/java/refinedstorage/tile/grid/TileGrid.java index c31ced1dc..5afd9a4d1 100755 --- a/src/main/java/refinedstorage/tile/grid/TileGrid.java +++ b/src/main/java/refinedstorage/tile/grid/TileGrid.java @@ -172,13 +172,14 @@ public class TileGrid extends TileMachine implements IGrid { patternsInventory.decrStackSize(0, 1); 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); + ItemPattern.addIngredient(pattern, ingredient); } }