diff options
| author | shedaniel <daniel@shedaniel.me> | 2022-05-28 17:20:40 +0800 |
|---|---|---|
| committer | shedaniel <daniel@shedaniel.me> | 2022-05-28 17:20:40 +0800 |
| commit | 3a0c6ef56b13691d9cef0a460201306a42f36d08 (patch) | |
| tree | e5bfba80006e9341e04747b733749daf30365199 | |
| parent | 0320403c44554b609bf87876b103e02fd84c7a1b (diff) | |
| download | RoughlyEnoughItems-3a0c6ef56b13691d9cef0a460201306a42f36d08.tar.gz RoughlyEnoughItems-3a0c6ef56b13691d9cef0a460201306a42f36d08.tar.bz2 RoughlyEnoughItems-3a0c6ef56b13691d9cef0a460201306a42f36d08.zip | |
Fix tinkers transfer
4 files changed, 68 insertions, 55 deletions
diff --git a/api/src/main/java/me/shedaniel/rei/api/common/transfer/info/clean/InputCleanHandler.java b/api/src/main/java/me/shedaniel/rei/api/common/transfer/info/clean/InputCleanHandler.java index 38fac60ce..934893518 100644 --- a/api/src/main/java/me/shedaniel/rei/api/common/transfer/info/clean/InputCleanHandler.java +++ b/api/src/main/java/me/shedaniel/rei/api/common/transfer/info/clean/InputCleanHandler.java @@ -43,7 +43,7 @@ public interface InputCleanHandler<T extends AbstractContainerMenu, D extends Di static <T extends AbstractContainerMenu> void returnSlotsToPlayerInventory(MenuInfoContext<T, ?, ?> context, DumpHandler<T, ?> dumpHandler, SlotAccessor slotAccessor) { ItemStack stackToReturn = slotAccessor.getItemStack(); if (!stackToReturn.isEmpty()) { - for (; stackToReturn.getCount() > 0; slotAccessor.takeStack(1)) { + for (; !(stackToReturn = slotAccessor.getItemStack()).isEmpty(); slotAccessor.takeStack(1)) { ItemStack stackToInsert = stackToReturn.copy(); stackToInsert.setCount(1); if (!dumpGenericsFtw(context, dumpHandler, stackToInsert)) { diff --git a/api/src/main/java/me/shedaniel/rei/api/common/transfer/info/simple/RecipeBookGridMenuInfo.java b/api/src/main/java/me/shedaniel/rei/api/common/transfer/info/simple/RecipeBookGridMenuInfo.java index 30ba221fc..9455c621c 100644 --- a/api/src/main/java/me/shedaniel/rei/api/common/transfer/info/simple/RecipeBookGridMenuInfo.java +++ b/api/src/main/java/me/shedaniel/rei/api/common/transfer/info/simple/RecipeBookGridMenuInfo.java @@ -25,6 +25,8 @@ package me.shedaniel.rei.api.common.transfer.info.simple; import me.shedaniel.rei.api.common.display.SimpleGridMenuDisplay; import me.shedaniel.rei.api.common.transfer.RecipeFinder; +import me.shedaniel.rei.api.common.transfer.info.MenuInfoContext; +import net.minecraft.world.entity.player.StackedContents; import net.minecraft.world.inventory.RecipeBookMenu; import net.minecraft.world.item.ItemStack; @@ -56,8 +58,8 @@ public class RecipeBookGridMenuInfo<T extends RecipeBookMenu<?>, D extends Simpl } @Override - public void populateRecipeFinder(T menu, RecipeFinder finder) { - menu.fillCraftSlotsStackedContents(new net.minecraft.world.entity.player.StackedContents() { + public void populateRecipeFinder(MenuInfoContext<T, ?, D> context, RecipeFinder finder) { + context.getMenu().fillCraftSlotsStackedContents(new StackedContents() { @Override public void accountSimpleStack(ItemStack stack) { finder.addNormalItem(stack); diff --git a/api/src/main/java/me/shedaniel/rei/api/common/transfer/info/simple/SimplePlayerInventoryMenuInfo.java b/api/src/main/java/me/shedaniel/rei/api/common/transfer/info/simple/SimplePlayerInventoryMenuInfo.java index 246bff88f..d6511b521 100644 --- a/api/src/main/java/me/shedaniel/rei/api/common/transfer/info/simple/SimplePlayerInventoryMenuInfo.java +++ b/api/src/main/java/me/shedaniel/rei/api/common/transfer/info/simple/SimplePlayerInventoryMenuInfo.java @@ -23,7 +23,6 @@ package me.shedaniel.rei.api.common.transfer.info.simple; -import com.google.common.base.MoreObjects; import me.shedaniel.rei.api.common.display.Display; import me.shedaniel.rei.api.common.transfer.RecipeFinder; import me.shedaniel.rei.api.common.transfer.RecipeFinderPopulator; @@ -53,7 +52,7 @@ public interface SimplePlayerInventoryMenuInfo<T extends AbstractContainerMenu, for (SlotAccessor inventoryStack : getInventorySlots(context)) { finder.addNormalItem(inventoryStack.getItemStack()); } - populateRecipeFinder(context.getMenu(), finder); + populateRecipeFinder(context, finder); }; } @@ -76,11 +75,10 @@ public interface SimplePlayerInventoryMenuInfo<T extends AbstractContainerMenu, default DumpHandler<T, D> getDumpHandler() { return (context, stackToDump) -> { Iterable<SlotAccessor> inventoryStacks = getInventorySlots(context); + SlotAccessor occupiedSlotWithRoomForStack = DumpHandler.getOccupiedSlotWithRoomForStack(stackToDump, inventoryStacks); + SlotAccessor emptySlot = DumpHandler.getEmptySlot(inventoryStacks); - SlotAccessor nextSlot = MoreObjects.firstNonNull( - DumpHandler.getOccupiedSlotWithRoomForStack(stackToDump, inventoryStacks), - DumpHandler.getEmptySlot(inventoryStacks) - ); + SlotAccessor nextSlot = occupiedSlotWithRoomForStack == null ? emptySlot : occupiedSlotWithRoomForStack; if (nextSlot == null) { return false; } @@ -99,8 +97,16 @@ public interface SimplePlayerInventoryMenuInfo<T extends AbstractContainerMenu, .collect(Collectors.toList()); } + @Deprecated(forRemoval = true) default void populateRecipeFinder(T menu, RecipeFinder finder) {} + default void populateRecipeFinder(MenuInfoContext<T, ?, D> context, RecipeFinder finder) { + for (SlotAccessor inventoryStack : getInputSlots(context)) { + finder.addNormalItem(inventoryStack.getItemStack()); + } + populateRecipeFinder(context.getMenu(), finder); + } + /** * Used to forcefully clear the input slots, if things did not dump to the player's inventory successfully. * The default implementation here is to void the items, as with vanilla, 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 57fb1f077..8b1f60edc 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; @@ -375,60 +376,64 @@ public class ViewsImpl implements Views { List<Display> displays = entry.getValue(); for (Display display : displays) { - MenuInfo<AbstractContainerMenu, Display> info = menu != null ? - MenuInfoRegistry.getInstance().getClient(display, context, menu) - : null; - - if (onlyIncludeHasMenu && info == null) { - continue; - } - - Iterable<SlotAccessor> inputSlots = info != null ? info.getInputSlots(context.withDisplay(display)) : Collections.emptySet(); - int slotsCraftable = 0; - boolean containsNonEmpty = false; - List<EntryIngredient> requiredInput = display.getRequiredEntries(); - Long2LongMap invCount = new Long2LongOpenHashMap(CraftableFilter.INSTANCE.getInvStacks()); - for (SlotAccessor inputSlot : inputSlots) { - ItemStack stack = inputSlot.getItemStack(); + try { + MenuInfo<AbstractContainerMenu, Display> info = menu != null ? + MenuInfoRegistry.getInstance().getClient(display, context, menu) + : null; - EntryDefinition<ItemStack> 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; + Iterable<SlotAccessor> inputSlots = info != null ? Iterables.concat(info.getInputSlots(context.withDisplay(display)), info.getInventorySlots(context.withDisplay(display))) : Collections.emptySet(); + int slotsCraftable = 0; + boolean containsNonEmpty = false; + List<EntryIngredient> requiredInput = display.getRequiredEntries(); + Long2LongMap invCount = new Long2LongOpenHashMap(info == null ? CraftableFilter.INSTANCE.getInvStacks() : Long2LongMaps.EMPTY_MAP); + for (SlotAccessor inputSlot : inputSlots) { + ItemStack stack = inputSlot.getItemStack(); + + EntryDefinition<ItemStack> 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); } } } |
