aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorshedaniel <daniel@shedaniel.me>2019-12-28 11:13:09 +0800
committershedaniel <daniel@shedaniel.me>2019-12-28 11:13:09 +0800
commit66e3304df4c3bb2189e86ffe7730fef7181bd088 (patch)
tree260e108df623728cb45835f52555e654665ac950
parenta39860d419842ed49427b3c8dd541b7ef7ea2ab3 (diff)
downloadRoughlyEnoughItems-66e3304df4c3bb2189e86ffe7730fef7181bd088.tar.gz
RoughlyEnoughItems-66e3304df4c3bb2189e86ffe7730fef7181bd088.tar.bz2
RoughlyEnoughItems-66e3304df4c3bb2189e86ffe7730fef7181bd088.zip
More improvements to the entrylist
-rw-r--r--gradle.properties2
-rw-r--r--src/main/java/me/shedaniel/rei/api/EntryRegistry.java3
-rw-r--r--src/main/java/me/shedaniel/rei/gui/widget/EntryListWidget.java14
-rw-r--r--src/main/java/me/shedaniel/rei/impl/EntryRegistryImpl.java45
-rw-r--r--src/main/java/me/shedaniel/rei/impl/RecipeHelperImpl.java11
-rw-r--r--src/main/java/me/shedaniel/rei/plugin/DefaultPlugin.java4
-rw-r--r--src/main/java/me/shedaniel/rei/tests/plugin/REITestPlugin.java5
7 files changed, 58 insertions, 26 deletions
diff --git a/gradle.properties b/gradle.properties
index e482dd2c0..386277404 100644
--- a/gradle.properties
+++ b/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
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++)