From 89a81f8df9d058a35ee51309ca8d81d4b4f2d688 Mon Sep 17 00:00:00 2001 From: raoulvdberge Date: Fri, 7 Sep 2018 17:35:09 +0200 Subject: [PATCH] Add priority system for external storage provider. Fixes conflicts with RS' default handlers and API users. Fixes #1979 --- .../com/raoulvdberge/refinedstorage/api/IRSAPI.java | 5 +++-- .../externalstorage/IExternalStorageProvider.java | 9 +++++++++ .../com/raoulvdberge/refinedstorage/apiimpl/API.java | 10 +++++----- .../network/node/NetworkNodeExternalStorage.java | 4 ++++ .../externalstorage/ExternalStorageProviderFluid.java | 5 +++++ .../externalstorage/ExternalStorageProviderItem.java | 5 +++++ 6 files changed, 31 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/raoulvdberge/refinedstorage/api/IRSAPI.java b/src/main/java/com/raoulvdberge/refinedstorage/api/IRSAPI.java index 01c84e1a4..464796d88 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/api/IRSAPI.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/api/IRSAPI.java @@ -35,6 +35,7 @@ import net.minecraftforge.fluids.FluidStack; import javax.annotation.Nonnull; import java.util.List; +import java.util.Set; /** * Represents a Refined Storage API implementation. @@ -154,9 +155,9 @@ public interface IRSAPI { /** * @param type the type - * @return a list of external storage providers + * @return a set of external storage providers */ - List getExternalStorageProviders(StorageType type); + Set getExternalStorageProviders(StorageType type); /** * @param world the world diff --git a/src/main/java/com/raoulvdberge/refinedstorage/api/storage/externalstorage/IExternalStorageProvider.java b/src/main/java/com/raoulvdberge/refinedstorage/api/storage/externalstorage/IExternalStorageProvider.java index 8e89cb762..76fbbe421 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/api/storage/externalstorage/IExternalStorageProvider.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/api/storage/externalstorage/IExternalStorageProvider.java @@ -27,4 +27,13 @@ public interface IExternalStorageProvider { */ @Nonnull IStorageExternal provide(IExternalStorageContext context, Supplier tile, EnumFacing direction); + + /** + * Returns the priority of this external storage provider. + * The one with the highest priority is chosen. + * Refined Storage's default handlers for {@link net.minecraftforge.items.IItemHandler} and {@link net.minecraftforge.fluids.capability.IFluidHandler} return 0. + * + * @return the priority + */ + int getPriority(); } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/API.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/API.java index 70de218a8..a2e998497 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/API.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/API.java @@ -74,7 +74,7 @@ public class API implements IRSAPI { private IStorageDiskRegistry storageDiskRegistry = new StorageDiskRegistry(); private IStorageDiskSync storageDiskSync = new StorageDiskSync(); private IOneSixMigrationHelper oneSixMigrationHelper = new OneSixMigrationHelper(); - private Map> externalStorageProviders = new HashMap<>(); + private Map> externalStorageProviders = new HashMap<>(); private List patternRenderHandlers = new LinkedList<>(); public static IRSAPI instance() { @@ -227,14 +227,14 @@ public class API implements IRSAPI { @Override public void addExternalStorageProvider(StorageType type, IExternalStorageProvider provider) { - externalStorageProviders.computeIfAbsent(type, k -> new ArrayList<>()).add(provider); + externalStorageProviders.computeIfAbsent(type, k -> new TreeSet<>((a, b) -> Integer.compare(b.getPriority(), a.getPriority()))).add(provider); } @Override - public List getExternalStorageProviders(StorageType type) { - List providers = externalStorageProviders.get(type); + public Set getExternalStorageProviders(StorageType type) { + TreeSet providers = externalStorageProviders.get(type); - return providers == null ? Collections.emptyList() : providers; + return providers == null ? Collections.emptySet() : providers; } @Override diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeExternalStorage.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeExternalStorage.java index 91b3252c0..347c42405 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeExternalStorage.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/node/NetworkNodeExternalStorage.java @@ -233,12 +233,16 @@ public class NetworkNodeExternalStorage extends NetworkNode implements IStorageP for (IExternalStorageProvider provider : API.instance().getExternalStorageProviders(StorageType.ITEM)) { if (provider.canProvide(facing, getDirection())) { itemStorages.add(provider.provide(this, () -> getFacingTile(), getDirection())); + + break; } } } else if (type == IType.FLUIDS) { for (IExternalStorageProvider provider : API.instance().getExternalStorageProviders(StorageType.FLUID)) { if (provider.canProvide(facing, getDirection())) { fluidStorages.add(provider.provide(this, () -> getFacingTile(), getDirection())); + + break; } } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/storage/externalstorage/ExternalStorageProviderFluid.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/storage/externalstorage/ExternalStorageProviderFluid.java index e38ede325..f9fa23de8 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/storage/externalstorage/ExternalStorageProviderFluid.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/storage/externalstorage/ExternalStorageProviderFluid.java @@ -23,4 +23,9 @@ public class ExternalStorageProviderFluid implements IExternalStorageProvider provide(IExternalStorageContext context, Supplier tile, EnumFacing direction) { return new StorageExternalFluid(context, () -> WorldUtils.getFluidHandler(tile.get(), direction.getOpposite()), tile.get() instanceof TileFluidInterface); } + + @Override + public int getPriority() { + return 0; + } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/storage/externalstorage/ExternalStorageProviderItem.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/storage/externalstorage/ExternalStorageProviderItem.java index 33e340550..aaf0c19e4 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/storage/externalstorage/ExternalStorageProviderItem.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/storage/externalstorage/ExternalStorageProviderItem.java @@ -33,4 +33,9 @@ public class ExternalStorageProviderItem implements IExternalStorageProvider provide(IExternalStorageContext context, Supplier tile, EnumFacing direction) { return new StorageExternalItem(context, () -> WorldUtils.getItemHandler(tile.get(), direction.getOpposite()), tile.get() instanceof TileInterface); } + + @Override + public int getPriority() { + return 0; + } }