diff options
| author | shedaniel <daniel@shedaniel.me> | 2021-04-16 17:30:12 +0800 |
|---|---|---|
| committer | shedaniel <daniel@shedaniel.me> | 2021-04-16 17:30:12 +0800 |
| commit | c717abb26056f8c219ad9c351a9908d3c3c54e88 (patch) | |
| tree | f77ccb01ad5d0f2eb61d1bd13f92ad1006c95e14 /api/src/main/java/me | |
| parent | a92c5492155f1bd12853acea98a235d3bb78839e (diff) | |
| parent | 4e2c0be9a75e435956ca80d56df2ca609245671d (diff) | |
| download | RoughlyEnoughItems-c717abb26056f8c219ad9c351a9908d3c3c54e88.tar.gz RoughlyEnoughItems-c717abb26056f8c219ad9c351a9908d3c3c54e88.tar.bz2 RoughlyEnoughItems-c717abb26056f8c219ad9c351a9908d3c3c54e88.zip | |
Merge remote-tracking branch 'origin/6.x' into 6.x-1.17
# Conflicts:
# api/src/main/java/me/shedaniel/rei/api/common/transfer/info/simple/SimplePlayerInventoryMenuInfo.java
# runtime/src/main/java/me/shedaniel/rei/plugin/client/entry/FluidEntryDefinition.java
Diffstat (limited to 'api/src/main/java/me')
12 files changed, 172 insertions, 57 deletions
diff --git a/api/src/main/java/me/shedaniel/rei/api/common/display/SimpleMenuDisplay.java b/api/src/main/java/me/shedaniel/rei/api/common/display/SimpleMenuDisplay.java index bcedad7fd..623386752 100644 --- a/api/src/main/java/me/shedaniel/rei/api/common/display/SimpleMenuDisplay.java +++ b/api/src/main/java/me/shedaniel/rei/api/common/display/SimpleMenuDisplay.java @@ -23,6 +23,12 @@ package me.shedaniel.rei.api.common.display; +/** + * An display to be used alongside {@link me.shedaniel.rei.api.common.transfer.info.simple.SimpleGridMenuInfo}, + * to provide a {@code width} and {@code height} for the grid of the recipe. + * + * @see me.shedaniel.rei.api.common.transfer.info.simple.SimpleGridMenuInfo + */ public interface SimpleMenuDisplay extends Display { int getWidth(); diff --git a/api/src/main/java/me/shedaniel/rei/api/common/transfer/info/MenuInfo.java b/api/src/main/java/me/shedaniel/rei/api/common/transfer/info/MenuInfo.java index 11c307def..da5a9640d 100644 --- a/api/src/main/java/me/shedaniel/rei/api/common/transfer/info/MenuInfo.java +++ b/api/src/main/java/me/shedaniel/rei/api/common/transfer/info/MenuInfo.java @@ -23,24 +23,28 @@ package me.shedaniel.rei.api.common.transfer.info; +import me.shedaniel.rei.api.common.category.CategoryIdentifier; import me.shedaniel.rei.api.common.display.Display; import me.shedaniel.rei.api.common.display.DisplaySerializerRegistry; import me.shedaniel.rei.api.common.entry.type.VanillaEntryTypes; import me.shedaniel.rei.api.common.transfer.RecipeFinder; import me.shedaniel.rei.api.common.transfer.RecipeFinderPopulator; import me.shedaniel.rei.api.common.transfer.info.clean.InputCleanHandler; -import me.shedaniel.rei.api.common.transfer.info.stack.StackAccessor; +import me.shedaniel.rei.api.common.transfer.info.simple.SimplePlayerInventoryMenuInfo; +import me.shedaniel.rei.api.common.transfer.info.stack.SlotAccessor; import me.shedaniel.rei.api.common.util.CollectionUtils; import net.minecraft.nbt.CompoundTag; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.item.ItemStack; +import java.util.Collections; import java.util.List; +import java.util.Optional; /** * Provider of information for {@link AbstractContainerMenu}, for the default REI {@link me.shedaniel.rei.api.client.registry.transfer.TransferHandler}. - * Allows custom slots by the interface {@link StackAccessor}, populates and syncs the {@link Display} to the server. + * Allows custom slots by the interface {@link SlotAccessor}, populates and syncs the {@link Display} to the server. * * @param <T> the type of the menu * @param <D> the type of display @@ -48,40 +52,95 @@ import java.util.List; * @see me.shedaniel.rei.api.common.transfer.info.simple.SimplePlayerInventoryMenuInfo * @see me.shedaniel.rei.api.common.transfer.info.simple.SimpleGridMenuInfo */ -public interface MenuInfo<T extends AbstractContainerMenu, D extends Display> { - default RecipeFinderPopulator<T, D> getRecipeFinderPopulator() { - return (context, recipeFinder) -> { - for (StackAccessor inventoryStack : getInventoryStacks(context)) { - recipeFinder.addNormalItem(inventoryStack.getItemStack()); - } - populateRecipeFinder(context.getMenu(), recipeFinder); - }; +public interface MenuInfo<T extends AbstractContainerMenu, D extends Display> extends MenuInfoProvider<T, D> { + @Override + default Optional<MenuInfo<T, D>> provide(CategoryIdentifier<D> categoryId, Class<T> menuClass) { + return Optional.of(this); } + /** + * Returns a {@link RecipeFinderPopulator}, used to populate a {@link RecipeFinder} with + * available ingredients. + * + * @return a {@link RecipeFinderPopulator} + */ + RecipeFinderPopulator<T, D> getRecipeFinderPopulator(); + + /** + * Returns an {@link InputCleanHandler} that cleans the input grid. + * + * @return an {@link InputCleanHandler} that cleans the input grid + * @see SimplePlayerInventoryMenuInfo#getInputCleanHandler() + */ InputCleanHandler<T, D> getInputCleanHandler(); - Iterable<StackAccessor> getInputStacks(MenuInfoContext<T, ?, D> context); + /** + * Returns an {@link Iterable} of {@link SlotAccessor}, of the slots that houses the inputs of the transfer. + * + * @param context the context of the transfer + * @return an {@link Iterable} of the input slots. + */ + Iterable<SlotAccessor> getInputSlots(MenuInfoContext<T, ?, D> context); - Iterable<StackAccessor> getInventoryStacks(MenuInfoContext<T, ?, D> context); + /** + * Returns an {@link Iterable} of {@link SlotAccessor}, of the slots that provides ingredients. + * + * @param context the context of the transfer + * @return an {@link Iterable} of the inventory slots. + */ + Iterable<SlotAccessor> getInventorySlots(MenuInfoContext<T, ?, D> context); + /** + * Marks the transfer as dirty, as in something has changed. + * This denotes that an update should be sent to the {@link ServerPlayer}. + * + * @param context the context of the transfer + */ default void markDirty(MenuInfoContext<T, ? extends ServerPlayer, D> context) { context.getPlayerEntity().getInventory().setChanged(); context.getMenu().broadcastChanges(); } - default void populateRecipeFinder(T container, RecipeFinder finder) {} - - default void validate(MenuInfoContext<T, ?, D> context) throws MenuTransferException {} + /** + * Validates the transfer, throws {@link MenuTransferException} if something is wrong. + * + * @param context the context of the transfer + * @throws MenuTransferException the exception to throw if something is wrong, + * this exception should be caught by the invoker + */ + default void validate(MenuInfoContext<T, ?, D> context) throws MenuTransferException { + } - default List<List<ItemStack>> getDisplayInputs(MenuInfoContext<T, ?, D> context) { - return CollectionUtils.map(context.getDisplay().getInputEntries(), inputEntry -> CollectionUtils.filterAndMap(inputEntry, stack -> stack.getType() == VanillaEntryTypes.ITEM, - stack -> stack.<ItemStack>cast().getValue())); + /** + * Returns the inputs of the {@link Display}. The nested lists are possible stacks for that specific slot. + * + * @param context the context of the transfer + * @return the list of lists of items + */ + default List<List<ItemStack>> getInputs(MenuInfoContext<T, ?, D> context) { + if (context.getDisplay() == null) return Collections.emptyList(); + return CollectionUtils.map(context.getDisplay().getInputEntries(), inputEntry -> + CollectionUtils.filterAndMap(inputEntry, stack -> stack.getType() == VanillaEntryTypes.ITEM, stack -> stack.<ItemStack>cast().getValue())); } + /** + * Serializes the {@link Display} as {@link CompoundTag}, sent to the server for further info for the transfer. + * + * @param context the context of the transfer + * @param display the display to serialize + * @return the {@link CompoundTag} serialized + */ default CompoundTag save(MenuSerializationContext<T, ?, D> context, D display) { return DisplaySerializerRegistry.getInstance().save(display.getCategoryIdentifier(), display, new CompoundTag()); } + /** + * Deserializes the {@link Display} from {@link CompoundTag}, sent from the client for further info of the transfer. + * + * @param context the context of the transfer + * @param tag the nbt tag to deserialize from + * @return the {@link Display} deserialized + */ default D read(MenuSerializationContext<T, ?, D> context, CompoundTag tag) { return DisplaySerializerRegistry.getInstance().read(context.getCategoryIdentifier(), tag); } diff --git a/api/src/main/java/me/shedaniel/rei/api/common/transfer/info/MenuInfoProvider.java b/api/src/main/java/me/shedaniel/rei/api/common/transfer/info/MenuInfoProvider.java new file mode 100644 index 000000000..1e43dbbdc --- /dev/null +++ b/api/src/main/java/me/shedaniel/rei/api/common/transfer/info/MenuInfoProvider.java @@ -0,0 +1,18 @@ +package me.shedaniel.rei.api.common.transfer.info; + +import me.shedaniel.rei.api.common.category.CategoryIdentifier; +import me.shedaniel.rei.api.common.display.Display; +import net.minecraft.world.inventory.AbstractContainerMenu; + +import java.util.Optional; + +/** + * A provider of {@link MenuInfo}, to provide info conditionally, or dynamically. + * + * @param <T> the type of the menu + * @param <D> the type of display + */ +@FunctionalInterface +public interface MenuInfoProvider<T extends AbstractContainerMenu, D extends Display> { + Optional<MenuInfo<T, D>> provide(CategoryIdentifier<D> categoryId, Class<T> menuClass); +} diff --git a/api/src/main/java/me/shedaniel/rei/api/common/transfer/info/MenuInfoRegistry.java b/api/src/main/java/me/shedaniel/rei/api/common/transfer/info/MenuInfoRegistry.java index a6e7b665b..c1c0b79b0 100644 --- a/api/src/main/java/me/shedaniel/rei/api/common/transfer/info/MenuInfoRegistry.java +++ b/api/src/main/java/me/shedaniel/rei/api/common/transfer/info/MenuInfoRegistry.java @@ -40,9 +40,9 @@ public interface MenuInfoRegistry extends Reloadable<REIServerPlugin> { return PluginManager.getServerInstance().get(MenuInfoRegistry.class); } - <C extends AbstractContainerMenu, D extends Display> void register(CategoryIdentifier<D> category, Class<C> menuClass, MenuInfo<C, D> menuInfo); + <C extends AbstractContainerMenu, D extends Display> void register(CategoryIdentifier<D> category, Class<C> menuClass, MenuInfoProvider<C, D> menuInfo); - <D extends Display> void registerGeneric(Predicate<CategoryIdentifier<?>> categoryPredicate, MenuInfo<?, D> menuInfo); + <D extends Display> void registerGeneric(Predicate<CategoryIdentifier<?>> categoryPredicate, MenuInfoProvider<?, D> menuInfo); <C extends AbstractContainerMenu, D extends Display> MenuInfo<C, D> get(CategoryIdentifier<D> category, Class<C> menuClass); 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 d6731225e..6b99fe701 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 @@ -26,7 +26,7 @@ package me.shedaniel.rei.api.common.transfer.info.clean; import me.shedaniel.rei.api.common.display.Display; import me.shedaniel.rei.api.common.transfer.info.MenuInfoContext; import me.shedaniel.rei.api.common.transfer.info.simple.DumpHandler; -import me.shedaniel.rei.api.common.transfer.info.stack.StackAccessor; +import me.shedaniel.rei.api.common.transfer.info.stack.SlotAccessor; import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.item.ItemStack; @@ -40,10 +40,10 @@ public interface InputCleanHandler<T extends AbstractContainerMenu, D extends Di throw new IllegalStateException(translationKey); } - static <T extends AbstractContainerMenu> void returnSlotsToPlayerInventory(MenuInfoContext<T, ?, ?> context, DumpHandler<T, ?> dumpHandler, StackAccessor stackAccessor) { - ItemStack stackToReturn = stackAccessor.getItemStack(); + 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; stackAccessor.takeStack(1)) { + for (; stackToReturn.getCount() > 0; 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/DumpHandler.java b/api/src/main/java/me/shedaniel/rei/api/common/transfer/info/simple/DumpHandler.java index f3f9fdaee..056ab3941 100644 --- a/api/src/main/java/me/shedaniel/rei/api/common/transfer/info/simple/DumpHandler.java +++ b/api/src/main/java/me/shedaniel/rei/api/common/transfer/info/simple/DumpHandler.java @@ -25,7 +25,7 @@ package me.shedaniel.rei.api.common.transfer.info.simple; import me.shedaniel.rei.api.common.display.Display; import me.shedaniel.rei.api.common.transfer.info.MenuInfoContext; -import me.shedaniel.rei.api.common.transfer.info.stack.StackAccessor; +import me.shedaniel.rei.api.common.transfer.info.stack.SlotAccessor; import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.item.ItemStack; @@ -33,8 +33,8 @@ import net.minecraft.world.item.ItemStack; public interface DumpHandler<T extends AbstractContainerMenu, D extends Display> { boolean dump(MenuInfoContext<T, ?, D> context, ItemStack stackToDump); - static StackAccessor getOccupiedSlotWithRoomForStack(ItemStack stack, Iterable<StackAccessor> inventoryStacks) { - for (StackAccessor inventoryStack : inventoryStacks) { + static SlotAccessor getOccupiedSlotWithRoomForStack(ItemStack stack, Iterable<SlotAccessor> inventoryStacks) { + for (SlotAccessor inventoryStack : inventoryStacks) { if (canStackAddMore(inventoryStack.getItemStack(), stack)) { return inventoryStack; } @@ -43,8 +43,8 @@ public interface DumpHandler<T extends AbstractContainerMenu, D extends Display> return null; } - static StackAccessor getEmptySlot(Iterable<StackAccessor> inventoryStacks) { - for (StackAccessor inventoryStack : inventoryStacks) { + static SlotAccessor getEmptySlot(Iterable<SlotAccessor> inventoryStacks) { + for (SlotAccessor inventoryStack : inventoryStacks) { if (inventoryStack.getItemStack().isEmpty()) { return inventoryStack; } 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 f1a4bb84a..982307433 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 @@ -50,8 +50,8 @@ public class RecipeBookGridMenuInfo<T extends RecipeBookMenu<?>, D extends Simpl } @Override - public void populateRecipeFinder(T container, RecipeFinder finder) { - container.fillCraftSlotsStackedContents(new net.minecraft.world.entity.player.StackedContents() { + public void populateRecipeFinder(T menu, RecipeFinder finder) { + menu.fillCraftSlotsStackedContents(new net.minecraft.world.entity.player.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/SimpleGridMenuInfo.java b/api/src/main/java/me/shedaniel/rei/api/common/transfer/info/simple/SimpleGridMenuInfo.java index 24fbe807c..fbb47f5ca 100644 --- a/api/src/main/java/me/shedaniel/rei/api/common/transfer/info/simple/SimpleGridMenuInfo.java +++ b/api/src/main/java/me/shedaniel/rei/api/common/transfer/info/simple/SimpleGridMenuInfo.java @@ -27,7 +27,7 @@ import me.shedaniel.rei.api.common.display.SimpleMenuDisplay; import me.shedaniel.rei.api.common.transfer.info.MenuInfo; import me.shedaniel.rei.api.common.transfer.info.MenuInfoContext; import me.shedaniel.rei.api.common.transfer.info.MenuTransferException; -import me.shedaniel.rei.api.common.transfer.info.stack.StackAccessor; +import me.shedaniel.rei.api.common.transfer.info.stack.SlotAccessor; import net.minecraft.network.chat.TranslatableComponent; import net.minecraft.world.inventory.AbstractContainerMenu; @@ -35,22 +35,27 @@ import java.util.stream.Collectors; import java.util.stream.IntStream; /** - * A simple implementation of {@link MenuInfo} that provides {@link StackAccessor} by {@link net.minecraft.world.inventory.Slot}. + * A simple implementation of {@link MenuInfo} that provides {@link SlotAccessor} by {@link net.minecraft.world.inventory.Slot}. * <p> * Designed to be used for {@link net.minecraft.world.inventory.RecipeBookMenu}, and expects a width and height for a grid for the input. * Requires the display to be a implementation of {@link SimpleMenuDisplay}, to provide the width and height of the display. * * @param <T> the type of the menu * @param <D> the type of display + * @see SimpleMenuDisplay */ public interface SimpleGridMenuInfo<T extends AbstractContainerMenu, D extends SimpleMenuDisplay> extends SimplePlayerInventoryMenuInfo<T, D> { - default Iterable<StackAccessor> getInputStacks(MenuInfoContext<T, ?, D> context) { - return IntStream.range(0, getCraftingWidth(context.getMenu()) * getCraftingHeight(context.getMenu()) + 1) - .filter(value -> value != getCraftingResultSlotIndex(context.getMenu())) - .mapToObj(value -> StackAccessor.fromSlot(context.getMenu().getSlot(value))) + default Iterable<SlotAccessor> getInputSlots(MenuInfoContext<T, ?, D> context) { + return getInputStackSlotIds(context) + .mapToObj(value -> SlotAccessor.fromSlot(context.getMenu().getSlot(value))) .collect(Collectors.toList()); } + default IntStream getInputStackSlotIds(MenuInfoContext<T, ?, D> context) { + return IntStream.range(0, getCraftingWidth(context.getMenu()) * getCraftingHeight(context.getMenu()) + 1) + .filter(value -> value != getCraftingResultSlotIndex(context.getMenu())); + } + int getCraftingResultSlotIndex(T menu); int getCraftingWidth(T menu); @@ -62,7 +67,7 @@ public interface SimpleGridMenuInfo<T extends AbstractContainerMenu, D extends S int width = getCraftingWidth(context.getMenu()); int height = getCraftingHeight(context.getMenu()); SimpleMenuDisplay display = context.getDisplay(); - if (display.getWidth() > width || display.getHeight() > height) { + if (display != null && (display.getWidth() > width || display.getHeight() > height)) { throw new MenuTransferException(new TranslatableComponent("error.rei.transfer.too_small", width, height)); } } 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 e94630d46..9b3c966c9 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 @@ -25,10 +25,12 @@ 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; import me.shedaniel.rei.api.common.transfer.info.MenuInfo; import me.shedaniel.rei.api.common.transfer.info.MenuInfoContext; import me.shedaniel.rei.api.common.transfer.info.clean.InputCleanHandler; -import me.shedaniel.rei.api.common.transfer.info.stack.StackAccessor; +import me.shedaniel.rei.api.common.transfer.info.stack.SlotAccessor; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.item.ItemStack; @@ -37,19 +39,33 @@ import java.util.stream.Collectors; import java.util.stream.IntStream; /** - * A simple implementation of {@link MenuInfo} that provides {@link StackAccessor} by {@link Inventory} of the player. + * A simple implementation of {@link MenuInfo} that provides {@link SlotAccessor} by {@link Inventory} of the player. * <p> * Provides default implementation for {@link SimplePlayerInventoryMenuInfo#getInputCleanHandler()}, which dumps slots from - * {@link SimplePlayerInventoryMenuInfo#getInputStacks(MenuInfoContext)} to the {@link SimplePlayerInventoryMenuInfo#getDumpHandler()}. + * {@link SimplePlayerInventoryMenuInfo#getInputSlots(MenuInfoContext)} to the {@link SimplePlayerInventoryMenuInfo#getDumpHandler()}. * * @param <T> the type of the menu * @param <D> the type of display */ public interface SimplePlayerInventoryMenuInfo<T extends AbstractContainerMenu, D extends Display> extends MenuInfo<T, D> { + default RecipeFinderPopulator<T, D> getRecipeFinderPopulator() { + return (context, finder) -> { + for (SlotAccessor inventoryStack : getInventorySlots(context)) { + finder.addNormalItem(inventoryStack.getItemStack()); + } + populateRecipeFinder(context.getMenu(), finder); + }; + } + + /** + * Returns a simple {@link InputCleanHandler} that returns any stacks on the grid back to the player's inventory. + * + * @return a simple implementation of {@link InputCleanHandler} + */ default InputCleanHandler<T, D> getInputCleanHandler() { return context -> { T container = context.getMenu(); - for (StackAccessor gridStack : getInputStacks(context)) { + for (SlotAccessor gridStack : getInputSlots(context)) { InputCleanHandler.returnSlotsToPlayerInventory(context, getDumpHandler(), gridStack); } @@ -59,9 +75,9 @@ public interface SimplePlayerInventoryMenuInfo<T extends AbstractContainerMenu, default DumpHandler<T, D> getDumpHandler() { return (context, stackToDump) -> { - Iterable<StackAccessor> inventoryStacks = getInventoryStacks(context); + Iterable<SlotAccessor> inventoryStacks = getInventorySlots(context); - StackAccessor nextSlot = MoreObjects.firstNonNull( + SlotAccessor nextSlot = MoreObjects.firstNonNull( DumpHandler.getOccupiedSlotWithRoomForStack(stackToDump, inventoryStacks), DumpHandler.getEmptySlot(inventoryStacks) ); @@ -76,12 +92,20 @@ public interface SimplePlayerInventoryMenuInfo<T extends AbstractContainerMenu, }; } - default Iterable<StackAccessor> getInventoryStacks(MenuInfoContext<T, ?, D> context) { + default Iterable<SlotAccessor> getInventorySlots(MenuInfoContext<T, ?, D> context) { Inventory inventory = context.getPlayerEntity().getInventory(); return IntStream.range(0, inventory.items.size()) - .mapToObj(index -> StackAccessor.fromContainer(inventory, index)) + .mapToObj(index -> SlotAccessor.fromContainer(inventory, index)) .collect(Collectors.toList()); } + default void populateRecipeFinder(T menu, RecipeFinder 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, + * + * @param menu the menu to clean + */ default void clearInputSlots(T menu) {} } diff --git a/api/src/main/java/me/shedaniel/rei/api/common/transfer/info/stack/ContainerStackAccessor.java b/api/src/main/java/me/shedaniel/rei/api/common/transfer/info/stack/ContainerSlotAccessor.java index 90a6a937a..22570d47c 100644 --- a/api/src/main/java/me/shedaniel/rei/api/common/transfer/info/stack/ContainerStackAccessor.java +++ b/api/src/main/java/me/shedaniel/rei/api/common/transfer/info/stack/ContainerSlotAccessor.java @@ -27,13 +27,13 @@ import net.minecraft.world.Container; import net.minecraft.world.item.ItemStack; /** - * Simple implementation of {@link StackAccessor} that wraps around a slot in {@link Container}. + * Simple implementation of {@link SlotAccessor} that wraps around a slot in {@link Container}. */ -public class ContainerStackAccessor implements StackAccessor { +public class ContainerSlotAccessor implements SlotAccessor { protected Container container; protected int index; - public ContainerStackAccessor(Container container, int index) { + public ContainerSlotAccessor(Container container, int index) { this.container = container; this.index = index; } diff --git a/api/src/main/java/me/shedaniel/rei/api/common/transfer/info/stack/StackAccessor.java b/api/src/main/java/me/shedaniel/rei/api/common/transfer/info/stack/SlotAccessor.java index 767483bb3..2bb339219 100644 --- a/api/src/main/java/me/shedaniel/rei/api/common/transfer/info/stack/StackAccessor.java +++ b/api/src/main/java/me/shedaniel/rei/api/common/transfer/info/stack/SlotAccessor.java @@ -27,18 +27,21 @@ import net.minecraft.world.Container; import net.minecraft.world.inventory.Slot; import net.minecraft.world.item.ItemStack; -public interface StackAccessor { +/** + * A wrapper for accessing {@link Slot}, can be wrapped for non-vanilla {@link Slot} implementations. + */ +public interface SlotAccessor { ItemStack getItemStack(); void setItemStack(ItemStack stack); ItemStack takeStack(int amount); - static StackAccessor fromSlot(Slot slot) { - return new SlotStackAccessor(slot); + static SlotAccessor fromSlot(Slot slot) { + return new VanillaSlotAccessor(slot); } - static StackAccessor fromContainer(Container container, int index) { - return new ContainerStackAccessor(container, index); + static SlotAccessor fromContainer(Container container, int index) { + return new ContainerSlotAccessor(container, index); } } diff --git a/api/src/main/java/me/shedaniel/rei/api/common/transfer/info/stack/SlotStackAccessor.java b/api/src/main/java/me/shedaniel/rei/api/common/transfer/info/stack/VanillaSlotAccessor.java index 427f32fb5..f7208e92b 100644 --- a/api/src/main/java/me/shedaniel/rei/api/common/transfer/info/stack/SlotStackAccessor.java +++ b/api/src/main/java/me/shedaniel/rei/api/common/transfer/info/stack/VanillaSlotAccessor.java @@ -27,12 +27,12 @@ import net.minecraft.world.inventory.Slot; import net.minecraft.world.item.ItemStack; /** - * Simple implementation of {@link StackAccessor} that wraps around {@link Slot}. + * Simple implementation of {@link SlotAccessor} that wraps around {@link Slot}. */ -public class SlotStackAccessor implements StackAccessor { +public class VanillaSlotAccessor implements SlotAccessor { protected Slot slot; - public SlotStackAccessor(Slot slot) { + public VanillaSlotAccessor(Slot slot) { this.slot = slot; } |
