diff options
| author | shedaniel <daniel@shedaniel.me> | 2019-12-28 11:13:09 +0800 |
|---|---|---|
| committer | shedaniel <daniel@shedaniel.me> | 2019-12-28 11:13:09 +0800 |
| commit | 66e3304df4c3bb2189e86ffe7730fef7181bd088 (patch) | |
| tree | 260e108df623728cb45835f52555e654665ac950 /src/main/java | |
| parent | a39860d419842ed49427b3c8dd541b7ef7ea2ab3 (diff) | |
| download | RoughlyEnoughItems-66e3304df4c3bb2189e86ffe7730fef7181bd088.tar.gz RoughlyEnoughItems-66e3304df4c3bb2189e86ffe7730fef7181bd088.tar.bz2 RoughlyEnoughItems-66e3304df4c3bb2189e86ffe7730fef7181bd088.zip | |
More improvements to the entrylist
Diffstat (limited to 'src/main/java')
6 files changed, 57 insertions, 25 deletions
diff --git a/src/main/java/me/shedaniel/rei/api/EntryRegistry.java b/src/main/java/me/shedaniel/rei/api/EntryRegistry.java index c850345d9..06a9cca1f 100644 --- a/src/main/java/me/shedaniel/rei/api/EntryRegistry.java +++ b/src/main/java/me/shedaniel/rei/api/EntryRegistry.java @@ -62,6 +62,9 @@ public interface EntryRegistry { @Deprecated void registerEntryAfter(EntryStack afterEntry, EntryStack stack, boolean checkAlreadyContains); + + void queueRegisterEntryAfter(EntryStack afterEntry, Collection<? extends EntryStack> stacks); + /** * Registers multiple stacks to the item list * diff --git a/src/main/java/me/shedaniel/rei/gui/widget/EntryListWidget.java b/src/main/java/me/shedaniel/rei/gui/widget/EntryListWidget.java index f57523010..cb9614a75 100644 --- a/src/main/java/me/shedaniel/rei/gui/widget/EntryListWidget.java +++ b/src/main/java/me/shedaniel/rei/gui/widget/EntryListWidget.java @@ -41,6 +41,7 @@ import org.apache.commons.lang3.StringUtils; import javax.annotation.Nullable; import java.util.*; +import java.util.concurrent.CopyOnWriteArrayList; import java.util.function.Supplier; import java.util.stream.Collectors; @@ -535,11 +536,14 @@ public class EntryListWidget extends WidgetWithBounds { List<EntryStack> list = Lists.newLinkedList(); boolean checkCraftable = ConfigManager.getInstance().isCraftableOnlyEnabled() && !ScreenHelper.inventoryStacks.isEmpty(); List<EntryStack> workingItems = checkCraftable ? RecipeHelper.getInstance().findCraftableEntriesByItems(CollectionUtils.map(ScreenHelper.inventoryStacks, EntryStack::create)) : null; - for (EntryStack stack : EntryRegistry.getInstance().getStacksList()) { - if (canLastSearchTermsBeAppliedTo(stack)) { - if (workingItems != null && CollectionUtils.findFirstOrNullEquals(workingItems, stack) == null) - continue; - list.add(stack.copy().setting(EntryStack.Settings.RENDER_COUNTS, EntryStack.Settings.FALSE).setting(EntryStack.Settings.Item.RENDER_ENCHANTMENT_GLINT, RENDER_ENCHANTMENT_GLINT)); + List<EntryStack> stacks = EntryRegistry.getInstance().getStacksList(); + if (stacks instanceof CopyOnWriteArrayList) { + for (EntryStack stack : stacks) { + if (canLastSearchTermsBeAppliedTo(stack)) { + if (workingItems != null && CollectionUtils.findFirstOrNullEquals(workingItems, stack) == null) + continue; + list.add(stack.copy().setting(EntryStack.Settings.RENDER_COUNTS, EntryStack.Settings.FALSE).setting(EntryStack.Settings.Item.RENDER_ENCHANTMENT_GLINT, RENDER_ENCHANTMENT_GLINT)); + } } } ItemListOrdering ordering = ConfigObject.getInstance().getItemListOrdering(); diff --git a/src/main/java/me/shedaniel/rei/impl/EntryRegistryImpl.java b/src/main/java/me/shedaniel/rei/impl/EntryRegistryImpl.java index b6613d79e..d1eb48144 100644 --- a/src/main/java/me/shedaniel/rei/impl/EntryRegistryImpl.java +++ b/src/main/java/me/shedaniel/rei/impl/EntryRegistryImpl.java @@ -6,6 +6,7 @@ package me.shedaniel.rei.impl; import com.google.common.collect.Lists; +import com.google.common.collect.Queues; import me.shedaniel.rei.api.EntryRegistry; import me.shedaniel.rei.api.EntryStack; import me.shedaniel.rei.api.RecipeHelper; @@ -13,6 +14,7 @@ import me.shedaniel.rei.api.annotations.Internal; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.DefaultedList; +import net.minecraft.util.Pair; import javax.annotation.Nullable; import java.util.*; @@ -23,24 +25,33 @@ import java.util.concurrent.CopyOnWriteArrayList; public class EntryRegistryImpl implements EntryRegistry { private final CopyOnWriteArrayList<EntryStack> entries = Lists.newCopyOnWriteArrayList(); - private final LinkedList<EntryStack> linkedList = Lists.newLinkedList(); + private final Queue<Pair<EntryStack, Collection<? extends EntryStack>>> queueRegisterEntryStackAfter = Queues.newConcurrentLinkedQueue(); + private List<EntryStack> reloadList; public void distinct() { TreeSet<EntryStack> set = new TreeSet<>((i, j) -> i.equalsAll(j) ? 0 : 1); - set.addAll(linkedList); + set.addAll(reloadList); entries.clear(); entries.addAll(set); - linkedList.clear(); + 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()); + } } @Override public List<EntryStack> getStacksList() { - return RecipeHelper.getInstance().arePluginsLoading() && !linkedList.isEmpty() ? linkedList : entries; + return RecipeHelper.getInstance().arePluginsLoading() ? reloadList : entries; } public void reset() { + reloadList = Lists.newArrayList(); + queueRegisterEntryStackAfter.clear(); entries.clear(); - linkedList.clear(); + reloadList.clear(); } @Override @@ -64,30 +75,38 @@ public class EntryRegistryImpl implements EntryRegistry { public void registerEntryAfter(EntryStack afterEntry, EntryStack stack, boolean checkAlreadyContains) { if (stack.isEmpty()) return; if (afterEntry == null) { - linkedList.add(stack); + getStacksList().add(stack); } else { - int last = linkedList.size(); + int last = getStacksList().size(); for (int i = last - 1; i >= 0; i++) - if (linkedList.get(i).equalsAll(afterEntry)) { + if (getStacksList().get(i).equalsAll(afterEntry)) { last = i + 1; break; } - linkedList.add(last, stack); + getStacksList().add(last, stack); } } @Override + public void queueRegisterEntryAfter(EntryStack afterEntry, Collection<? extends EntryStack> stacks) { + if (RecipeHelper.getInstance().arePluginsLoading()) { + queueRegisterEntryStackAfter.add(new Pair<>(afterEntry, stacks)); + } else + registerEntriesAfter(afterEntry, stacks); + } + + @Override public void registerEntriesAfter(EntryStack afterStack, Collection<? extends EntryStack> stacks) { if (afterStack != null) { - int index = linkedList.size(); + int index = getStacksList().size(); for (int i = index - 1; i >= 0; i--) { - if (linkedList.get(i).equalsAll(afterStack)) { + if (getStacksList().get(i).equalsAll(afterStack)) { index = i + 1; break; } } - linkedList.addAll(index, stacks); - } else linkedList.addAll(stacks); + getStacksList().addAll(index, stacks); + } else getStacksList().addAll(stacks); } private class DefaultedLinkedList<E> extends DefaultedList<E> { diff --git a/src/main/java/me/shedaniel/rei/impl/RecipeHelperImpl.java b/src/main/java/me/shedaniel/rei/impl/RecipeHelperImpl.java index 4337e4ad1..1702de6c3 100644 --- a/src/main/java/me/shedaniel/rei/impl/RecipeHelperImpl.java +++ b/src/main/java/me/shedaniel/rei/impl/RecipeHelperImpl.java @@ -302,8 +302,6 @@ public class RecipeHelperImpl implements RecipeHelper { RoughlyEnoughItemsCore.LOGGER.error("[REI] " + identifier.toString() + " plugin failed to load!", e); } } - // Remove duplicate entries - ((EntryRegistryImpl) EntryRegistry.getInstance()).distinct(); for (REIPluginV0 plugin : reiPluginV0s) { Identifier identifier = plugin.getPluginIdentifier(); @@ -343,9 +341,16 @@ public class RecipeHelperImpl implements RecipeHelper { ((DisplayHelperImpl) DisplayHelper.getInstance()).resetCache(); ScreenHelper.getOptionalOverlay().ifPresent(overlay -> overlay.shouldReInit = true); + arePluginsLoading = false; + // Remove duplicate entries + ((EntryRegistryImpl) EntryRegistry.getInstance()).distinct(); + + // Clear Cache Again! + ((DisplayHelperImpl) DisplayHelper.getInstance()).resetCache(); + ScreenHelper.getOptionalOverlay().ifPresent(overlay -> overlay.shouldReInit = true); + long usedTime = System.currentTimeMillis() - startTime; RoughlyEnoughItemsCore.LOGGER.info("[REI] Registered %d stack entries, %d recipes displays, %d exclusion zones suppliers, %d bounds handler, %d visibility handlers and %d categories (%s) in %d ms.", EntryRegistry.getInstance().getStacksList().size(), recipeCount[0], DisplayHelper.getInstance().getBaseBoundsHandler().supplierSize(), DisplayHelper.getInstance().getAllBoundsHandlers().size(), getDisplayVisibilityHandlers().size(), categories.size(), String.join(", ", categories.stream().map(RecipeCategory::getCategoryName).collect(Collectors.toList())), usedTime); - arePluginsLoading = false; } @Override diff --git a/src/main/java/me/shedaniel/rei/plugin/DefaultPlugin.java b/src/main/java/me/shedaniel/rei/plugin/DefaultPlugin.java index c876a6f1f..0ec68517b 100644 --- a/src/main/java/me/shedaniel/rei/plugin/DefaultPlugin.java +++ b/src/main/java/me/shedaniel/rei/plugin/DefaultPlugin.java @@ -85,7 +85,7 @@ public class DefaultPlugin implements REIPluginV0 { @Override public SemanticVersion getMinimumVersion() throws VersionParsingException { - return SemanticVersion.parse("3.0-pre"); + return SemanticVersion.parse("3.2.33"); } @Override @@ -117,7 +117,7 @@ public class DefaultPlugin implements REIPluginV0 { enchantments.add(EntryStack.create(itemStack)); } } - entryRegistry.registerEntriesAfter(stack, enchantments); + entryRegistry.queueRegisterEntryAfter(stack, enchantments); for (Fluid fluid : Registry.FLUID) { if (!(fluid instanceof EmptyFluid)) entryRegistry.registerEntry(EntryStack.create(fluid)); diff --git a/src/main/java/me/shedaniel/rei/tests/plugin/REITestPlugin.java b/src/main/java/me/shedaniel/rei/tests/plugin/REITestPlugin.java index 9eebeaee0..11f2ecf6f 100644 --- a/src/main/java/me/shedaniel/rei/tests/plugin/REITestPlugin.java +++ b/src/main/java/me/shedaniel/rei/tests/plugin/REITestPlugin.java @@ -15,6 +15,7 @@ import net.minecraft.util.registry.Registry; import org.apache.logging.log4j.LogManager; import org.jetbrains.annotations.TestOnly; +import java.util.Collections; import java.util.Random; @TestOnly @@ -36,8 +37,8 @@ public class REITestPlugin implements REIPluginV0 { @Override public void registerEntries(EntryRegistry entryRegistry) { for (Item item : Registry.ITEM) { - for (int i = 0; i < 15; i++) - entryRegistry.registerEntry(transformStack(EntryStack.create(item))); + for (int i = 0; i < 5; i++) + entryRegistry.queueRegisterEntryAfter(EntryStack.create(item), Collections.singleton(transformStack(EntryStack.create(item)))); try { for (ItemStack stack : entryRegistry.appendStacksForItem(item)) { for (int i = 0; i < 15; i++) |
