From 6a8bc6a8c34af1e3ff15fe8a802ef5ece3c417d2 Mon Sep 17 00:00:00 2001 From: shedaniel Date: Mon, 28 Aug 2023 13:16:57 +0800 Subject: Reworked the transfer api See https://www.craft.me/s/TVL01jO3OZarPE for the documentation of the new experimental simple transfer handle --- .../autocrafting/DefaultCategoryHandler.java | 19 +++++--- .../common/runtime/DefaultRuntimePlugin.java | 52 ++++++++++++++++++++++ 2 files changed, 65 insertions(+), 6 deletions(-) (limited to 'runtime/src/main/java/me/shedaniel/rei/plugin') diff --git a/runtime/src/main/java/me/shedaniel/rei/plugin/autocrafting/DefaultCategoryHandler.java b/runtime/src/main/java/me/shedaniel/rei/plugin/autocrafting/DefaultCategoryHandler.java index 6924b9a28..426e19f57 100644 --- a/runtime/src/main/java/me/shedaniel/rei/plugin/autocrafting/DefaultCategoryHandler.java +++ b/runtime/src/main/java/me/shedaniel/rei/plugin/autocrafting/DefaultCategoryHandler.java @@ -55,22 +55,29 @@ import net.minecraft.world.item.ItemStack; import java.util.ArrayList; import java.util.List; +import java.util.Optional; @Environment(EnvType.CLIENT) public class DefaultCategoryHandler implements TransferHandler { + @Override + public ApplicabilityResult checkApplicable(Context context) { + Display display = context.getDisplay(); + AbstractContainerScreen containerScreen = context.getContainerScreen(); + if (containerScreen == null) return ApplicabilityResult.createNotApplicable(); + AbstractContainerMenu menu = context.getMenu(); + MenuInfoContext menuInfoContext = ofContext(menu, display); + MenuInfo menuInfo = MenuInfoRegistry.getInstance().getClient(display, menuInfoContext, menu); + if (menuInfo == null) return ApplicabilityResult.createNotApplicable(); + return ApplicabilityResult.createApplicable(); + } + @Override public Result handle(Context context) { Display display = context.getDisplay(); AbstractContainerScreen containerScreen = context.getContainerScreen(); - if (containerScreen == null) { - return Result.createNotApplicable(); - } AbstractContainerMenu menu = context.getMenu(); MenuInfoContext menuInfoContext = ofContext(menu, display); MenuInfo menuInfo = MenuInfoRegistry.getInstance().getClient(display, menuInfoContext, menu); - if (menuInfo == null) { - return Result.createNotApplicable(); - } try { menuInfo.validate(menuInfoContext); } catch (MenuTransferException e) { diff --git a/runtime/src/main/java/me/shedaniel/rei/plugin/common/runtime/DefaultRuntimePlugin.java b/runtime/src/main/java/me/shedaniel/rei/plugin/common/runtime/DefaultRuntimePlugin.java index 1fd0126d5..ca1e44846 100644 --- a/runtime/src/main/java/me/shedaniel/rei/plugin/common/runtime/DefaultRuntimePlugin.java +++ b/runtime/src/main/java/me/shedaniel/rei/plugin/common/runtime/DefaultRuntimePlugin.java @@ -30,10 +30,18 @@ import me.shedaniel.rei.api.common.entry.type.EntryTypeRegistry; import me.shedaniel.rei.api.common.entry.type.VanillaEntryTypes; import me.shedaniel.rei.api.common.fluid.FluidSupportProvider; import me.shedaniel.rei.api.common.plugins.REIServerPlugin; +import me.shedaniel.rei.api.common.transfer.info.stack.PlayerInventorySlotAccessor; +import me.shedaniel.rei.api.common.transfer.info.stack.SlotAccessor; +import me.shedaniel.rei.api.common.transfer.info.stack.SlotAccessorRegistry; +import me.shedaniel.rei.api.common.transfer.info.stack.VanillaSlotAccessor; import me.shedaniel.rei.plugin.client.entry.FluidEntryDefinition; import me.shedaniel.rei.plugin.client.entry.ItemEntryDefinition; +import net.minecraft.nbt.CompoundTag; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.AbstractContainerMenu; import org.jetbrains.annotations.ApiStatus; +import org.jetbrains.annotations.Nullable; import java.util.Optional; import java.util.stream.Stream; @@ -55,4 +63,48 @@ public class DefaultRuntimePlugin implements REIServerPlugin { return CompoundEventResult.interruptTrue(stream.get()); }); } + + @Override + public void registerSlotAccessors(SlotAccessorRegistry registry) { + registry.register(new ResourceLocation("roughlyenoughitems", "vanilla"), + slotAccessor -> slotAccessor instanceof VanillaSlotAccessor, + new SlotAccessorRegistry.Serializer() { + @Override + public SlotAccessor read(AbstractContainerMenu menu, Player player, CompoundTag tag) { + int slot = tag.getInt("Slot"); + return new VanillaSlotAccessor(menu.slots.get(slot)); + } + + @Override + @Nullable + public CompoundTag save(AbstractContainerMenu menu, Player player, SlotAccessor accessor) { + if (!(accessor instanceof VanillaSlotAccessor)) { + throw new IllegalArgumentException("Cannot save non-vanilla slot accessor!"); + } + CompoundTag tag = new CompoundTag(); + tag.putInt("Slot", ((VanillaSlotAccessor) accessor).getSlot().index); + return tag; + } + }); + registry.register(new ResourceLocation("roughlyenoughitems", "player"), + slotAccessor -> slotAccessor instanceof PlayerInventorySlotAccessor, + new SlotAccessorRegistry.Serializer() { + @Override + public SlotAccessor read(AbstractContainerMenu menu, Player player, CompoundTag tag) { + int slot = tag.getInt("Slot"); + return new PlayerInventorySlotAccessor(player, slot); + } + + @Override + @Nullable + public CompoundTag save(AbstractContainerMenu menu, Player player, SlotAccessor accessor) { + if (!(accessor instanceof PlayerInventorySlotAccessor)) { + throw new IllegalArgumentException("Cannot save non-player slot accessor!"); + } + CompoundTag tag = new CompoundTag(); + tag.putInt("Slot", ((PlayerInventorySlotAccessor) accessor).getIndex()); + return tag; + } + }); + } } -- cgit