/* * This file is part of Applied Energistics 2. * Copyright (c) 2013 - 2014, AlgorithmX2, All rights reserved. * * Applied Energistics 2 is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Applied Energistics 2 is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with Applied Energistics 2. If not, see . */ package appeng.crafting; import appeng.api.AEApi; import appeng.api.config.Actionable; import appeng.api.networking.security.BaseActionSource; import appeng.api.storage.IMEInventory; import appeng.api.storage.IMEMonitor; import appeng.api.storage.StorageChannel; import appeng.api.storage.data.IAEItemStack; import appeng.api.storage.data.IItemList; import appeng.util.inv.ItemListIgnoreCrafting; public class MECraftingInventory implements IMEInventory { private final MECraftingInventory par; private final IMEInventory target; private final IItemList localCache; private final boolean logExtracted; private final IItemList extractedCache; private final boolean logInjections; private final IItemList injectedCache; private final boolean logMissing; private final IItemList missingCache; public MECraftingInventory() { this.localCache = new ItemListIgnoreCrafting<>( AEApi.instance().storage().createItemList() ); this.extractedCache = null; this.injectedCache = null; this.missingCache = null; this.logExtracted = false; this.logInjections = false; this.logMissing = false; this.target = null; this.par = null; } public MECraftingInventory( final MECraftingInventory parent ) { this.target = parent; this.logExtracted = parent.logExtracted; this.logInjections = parent.logInjections; this.logMissing = parent.logMissing; if( this.logMissing ) { this.missingCache = AEApi.instance().storage().createItemList(); } else { this.missingCache = null; } if( this.logExtracted ) { this.extractedCache = AEApi.instance().storage().createItemList(); } else { this.extractedCache = null; } if( this.logInjections ) { this.injectedCache = AEApi.instance().storage().createItemList(); } else { this.injectedCache = null; } this.localCache = this.target.getAvailableItems( new ItemListIgnoreCrafting<>( AEApi.instance().storage().createItemList() ) ); this.par = parent; } public MECraftingInventory( final IMEMonitor target, final BaseActionSource src, final boolean logExtracted, final boolean logInjections, final boolean logMissing ) { this.target = target; this.logExtracted = logExtracted; this.logInjections = logInjections; this.logMissing = logMissing; if( logMissing ) { this.missingCache = AEApi.instance().storage().createItemList(); } else { this.missingCache = null; } if( logExtracted ) { this.extractedCache = AEApi.instance().storage().createItemList(); } else { this.extractedCache = null; } if( logInjections ) { this.injectedCache = AEApi.instance().storage().createItemList(); } else { this.injectedCache = null; } this.localCache = new ItemListIgnoreCrafting<>( AEApi.instance().storage().createItemList() ); for( final IAEItemStack is : target.getStorageList() ) { this.localCache.add( target.extractItems( is, Actionable.SIMULATE, src ) ); } this.par = null; } public MECraftingInventory( final IMEInventory target, final boolean logExtracted, final boolean logInjections, final boolean logMissing ) { this.target = target; this.logExtracted = logExtracted; this.logInjections = logInjections; this.logMissing = logMissing; if( logMissing ) { this.missingCache = AEApi.instance().storage().createItemList(); } else { this.missingCache = null; } if( logExtracted ) { this.extractedCache = AEApi.instance().storage().createItemList(); } else { this.extractedCache = null; } if( logInjections ) { this.injectedCache = AEApi.instance().storage().createItemList(); } else { this.injectedCache = null; } this.localCache = target.getAvailableItems( AEApi.instance().storage().createItemList() ); this.par = null; } @Override public IAEItemStack injectItems( final IAEItemStack input, final Actionable mode, final BaseActionSource src ) { if( input == null ) { return null; } if( mode == Actionable.MODULATE ) { if( this.logInjections ) { this.injectedCache.add( input ); } this.localCache.add( input ); } return null; } @Override public IAEItemStack extractItems( final IAEItemStack request, final Actionable mode, final BaseActionSource src ) { if( request == null ) { return null; } final IAEItemStack list = this.localCache.findPrecise( request ); if( list == null || list.getStackSize() == 0 ) { return null; } if( list.getStackSize() >= request.getStackSize() ) { if( mode == Actionable.MODULATE ) { list.decStackSize( request.getStackSize() ); if( this.logExtracted ) { this.extractedCache.add( request ); } } return request; } final IAEItemStack ret = request.copy(); ret.setStackSize( list.getStackSize() ); if( mode == Actionable.MODULATE ) { list.reset(); if( this.logExtracted ) { this.extractedCache.add( ret ); } } return ret; } @Override public IItemList getAvailableItems( final IItemList out ) { for( final IAEItemStack is : this.localCache ) { out.add( is ); } return out; } @Override public StorageChannel getChannel() { return StorageChannel.ITEMS; } public IItemList getItemList() { return this.localCache; } public boolean commit( final BaseActionSource src ) { final IItemList added = AEApi.instance().storage().createItemList(); final IItemList pulled = AEApi.instance().storage().createItemList(); boolean failed = false; if( this.logInjections ) { for( final IAEItemStack inject : this.injectedCache ) { IAEItemStack result = null; added.add( result = this.target.injectItems( inject, Actionable.MODULATE, src ) ); if( result != null ) { failed = true; break; } } } if( failed ) { for( final IAEItemStack is : added ) { this.target.extractItems( is, Actionable.MODULATE, src ); } return false; } if( this.logExtracted ) { for( final IAEItemStack extra : this.extractedCache ) { IAEItemStack result = null; pulled.add( result = this.target.extractItems( extra, Actionable.MODULATE, src ) ); if( result == null || result.getStackSize() != extra.getStackSize() ) { failed = true; break; } } } if( failed ) { for( final IAEItemStack is : added ) { this.target.extractItems( is, Actionable.MODULATE, src ); } for( final IAEItemStack is : pulled ) { this.target.injectItems( is, Actionable.MODULATE, src ); } return false; } if( this.logMissing && this.par != null ) { for( final IAEItemStack extra : this.missingCache ) { this.par.addMissing( extra ); } } return true; } private void addMissing( final IAEItemStack extra ) { this.missingCache.add( extra ); } void ignore( final IAEItemStack what ) { final IAEItemStack list = this.localCache.findPrecise( what ); if( list != null ) { list.setStackSize( 0 ); } } }