Add new shift click handling framework.

This commit is contained in:
raoulvdberge
2018-07-27 12:32:40 +02:00
parent f6eada3c5f
commit 4a89945d6a
40 changed files with 525 additions and 721 deletions

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -690,7 +690,7 @@ public class NetworkNodeGrid extends NetworkNode implements IGridNetworkAware, I
}
@Override
public IItemHandler getItemFilters() {
public IItemHandlerModifiable getItemFilters() {
return processingMatrix;
}

View File

@@ -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;
}

View File

@@ -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;
}

View File

@@ -19,7 +19,6 @@ public class StorageDiskFluidDriveWrapper implements IStorageDisk<FluidStack> {
private NetworkNodeDiskDrive diskDrive;
private IStorageDisk<FluidStack> parent;
private int lastState;
private int ticksSinceLastChanged;
public StorageDiskFluidDriveWrapper(NetworkNodeDiskDrive diskDrive, IStorageDisk<FluidStack> parent) {
this.diskDrive = diskDrive;

View File

@@ -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;
}

View File

@@ -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<SlotFilterFluid> fluidSlots = new ArrayList<>();
private List<FluidStack> 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

View File

@@ -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);
}
}

View File

@@ -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());
}
}

View File

@@ -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);
}
}

View File

@@ -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);
}
}

View File

@@ -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);
}
}

View File

@@ -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);
}
}

View File

@@ -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);
}
}

View File

@@ -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);
}
}

View File

@@ -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;

View File

@@ -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());
}
}

View File

@@ -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());
}
}

View File

@@ -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

View File

@@ -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);
}
}

View File

@@ -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);
}
}

View File

@@ -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());
}
}

View File

@@ -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);
}
}

View File

@@ -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());
}
}

View File

@@ -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());
}
}

View File

@@ -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());
}
}

View File

@@ -0,0 +1,7 @@
package com.raoulvdberge.refinedstorage.container.transfer;
import net.minecraft.item.ItemStack;
interface IInventoryWrapper {
InsertionResult insert(ItemStack stack);
}

View File

@@ -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;
}
}

View File

@@ -0,0 +1,6 @@
package com.raoulvdberge.refinedstorage.container.transfer;
enum InsertionResultType {
CONTINUE_IF_POSSIBLE,
STOP
}

View File

@@ -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<Integer> typeGetter;
InventoryWrapperFilter(IItemHandlerModifiable itemTo, FluidInventory fluidTo, Supplier<Integer> 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);
}
}

View File

@@ -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;
}
}

View File

@@ -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;
}
}

View File

@@ -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);
}
}

View File

@@ -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);
}
}

View File

@@ -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<IInventoryWrapper, List<IInventoryWrapper>> fromToMap = new HashMap<>();
private Container container;
@Nullable
private Function<Integer, ItemStack> notFoundHandler;
public TransferManager(Container container) {
this.container = container;
}
public void clearTransfers() {
this.fromToMap.clear();
}
public void setNotFoundHandler(@Nullable Function<Integer, ItemStack> 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<Integer> 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<IInventoryWrapper> 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<IInventoryWrapper> 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;
}
}

View File

@@ -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();
}