fluid containers can now be drained/filled from fluid interfaces
This commit is contained in:
@@ -19,9 +19,17 @@
|
||||
package appeng.fluids.container;
|
||||
|
||||
|
||||
import javax.annotation.Nonnull;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.Map;
|
||||
|
||||
import appeng.core.sync.network.NetworkHandler;
|
||||
import appeng.core.sync.packets.PacketTargetFluidStack;
|
||||
import appeng.fluids.util.AEFluidStack;
|
||||
import appeng.helpers.InventoryAction;
|
||||
import appeng.util.IConfigManagerHost;
|
||||
import net.minecraft.entity.player.EntityPlayerMP;
|
||||
import net.minecraft.entity.player.InventoryPlayer;
|
||||
import net.minecraft.inventory.IContainerListener;
|
||||
|
||||
@@ -33,12 +41,19 @@ import appeng.fluids.helper.FluidSyncHelper;
|
||||
import appeng.fluids.helper.IFluidInterfaceHost;
|
||||
import appeng.fluids.util.IAEFluidTank;
|
||||
import appeng.util.Platform;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraftforge.fluids.FluidStack;
|
||||
import net.minecraftforge.fluids.FluidUtil;
|
||||
import net.minecraftforge.fluids.capability.IFluidHandlerItem;
|
||||
|
||||
|
||||
public class ContainerFluidInterface extends ContainerFluidConfigurable
|
||||
public class ContainerFluidInterface extends ContainerFluidConfigurable implements IConfigManagerHost
|
||||
{
|
||||
private final DualityFluidInterface myDuality;
|
||||
private final FluidSyncHelper tankSync;
|
||||
private IConfigManagerHost gui;
|
||||
// Holds the fluid the client wishes to extract, or null for insert
|
||||
private IAEFluidStack clientRequestedTargetFluid = null;
|
||||
|
||||
public ContainerFluidInterface( final InventoryPlayer ip, final IFluidInterfaceHost te )
|
||||
{
|
||||
@@ -60,6 +75,15 @@ public class ContainerFluidInterface extends ContainerFluidConfigurable
|
||||
return this.myDuality.getConfig();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void updateSetting( IConfigManager manager, Enum settingName, Enum newValue )
|
||||
{
|
||||
if( this.getGui() != null )
|
||||
{
|
||||
this.getGui().updateSetting( manager, settingName, newValue );
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void detectAndSendChanges()
|
||||
{
|
||||
@@ -97,6 +121,126 @@ public class ContainerFluidInterface extends ContainerFluidConfigurable
|
||||
this.tankSync.readPacket( fluids );
|
||||
}
|
||||
|
||||
private IConfigManagerHost getGui()
|
||||
{
|
||||
return this.gui;
|
||||
}
|
||||
|
||||
public void setGui( @Nonnull final IConfigManagerHost gui )
|
||||
{
|
||||
this.gui = gui;
|
||||
}
|
||||
|
||||
public void doAction( EntityPlayerMP player, InventoryAction action, int slot, long id )
|
||||
{
|
||||
if( action != InventoryAction.FILL_ITEM && action != InventoryAction.EMPTY_ITEM )
|
||||
{
|
||||
super.doAction( player, action, slot, id );
|
||||
return;
|
||||
}
|
||||
|
||||
final ItemStack held = player.inventory.getItemStack();
|
||||
ItemStack heldCopy = held.copy();
|
||||
heldCopy.setCount( 1 );
|
||||
IFluidHandlerItem fh = FluidUtil.getFluidHandler( heldCopy );
|
||||
if( fh == null )
|
||||
{
|
||||
// only fluid handlers items
|
||||
return;
|
||||
}
|
||||
|
||||
if( action == InventoryAction.FILL_ITEM && this.clientRequestedTargetFluid != null )
|
||||
{
|
||||
final IAEFluidStack stack = this.clientRequestedTargetFluid.copy();
|
||||
|
||||
// Check how much we can store in the item
|
||||
stack.setStackSize( Integer.MAX_VALUE );
|
||||
int amountAllowed = fh.fill( stack.getFluidStack(), false );
|
||||
int heldAmount = held.getCount();
|
||||
for( int i = 0; i < heldAmount; i++ )
|
||||
{
|
||||
ItemStack copiedFluidContainer = held.copy();
|
||||
copiedFluidContainer.setCount( 1 );
|
||||
fh = FluidUtil.getFluidHandler( copiedFluidContainer );
|
||||
|
||||
FluidStack extractableFluid = this.myDuality.getTanks().drain( stack.setStackSize( amountAllowed ).getFluidStack(), false );
|
||||
if( extractableFluid == null || extractableFluid.amount == 0 )
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
int fillableAmount = fh.fill( extractableFluid, false );
|
||||
if( fillableAmount > 0 )
|
||||
{
|
||||
FluidStack extractedFluid = this.myDuality.getTanks().drain( extractableFluid, true );
|
||||
fh.fill( extractedFluid, true );
|
||||
}
|
||||
|
||||
if( held.getCount() == 1 )
|
||||
{
|
||||
player.inventory.setItemStack( fh.getContainer() );
|
||||
}
|
||||
else
|
||||
{
|
||||
player.inventory.getItemStack().shrink( 1 );
|
||||
if( !player.inventory.addItemStackToInventory( fh.getContainer() ) )
|
||||
{
|
||||
player.dropItem( fh.getContainer(), false );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else if( action == InventoryAction.EMPTY_ITEM )
|
||||
{
|
||||
int heldAmount = held.getCount();
|
||||
for( int i = 0; i < heldAmount; i++ )
|
||||
{
|
||||
ItemStack copiedFluidContainer = held.copy();
|
||||
copiedFluidContainer.setCount( 1 );
|
||||
fh = FluidUtil.getFluidHandler( copiedFluidContainer );
|
||||
|
||||
FluidStack drainable = fh.drain( this.myDuality.getTanks().getTankProperties()[slot].getCapacity(), false );
|
||||
if( drainable != null )
|
||||
{
|
||||
fh.drain( drainable, true );
|
||||
this.myDuality.getTanks().fill( drainable, true );
|
||||
}
|
||||
|
||||
if( held.getCount() == 1 )
|
||||
{
|
||||
player.inventory.setItemStack( fh.getContainer() );
|
||||
}
|
||||
else
|
||||
{
|
||||
player.inventory.getItemStack().shrink( 1 );
|
||||
if( !player.inventory.addItemStackToInventory( fh.getContainer() ) )
|
||||
{
|
||||
player.dropItem( fh.getContainer(), false );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
this.updateHeld( player );
|
||||
}
|
||||
|
||||
public void setTargetStack( final IAEFluidStack stack )
|
||||
{
|
||||
if( Platform.isClient() )
|
||||
{
|
||||
if( stack == null && this.clientRequestedTargetFluid == null )
|
||||
{
|
||||
return;
|
||||
}
|
||||
if( stack != null && this.clientRequestedTargetFluid != null && stack.getFluidStack().isFluidEqual( this.clientRequestedTargetFluid.getFluidStack() ) )
|
||||
{
|
||||
return;
|
||||
}
|
||||
NetworkHandler.instance().sendToServer( new PacketTargetFluidStack( (AEFluidStack) stack ) );
|
||||
}
|
||||
|
||||
this.clientRequestedTargetFluid = stack == null ? null : stack.copy();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean supportCapacity()
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user