Răsfoiți Sursa

More improvements to the entrylist

shedaniel 5 ani în urmă
părinte
comite
1ef5767006

+ 1 - 1
gradle.properties

@@ -1,4 +1,4 @@
-mod_version=3.2.32
+mod_version=3.2.33
 minecraft_version=1.15
 yarn_version=1.15+build.1
 fabricloader_version=0.7.2+build.174

+ 3 - 0
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
      *

+ 9 - 5
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();

+ 32 - 13
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> {

+ 8 - 3
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

+ 2 - 2
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));

+ 3 - 2
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++)