aboutsummaryrefslogtreecommitdiff
path: root/runtime/src/main/java/me/shedaniel/rei/plugin
diff options
context:
space:
mode:
authorshedaniel <daniel@shedaniel.me>2023-08-28 13:16:57 +0800
committershedaniel <daniel@shedaniel.me>2023-09-01 19:48:57 +0800
commit6a8bc6a8c34af1e3ff15fe8a802ef5ece3c417d2 (patch)
treea41c145c1273ab063c725bf44c1f39ca6e0bd5bd /runtime/src/main/java/me/shedaniel/rei/plugin
parentf8bea2079764219f68070be9ae45ffd8d517de5d (diff)
downloadRoughlyEnoughItems-6a8bc6a8c34af1e3ff15fe8a802ef5ece3c417d2.tar.gz
RoughlyEnoughItems-6a8bc6a8c34af1e3ff15fe8a802ef5ece3c417d2.tar.bz2
RoughlyEnoughItems-6a8bc6a8c34af1e3ff15fe8a802ef5ece3c417d2.zip
Reworked the transfer api
See https://www.craft.me/s/TVL01jO3OZarPE for the documentation of the new experimental simple transfer handle
Diffstat (limited to 'runtime/src/main/java/me/shedaniel/rei/plugin')
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/plugin/autocrafting/DefaultCategoryHandler.java19
-rw-r--r--runtime/src/main/java/me/shedaniel/rei/plugin/common/runtime/DefaultRuntimePlugin.java52
2 files changed, 65 insertions, 6 deletions
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<AbstractContainerMenu, Player, Display> menuInfoContext = ofContext(menu, display);
+ MenuInfo<AbstractContainerMenu, Display> 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<AbstractContainerMenu, Player, Display> menuInfoContext = ofContext(menu, display);
MenuInfo<AbstractContainerMenu, Display> 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;
+ }
+ });
+ }
}