Compare commits

...

4 Commits

Author SHA1 Message Date
yueh 720b38442e Merge pull request #1034 from yueh/feature-improve-meinventoryhandler-getaccess
Improved MEInventoryHandler.getAccess()
2015-03-16 11:29:57 +01:00
yueh 136f5d7314 Merge pull request #1037 from yueh/fix-1030
Fixes #1030 IndexOutOfBoundsException caused by using wrong index
2015-03-16 11:23:49 +01:00
yueh a83e4b7c3d Fixes #1030 IndexOutOfBoundsException caused by using wrong index 2015-03-15 19:55:58 +01:00
yueh 1bb0109c45 Improved MEInventoryHandler.getAccess()
Changed the public fields to setters and getters
Added a cache for the evaluated values instead of calculating with each
access
2015-03-15 19:43:12 +01:00
8 changed files with 111 additions and 56 deletions
@@ -195,23 +195,26 @@ public class PacketNEIRecipe extends AppEngPacket
// If that doesn't work, grab from the player's inventory // If that doesn't work, grab from the player's inventory
if ( whichItem == null && playerInventory != null ) if ( whichItem == null && playerInventory != null )
{ {
ItemStack playerItemStack = null; for ( int y = 0; y < this.recipe[x].length; y++ )
for ( int y = 0; y < playerInventory.getSizeInventory(); y++ )
{ {
// check if the item in slot y matches the required item. ItemStack playerItemStack = null;
playerItemStack = playerInventory.getStackInSlot( y ); for ( int i = 0; i < playerInventory.getSizeInventory(); i++ )
if ( playerItemStack != null && playerItemStack.getItem() == this.recipe[x][y].getItem() )
{ {
if ( realForFake == Actionable.SIMULATE ) // check if the item in slot y matches the required item.
playerItemStack = playerInventory.getStackInSlot( i );
if ( playerItemStack != null && playerItemStack.getItem() == this.recipe[x][y].getItem() )
{ {
whichItem = playerInventory.getStackInSlot( y ).copy(); if ( realForFake == Actionable.SIMULATE )
whichItem.stackSize = 1; {
whichItem = playerInventory.getStackInSlot( i ).copy();
whichItem.stackSize = 1;
}
else
{
whichItem = playerInventory.decrStackSize( i, 1 );
}
break;
} }
else
{
whichItem = playerInventory.decrStackSize( y, 1 );
}
break;
} }
} }
} }
@@ -101,14 +101,14 @@ public class CellInventoryHandler extends MEInventoryHandler<IAEItemStack> imple
priorityList.add( AEItemStack.create( is ) ); priorityList.add( AEItemStack.create( is ) );
} }
this.myWhitelist = hasInverter ? IncludeExclude.BLACKLIST : IncludeExclude.WHITELIST; this.setWhitelist( hasInverter ? IncludeExclude.BLACKLIST : IncludeExclude.WHITELIST );
if ( !priorityList.isEmpty() ) if ( !priorityList.isEmpty() )
{ {
if ( hasFuzzy ) if ( hasFuzzy )
this.myPartitionList = new FuzzyPriorityList<IAEItemStack>( priorityList, fzMode ); this.setPartitionList( new FuzzyPriorityList<IAEItemStack>( priorityList, fzMode ) );
else else
this.myPartitionList = new PrecisePriorityList<IAEItemStack>( priorityList ); this.setPartitionList( new PrecisePriorityList<IAEItemStack>( priorityList ) );
} }
} }
} }
@@ -116,19 +116,19 @@ public class CellInventoryHandler extends MEInventoryHandler<IAEItemStack> imple
@Override @Override
public boolean isPreformatted() public boolean isPreformatted()
{ {
return ! this.myPartitionList.isEmpty(); return ! this.getPartitionList().isEmpty();
} }
@Override @Override
public boolean isFuzzy() public boolean isFuzzy()
{ {
return this.myPartitionList instanceof FuzzyPriorityList; return this.getPartitionList() instanceof FuzzyPriorityList;
} }
@Override @Override
public IncludeExclude getIncludeExcludeMode() public IncludeExclude getIncludeExcludeMode()
{ {
return this.myWhitelist; return this.getWhitelist();
} }
public int getStatusForCell() public int getStatusForCell()
@@ -18,6 +18,7 @@
package appeng.me.storage; package appeng.me.storage;
import appeng.api.config.AccessRestriction; import appeng.api.config.AccessRestriction;
import appeng.api.config.Actionable; import appeng.api.config.Actionable;
import appeng.api.config.IncludeExclude; import appeng.api.config.IncludeExclude;
@@ -31,6 +32,7 @@ import appeng.api.storage.data.IItemList;
import appeng.util.prioitylist.DefaultPriorityList; import appeng.util.prioitylist.DefaultPriorityList;
import appeng.util.prioitylist.IPartitionList; import appeng.util.prioitylist.IPartitionList;
public class MEInventoryHandler<T extends IAEStack<T>> implements IMEInventoryHandler<T> public class MEInventoryHandler<T extends IAEStack<T>> implements IMEInventoryHandler<T>
{ {
@@ -38,24 +40,78 @@ public class MEInventoryHandler<T extends IAEStack<T>> implements IMEInventoryHa
final protected IMEMonitor<T> monitor; final protected IMEMonitor<T> monitor;
final protected IMEInventoryHandler<T> internal; final protected IMEInventoryHandler<T> internal;
public int myPriority = 0; private int myPriority;
public IncludeExclude myWhitelist = IncludeExclude.WHITELIST; private IncludeExclude myWhitelist;
public AccessRestriction myAccess = AccessRestriction.READ_WRITE; private AccessRestriction myAccess;
public IPartitionList<T> myPartitionList = new DefaultPriorityList<T>(); private IPartitionList<T> myPartitionList;
public MEInventoryHandler(IMEInventory<T> i, StorageChannel channel) { private AccessRestriction cachedAccessRestriction;
private boolean hasReadAccess;
private boolean hasWriteAccess;
public MEInventoryHandler( IMEInventory<T> i, StorageChannel channel )
{
this.channel = channel; this.channel = channel;
if ( i instanceof IMEInventoryHandler ) if ( i instanceof IMEInventoryHandler )
this.internal = (IMEInventoryHandler<T>) i; this.internal = ( IMEInventoryHandler<T> ) i;
else else
this.internal = new MEPassThrough<T>( i, channel ); this.internal = new MEPassThrough<T>( i, channel );
this.monitor = this.internal instanceof IMEMonitor ? (IMEMonitor<T>) this.internal : null; this.monitor = this.internal instanceof IMEMonitor ? ( IMEMonitor<T> ) this.internal : null;
this.setPriority( 0 );
this.setWhitelist( IncludeExclude.WHITELIST );
this.setBaseAccess( AccessRestriction.READ_WRITE );
this.setPartitionList( new DefaultPriorityList<T>() );
} }
@Override @Override
public T injectItems(T input, Actionable type, BaseActionSource src) public int getPriority()
{
return this.myPriority;
}
public void setPriority( int myPriority )
{
this.myPriority = myPriority;
}
public IncludeExclude getWhitelist()
{
return this.myWhitelist;
}
public void setWhitelist( IncludeExclude myWhitelist )
{
this.myWhitelist = myWhitelist;
}
public AccessRestriction getBaseAccess()
{
return this.myAccess;
}
public void setBaseAccess( AccessRestriction myAccess )
{
this.myAccess = myAccess;
this.cachedAccessRestriction = this.myAccess.restrictPermissions( this.internal.getAccess() );
this.hasReadAccess = this.getAccess().hasPermission( AccessRestriction.READ );
this.hasWriteAccess = this.getAccess().hasPermission( AccessRestriction.WRITE );
}
public IPartitionList<T> getPartitionList()
{
return this.myPartitionList;
}
public void setPartitionList( IPartitionList<T> myPartitionList )
{
this.myPartitionList = myPartitionList;
}
@Override
public T injectItems( T input, Actionable type, BaseActionSource src )
{ {
if ( !this.canAccept( input ) ) if ( !this.canAccept( input ) )
return input; return input;
@@ -64,18 +120,18 @@ public class MEInventoryHandler<T extends IAEStack<T>> implements IMEInventoryHa
} }
@Override @Override
public T extractItems(T request, Actionable type, BaseActionSource src) public T extractItems( T request, Actionable type, BaseActionSource src )
{ {
if ( !this.getAccess().hasPermission( AccessRestriction.READ ) ) if ( !hasReadAccess )
return null; return null;
return this.internal.extractItems( request, type, src ); return this.internal.extractItems( request, type, src );
} }
@Override @Override
public IItemList<T> getAvailableItems(IItemList<T> out) public IItemList<T> getAvailableItems( IItemList<T> out )
{ {
if ( !this.getAccess().hasPermission( AccessRestriction.READ ) ) if ( !hasReadAccess )
return out; return out;
return this.internal.getAvailableItems( out ); return this.internal.getAvailableItems( out );
@@ -90,11 +146,11 @@ public class MEInventoryHandler<T extends IAEStack<T>> implements IMEInventoryHa
@Override @Override
public AccessRestriction getAccess() public AccessRestriction getAccess()
{ {
return this.myAccess.restrictPermissions( this.internal.getAccess() ); return this.cachedAccessRestriction;
} }
@Override @Override
public boolean isPrioritized(T input) public boolean isPrioritized( T input )
{ {
if ( this.myWhitelist == IncludeExclude.WHITELIST ) if ( this.myWhitelist == IncludeExclude.WHITELIST )
return this.myPartitionList.isListed( input ) || this.internal.isPrioritized( input ); return this.myPartitionList.isListed( input ) || this.internal.isPrioritized( input );
@@ -102,9 +158,9 @@ public class MEInventoryHandler<T extends IAEStack<T>> implements IMEInventoryHa
} }
@Override @Override
public boolean canAccept(T input) public boolean canAccept( T input )
{ {
if ( !this.getAccess().hasPermission( AccessRestriction.WRITE ) ) if ( !hasWriteAccess )
return false; return false;
if ( this.myWhitelist == IncludeExclude.BLACKLIST && this.myPartitionList.isListed( input ) ) if ( this.myWhitelist == IncludeExclude.BLACKLIST && this.myPartitionList.isListed( input ) )
@@ -114,12 +170,6 @@ public class MEInventoryHandler<T extends IAEStack<T>> implements IMEInventoryHa
return this.myPartitionList.isListed( input ) && this.internal.canAccept( input ); return this.myPartitionList.isListed( input ) && this.internal.canAccept( input );
} }
@Override
public int getPriority()
{
return this.myPriority;
}
@Override @Override
public int getSlot() public int getSlot()
{ {
@@ -132,7 +182,7 @@ public class MEInventoryHandler<T extends IAEStack<T>> implements IMEInventoryHa
} }
@Override @Override
public boolean validForPass(int i) public boolean validForPass( int i )
{ {
return true; return true;
} }
@@ -24,6 +24,7 @@ import java.util.Iterator;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.NavigableMap; import java.util.NavigableMap;
import java.util.TreeMap;
import java.util.concurrent.ConcurrentSkipListMap; import java.util.concurrent.ConcurrentSkipListMap;
import appeng.api.config.AccessRestriction; import appeng.api.config.AccessRestriction;
@@ -64,7 +65,7 @@ public class NetworkInventoryHandler<T extends IAEStack<T>> implements IMEInvent
public NetworkInventoryHandler(StorageChannel chan, SecurityCache security) { public NetworkInventoryHandler(StorageChannel chan, SecurityCache security) {
this.myChannel = chan; this.myChannel = chan;
this.security = security; this.security = security;
this.priorityInventory = new ConcurrentSkipListMap<Integer, List<IMEInventoryHandler<T>>>( PRIORITY_SORTER ); // TreeMultimap.create( prioritySorter, hashSorter ); this.priorityInventory = new TreeMap<Integer, List<IMEInventoryHandler<T>>>( PRIORITY_SORTER ); // TreeMultimap.create( prioritySorter, hashSorter );
} }
public void addNewStorage(IMEInventoryHandler<T> h) public void addNewStorage(IMEInventoryHandler<T> h)
@@ -313,9 +313,10 @@ public class PartFormationPlane extends PartUpgradeable implements ICellContaine
private void updateHandler() private void updateHandler()
{ {
this.myHandler.myAccess = AccessRestriction.WRITE; this.myHandler.setBaseAccess( AccessRestriction.WRITE );
this.myHandler.myWhitelist = this.getInstalledUpgrades( Upgrades.INVERTER ) > 0 ? IncludeExclude.BLACKLIST : IncludeExclude.WHITELIST; ;
this.myHandler.myPriority = this.priority; this.myHandler.setWhitelist( this.getInstalledUpgrades( Upgrades.INVERTER ) > 0 ? IncludeExclude.BLACKLIST : IncludeExclude.WHITELIST );
this.myHandler.setPriority( this.priority );
IItemList<IAEItemStack> priorityList = AEApi.instance().storage().createItemList(); IItemList<IAEItemStack> priorityList = AEApi.instance().storage().createItemList();
@@ -328,9 +329,9 @@ public class PartFormationPlane extends PartUpgradeable implements ICellContaine
} }
if ( this.getInstalledUpgrades( Upgrades.FUZZY ) > 0 ) if ( this.getInstalledUpgrades( Upgrades.FUZZY ) > 0 )
this.myHandler.myPartitionList = new FuzzyPriorityList( priorityList, ( FuzzyMode ) this.getConfigManager().getSetting( Settings.FUZZY_MODE ) ); this.myHandler.setPartitionList( new FuzzyPriorityList( priorityList, ( FuzzyMode ) this.getConfigManager().getSetting( Settings.FUZZY_MODE ) ) );
else else
this.myHandler.myPartitionList = new PrecisePriorityList( priorityList ); this.myHandler.setPartitionList( new PrecisePriorityList( priorityList ) );
try try
{ {
@@ -319,9 +319,9 @@ public class PartStorageBus
this.handler = new MEInventoryHandler( inv, StorageChannel.ITEMS ); this.handler = new MEInventoryHandler( inv, StorageChannel.ITEMS );
this.handler.myAccess = ( AccessRestriction ) this.getConfigManager().getSetting( Settings.ACCESS ); this.handler.setBaseAccess( ( AccessRestriction ) this.getConfigManager().getSetting( Settings.ACCESS ) );;
this.handler.myWhitelist = this.getInstalledUpgrades( Upgrades.INVERTER ) > 0 ? IncludeExclude.BLACKLIST : IncludeExclude.WHITELIST; this.handler.setWhitelist( this.getInstalledUpgrades( Upgrades.INVERTER ) > 0 ? IncludeExclude.BLACKLIST : IncludeExclude.WHITELIST );
this.handler.myPriority = this.priority; this.handler.setPriority( this.priority );
IItemList<IAEItemStack> priorityList = AEApi.instance().storage().createItemList(); IItemList<IAEItemStack> priorityList = AEApi.instance().storage().createItemList();
@@ -334,9 +334,9 @@ public class PartStorageBus
} }
if ( this.getInstalledUpgrades( Upgrades.FUZZY ) > 0 ) if ( this.getInstalledUpgrades( Upgrades.FUZZY ) > 0 )
this.handler.myPartitionList = new FuzzyPriorityList( priorityList, ( FuzzyMode ) this.getConfigManager().getSetting( Settings.FUZZY_MODE ) ); this.handler.setPartitionList( new FuzzyPriorityList( priorityList, ( FuzzyMode ) this.getConfigManager().getSetting( Settings.FUZZY_MODE ) ) );
else else
this.handler.myPartitionList = new PrecisePriorityList( priorityList ); this.handler.setPartitionList ( new PrecisePriorityList( priorityList ));
if ( inv instanceof IMEMonitor ) if ( inv instanceof IMEMonitor )
( ( IMEMonitor ) inv ).addListener( this, this.handler ); ( ( IMEMonitor ) inv ).addListener( this, this.handler );
@@ -427,7 +427,7 @@ public class TileChest extends AENetworkPowerTile implements IMEChest, IFluidHan
return null; return null;
MEInventoryHandler ih = new MEInventoryHandler( h, h.getChannel() ); MEInventoryHandler ih = new MEInventoryHandler( h, h.getChannel() );
ih.myPriority = this.priority; ih.setPriority( this.priority );
MEMonitorHandler<StackType> g = new ChestMonitorHandler<StackType>( ih ); MEMonitorHandler<StackType> g = new ChestMonitorHandler<StackType>( ih );
g.addListener( new ChestNetNotifier( h.getChannel() ), g ); g.addListener( new ChestNetNotifier( h.getChannel() ), g );
@@ -245,7 +245,7 @@ public class TileDrive extends AENetworkInvTile implements IChestOrDrive, IPrior
power += this.handlersBySlot[x].cellIdleDrain( is, cell ); power += this.handlersBySlot[x].cellIdleDrain( is, cell );
DriveWatcher<IAEItemStack> ih = new DriveWatcher( cell, is, this.handlersBySlot[x], this ); DriveWatcher<IAEItemStack> ih = new DriveWatcher( cell, is, this.handlersBySlot[x], this );
ih.myPriority = this.priority; ih.setPriority( this.priority );
this.invBySlot[x] = ih; this.invBySlot[x] = ih;
this.items.add( ih ); this.items.add( ih );
} }
@@ -258,7 +258,7 @@ public class TileDrive extends AENetworkInvTile implements IChestOrDrive, IPrior
power += this.handlersBySlot[x].cellIdleDrain( is, cell ); power += this.handlersBySlot[x].cellIdleDrain( is, cell );
DriveWatcher<IAEItemStack> ih = new DriveWatcher( cell, is, this.handlersBySlot[x], this ); DriveWatcher<IAEItemStack> ih = new DriveWatcher( cell, is, this.handlersBySlot[x], this );
ih.myPriority = this.priority; ih.setPriority( this.priority );
this.invBySlot[x] = ih; this.invBySlot[x] = ih;
this.fluids.add( ih ); this.fluids.add( ih );
} }