Allow extraction for Condenser (#3179)
fixes #2960, fixes #2017, fixes #2602
This commit is contained in:
@@ -19,23 +19,37 @@
|
|||||||
package appeng.tile.misc;
|
package appeng.tile.misc;
|
||||||
|
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.Map.Entry;
|
||||||
|
|
||||||
|
import net.minecraft.item.ItemStack;
|
||||||
|
|
||||||
import appeng.api.AEApi;
|
import appeng.api.AEApi;
|
||||||
import appeng.api.config.AccessRestriction;
|
import appeng.api.config.AccessRestriction;
|
||||||
import appeng.api.config.Actionable;
|
import appeng.api.config.Actionable;
|
||||||
import appeng.api.networking.security.IActionSource;
|
import appeng.api.networking.security.IActionSource;
|
||||||
|
import appeng.api.networking.ticking.TickRateModulation;
|
||||||
import appeng.api.storage.IMEMonitor;
|
import appeng.api.storage.IMEMonitor;
|
||||||
import appeng.api.storage.IMEMonitorHandlerReceiver;
|
import appeng.api.storage.IMEMonitorHandlerReceiver;
|
||||||
import appeng.api.storage.IStorageChannel;
|
import appeng.api.storage.IStorageChannel;
|
||||||
import appeng.api.storage.channels.IItemStorageChannel;
|
import appeng.api.storage.channels.IItemStorageChannel;
|
||||||
import appeng.api.storage.data.IAEItemStack;
|
import appeng.api.storage.data.IAEItemStack;
|
||||||
import appeng.api.storage.data.IItemList;
|
import appeng.api.storage.data.IItemList;
|
||||||
|
import appeng.me.helpers.BaseActionSource;
|
||||||
|
import appeng.me.storage.ITickingMonitor;
|
||||||
|
import appeng.util.item.AEItemStack;
|
||||||
import appeng.util.item.ItemList;
|
import appeng.util.item.ItemList;
|
||||||
|
|
||||||
|
|
||||||
class CondenserItemInventory implements IMEMonitor<IAEItemStack>
|
class CondenserItemInventory implements IMEMonitor<IAEItemStack>, ITickingMonitor
|
||||||
{
|
{
|
||||||
|
private final HashMap<IMEMonitorHandlerReceiver<IAEItemStack>, Object> listeners = new HashMap<>();
|
||||||
private final TileCondenser target;
|
private final TileCondenser target;
|
||||||
|
private boolean hasChanged = true;
|
||||||
|
private final ItemList cachedList = new ItemList();
|
||||||
|
private IActionSource actionSource = new BaseActionSource();
|
||||||
|
private ItemList changeSet = new ItemList();
|
||||||
|
|
||||||
CondenserItemInventory( final TileCondenser te )
|
CondenserItemInventory( final TileCondenser te )
|
||||||
{
|
{
|
||||||
@@ -49,30 +63,46 @@ class CondenserItemInventory implements IMEMonitor<IAEItemStack>
|
|||||||
{
|
{
|
||||||
this.target.addPower( input.getStackSize() );
|
this.target.addPower( input.getStackSize() );
|
||||||
}
|
}
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public IAEItemStack extractItems( final IAEItemStack request, final Actionable mode, final IActionSource src )
|
public IAEItemStack extractItems( final IAEItemStack request, final Actionable mode, final IActionSource src )
|
||||||
{
|
{
|
||||||
return null;
|
AEItemStack ret = null;
|
||||||
|
ItemStack slotItem = target.getOutputSlot().getStackInSlot( 0 );
|
||||||
|
if( !slotItem.isEmpty() && request.isSameType( slotItem ) )
|
||||||
|
{
|
||||||
|
int count = (int) Math.min( request.getStackSize(), Integer.MAX_VALUE );
|
||||||
|
ret = AEItemStack.fromItemStack( target.getOutputSlot().extractItem( 0, count, mode == Actionable.SIMULATE ) );
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public IItemList<IAEItemStack> getAvailableItems( final IItemList out )
|
public IItemList<IAEItemStack> getAvailableItems( final IItemList<IAEItemStack> out )
|
||||||
{
|
{
|
||||||
|
if( !target.getOutputSlot().getStackInSlot( 0 ).isEmpty() )
|
||||||
|
{
|
||||||
|
out.add( AEItemStack.fromItemStack( target.getOutputSlot().getStackInSlot( 0 ) ) );
|
||||||
|
}
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public IItemList<IAEItemStack> getStorageList()
|
public IItemList<IAEItemStack> getStorageList()
|
||||||
{
|
{
|
||||||
return new ItemList();
|
if( this.hasChanged )
|
||||||
|
{
|
||||||
|
this.hasChanged = false;
|
||||||
|
this.cachedList.resetStatus();
|
||||||
|
return this.getAvailableItems( this.cachedList );
|
||||||
|
}
|
||||||
|
return this.cachedList;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public IStorageChannel getChannel()
|
public IStorageChannel<IAEItemStack> getChannel()
|
||||||
{
|
{
|
||||||
return AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class );
|
return AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class );
|
||||||
}
|
}
|
||||||
@@ -80,7 +110,7 @@ class CondenserItemInventory implements IMEMonitor<IAEItemStack>
|
|||||||
@Override
|
@Override
|
||||||
public AccessRestriction getAccess()
|
public AccessRestriction getAccess()
|
||||||
{
|
{
|
||||||
return AccessRestriction.WRITE;
|
return AccessRestriction.READ_WRITE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -114,14 +144,62 @@ class CondenserItemInventory implements IMEMonitor<IAEItemStack>
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void addListener( IMEMonitorHandlerReceiver<IAEItemStack> l, Object verificationToken )
|
public void addListener( final IMEMonitorHandlerReceiver<IAEItemStack> l, final Object verificationToken )
|
||||||
{
|
{
|
||||||
// Not implemented since the Condenser automatically voids everything, and there are no updates
|
this.listeners.put( l, verificationToken );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void removeListener( IMEMonitorHandlerReceiver<IAEItemStack> l )
|
public void removeListener( final IMEMonitorHandlerReceiver<IAEItemStack> l )
|
||||||
{
|
{
|
||||||
// Not implemented since we don't remember registered listeners anyway
|
this.listeners.remove( l );
|
||||||
|
}
|
||||||
|
|
||||||
|
public void updateOutput( ItemStack added, ItemStack removed )
|
||||||
|
{
|
||||||
|
this.hasChanged = true;
|
||||||
|
if( !added.isEmpty() )
|
||||||
|
{
|
||||||
|
this.changeSet.add( AEItemStack.fromItemStack( added ) );
|
||||||
|
}
|
||||||
|
if( !removed.isEmpty() )
|
||||||
|
{
|
||||||
|
this.changeSet.add( AEItemStack.fromItemStack( removed ).setStackSize( -removed.getCount() ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TickRateModulation onTick()
|
||||||
|
{
|
||||||
|
final ItemList currentChanges = this.changeSet;
|
||||||
|
|
||||||
|
if( currentChanges.isEmpty() )
|
||||||
|
{
|
||||||
|
return TickRateModulation.IDLE;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.changeSet = new ItemList();
|
||||||
|
final Iterator<Entry<IMEMonitorHandlerReceiver<IAEItemStack>, Object>> i = this.listeners.entrySet().iterator();
|
||||||
|
while( i.hasNext() )
|
||||||
|
{
|
||||||
|
final Entry<IMEMonitorHandlerReceiver<IAEItemStack>, Object> l = i.next();
|
||||||
|
final IMEMonitorHandlerReceiver<IAEItemStack> key = l.getKey();
|
||||||
|
if( key.isValid( l.getValue() ) )
|
||||||
|
{
|
||||||
|
key.postChange( this, currentChanges, this.actionSource );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
i.remove();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return TickRateModulation.URGENT;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setActionSource( IActionSource actionSource )
|
||||||
|
{
|
||||||
|
this.actionSource = actionSource;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -55,6 +55,8 @@ import appeng.util.ConfigManager;
|
|||||||
import appeng.util.IConfigManagerHost;
|
import appeng.util.IConfigManagerHost;
|
||||||
import appeng.util.inv.InvOperation;
|
import appeng.util.inv.InvOperation;
|
||||||
import appeng.util.inv.WrapperChainedItemHandler;
|
import appeng.util.inv.WrapperChainedItemHandler;
|
||||||
|
import appeng.util.inv.WrapperFilteredItemHandler;
|
||||||
|
import appeng.util.inv.filter.AEItemFilters;
|
||||||
|
|
||||||
|
|
||||||
public class TileCondenser extends AEBaseInvTile implements IConfigManagerHost, IConfigurableObject
|
public class TileCondenser extends AEBaseInvTile implements IConfigManagerHost, IConfigurableObject
|
||||||
@@ -62,14 +64,16 @@ public class TileCondenser extends AEBaseInvTile implements IConfigManagerHost,
|
|||||||
|
|
||||||
public static final int BYTE_MULTIPLIER = 8;
|
public static final int BYTE_MULTIPLIER = 8;
|
||||||
|
|
||||||
private final AppEngInternalInventory inv = new AppEngInternalInventory( this, 2 );
|
|
||||||
private final ConfigManager cm = new ConfigManager( this );
|
private final ConfigManager cm = new ConfigManager( this );
|
||||||
|
|
||||||
|
private final AppEngInternalInventory outputSlot = new AppEngInternalInventory( this, 1 );
|
||||||
|
private final AppEngInternalInventory storageSlot = new AppEngInternalInventory( this, 1 );
|
||||||
private final IItemHandler inputSlot = new CondenseItemHandler();
|
private final IItemHandler inputSlot = new CondenseItemHandler();
|
||||||
private final IFluidHandler fluidHandler = new FluidHandler();
|
private final IFluidHandler fluidHandler = new FluidHandler();
|
||||||
private final MEHandler meHandler = new MEHandler();
|
private final MEHandler meHandler = new MEHandler();
|
||||||
|
|
||||||
private final IItemHandler combinedInv = new WrapperChainedItemHandler( this.inputSlot, this.inv );
|
private final IItemHandler externalInv = new WrapperChainedItemHandler( this.inputSlot, new WrapperFilteredItemHandler( this.outputSlot, AEItemFilters.EXTRACT_ONLY ) );
|
||||||
|
private final IItemHandler combinedInv = new WrapperChainedItemHandler( this.inputSlot, this.outputSlot, this.storageSlot );
|
||||||
|
|
||||||
private double storedPower = 0;
|
private double storedPower = 0;
|
||||||
|
|
||||||
@@ -97,7 +101,7 @@ public class TileCondenser extends AEBaseInvTile implements IConfigManagerHost,
|
|||||||
|
|
||||||
public double getStorage()
|
public double getStorage()
|
||||||
{
|
{
|
||||||
final ItemStack is = this.inv.getStackInSlot( 1 );
|
final ItemStack is = this.storageSlot.getStackInSlot( 0 );
|
||||||
if( !is.isEmpty() )
|
if( !is.isEmpty() )
|
||||||
{
|
{
|
||||||
if( is.getItem() instanceof IStorageComponent )
|
if( is.getItem() instanceof IStorageComponent )
|
||||||
@@ -135,7 +139,7 @@ public class TileCondenser extends AEBaseInvTile implements IConfigManagerHost,
|
|||||||
|
|
||||||
private boolean canAddOutput( final ItemStack output )
|
private boolean canAddOutput( final ItemStack output )
|
||||||
{
|
{
|
||||||
return this.inv.insertItem( 0, output, true ).isEmpty();
|
return this.outputSlot.insertItem( 0, output, true ).isEmpty();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -145,7 +149,12 @@ public class TileCondenser extends AEBaseInvTile implements IConfigManagerHost,
|
|||||||
*/
|
*/
|
||||||
private void addOutput( final ItemStack output )
|
private void addOutput( final ItemStack output )
|
||||||
{
|
{
|
||||||
this.inv.insertItem( 0, output, false );
|
this.outputSlot.insertItem( 0, output, false );
|
||||||
|
}
|
||||||
|
|
||||||
|
IItemHandler getOutputSlot()
|
||||||
|
{
|
||||||
|
return this.outputSlot;
|
||||||
}
|
}
|
||||||
|
|
||||||
private ItemStack getOutput()
|
private ItemStack getOutput()
|
||||||
@@ -180,7 +189,10 @@ public class TileCondenser extends AEBaseInvTile implements IConfigManagerHost,
|
|||||||
@Override
|
@Override
|
||||||
public void onChangeInventory( final IItemHandler inv, final int slot, final InvOperation mc, final ItemStack removed, final ItemStack added )
|
public void onChangeInventory( final IItemHandler inv, final int slot, final InvOperation mc, final ItemStack removed, final ItemStack added )
|
||||||
{
|
{
|
||||||
// nothing
|
if( inv == this.outputSlot )
|
||||||
|
{
|
||||||
|
this.meHandler.outputChanged( added, removed );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -225,7 +237,7 @@ public class TileCondenser extends AEBaseInvTile implements IConfigManagerHost,
|
|||||||
{
|
{
|
||||||
if( capability == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY )
|
if( capability == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY )
|
||||||
{
|
{
|
||||||
return (T) this.inputSlot;
|
return (T) this.externalInv;
|
||||||
}
|
}
|
||||||
else if( capability == CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY )
|
else if( capability == CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY )
|
||||||
{
|
{
|
||||||
@@ -336,6 +348,11 @@ public class TileCondenser extends AEBaseInvTile implements IConfigManagerHost,
|
|||||||
|
|
||||||
private final CondenserItemInventory itemInventory = new CondenserItemInventory( TileCondenser.this );
|
private final CondenserItemInventory itemInventory = new CondenserItemInventory( TileCondenser.this );
|
||||||
|
|
||||||
|
void outputChanged( ItemStack added, ItemStack removed )
|
||||||
|
{
|
||||||
|
itemInventory.updateOutput( added, removed );
|
||||||
|
}
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
@Override
|
@Override
|
||||||
public IStorageMonitorable getInventory( IActionSource src )
|
public IStorageMonitorable getInventory( IActionSource src )
|
||||||
|
|||||||
Reference in New Issue
Block a user