diff options
Diffstat (limited to 'src/main/java/me/shedaniel')
6 files changed, 88 insertions, 95 deletions
diff --git a/src/main/java/me/shedaniel/rei/api/EntryRegistry.java b/src/main/java/me/shedaniel/rei/api/EntryRegistry.java index a7765036d..c850345d9 100644 --- a/src/main/java/me/shedaniel/rei/api/EntryRegistry.java +++ b/src/main/java/me/shedaniel/rei/api/EntryRegistry.java @@ -10,6 +10,7 @@ import me.shedaniel.rei.utils.CollectionUtils; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; +import java.util.Arrays; import java.util.Collection; import java.util.List; @@ -27,6 +28,8 @@ public interface EntryRegistry { */ List<EntryStack> getStacksList(); + List<ItemStack> appendStacksForItem(Item item); + /** * Gets all possible stacks from an item * @@ -66,11 +69,7 @@ public interface EntryRegistry { * @param stacks the stacks to register */ default void registerEntriesAfter(EntryStack afterStack, EntryStack... stacks) { - for (int i = stacks.length - 1; i >= 0; i--) { - EntryStack stack = stacks[i]; - if (stack != null && !stack.isEmpty()) - registerEntryAfter(afterStack, stack); - } + registerEntriesAfter(afterStack, Arrays.asList(stacks)); } /** @@ -79,9 +78,7 @@ public interface EntryRegistry { * @param afterStack the stack to put after * @param stacks the stacks to register */ - default void registerEntriesAfter(EntryStack afterStack, Collection<? extends EntryStack> stacks) { - registerEntriesAfter(afterStack, stacks.toArray(new EntryStack[0])); - } + void registerEntriesAfter(EntryStack afterStack, Collection<? extends EntryStack> stacks); /** * Registers multiple stacks to the item list diff --git a/src/main/java/me/shedaniel/rei/impl/EntryRegistryImpl.java b/src/main/java/me/shedaniel/rei/impl/EntryRegistryImpl.java index 42913d71c..b6613d79e 100644 --- a/src/main/java/me/shedaniel/rei/impl/EntryRegistryImpl.java +++ b/src/main/java/me/shedaniel/rei/impl/EntryRegistryImpl.java @@ -8,20 +8,14 @@ package me.shedaniel.rei.impl; import com.google.common.collect.Lists; import me.shedaniel.rei.api.EntryRegistry; import me.shedaniel.rei.api.EntryStack; +import me.shedaniel.rei.api.RecipeHelper; import me.shedaniel.rei.api.annotations.Internal; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.util.DefaultedList; -import it.unimi.dsi.fastutil.Hash; -import it.unimi.dsi.fastutil.objects.ObjectOpenCustomHashSet; -import it.unimi.dsi.fastutil.objects.ObjectSets; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.List; -import java.util.Set; +import javax.annotation.Nullable; +import java.util.*; import java.util.concurrent.CopyOnWriteArrayList; @Deprecated @@ -29,39 +23,37 @@ import java.util.concurrent.CopyOnWriteArrayList; public class EntryRegistryImpl implements EntryRegistry { private final CopyOnWriteArrayList<EntryStack> entries = Lists.newCopyOnWriteArrayList(); - private final Set<EntryStack> entrySet = ObjectSets.synchronize(new ObjectOpenCustomHashSet<>(new Hash.Strategy<EntryStack>() { - @Override - public int hashCode(EntryStack entry) { - return entry == null ? 0 : entry.hashOfAll(); - } + private final LinkedList<EntryStack> linkedList = Lists.newLinkedList(); - @Override - public boolean equals(EntryStack a, EntryStack b) { - if (a == null || b == null) { - return a == b; - } else { - boolean result = a.equalsAll(b); - assert result == b.equalsAll(a) : "a.equalsAll(b) != b.equalsAll(a); (a = " + a + ", b = " + b + ")"; - return result; - } - } - })); + public void distinct() { + TreeSet<EntryStack> set = new TreeSet<>((i, j) -> i.equalsAll(j) ? 0 : 1); + set.addAll(linkedList); + entries.clear(); + entries.addAll(set); + linkedList.clear(); + } @Override public List<EntryStack> getStacksList() { - return entries; + return RecipeHelper.getInstance().arePluginsLoading() && !linkedList.isEmpty() ? linkedList : entries; } public void reset() { entries.clear(); - entrySet.clear(); + linkedList.clear(); } @Override - public ItemStack[] getAllStacksFromItem(Item item) { - DefaultedList<ItemStack> list = DefaultedList.of(); - list.add(item.getStackForRender()); + public List<ItemStack> appendStacksForItem(Item item) { + DefaultedList<ItemStack> list = new DefaultedLinkedList(Lists.newLinkedList(), null); item.appendStacks(item.getGroup(), list); + if (list.isEmpty()) list.add(item.getStackForRender()); + return list; + } + + @Override + public ItemStack[] getAllStacksFromItem(Item item) { + List<ItemStack> list = appendStacksForItem(item); ItemStack[] array = list.toArray(new ItemStack[0]); Arrays.sort(array, (a, b) -> ItemStack.areEqualIgnoreDamage(a, b) ? 0 : 1); return array; @@ -71,43 +63,36 @@ public class EntryRegistryImpl implements EntryRegistry { @Deprecated public void registerEntryAfter(EntryStack afterEntry, EntryStack stack, boolean checkAlreadyContains) { if (stack.isEmpty()) return; - boolean isNew = entrySet.add(stack); - if (checkAlreadyContains && !isNew) { - return; - } if (afterEntry == null) { - entries.add(stack); + linkedList.add(stack); } else { - int last = entries.size(); - for (int i = 0; i < entries.size(); i++) - if (entries.get(i).equalsAll(afterEntry)) + int last = linkedList.size(); + for (int i = last - 1; i >= 0; i++) + if (linkedList.get(i).equalsAll(afterEntry)) { last = i + 1; - entries.add(last, stack); + break; + } + linkedList.add(last, stack); } } @Override public void registerEntriesAfter(EntryStack afterStack, Collection<? extends EntryStack> stacks) { - List<EntryStack> nonDuplicates = new ArrayList<>(); - for (EntryStack stack : stacks) { - if (entrySet.add(stack)) { - nonDuplicates.add(stack); - } - } - int index = entries.size(); if (afterStack != null) { + int index = linkedList.size(); for (int i = index - 1; i >= 0; i--) { - if (entries.get(i).equalsAll(afterStack)) { + if (linkedList.get(i).equalsAll(afterStack)) { index = i + 1; break; } } - } - entries.addAll(index, nonDuplicates); + linkedList.addAll(index, stacks); + } else linkedList.addAll(stacks); } - @Override - public void registerEntriesAfter(EntryStack afterStack, EntryStack... stacks) { - registerEntriesAfter(afterStack, Arrays.asList(stacks)); + private class DefaultedLinkedList<E> extends DefaultedList<E> { + public DefaultedLinkedList(List<E> delegate, @Nullable E initialElement) { + super(delegate, initialElement); + } } } diff --git a/src/main/java/me/shedaniel/rei/impl/ItemEntryStack.java b/src/main/java/me/shedaniel/rei/impl/ItemEntryStack.java index 3778cd5f0..2e6138cb2 100644 --- a/src/main/java/me/shedaniel/rei/impl/ItemEntryStack.java +++ b/src/main/java/me/shedaniel/rei/impl/ItemEntryStack.java @@ -116,17 +116,17 @@ public class ItemEntryStack extends AbstractEntryStack { @Override public int hashCode() { - if (hash == -1) { +// if (hash == -1) { int result = 1; - result = 31 * result + getType().ordinal(); + result = 31 * result + getType().hashCode(); result = 31 * result + itemStack.getItem().hashCode(); result = 31 * result + itemStack.getCount(); result = 31 * result + (itemStack.hasTag() ? itemStack.getTag().hashCode() : 0); hash = result; - if (hash == -1) { - hash = -2; - } - } +// if (hash == -1) { +// hash = -2; +// } +// } return hash; } diff --git a/src/main/java/me/shedaniel/rei/impl/RecipeHelperImpl.java b/src/main/java/me/shedaniel/rei/impl/RecipeHelperImpl.java index 8db27a8c7..4337e4ad1 100644 --- a/src/main/java/me/shedaniel/rei/impl/RecipeHelperImpl.java +++ b/src/main/java/me/shedaniel/rei/impl/RecipeHelperImpl.java @@ -47,16 +47,16 @@ public class RecipeHelperImpl implements RecipeHelper { VISIBILITY_HANDLER_COMPARATOR = comparator.reversed(); } - private final List<AutoTransferHandler> autoTransferHandlers = Lists.newArrayList(); - private final List<RecipeFunction> recipeFunctions = Lists.newArrayList(); - private final List<ScreenClickArea> screenClickAreas = Lists.newArrayList(); - private final AtomicInteger recipeCount = new AtomicInteger(); - private final Map<Identifier, List<RecipeDisplay>> recipeCategoryListMap = Maps.newHashMap(); - private final List<RecipeCategory<?>> categories = Lists.newArrayList(); - private final Map<Identifier, ButtonAreaSupplier> autoCraftAreaSupplierMap = Maps.newHashMap(); - private final Map<Identifier, List<List<EntryStack>>> categoryWorkingStations = Maps.newHashMap(); - private final List<DisplayVisibilityHandler> displayVisibilityHandlers = Lists.newArrayList(); - private final List<LiveRecipeGenerator<RecipeDisplay>> liveRecipeGenerators = Lists.newArrayList(); + private final List<AutoTransferHandler> autoTransferHandlers = Lists.newLinkedList(); + private final List<RecipeFunction> recipeFunctions = Lists.newLinkedList(); + private final List<ScreenClickArea> screenClickAreas = Lists.newLinkedList(); + private final int[] recipeCount = {0}; + private final Map<Identifier, List<RecipeDisplay>> recipeCategoryListMap = Maps.newLinkedHashMap(); + private final List<RecipeCategory<?>> categories = Lists.newLinkedList(); + private final Map<Identifier, ButtonAreaSupplier> autoCraftAreaSupplierMap = Maps.newLinkedHashMap(); + private final Map<Identifier, List<List<EntryStack>>> categoryWorkingStations = Maps.newLinkedHashMap(); + private final List<DisplayVisibilityHandler> displayVisibilityHandlers = Lists.newLinkedList(); + private final List<LiveRecipeGenerator<RecipeDisplay>> liveRecipeGenerators = Lists.newLinkedList(); private RecipeManager recipeManager; private boolean arePluginsLoading = false; @@ -118,14 +118,14 @@ public class RecipeHelperImpl implements RecipeHelper { public void registerDisplay(Identifier categoryIdentifier, RecipeDisplay display) { if (!recipeCategoryListMap.containsKey(categoryIdentifier)) return; - recipeCount.incrementAndGet(); + recipeCount[0]++; recipeCategoryListMap.get(categoryIdentifier).add(display); } private void registerDisplay(Identifier categoryIdentifier, RecipeDisplay display, int index) { if (!recipeCategoryListMap.containsKey(categoryIdentifier)) return; - recipeCount.incrementAndGet(); + recipeCount[0]++; recipeCategoryListMap.get(categoryIdentifier).add(index, display); } @@ -249,7 +249,7 @@ public class RecipeHelperImpl implements RecipeHelper { long startTime = System.currentTimeMillis(); arePluginsLoading = true; ScreenHelper.clearData(); - this.recipeCount.set(0); + recipeCount[0] = 0; this.recipeManager = recipeManager; this.recipeCategoryListMap.clear(); this.categories.clear(); @@ -277,7 +277,9 @@ public class RecipeHelperImpl implements RecipeHelper { for (REIPluginEntry plugin : plugins) { try { if (reiVersion instanceof SemanticVersion) - if (plugin.getMinimumVersion().compareTo((SemanticVersion) reiVersion) > 0) { + if (plugin.getMinimumVersion() == null) { + RoughlyEnoughItemsCore.LOGGER.warn("[REI] Plugin " + plugin.getPluginIdentifier().toString() + " did not provide a minimum version, skipping version check!"); + } else if (plugin.getMinimumVersion().compareTo((SemanticVersion) reiVersion) > 0) { throw new IllegalStateException("Requires " + plugin.getMinimumVersion().getFriendlyString() + " version of REI!"); } if (plugin instanceof REIPluginV0) { @@ -300,6 +302,9 @@ 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(); try { @@ -333,12 +338,13 @@ public class RecipeHelperImpl implements RecipeHelper { return -1f; } }); + // Clear Cache ((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.get(), DisplayHelper.getInstance().getBaseBoundsHandler().supplierSize(), DisplayHelper.getInstance().getAllBoundsHandlers().size(), getDisplayVisibilityHandlers().size(), categories.size(), String.join(", ", categories.stream().map(RecipeCategory::getCategoryName).collect(Collectors.toList())), usedTime); + 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; } @@ -355,7 +361,7 @@ public class RecipeHelperImpl implements RecipeHelper { @Override public int getRecipeCount() { - return recipeCount.get(); + return recipeCount[0]; } @Override diff --git a/src/main/java/me/shedaniel/rei/plugin/DefaultPlugin.java b/src/main/java/me/shedaniel/rei/plugin/DefaultPlugin.java index c0ccf527b..c876a6f1f 100644 --- a/src/main/java/me/shedaniel/rei/plugin/DefaultPlugin.java +++ b/src/main/java/me/shedaniel/rei/plugin/DefaultPlugin.java @@ -94,16 +94,13 @@ public class DefaultPlugin implements REIPluginV0 { return; } for (Item item : Registry.ITEM) { - ItemStack[] stacks = null; + List<ItemStack> stacks = null; try { - stacks = entryRegistry.getAllStacksFromItem(item); - for (ItemStack stack : entryRegistry.getAllStacksFromItem(item)) { - entryRegistry.registerEntry(EntryStack.create(stack)); - } + stacks = entryRegistry.appendStacksForItem(item); } catch (Exception ignored) { } if (stacks != null) { - for (ItemStack stack : entryRegistry.getAllStacksFromItem(item)) { + for (ItemStack stack : entryRegistry.appendStacksForItem(item)) { entryRegistry.registerEntry(EntryStack.create(stack)); } } else 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 9064fd499..9eebeaee0 100644 --- a/src/main/java/me/shedaniel/rei/tests/plugin/REITestPlugin.java +++ b/src/main/java/me/shedaniel/rei/tests/plugin/REITestPlugin.java @@ -15,10 +15,14 @@ import net.minecraft.util.registry.Registry; import org.apache.logging.log4j.LogManager; import org.jetbrains.annotations.TestOnly; +import java.util.Random; + @TestOnly @Deprecated public class REITestPlugin implements REIPluginV0 { + private Random random = new Random(); + @Override public void preRegister() { LogManager.getLogger().error("REI Test Plugin is enabled! If you see this unintentionally, please report this!"); @@ -32,17 +36,21 @@ public class REITestPlugin implements REIPluginV0 { @Override public void registerEntries(EntryRegistry entryRegistry) { for (Item item : Registry.ITEM) { - entryRegistry.registerEntryAfter(null, EntryStack.create(item), false); - entryRegistry.registerEntryAfter(null, EntryStack.create(item), false); - entryRegistry.registerEntryAfter(null, EntryStack.create(item), false); + for (int i = 0; i < 15; i++) + entryRegistry.registerEntry(transformStack(EntryStack.create(item))); try { - for (ItemStack stack : entryRegistry.getAllStacksFromItem(item)) { - entryRegistry.registerEntryAfter(null, EntryStack.create(stack), false); - entryRegistry.registerEntryAfter(null, EntryStack.create(stack), false); - entryRegistry.registerEntryAfter(null, EntryStack.create(stack), false); + for (ItemStack stack : entryRegistry.appendStacksForItem(item)) { + for (int i = 0; i < 15; i++) + entryRegistry.registerEntry(transformStack(EntryStack.create(stack))); } } catch (Exception e) { } } } + + public EntryStack transformStack(EntryStack stack) { + stack.setAmount(random.nextInt(Integer.MAX_VALUE)); + return stack; + } + } |
