From 390ad875ee608654afca078db58031a19214063e Mon Sep 17 00:00:00 2001 From: fscan Date: Wed, 1 Aug 2018 00:19:49 +0200 Subject: [PATCH] Fix Platform#postChanges to check all registered channels (#3644) --- .../appeng/api/storage/IStorageHelper.java | 13 +++++ src/main/java/appeng/core/api/ApiStorage.java | 12 ++++ src/main/java/appeng/util/Platform.java | 57 ++++++------------- 3 files changed, 43 insertions(+), 39 deletions(-) diff --git a/src/api/java/appeng/api/storage/IStorageHelper.java b/src/api/java/appeng/api/storage/IStorageHelper.java index 91328c7f9..3f3e97ac4 100644 --- a/src/api/java/appeng/api/storage/IStorageHelper.java +++ b/src/api/java/appeng/api/storage/IStorageHelper.java @@ -28,6 +28,7 @@ import java.util.Collection; import javax.annotation.Nonnull; +import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import appeng.api.config.Actionable; @@ -35,6 +36,7 @@ import appeng.api.networking.crafting.ICraftingLink; import appeng.api.networking.crafting.ICraftingRequester; import appeng.api.networking.energy.IEnergySource; import appeng.api.networking.security.IActionSource; +import appeng.api.networking.storage.IStorageGrid; import appeng.api.storage.data.IAEFluidStack; import appeng.api.storage.data.IAEItemStack; import appeng.api.storage.data.IAEStack; @@ -116,4 +118,15 @@ public interface IStorageHelper * @return items not inserted or {@code null} if everything was inserted. */ > T poweredInsert( final IEnergySource energy, final IMEInventory inv, final T input, final IActionSource src, final Actionable mode ); + + /** + * Posts alteration of stored items to the provided {@link IStorageGrid}. + * This can be used by cell containers to notify the grid of storage cell changes. + * + * @param gs the storage grid. + * @param removedCell the removed cell itemstack + * @param addedCell the added cell itemstack + * @param src the action source + */ + void postChanges( @Nonnull final IStorageGrid gs, @Nonnull final ItemStack removedCell, @Nonnull final ItemStack addedCell, @Nonnull final IActionSource src ); } diff --git a/src/main/java/appeng/core/api/ApiStorage.java b/src/main/java/appeng/core/api/ApiStorage.java index 083d71e28..3fa4b90c8 100644 --- a/src/main/java/appeng/core/api/ApiStorage.java +++ b/src/main/java/appeng/core/api/ApiStorage.java @@ -39,6 +39,7 @@ import appeng.api.networking.crafting.ICraftingLink; import appeng.api.networking.crafting.ICraftingRequester; import appeng.api.networking.energy.IEnergySource; import appeng.api.networking.security.IActionSource; +import appeng.api.networking.storage.IStorageGrid; import appeng.api.storage.IMEInventory; import appeng.api.storage.IStorageChannel; import appeng.api.storage.IStorageHelper; @@ -119,6 +120,17 @@ public class ApiStorage implements IStorageHelper return Platform.poweredExtraction( energy, inv, request, src, mode ); } + @Override + public void postChanges( IStorageGrid gs, ItemStack removedCell, ItemStack addedCell, IActionSource src ) + { + Preconditions.checkNotNull( gs ); + Preconditions.checkNotNull( removedCell ); + Preconditions.checkNotNull( addedCell ); + Preconditions.checkNotNull( src ); + + Platform.postChanges( gs, removedCell, addedCell, src ); + } + private static final class ItemStorageChannel implements IItemStorageChannel { diff --git a/src/main/java/appeng/util/Platform.java b/src/main/java/appeng/util/Platform.java index 128791805..03ccfd0d4 100644 --- a/src/main/java/appeng/util/Platform.java +++ b/src/main/java/appeng/util/Platform.java @@ -101,8 +101,7 @@ import appeng.api.networking.storage.IStorageGrid; import appeng.api.storage.IMEInventory; import appeng.api.storage.IMEMonitor; import appeng.api.storage.IMEMonitorHandlerReceiver; -import appeng.api.storage.channels.IFluidStorageChannel; -import appeng.api.storage.channels.IItemStorageChannel; +import appeng.api.storage.IStorageChannel; import appeng.api.storage.data.IAEFluidStack; import appeng.api.storage.data.IAEItemStack; import appeng.api.storage.data.IAEStack; @@ -1281,56 +1280,36 @@ public class Platform return input; } + @SuppressWarnings( { "rawtypes", "unchecked" } ) public static void postChanges( final IStorageGrid gs, final ItemStack removed, final ItemStack added, final IActionSource src ) { - - final IItemStorageChannel itemChannel = AEApi.instance().storage().getStorageChannel( IItemStorageChannel.class ); - final IFluidStorageChannel fluidChannel = AEApi.instance().storage().getStorageChannel( IFluidStorageChannel.class ); - final IItemList itemChanges = itemChannel.createList(); - final IItemList fluidChanges = fluidChannel.createList(); - - if( !removed.isEmpty() ) + for( final IStorageChannel chan : AEApi.instance().storage().storageChannels() ) { - final IMEInventory myItems = AEApi.instance().registries().cell().getCellInventory( removed, null, itemChannel ); + final IItemList myChanges = chan.createList(); - if( myItems != null ) + if( !removed.isEmpty() ) { - for( final IAEItemStack is : myItems.getAvailableItems( itemChanges ) ) + final IMEInventory myInv = AEApi.instance().registries().cell().getCellInventory( removed, null, chan ); + if( myInv != null ) { - is.setStackSize( -is.getStackSize() ); + myInv.getAvailableItems( myChanges ); + for( final IAEStack is : myChanges ) + { + is.setStackSize( -is.getStackSize() ); + } } } - - final IMEInventory myFluids = AEApi.instance().registries().cell().getCellInventory( removed, null, fluidChannel ); - - if( myFluids != null ) + if( !added.isEmpty() ) { - for( final IAEFluidStack is : myFluids.getAvailableItems( fluidChanges ) ) + final IMEInventory myInv = AEApi.instance().registries().cell().getCellInventory( added, null, chan ); + if( myInv != null ) { - is.setStackSize( -is.getStackSize() ); + myInv.getAvailableItems( myChanges ); } + } + gs.postAlterationOfStoredItems( chan, myChanges, src ); } - - if( !added.isEmpty() ) - { - final IMEInventory myItems = AEApi.instance().registries().cell().getCellInventory( added, null, itemChannel ); - - if( myItems != null ) - { - myItems.getAvailableItems( itemChanges ); - } - - final IMEInventory myFluids = AEApi.instance().registries().cell().getCellInventory( added, null, fluidChannel ); - - if( myFluids != null ) - { - myFluids.getAvailableItems( fluidChanges ); - } - } - - gs.postAlterationOfStoredItems( itemChannel, itemChanges, src ); - gs.postAlterationOfStoredItems( fluidChannel, fluidChanges, src ); } public static > void postListChanges( final IItemList before, final IItemList after, final IMEMonitorHandlerReceiver meMonitorPassthrough, final IActionSource source )