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 49ab64b2d0..09cec73f1c 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 c1e1dddf8f..8e4b9c2046 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; } }