Give correct byproducts back
This commit is contained in:
@@ -3,6 +3,7 @@
|
||||
### 1.0.5
|
||||
- Fixed crafting a complex item causes the process to flow off the Crafting Monitor's GUI (raoulvdberge)
|
||||
- Fixed shift clicking from Grid when player inventory is full throwing items in the world (raoulvdberge)
|
||||
- Added support for ore dictionary substitutions in Crafting Patterns (raoulvdberge)
|
||||
|
||||
### 1.0.4
|
||||
- Fixed lag caused by Crafter (raoulvdberge)
|
||||
|
||||
@@ -23,21 +23,27 @@ public interface ICraftingPattern {
|
||||
*/
|
||||
boolean isValid();
|
||||
|
||||
/**
|
||||
* @return the inputs
|
||||
*/
|
||||
List<ItemStack> getInputs();
|
||||
|
||||
/**
|
||||
* @return true if this crafting pattern cares about the ore dictionary when extracting items, false otherwise
|
||||
*/
|
||||
boolean isOredicted();
|
||||
|
||||
/**
|
||||
* @return the inputs
|
||||
*/
|
||||
List<ItemStack> getInputs();
|
||||
|
||||
/**
|
||||
* @return the outputs
|
||||
*/
|
||||
List<ItemStack> getOutputs();
|
||||
|
||||
/**
|
||||
* @param took the items that it already took
|
||||
* @return the outputs
|
||||
*/
|
||||
List<ItemStack> getOutputsBasedOnTook(ItemStack[] took);
|
||||
|
||||
/**
|
||||
* @return the id of the factory that creates a crafting task for this pattern, as defined in the registry
|
||||
*/
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
package refinedstorage.apiimpl.autocrafting;
|
||||
|
||||
import com.google.common.collect.Iterables;
|
||||
import com.google.common.collect.Lists;
|
||||
import net.minecraft.entity.player.EntityPlayer;
|
||||
import net.minecraft.inventory.Container;
|
||||
import net.minecraft.inventory.InventoryCrafting;
|
||||
@@ -18,16 +20,19 @@ import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class CraftingPattern implements ICraftingPattern {
|
||||
private World world;
|
||||
private ICraftingPatternContainer container;
|
||||
private ItemStack stack;
|
||||
private List<ItemStack> inputs = new ArrayList<>();
|
||||
private List<ItemStack> outputs = new ArrayList<>();
|
||||
private List<ItemStack> byproducts = new ArrayList<>();
|
||||
|
||||
public CraftingPattern(World world, ICraftingPatternContainer container, ItemStack stack) {
|
||||
this.world = world;
|
||||
this.container = container;
|
||||
this.stack = stack;
|
||||
|
||||
InventoryCrafting dummyInventory = new InventoryCrafting(new Container() {
|
||||
InventoryCrafting inv = new InventoryCrafting(new Container() {
|
||||
@Override
|
||||
public boolean canInteractWith(EntityPlayer player) {
|
||||
return false;
|
||||
@@ -42,19 +47,19 @@ public class CraftingPattern implements ICraftingPattern {
|
||||
inputs.add(ItemHandlerHelper.copyStackWithSize(slot, 1));
|
||||
}
|
||||
|
||||
dummyInventory.setInventorySlotContents(i, slot);
|
||||
inv.setInventorySlotContents(i, slot);
|
||||
}
|
||||
}
|
||||
|
||||
if (!ItemPattern.isProcessing(stack)) {
|
||||
ItemStack output = CraftingManager.getInstance().findMatchingRecipe(dummyInventory, world);
|
||||
ItemStack output = CraftingManager.getInstance().findMatchingRecipe(inv, world);
|
||||
|
||||
if (output != null) {
|
||||
outputs.add(output.copy());
|
||||
|
||||
for (ItemStack remaining : CraftingManager.getInstance().getRemainingItems(dummyInventory, world)) {
|
||||
for (ItemStack remaining : CraftingManager.getInstance().getRemainingItems(inv, world)) {
|
||||
if (remaining != null) {
|
||||
outputs.add(remaining.copy());
|
||||
byproducts.add(remaining.copy());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -78,21 +83,58 @@ public class CraftingPattern implements ICraftingPattern {
|
||||
return !inputs.isEmpty() && !outputs.isEmpty();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<ItemStack> getInputs() {
|
||||
return inputs;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isOredicted() {
|
||||
return ItemPattern.isOredicted(stack);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<ItemStack> getInputs() {
|
||||
return inputs;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<ItemStack> getOutputs() {
|
||||
return outputs;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<ItemStack> getOutputsBasedOnTook(ItemStack[] took) {
|
||||
if (ItemPattern.isProcessing(stack) || !ItemPattern.isOredicted(stack)) {
|
||||
return Lists.newArrayList(Iterables.concat(outputs, byproducts));
|
||||
}
|
||||
|
||||
List<ItemStack> outputs = new ArrayList<>();
|
||||
List<ItemStack> byproducts = new ArrayList<>();
|
||||
|
||||
InventoryCrafting inv = new InventoryCrafting(new Container() {
|
||||
@Override
|
||||
public boolean canInteractWith(EntityPlayer player) {
|
||||
return false;
|
||||
}
|
||||
}, 3, 3);
|
||||
|
||||
for (int i = 0; i < 9; ++i) {
|
||||
if (took[i] != null) {
|
||||
inv.setInventorySlotContents(i, took[i]);
|
||||
}
|
||||
}
|
||||
|
||||
ItemStack output = CraftingManager.getInstance().findMatchingRecipe(inv, world);
|
||||
|
||||
if (output != null) {
|
||||
outputs.add(output.copy());
|
||||
|
||||
for (ItemStack remaining : CraftingManager.getInstance().getRemainingItems(inv, world)) {
|
||||
if (remaining != null) {
|
||||
byproducts.add(remaining.copy());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return Lists.newArrayList(Iterables.concat(outputs, byproducts));
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getId() {
|
||||
return ItemPattern.isProcessing(stack) ? CraftingTaskFactoryProcessing.ID : CraftingTaskFactoryNormal.ID;
|
||||
|
||||
@@ -43,6 +43,14 @@ public class CraftingTaskFactoryNormal implements ICraftingTaskFactory {
|
||||
|
||||
task.setTook(took);
|
||||
|
||||
for (int i = 0; i < 9; ++i) {
|
||||
String id = String.format(CraftingTaskNormal.NBT_TOOK_SLOT, i);
|
||||
|
||||
if (tag.hasKey(id)) {
|
||||
task.getTookSlots()[i] = ItemStack.loadItemStackFromNBT(tag.getCompoundTag(id));
|
||||
}
|
||||
}
|
||||
|
||||
task.readChildNBT(world, tag);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package refinedstorage.apiimpl.autocrafting.task;
|
||||
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.nbt.NBTTagCompound;
|
||||
import net.minecraft.world.World;
|
||||
import refinedstorage.api.autocrafting.ICraftingPattern;
|
||||
import refinedstorage.api.autocrafting.task.CraftingTask;
|
||||
@@ -8,10 +9,18 @@ import refinedstorage.api.network.INetworkMaster;
|
||||
import refinedstorage.apiimpl.storage.fluid.FluidUtils;
|
||||
|
||||
public class CraftingTaskNormal extends CraftingTask {
|
||||
public static final String NBT_TOOK_SLOT = "TookSlot_%d";
|
||||
|
||||
private ItemStack[] tookSlots = new ItemStack[9];
|
||||
|
||||
public CraftingTaskNormal(ICraftingPattern pattern) {
|
||||
super(pattern);
|
||||
}
|
||||
|
||||
public ItemStack[] getTookSlots() {
|
||||
return tookSlots;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean update(World world, INetworkMaster network) {
|
||||
for (int i = 0; i < pattern.getInputs().size(); ++i) {
|
||||
@@ -26,6 +35,7 @@ public class CraftingTaskNormal extends CraftingTask {
|
||||
satisfied[i] = true;
|
||||
|
||||
took.add(received);
|
||||
tookSlots[i] = received;
|
||||
|
||||
network.updateCraftingTasks();
|
||||
} else {
|
||||
@@ -42,7 +52,7 @@ public class CraftingTaskNormal extends CraftingTask {
|
||||
}
|
||||
}
|
||||
|
||||
for (ItemStack output : pattern.getOutputs()) {
|
||||
for (ItemStack output : pattern.getOutputsBasedOnTook(tookSlots)) {
|
||||
// @TODO: Handle remainder
|
||||
network.insertItem(output, output.stackSize, false);
|
||||
}
|
||||
@@ -89,6 +99,19 @@ public class CraftingTaskNormal extends CraftingTask {
|
||||
return builder.toString();
|
||||
}
|
||||
|
||||
@Override
|
||||
public NBTTagCompound writeToNBT(NBTTagCompound tag) {
|
||||
super.writeToNBT(tag);
|
||||
|
||||
for (int i = 0; i < 9; ++i) {
|
||||
if (tookSlots[i] != null) {
|
||||
tag.setTag(String.format(NBT_TOOK_SLOT, i), tookSlots[i].serializeNBT());
|
||||
}
|
||||
}
|
||||
|
||||
return tag;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getProgress() {
|
||||
int satisfiedAmount = 0;
|
||||
|
||||
Reference in New Issue
Block a user