diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeConstructor.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeConstructor.java index fe369d4fb..95b1ff00d 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeConstructor.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeConstructor.java @@ -44,6 +44,7 @@ import net.minecraftforge.event.world.BlockEvent; import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.items.IItemHandler; +import net.minecraftforge.items.IItemHandlerModifiable; import net.minecraftforge.items.wrapper.CombinedInvWrapper; import javax.annotation.Nullable; @@ -374,7 +375,7 @@ public class NetworkNodeConstructor extends NetworkNode implements IComparable, } @Override - public IItemHandler getItemFilters() { + public IItemHandlerModifiable getItemFilters() { return itemFilters; } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeDestructor.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeDestructor.java index 95838aa4f..0b1a27fe7 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeDestructor.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeDestructor.java @@ -46,6 +46,7 @@ import net.minecraftforge.fluids.capability.IFluidHandler; import net.minecraftforge.fluids.capability.wrappers.BlockLiquidWrapper; import net.minecraftforge.fluids.capability.wrappers.FluidBlockWrapper; import net.minecraftforge.items.IItemHandler; +import net.minecraftforge.items.IItemHandlerModifiable; import net.minecraftforge.items.wrapper.CombinedInvWrapper; import javax.annotation.Nullable; @@ -318,7 +319,7 @@ public class NetworkNodeDestructor extends NetworkNode implements IComparable, I } @Override - public IItemHandler getItemFilters() { + public IItemHandlerModifiable getItemFilters() { return itemFilters; } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeDetector.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeDetector.java index df5409392..74b670df1 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeDetector.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeDetector.java @@ -19,6 +19,7 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.world.World; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.items.IItemHandler; +import net.minecraftforge.items.IItemHandlerModifiable; public class NetworkNodeDetector extends NetworkNode implements IComparable, IType { public static final String ID = "detector"; @@ -230,7 +231,7 @@ public class NetworkNodeDetector extends NetworkNode implements IComparable, ITy } @Override - public IItemHandler getItemFilters() { + public IItemHandlerModifiable getItemFilters() { return itemFilters; } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeExporter.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeExporter.java index 0eca3a0d4..1836b1acc 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeExporter.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeExporter.java @@ -24,6 +24,7 @@ import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.capability.IFluidHandler; import net.minecraftforge.items.IItemHandler; +import net.minecraftforge.items.IItemHandlerModifiable; import net.minecraftforge.items.ItemHandlerHelper; import net.minecraftforge.items.wrapper.CombinedInvWrapper; @@ -246,7 +247,7 @@ public class NetworkNodeExporter extends NetworkNode implements IComparable, ITy } @Override - public IItemHandler getItemFilters() { + public IItemHandlerModifiable getItemFilters() { return itemFilters; } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeExternalStorage.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeExternalStorage.java index 574068cca..91b3252c0 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeExternalStorage.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeExternalStorage.java @@ -32,6 +32,7 @@ import net.minecraft.world.World; import net.minecraftforge.common.util.Constants; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.items.IItemHandler; +import net.minecraftforge.items.IItemHandlerModifiable; import javax.annotation.Nullable; import java.util.List; @@ -346,7 +347,7 @@ public class NetworkNodeExternalStorage extends NetworkNode implements IStorageP } @Override - public IItemHandler getItemFilters() { + public IItemHandlerModifiable getItemFilters() { return itemFilters; } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeGrid.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeGrid.java index 0a9ef8fca..15c2d1d29 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeGrid.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeGrid.java @@ -690,7 +690,7 @@ public class NetworkNodeGrid extends NetworkNode implements IGridNetworkAware, I } @Override - public IItemHandler getItemFilters() { + public IItemHandlerModifiable getItemFilters() { return processingMatrix; } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeImporter.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeImporter.java index 289659388..8ce19d8e6 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeImporter.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeImporter.java @@ -28,6 +28,7 @@ import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.capability.IFluidHandler; import net.minecraftforge.items.IItemHandler; +import net.minecraftforge.items.IItemHandlerModifiable; import net.minecraftforge.items.wrapper.CombinedInvWrapper; import javax.annotation.Nullable; @@ -246,7 +247,7 @@ public class NetworkNodeImporter extends NetworkNode implements IComparable, IFi } @Override - public IItemHandler getItemFilters() { + public IItemHandlerModifiable getItemFilters() { return itemFilters; } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/diskdrive/NetworkNodeDiskDrive.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/diskdrive/NetworkNodeDiskDrive.java index 8146b0a4f..56bc6a078 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/diskdrive/NetworkNodeDiskDrive.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/diskdrive/NetworkNodeDiskDrive.java @@ -32,6 +32,7 @@ import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fml.common.FMLCommonHandler; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.items.IItemHandler; +import net.minecraftforge.items.IItemHandlerModifiable; import java.util.List; import java.util.function.Predicate; @@ -363,7 +364,7 @@ public class NetworkNodeDiskDrive extends NetworkNode implements IGuiStorage, IS } @Override - public IItemHandler getItemFilters() { + public IItemHandlerModifiable getItemFilters() { return itemFilters; } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/diskdrive/StorageDiskFluidDriveWrapper.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/diskdrive/StorageDiskFluidDriveWrapper.java index f19fa10c1..23aee6ce3 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/diskdrive/StorageDiskFluidDriveWrapper.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/diskdrive/StorageDiskFluidDriveWrapper.java @@ -19,7 +19,6 @@ public class StorageDiskFluidDriveWrapper implements IStorageDisk { private NetworkNodeDiskDrive diskDrive; private IStorageDisk parent; private int lastState; - private int ticksSinceLastChanged; public StorageDiskFluidDriveWrapper(NetworkNodeDiskDrive diskDrive, IStorageDisk parent) { this.diskDrive = diskDrive; diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/diskmanipulator/NetworkNodeDiskManipulator.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/diskmanipulator/NetworkNodeDiskManipulator.java index b990fb6c2..e889d1761 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/diskmanipulator/NetworkNodeDiskManipulator.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/diskmanipulator/NetworkNodeDiskManipulator.java @@ -31,6 +31,7 @@ import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fml.common.FMLCommonHandler; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.items.IItemHandler; +import net.minecraftforge.items.IItemHandlerModifiable; import net.minecraftforge.items.wrapper.CombinedInvWrapper; import java.util.ArrayList; @@ -407,7 +408,7 @@ public class NetworkNodeDiskManipulator extends NetworkNode implements IComparab } @Override - public IItemHandler getItemFilters() { + public IItemHandlerModifiable getItemFilters() { return itemFilters; } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerBase.java b/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerBase.java index 27e4b15a9..e7b085a56 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerBase.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerBase.java @@ -7,11 +7,10 @@ import com.raoulvdberge.refinedstorage.container.slot.filter.SlotFilter; import com.raoulvdberge.refinedstorage.container.slot.filter.SlotFilterFluid; import com.raoulvdberge.refinedstorage.container.slot.legacy.SlotLegacyDisabled; import com.raoulvdberge.refinedstorage.container.slot.legacy.SlotLegacyFilter; -import com.raoulvdberge.refinedstorage.inventory.fluid.FluidInventory; +import com.raoulvdberge.refinedstorage.container.transfer.TransferManager; import com.raoulvdberge.refinedstorage.network.MessageSlotFilterFluidUpdate; import com.raoulvdberge.refinedstorage.tile.TileBase; import com.raoulvdberge.refinedstorage.tile.data.TileDataWatcher; -import com.raoulvdberge.refinedstorage.util.StackUtils; import invtweaks.api.container.InventoryContainer; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; @@ -20,7 +19,6 @@ import net.minecraft.inventory.Container; import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; import net.minecraftforge.fluids.FluidStack; -import net.minecraftforge.items.ItemHandlerHelper; import javax.annotation.Nullable; import java.util.ArrayList; @@ -34,6 +32,8 @@ public abstract class ContainerBase extends Container { private TileDataWatcher listener; private EntityPlayer player; + protected TransferManager transferManager = new TransferManager(this); + private List fluidSlots = new ArrayList<>(); private List fluids = new ArrayList<>(); @@ -139,54 +139,7 @@ public abstract class ContainerBase extends Container { @Override public ItemStack transferStackInSlot(EntityPlayer player, int slotIndex) { - return ItemStack.EMPTY; - } - - protected ItemStack transferToFilters(ItemStack stack, int begin, int end) { - for (int i = begin; i < end; ++i) { - if (API.instance().getComparer().isEqualNoQuantity(getSlot(i).getStack(), stack)) { - return ItemStack.EMPTY; - } - } - - for (int i = begin; i < end; ++i) { - Slot slot = getSlot(i); - - if (slot.getStack().isEmpty() && slot.isItemValid(stack)) { - slot.putStack(ItemHandlerHelper.copyStackWithSize(stack, 1)); - slot.onSlotChanged(); - - return ItemStack.EMPTY; - } - } - - return ItemStack.EMPTY; - } - - protected ItemStack transferToFluidFilters(ItemStack stack) { - FluidStack fluidInContainer = StackUtils.getFluid(stack, true).getValue(); - - if (fluidInContainer == null) { - return ItemStack.EMPTY; - } - - for (SlotFilterFluid slot : fluidSlots) { - if (API.instance().getComparer().isEqual(fluidInContainer, slot.getFluidInventory().getFluid(slot.getSlotIndex()), IComparer.COMPARE_NBT)) { - return ItemStack.EMPTY; - } - } - - for (SlotFilterFluid slot : fluidSlots) { - FluidInventory inventory = slot.getFluidInventory(); - - if (inventory.getFluid(slot.getSlotIndex()) == null) { - slot.onContainerClicked(stack); - - return ItemStack.EMPTY; - } - } - - return ItemStack.EMPTY; + return transferManager.transfer(slotIndex); } @Override diff --git a/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerConstructor.java b/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerConstructor.java index d0418119d..fde4b9649 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerConstructor.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerConstructor.java @@ -6,8 +6,6 @@ import com.raoulvdberge.refinedstorage.container.slot.filter.SlotFilterFluid; import com.raoulvdberge.refinedstorage.tile.TileConstructor; import com.raoulvdberge.refinedstorage.tile.config.IType; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.inventory.Slot; -import net.minecraft.item.ItemStack; import net.minecraftforge.items.SlotItemHandler; public class ContainerConstructor extends ContainerBase { @@ -26,36 +24,8 @@ public class ContainerConstructor extends ContainerBase { addSlotToContainer(new SlotFilterFluid(constructor.getNode().getFluidFilters(), 0, 80, 20, 0).setEnableHandler(() -> constructor.getNode().getType() == IType.FLUIDS)); addPlayerInventory(8, 55); - } - @Override - public ItemStack transferStackInSlot(EntityPlayer player, int index) { - ItemStack stack = ItemStack.EMPTY; - - Slot slot = getSlot(index); - - if (slot.getHasStack()) { - stack = slot.getStack(); - - if (index < 4) { - if (!mergeItemStack(stack, 4, inventorySlots.size(), false)) { - return ItemStack.EMPTY; - } - } else if (!mergeItemStack(stack, 0, 4, false)) { - if (constructor.getType() == IType.ITEMS) { - return transferToFilters(stack, 4, 4 + 1); - } else { - return transferToFluidFilters(stack); - } - } - - if (stack.getCount() == 0) { - slot.putStack(ItemStack.EMPTY); - } else { - slot.onSlotChanged(); - } - } - - return stack; + transferManager.addBiTransfer(player.inventory, constructor.getNode().getUpgrades()); + transferManager.addFilterTransfer(player.inventory, constructor.getNode().getItemFilters(), constructor.getNode().getFluidFilters(), constructor.getNode()::getType); } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerCrafter.java b/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerCrafter.java index 144f3aa44..6d152d0fc 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerCrafter.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerCrafter.java @@ -2,8 +2,6 @@ package com.raoulvdberge.refinedstorage.container; import com.raoulvdberge.refinedstorage.tile.TileCrafter; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.inventory.Slot; -import net.minecraft.item.ItemStack; import net.minecraftforge.items.SlotItemHandler; public class ContainerCrafter extends ContainerBase { @@ -19,32 +17,8 @@ public class ContainerCrafter extends ContainerBase { } addPlayerInventory(8, 55); - } - @Override - public ItemStack transferStackInSlot(EntityPlayer player, int index) { - ItemStack stack = ItemStack.EMPTY; - - Slot slot = getSlot(index); - - if (slot.getHasStack()) { - stack = slot.getStack(); - - if (index < 9 + 4) { - if (!mergeItemStack(stack, 9 + 4, inventorySlots.size(), false)) { - return ItemStack.EMPTY; - } - } else if (!mergeItemStack(stack, 0, 9 + 4, false)) { - return ItemStack.EMPTY; - } - - if (stack.getCount() == 0) { - slot.putStack(ItemStack.EMPTY); - } else { - slot.onSlotChanged(); - } - } - - return stack; + transferManager.addBiTransfer(player.inventory, crafter.getNode().getUpgrades()); + transferManager.addBiTransfer(player.inventory, crafter.getNode().getPatternItems()); } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerDestructor.java b/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerDestructor.java index 01033d1f7..23dd34fcb 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerDestructor.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerDestructor.java @@ -1,23 +1,16 @@ package com.raoulvdberge.refinedstorage.container; -import com.raoulvdberge.refinedstorage.apiimpl.network.node.NetworkNodeDestructor; import com.raoulvdberge.refinedstorage.container.slot.filter.SlotFilter; import com.raoulvdberge.refinedstorage.container.slot.filter.SlotFilterFluid; import com.raoulvdberge.refinedstorage.tile.TileDestructor; import com.raoulvdberge.refinedstorage.tile.config.IType; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.inventory.Slot; -import net.minecraft.item.ItemStack; import net.minecraftforge.items.SlotItemHandler; public class ContainerDestructor extends ContainerBase { - private NetworkNodeDestructor destructor; - public ContainerDestructor(TileDestructor destructor, EntityPlayer player) { super(destructor, player); - this.destructor = destructor.getNode(); - for (int i = 0; i < 4; ++i) { addSlotToContainer(new SlotItemHandler(destructor.getNode().getUpgrades(), i, 187, 6 + (i * 18))); } @@ -31,36 +24,8 @@ public class ContainerDestructor extends ContainerBase { } addPlayerInventory(8, 55); - } - @Override - public ItemStack transferStackInSlot(EntityPlayer player, int index) { - ItemStack stack = ItemStack.EMPTY; - - Slot slot = getSlot(index); - - if (slot.getHasStack()) { - stack = slot.getStack(); - - if (index < 4) { - if (!mergeItemStack(stack, 4 + 9 + 9, inventorySlots.size(), false)) { - return ItemStack.EMPTY; - } - } else if (!mergeItemStack(stack, 0, 4, false)) { - if (destructor.getType() == IType.ITEMS) { - return transferToFilters(stack, 4, 4 + 9); - } else { - return transferToFluidFilters(stack); - } - } - - if (stack.getCount() == 0) { - slot.putStack(ItemStack.EMPTY); - } else { - slot.onSlotChanged(); - } - } - - return stack; + transferManager.addBiTransfer(player.inventory, destructor.getNode().getUpgrades()); + transferManager.addFilterTransfer(player.inventory, destructor.getNode().getItemFilters(), destructor.getNode().getFluidFilters(), destructor.getNode()::getType); } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerDetector.java b/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerDetector.java index 09563ae7a..c26707695 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerDetector.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerDetector.java @@ -1,42 +1,20 @@ package com.raoulvdberge.refinedstorage.container; -import com.raoulvdberge.refinedstorage.apiimpl.network.node.NetworkNodeDetector; import com.raoulvdberge.refinedstorage.container.slot.filter.SlotFilter; import com.raoulvdberge.refinedstorage.container.slot.filter.SlotFilterFluid; import com.raoulvdberge.refinedstorage.tile.TileDetector; import com.raoulvdberge.refinedstorage.tile.config.IType; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.inventory.Slot; -import net.minecraft.item.ItemStack; public class ContainerDetector extends ContainerBase { - private NetworkNodeDetector detector; - public ContainerDetector(TileDetector detector, EntityPlayer player) { super(detector, player); - this.detector = detector.getNode(); - addSlotToContainer(new SlotFilter(detector.getNode().getItemFilters(), 0, 107, 20).setEnableHandler(() -> detector.getNode().getType() == IType.ITEMS)); addSlotToContainer(new SlotFilterFluid(detector.getNode().getFluidFilters(), 0, 107, 20).setEnableHandler(() -> detector.getNode().getType() == IType.FLUIDS)); addPlayerInventory(8, 55); - } - @Override - public ItemStack transferStackInSlot(EntityPlayer player, int index) { - Slot slot = getSlot(index); - - ItemStack stack = slot.getStack(); - - if (slot.getHasStack() && index > 0) { - if (detector.getType() == IType.ITEMS) { - return transferToFilters(stack, 0, 1); - } else { - return transferToFluidFilters(stack); - } - } - - return ItemStack.EMPTY; + transferManager.addFilterTransfer(player.inventory, detector.getNode().getItemFilters(), detector.getNode().getFluidFilters(), detector.getNode()::getType); } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerDiskDrive.java b/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerDiskDrive.java index c75a75c56..297013dba 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerDiskDrive.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerDiskDrive.java @@ -1,23 +1,16 @@ package com.raoulvdberge.refinedstorage.container; -import com.raoulvdberge.refinedstorage.apiimpl.network.node.diskdrive.NetworkNodeDiskDrive; import com.raoulvdberge.refinedstorage.container.slot.filter.SlotFilter; import com.raoulvdberge.refinedstorage.container.slot.filter.SlotFilterFluid; import com.raoulvdberge.refinedstorage.tile.TileDiskDrive; import com.raoulvdberge.refinedstorage.tile.config.IType; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.inventory.Slot; -import net.minecraft.item.ItemStack; import net.minecraftforge.items.SlotItemHandler; public class ContainerDiskDrive extends ContainerBase { - private NetworkNodeDiskDrive diskDrive; - public ContainerDiskDrive(TileDiskDrive diskDrive, EntityPlayer player) { super(diskDrive, player); - this.diskDrive = diskDrive.getNode(); - int x = 80; int y = 54; @@ -34,36 +27,8 @@ public class ContainerDiskDrive extends ContainerBase { } addPlayerInventory(8, 141); - } - @Override - public ItemStack transferStackInSlot(EntityPlayer player, int index) { - ItemStack stack = ItemStack.EMPTY; - - Slot slot = getSlot(index); - - if (slot.getHasStack()) { - stack = slot.getStack(); - - if (index < 8) { - if (!mergeItemStack(stack, 8 + 9 + 9, inventorySlots.size(), false)) { - return ItemStack.EMPTY; - } - } else if (!mergeItemStack(stack, 0, 8, false)) { - if (diskDrive.getType() == IType.ITEMS) { - return transferToFilters(stack, 8, 8 + 9); - } else { - return transferToFluidFilters(stack); - } - } - - if (stack.getCount() == 0) { - slot.putStack(ItemStack.EMPTY); - } else { - slot.onSlotChanged(); - } - } - - return stack; + transferManager.addBiTransfer(player.inventory, diskDrive.getNode().getDisks()); + transferManager.addFilterTransfer(player.inventory, diskDrive.getNode().getItemFilters(), diskDrive.getNode().getFluidFilters(), diskDrive.getNode()::getType); } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerDiskManipulator.java b/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerDiskManipulator.java index 13266b023..53fd4085c 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerDiskManipulator.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerDiskManipulator.java @@ -1,23 +1,16 @@ package com.raoulvdberge.refinedstorage.container; -import com.raoulvdberge.refinedstorage.apiimpl.network.node.diskmanipulator.NetworkNodeDiskManipulator; import com.raoulvdberge.refinedstorage.container.slot.filter.SlotFilter; import com.raoulvdberge.refinedstorage.container.slot.filter.SlotFilterFluid; import com.raoulvdberge.refinedstorage.tile.TileDiskManipulator; import com.raoulvdberge.refinedstorage.tile.config.IType; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.inventory.Slot; -import net.minecraft.item.ItemStack; import net.minecraftforge.items.SlotItemHandler; public class ContainerDiskManipulator extends ContainerBase { - private NetworkNodeDiskManipulator diskManipulator; - public ContainerDiskManipulator(TileDiskManipulator diskManipulator, EntityPlayer player) { super(diskManipulator, player); - this.diskManipulator = diskManipulator.getNode(); - for (int i = 0; i < 4; ++i) { addSlotToContainer(new SlotItemHandler(diskManipulator.getNode().getUpgrades(), i, 187, 6 + (i * 18))); } @@ -39,36 +32,10 @@ public class ContainerDiskManipulator extends ContainerBase { } addPlayerInventory(8, 129); - } - @Override - public ItemStack transferStackInSlot(EntityPlayer player, int index) { - ItemStack stack = ItemStack.EMPTY; - - Slot slot = getSlot(index); - - if (slot.getHasStack()) { - stack = slot.getStack(); - - if (index < 4 + 3 + 3) { - if (!mergeItemStack(stack, 4 + 3 + 3 + 9 + 9, inventorySlots.size(), false)) { - return ItemStack.EMPTY; - } - } else if (!mergeItemStack(stack, 0, 4 + 3, false)) { - if (diskManipulator.getType() == IType.ITEMS) { - return transferToFilters(stack, 4 + 3 + 3, 4 + 3 + 3 + 9); - } else { - return transferToFluidFilters(stack); - } - } - - if (stack.getCount() == 0) { - slot.putStack(ItemStack.EMPTY); - } else { - slot.onSlotChanged(); - } - } - - return stack; + transferManager.addBiTransfer(player.inventory, diskManipulator.getNode().getUpgrades()); + transferManager.addBiTransfer(player.inventory, diskManipulator.getNode().getInputDisks()); + transferManager.addTransfer(diskManipulator.getNode().getOutputDisks(), player.inventory); + transferManager.addFilterTransfer(player.inventory, diskManipulator.getNode().getItemFilters(), diskManipulator.getNode().getFluidFilters(), diskManipulator.getNode()::getType); } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerExporter.java b/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerExporter.java index f26166604..d130dd427 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerExporter.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerExporter.java @@ -1,23 +1,16 @@ package com.raoulvdberge.refinedstorage.container; -import com.raoulvdberge.refinedstorage.apiimpl.network.node.NetworkNodeExporter; import com.raoulvdberge.refinedstorage.container.slot.filter.SlotFilter; import com.raoulvdberge.refinedstorage.container.slot.filter.SlotFilterFluid; import com.raoulvdberge.refinedstorage.tile.TileExporter; import com.raoulvdberge.refinedstorage.tile.config.IType; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.inventory.Slot; -import net.minecraft.item.ItemStack; import net.minecraftforge.items.SlotItemHandler; public class ContainerExporter extends ContainerBase { - private NetworkNodeExporter exporter; - public ContainerExporter(TileExporter exporter, EntityPlayer player) { super(exporter, player); - this.exporter = exporter.getNode(); - for (int i = 0; i < 4; ++i) { addSlotToContainer(new SlotItemHandler(exporter.getNode().getUpgrades(), i, 187, 6 + (i * 18))); } @@ -31,36 +24,8 @@ public class ContainerExporter extends ContainerBase { } addPlayerInventory(8, 55); - } - @Override - public ItemStack transferStackInSlot(EntityPlayer player, int index) { - ItemStack stack = ItemStack.EMPTY; - - Slot slot = getSlot(index); - - if (slot.getHasStack()) { - stack = slot.getStack(); - - if (index < 4) { - if (!mergeItemStack(stack, 4 + 9 + 9, inventorySlots.size(), false)) { - return ItemStack.EMPTY; - } - } else if (!mergeItemStack(stack, 0, 4, false)) { - if (exporter.getType() == IType.ITEMS) { - return transferToFilters(stack, 4, 4 + 9); - } else { - return transferToFluidFilters(stack); - } - } - - if (stack.getCount() == 0) { - slot.putStack(ItemStack.EMPTY); - } else { - slot.onSlotChanged(); - } - } - - return stack; + transferManager.addBiTransfer(player.inventory, exporter.getNode().getUpgrades()); + transferManager.addFilterTransfer(player.inventory, exporter.getNode().getItemFilters(), exporter.getNode().getFluidFilters(), exporter.getNode()::getType); } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerExternalStorage.java b/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerExternalStorage.java index eb362acfc..3de954b5a 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerExternalStorage.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerExternalStorage.java @@ -1,22 +1,15 @@ package com.raoulvdberge.refinedstorage.container; -import com.raoulvdberge.refinedstorage.apiimpl.network.node.NetworkNodeExternalStorage; import com.raoulvdberge.refinedstorage.container.slot.filter.SlotFilter; import com.raoulvdberge.refinedstorage.container.slot.filter.SlotFilterFluid; import com.raoulvdberge.refinedstorage.tile.TileExternalStorage; import com.raoulvdberge.refinedstorage.tile.config.IType; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.inventory.Slot; -import net.minecraft.item.ItemStack; public class ContainerExternalStorage extends ContainerBase { - private NetworkNodeExternalStorage externalStorage; - public ContainerExternalStorage(TileExternalStorage externalStorage, EntityPlayer player) { super(externalStorage, player); - this.externalStorage = externalStorage.getNode(); - for (int i = 0; i < 9; ++i) { addSlotToContainer(new SlotFilter(externalStorage.getNode().getItemFilters(), i, 8 + (18 * i), 20).setEnableHandler(() -> externalStorage.getNode().getType() == IType.ITEMS)); } @@ -26,20 +19,7 @@ public class ContainerExternalStorage extends ContainerBase { } addPlayerInventory(8, 141); - } - @Override - public ItemStack transferStackInSlot(EntityPlayer player, int index) { - Slot slot = getSlot(index); - - if (slot.getHasStack() && index > 8) { - if (externalStorage.getType() == IType.ITEMS) { - return transferToFilters(slot.getStack(), 0, 9); - } else { - return transferToFluidFilters(slot.getStack()); - } - } - - return ItemStack.EMPTY; + transferManager.addFilterTransfer(player.inventory, externalStorage.getNode().getItemFilters(), externalStorage.getNode().getFluidFilters(), externalStorage.getNode()::getType); } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerFilter.java b/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerFilter.java index 9241447dd..ee9498934 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerFilter.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerFilter.java @@ -4,7 +4,6 @@ import com.raoulvdberge.refinedstorage.container.slot.filter.SlotFilter; import com.raoulvdberge.refinedstorage.inventory.item.ItemHandlerFilterIcon; import com.raoulvdberge.refinedstorage.inventory.item.ItemHandlerFilterItems; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; public class ContainerFilter extends ContainerBase { @@ -34,31 +33,14 @@ public class ContainerFilter extends ContainerBase { addSlotToContainer(new SlotFilter(new ItemHandlerFilterIcon(stack), 0, 8, 117)); addPlayerInventory(8, 149); + + transferManager.addItemFilterTransfer(player.inventory, filter); } public ItemStack getStack() { return stack; } - @Override - public ItemStack transferStackInSlot(EntityPlayer player, int index) { - ItemStack stack = ItemStack.EMPTY; - - Slot slot = getSlot(index); - - if (slot.getHasStack()) { - stack = slot.getStack(); - - if (index > 27 - 1) { - return transferToFilters(stack, 0, 27); - } - - return ItemStack.EMPTY; - } - - return stack; - } - @Override protected boolean isHeldItemDisabled() { return true; diff --git a/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerFluidInterface.java b/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerFluidInterface.java index be5197f47..dc98b8733 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerFluidInterface.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerFluidInterface.java @@ -4,8 +4,6 @@ import com.raoulvdberge.refinedstorage.container.slot.filter.SlotFilter; import com.raoulvdberge.refinedstorage.container.slot.filter.SlotFilterFluid; import com.raoulvdberge.refinedstorage.tile.TileFluidInterface; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.inventory.Slot; -import net.minecraft.item.ItemStack; import net.minecraftforge.items.SlotItemHandler; public class ContainerFluidInterface extends ContainerBase { @@ -20,32 +18,8 @@ public class ContainerFluidInterface extends ContainerBase { addSlotToContainer(new SlotFilterFluid(fluidInterface.getNode().getOut(), 0, 116, 32, SlotFilter.FILTER_ALLOW_SIZE)); addPlayerInventory(8, 122); - } - @Override - public ItemStack transferStackInSlot(EntityPlayer player, int index) { - ItemStack stack = ItemStack.EMPTY; - - Slot slot = getSlot(index); - - if (slot.getHasStack()) { - stack = slot.getStack(); - - if (index < 4 + 1 + 1) { - if (!mergeItemStack(stack, 4 + 1 + 1, inventorySlots.size(), false)) { - return ItemStack.EMPTY; - } - } else if (!mergeItemStack(stack, 0, 4 + 1, false)) { - return transferToFluidFilters(stack); - } - - if (stack.getCount() == 0) { - slot.putStack(ItemStack.EMPTY); - } else { - slot.onSlotChanged(); - } - } - - return stack; + transferManager.addBiTransfer(player.inventory, fluidInterface.getNode().getIn()); + transferManager.addFluidFilterTransfer(player.inventory, fluidInterface.getNode().getOut()); } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerFluidStorage.java b/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerFluidStorage.java index 8916a2a47..deba07971 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerFluidStorage.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerFluidStorage.java @@ -3,8 +3,6 @@ package com.raoulvdberge.refinedstorage.container; import com.raoulvdberge.refinedstorage.container.slot.filter.SlotFilterFluid; import com.raoulvdberge.refinedstorage.tile.TileFluidStorage; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.inventory.Slot; -import net.minecraft.item.ItemStack; public class ContainerFluidStorage extends ContainerBase { public ContainerFluidStorage(TileFluidStorage fluidStorage, EntityPlayer player) { @@ -15,16 +13,7 @@ public class ContainerFluidStorage extends ContainerBase { } addPlayerInventory(8, 141); - } - @Override - public ItemStack transferStackInSlot(EntityPlayer player, int index) { - Slot slot = getSlot(index); - - if (slot.getHasStack() && index > 8) { - return transferToFluidFilters(slot.getStack()); - } - - return ItemStack.EMPTY; + transferManager.addFluidFilterTransfer(player.inventory, fluidStorage.getNode().getFilters()); } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerGrid.java b/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerGrid.java index 13126ff09..95f551e07 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerGrid.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerGrid.java @@ -1,6 +1,5 @@ package com.raoulvdberge.refinedstorage.container; -import com.raoulvdberge.refinedstorage.RSItems; import com.raoulvdberge.refinedstorage.api.network.grid.GridType; import com.raoulvdberge.refinedstorage.api.network.grid.IGrid; import com.raoulvdberge.refinedstorage.api.network.grid.IGridTab; @@ -8,7 +7,6 @@ import com.raoulvdberge.refinedstorage.api.network.grid.handler.IFluidGridHandle import com.raoulvdberge.refinedstorage.api.network.grid.handler.IItemGridHandler; import com.raoulvdberge.refinedstorage.api.storage.IStorageCache; import com.raoulvdberge.refinedstorage.api.storage.IStorageCacheListener; -import com.raoulvdberge.refinedstorage.api.storage.disk.IStorageDiskFactory; import com.raoulvdberge.refinedstorage.apiimpl.network.node.NetworkNodeGrid; import com.raoulvdberge.refinedstorage.container.slot.filter.SlotFilter; import com.raoulvdberge.refinedstorage.container.slot.filter.SlotFilterFluid; @@ -54,88 +52,151 @@ public class ContainerGrid extends ContainerBase { this.inventorySlots.clear(); this.inventoryItemStacks.clear(); - int headerAndSlots = getTabDelta() + display.getTopHeight() + (display.getVisibleRows() * 18); + this.transferManager.clearTransfers(); if (grid.getGridType() != GridType.FLUID) { - int yStart = 6; - - if (grid instanceof IPortableGrid) { - yStart = 38; - } - - for (int i = 0; i < 4; ++i) { - addSlotToContainer(new SlotItemHandler(grid.getFilter(), i, 204, yStart + (18 * i) + getTabDelta())); - } - } - - if (grid.getGridType() == GridType.PATTERN) { - addSlotToContainer(new SlotItemHandler(((NetworkNodeGrid) grid).getPatterns(), 0, 172, headerAndSlots + 4)); - addSlotToContainer(new SlotItemHandler(((NetworkNodeGrid) grid).getPatterns(), 1, 172, headerAndSlots + 40)); + addFilterSlots(); } if (grid instanceof IPortableGrid) { - addSlotToContainer(new SlotItemHandler(((IPortableGrid) grid).getDisk(), 0, 204, 6 + getTabDelta())); + addPortableGridSlots(); } - addPlayerInventory(8, display.getYPlayerInventory()); - if (grid.getGridType() == GridType.CRAFTING) { - int x = 26; - int y = headerAndSlots + 4; - - for (int i = 0; i < 9; ++i) { - addSlotToContainer(new SlotGridCrafting(grid.getCraftingMatrix(), i, x, y)); - - x += 18; - - if ((i + 1) % 3 == 0) { - y += 18; - x = 26; - } - } - - addSlotToContainer(craftingResultSlot = new SlotGridCraftingResult(this, getPlayer(), grid, 0, 130 + 4, headerAndSlots + 22)); + addCraftingSlots(); } else if (grid.getGridType() == GridType.PATTERN) { - // Processing patterns - int ox = 8; - int x = ox; - int y = headerAndSlots + 4; + addPatternSlots(); + } - for (int i = 0; i < 9 * 2; ++i) { - addSlotToContainer(new SlotFilter(((NetworkNodeGrid) grid).getProcessingMatrix(), i, x, y, SlotFilter.FILTER_ALLOW_SIZE).setEnableHandler(() -> ((NetworkNodeGrid) grid).isProcessingPattern() && ((NetworkNodeGrid) grid).getType() == IType.ITEMS)); - addSlotToContainer(new SlotFilterFluid(((NetworkNodeGrid) grid).getProcessingMatrixFluids(), i, x, y, SlotFilter.FILTER_ALLOW_SIZE).setEnableHandler(() -> ((NetworkNodeGrid) grid).isProcessingPattern() && ((NetworkNodeGrid) grid).getType() == IType.FLUIDS)); + transferManager.setNotFoundHandler(slotIndex -> { + if (!getPlayer().getEntityWorld().isRemote) { + Slot slot = inventorySlots.get(slotIndex); - x += 18; + if (slot.getHasStack()) { + if (slot == craftingResultSlot) { + grid.onCraftedShift(getPlayer()); - if ((i + 1) % 3 == 0) { - if (i == 8) { - ox = 98; - x = ox; - y = headerAndSlots + 4; + sendCraftingSlots(); + + detectAndSendChanges(); } else { - x = ox; - y += 18; + ItemStack stack = slot.getStack(); + + if (grid.getGridType() == GridType.FLUID) { + IFluidGridHandler fluidHandler = grid.getFluidHandler(); + + if (fluidHandler != null) { + slot.putStack(fluidHandler.onShiftClick((EntityPlayerMP) getPlayer(), stack)); + } + } else { + IItemGridHandler itemHandler = grid.getItemHandler(); + + if (itemHandler != null) { + slot.putStack(itemHandler.onShiftClick((EntityPlayerMP) getPlayer(), stack)); + } else if (slot instanceof SlotGridCrafting && mergeItemStack(stack, 4, 4 + (9 * 4), false)) { + slot.onSlotChanged(); + } + } + + detectAndSendChanges(); } } } - // Regular patterns - x = 26; - y = headerAndSlots + 4; + return ItemStack.EMPTY; + }); - for (int i = 0; i < 9; ++i) { - addSlotToContainer(new SlotLegacyFilter(grid.getCraftingMatrix(), i, x, y).setEnableHandler(() -> !((NetworkNodeGrid) grid).isProcessingPattern())); + addPlayerInventory(8, display.getYPlayerInventory()); + } - x += 18; + private void addPortableGridSlots() { + addSlotToContainer(new SlotItemHandler(((IPortableGrid) grid).getDisk(), 0, 204, 6 + getTabDelta())); - if ((i + 1) % 3 == 0) { + // TODO: avoid putting disks into disks. + transferManager.addTransfer(getPlayer().inventory, ((IPortableGrid) grid).getDisk()); + } + + private void addFilterSlots() { + int yStart = 6; + + if (grid instanceof IPortableGrid) { + yStart = 38; + } + + for (int i = 0; i < 4; ++i) { + addSlotToContainer(new SlotItemHandler(grid.getFilter(), i, 204, yStart + (18 * i) + getTabDelta())); + } + + transferManager.addBiTransfer(getPlayer().inventory, grid.getFilter()); + } + + private void addCraftingSlots() { + int headerAndSlots = getTabDelta() + display.getTopHeight() + (display.getVisibleRows() * 18); + + int x = 26; + int y = headerAndSlots + 4; + + for (int i = 0; i < 9; ++i) { + addSlotToContainer(new SlotGridCrafting(grid.getCraftingMatrix(), i, x, y)); + + x += 18; + + if ((i + 1) % 3 == 0) { + y += 18; + x = 26; + } + } + + addSlotToContainer(craftingResultSlot = new SlotGridCraftingResult(this, getPlayer(), grid, 0, 130 + 4, headerAndSlots + 22)); + } + + private void addPatternSlots() { + int headerAndSlots = getTabDelta() + display.getTopHeight() + (display.getVisibleRows() * 18); + + addSlotToContainer(new SlotItemHandler(((NetworkNodeGrid) grid).getPatterns(), 0, 172, headerAndSlots + 4)); + addSlotToContainer(new SlotItemHandler(((NetworkNodeGrid) grid).getPatterns(), 1, 172, headerAndSlots + 40)); + + transferManager.addBiTransfer(getPlayer().inventory, ((NetworkNodeGrid) grid).getPatterns()); + + // Processing patterns + int ox = 8; + int x = ox; + int y = headerAndSlots + 4; + + for (int i = 0; i < 9 * 2; ++i) { + addSlotToContainer(new SlotFilter(((NetworkNodeGrid) grid).getProcessingMatrix(), i, x, y, SlotFilter.FILTER_ALLOW_SIZE).setEnableHandler(() -> ((NetworkNodeGrid) grid).isProcessingPattern() && ((NetworkNodeGrid) grid).getType() == IType.ITEMS)); + addSlotToContainer(new SlotFilterFluid(((NetworkNodeGrid) grid).getProcessingMatrixFluids(), i, x, y, SlotFilter.FILTER_ALLOW_SIZE).setEnableHandler(() -> ((NetworkNodeGrid) grid).isProcessingPattern() && ((NetworkNodeGrid) grid).getType() == IType.FLUIDS)); + + x += 18; + + if ((i + 1) % 3 == 0) { + if (i == 8) { + ox = 98; + x = ox; + y = headerAndSlots + 4; + } else { + x = ox; y += 18; - x = 26; } } - - addSlotToContainer(patternResultSlot = (new SlotLegacyDisabled(grid.getCraftingResult(), 0, 134, headerAndSlots + 22).setEnableHandler(() -> !((NetworkNodeGrid) grid).isProcessingPattern()))); } + + // Regular patterns + x = 26; + y = headerAndSlots + 4; + + for (int i = 0; i < 9; ++i) { + addSlotToContainer(new SlotLegacyFilter(grid.getCraftingMatrix(), i, x, y).setEnableHandler(() -> !((NetworkNodeGrid) grid).isProcessingPattern())); + + x += 18; + + if ((i + 1) % 3 == 0) { + y += 18; + x = 26; + } + } + + addSlotToContainer(patternResultSlot = (new SlotLegacyDisabled(grid.getCraftingResult(), 0, 134, headerAndSlots + 22).setEnableHandler(() -> !((NetworkNodeGrid) grid).isProcessingPattern()))); } private int getTabDelta() { @@ -200,115 +261,6 @@ public class ContainerGrid extends ContainerBase { return (slot == craftingResultSlot || slot == patternResultSlot) ? false : super.canMergeSlot(stack, slot); } - @Override - public ItemStack transferStackInSlot(EntityPlayer player, int slotIndex) { - if (!player.getEntityWorld().isRemote) { - Slot slot = inventorySlots.get(slotIndex); - - if (slot.getHasStack()) { - if (grid instanceof IPortableGrid && slot.slotNumber == 4) { // Prevent moving disk slot into portable grid itself - return ItemStack.EMPTY; - } else if (grid.getGridType() == GridType.PATTERN && slot.slotNumber == 5) { // From output slot to inventory - ItemStack stack = slot.getStack(); - - int startIndex = 5; - int endIndex = startIndex + (9 * 4); - - if (mergeItemStack(stack, startIndex, endIndex, false)) { - slot.onSlotChanged(); - - detectAndSendChanges(); - } - - return ItemStack.EMPTY; - } else if (slot == craftingResultSlot) { - grid.onCraftedShift(player); - - sendCraftingSlots(); - detectAndSendChanges(); - } else if (slot != patternResultSlot && !(slot instanceof SlotLegacyFilter)) { - ItemStack stack = slot.getStack(); - - if (grid.getGridType() != GridType.FLUID && stack.getItem() == RSItems.FILTER) { - int startIndex = 0; - int endIndex = 4; - - // Move to player inventory instead - if (slotIndex < 4) { - startIndex = 4; - - if (grid.getGridType() == GridType.PATTERN) { - startIndex += 2; // Skip the pattern slots - } - - endIndex = startIndex + (9 * 4); - } - - if (mergeItemStack(stack, startIndex, endIndex, false)) { - slot.onSlotChanged(); - - detectAndSendChanges(); - - // For some reason it doesn't detect when moving the filter from filter inventory to player inventory... - if (slotIndex < 4) { - grid.getFilter().setStackInSlot(slotIndex, ItemStack.EMPTY); - } - - return ItemStack.EMPTY; - } - } else if ((grid.getGridType() == GridType.PATTERN && stack.getItem() == RSItems.PATTERN) || (grid instanceof IPortableGrid && stack.getItem() instanceof IStorageDiskFactory)) { - int startIndex = 4; - int endIndex = startIndex + 1; - - // Move to player inventory instead - if (slotIndex == 4) { - startIndex = endIndex; - endIndex = startIndex + (9 * 4); - } - - if (mergeItemStack(stack, startIndex, endIndex, false)) { - slot.onSlotChanged(); - - detectAndSendChanges(); - - // For some reason it doesn't detect when moving the disk from disk inventory to player inventory... - if (grid instanceof IPortableGrid && slotIndex == 4) { - ((IPortableGrid) grid).getDisk().setStackInSlot(0, ItemStack.EMPTY); - } - - return ItemStack.EMPTY; - } - - // When we shift click a storage disk in a portable grid and our inventory is full, the disk can't go in the storage! - if (grid instanceof PortableGrid) { - return ItemStack.EMPTY; - } - } - - if (grid.getGridType() == GridType.FLUID) { - IFluidGridHandler fluidHandler = grid.getFluidHandler(); - - if (fluidHandler != null) { - slot.putStack(fluidHandler.onShiftClick((EntityPlayerMP) player, stack)); - } - } else { - IItemGridHandler itemHandler = grid.getItemHandler(); - - if (itemHandler != null) { - slot.putStack(itemHandler.onShiftClick((EntityPlayerMP) player, stack)); - } else if (slot instanceof SlotGridCrafting && mergeItemStack(stack, 4, 4 + (9 * 4), false)) { - slot.onSlotChanged(); - } - } - - detectAndSendChanges(); - } - } - } - - return ItemStack.EMPTY; - } - @Override protected boolean isHeldItemDisabled() { // Here we check for the concrete portable grid type, not IPortableGrid, because we *CAN* move the held item in the portable grid tile diff --git a/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerImporter.java b/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerImporter.java index 3a1ec2207..5541b7324 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerImporter.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerImporter.java @@ -1,23 +1,16 @@ package com.raoulvdberge.refinedstorage.container; -import com.raoulvdberge.refinedstorage.apiimpl.network.node.NetworkNodeImporter; import com.raoulvdberge.refinedstorage.container.slot.filter.SlotFilter; import com.raoulvdberge.refinedstorage.container.slot.filter.SlotFilterFluid; import com.raoulvdberge.refinedstorage.tile.TileImporter; import com.raoulvdberge.refinedstorage.tile.config.IType; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.inventory.Slot; -import net.minecraft.item.ItemStack; import net.minecraftforge.items.SlotItemHandler; public class ContainerImporter extends ContainerBase { - private NetworkNodeImporter importer; - public ContainerImporter(TileImporter importer, EntityPlayer player) { super(importer, player); - this.importer = importer.getNode(); - for (int i = 0; i < 4; ++i) { addSlotToContainer(new SlotItemHandler(importer.getNode().getUpgrades(), i, 187, 6 + (i * 18))); } @@ -31,36 +24,8 @@ public class ContainerImporter extends ContainerBase { } addPlayerInventory(8, 55); - } - @Override - public ItemStack transferStackInSlot(EntityPlayer player, int index) { - ItemStack stack = ItemStack.EMPTY; - - Slot slot = getSlot(index); - - if (slot.getHasStack()) { - stack = slot.getStack(); - - if (index < 4) { - if (!mergeItemStack(stack, 4 + 9 + 9, inventorySlots.size(), false)) { - return ItemStack.EMPTY; - } - } else if (!mergeItemStack(stack, 0, 4, false)) { - if (importer.getType() == IType.ITEMS) { - return transferToFilters(stack, 4, 4 + 9); - } else { - return transferToFluidFilters(stack); - } - } - - if (stack.getCount() == 0) { - slot.putStack(ItemStack.EMPTY); - } else { - slot.onSlotChanged(); - } - } - - return stack; + transferManager.addBiTransfer(player.inventory, importer.getNode().getUpgrades()); + transferManager.addFilterTransfer(player.inventory, importer.getNode().getItemFilters(), importer.getNode().getFluidFilters(), importer.getNode()::getType); } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerInterface.java b/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerInterface.java index 4437400df..acce99767 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerInterface.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerInterface.java @@ -4,8 +4,6 @@ import com.raoulvdberge.refinedstorage.container.slot.SlotOutput; import com.raoulvdberge.refinedstorage.container.slot.filter.SlotFilter; import com.raoulvdberge.refinedstorage.tile.TileInterface; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.inventory.Slot; -import net.minecraft.item.ItemStack; import net.minecraftforge.items.SlotItemHandler; public class ContainerInterface extends ContainerBase { @@ -29,34 +27,9 @@ public class ContainerInterface extends ContainerBase { } addPlayerInventory(8, 134); - } - @Override - public ItemStack transferStackInSlot(EntityPlayer player, int index) { - ItemStack stack = ItemStack.EMPTY; - - Slot slot = getSlot(index); - - if (slot.getHasStack()) { - stack = slot.getStack(); - - if (index < 9 || (index >= 9 + 9 + 9 && index < 9 + 9 + 9 + 4)) { - if (!mergeItemStack(stack, 9 + 9 + 9 + 4, inventorySlots.size(), false)) { - return ItemStack.EMPTY; - } - } else if (!mergeItemStack(stack, 9 + 9 + 9, 9 + 9 + 9 + 4, false)) { - if (!mergeItemStack(stack, 0, 9, false)) { - return ItemStack.EMPTY; - } - } - - if (stack.getCount() == 0) { - slot.putStack(ItemStack.EMPTY); - } else { - slot.onSlotChanged(); - } - } - - return stack; + transferManager.addBiTransfer(player.inventory, tile.getNode().getUpgrades()); + transferManager.addBiTransfer(player.inventory, tile.getNode().getImportItems()); + transferManager.addTransfer(tile.getNode().getExportItems(), player.inventory); } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerNetworkTransmitter.java b/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerNetworkTransmitter.java index 5d5e4d193..e2420fc68 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerNetworkTransmitter.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerNetworkTransmitter.java @@ -2,8 +2,6 @@ package com.raoulvdberge.refinedstorage.container; import com.raoulvdberge.refinedstorage.tile.TileNetworkTransmitter; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.inventory.Slot; -import net.minecraft.item.ItemStack; import net.minecraftforge.items.SlotItemHandler; public class ContainerNetworkTransmitter extends ContainerBase { @@ -15,32 +13,8 @@ public class ContainerNetworkTransmitter extends ContainerBase { addSlotToContainer(new SlotItemHandler(networkTransmitter.getNode().getUpgrades(), 0, 187, 6)); addPlayerInventory(8, 55); - } - @Override - public ItemStack transferStackInSlot(EntityPlayer player, int index) { - ItemStack stack = ItemStack.EMPTY; - - Slot slot = getSlot(index); - - if (slot.getHasStack()) { - stack = slot.getStack(); - - if (index <= 1) { - if (!mergeItemStack(stack, 2, inventorySlots.size(), false)) { - return ItemStack.EMPTY; - } - } else if (!mergeItemStack(stack, 0, 2, false)) { - return ItemStack.EMPTY; - } - - if (stack.getCount() == 0) { - slot.putStack(ItemStack.EMPTY); - } else { - slot.onSlotChanged(); - } - } - - return stack; + transferManager.addBiTransfer(player.inventory, networkTransmitter.getNode().getUpgrades()); + transferManager.addBiTransfer(player.inventory, networkTransmitter.getNode().getNetworkCard()); } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerSecurityManager.java b/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerSecurityManager.java index 479b5879e..1dee26c13 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerSecurityManager.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerSecurityManager.java @@ -2,8 +2,6 @@ package com.raoulvdberge.refinedstorage.container; import com.raoulvdberge.refinedstorage.tile.TileSecurityManager; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.inventory.Slot; -import net.minecraft.item.ItemStack; import net.minecraftforge.items.SlotItemHandler; public class ContainerSecurityManager extends ContainerBase { @@ -27,32 +25,8 @@ public class ContainerSecurityManager extends ContainerBase { addSlotToContainer(new SlotItemHandler(securityManager.getNode().getEditCard(), 0, 80, 70)); addPlayerInventory(8, 152); - } - @Override - public ItemStack transferStackInSlot(EntityPlayer player, int index) { - ItemStack stack = ItemStack.EMPTY; - - Slot slot = getSlot(index); - - if (slot.getHasStack()) { - stack = slot.getStack(); - - if (index < (9 * 2) + 1) { - if (!mergeItemStack(stack, (9 * 2) + 1, inventorySlots.size(), false)) { - return ItemStack.EMPTY; - } - } else if (!mergeItemStack(stack, 0, 9 * 2, false)) { - return ItemStack.EMPTY; - } - - if (stack.getCount() == 0) { - slot.putStack(ItemStack.EMPTY); - } else { - slot.onSlotChanged(); - } - } - - return stack; + transferManager.addBiTransfer(player.inventory, securityManager.getNode().getCardsItems()); + transferManager.addTransfer(securityManager.getNode().getEditCard(), player.inventory); } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerStorage.java b/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerStorage.java index cff6faa03..6f418e0a9 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerStorage.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerStorage.java @@ -3,8 +3,6 @@ package com.raoulvdberge.refinedstorage.container; import com.raoulvdberge.refinedstorage.container.slot.filter.SlotFilter; import com.raoulvdberge.refinedstorage.tile.TileStorage; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.inventory.Slot; -import net.minecraft.item.ItemStack; public class ContainerStorage extends ContainerBase { public ContainerStorage(TileStorage storage, EntityPlayer player) { @@ -15,16 +13,7 @@ public class ContainerStorage extends ContainerBase { } addPlayerInventory(8, 141); - } - @Override - public ItemStack transferStackInSlot(EntityPlayer player, int index) { - Slot slot = getSlot(index); - - if (slot.getHasStack() && index > 8) { - return transferToFilters(slot.getStack(), 0, 9); - } - - return ItemStack.EMPTY; + transferManager.addItemFilterTransfer(player.inventory, storage.getNode().getFilters()); } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerStorageMonitor.java b/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerStorageMonitor.java index 4c828b887..60706fab5 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerStorageMonitor.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerStorageMonitor.java @@ -3,8 +3,6 @@ package com.raoulvdberge.refinedstorage.container; import com.raoulvdberge.refinedstorage.container.slot.filter.SlotFilter; import com.raoulvdberge.refinedstorage.tile.TileStorageMonitor; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.inventory.Slot; -import net.minecraft.item.ItemStack; public class ContainerStorageMonitor extends ContainerBase { public ContainerStorageMonitor(TileStorageMonitor storageMonitor, EntityPlayer player) { @@ -13,18 +11,7 @@ public class ContainerStorageMonitor extends ContainerBase { addSlotToContainer(new SlotFilter(storageMonitor.getNode().getItemFilters(), 0, 80, 20)); addPlayerInventory(8, 55); - } - @Override - public ItemStack transferStackInSlot(EntityPlayer player, int index) { - Slot slot = getSlot(index); - - ItemStack stack = slot.getStack(); - - if (index > 0 && slot.getHasStack()) { - return transferToFilters(stack, 0, 1); - } - - return stack; + transferManager.addItemFilterTransfer(player.inventory, storageMonitor.getNode().getItemFilters()); } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerWirelessTransmitter.java b/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerWirelessTransmitter.java index 3438e9ca8..959418de4 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerWirelessTransmitter.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/container/ContainerWirelessTransmitter.java @@ -2,8 +2,6 @@ package com.raoulvdberge.refinedstorage.container; import com.raoulvdberge.refinedstorage.tile.TileWirelessTransmitter; import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.inventory.Slot; -import net.minecraft.item.ItemStack; import net.minecraftforge.items.SlotItemHandler; public class ContainerWirelessTransmitter extends ContainerBase { @@ -15,32 +13,7 @@ public class ContainerWirelessTransmitter extends ContainerBase { } addPlayerInventory(8, 55); - } - @Override - public ItemStack transferStackInSlot(EntityPlayer player, int index) { - ItemStack stack = ItemStack.EMPTY; - - Slot slot = getSlot(index); - - if (slot.getHasStack()) { - stack = slot.getStack(); - - if (index < 4) { - if (!mergeItemStack(stack, 4, inventorySlots.size(), false)) { - return ItemStack.EMPTY; - } - } else if (!mergeItemStack(stack, 0, 4, false)) { - return ItemStack.EMPTY; - } - - if (stack.getCount() == 0) { - slot.putStack(ItemStack.EMPTY); - } else { - slot.onSlotChanged(); - } - } - - return stack; + transferManager.addBiTransfer(player.inventory, wirelessTransmitter.getNode().getUpgrades()); } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/container/transfer/IInventoryWrapper.java b/src/main/java/com/raoulvdberge/refinedstorage/container/transfer/IInventoryWrapper.java new file mode 100644 index 000000000..7c8f1e23d --- /dev/null +++ b/src/main/java/com/raoulvdberge/refinedstorage/container/transfer/IInventoryWrapper.java @@ -0,0 +1,7 @@ +package com.raoulvdberge.refinedstorage.container.transfer; + +import net.minecraft.item.ItemStack; + +interface IInventoryWrapper { + InsertionResult insert(ItemStack stack); +} diff --git a/src/main/java/com/raoulvdberge/refinedstorage/container/transfer/InsertionResult.java b/src/main/java/com/raoulvdberge/refinedstorage/container/transfer/InsertionResult.java new file mode 100644 index 000000000..a793f5047 --- /dev/null +++ b/src/main/java/com/raoulvdberge/refinedstorage/container/transfer/InsertionResult.java @@ -0,0 +1,25 @@ +package com.raoulvdberge.refinedstorage.container.transfer; + +import net.minecraft.item.ItemStack; + +class InsertionResult { + private InsertionResultType type; + private ItemStack value; + + InsertionResult(ItemStack value) { + this.type = InsertionResultType.CONTINUE_IF_POSSIBLE; + this.value = value; + } + + InsertionResult(InsertionResultType type) { + this.type = type; + } + + public InsertionResultType getType() { + return type; + } + + public ItemStack getValue() { + return value; + } +} diff --git a/src/main/java/com/raoulvdberge/refinedstorage/container/transfer/InsertionResultType.java b/src/main/java/com/raoulvdberge/refinedstorage/container/transfer/InsertionResultType.java new file mode 100644 index 000000000..ecf37dd8c --- /dev/null +++ b/src/main/java/com/raoulvdberge/refinedstorage/container/transfer/InsertionResultType.java @@ -0,0 +1,6 @@ +package com.raoulvdberge.refinedstorage.container.transfer; + +enum InsertionResultType { + CONTINUE_IF_POSSIBLE, + STOP +} diff --git a/src/main/java/com/raoulvdberge/refinedstorage/container/transfer/InventoryWrapperFilter.java b/src/main/java/com/raoulvdberge/refinedstorage/container/transfer/InventoryWrapperFilter.java new file mode 100644 index 000000000..fc50aa6a0 --- /dev/null +++ b/src/main/java/com/raoulvdberge/refinedstorage/container/transfer/InventoryWrapperFilter.java @@ -0,0 +1,25 @@ +package com.raoulvdberge.refinedstorage.container.transfer; + +import com.raoulvdberge.refinedstorage.inventory.fluid.FluidInventory; +import com.raoulvdberge.refinedstorage.tile.config.IType; +import net.minecraft.item.ItemStack; +import net.minecraftforge.items.IItemHandlerModifiable; + +import java.util.function.Supplier; + +class InventoryWrapperFilter implements IInventoryWrapper { + private InventoryWrapperFilterItem item; + private InventoryWrapperFilterFluid fluid; + private Supplier typeGetter; + + InventoryWrapperFilter(IItemHandlerModifiable itemTo, FluidInventory fluidTo, Supplier typeGetter) { + this.item = new InventoryWrapperFilterItem(itemTo); + this.fluid = new InventoryWrapperFilterFluid(fluidTo); + this.typeGetter = typeGetter; + } + + @Override + public InsertionResult insert(ItemStack stack) { + return typeGetter.get() == IType.ITEMS ? item.insert(stack) : fluid.insert(stack); + } +} diff --git a/src/main/java/com/raoulvdberge/refinedstorage/container/transfer/InventoryWrapperFilterFluid.java b/src/main/java/com/raoulvdberge/refinedstorage/container/transfer/InventoryWrapperFilterFluid.java new file mode 100644 index 000000000..aa6d06880 --- /dev/null +++ b/src/main/java/com/raoulvdberge/refinedstorage/container/transfer/InventoryWrapperFilterFluid.java @@ -0,0 +1,44 @@ +package com.raoulvdberge.refinedstorage.container.transfer; + +import com.raoulvdberge.refinedstorage.api.util.IComparer; +import com.raoulvdberge.refinedstorage.apiimpl.API; +import com.raoulvdberge.refinedstorage.inventory.fluid.FluidInventory; +import com.raoulvdberge.refinedstorage.util.StackUtils; +import net.minecraft.item.ItemStack; +import net.minecraftforge.fluids.Fluid; +import net.minecraftforge.fluids.FluidStack; + +class InventoryWrapperFilterFluid implements IInventoryWrapper { + private FluidInventory filterInv; + + InventoryWrapperFilterFluid(FluidInventory filterInv) { + this.filterInv = filterInv; + } + + @Override + public InsertionResult insert(ItemStack stack) { + InsertionResult stop = new InsertionResult(InsertionResultType.STOP); + + FluidStack fluidInContainer = StackUtils.getFluid(stack, true).getValue(); + + if (fluidInContainer == null) { + return stop; + } + + for (FluidStack fluid : filterInv.getFluids()) { + if (API.instance().getComparer().isEqual(fluidInContainer, fluid, IComparer.COMPARE_NBT)) { + return stop; + } + } + + for (int i = 0; i < filterInv.getSlots(); ++i) { + if (filterInv.getFluid(i) == null) { + filterInv.setFluid(i, StackUtils.copy(fluidInContainer, Fluid.BUCKET_VOLUME)); + + return stop; + } + } + + return stop; + } +} diff --git a/src/main/java/com/raoulvdberge/refinedstorage/container/transfer/InventoryWrapperFilterItem.java b/src/main/java/com/raoulvdberge/refinedstorage/container/transfer/InventoryWrapperFilterItem.java new file mode 100644 index 000000000..a4ff78937 --- /dev/null +++ b/src/main/java/com/raoulvdberge/refinedstorage/container/transfer/InventoryWrapperFilterItem.java @@ -0,0 +1,35 @@ +package com.raoulvdberge.refinedstorage.container.transfer; + +import com.raoulvdberge.refinedstorage.apiimpl.API; +import net.minecraft.item.ItemStack; +import net.minecraftforge.items.IItemHandlerModifiable; +import net.minecraftforge.items.ItemHandlerHelper; + +class InventoryWrapperFilterItem implements IInventoryWrapper { + private IItemHandlerModifiable filterInv; + + InventoryWrapperFilterItem(IItemHandlerModifiable filterInv) { + this.filterInv = filterInv; + } + + @Override + public InsertionResult insert(ItemStack stack) { + InsertionResult stop = new InsertionResult(InsertionResultType.STOP); + + for (int i = 0; i < filterInv.getSlots(); ++i) { + if (API.instance().getComparer().isEqualNoQuantity(filterInv.getStackInSlot(i), stack)) { + return stop; + } + } + + for (int i = 0; i < filterInv.getSlots(); ++i) { + if (filterInv.getStackInSlot(i).isEmpty()) { + filterInv.setStackInSlot(i, ItemHandlerHelper.copyStackWithSize(stack, 1)); + + break; + } + } + + return stop; + } +} diff --git a/src/main/java/com/raoulvdberge/refinedstorage/container/transfer/InventoryWrapperInventory.java b/src/main/java/com/raoulvdberge/refinedstorage/container/transfer/InventoryWrapperInventory.java new file mode 100644 index 000000000..1e8144e83 --- /dev/null +++ b/src/main/java/com/raoulvdberge/refinedstorage/container/transfer/InventoryWrapperInventory.java @@ -0,0 +1,52 @@ +package com.raoulvdberge.refinedstorage.container.transfer; + +import net.minecraft.entity.player.InventoryPlayer; +import net.minecraft.inventory.IInventory; +import net.minecraft.item.ItemStack; +import net.minecraftforge.items.IItemHandler; +import net.minecraftforge.items.ItemHandlerHelper; +import net.minecraftforge.items.wrapper.InvWrapper; +import net.minecraftforge.items.wrapper.RangedWrapper; + +import java.util.Objects; + +class InventoryWrapperInventory implements IInventoryWrapper { + private IInventory inventory; + private IItemHandler wrapper; + + InventoryWrapperInventory(IInventory inventory) { + this.inventory = inventory; + + if (inventory instanceof InventoryPlayer) { + // Don't use PlayerMainInvWrapper to avoid stack animations. + this.wrapper = new RangedWrapper(new InvWrapper(inventory), 0, ((InventoryPlayer) inventory).mainInventory.size()); + } else { + this.wrapper = new InvWrapper(inventory); + } + } + + @Override + public InsertionResult insert(ItemStack stack) { + return new InsertionResult(ItemHandlerHelper.insertItem(wrapper, stack, false)); + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + + if (o == null || getClass() != o.getClass()) { + return false; + } + + InventoryWrapperInventory that = (InventoryWrapperInventory) o; + + return Objects.equals(inventory, that.inventory); + } + + @Override + public int hashCode() { + return Objects.hash(inventory); + } +} diff --git a/src/main/java/com/raoulvdberge/refinedstorage/container/transfer/InventoryWrapperItemHandler.java b/src/main/java/com/raoulvdberge/refinedstorage/container/transfer/InventoryWrapperItemHandler.java new file mode 100644 index 000000000..87f8f6d7b --- /dev/null +++ b/src/main/java/com/raoulvdberge/refinedstorage/container/transfer/InventoryWrapperItemHandler.java @@ -0,0 +1,40 @@ +package com.raoulvdberge.refinedstorage.container.transfer; + +import net.minecraft.item.ItemStack; +import net.minecraftforge.items.IItemHandler; +import net.minecraftforge.items.ItemHandlerHelper; + +import java.util.Objects; + +class InventoryWrapperItemHandler implements IInventoryWrapper { + private IItemHandler handler; + + InventoryWrapperItemHandler(IItemHandler handler) { + this.handler = handler; + } + + @Override + public InsertionResult insert(ItemStack stack) { + return new InsertionResult(ItemHandlerHelper.insertItem(handler, stack, false)); + } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + + if (o == null || getClass() != o.getClass()) { + return false; + } + + InventoryWrapperItemHandler that = (InventoryWrapperItemHandler) o; + + return Objects.equals(handler, that.handler); + } + + @Override + public int hashCode() { + return Objects.hash(handler); + } +} diff --git a/src/main/java/com/raoulvdberge/refinedstorage/container/transfer/TransferManager.java b/src/main/java/com/raoulvdberge/refinedstorage/container/transfer/TransferManager.java new file mode 100644 index 000000000..08582ad1a --- /dev/null +++ b/src/main/java/com/raoulvdberge/refinedstorage/container/transfer/TransferManager.java @@ -0,0 +1,114 @@ +package com.raoulvdberge.refinedstorage.container.transfer; + +import com.raoulvdberge.refinedstorage.apiimpl.API; +import com.raoulvdberge.refinedstorage.inventory.fluid.FluidInventory; +import net.minecraft.inventory.Container; +import net.minecraft.inventory.IInventory; +import net.minecraft.inventory.Slot; +import net.minecraft.item.ItemStack; +import net.minecraftforge.items.IItemHandler; +import net.minecraftforge.items.IItemHandlerModifiable; +import net.minecraftforge.items.SlotItemHandler; + +import javax.annotation.Nullable; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.function.Supplier; + +public class TransferManager { + private Map> fromToMap = new HashMap<>(); + private Container container; + + @Nullable + private Function notFoundHandler; + + public TransferManager(Container container) { + this.container = container; + } + + public void clearTransfers() { + this.fromToMap.clear(); + } + + public void setNotFoundHandler(@Nullable Function handler) { + this.notFoundHandler = handler; + } + + public void addTransfer(IInventory from, IItemHandler to) { + addTransfer(new InventoryWrapperInventory(from), new InventoryWrapperItemHandler(to)); + } + + public void addFilterTransfer(IInventory from, IItemHandlerModifiable itemTo, FluidInventory fluidTo, Supplier typeGetter) { + addTransfer(new InventoryWrapperInventory(from), new InventoryWrapperFilter(itemTo, fluidTo, typeGetter)); + } + + public void addItemFilterTransfer(IInventory from, IItemHandlerModifiable to) { + addTransfer(new InventoryWrapperInventory(from), new InventoryWrapperFilterItem(to)); + } + + public void addFluidFilterTransfer(IInventory from, FluidInventory to) { + addTransfer(new InventoryWrapperInventory(from), new InventoryWrapperFilterFluid(to)); + } + + public void addTransfer(IItemHandler from, IInventory to) { + addTransfer(new InventoryWrapperItemHandler(from), new InventoryWrapperInventory(to)); + } + + public void addBiTransfer(IInventory from, IItemHandler to) { + addTransfer(from, to); + addTransfer(to, from); + } + + private void addTransfer(IInventoryWrapper from, IInventoryWrapper to) { + List toList = fromToMap.computeIfAbsent(from, k -> new LinkedList<>()); + + toList.add(to); + } + + public ItemStack transfer(int index) { + Slot slot = container.getSlot(index); + + IInventoryWrapper key; + if (slot instanceof SlotItemHandler) { + key = new InventoryWrapperItemHandler(((SlotItemHandler) slot).getItemHandler()); + } else { + key = new InventoryWrapperInventory(slot.inventory); + } + + List toList = fromToMap.get(key); + + if (toList != null) { + ItemStack initial = slot.getStack().copy(); + + ItemStack remainder = slot.getStack(); + + for (IInventoryWrapper to : toList) { + InsertionResult result = to.insert(remainder); + + if (result.getType() == InsertionResultType.STOP) { + break; + } else if (result.getType() == InsertionResultType.CONTINUE_IF_POSSIBLE) { + remainder = result.getValue(); + + if (remainder.isEmpty()) { + break; + } + } + } + + slot.putStack(remainder); + slot.onSlotChanged(); + + if (API.instance().getComparer().isEqual(remainder, initial) && notFoundHandler != null) { + return notFoundHandler.apply(index); + } + } else if (notFoundHandler != null) { + return notFoundHandler.apply(index); + } + + return ItemStack.EMPTY; + } +} diff --git a/src/main/java/com/raoulvdberge/refinedstorage/tile/config/IType.java b/src/main/java/com/raoulvdberge/refinedstorage/tile/config/IType.java index af5543b92..1957ebcb0 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/tile/config/IType.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/tile/config/IType.java @@ -6,7 +6,7 @@ import com.raoulvdberge.refinedstorage.tile.data.TileDataParameter; import com.raoulvdberge.refinedstorage.tile.data.TileDataParameterClientListener; import net.minecraft.network.datasync.DataSerializers; import net.minecraft.tileentity.TileEntity; -import net.minecraftforge.items.IItemHandler; +import net.minecraftforge.items.IItemHandlerModifiable; import javax.annotation.Nullable; @@ -30,7 +30,7 @@ public interface IType { void setType(int type); - IItemHandler getItemFilters(); + IItemHandlerModifiable getItemFilters(); FluidInventory getFluidFilters(); }