strip tags with irrelevant data for autocrafting, fixes #711

This commit is contained in:
way2muchnoise
2016-12-14 20:15:21 +01:00
parent b9d6f095de
commit 49d7341cd8
5 changed files with 44 additions and 33 deletions

View File

@@ -13,6 +13,7 @@ public interface IComparer {
int COMPARE_NBT = 2; int COMPARE_NBT = 2;
int COMPARE_QUANTITY = 4; int COMPARE_QUANTITY = 4;
int COMPARE_OREDICT = 8; int COMPARE_OREDICT = 8;
int COMPARE_STRIP_NBT = 16;
/** /**
* Compares two stacks by the given flags. * Compares two stacks by the given flags.

View File

@@ -4,6 +4,7 @@ import com.raoulvdberge.refinedstorage.api.autocrafting.ICraftingPattern;
import com.raoulvdberge.refinedstorage.api.autocrafting.ICraftingPatternContainer; import com.raoulvdberge.refinedstorage.api.autocrafting.ICraftingPatternContainer;
import com.raoulvdberge.refinedstorage.apiimpl.API; import com.raoulvdberge.refinedstorage.apiimpl.API;
import com.raoulvdberge.refinedstorage.apiimpl.autocrafting.registry.CraftingTaskFactory; import com.raoulvdberge.refinedstorage.apiimpl.autocrafting.registry.CraftingTaskFactory;
import com.raoulvdberge.refinedstorage.apiimpl.util.Comparer;
import com.raoulvdberge.refinedstorage.item.ItemPattern; import com.raoulvdberge.refinedstorage.item.ItemPattern;
import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.inventory.Container; import net.minecraft.inventory.Container;
@@ -32,7 +33,7 @@ public class CraftingPattern implements ICraftingPattern {
public CraftingPattern(World world, ICraftingPatternContainer container, ItemStack stack) { public CraftingPattern(World world, ICraftingPatternContainer container, ItemStack stack) {
this.container = container; this.container = container;
this.stack = stripTags(stack); this.stack = Comparer.stripTags(stack);
InventoryCrafting inv = new InventoryCrafting(new Container() { InventoryCrafting inv = new InventoryCrafting(new Container() {
@Override @Override
@@ -44,7 +45,7 @@ public class CraftingPattern implements ICraftingPattern {
for (int i = 0; i < 9; ++i) { for (int i = 0; i < 9; ++i) {
ItemStack slot = ItemPattern.getSlot(stack, i); ItemStack slot = ItemPattern.getSlot(stack, i);
inputs.add(stripTags(slot)); inputs.add(Comparer.stripTags(slot));
if (slot != null) { if (slot != null) {
inv.setInventorySlotContents(i, slot); inv.setInventorySlotContents(i, slot);
@@ -60,8 +61,7 @@ public class CraftingPattern implements ICraftingPattern {
// It is a dirty fix, but hey someone has to do it. ~ way2muchnoise 2016 "bite me" // It is a dirty fix, but hey someone has to do it. ~ way2muchnoise 2016 "bite me"
mekanism = recipe.getClass().getName().equals("mekanism.common.recipe.ShapedMekanismRecipe"); mekanism = recipe.getClass().getName().equals("mekanism.common.recipe.ShapedMekanismRecipe");
ItemStack out = stripTags(output.copy()); outputs.add(Comparer.stripTags(output.copy()));
outputs.add(out);
if ((isOredict() && shapedOre) || mekanism) { if ((isOredict() && shapedOre) || mekanism) {
Object[] inputs = new Object[0]; Object[] inputs = new Object[0];
@@ -78,7 +78,7 @@ public class CraftingPattern implements ICraftingPattern {
if (input == null) { if (input == null) {
oreInputs.add(Collections.emptyList()); oreInputs.add(Collections.emptyList());
} else if (input instanceof ItemStack) { } else if (input instanceof ItemStack) {
ItemStack stripped = stripTags(((ItemStack) input).copy()); ItemStack stripped = Comparer.stripTags(((ItemStack) input).copy());
if (stripped.getItemDamage() == OreDictionary.WILDCARD_VALUE) { if (stripped.getItemDamage() == OreDictionary.WILDCARD_VALUE) {
stripped.setItemDamage(0); stripped.setItemDamage(0);
} }
@@ -86,7 +86,7 @@ public class CraftingPattern implements ICraftingPattern {
} else { } else {
List<ItemStack> cleaned = new LinkedList<>(); List<ItemStack> cleaned = new LinkedList<>();
for (ItemStack in : (List<ItemStack>) input) { for (ItemStack in : (List<ItemStack>) input) {
ItemStack stripped = stripTags(in.copy()); ItemStack stripped = Comparer.stripTags(in.copy());
if (stripped.getItemDamage() == OreDictionary.WILDCARD_VALUE) { if (stripped.getItemDamage() == OreDictionary.WILDCARD_VALUE) {
stripped.setItemDamage(0); stripped.setItemDamage(0);
} }
@@ -99,14 +99,14 @@ public class CraftingPattern implements ICraftingPattern {
for (ItemStack remaining : recipe.getRemainingItems(inv)) { for (ItemStack remaining : recipe.getRemainingItems(inv)) {
if (remaining != null) { if (remaining != null) {
ItemStack cleaned = stripTags(remaining.copy()); ItemStack cleaned = Comparer.stripTags(remaining.copy());
byproducts.add(cleaned); byproducts.add(cleaned);
} }
} }
} }
} }
} else { } else {
outputs = ItemPattern.getOutputs(stack).stream().map(CraftingPattern::stripTags).collect(Collectors.toList()); outputs = ItemPattern.getOutputs(stack).stream().map(Comparer::stripTags).collect(Collectors.toList());
if (isOredict()) { if (isOredict()) {
for (ItemStack input : inputs) { for (ItemStack input : inputs) {
@@ -116,14 +116,14 @@ public class CraftingPattern implements ICraftingPattern {
} else { } else {
int[] ids = OreDictionary.getOreIDs(input); int[] ids = OreDictionary.getOreIDs(input);
if (ids == null || ids.length == 0) { if (ids == null || ids.length == 0) {
oreInputs.add(Collections.singletonList(stripTags(input))); oreInputs.add(Collections.singletonList(Comparer.stripTags(input)));
} else { } else {
oreInputs.add(Arrays.stream(ids) oreInputs.add(Arrays.stream(ids)
.mapToObj(OreDictionary::getOreName) .mapToObj(OreDictionary::getOreName)
.map(OreDictionary::getOres) .map(OreDictionary::getOres)
.flatMap(List::stream) .flatMap(List::stream)
.map(ItemStack::copy) .map(ItemStack::copy)
.map(CraftingPattern::stripTags) .map(Comparer::stripTags)
.map(s -> { .map(s -> {
s.setCount(input.getCount()); s.setCount(input.getCount());
return s; return s;
@@ -141,7 +141,7 @@ public class CraftingPattern implements ICraftingPattern {
if (input == null) { if (input == null) {
oreInputs.add(Collections.emptyList()); oreInputs.add(Collections.emptyList());
} else { } else {
oreInputs.add(Collections.singletonList(stripTags(input))); oreInputs.add(Collections.singletonList(Comparer.stripTags(input)));
} }
} }
} }
@@ -204,7 +204,7 @@ public class CraftingPattern implements ICraftingPattern {
if (cleaned.isEmpty()) { if (cleaned.isEmpty()) {
return null; return null;
} }
outputs.add(stripTags(cleaned.copy())); outputs.add(Comparer.stripTags(cleaned.copy()));
return outputs; return outputs;
} }
@@ -233,7 +233,7 @@ public class CraftingPattern implements ICraftingPattern {
for (ItemStack remaining : recipe.getRemainingItems(inv)) { for (ItemStack remaining : recipe.getRemainingItems(inv)) {
if (remaining != null) { if (remaining != null) {
byproducts.add(stripTags(remaining.copy())); byproducts.add(Comparer.stripTags(remaining.copy()));
} }
} }
@@ -253,7 +253,7 @@ public class CraftingPattern implements ICraftingPattern {
@Override @Override
public int getQuantityPerRequest(ItemStack requested, int compare) { public int getQuantityPerRequest(ItemStack requested, int compare) {
int quantity = 0; int quantity = 0;
requested = stripTags(requested); requested = Comparer.stripTags(requested.copy());
for (ItemStack output : outputs) { for (ItemStack output : outputs) {
if (API.instance().getComparer().isEqual(requested, output, compare)) { if (API.instance().getComparer().isEqual(requested, output, compare)) {
quantity += output.getCount(); quantity += output.getCount();
@@ -269,7 +269,7 @@ public class CraftingPattern implements ICraftingPattern {
@Override @Override
public ItemStack getActualOutput(ItemStack requested, int compare) { public ItemStack getActualOutput(ItemStack requested, int compare) {
requested = stripTags(requested); requested = Comparer.stripTags(requested.copy());
for (ItemStack output : outputs) { for (ItemStack output : outputs) {
if (API.instance().getComparer().isEqual(requested, output, compare)) { if (API.instance().getComparer().isEqual(requested, output, compare)) {
return output.copy(); return output.copy();
@@ -288,20 +288,4 @@ public class CraftingPattern implements ICraftingPattern {
", byproducts=" + byproducts + ", byproducts=" + byproducts +
'}'; '}';
} }
private static ItemStack stripTags(ItemStack stack) {
if (stack != null && !stack.isEmpty() && stack.hasTagCompound()) {
switch (stack.getItem().getRegistryName().getResourceDomain()) {
case "mekanism":
stack.getTagCompound().removeTag("mekData");
break;
case "enderio":
stack.getTagCompound().removeTag("entity");
default:
break;
}
}
return stack;
}
} }

View File

@@ -9,6 +9,7 @@ import com.raoulvdberge.refinedstorage.api.network.INetworkMaster;
import com.raoulvdberge.refinedstorage.api.util.IComparer; import com.raoulvdberge.refinedstorage.api.util.IComparer;
import com.raoulvdberge.refinedstorage.api.util.IStackList; import com.raoulvdberge.refinedstorage.api.util.IStackList;
import com.raoulvdberge.refinedstorage.apiimpl.API; import com.raoulvdberge.refinedstorage.apiimpl.API;
import com.raoulvdberge.refinedstorage.apiimpl.util.Comparer;
import net.minecraft.item.ItemStack; import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.nbt.NBTTagList; import net.minecraft.nbt.NBTTagList;
@@ -142,6 +143,7 @@ public abstract class CraftingStep implements ICraftingStep {
@Override @Override
public boolean onReceiveOutput(ItemStack stack) { public boolean onReceiveOutput(ItemStack stack) {
stack = Comparer.stripTags(stack.copy());
for (ItemStack output : pattern.getOutputs()) { for (ItemStack output : pattern.getOutputs()) {
int hashcode = API.instance().getItemStackHashCode(output); int hashcode = API.instance().getItemStackHashCode(output);
Integer received = satisfied.get(hashcode); Integer received = satisfied.get(hashcode);

View File

@@ -30,7 +30,7 @@ import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
public class CraftingTask implements ICraftingTask { public class CraftingTask implements ICraftingTask {
protected static final int DEFAULT_COMPARE = IComparer.COMPARE_DAMAGE | IComparer.COMPARE_NBT; protected static final int DEFAULT_COMPARE = IComparer.COMPARE_DAMAGE | IComparer.COMPARE_NBT | IComparer.COMPARE_STRIP_NBT;
public static final String NBT_STEPS = "Steps"; public static final String NBT_STEPS = "Steps";
public static final String NBT_TO_TAKE_FLUIDS = "ToTakeFluids"; public static final String NBT_TO_TAKE_FLUIDS = "ToTakeFluids";
@@ -105,7 +105,7 @@ public class CraftingTask implements ICraftingTask {
for (List<ItemStack> oreInputs : pattern.getOreInputs()) { for (List<ItemStack> oreInputs : pattern.getOreInputs()) {
boolean added = false; boolean added = false;
for (ItemStack input : oreInputs) { for (ItemStack input : oreInputs) {
int oreCompare = IComparer.COMPARE_NBT | (input.isItemStackDamageable() ? 0 : IComparer.COMPARE_DAMAGE); int oreCompare = IComparer.COMPARE_NBT | IComparer.COMPARE_STRIP_NBT | (input.isItemStackDamageable() ? 0 : IComparer.COMPARE_DAMAGE);
if (network.getItemStorageCache().getList().get(input, oreCompare) != null) { if (network.getItemStorageCache().getList().get(input, oreCompare) != null) {
usedStacks.add(input.copy()); usedStacks.add(input.copy());
inputs.add(input.copy()); inputs.add(input.copy());

View File

@@ -40,6 +40,10 @@ public class Comparer implements IComparer {
} }
if ((flags & COMPARE_NBT) == COMPARE_NBT) { if ((flags & COMPARE_NBT) == COMPARE_NBT) {
if ((flags & COMPARE_STRIP_NBT) == COMPARE_STRIP_NBT) {
left = stripTags(left.copy());
right = stripTags(right.copy());
}
if (!isEqualNBT(left, right)) { if (!isEqualNBT(left, right)) {
return false; return false;
} }
@@ -154,4 +158,24 @@ public class Comparer implements IComparer {
return EnumActionResult.PASS; return EnumActionResult.PASS;
} }
public static ItemStack stripTags(ItemStack stack) {
if (stack != null && stack.hasTagCompound()) {
switch (stack.getItem().getRegistryName().getResourceDomain()) {
case "mekanism":
stack.getTagCompound().removeTag("mekData");
break;
case "enderio":
// Soul vials
stack.getTagCompound().removeTag("entity");
stack.getTagCompound().removeTag("isStub");
// Capacitors
stack.getTagCompound().removeTag("Energy");
default:
break;
}
}
return stack;
}
} }