aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/gregtech/api/gui/GT_Container_BasicMachine.java
diff options
context:
space:
mode:
authorMartin Robertz <dream-master@gmx.net>2021-07-15 16:50:25 +0200
committerGitHub <noreply@github.com>2021-07-15 16:50:25 +0200
commitb0b591089c9ae646506770e92efeee074598b49b (patch)
tree95393d3bcbb39e3bb52307b3abec66ea6cbe0584 /src/main/java/gregtech/api/gui/GT_Container_BasicMachine.java
parentf2b07a2872a1c3a1825a9dad0b52e6588fef9ac0 (diff)
parent6f8016367d6f278f7a39206ff7f9dc73c719c807 (diff)
downloadGT5-Unofficial-b0b591089c9ae646506770e92efeee074598b49b.tar.gz
GT5-Unofficial-b0b591089c9ae646506770e92efeee074598b49b.tar.bz2
GT5-Unofficial-b0b591089c9ae646506770e92efeee074598b49b.zip
Merge pull request #593 from GTNewHorizons/gui-manipulate-fluid
Extended GUI fluid manipulation support to GT_MetaTileEntity_BasicTank
Diffstat (limited to 'src/main/java/gregtech/api/gui/GT_Container_BasicMachine.java')
-rw-r--r--src/main/java/gregtech/api/gui/GT_Container_BasicMachine.java150
1 files changed, 9 insertions, 141 deletions
diff --git a/src/main/java/gregtech/api/gui/GT_Container_BasicMachine.java b/src/main/java/gregtech/api/gui/GT_Container_BasicMachine.java
index 28fd2983f4..5d2a9321c4 100644
--- a/src/main/java/gregtech/api/gui/GT_Container_BasicMachine.java
+++ b/src/main/java/gregtech/api/gui/GT_Container_BasicMachine.java
@@ -4,6 +4,7 @@ import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicMachine;
+import gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicTank;
import gregtech.api.util.GT_Utility;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.InventoryPlayer;
@@ -11,7 +12,6 @@ import net.minecraft.inventory.ICrafting;
import net.minecraft.inventory.Slot;
import net.minecraft.item.ItemStack;
import net.minecraftforge.fluids.FluidStack;
-import net.minecraftforge.fluids.IFluidContainerItem;
import static gregtech.api.metatileentity.implementations.GT_MetaTileEntity_BasicMachine.OTHER_SLOT_COUNT;
@@ -195,154 +195,22 @@ public class GT_Container_BasicMachine extends GT_Container_BasicTank {
if (mTileEntity.getMetaTileEntity() == null) return null;
machine.mItemTransfer = !machine.mItemTransfer;
return null;
- case 2:
- if (aMouseclick > 1)
- return null;
- tResultStack = pickupFluid(machine.getDrainableStack(), aPlayer, aMouseclick == 0);
- if (machine.getDrainableStack() != null && machine.getDrainableStack().amount == 0)
- machine.setDrainableStack(null);
- return tResultStack;
default:
- if (aSlotIndex == OTHER_SLOT_COUNT + 1 + machine.mInputSlotCount + machine.mOutputItems.length) {
- if (aMouseclick > 1)
- return null;
- // input fluid slot
- ItemStack tStackHeld = aPlayer.inventory.getItemStack();
- ItemStack tStackSizedOne = GT_Utility.copyAmount(1, tStackHeld);
- if (tStackSizedOne == null || tStackHeld.stackSize == 0) return null;
- FluidStack tInputFluid = machine.getFillableStack();
- FluidStack tFluidHeld = GT_Utility.getFluidForFilledItem(tStackSizedOne, true);
- if (tFluidHeld != null && tFluidHeld.amount <= 0)
- tFluidHeld = null;
- if (tInputFluid == null) {
- if (tFluidHeld == null)
- // both null -> no op
- return null;
- return fillFluid(machine, aPlayer, tFluidHeld, aMouseclick == 0);
- } else {
- if (tFluidHeld != null && tInputFluid.amount < machine.getCapacity()) {
- // both nonnull and have space left for filling.
- // actually both pickup and fill is reasonable, but I'll go with fill here
- return fillFluid(machine, aPlayer, tFluidHeld, aMouseclick == 0);
- } else {
- tResultStack = pickupFluid(tInputFluid, aPlayer, aMouseclick == 0);
- if (tInputFluid.amount == 0)
- machine.setFillableStack(null);
- return tResultStack;
- }
+ if (aSlotIndex == OTHER_SLOT_COUNT + 1 + machine.mInputSlotCount + machine.mOutputItems.length && aMouseclick < 2) {
+ if (mTileEntity.isClientSide()) {
+ // see parent class slotClick for an explanation on why doing this
+ GT_MetaTileEntity_BasicTank tTank = (GT_MetaTileEntity_BasicTank) mTileEntity.getMetaTileEntity();
+ tTank.setFillableStack(GT_Utility.getFluidFromDisplayStack(tTank.getStackInSlot(2)));
}
+ GT_MetaTileEntity_BasicTank tTank = (GT_MetaTileEntity_BasicTank) mTileEntity.getMetaTileEntity();
+ IFluidAccess tFillableAccess = IFluidAccess.from(tTank, true);
+ return handleFluidSlotClick(tFillableAccess, aPlayer, aMouseclick == 0, true, true);
} else {
return super.slotClick(aSlotIndex, aMouseclick, aShifthold, aPlayer);
}
}
}
- private ItemStack pickupFluid(FluidStack aTankStack, EntityPlayer aPlayer, boolean aProcessFullStack) {
- if (aTankStack == null) return null;
- ItemStack tStackHeld = aPlayer.inventory.getItemStack();
- ItemStack tStackSizedOne = GT_Utility.copyAmount(1, tStackHeld);
- if (tStackSizedOne == null || tStackHeld.stackSize == 0) return null;
- int tOriginalFluidAmount = aTankStack.amount;
- ItemStack tFilled = GT_Utility.fillFluidContainer(aTankStack, tStackSizedOne, true, false);
- if (tFilled == null && tStackSizedOne.getItem() instanceof IFluidContainerItem) {
- IFluidContainerItem tContainerItem = (IFluidContainerItem) tStackSizedOne.getItem();
- int tFilledAmount = tContainerItem.fill(tStackSizedOne, aTankStack, true);
- if (tFilledAmount > 0) {
- tFilled = tStackSizedOne;
- aTankStack.amount -= tFilledAmount;
- }
- }
- if (tFilled != null) {
- if (aProcessFullStack) {
- int tFilledAmount = tOriginalFluidAmount - aTankStack.amount;
- /*
- work out how many more items we can fill
- one cell is already used, so account for that
- the round down behavior will left over a fraction of a cell worth of fluid
- the user then get to decide what to do with it
- it will not be too fancy if it spills out partially filled cells
- */
- int tAdditionalParallel = Math.min(tStackHeld.stackSize - 1, aTankStack.amount / tFilledAmount);
- aTankStack.amount -= tFilledAmount * tAdditionalParallel;
- tFilled.stackSize += tAdditionalParallel;
- }
- replaceCursorItemStack(aPlayer, tFilled);
- }
- return tFilled;
- }
-
- private ItemStack fillFluid(GT_MetaTileEntity_BasicMachine aMachine, EntityPlayer aPlayer, FluidStack aFluidHeld, boolean aProcessFullStack) {
- // we are not using aMachine.fill() here any more, so we need to check for fluid type here ourselves
- if (aMachine.getFillableStack() != null && !aMachine.getFillableStack().isFluidEqual(aFluidHeld))
- return null;
- ItemStack tStackHeld = aPlayer.inventory.getItemStack();
- ItemStack tStackSizedOne = GT_Utility.copyAmount(1, tStackHeld);
- if (tStackSizedOne == null)
- return null;
-
- int tFreeSpace = aMachine.getCapacity() - (aMachine.getFillableStack() != null ? aMachine.getFillableStack().amount : 0);
- if (tFreeSpace <= 0)
- // no space left
- return null;
-
- // find out how much fluid can be taken
- // some cells cannot be partially filled
- ItemStack tStackEmptied = null;
- int tAmountTaken = 0;
- if (tFreeSpace >= aFluidHeld.amount) {
- // fully accepted - try take it from item now
- // IFluidContainerItem is intentionally not checked here. it will be checked later
- tStackEmptied = GT_Utility.getContainerForFilledItem(tStackSizedOne, false);
- tAmountTaken = aFluidHeld.amount;
- }
- if (tStackEmptied == null && tStackSizedOne.getItem() instanceof IFluidContainerItem) {
- // either partially accepted, or is IFluidContainerItem
- IFluidContainerItem container = (IFluidContainerItem) tStackSizedOne.getItem();
- FluidStack tDrained = container.drain(tStackSizedOne, tFreeSpace, true);
- if (tDrained != null && tDrained.amount > 0) {
- // something is actually drained - change the cell and drop it to player
- tStackEmptied = tStackSizedOne;
- tAmountTaken = tDrained.amount;
- }
- }
- if (tStackEmptied == null)
- // somehow the cell refuse to give out that amount of fluid, no op then
- return null;
-
- // find out how many fill can we do
- // same round down behavior as above
- // however here the fluid stack is not changed at all, so the exact code will slightly differ
- int tParallel = aProcessFullStack ? Math.min(tFreeSpace / tAmountTaken, tStackHeld.stackSize) : 1;
- if (aMachine.getFillableStack() == null) {
- FluidStack tNewFillableStack = aFluidHeld.copy();
- tNewFillableStack.amount = tAmountTaken * tParallel;
- aMachine.setFillableStack(tNewFillableStack);
- } else {
- aMachine.getFillableStack().amount += tAmountTaken * tParallel;
- }
- tStackEmptied.stackSize = tParallel;
- replaceCursorItemStack(aPlayer, tStackEmptied);
- return tStackEmptied;
- }
-
- private void replaceCursorItemStack(EntityPlayer aPlayer, ItemStack tStackResult) {
- int tStackResultMaxStackSize = tStackResult.getMaxStackSize();
- while (tStackResult.stackSize > tStackResultMaxStackSize) {
- aPlayer.inventory.getItemStack().stackSize -= tStackResultMaxStackSize;
- GT_Utility.addItemToPlayerInventory(aPlayer, tStackResult.splitStack(tStackResultMaxStackSize));
- }
- if (aPlayer.inventory.getItemStack().stackSize == tStackResult.stackSize) {
- // every cell is mutated. it could just stay on the cursor.
- aPlayer.inventory.setItemStack(tStackResult);
- } else {
- // some cells not mutated. The mutated cells must go into the inventory
- // or drop into the world if there isn't enough space.
- ItemStack tStackHeld = aPlayer.inventory.getItemStack();
- tStackHeld.stackSize -= tStackResult.stackSize;
- GT_Utility.addItemToPlayerInventory(aPlayer, tStackResult);
- }
- }
-
@Override
public void detectAndSendChanges() {
super.detectAndSendChanges();