aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorshedaniel <daniel@shedaniel.me>2022-05-28 17:20:40 +0800
committershedaniel <daniel@shedaniel.me>2022-05-28 17:20:40 +0800
commit3a0c6ef56b13691d9cef0a460201306a42f36d08 (patch)
treee5bfba80006e9341e04747b733749daf30365199
parent0320403c44554b609bf87876b103e02fd84c7a1b (diff)
downloadRoughlyEnoughItems-3a0c6ef56b13691d9cef0a460201306a42f36d08.tar.gz
RoughlyEnoughItems-3a0c6ef56b13691d9cef0a460201306a42f36d08.tar.bz2
RoughlyEnoughItems-3a0c6ef56b13691d9cef0a460201306a42f36d08.zip
Fix tinkers transfer
-rw-r--r--api/src/main/java/me/shedaniel/rei/api/common/transfer/info/clean/InputCleanHandler.java2
-rw-r--r--api/src/main/java/me/shedaniel/rei/api/common/transfer/info/simple/RecipeBookGridMenuInfo.java6
-rw-r--r--api/src/main/java/me/shedaniel/rei/api/common/transfer/info/simple/SimplePlayerInventoryMenuInfo.java18
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/impl/client/view/ViewsImpl.java97
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);
}
}
}