From badb100cd9b6fd73d1b2a40e864511400f0e2529 Mon Sep 17 00:00:00 2001 From: shedaniel Date: Sat, 28 May 2022 17:20:40 +0800 Subject: Fix tinkers transfer --- .../shedaniel/rei/impl/client/view/ViewsImpl.java | 93 ++++++++++++---------- 1 file changed, 49 insertions(+), 44 deletions(-) (limited to 'runtime/src/main/java') diff --git a/runtime/src/main/java/me/shedaniel/rei/impl/client/view/ViewsImpl.java b/runtime/src/main/java/me/shedaniel/rei/impl/client/view/ViewsImpl.java index cb37039be..2687b23ef 100644 --- a/runtime/src/main/java/me/shedaniel/rei/impl/client/view/ViewsImpl.java +++ b/runtime/src/main/java/me/shedaniel/rei/impl/client/view/ViewsImpl.java @@ -28,6 +28,7 @@ import com.google.common.collect.Iterables; import com.google.common.collect.Maps; import com.google.common.collect.Sets; import it.unimi.dsi.fastutil.longs.Long2LongMap; +import it.unimi.dsi.fastutil.longs.Long2LongMaps; import it.unimi.dsi.fastutil.longs.Long2LongOpenHashMap; import me.shedaniel.rei.RoughlyEnoughItemsCore; import me.shedaniel.rei.api.client.config.ConfigObject; @@ -337,6 +338,7 @@ public class ViewsImpl implements Views { for (Map.Entry, List> entry : DisplayRegistry.getInstance().getAll().entrySet()) { List displays = entry.getValue(); for (Display display : displays) { + try { MenuInfo info = menu != null ? MenuInfoRegistry.getInstance().getClient(display, menu) : null; @@ -373,58 +375,61 @@ public class ViewsImpl implements Views { return display; } } - - if (onlyIncludeHasMenu && info == null) { - continue; - } - - InfoContext context = new InfoContext(display); - Iterable inputSlots = info != null ? info.getInputSlots(context) : Collections.emptySet(); - int slotsCraftable = 0; - boolean containsNonEmpty = false; - List requiredInput = display.getRequiredEntries(); - Long2LongMap invCount = new Long2LongOpenHashMap(CraftableFilter.INSTANCE.getInvStacks()); - for (SlotAccessor inputSlot : inputSlots) { - ItemStack stack = inputSlot.getItemStack(); - EntryDefinition definition; - try { - definition = VanillaEntryTypes.ITEM.getDefinition(); - } catch (NullPointerException e) { - break; + if (onlyIncludeHasMenu && info == null) { + continue; } - if (!stack.isEmpty()) { - long hash = definition.hash(null, stack, ComparisonContext.FUZZY); - long newCount = invCount.get(hash) + Math.max(0, stack.getCount()); - invCount.put(hash, newCount); - } - } - for (EntryIngredient slot : requiredInput) { - if (slot.isEmpty()) { - slotsCraftable++; - continue; + InfoContext context = new InfoContext(display); + Iterable inputSlots = info != null ? Iterables.concat(info.getInputSlots(context), info.getInventorySlots(context.withDisplay(display))) : Collections.emptySet(); + int slotsCraftable = 0; + boolean containsNonEmpty = false; + List requiredInput = display.getRequiredEntries(); + Long2LongMap invCount = new Long2LongOpenHashMap(info == null ? CraftableFilter.INSTANCE.getInvStacks() : Long2LongMaps.EMPTY_MAP); + for (SlotAccessor inputSlot : inputSlots) { + ItemStack stack = inputSlot.getItemStack(); + + EntryDefinition definition; + try { + definition = VanillaEntryTypes.ITEM.getDefinition(); + } catch (NullPointerException e) { + break; + } + + if (!stack.isEmpty()) { + long hash = definition.hash(null, stack, ComparisonContext.FUZZY); + long newCount = invCount.get(hash) + Math.max(0, stack.getCount()); + invCount.put(hash, newCount); + } } - for (EntryStack slotPossible : slot) { - if (slotPossible.getType() != VanillaEntryTypes.ITEM) continue; - ItemStack stack = slotPossible.castValue(); - long hashFuzzy = EntryStacks.hashFuzzy(slotPossible); - long availableAmount = invCount.get(hashFuzzy); - if (availableAmount >= stack.getCount()) { - invCount.put(hashFuzzy, availableAmount - stack.getCount()); - containsNonEmpty = true; + for (EntryIngredient slot : requiredInput) { + if (slot.isEmpty()) { slotsCraftable++; - break; + continue; + } + for (EntryStack slotPossible : slot) { + if (slotPossible.getType() != VanillaEntryTypes.ITEM) continue; + ItemStack stack = slotPossible.castValue(); + long hashFuzzy = EntryStacks.hashFuzzy(slotPossible); + long availableAmount = invCount.get(hashFuzzy); + if (availableAmount >= stack.getCount()) { + invCount.put(hashFuzzy, availableAmount - stack.getCount()); + containsNonEmpty = true; + slotsCraftable++; + break; + } } } - } - if (slotsCraftable == display.getRequiredEntries().size() && containsNonEmpty) { - if (info != null && !onlyIncludeHasMenu) { - onlyIncludeHasMenu = true; - craftables.clear(); + if (slotsCraftable == display.getRequiredEntries().size() && containsNonEmpty) { + if (info != null && !onlyIncludeHasMenu) { + onlyIncludeHasMenu = true; + craftables.clear(); + } + + display.getOutputEntries().stream().flatMap(Collection::stream).collect(Collectors.toCollection(() -> craftables)); } - - display.getOutputEntries().stream().flatMap(Collection::stream).collect(Collectors.toCollection(() -> craftables)); + } catch (Throwable t) { + RoughlyEnoughItemsCore.LOGGER.warn("Error while checking if display is craftable", t); } } } -- cgit