diff options
Diffstat (limited to 'src/main/java')
5 files changed, 52 insertions, 25 deletions
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<EntryStack> preFilteredList = Lists.newCopyOnWriteArrayList(); - private final CopyOnWriteArrayList<EntryStack> entries = Lists.newCopyOnWriteArrayList(); + private final List<EntryStack> preFilteredList = Lists.newCopyOnWriteArrayList(); + private final List<EntryStack> entries = Lists.newCopyOnWriteArrayList(); private final Queue<Pair<EntryStack, Collection<? extends EntryStack>>> queueRegisterEntryStackAfter = Queues.newConcurrentLinkedQueue(); private List<EntryStack> reloadList; private boolean doingDistinct = false; @@ -61,30 +61,53 @@ public class EntryRegistryImpl implements EntryRegistry { public void distinct() { preFilteredList.clear(); doingDistinct = true; - Set<EntryStack> set = Sets.newLinkedHashSet(); - set.addAll(reloadList); - entries.clear(); - entries.addAll(set); - entries.removeIf(EntryStack::isEmpty); - reloadList.clear(); while (true) { Pair<EntryStack, Collection<? extends EntryStack>> 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<EntryStackWrapper> 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<EntryStack> getStacksList() { - return RecipeHelper.getInstance().arePluginsLoading() && !doingDistinct ? reloadList : entries; + return RecipeHelper.getInstance().arePluginsLoading() || doingDistinct ? reloadList : entries; } @Override diff --git a/src/main/java/me/shedaniel/rei/impl/FluidEntryStack.java b/src/main/java/me/shedaniel/rei/impl/FluidEntryStack.java index 204ac1e24..f417e0d5f 100644 --- a/src/main/java/me/shedaniel/rei/impl/FluidEntryStack.java +++ b/src/main/java/me/shedaniel/rei/impl/FluidEntryStack.java @@ -166,8 +166,6 @@ public class FluidEntryStack extends AbstractEntryStack { @Override public boolean equalsAll(EntryStack stack) { - if (stack.getType() == Type.ITEM) - return equalsAll(EntryStack.copyItemToFluid(stack)); if (stack.getType() != Type.FLUID) return false; return fluid == stack.getFluid() && (amount == IGNORE_AMOUNT || stack.getAmount() == IGNORE_AMOUNT || amount == stack.getAmount()); diff --git a/src/main/java/me/shedaniel/rei/impl/ItemEntryStack.java b/src/main/java/me/shedaniel/rei/impl/ItemEntryStack.java index 0b13d74d6..9c723581b 100644 --- a/src/main/java/me/shedaniel/rei/impl/ItemEntryStack.java +++ b/src/main/java/me/shedaniel/rei/impl/ItemEntryStack.java @@ -145,8 +145,6 @@ public class ItemEntryStack extends AbstractEntryStack implements OptimalEntrySt @Override public boolean equalsAll(EntryStack stack) { - Boolean ifFluid = compareIfFluid(stack, 3); - if (ifFluid != null) return ifFluid; if (stack.getType() != Type.ITEM) return false; return itemStack.getItem() == stack.getItem() && getAmount() != stack.getAmount() && ItemStack.areTagsEqual(itemStack, stack.getItemStack()); diff --git a/src/main/java/me/shedaniel/rei/impl/RecipeHelperImpl.java b/src/main/java/me/shedaniel/rei/impl/RecipeHelperImpl.java index 400a28336..1cf5b705f 100644 --- a/src/main/java/me/shedaniel/rei/impl/RecipeHelperImpl.java +++ b/src/main/java/me/shedaniel/rei/impl/RecipeHelperImpl.java @@ -314,7 +314,7 @@ public class RecipeHelperImpl implements RecipeHelper { private void startSection(Object[] sectionData, String section) { sectionData[0] = Util.getMeasuringTimeNano(); sectionData[2] = section; - RoughlyEnoughItemsCore.LOGGER.debug("Reloading REI: \"%s\"", section); + RoughlyEnoughItemsCore.LOGGER.debug("Reloading Section: \"%s\"", section); } private void endSection(Object[] sectionData) { @@ -322,9 +322,9 @@ public class RecipeHelperImpl implements RecipeHelper { long time = (long) sectionData[1] - (long) sectionData[0]; String section = (String) sectionData[2]; if (time >= 1000000) { - RoughlyEnoughItemsCore.LOGGER.debug("Reloading REI: \"%s\" done in %.2fms", section, time / 1000000.0F); + RoughlyEnoughItemsCore.LOGGER.debug("Reloading Section: \"%s\" done in %.2fms", section, time / 1000000.0F); } else { - RoughlyEnoughItemsCore.LOGGER.debug("Reloading REI: \"%s\" done in %.2fμs", section, time / 1000.0F); + RoughlyEnoughItemsCore.LOGGER.debug("Reloading Section: \"%s\" done in %.2fμs", section, time / 1000.0F); } } @@ -438,17 +438,25 @@ public class RecipeHelperImpl implements RecipeHelper { } }); endSection(sectionData); - startSection(sectionData, "finalizing"); // Clear Cache ((DisplayHelperImpl) DisplayHelper.getInstance()).resetCache(); ScreenHelper.getOptionalOverlay().ifPresent(overlay -> overlay.shouldReInit = true); + startSection(sectionData, "entry-registry-distinct"); + // Remove duplicate entries ((EntryRegistryImpl) EntryRegistry.getInstance()).distinct(); + + endSection(sectionData); + startSection(sectionData, "entry-registry-refilter"); + arePluginsLoading = false; ((EntryRegistryImpl) EntryRegistry.getInstance()).refilter(); + endSection(sectionData); + startSection(sectionData, "finalizing"); + // Clear Cache Again! ((DisplayHelperImpl) DisplayHelper.getInstance()).resetCache(); ScreenHelper.getOptionalOverlay().ifPresent(overlay -> overlay.shouldReInit = true); diff --git a/src/main/java/me/shedaniel/rei/plugin/DefaultPlugin.java b/src/main/java/me/shedaniel/rei/plugin/DefaultPlugin.java index 0edbb9eab..4bc1d21c0 100644 --- a/src/main/java/me/shedaniel/rei/plugin/DefaultPlugin.java +++ b/src/main/java/me/shedaniel/rei/plugin/DefaultPlugin.java @@ -158,7 +158,7 @@ public class DefaultPlugin implements REIPluginV0 { enchantments.add(EntryStack.create(itemStack).setting(EntryStack.Settings.CHECK_TAGS, EntryStack.Settings.TRUE)); } } - entryRegistry.queueRegisterEntryAfter(stack, enchantments); + entryRegistry.registerEntriesAfter(stack, enchantments); for (Fluid fluid : Registry.FLUID) { if (!fluid.getDefaultState().isEmpty() && fluid.getDefaultState().isStill()) entryRegistry.registerEntry(EntryStack.create(fluid)); |
