From 9af1aa1ecf66b3726a757eecde51cb95ab364f26 Mon Sep 17 00:00:00 2001 From: Jonathan Coates Date: Mon, 25 Mar 2024 08:59:08 +0000 Subject: [PATCH] Fallback to the current side when getting item cap Fixes #1764 --- .../generic/methods/InventoryMethods.java | 13 +++++++++---- .../computercraft/shared/util/CapabilityUtil.java | 4 ++-- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/projects/forge/src/main/java/dan200/computercraft/shared/peripheral/generic/methods/InventoryMethods.java b/projects/forge/src/main/java/dan200/computercraft/shared/peripheral/generic/methods/InventoryMethods.java index 49ab64b2d..09cec73f1 100644 --- a/projects/forge/src/main/java/dan200/computercraft/shared/peripheral/generic/methods/InventoryMethods.java +++ b/projects/forge/src/main/java/dan200/computercraft/shared/peripheral/generic/methods/InventoryMethods.java @@ -8,7 +8,9 @@ import dan200.computercraft.api.lua.LuaException; import dan200.computercraft.api.lua.LuaFunction; import dan200.computercraft.api.peripheral.IComputerAccess; +import dan200.computercraft.api.peripheral.IPeripheral; import dan200.computercraft.shared.platform.ForgeContainerTransfer; +import dan200.computercraft.shared.util.CapabilityUtil; import net.minecraft.world.Container; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraftforge.common.capabilities.ForgeCapabilities; @@ -73,7 +75,7 @@ public int pushItems( var location = computer.getAvailablePeripheral(toName); if (location == null) throw new LuaException("Target '" + toName + "' does not exist"); - var to = extractHandler(location.getTarget()); + var to = extractHandler(location); if (to == null) throw new LuaException("Target '" + toName + "' is not an inventory"); // Validate slots @@ -95,7 +97,7 @@ public int pullItems( var location = computer.getAvailablePeripheral(fromName); if (location == null) throw new LuaException("Source '" + fromName + "' does not exist"); - var from = extractHandler(location.getTarget()); + var from = extractHandler(location); if (from == null) throw new LuaException("Source '" + fromName + "' is not an inventory"); // Validate slots @@ -108,11 +110,14 @@ public int pullItems( } @Nullable - private static IItemHandler extractHandler(@Nullable Object object) { + private static IItemHandler extractHandler(IPeripheral peripheral) { + var object = peripheral.getTarget(); + var direction = peripheral instanceof dan200.computercraft.shared.peripheral.generic.GenericPeripheral sided ? sided.side() : null; + if (object instanceof BlockEntity blockEntity && blockEntity.isRemoved()) return null; if (object instanceof ICapabilityProvider provider) { - var cap = provider.getCapability(ForgeCapabilities.ITEM_HANDLER); + var cap = CapabilityUtil.getCapability(provider, ForgeCapabilities.ITEM_HANDLER, direction); if (cap.isPresent()) return cap.orElseThrow(NullPointerException::new); } diff --git a/projects/forge/src/main/java/dan200/computercraft/shared/util/CapabilityUtil.java b/projects/forge/src/main/java/dan200/computercraft/shared/util/CapabilityUtil.java index c1e1dddf8..8e4b9c204 100644 --- a/projects/forge/src/main/java/dan200/computercraft/shared/util/CapabilityUtil.java +++ b/projects/forge/src/main/java/dan200/computercraft/shared/util/CapabilityUtil.java @@ -50,8 +50,8 @@ public static T unwrap(LazyOptional p, InvalidateCallback invalidate) { * @param The type of the underlying capability. * @return The extracted capability, if present. */ - public static LazyOptional getCapability(ICapabilityProvider provider, Capability capability, Direction side) { + public static LazyOptional getCapability(ICapabilityProvider provider, Capability capability, @Nullable Direction side) { var cap = provider.getCapability(capability); - return cap.isPresent() ? cap : provider.getCapability(capability, side); + return !cap.isPresent() && side != null ? provider.getCapability(capability, side) : cap; } }