Переглянути джерело

Fix nbt entries for entry registry

Signed-off-by: shedaniel <daniel@shedaniel.me>
shedaniel 5 роки тому
батько
коміт
e1bb0e7d8e

+ 1 - 1
gradle.properties

@@ -1,5 +1,5 @@
 org.gradle.jvmargs=-Xmx3G
-mod_version=4.3.11-unstable
+mod_version=4.3.12-unstable
 supported_version=20w21a
 minecraft_version=20w21a
 yarn_version=20w21a+build.7+legacy.20w09a+build.8

+ 39 - 16
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

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

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

+ 12 - 4
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);

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