diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/util/StackListItem.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/util/StackListItem.java index 6b0c79db3..3a2233992 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/util/StackListItem.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/util/StackListItem.java @@ -11,15 +11,14 @@ import org.apache.commons.lang3.tuple.Pair; import javax.annotation.Nonnull; import javax.annotation.Nullable; -import java.util.Collection; -import java.util.LinkedList; -import java.util.List; +import java.util.*; import java.util.stream.Collectors; public class StackListItem implements IStackList { private ArrayListMultimap stacks = ArrayListMultimap.create(); private List removeTracker = new LinkedList<>(); protected boolean needsCleanup = false; + private Set touchedItems = new HashSet<>(); @Override public void add(@Nonnull ItemStack stack, int size) { @@ -47,6 +46,7 @@ public class StackListItem implements IStackList { otherStack.shrink(size); if (otherStack.isEmpty()) { + touchedItems.add(stack.getItem()); needsCleanup = true; } @@ -68,6 +68,7 @@ public class StackListItem implements IStackList { otherStack.shrink(size); if (otherStack.isEmpty()) { + touchedItems.add(stack.getItem()); needsCleanup = true; } @@ -125,13 +126,14 @@ public class StackListItem implements IStackList { @Override public void clean() { - List> toRemove = stacks.asMap().entrySet().stream() - .flatMap(entry -> entry.getValue().stream().map(value -> Pair.of(entry.getKey(), value))) + List> toRemove = touchedItems.stream() + .flatMap(item -> stacks.get(item).stream().map(stack -> Pair.of(item, stack))) .filter(pair -> pair.getValue().isEmpty()) .collect(Collectors.toList()); toRemove.forEach(pair -> stacks.remove(pair.getLeft(), pair.getRight())); + touchedItems.clear(); needsCleanup = false; } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/util/StackListItemOredicted.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/util/StackListItemOredicted.java index 552427b0e..6a232eeb2 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/util/StackListItemOredicted.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/util/StackListItemOredicted.java @@ -5,17 +5,17 @@ import com.raoulvdberge.refinedstorage.api.util.IComparer; import com.raoulvdberge.refinedstorage.api.util.IStackList; import net.minecraft.item.ItemStack; import net.minecraftforge.oredict.OreDictionary; +import org.apache.commons.lang3.tuple.Pair; import javax.annotation.Nonnull; import javax.annotation.Nullable; -import java.util.Collection; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.stream.Collectors; public class StackListItemOredicted implements IStackList { private StackListItem underlyingList; private ArrayListMultimap stacks = ArrayListMultimap.create(); + private Set touchedIds = new HashSet<>(); private StackListItemOredicted() { } @@ -50,6 +50,7 @@ public class StackListItemOredicted implements IStackList { public boolean remove(@Nonnull ItemStack stack, int size) { boolean rvalue = underlyingList.remove(stack, size); if (underlyingList.needsCleanup) { + touchedIds.addAll(Arrays.stream(OreDictionary.getOreIDs(stack)).boxed().collect(Collectors.toList())); clean(); } return rvalue; @@ -59,6 +60,7 @@ public class StackListItemOredicted implements IStackList { public boolean trackedRemove(@Nonnull ItemStack stack, int size) { boolean rvalue = underlyingList.trackedRemove(stack, size); if (underlyingList.needsCleanup) { + touchedIds.addAll(Arrays.stream(OreDictionary.getOreIDs(stack)).boxed().collect(Collectors.toList())); clean(); } return rvalue; @@ -117,11 +119,13 @@ public class StackListItemOredicted implements IStackList { } private void localClean() { - List> toRemove = stacks.entries().stream() + List> toRemove = touchedIds.stream() + .flatMap(id -> stacks.get(id).stream().map(stack -> Pair.of(id, stack))) .filter(entry -> entry.getValue().isEmpty()) .collect(Collectors.toList()); toRemove.forEach(entry -> stacks.remove(entry.getKey(), entry.getValue())); + touchedIds.clear(); } @Override