From 5ba1e2fd5b50636a887c93d848994fded6e27d0f Mon Sep 17 00:00:00 2001 From: shedaniel Date: Wed, 27 May 2020 00:02:53 +0800 Subject: Fix nbt entries for entry registry Signed-off-by: shedaniel --- .../me/shedaniel/rei/impl/EntryRegistryImpl.java | 55 +++++++++++++++------- 1 file changed, 39 insertions(+), 16 deletions(-) (limited to 'src/main/java/me/shedaniel/rei/impl/EntryRegistryImpl.java') diff --git a/src/main/java/me/shedaniel/rei/impl/EntryRegistryImpl.java b/src/main/java/me/shedaniel/rei/impl/EntryRegistryImpl.java index 6aa59e42c..5dfa05331 100644 --- a/src/main/java/me/shedaniel/rei/impl/EntryRegistryImpl.java +++ b/src/main/java/me/shedaniel/rei/impl/EntryRegistryImpl.java @@ -39,13 +39,13 @@ import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nullable; import java.util.*; -import java.util.concurrent.CopyOnWriteArrayList; +import java.util.stream.Collectors; @ApiStatus.Internal public class EntryRegistryImpl implements EntryRegistry { - private final CopyOnWriteArrayList preFilteredList = Lists.newCopyOnWriteArrayList(); - private final CopyOnWriteArrayList entries = Lists.newCopyOnWriteArrayList(); + private final List preFilteredList = Lists.newCopyOnWriteArrayList(); + private final List entries = Lists.newCopyOnWriteArrayList(); private final Queue>> queueRegisterEntryStackAfter = Queues.newConcurrentLinkedQueue(); private List reloadList; private boolean doingDistinct = false; @@ -61,30 +61,53 @@ public class EntryRegistryImpl implements EntryRegistry { public void distinct() { preFilteredList.clear(); doingDistinct = true; - Set set = Sets.newLinkedHashSet(); - set.addAll(reloadList); - entries.clear(); - entries.addAll(set); - entries.removeIf(EntryStack::isEmpty); - reloadList.clear(); while (true) { Pair> pair = queueRegisterEntryStackAfter.poll(); if (pair == null) break; registerEntriesAfter(pair.getLeft(), pair.getRight()); } - set.clear(); - set.addAll(entries); - set.removeIf(EntryStack::isEmpty); - entries.clear(); - entries.addAll(set); - set.clear(); doingDistinct = false; + Set set = Sets.newLinkedHashSet(); + set.addAll(reloadList.stream().map(EntryStackWrapper::new).collect(Collectors.toList())); + set.removeIf(EntryStackWrapper::isEmpty); + entries.clear(); + entries.addAll(set.stream().map(EntryStackWrapper::unwrap).collect(Collectors.toList())); + } + + private static class EntryStackWrapper { + private final EntryStack stack; + + public EntryStackWrapper(EntryStack stack) { + this.stack = Objects.requireNonNull(stack); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + EntryStackWrapper that = (EntryStackWrapper) o; + return stack.equalsAll(that.stack); + } + + @Override + public int hashCode() { + return stack.hashCode(); + } + + public boolean isEmpty() { + return stack.isEmpty(); + } + + public EntryStack unwrap() { + return stack; + } } @Override public List getStacksList() { - return RecipeHelper.getInstance().arePluginsLoading() && !doingDistinct ? reloadList : entries; + return RecipeHelper.getInstance().arePluginsLoading() || doingDistinct ? reloadList : entries; } @Override -- cgit