diff --git a/src/main/java/gregtech/api/capability/DualHandler.java b/src/main/java/gregtech/api/capability/DualHandler.java index 015017c769e..e2fb712ddb1 100644 --- a/src/main/java/gregtech/api/capability/DualHandler.java +++ b/src/main/java/gregtech/api/capability/DualHandler.java @@ -5,17 +5,19 @@ import gregtech.api.util.ItemStackHashStrategy; import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.IFluidTank; import net.minecraftforge.fluids.capability.IFluidTankProperties; import net.minecraftforge.items.IItemHandlerModifiable; +import net.minecraftforge.items.ItemStackHandler; import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.List; -public class DualHandler implements IItemHandlerModifiable, IMultipleTankHandler, INotifiableHandler { +public class DualHandler extends MultipleTankHandler implements IItemHandlerModifiable, INotifiableHandler { @NotNull private static final ItemStackHashStrategy strategy = ItemStackHashStrategy.comparingAll(); @@ -23,22 +25,22 @@ public class DualHandler implements IItemHandlerModifiable, IMultipleTankHandler @NotNull protected IItemHandlerModifiable itemDelegate; @NotNull - protected IMultipleTankHandler fluidDelegate; + protected MultipleTankHandler fluidDelegate; - private final List unwrapped; + private final List unwrapped; List notifiableEntities = new ArrayList<>(); private final boolean isExport; public DualHandler(@NotNull IItemHandlerModifiable itemDelegate, - @NotNull IMultipleTankHandler fluidDelegate, + @NotNull MultipleTankHandler fluidDelegate, boolean isExport) { this.itemDelegate = itemDelegate; this.fluidDelegate = fluidDelegate; this.isExport = isExport; - List list = new ArrayList<>(); - for (ITankEntry tank : this.fluidDelegate) { + List list = new ArrayList<>(); + for (Entry tank : this.fluidDelegate) { list.add(wrap(tank)); } this.unwrapped = list; @@ -50,8 +52,9 @@ public DualHandler(@NotNull IItemHandlerModifiable itemDelegate, this(itemDelegate, new FluidTankList(false, fluidTank), isExport); } - private DualEntry wrap(ITankEntry entry) { - return entry instanceof DualEntry ? (DualEntry) entry : new DualEntry(this, entry); + @Override + protected Entry wrap(IFluidTank tank) { + return tank instanceof DualEntry ? (DualEntry) tank : new DualEntry(this, super.wrap(tank)); } public boolean isExport() { @@ -124,17 +127,17 @@ public FluidStack drain(int maxDrain, boolean doDrain) { } @Override - public @NotNull List getFluidTanks() { + public @NotNull List getFluidTanks() { return this.unwrapped; } @Override - public int getTanks() { - return this.fluidDelegate.getTanks(); + public int size() { + return this.fluidDelegate.size(); } @Override - public @NotNull ITankEntry getTankAt(int index) { + public @NotNull Entry getTankAt(int index) { return this.unwrapped.get(index); } @@ -169,70 +172,62 @@ public void removeNotifiableMetaTileEntity(MetaTileEntity metaTileEntity) { return itemDelegate; } - public @NotNull IMultipleTankHandler getFluidDelegate() { + public @NotNull MultipleTankHandler getFluidDelegate() { return fluidDelegate; } - public static class DualEntry implements ITankEntry, INotifiableHandler { - - @NotNull - private final DualHandler tank; + public static class DualEntry extends Entry implements INotifiableHandler { @NotNull - private final ITankEntry delegate; + private final DualHandler parent; - public DualEntry(@NotNull DualHandler tank, @NotNull ITankEntry delegate) { - this.delegate = delegate; - this.tank = tank; - } - - @Override - public @NotNull IMultipleTankHandler getParent() { - return this.tank; - } - - @Override - public @NotNull ITankEntry getDelegate() { - return this.delegate; - } - - @Override - public IFluidTankProperties[] getTankProperties() { - return this.getDelegate().getTankProperties(); + public DualEntry(@NotNull DualHandler parent, @NotNull Entry tank) { + super(tank, tank.getParentHandler()); + this.parent = parent; } @Override public int fill(FluidStack resource, boolean doFill) { int filled = getDelegate().fill(resource, doFill); if (doFill && filled > 0) - tank.onContentsChanged(this); + this.parent.onContentsChanged(this); return filled; } - @Override - public FluidStack drain(FluidStack resource, boolean doDrain) { - var drained = getDelegate().drain(resource, doDrain); - if (doDrain && drained != null) - tank.onContentsChanged(this); - return drained; - } - @Override public FluidStack drain(int maxDrain, boolean doDrain) { var drained = getDelegate().drain(maxDrain, doDrain); if (doDrain && drained != null) - tank.onContentsChanged(this); + this.parent.onContentsChanged(this); return drained; } @Override public void addNotifiableMetaTileEntity(MetaTileEntity metaTileEntity) { - this.tank.addNotifiableMetaTileEntity(metaTileEntity); + this.parent.addNotifiableMetaTileEntity(metaTileEntity); } @Override public void removeNotifiableMetaTileEntity(MetaTileEntity metaTileEntity) { - this.tank.removeNotifiableMetaTileEntity(metaTileEntity); + this.parent.removeNotifiableMetaTileEntity(metaTileEntity); + } + } + + @Override + public NBTTagCompound serializeNBT() { + NBTTagCompound root = new NBTTagCompound(); + if (this.itemDelegate instanceof ItemStackHandler handler) { + root.setTag("item", handler.serializeNBT()); + } + root.setTag("fluid", getFluidDelegate().serializeNBT()); + return root; + } + + @Override + public void deserializeNBT(NBTTagCompound nbt) { + if (this.itemDelegate instanceof ItemStackHandler handler) { + handler.deserializeNBT(nbt.getCompoundTag("item")); } + getFluidDelegate().deserializeNBT(nbt.getCompoundTag("fluid")); } } diff --git a/src/main/java/gregtech/api/capability/IFilteredFluidContainer.java b/src/main/java/gregtech/api/capability/IFilteredFluidContainer.java index c1920fda635..a1f3aae6e75 100644 --- a/src/main/java/gregtech/api/capability/IFilteredFluidContainer.java +++ b/src/main/java/gregtech/api/capability/IFilteredFluidContainer.java @@ -2,26 +2,5 @@ import net.minecraftforge.fluids.FluidStack; -import org.jetbrains.annotations.Nullable; - -import java.util.Comparator; - -/** - * Interface for fluid containers ({@link net.minecraftforge.fluids.IFluidTank IFluidTank} or - * {@link net.minecraftforge.fluids.capability.IFluidHandler IFluidHandler}) associated with {@link IFilter}. - */ -public interface IFilteredFluidContainer { - - /** - * Compare logic for filtered instances. - */ - Comparator COMPARATOR = Comparator.nullsLast( - Comparator.comparing(IFilteredFluidContainer::getFilter, IFilter.FILTER_COMPARATOR)); - - /** - * @return instance of {@link IFilter} associated to this object, or {@code null} if there's no filter - * associated. - */ - @Nullable - IFilter getFilter(); -} +// for type safe casting +public interface IFilteredFluidContainer extends IFilteredHandler {} diff --git a/src/main/java/gregtech/api/capability/IFilteredHandler.java b/src/main/java/gregtech/api/capability/IFilteredHandler.java new file mode 100644 index 00000000000..5b8c6143253 --- /dev/null +++ b/src/main/java/gregtech/api/capability/IFilteredHandler.java @@ -0,0 +1,25 @@ +package gregtech.api.capability; + +import org.jetbrains.annotations.Nullable; + +import java.util.Comparator; + +/** + * Interface for fluid containers ({@link net.minecraftforge.fluids.IFluidTank IFluidTank} or + * {@link net.minecraftforge.fluids.capability.IFluidHandler IFluidHandler}) associated with {@link IFilter}. + */ +public interface IFilteredHandler { + + /** + * Compare logic for filtered instances. + */ + Comparator> COMPARATOR = Comparator.nullsLast( + Comparator.comparing(IFilteredHandler::getFilter, IFilter.FILTER_COMPARATOR)); + + /** + * @return instance of {@link IFilter} associated to this object, or {@code null} if there's no filter + * associated. + */ + @Nullable + IFilter getFilter(); +} diff --git a/src/main/java/gregtech/api/capability/IFilteredItemContainer.java b/src/main/java/gregtech/api/capability/IFilteredItemContainer.java new file mode 100644 index 00000000000..3ad2c845c18 --- /dev/null +++ b/src/main/java/gregtech/api/capability/IFilteredItemContainer.java @@ -0,0 +1,5 @@ +package gregtech.api.capability; + +import net.minecraft.item.ItemStack; + +public interface IFilteredItemContainer extends IFilteredHandler {} diff --git a/src/main/java/gregtech/api/capability/IMultipleTankHandler.java b/src/main/java/gregtech/api/capability/IMultipleTankHandler.java deleted file mode 100644 index 4a36b4dcafe..00000000000 --- a/src/main/java/gregtech/api/capability/IMultipleTankHandler.java +++ /dev/null @@ -1,153 +0,0 @@ -package gregtech.api.capability; - -import net.minecraft.nbt.NBTBase; -import net.minecraft.nbt.NBTTagCompound; -import net.minecraftforge.common.util.INBTSerializable; -import net.minecraftforge.fluids.FluidStack; -import net.minecraftforge.fluids.FluidTank; -import net.minecraftforge.fluids.FluidTankInfo; -import net.minecraftforge.fluids.IFluidTank; -import net.minecraftforge.fluids.capability.IFluidHandler; - -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.Comparator; -import java.util.Iterator; -import java.util.List; - -/** - * Base class for multi-tank fluid handlers. Handles insertion logic, along with other standard - * {@link IFluidHandler} functionalities. - * - * @see gregtech.api.capability.impl.FluidTankList FluidTankList - */ -public interface IMultipleTankHandler extends IFluidHandler, Iterable { - - /** - * Comparator for entries that can be used in insertion logic - */ - Comparator ENTRY_COMPARATOR = (o1, o2) -> { - // #1: non-empty tank first - boolean empty1 = o1.getFluidAmount() <= 0; - boolean empty2 = o2.getFluidAmount() <= 0; - if (empty1 != empty2) return empty1 ? 1 : -1; - - // #2: filter priority - IFilter filter1 = o1.getFilter(); - IFilter filter2 = o2.getFilter(); - if (filter1 == null) return filter2 == null ? 0 : 1; - if (filter2 == null) return -1; - return IFilter.FILTER_COMPARATOR.compare(filter1, filter2); - }; - - /** - * @return unmodifiable view of {@code MultiFluidTankEntry}s. Note that it's still possible to access - * and modify inner contents of the tanks. - */ - @NotNull - List getFluidTanks(); - - /** - * @return Number of tanks in this tank handler - */ - int getTanks(); - - @NotNull - ITankEntry getTankAt(int index); - - /** - * @return {@code false} if insertion to this fluid handler enforces input to be - * filled in one slot at max. {@code true} if it bypasses the rule. - */ - boolean allowSameFluidFill(); - - /** - * Tries to search tank with contents equal to {@code fluidStack}. If {@code fluidStack} is - * {@code null}, an empty tank is searched instead. - * - * @param fluidStack Fluid stack to search index - * @return Index corresponding to tank at {@link #getFluidTanks()} with matching - */ - default int getIndexOfFluid(@Nullable FluidStack fluidStack) { - List fluidTanks = getFluidTanks(); - for (int i = 0; i < fluidTanks.size(); i++) { - FluidStack tankStack = fluidTanks.get(i).getFluid(); - if (fluidStack == tankStack || tankStack != null && tankStack.isFluidEqual(fluidStack)) { - return i; - } - } - return -1; - } - - @Override - default Iterator iterator() { - return getFluidTanks().iterator(); - } - - /** - * Entry of multi fluid tanks. Retains reference to original {@link IMultipleTankHandler} for accessing - * information such as {@link IMultipleTankHandler#allowSameFluidFill()}. - */ - interface ITankEntry extends IFluidTank, IFluidHandler, IFilteredFluidContainer, INBTSerializable { - - @NotNull - IMultipleTankHandler getParent(); - - @NotNull - IFluidTank getDelegate(); - - default boolean allowSameFluidFill() { - return getParent().allowSameFluidFill(); - } - - default IFilter getFilter() { - return getDelegate() instanceof IFilteredFluidContainer filtered ? filtered.getFilter() : null; - } - - @Override - default NBTTagCompound serializeNBT() { - if (getDelegate() instanceof FluidTank fluidTank) { - return fluidTank.writeToNBT(new NBTTagCompound()); - } else if (getDelegate() instanceof INBTSerializableserializable) { - if (serializable.serializeNBT() instanceof NBTTagCompound compound) { - return compound; - } - } - return new NBTTagCompound(); - } - - @Override - @SuppressWarnings("unchecked") - default void deserializeNBT(NBTTagCompound nbt) { - if (getDelegate() instanceof FluidTank fluidTank) { - fluidTank.readFromNBT(nbt); - } else if (getDelegate() instanceof INBTSerializableserializable) { - try { - ((INBTSerializable) serializable).deserializeNBT(nbt); - } catch (ClassCastException ignored) {} - } - } - - @Nullable - @Override - default FluidStack getFluid() { - return getDelegate().getFluid(); - } - - @Override - default int getFluidAmount() { - return getDelegate().getFluidAmount(); - } - - @Override - default int getCapacity() { - return getDelegate().getCapacity(); - } - - @Override - default FluidTankInfo getInfo() { - return getDelegate().getInfo(); - } - } -} diff --git a/src/main/java/gregtech/api/capability/INotifiableHandler.java b/src/main/java/gregtech/api/capability/INotifiableHandler.java index 9a8c915e9eb..0be9fa9e65a 100644 --- a/src/main/java/gregtech/api/capability/INotifiableHandler.java +++ b/src/main/java/gregtech/api/capability/INotifiableHandler.java @@ -36,8 +36,8 @@ default void addToNotifiedList(MetaTileEntity metaTileEntity, T handler, boo default int size() { if (this instanceof IItemHandler handler) return handler.getSlots(); - else if (this instanceof IMultipleTankHandler tankHandler) - return tankHandler.getTanks(); + else if (this instanceof MultipleTankHandler tankHandler) + return tankHandler.size(); return 1; } } diff --git a/src/main/java/gregtech/api/capability/MultipleTankHandler.java b/src/main/java/gregtech/api/capability/MultipleTankHandler.java new file mode 100644 index 00000000000..3a04a8feb65 --- /dev/null +++ b/src/main/java/gregtech/api/capability/MultipleTankHandler.java @@ -0,0 +1,228 @@ +package gregtech.api.capability; + +import gregtech.api.capability.impl.FluidTankList; + +import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.common.util.INBTSerializable; +import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fluids.FluidTank; +import net.minecraftforge.fluids.FluidTankInfo; +import net.minecraftforge.fluids.IFluidTank; +import net.minecraftforge.fluids.capability.IFluidHandler; +import net.minecraftforge.fluids.capability.IFluidTankProperties; + +import org.apache.commons.lang3.ArrayUtils; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Comparator; +import java.util.Iterator; +import java.util.List; + +/** + * Base class for multi-tank fluid handlers. Handles insertion logic, along with other standard + * {@link IFluidHandler} functionalities. + * + * @see FluidTankList FluidTankList + */ +public abstract class MultipleTankHandler implements IFluidHandler, Iterable, + INBTSerializable { + + /** + * Comparator for entries that can be used in insertion logic + */ + public static final Comparator ENTRY_COMPARATOR = (o1, o2) -> { + // #1: non-empty tank first + boolean empty1 = o1.getFluidAmount() <= 0; + boolean empty2 = o2.getFluidAmount() <= 0; + if (empty1 != empty2) return empty1 ? 1 : -1; + + // #2: filter priority + IFilter filter1 = o1.getFilter(); + IFilter filter2 = o2.getFilter(); + if (filter1 == null) return filter2 == null ? 0 : 1; + if (filter2 == null) return -1; + return IFilter.FILTER_COMPARATOR.compare(filter1, filter2); + }; + + /** + * @return unmodifiable view of {@code Entry}s. Note that it's still possible to access + * and modify inner contents of the tanks. + */ + @NotNull + public abstract List getFluidTanks(); + + /** + * @return Number of tanks in this tank handler + */ + public abstract int size(); + + @NotNull + public abstract Entry getTankAt(int index); + + /** + * @return {@code false} if insertion to this fluid handler enforces input to be + * filled in one slot at max. {@code true} if it bypasses the rule. + */ + public abstract boolean allowSameFluidFill(); + + /** + * Tries to search tank with contents equal to {@code fluidStack}. If {@code fluidStack} is + * {@code null}, an empty tank is searched instead. + * + * @param fluidStack Fluid stack to search index + * @return Index corresponding to tank at {@link #getFluidTanks()} with matching + */ + public final int getIndexOfFluid(@Nullable FluidStack fluidStack) { + List fluidTanks = getFluidTanks(); + for (int i = 0; i < fluidTanks.size(); i++) { + FluidStack tankStack = fluidTanks.get(i).getFluid(); + if (fluidStack == tankStack || tankStack != null && tankStack.isFluidEqual(fluidStack)) { + return i; + } + } + return -1; + } + + public int simulateFill(FluidStack stack, int amount) { + var insertable = stack.copy(); + insertable.amount = amount; + return fill(insertable, false); + } + + @Override + public final @NotNull Iterator iterator() { + return getFluidTanks().iterator(); + } + + protected Entry wrap(IFluidTank tank) { + return tank instanceof Entry ? (Entry) tank : new Entry(tank, this); + } + + public MultipleTankHandler addTanks(IFluidTank... tanks) { + if (ArrayUtils.isEmpty(tanks)) return this; + return new FluidTankList(allowSameFluidFill(), this, tanks); + } + + /** + * Entry of multi fluid tanks. Retains reference to original {@link MultipleTankHandler} for accessing + * information such as {@link MultipleTankHandler#allowSameFluidFill()}. + */ + public static class Entry implements IFluidTank, IFilteredHandler, + INBTSerializable, IFluidTankProperties { + + @NotNull + private final IFluidTank tank; + @NotNull + private final MultipleTankHandler parent; + + protected Entry(@NotNull IFluidTank tank, @NotNull MultipleTankHandler parent) { + this.tank = tank; + this.parent = parent; + } + + public @NotNull MultipleTankHandler getParentHandler() { + return parent; + } + + public @NotNull IFluidTank getDelegate() { + return tank; + } + + public boolean allowSameFluidFill() { + return getParentHandler().allowSameFluidFill(); + } + + @Nullable + @Override + public IFilter getFilter() { + return getDelegate() instanceof IFilteredFluidContainer filter ? filter.getFilter() : null; + } + + @Nullable + @Override + public FluidStack getFluid() { + return getDelegate().getFluid(); + } + + @Override + public int getFluidAmount() { + return getDelegate().getFluidAmount(); + } + + @Override + public int getCapacity() { + return getDelegate().getCapacity(); + } + + @Override + public FluidTankInfo getInfo() { + return getDelegate().getInfo(); + } + + @Override + public FluidStack getContents() { + return getFluid() == null ? null : getFluid().copy(); + } + + @Override + public boolean canFill() { + return true; + } + + @Override + public boolean canDrain() { + return true; + } + + @Override + public boolean canFillFluidType(FluidStack fluidStack) { + if (allowSameFluidFill() || fluidStack == null) return true; + for (Entry tank : getParentHandler()) { + // only consider other tanks that do not allow same fluid fill + if (tank.allowSameFluidFill() || this == tank) continue; + if (fluidStack.isFluidEqual(tank.getFluid())) { + return tank.getFluidAmount() + fluidStack.amount <= tank.getCapacity(); + } + } + return true; + } + + @Override + public boolean canDrainFluidType(FluidStack fluidStack) { + return true; + } + + @Override + public int fill(FluidStack resource, boolean doFill) { + return getDelegate().fill(resource, doFill); + } + + @Nullable + @Override + public FluidStack drain(int maxDrain, boolean doDrain) { + return getDelegate().drain(maxDrain, doDrain); + } + + @SuppressWarnings("rawtypes") + @Override + public NBTTagCompound serializeNBT() { + if (getDelegate() instanceof FluidTank fluidTank) { + return fluidTank.writeToNBT(new NBTTagCompound()); + } else if (getDelegate() instanceof INBTSerializable serializable) { + return (NBTTagCompound) serializable.serializeNBT(); + } + return new NBTTagCompound(); + } + + @SuppressWarnings({ "rawtypes", "unchecked" }) + @Override + public void deserializeNBT(NBTTagCompound nbt) { + if (getDelegate() instanceof FluidTank fluidTank) { + fluidTank.readFromNBT(nbt); + } else if (getDelegate() instanceof INBTSerializable serializable) { + serializable.deserializeNBT(nbt); + } + } + } +} diff --git a/src/main/java/gregtech/api/capability/impl/AbstractRecipeLogic.java b/src/main/java/gregtech/api/capability/impl/AbstractRecipeLogic.java index 23018a736ca..0dd7b3c25a7 100644 --- a/src/main/java/gregtech/api/capability/impl/AbstractRecipeLogic.java +++ b/src/main/java/gregtech/api/capability/impl/AbstractRecipeLogic.java @@ -5,8 +5,8 @@ import gregtech.api.capability.GregtechTileCapabilities; import gregtech.api.capability.IEnergyContainer; import gregtech.api.capability.IMultiblockController; -import gregtech.api.capability.IMultipleTankHandler; import gregtech.api.capability.IWorkable; +import gregtech.api.capability.MultipleTankHandler; import gregtech.api.metatileentity.MTETrait; import gregtech.api.metatileentity.MetaTileEntity; import gregtech.api.metatileentity.multiblock.CleanroomType; @@ -173,14 +173,14 @@ protected IItemHandlerModifiable getOutputInventory() { /** * @return the fluid inventory to input fluids from */ - protected IMultipleTankHandler getInputTank() { + protected MultipleTankHandler getInputTank() { return metaTileEntity.getImportFluids(); } /** * @return the fluid inventory to output fluids to */ - protected IMultipleTankHandler getOutputTank() { + protected MultipleTankHandler getOutputTank() { return metaTileEntity.getExportFluids(); } @@ -400,7 +400,7 @@ protected void trySearchNewRecipe() { long maxVoltage = getMaxVoltage(); Recipe currentRecipe; IItemHandlerModifiable importInventory = getInputInventory(); - IMultipleTankHandler importFluids = getInputTank(); + MultipleTankHandler importFluids = getInputTank(); // see if the last recipe we used still works if (checkPreviousRecipe()) { @@ -484,7 +484,7 @@ protected boolean checkDimensionRequirement(@NotNull Recipe recipe) { * @return true if the recipe was successfully prepared, else false */ public boolean prepareRecipe(Recipe recipe, IItemHandlerModifiable inputInventory, - IMultipleTankHandler inputFluidInventory) { + MultipleTankHandler inputFluidInventory) { recipe = Recipe.trimRecipeOutputs(recipe, getRecipeMap(), metaTileEntity.getItemOutputLimit(), metaTileEntity.getFluidOutputLimit()); @@ -621,8 +621,8 @@ public ParallelLogicType getParallelLogicType() { * @param tanks the tanks to check * @return the minimum fluid capacity of the tanks */ - protected static int getMinTankCapacity(@NotNull IMultipleTankHandler tanks) { - if (tanks.getTanks() == 0) { + protected static int getMinTankCapacity(@NotNull MultipleTankHandler tanks) { + if (tanks.size() == 0) { return 0; } int result = Integer.MAX_VALUE; @@ -641,7 +641,7 @@ protected static int getMinTankCapacity(@NotNull IMultipleTankHandler tanks) { * @return the recipe if found, otherwise null */ @Nullable - protected Recipe findRecipe(long maxVoltage, IItemHandlerModifiable inputs, IMultipleTankHandler fluidInputs) { + protected Recipe findRecipe(long maxVoltage, IItemHandlerModifiable inputs, MultipleTankHandler fluidInputs) { RecipeMap map = getRecipeMap(); if (map == null || !isRecipeMapValid(map)) { return null; @@ -702,7 +702,7 @@ protected static boolean areItemStacksEqual(@NotNull ItemStack stackA, @NotNull */ protected final @Nullable Recipe setupAndConsumeRecipeInputs(@NotNull Recipe recipe, @NotNull IItemHandlerModifiable importInventory, - @NotNull IMultipleTankHandler importFluids) { + @NotNull MultipleTankHandler importFluids) { calculateOverclock(recipe); modifyOverclockPost(ocResult, recipe.propertyStorage()); @@ -752,10 +752,10 @@ protected boolean checkOutputSpaceItems(@NotNull Recipe recipe, @NotNull IItemHa * @param exportFluids the inventory to output to * @return if the recipe can be successfully output to the inventory */ - protected boolean checkOutputSpaceFluids(@NotNull Recipe recipe, @NotNull IMultipleTankHandler exportFluids) { + protected boolean checkOutputSpaceFluids(@NotNull Recipe recipe, @NotNull MultipleTankHandler exportFluids) { // We have already trimmed fluid outputs at this time if (!metaTileEntity.canVoidRecipeFluidOutputs() && - !GTTransferUtils.addFluidsToFluidHandler(exportFluids, true, recipe.getAllFluidOutputs())) { + !GTTransferUtils.addFluidsToFluidHandler(recipe.getAllFluidOutputs(), exportFluids, true)) { this.isOutputsFull = true; return false; } @@ -773,7 +773,7 @@ protected boolean checkOutputSpaceFluids(@NotNull Recipe recipe, @NotNull IMulti */ protected @Nullable Recipe subTickOC(@NotNull OCResult ocResult, @NotNull Recipe recipe, @NotNull IItemHandlerModifiable importInventory, - @NotNull IMultipleTankHandler importFluids) { + @NotNull MultipleTankHandler importFluids) { RecipeMap map = getRecipeMap(); if (map == null) { return null; @@ -1003,7 +1003,7 @@ protected void completeRecipe() { */ protected void outputRecipeOutputs() { GTTransferUtils.addItemsToItemHandler(getOutputInventory(), false, itemOutputs); - GTTransferUtils.addFluidsToFluidHandler(getOutputTank(), false, fluidOutputs); + GTTransferUtils.addFluidsToFluidHandler(fluidOutputs, getOutputTank(), false); } /** diff --git a/src/main/java/gregtech/api/capability/impl/BoilerRecipeLogic.java b/src/main/java/gregtech/api/capability/impl/BoilerRecipeLogic.java index a2163db4637..8dabec93f34 100644 --- a/src/main/java/gregtech/api/capability/impl/BoilerRecipeLogic.java +++ b/src/main/java/gregtech/api/capability/impl/BoilerRecipeLogic.java @@ -3,7 +3,7 @@ import gregtech.api.GTValues; import gregtech.api.capability.IEnergyContainer; import gregtech.api.capability.IMultiblockController; -import gregtech.api.capability.IMultipleTankHandler; +import gregtech.api.capability.MultipleTankHandler; import gregtech.api.recipes.Recipe; import gregtech.api.recipes.RecipeMap; import gregtech.api.recipes.RecipeMaps; @@ -78,7 +78,7 @@ protected void trySearchNewRecipe() { // can optimize with an override of checkPreviousRecipe() and a check here - IMultipleTankHandler importFluids = boiler.getImportFluids(); + MultipleTankHandler importFluids = boiler.getImportFluids(); boolean didStartRecipe = false; for (IFluidTank fluidTank : importFluids.getFluidTanks()) { diff --git a/src/main/java/gregtech/api/capability/impl/CommonFluidFilters.java b/src/main/java/gregtech/api/capability/impl/CommonFluidFilters.java index bca26ca9f25..38f907084d3 100644 --- a/src/main/java/gregtech/api/capability/impl/CommonFluidFilters.java +++ b/src/main/java/gregtech/api/capability/impl/CommonFluidFilters.java @@ -11,12 +11,14 @@ import org.jetbrains.annotations.NotNull; +import static gregtech.api.capability.IFilter.*; + /** * Common fluid filter implementations. */ -public enum CommonFluidFilters implements IFilter { +public class CommonFluidFilters { - ALLOW_ALL { + public static final IFilter ALLOW_ALL = new IFilter<>() { @Override public boolean test(@NotNull FluidStack fluid) { @@ -29,11 +31,12 @@ public int getPriority() { } @Override - public IFilter negate() { + public @NotNull IFilter negate() { return DISALLOW_ALL; } - }, - DISALLOW_ALL { + }; + + public static final IFilter DISALLOW_ALL = new IFilter<>() { @Override public boolean test(@NotNull FluidStack fluid) { @@ -46,11 +49,12 @@ public int getPriority() { } @Override - public IFilter negate() { + public @NotNull IFilter negate() { return ALLOW_ALL; } - }, - BOILER_FLUID { + }; + + public static final IFilter BOILER_FLUID = new IFilter<>() { @Override public boolean test(@NotNull FluidStack fluid) { @@ -69,10 +73,11 @@ public boolean test(@NotNull FluidStack fluid) { @Override public int getPriority() { - return IFilter.whitelistLikePriority(); + return whitelistLikePriority(); } - }, - STEAM { + }; + + public static final IFilter STEAM = new IFilter<>() { @Override public boolean test(@NotNull FluidStack fluid) { @@ -81,10 +86,11 @@ public boolean test(@NotNull FluidStack fluid) { @Override public int getPriority() { - return IFilter.whitelistPriority(1); + return whitelistPriority(1); } - }, - LIGHTER_FUEL { + }; + + public static final IFilter LIGHTER_FUEL = new IFilter<>() { @Override public boolean test(@NotNull FluidStack fluidStack) { @@ -93,7 +99,7 @@ public boolean test(@NotNull FluidStack fluidStack) { @Override public int getPriority() { - return IFilter.whitelistPriority(2); + return whitelistPriority(2); } }; diff --git a/src/main/java/gregtech/api/capability/impl/DistillationTowerLogicHandler.java b/src/main/java/gregtech/api/capability/impl/DistillationTowerLogicHandler.java index e4dff86749b..7693cbec14e 100644 --- a/src/main/java/gregtech/api/capability/impl/DistillationTowerLogicHandler.java +++ b/src/main/java/gregtech/api/capability/impl/DistillationTowerLogicHandler.java @@ -1,7 +1,7 @@ package gregtech.api.capability.impl; import gregtech.api.capability.IDistillationTower; -import gregtech.api.capability.IMultipleTankHandler; +import gregtech.api.capability.MultipleTankHandler; import gregtech.api.metatileentity.multiblock.AbilityInstances; import gregtech.api.metatileentity.multiblock.IMultiblockAbilityPart; import gregtech.api.metatileentity.multiblock.MultiblockAbility; @@ -32,7 +32,7 @@ public class DistillationTowerLogicHandler { private int layerCount; private List orderedFluidOutputs; - private IMultipleTankHandler fluidTanks; + private MultipleTankHandler fluidTanks; public DistillationTowerLogicHandler(IDistillationTower tower) { this.tower = tower; @@ -140,11 +140,11 @@ public List getOrderedFluidOutputs() { return orderedFluidOutputs; } - protected void setFluidTanks(IMultipleTankHandler fluidTanks) { + protected void setFluidTanks(MultipleTankHandler fluidTanks) { this.fluidTanks = fluidTanks; } - public IMultipleTankHandler getFluidTanks() { + public MultipleTankHandler getFluidTanks() { return fluidTanks; } diff --git a/src/main/java/gregtech/api/capability/impl/FilteredItemHandler.java b/src/main/java/gregtech/api/capability/impl/FilteredItemHandler.java index 63e3131365e..2672859b944 100644 --- a/src/main/java/gregtech/api/capability/impl/FilteredItemHandler.java +++ b/src/main/java/gregtech/api/capability/impl/FilteredItemHandler.java @@ -1,5 +1,6 @@ package gregtech.api.capability.impl; +import gregtech.api.capability.IFilter; import gregtech.api.items.itemhandlers.GTItemStackHandler; import gregtech.api.metatileentity.MetaTileEntity; @@ -11,14 +12,16 @@ import java.util.function.Predicate; +/** + * Deprecated, use {@link GTItemStackHandler} instead + */ +@Deprecated public class FilteredItemHandler extends GTItemStackHandler { public static Predicate getCapabilityFilter(Capability cap) { return stack -> stack.hasCapability(cap, null); } - private Predicate fillPredicate; - public FilteredItemHandler(MetaTileEntity metaTileEntity) { super(metaTileEntity, 1); } @@ -32,12 +35,18 @@ public FilteredItemHandler(MetaTileEntity metaTileEntity, NonNullList } public FilteredItemHandler setFillPredicate(Predicate fillPredicate) { - this.fillPredicate = fillPredicate; + setFilter(new IFilter<>() { + + @Override + public boolean test(@NotNull ItemStack stack) { + return fillPredicate.test(stack); + } + + @Override + public int getPriority() { + return IFilter.noPriority(); + } + }); return this; } - - @Override - public boolean isItemValid(int slot, @NotNull ItemStack stack) { - return fillPredicate == null || fillPredicate.test(stack); - } } diff --git a/src/main/java/gregtech/api/capability/impl/FluidTankList.java b/src/main/java/gregtech/api/capability/impl/FluidTankList.java index 2895b0c0cee..c7d377efdf3 100644 --- a/src/main/java/gregtech/api/capability/impl/FluidTankList.java +++ b/src/main/java/gregtech/api/capability/impl/FluidTankList.java @@ -1,81 +1,72 @@ package gregtech.api.capability.impl; -import gregtech.api.capability.IFilter; -import gregtech.api.capability.IMultipleTankHandler; +import gregtech.api.capability.MultipleTankHandler; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraftforge.common.util.Constants; -import net.minecraftforge.common.util.INBTSerializable; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.IFluidTank; -import net.minecraftforge.fluids.capability.IFluidHandler; import net.minecraftforge.fluids.capability.IFluidTankProperties; +import org.apache.commons.lang3.ArrayUtils; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.List; -public class FluidTankList implements IMultipleTankHandler, INBTSerializable { +public final class FluidTankList extends MultipleTankHandler { - private final ITankEntry[] fluidTanks; private final boolean allowSameFluidFill; + private Entry[] tanks = new Entry[0]; public FluidTankList(boolean allowSameFluidFill, IFluidTank... fluidTanks) { - ArrayList list = new ArrayList<>(); - for (IFluidTank tank : fluidTanks) list.add(wrapIntoEntry(tank)); - this.fluidTanks = list.toArray(new MultiFluidTankEntry[0]); + if (!ArrayUtils.isEmpty(fluidTanks)) { + tanks = new Entry[fluidTanks.length]; + Arrays.setAll(tanks, value -> wrap(fluidTanks[value])); + } this.allowSameFluidFill = allowSameFluidFill; } public FluidTankList(boolean allowSameFluidFill, @NotNull List fluidTanks) { - ArrayList list = new ArrayList<>(); - for (IFluidTank tank : fluidTanks) list.add(wrapIntoEntry(tank)); - this.fluidTanks = list.toArray(new MultiFluidTankEntry[0]); - this.allowSameFluidFill = allowSameFluidFill; + this(allowSameFluidFill, fluidTanks.toArray(new IFluidTank[0])); } - public FluidTankList(boolean allowSameFluidFill, @NotNull IMultipleTankHandler parent, + public FluidTankList(boolean allowSameFluidFill, @NotNull MultipleTankHandler parent, IFluidTank... additionalTanks) { - ArrayList list = new ArrayList<>(parent.getFluidTanks()); - for (IFluidTank tank : additionalTanks) list.add(wrapIntoEntry(tank)); - this.fluidTanks = list.toArray(new ITankEntry[0]); - this.allowSameFluidFill = allowSameFluidFill; - } + int tanks = parent.size(); + int additional = ArrayUtils.getLength(additionalTanks); + + this.tanks = new Entry[tanks + additional]; - private MultiFluidTankEntry wrapIntoEntry(IFluidTank tank) { - return tank instanceof MultiFluidTankEntry entry ? entry : new MultiFluidTankEntry(this, tank); + Arrays.setAll(this.tanks, value -> { + if (value < tanks) return parent.getTankAt(value); + else return wrap(additionalTanks[value - tanks]); + }); + + this.allowSameFluidFill = allowSameFluidFill; } - @NotNull @Override - public List getFluidTanks() { - return Collections.unmodifiableList(Arrays.asList(fluidTanks)); + public @NotNull List getFluidTanks() { + return Collections.unmodifiableList(Arrays.asList(this.tanks)); } @Override - public int getTanks() { - return fluidTanks.length; + public int size() { + return tanks.length; } - @NotNull @Override - public ITankEntry getTankAt(int index) { - return fluidTanks[index]; + public @NotNull Entry getTankAt(int index) { + return tanks[index]; } - @NotNull @Override public IFluidTankProperties[] getTankProperties() { - ArrayList propertiesList = new ArrayList<>(); - for (ITankEntry fluidTank : fluidTanks) { - Collections.addAll(propertiesList, fluidTank.getTankProperties()); - } - return propertiesList.toArray(new IFluidTankProperties[0]); + return this.tanks; } @Override @@ -85,63 +76,45 @@ public boolean allowSameFluidFill() { @Override public int fill(FluidStack resource, boolean doFill) { - if (resource == null || resource.amount <= 0) { + if (resource == null || resource.amount <= 0) return 0; - } + + FluidStack copy = resource.copy(); + int totalInserted = 0; - boolean inputFluidCopied = false; - // flag value indicating whether the fluid was stored in 'distinct' slot at least once - boolean distinctSlotVisited = false; - ITankEntry[] fluidTanks = this.fluidTanks.clone(); - Arrays.sort(fluidTanks, IMultipleTankHandler.ENTRY_COMPARATOR); + Entry[] fluidTanks = this.tanks.clone(); + Arrays.sort(fluidTanks, ENTRY_COMPARATOR); + + boolean overflow = false; // search for tanks with same fluid type first - for (ITankEntry tank : fluidTanks) { + for (Entry tank : fluidTanks) { + boolean empty = tank.getFluidAmount() == 0; + + // if we still have fluid to insert, loop through empty tanks until we find one that can accept the fluid + if (empty) { + // if the tank uses distinct fluid fill (allowSameFluidFill disabled) and another distinct tank had + // received the fluid, skip this tank + if (overflow && !tank.allowSameFluidFill()) continue; + // if simulating, pass in the original resource since nothing was actually filled, + // otherwise pass in the mutated copy + if (!tank.canFillFluidType(doFill ? copy : resource)) continue; + + // if not empty fluid doesn't match, skip + } else if (!resource.isFluidEqual(tank.getFluid())) + continue; + // if the fluid to insert matches the tank, insert the fluid - if (resource.isFluidEqual(tank.getFluid())) { - int inserted = tank.fill(resource, doFill); - if (inserted > 0) { - totalInserted += inserted; - if (resource.amount - inserted <= 0) { - return totalInserted; - } - if (!inputFluidCopied) { - inputFluidCopied = true; - resource = resource.copy(); - } - resource.amount -= inserted; - } - // regardless of whether the insertion succeeded, presence of identical fluid in - // a slot prevents distinct fill to other slots - if (!tank.allowSameFluidFill()) { - distinctSlotVisited = true; - } - } - } - // if we still have fluid to insert, loop through empty tanks until we find one that can accept the fluid - for (ITankEntry tank : fluidTanks) { - // if the tank uses distinct fluid fill (allowSameFluidFill disabled) and another distinct tank had - // received the fluid, skip this tank - boolean usesDistinctFluidFill = tank.allowSameFluidFill(); - if ((usesDistinctFluidFill || !distinctSlotVisited) && tank.getFluidAmount() == 0) { - int inserted = tank.fill(resource, doFill); - if (inserted > 0) { - totalInserted += inserted; - if (resource.amount - inserted <= 0) { - return totalInserted; - } - if (!inputFluidCopied) { - inputFluidCopied = true; - resource = resource.copy(); - } - resource.amount -= inserted; - if (!usesDistinctFluidFill) { - distinctSlotVisited = true; - } - } - } + int inserted = tank.fill(copy, doFill); + if (inserted <= 0) continue; + + totalInserted += inserted; + copy.amount -= inserted; + if (copy.amount <= 0) return totalInserted; + else if (empty) overflow = true; } + // return the amount of fluid that was inserted return totalInserted; } @@ -149,12 +122,12 @@ public int fill(FluidStack resource, boolean doFill) { @Nullable @Override public FluidStack drain(FluidStack resource, boolean doDrain) { - if (resource == null || resource.amount <= 0) { + if (resource == null || resource.amount <= 0) return null; - } + int amountLeft = resource.amount; FluidStack totalDrained = null; - for (IFluidTank handler : fluidTanks) { + for (IFluidTank handler : tanks) { if (!resource.isFluidEqual(handler.getFluid())) { continue; } @@ -177,29 +150,28 @@ public FluidStack drain(FluidStack resource, boolean doDrain) { @Nullable @Override public FluidStack drain(int maxDrain, boolean doDrain) { - if (maxDrain <= 0) { - return null; - } + if (maxDrain <= 0) return null; + FluidStack totalDrained = null; - for (IFluidTank handler : fluidTanks) { + for (IFluidTank handler : tanks) { if (totalDrained == null) { - totalDrained = handler.drain(maxDrain, doDrain); - if (totalDrained != null) { - maxDrain -= totalDrained.amount; - } + var drained = handler.drain(maxDrain, doDrain); + if (drained == null) continue; + + totalDrained = drained.copy(); + maxDrain -= totalDrained.amount; + } else { - if (!totalDrained.isFluidEqual(handler.getFluid())) { + if (!totalDrained.isFluidEqual(handler.getFluid())) continue; - } + FluidStack drain = handler.drain(maxDrain, doDrain); - if (drain != null) { - totalDrained.amount += drain.amount; - maxDrain -= drain.amount; - } - } - if (maxDrain <= 0) { - return totalDrained; + if (drain == null) continue; + + totalDrained.amount += drain.amount; + maxDrain -= drain.amount; } + if (maxDrain <= 0) return totalDrained; } return totalDrained; } @@ -208,8 +180,8 @@ public FluidStack drain(int maxDrain, boolean doDrain) { public NBTTagCompound serializeNBT() { NBTTagCompound fluidInventory = new NBTTagCompound(); NBTTagList tanks = new NBTTagList(); - for (int i = 0; i < this.getTanks(); i++) { - tanks.appendTag(this.fluidTanks[i].serializeNBT()); + for (Entry tank : this.tanks) { + tanks.appendTag(tank.serializeNBT()); } fluidInventory.setTag("Tanks", tanks); return fluidInventory; @@ -218,8 +190,8 @@ public NBTTagCompound serializeNBT() { @Override public void deserializeNBT(NBTTagCompound nbt) { NBTTagList tanks = nbt.getTagList("Tanks", Constants.NBT.TAG_COMPOUND); - for (int i = 0; i < Math.min(fluidTanks.length, tanks.tagCount()); i++) { - this.fluidTanks[i].deserializeNBT(tanks.getCompoundTagAt(i)); + for (int i = 0; i < tanks.tagCount(); i++) { + this.tanks[i].deserializeNBT(tanks.getCompoundTagAt(i)); } } @@ -229,133 +201,20 @@ public String toString() { } public String toString(boolean lineBreak) { - StringBuilder stb = new StringBuilder("FluidTankList[").append(this.fluidTanks.length).append(";"); - for (int i = 0; i < this.fluidTanks.length; i++) { + StringBuilder stb = new StringBuilder("FluidTankList[").append(this.tanks.length).append(";"); + for (int i = 0; i < this.tanks.length; i++) { if (i != 0) stb.append(','); stb.append(lineBreak ? "\n " : " "); - FluidStack fluid = this.fluidTanks[i].getFluid(); + FluidStack fluid = this.tanks[i].getFluid(); if (fluid == null || fluid.amount == 0) { - stb.append("None 0 / ").append(this.fluidTanks[i].getCapacity()); + stb.append("None 0 / ").append(this.tanks[i].getCapacity()); } else { stb.append(fluid.getFluid().getName()).append(' ').append(fluid.amount) - .append(" / ").append(this.fluidTanks[i].getCapacity()); + .append(" / ").append(this.tanks[i].getCapacity()); } } if (lineBreak) stb.append('\n'); return stb.append(']').toString(); } - - /** - * Entry of multi fluid tanks. Retains reference to original {@link IMultipleTankHandler} for accessing - * information such as {@link IMultipleTankHandler#allowSameFluidFill()}. - */ - private static final class MultiFluidTankEntry implements ITankEntry { - - private final IMultipleTankHandler tank; - private final IFluidTank delegate; - private final IFluidTankProperties[] fallback; - - public MultiFluidTankEntry(@NotNull IMultipleTankHandler tank, @NotNull IFluidTank delegate) { - this.tank = tank; - this.delegate = delegate; - this.fallback = new IFluidTankProperties[] { - new FallbackTankProperty() - }; - } - - @NotNull - @Override - public IMultipleTankHandler getParent() { - return tank; - } - - @NotNull - @Override - public IFluidTank getDelegate() { - return delegate; - } - - @NotNull - public IFluidTankProperties[] getTankProperties() { - return delegate instanceof IFluidHandler fluidHandler ? - fluidHandler.getTankProperties() : fallback; - } - - @Override - public int fill(FluidStack resource, boolean doFill) { - return delegate.fill(resource, doFill); - } - - @Nullable - @Override - public FluidStack drain(FluidStack resource, boolean doDrain) { - if (resource == null || resource.amount <= 0) { - return null; - } - if (delegate instanceof IFluidHandler fluidHandler) { - return fluidHandler.drain(resource, doDrain); - } - // just imitate the logic - FluidStack fluid = delegate.getFluid(); - return fluid != null && fluid.isFluidEqual(resource) ? drain(resource.amount, doDrain) : null; - } - - @Nullable - @Override - public FluidStack drain(int maxDrain, boolean doDrain) { - return delegate.drain(maxDrain, doDrain); - } - - @Override - public int hashCode() { - return delegate.hashCode(); - } - - @Override - @SuppressWarnings("EqualsWhichDoesntCheckParameterClass") - public boolean equals(Object obj) { - return this == obj || delegate.equals(obj); - } - - @Override - public String toString() { - return delegate.toString(); - } - - private final class FallbackTankProperty implements IFluidTankProperties { - - @Nullable - @Override - public FluidStack getContents() { - return delegate.getFluid(); - } - - @Override - public int getCapacity() { - return delegate.getCapacity(); - } - - @Override - public boolean canFill() { - return true; - } - - @Override - public boolean canDrain() { - return true; - } - - @Override - public boolean canFillFluidType(FluidStack fluidStack) { - IFilter filter = getFilter(); - return filter == null || filter.test(fluidStack); - } - - @Override - public boolean canDrainFluidType(FluidStack fluidStack) { - return true; - } - } - } } diff --git a/src/main/java/gregtech/api/capability/impl/GTSimpleFluidHandlerItemStack.java b/src/main/java/gregtech/api/capability/impl/GTSimpleFluidHandlerItemStack.java index 8e1116ceb5b..4bf71590c3d 100644 --- a/src/main/java/gregtech/api/capability/impl/GTSimpleFluidHandlerItemStack.java +++ b/src/main/java/gregtech/api/capability/impl/GTSimpleFluidHandlerItemStack.java @@ -11,7 +11,8 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -public class GTSimpleFluidHandlerItemStack extends FluidHandlerItemStackSimple implements IFilteredFluidContainer { +public class GTSimpleFluidHandlerItemStack extends FluidHandlerItemStackSimple + implements IFilteredFluidContainer { @Nullable private IFilter filter; diff --git a/src/main/java/gregtech/api/capability/impl/MultiblockRecipeLogic.java b/src/main/java/gregtech/api/capability/impl/MultiblockRecipeLogic.java index ba6cae067e0..70405b991ed 100644 --- a/src/main/java/gregtech/api/capability/impl/MultiblockRecipeLogic.java +++ b/src/main/java/gregtech/api/capability/impl/MultiblockRecipeLogic.java @@ -5,7 +5,7 @@ import gregtech.api.capability.IEnergyContainer; import gregtech.api.capability.IMultiblockController; import gregtech.api.capability.IMultipleRecipeMaps; -import gregtech.api.capability.IMultipleTankHandler; +import gregtech.api.capability.MultipleTankHandler; import gregtech.api.metatileentity.multiblock.MultiblockAbility; import gregtech.api.metatileentity.multiblock.MultiblockWithDisplayBase; import gregtech.api.metatileentity.multiblock.RecipeMapMultiblockController; @@ -95,7 +95,7 @@ protected IItemHandlerModifiable getOutputInventory() { } @Override - protected IMultipleTankHandler getInputTank() { + protected MultipleTankHandler getInputTank() { RecipeMapMultiblockController controller = (RecipeMapMultiblockController) metaTileEntity; return controller.getInputFluidInventory(); } @@ -103,20 +103,20 @@ protected IMultipleTankHandler getInputTank() { /** * Overload of {@link #getInputTank()} to gather extra fluid tanks * that could exist in a distinct item handler (such as a {@link DualHandler}) - * + * * @param items Handler to gather fluid tanks from * @return a new FluidTankList with extra fluid tanks on top of the existing fluid tanks */ - protected IMultipleTankHandler getInputTank(IItemHandler items) { + protected MultipleTankHandler getInputTank(IItemHandler items) { var tanks = new ArrayList<>(getInputTank().getFluidTanks()); - if (items instanceof IMultipleTankHandler tankHandler) { + if (items instanceof MultipleTankHandler tankHandler) { tanks.addAll(tankHandler.getFluidTanks()); } return new FluidTankList(getInputTank().allowSameFluidFill(), tanks); } @Override - protected IMultipleTankHandler getOutputTank() { + protected MultipleTankHandler getOutputTank() { RecipeMapMultiblockController controller = (RecipeMapMultiblockController) metaTileEntity; return controller.getOutputFluidInventory(); } @@ -216,6 +216,7 @@ protected void trySearchNewRecipeDistinct() { long maxVoltage = getMaxVoltage(); Recipe currentRecipe; List importInventory = getInputBuses(); + MultipleTankHandler importFluids = getInputTank(); // Our caching implementation // This guarantees that if we get a recipe cache hit, our efficiency is no different from other machines diff --git a/src/main/java/gregtech/api/capability/impl/NotifiableFilteredFluidHandler.java b/src/main/java/gregtech/api/capability/impl/NotifiableFilteredFluidHandler.java index fe44ad8db4a..78b69fbee7f 100644 --- a/src/main/java/gregtech/api/capability/impl/NotifiableFilteredFluidHandler.java +++ b/src/main/java/gregtech/api/capability/impl/NotifiableFilteredFluidHandler.java @@ -1,39 +1,11 @@ package gregtech.api.capability.impl; -import gregtech.api.capability.INotifiableHandler; import gregtech.api.metatileentity.MetaTileEntity; -import java.util.ArrayList; -import java.util.List; - -public class NotifiableFilteredFluidHandler extends FilteredFluidHandler implements INotifiableHandler { - - List notifiableEntities = new ArrayList<>(); - private final boolean isExport; +@Deprecated +public class NotifiableFilteredFluidHandler extends NotifiableFluidTank { public NotifiableFilteredFluidHandler(int capacity, MetaTileEntity entityToNotify, boolean isExport) { - super(capacity); - this.notifiableEntities.add(entityToNotify); - this.isExport = isExport; - } - - @Override - protected void onContentsChanged() { - super.onContentsChanged(); - for (MetaTileEntity metaTileEntity : notifiableEntities) { - if (metaTileEntity != null && metaTileEntity.isValid()) { - addToNotifiedList(metaTileEntity, this, isExport); - } - } - } - - @Override - public void addNotifiableMetaTileEntity(MetaTileEntity metaTileEntity) { - this.notifiableEntities.add(metaTileEntity); - } - - @Override - public void removeNotifiableMetaTileEntity(MetaTileEntity metaTileEntity) { - this.notifiableEntities.remove(metaTileEntity); + super(capacity, entityToNotify, isExport); } } diff --git a/src/main/java/gregtech/api/capability/impl/NotifiableFluidTank.java b/src/main/java/gregtech/api/capability/impl/NotifiableFluidTank.java index 2669fa35097..a7686c43d69 100644 --- a/src/main/java/gregtech/api/capability/impl/NotifiableFluidTank.java +++ b/src/main/java/gregtech/api/capability/impl/NotifiableFluidTank.java @@ -1,14 +1,18 @@ package gregtech.api.capability.impl; +import gregtech.api.capability.IFilter; import gregtech.api.capability.INotifiableHandler; import gregtech.api.metatileentity.MetaTileEntity; -import net.minecraftforge.fluids.FluidTank; +import net.minecraftforge.fluids.FluidStack; + +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.List; -public class NotifiableFluidTank extends FluidTank implements INotifiableHandler { +public class NotifiableFluidTank extends FilteredFluidHandler implements INotifiableHandler { List notifiableEntities = new ArrayList<>(); private final boolean isExport; @@ -38,4 +42,10 @@ public void addNotifiableMetaTileEntity(MetaTileEntity metaTileEntity) { public void removeNotifiableMetaTileEntity(MetaTileEntity metaTileEntity) { this.notifiableEntities.remove(metaTileEntity); } + + @Override + public @NotNull NotifiableFluidTank setFilter(@Nullable IFilter filter) { + super.setFilter(filter); + return this; + } } diff --git a/src/main/java/gregtech/api/capability/impl/NotifiableItemStackHandler.java b/src/main/java/gregtech/api/capability/impl/NotifiableItemStackHandler.java index 472c29e033f..ec6a44ba6a6 100644 --- a/src/main/java/gregtech/api/capability/impl/NotifiableItemStackHandler.java +++ b/src/main/java/gregtech/api/capability/impl/NotifiableItemStackHandler.java @@ -4,13 +4,10 @@ import gregtech.api.items.itemhandlers.GTItemStackHandler; import gregtech.api.metatileentity.MetaTileEntity; -import net.minecraftforge.items.IItemHandlerModifiable; - import java.util.ArrayList; import java.util.List; -public class NotifiableItemStackHandler extends GTItemStackHandler - implements IItemHandlerModifiable, INotifiableHandler { +public class NotifiableItemStackHandler extends GTItemStackHandler implements INotifiableHandler { List notifiableEntities = new ArrayList<>(); private final boolean isExport; diff --git a/src/main/java/gregtech/api/capability/impl/SingleFluidFilter.java b/src/main/java/gregtech/api/capability/impl/SingleFluidFilter.java index 51c1d8eb682..1f164f9353c 100644 --- a/src/main/java/gregtech/api/capability/impl/SingleFluidFilter.java +++ b/src/main/java/gregtech/api/capability/impl/SingleFluidFilter.java @@ -43,7 +43,7 @@ public int getPriority() { } @Override - public IFilter negate() { + public @NotNull IFilter negate() { return new SingleFluidFilter(this.fluid, !this.blacklist); } diff --git a/src/main/java/gregtech/api/capability/impl/SteamMultiblockRecipeLogic.java b/src/main/java/gregtech/api/capability/impl/SteamMultiblockRecipeLogic.java index 2c05b255d40..94674cda7ff 100644 --- a/src/main/java/gregtech/api/capability/impl/SteamMultiblockRecipeLogic.java +++ b/src/main/java/gregtech/api/capability/impl/SteamMultiblockRecipeLogic.java @@ -1,7 +1,7 @@ package gregtech.api.capability.impl; import gregtech.api.GTValues; -import gregtech.api.capability.IMultipleTankHandler; +import gregtech.api.capability.MultipleTankHandler; import gregtech.api.metatileentity.multiblock.RecipeMapSteamMultiblockController; import gregtech.api.recipes.Recipe; import gregtech.api.recipes.RecipeMap; @@ -27,14 +27,14 @@ public class SteamMultiblockRecipeLogic extends AbstractRecipeLogic { - private IMultipleTankHandler steamFluidTank; + private MultipleTankHandler steamFluidTank; private IFluidTank steamFluidTankCombined; // EU per mB private final double conversionRate; public SteamMultiblockRecipeLogic(RecipeMapSteamMultiblockController tileEntity, RecipeMap recipeMap, - IMultipleTankHandler steamFluidTank, double conversionRate) { + MultipleTankHandler steamFluidTank, double conversionRate) { super(tileEntity, recipeMap); this.steamFluidTank = steamFluidTank; this.conversionRate = conversionRate; @@ -59,7 +59,7 @@ protected IItemHandlerModifiable getOutputInventory() { return controller.getOutputInventory(); } - protected IMultipleTankHandler getSteamFluidTank() { + protected MultipleTankHandler getSteamFluidTank() { RecipeMapSteamMultiblockController controller = (RecipeMapSteamMultiblockController) metaTileEntity; return controller.getSteamFluidTank(); } @@ -69,7 +69,7 @@ private void combineSteamTanks() { if (steamFluidTank == null) steamFluidTankCombined = new FluidTank(0); else { - int capacity = steamFluidTank.getTanks() * 64000; + int capacity = steamFluidTank.size() * 64000; steamFluidTankCombined = new FluidTank(capacity); steamFluidTankCombined.fill(steamFluidTank.drain(capacity, false), true); } diff --git a/src/main/java/gregtech/api/gui/widgets/TankWidget.java b/src/main/java/gregtech/api/gui/widgets/TankWidget.java index 7a550ff478e..13ffb363cbc 100644 --- a/src/main/java/gregtech/api/gui/widgets/TankWidget.java +++ b/src/main/java/gregtech/api/gui/widgets/TankWidget.java @@ -25,7 +25,6 @@ import net.minecraft.util.text.TextFormatting; import net.minecraftforge.fluids.*; import net.minecraftforge.fluids.capability.CapabilityFluidHandler; -import net.minecraftforge.fluids.capability.IFluidHandler; import net.minecraftforge.fluids.capability.IFluidHandlerItem; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; @@ -101,9 +100,6 @@ public TankWidget setFluidRenderOffset(int fluidRenderOffset) { } public TankWidget setContainerClicking(boolean allowClickContainerFilling, boolean allowClickContainerEmptying) { - if (!(fluidTank instanceof IFluidHandler)) - throw new IllegalStateException( - "Container IO is only supported for fluid tanks that implement IFluidHandler"); this.allowClickFilling = allowClickContainerFilling; this.allowClickEmptying = allowClickContainerEmptying; return this; diff --git a/src/main/java/gregtech/api/items/itemhandlers/GTItemStackHandler.java b/src/main/java/gregtech/api/items/itemhandlers/GTItemStackHandler.java index 91c5a6f2853..8a324e28b47 100644 --- a/src/main/java/gregtech/api/items/itemhandlers/GTItemStackHandler.java +++ b/src/main/java/gregtech/api/items/itemhandlers/GTItemStackHandler.java @@ -1,14 +1,20 @@ package gregtech.api.items.itemhandlers; +import gregtech.api.capability.IFilter; +import gregtech.api.capability.IFilteredItemContainer; import gregtech.api.metatileentity.MetaTileEntity; import net.minecraft.item.ItemStack; import net.minecraft.util.NonNullList; import net.minecraftforge.items.ItemStackHandler; -public class GTItemStackHandler extends ItemStackHandler { +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; - final private MetaTileEntity metaTileEntity; +public class GTItemStackHandler extends ItemStackHandler implements IFilteredItemContainer { + + private final MetaTileEntity metaTileEntity; + private IFilter filter; public GTItemStackHandler(MetaTileEntity metaTileEntity) { super(); @@ -37,4 +43,25 @@ public void setStackInSlot(int slot, ItemStack stack) { public void onContentsChanged(int slot) { metaTileEntity.markDirty(); } + + @Override + public ItemStack insertItem(int slot, ItemStack stack, boolean simulate) { + if (!isItemValid(slot, stack)) return stack; + return super.insertItem(slot, stack, simulate); + } + + @Override + public boolean isItemValid(int slot, @NotNull ItemStack stack) { + return filter == null || filter.test(stack); + } + + public GTItemStackHandler setFilter(IFilter filter) { + this.filter = filter; + return this; + } + + @Override + public @Nullable IFilter getFilter() { + return this.filter; + } } diff --git a/src/main/java/gregtech/api/items/metaitem/MetaItem.java b/src/main/java/gregtech/api/items/metaitem/MetaItem.java index a17559b05b2..3801ce50a83 100644 --- a/src/main/java/gregtech/api/items/metaitem/MetaItem.java +++ b/src/main/java/gregtech/api/items/metaitem/MetaItem.java @@ -1,10 +1,7 @@ package gregtech.api.items.metaitem; import gregtech.api.GTValues; -import gregtech.api.capability.GregtechCapabilities; -import gregtech.api.capability.IElectricItem; -import gregtech.api.capability.IFilteredFluidContainer; -import gregtech.api.capability.IPropertyFluidFilter; +import gregtech.api.capability.*; import gregtech.api.capability.impl.CombinedCapabilityProvider; import gregtech.api.capability.impl.ElectricItem; import gregtech.api.gui.ModularUI; diff --git a/src/main/java/gregtech/api/metatileentity/MetaTileEntity.java b/src/main/java/gregtech/api/metatileentity/MetaTileEntity.java index 21f373638fb..7fee5f75122 100644 --- a/src/main/java/gregtech/api/metatileentity/MetaTileEntity.java +++ b/src/main/java/gregtech/api/metatileentity/MetaTileEntity.java @@ -8,6 +8,7 @@ import gregtech.api.capability.IControllable; import gregtech.api.capability.IDataStickIntractable; import gregtech.api.capability.IEnergyContainer; +import gregtech.api.capability.MultipleTankHandler; import gregtech.api.capability.impl.AbstractRecipeLogic; import gregtech.api.capability.impl.FluidHandlerProxy; import gregtech.api.capability.impl.FluidTankList; @@ -70,6 +71,7 @@ import net.minecraftforge.common.util.Constants.NBT; import net.minecraftforge.fluids.FluidActionResult; import net.minecraftforge.fluids.FluidUtil; +import net.minecraftforge.fluids.IFluidTank; import net.minecraftforge.fluids.capability.CapabilityFluidHandler; import net.minecraftforge.fluids.capability.IFluidHandler; import net.minecraftforge.fml.common.FMLCommonHandler; @@ -135,8 +137,8 @@ public abstract class MetaTileEntity implements ISyncedTileEntity, CoverHolder, protected IItemHandler itemInventory; - protected FluidTankList importFluids; - protected FluidTankList exportFluids; + protected MultipleTankHandler importFluids; + protected MultipleTankHandler exportFluids; protected IFluidHandler fluidInventory; @@ -156,8 +158,8 @@ public abstract class MetaTileEntity implements ISyncedTileEntity, CoverHolder, protected List notifiedItemOutputList = new ArrayList<>(); protected List notifiedItemInputList = new ArrayList<>(); - protected List notifiedFluidInputList = new ArrayList<>(); - protected List notifiedFluidOutputList = new ArrayList<>(); + protected List notifiedFluidInputList = new ArrayList<>(); + protected List notifiedFluidOutputList = new ArrayList<>(); protected boolean muffled = false; @@ -393,27 +395,27 @@ public final String getMetaFullName() { } public void addNotifiedInput(Object input) { - if (input instanceof IItemHandlerModifiable) { - if (!notifiedItemInputList.contains(input)) { - this.notifiedItemInputList.add((IItemHandlerModifiable) input); + if (input instanceof IItemHandlerModifiable handlerModifiable) { + if (!notifiedItemInputList.contains(handlerModifiable)) { + this.notifiedItemInputList.add(handlerModifiable); } } - if (input instanceof IFluidHandler) { - if (!notifiedFluidInputList.contains(input)) { - this.notifiedFluidInputList.add((IFluidHandler) input); + if (input instanceof IFluidTank tank) { + if (!notifiedFluidInputList.contains(tank)) { + this.notifiedFluidInputList.add(tank); } } } public void addNotifiedOutput(Object output) { - if (output instanceof IItemHandlerModifiable) { - if (!notifiedItemOutputList.contains(output)) { - this.notifiedItemOutputList.add((IItemHandlerModifiable) output); + if (output instanceof IItemHandlerModifiable item) { + if (!notifiedItemOutputList.contains(item)) { + this.notifiedItemOutputList.add(item); } } - if (output instanceof IFluidHandler) { - if (!notifiedFluidOutputList.contains(output)) { - this.notifiedFluidOutputList.add((IFluidHandler) output); + if (output instanceof IFluidTank tank) { + if (!notifiedFluidOutputList.contains(tank)) { + this.notifiedFluidOutputList.add(tank); } } } @@ -449,11 +451,11 @@ protected IItemHandlerModifiable createExportItemHandler() { return new GTItemStackHandler(this, 0); } - protected FluidTankList createImportFluidHandler() { + protected MultipleTankHandler createImportFluidHandler() { return new FluidTankList(false); } - protected FluidTankList createExportFluidHandler() { + protected MultipleTankHandler createExportFluidHandler() { return new FluidTankList(false); } @@ -1455,11 +1457,11 @@ public IItemHandlerModifiable getExportItems() { return exportItems; } - public FluidTankList getImportFluids() { + public MultipleTankHandler getImportFluids() { return importFluids; } - public FluidTankList getExportFluids() { + public MultipleTankHandler getExportFluids() { return exportFluids; } @@ -1471,11 +1473,11 @@ public List getNotifiedItemInputList() { return notifiedItemInputList; } - public List getNotifiedFluidInputList() { + public List getNotifiedFluidInputList() { return notifiedFluidInputList; } - public List getNotifiedFluidOutputList() { + public List getNotifiedFluidOutputList() { return notifiedFluidOutputList; } diff --git a/src/main/java/gregtech/api/metatileentity/SimpleGeneratorMetaTileEntity.java b/src/main/java/gregtech/api/metatileentity/SimpleGeneratorMetaTileEntity.java index e4443e15cd5..29347f1af6b 100644 --- a/src/main/java/gregtech/api/metatileentity/SimpleGeneratorMetaTileEntity.java +++ b/src/main/java/gregtech/api/metatileentity/SimpleGeneratorMetaTileEntity.java @@ -2,6 +2,7 @@ import gregtech.api.GTValues; import gregtech.api.capability.IActiveOutputSide; +import gregtech.api.capability.MultipleTankHandler; import gregtech.api.capability.impl.EnergyContainerHandler; import gregtech.api.capability.impl.FluidTankList; import gregtech.api.capability.impl.FuelRecipeLogic; @@ -62,7 +63,7 @@ protected RecipeLogicEnergy createWorkable(RecipeMap recipeMap) { } @Override - protected FluidTankList createExportFluidHandler() { + protected MultipleTankHandler createExportFluidHandler() { if (handlesRecipeOutputs) return super.createExportFluidHandler(); return new FluidTankList(false); diff --git a/src/main/java/gregtech/api/metatileentity/SimpleMachineMetaTileEntity.java b/src/main/java/gregtech/api/metatileentity/SimpleMachineMetaTileEntity.java index 64b8d3c86eb..3db5a293efb 100644 --- a/src/main/java/gregtech/api/metatileentity/SimpleMachineMetaTileEntity.java +++ b/src/main/java/gregtech/api/metatileentity/SimpleMachineMetaTileEntity.java @@ -182,7 +182,7 @@ public void addCover(@NotNull EnumFacing side, @NotNull Cover cover) { @SideOnly(Side.CLIENT) public void renderMetaTileEntity(CCRenderState renderState, Matrix4 translation, IVertexOperation[] pipeline) { super.renderMetaTileEntity(renderState, translation, pipeline); - if (outputFacingFluids != null && getExportFluids().getTanks() > 0) { + if (outputFacingFluids != null && getExportFluids().size() > 0) { Textures.PIPE_OUT_OVERLAY.renderSided(outputFacingFluids, renderState, RenderUtil.adjustTrans(translation, outputFacingFluids, 2), pipeline); } @@ -508,7 +508,7 @@ protected ModularUI.Builder createGuiTemplate(EntityPlayer player) { .shouldUseBaseBackground()); leftButtonStartX += 18; } - if (exportFluids.getTanks() > 0) { + if (exportFluids.size() > 0) { builder.widget(new ToggleButtonWidget(leftButtonStartX, 62 + yOffset, 18, 18, GuiTextures.BUTTON_FLUID_OUTPUT, this::isAutoOutputFluids, this::setAutoOutputFluids) .setTooltipText("gregtech.gui.fluid_auto_output.tooltip") @@ -521,7 +521,7 @@ protected ModularUI.Builder createGuiTemplate(EntityPlayer player) { .setTooltipHoverString("gregtech.gui.overclock.description") .setButtonTexture(GuiTextures.BUTTON_OVERCLOCK)); - if (exportItems.getSlots() + exportFluids.getTanks() <= 9) { + if (exportItems.getSlots() + exportFluids.size() <= 9) { ImageWidget logo = new ImageWidget(152, 63 + yOffset, 17, 17, GTValues.XMAS.get() ? getXmasLogo() : getLogo()).setIgnoreColor(true); diff --git a/src/main/java/gregtech/api/metatileentity/SteamMetaTileEntity.java b/src/main/java/gregtech/api/metatileentity/SteamMetaTileEntity.java index ed904815d2d..4f6d7751e81 100644 --- a/src/main/java/gregtech/api/metatileentity/SteamMetaTileEntity.java +++ b/src/main/java/gregtech/api/metatileentity/SteamMetaTileEntity.java @@ -1,6 +1,7 @@ package gregtech.api.metatileentity; import gregtech.api.GTValues; +import gregtech.api.capability.MultipleTankHandler; import gregtech.api.capability.impl.CommonFluidFilters; import gregtech.api.capability.impl.FilteredFluidHandler; import gregtech.api.capability.impl.FluidTankList; @@ -122,7 +123,7 @@ protected boolean isBrickedCasing() { } @Override - public FluidTankList createImportFluidHandler() { + public MultipleTankHandler createImportFluidHandler() { this.steamFluidTank = new FilteredFluidHandler(STEAM_CAPACITY).setFilter(CommonFluidFilters.STEAM); return new FluidTankList(false, steamFluidTank); } diff --git a/src/main/java/gregtech/api/metatileentity/WorkableTieredMetaTileEntity.java b/src/main/java/gregtech/api/metatileentity/WorkableTieredMetaTileEntity.java index 88651b9e9cc..26a41661c75 100644 --- a/src/main/java/gregtech/api/metatileentity/WorkableTieredMetaTileEntity.java +++ b/src/main/java/gregtech/api/metatileentity/WorkableTieredMetaTileEntity.java @@ -1,6 +1,7 @@ package gregtech.api.metatileentity; import gregtech.api.GTValues; +import gregtech.api.capability.MultipleTankHandler; import gregtech.api.capability.impl.AbstractRecipeLogic; import gregtech.api.capability.impl.EnergyContainerHandler; import gregtech.api.capability.impl.FluidTankList; @@ -116,7 +117,7 @@ protected IItemHandlerModifiable createExportItemHandler() { } @Override - protected FluidTankList createImportFluidHandler() { + protected MultipleTankHandler createImportFluidHandler() { if (workable == null) return new FluidTankList(false); NotifiableFluidTank[] fluidImports = new NotifiableFluidTank[workable.getRecipeMap().getMaxFluidInputs()]; for (int i = 0; i < fluidImports.length; i++) { @@ -128,7 +129,7 @@ protected FluidTankList createImportFluidHandler() { } @Override - protected FluidTankList createExportFluidHandler() { + protected MultipleTankHandler createExportFluidHandler() { if (workable == null) return new FluidTankList(false); FluidTank[] fluidExports = new FluidTank[workable.getRecipeMap().getMaxFluidOutputs()]; for (int i = 0; i < fluidExports.length; i++) { diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/FuelMultiblockController.java b/src/main/java/gregtech/api/metatileentity/multiblock/FuelMultiblockController.java index fb3a1993fc2..4c46bd05b63 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/FuelMultiblockController.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/FuelMultiblockController.java @@ -2,7 +2,7 @@ import gregtech.api.GTValues; import gregtech.api.capability.IEnergyContainer; -import gregtech.api.capability.IMultipleTankHandler; +import gregtech.api.capability.MultipleTankHandler; import gregtech.api.capability.impl.EnergyContainerList; import gregtech.api.capability.impl.MultiblockFuelRecipeLogic; import gregtech.api.recipes.RecipeMap; @@ -123,12 +123,12 @@ public List getDataInfo() { return list; } - protected int[] getTotalFluidAmount(FluidStack testStack, IMultipleTankHandler multiTank) { + protected int[] getTotalFluidAmount(FluidStack testStack, MultipleTankHandler multiTank) { int fluidAmount = 0; int fluidCapacity = 0; for (var tank : multiTank) { if (tank != null) { - FluidStack drainStack = tank.drain(testStack, false); + FluidStack drainStack = tank.drain(testStack.amount, false); if (drainStack != null && drainStack.amount > 0) { fluidAmount += drainStack.amount; fluidCapacity += tank.getCapacity(); diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockWithDisplayBase.java b/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockWithDisplayBase.java index 12c75ff27e9..eeeb22b2410 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockWithDisplayBase.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockWithDisplayBase.java @@ -28,8 +28,6 @@ import net.minecraft.util.math.BlockPos; import net.minecraft.util.text.ITextComponent; import net.minecraftforge.common.capabilities.Capability; -import net.minecraftforge.fluids.IFluidTank; -import net.minecraftforge.fluids.capability.IFluidHandler; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; @@ -532,9 +530,7 @@ protected void setVoidingMode(int mode) { // After changing the voiding mode, reset the notified buses in case a recipe can run now that voiding mode has // been changed - for (IFluidTank tank : this.getAbilities(MultiblockAbility.IMPORT_FLUIDS)) { - this.getNotifiedFluidInputList().add((IFluidHandler) tank); - } + this.getNotifiedFluidInputList().addAll(this.getAbilities(MultiblockAbility.IMPORT_FLUIDS)); this.getNotifiedItemInputList() .addAll(this.getAbilities(MultiblockAbility.IMPORT_ITEMS)); diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapMultiblockController.java b/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapMultiblockController.java index 02ba5655857..ef3206df014 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapMultiblockController.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapMultiblockController.java @@ -3,7 +3,7 @@ import gregtech.api.GTValues; import gregtech.api.capability.IDistinctBusController; import gregtech.api.capability.IEnergyContainer; -import gregtech.api.capability.IMultipleTankHandler; +import gregtech.api.capability.MultipleTankHandler; import gregtech.api.capability.impl.EnergyContainerList; import gregtech.api.capability.impl.FluidTankList; import gregtech.api.capability.impl.ItemHandlerList; @@ -46,9 +46,9 @@ public abstract class RecipeMapMultiblockController extends MultiblockWithDispla protected MultiblockRecipeLogic recipeMapWorkable; protected IItemHandlerModifiable inputInventory; protected IItemHandlerModifiable outputInventory; - protected IMultipleTankHandler inputFluidInventory; - protected IMultipleTankHandler outputFluidInventory; - protected IMultipleTankHandler extendedFluidInputs; + protected MultipleTankHandler inputFluidInventory; + protected MultipleTankHandler outputFluidInventory; + protected MultipleTankHandler extendedFluidInputs; protected IEnergyContainer energyContainer; private boolean isDistinct = false; @@ -75,14 +75,14 @@ public IItemHandlerModifiable getOutputInventory() { return outputInventory; } - public IMultipleTankHandler getInputFluidInventory() { + public MultipleTankHandler getInputFluidInventory() { // if distinct, return the normal input fluid inventory, // as recipe logic handles gathering extra fluids // if not distinct, return all the fluids instead return isDistinct() ? inputFluidInventory : extendedFluidInputs; } - public IMultipleTankHandler getOutputFluidInventory() { + public MultipleTankHandler getOutputFluidInventory() { return outputFluidInventory; } @@ -147,7 +147,7 @@ private void resetTileAbilities() { this.energyContainer = new EnergyContainerList(Lists.newArrayList()); } - protected IMultipleTankHandler extendedImportFluidList(IMultipleTankHandler fluids) { + protected MultipleTankHandler extendedImportFluidList(MultipleTankHandler fluids) { List tanks = new ArrayList<>(fluids.getFluidTanks()); // iterate import items to look for and tanks that we might have missed // honestly this might not be worth checking because @@ -155,7 +155,7 @@ protected IMultipleTankHandler extendedImportFluidList(IMultipleTankHandler flui for (var handler : getAbilities(MultiblockAbility.IMPORT_ITEMS)) { if (handler instanceof IFluidTank tank) { if (!tanks.contains(tank)) tanks.add(tank); - } else if (handler instanceof IMultipleTankHandler multipleTankHandler) { + } else if (handler instanceof MultipleTankHandler multipleTankHandler) { for (var tank : multipleTankHandler.getFluidTanks()) { if (!tanks.contains(tank)) tanks.add(tank); } diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapSteamMultiblockController.java b/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapSteamMultiblockController.java index fd396609419..0d0e6b93bd3 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapSteamMultiblockController.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/RecipeMapSteamMultiblockController.java @@ -1,6 +1,6 @@ package gregtech.api.metatileentity.multiblock; -import gregtech.api.capability.IMultipleTankHandler; +import gregtech.api.capability.MultipleTankHandler; import gregtech.api.capability.impl.FluidTankList; import gregtech.api.capability.impl.ItemHandlerList; import gregtech.api.capability.impl.SteamMultiblockRecipeLogic; @@ -41,7 +41,7 @@ public abstract class RecipeMapSteamMultiblockController extends MultiblockWithD protected IItemHandlerModifiable inputInventory; protected IItemHandlerModifiable outputInventory; - protected IMultipleTankHandler steamFluidTank; + protected MultipleTankHandler steamFluidTank; public RecipeMapSteamMultiblockController(ResourceLocation metaTileEntityId, RecipeMap recipeMap, double conversionRate) { @@ -59,7 +59,7 @@ public IItemHandlerModifiable getOutputInventory() { return outputInventory; } - public IMultipleTankHandler getSteamFluidTank() { + public MultipleTankHandler getSteamFluidTank() { return steamFluidTank; } diff --git a/src/main/java/gregtech/api/recipes/Recipe.java b/src/main/java/gregtech/api/recipes/Recipe.java index fc275cdf52f..0286faf74ea 100644 --- a/src/main/java/gregtech/api/recipes/Recipe.java +++ b/src/main/java/gregtech/api/recipes/Recipe.java @@ -1,6 +1,6 @@ package gregtech.api.recipes; -import gregtech.api.capability.IMultipleTankHandler; +import gregtech.api.capability.MultipleTankHandler; import gregtech.api.recipes.category.GTRecipeCategory; import gregtech.api.recipes.chance.boost.ChanceBoostFunction; import gregtech.api.recipes.chance.output.ChancedOutputList; @@ -185,7 +185,7 @@ public static Recipe trimRecipeOutputs(Recipe currentRecipe, RecipeMap recipe } public final boolean matches(boolean consumeIfSuccessful, IItemHandlerModifiable inputs, - IMultipleTankHandler fluidInputs) { + MultipleTankHandler fluidInputs) { Pair fluids = null; Pair items = null; diff --git a/src/main/java/gregtech/api/recipes/RecipeMap.java b/src/main/java/gregtech/api/recipes/RecipeMap.java index a2c2ef7b1f4..eda414a9049 100644 --- a/src/main/java/gregtech/api/recipes/RecipeMap.java +++ b/src/main/java/gregtech/api/recipes/RecipeMap.java @@ -2,7 +2,7 @@ import gregtech.api.GTValues; import gregtech.api.GregTechAPI; -import gregtech.api.capability.IMultipleTankHandler; +import gregtech.api.capability.MultipleTankHandler; import gregtech.api.capability.impl.FluidTankList; import gregtech.api.gui.ModularUI; import gregtech.api.gui.resources.TextureArea; @@ -533,7 +533,7 @@ amount, getMaxFluidOutputs()), } @Nullable - public Recipe findRecipe(long voltage, IItemHandlerModifiable inputs, IMultipleTankHandler fluidInputs) { + public Recipe findRecipe(long voltage, IItemHandlerModifiable inputs, MultipleTankHandler fluidInputs) { return this.findRecipe(voltage, GTUtility.itemHandlerToList(inputs), GTUtility.fluidHandlerToList(fluidInputs)); } @@ -892,7 +892,7 @@ private Recipe diveIngredientTreeFindRecipeCollisions(@NotNull List builder) {} default RecipeBuilder findMultipliedParallelRecipe(@NotNull RecipeMap recipeMap, @NotNull Recipe currentRecipe, @NotNull IItemHandlerModifiable inputs, - @NotNull IMultipleTankHandler fluidInputs, + @NotNull MultipleTankHandler fluidInputs, @NotNull IItemHandlerModifiable outputs, - @NotNull IMultipleTankHandler fluidOutputs, int parallelLimit, + @NotNull MultipleTankHandler fluidOutputs, int parallelLimit, long maxVoltage, @NotNull IVoidable voidable) { return ParallelLogic.doParallelRecipes( currentRecipe, @@ -85,9 +85,9 @@ default RecipeBuilder findAppendedParallelItemRecipe(@NotNull RecipeMap re // Recipes passed in here should be already trimmed, if desired default Recipe findParallelRecipe(@NotNull Recipe currentRecipe, @NotNull IItemHandlerModifiable inputs, - @NotNull IMultipleTankHandler fluidInputs, + @NotNull MultipleTankHandler fluidInputs, @NotNull IItemHandlerModifiable outputs, - @NotNull IMultipleTankHandler fluidOutputs, long maxVoltage, int parallelLimit) { + @NotNull MultipleTankHandler fluidOutputs, long maxVoltage, int parallelLimit) { if (parallelLimit > 1 && getRecipeMap() != null) { RecipeBuilder parallelBuilder = switch (getParallelLogicType()) { case MULTIPLY -> findMultipliedParallelRecipe(getRecipeMap(), currentRecipe, inputs, fluidInputs, diff --git a/src/main/java/gregtech/api/recipes/logic/ParallelLogic.java b/src/main/java/gregtech/api/recipes/logic/ParallelLogic.java index c056890d086..75189b98576 100644 --- a/src/main/java/gregtech/api/recipes/logic/ParallelLogic.java +++ b/src/main/java/gregtech/api/recipes/logic/ParallelLogic.java @@ -1,6 +1,6 @@ package gregtech.api.recipes.logic; -import gregtech.api.capability.IMultipleTankHandler; +import gregtech.api.capability.MultipleTankHandler; import gregtech.api.metatileentity.IVoidable; import gregtech.api.recipes.FluidKey; import gregtech.api.recipes.Recipe; @@ -10,7 +10,6 @@ import gregtech.api.util.GTHashMaps; import gregtech.api.util.GTUtility; import gregtech.api.util.ItemStackHashStrategy; -import gregtech.api.util.OverlayedFluidHandler; import gregtech.api.util.OverlayedItemHandler; import net.minecraft.item.ItemStack; @@ -41,7 +40,7 @@ public abstract class ParallelLogic { */ public static int getMaxRecipeMultiplier(@NotNull Recipe recipe, @NotNull IItemHandlerModifiable inputs, - @NotNull IMultipleTankHandler fluidInputs, int parallelAmount) { + @NotNull MultipleTankHandler fluidInputs, int parallelAmount) { // Find all the items in the combined Item Input inventories and create oversized ItemStacks Object2IntMap ingredientStacks = GTHashMaps.fromItemHandler(inputs); @@ -71,7 +70,7 @@ public static int getMaxRecipeMultiplier(@NotNull Recipe recipe, @NotNull IItemH * @return returns the amount of recipes that can be merged successfully into a given output inventory */ public static int limitByOutputMerging(@NotNull Recipe recipe, @NotNull IItemHandlerModifiable outputs, - @NotNull IMultipleTankHandler fluidOutputs, int parallelAmount, + @NotNull MultipleTankHandler fluidOutputs, int parallelAmount, boolean voidItems, boolean voidFluids) { int modifiedItemParallelAmount = Integer.MAX_VALUE; int modifiedFluidParallelAmount = Integer.MAX_VALUE; @@ -103,7 +102,7 @@ public static int limitByOutputMerging(@NotNull Recipe recipe, @NotNull IItemHan if (voidFluids) { modifiedFluidParallelAmount = parallelAmount; } else { - modifiedFluidParallelAmount = limitParallelByFluids(recipe, new OverlayedFluidHandler(fluidOutputs), + modifiedFluidParallelAmount = limitParallelByFluids(recipe, fluidOutputs, modifiedItemParallelAmount); } @@ -120,7 +119,7 @@ public static int limitByOutputMerging(@NotNull Recipe recipe, @NotNull IItemHan * @param recipe the recipe from which we get the input to product ratio * @param multiplier the maximum possible multiplied we can get from the input inventory * see - * {@link ParallelLogic#getMaxRecipeMultiplier(Recipe, IItemHandlerModifiable, IMultipleTankHandler, int)} + * {@link ParallelLogic#getMaxRecipeMultiplier(Recipe, IItemHandlerModifiable, MultipleTankHandler, int)} * @return the amount of times a {@link Recipe} outputs can be merged into an inventory without * voiding products. */ @@ -166,7 +165,7 @@ public static int limitParallelByItems(@NotNull Recipe recipe, @NotNull Overlaye * @param outputsToAppend the recipe outputs from the recipe we want to append to the recipe we are building * @param multiplier the maximum possible multiplied we can get from the input inventory * see - * {@link ParallelLogic#getMaxRecipeMultiplier(Recipe, IItemHandlerModifiable, IMultipleTankHandler, int)} + * {@link ParallelLogic#getMaxRecipeMultiplier(Recipe, IItemHandlerModifiable, MultipleTankHandler, int)} * @return the amount of times a {@link Recipe} outputs can be merged into an inventory without * voiding products. */ @@ -253,17 +252,16 @@ public static int limitParallelByItemsIncremental(@NotNull List recip * @param recipe the recipe from which we get the fluid input to product ratio * @param multiplier the maximum possible multiplied we can get from the input tanks * see - * {@link ParallelLogic#getMaxRecipeMultiplier(Recipe, IItemHandlerModifiable, IMultipleTankHandler, int)} + * {@link ParallelLogic#getMaxRecipeMultiplier(Recipe, IItemHandlerModifiable, MultipleTankHandler, int)} * @return the amount of times a {@link Recipe} outputs can be merged into a fluid handler without * voiding products. */ public static int limitParallelByFluids(@NotNull Recipe recipe, - @NotNull OverlayedFluidHandler overlayedFluidHandler, int multiplier) { + @NotNull MultipleTankHandler tankHandler, int multiplier) { int minMultiplier = 0; int maxMultiplier = multiplier; while (minMultiplier != maxMultiplier) { - overlayedFluidHandler.reset(); int amountLeft = 0; @@ -275,7 +273,7 @@ public static int limitParallelByFluids(@NotNull Recipe recipe, } else { amountLeft = fluidStack.amount * multiplier; } - int inserted = overlayedFluidHandler.insertFluid(fluidStack, amountLeft); + int inserted = tankHandler.simulateFill(fluidStack, amountLeft); if (inserted > 0) { amountLeft -= inserted; } @@ -476,9 +474,9 @@ protected static int getMaxRatioFluid(@NotNull Map countFluid // take care of voiding public static RecipeBuilder doParallelRecipes(@NotNull Recipe currentRecipe, @NotNull RecipeMap recipeMap, @NotNull IItemHandlerModifiable importInventory, - @NotNull IMultipleTankHandler importFluids, + @NotNull MultipleTankHandler importFluids, @NotNull IItemHandlerModifiable exportInventory, - @NotNull IMultipleTankHandler exportFluids, int parallelAmount, + @NotNull MultipleTankHandler exportFluids, int parallelAmount, long maxVoltage, @NotNull IVoidable voidable) { // First check if we are limited by recipe inputs. This can short circuit a lot of consecutive checking int multiplierByInputs = getMaxRecipeMultiplier(currentRecipe, importInventory, importFluids, parallelAmount); diff --git a/src/main/java/gregtech/api/recipes/ui/RecipeMapUI.java b/src/main/java/gregtech/api/recipes/ui/RecipeMapUI.java index a6d66d3e62e..b5f81a40024 100644 --- a/src/main/java/gregtech/api/recipes/ui/RecipeMapUI.java +++ b/src/main/java/gregtech/api/recipes/ui/RecipeMapUI.java @@ -1,6 +1,6 @@ package gregtech.api.recipes.ui; -import gregtech.api.capability.impl.FluidTankList; +import gregtech.api.capability.MultipleTankHandler; import gregtech.api.gui.GuiTextures; import gregtech.api.gui.ModularUI; import gregtech.api.gui.resources.TextureArea; @@ -117,7 +117,8 @@ public static byte computeOverlayKey(boolean isOutput, boolean isFluid, boolean * @return the populated builder */ public ModularUI.Builder createJeiUITemplate(IItemHandlerModifiable importItems, IItemHandlerModifiable exportItems, - FluidTankList importFluids, FluidTankList exportFluids, int yOffset) { + MultipleTankHandler importFluids, MultipleTankHandler exportFluids, + int yOffset) { ModularUI.Builder builder = ModularUI.defaultBuilder(yOffset); builder.widget(new RecipeProgressWidget(200, 78, 23 + yOffset, 20, 20, progressBarTexture, moveType, recipeMap)); @@ -141,8 +142,8 @@ public ModularUI.Builder createJeiUITemplate(IItemHandlerModifiable importItems, * @return the populated builder */ public ModularUI.Builder createUITemplate(DoubleSupplier progressSupplier, IItemHandlerModifiable importItems, - IItemHandlerModifiable exportItems, FluidTankList importFluids, - FluidTankList exportFluids, int yOffset) { + IItemHandlerModifiable exportItems, MultipleTankHandler importFluids, + MultipleTankHandler exportFluids, int yOffset) { ModularUI.Builder builder = ModularUI.defaultBuilder(yOffset); builder.widget( new RecipeProgressWidget(progressSupplier, 78, 23 + yOffset, 20, 20, progressBarTexture, @@ -168,8 +169,9 @@ public ModularUI.Builder createUITemplate(DoubleSupplier progressSupplier, IItem */ public ModularUI.Builder createUITemplateNoOutputs(DoubleSupplier progressSupplier, IItemHandlerModifiable importItems, - IItemHandlerModifiable exportItems, FluidTankList importFluids, - FluidTankList exportFluids, int yOffset) { + IItemHandlerModifiable exportItems, + MultipleTankHandler importFluids, + MultipleTankHandler exportFluids, int yOffset) { ModularUI.Builder builder = ModularUI.defaultBuilder(yOffset); builder.widget( new RecipeProgressWidget(progressSupplier, 78, 23 + yOffset, 20, 20, progressBarTexture, @@ -190,9 +192,9 @@ public ModularUI.Builder createUITemplateNoOutputs(DoubleSupplier progressSuppli */ protected void addInventorySlotGroup(@NotNull ModularUI.Builder builder, @NotNull IItemHandlerModifiable itemHandler, - @NotNull FluidTankList fluidHandler, boolean isOutputs, int yOffset) { + @NotNull MultipleTankHandler fluidHandler, boolean isOutputs, int yOffset) { int itemInputsCount = itemHandler.getSlots(); - int fluidInputsCount = fluidHandler.getTanks(); + int fluidInputsCount = fluidHandler.size(); boolean invertFluids = false; if (itemInputsCount == 0) { int tmp = itemInputsCount; @@ -205,9 +207,9 @@ protected void addInventorySlotGroup(@NotNull ModularUI.Builder builder, int itemSlotsToDown = inputSlotGrid[1]; int startInputsX = isOutputs ? 106 : 70 - itemSlotsToLeft * 18; int startInputsY = 33 - (int) (itemSlotsToDown / 2.0 * 18) + yOffset; - boolean wasGroup = itemHandler.getSlots() + fluidHandler.getTanks() == 12; + boolean wasGroup = itemHandler.getSlots() + fluidHandler.size() == 12; if (wasGroup) startInputsY -= 9; - else if (itemHandler.getSlots() >= 6 && fluidHandler.getTanks() >= 2 && !isOutputs) startInputsY -= 9; + else if (itemHandler.getSlots() >= 6 && fluidHandler.size() >= 2 && !isOutputs) startInputsY -= 9; for (int i = 0; i < itemSlotsToDown; i++) { for (int j = 0; j < itemSlotsToLeft; j++) { int slotIndex = i * itemSlotsToLeft + j; @@ -250,13 +252,13 @@ protected void addInventorySlotGroup(@NotNull ModularUI.Builder builder, * @param isOutputs if slots should be output slots */ protected void addSlot(ModularUI.Builder builder, int x, int y, int slotIndex, IItemHandlerModifiable itemHandler, - FluidTankList fluidHandler, boolean isFluid, boolean isOutputs) { + MultipleTankHandler fluidHandler, boolean isFluid, boolean isOutputs) { if (!isFluid) { builder.widget(new SlotWidget(itemHandler, slotIndex, x, y, true, !isOutputs).setBackgroundTexture( getOverlaysForSlot(isOutputs, false, slotIndex == itemHandler.getSlots() - 1))); } else { builder.widget(new TankWidget(fluidHandler.getTankAt(slotIndex), x, y, 18, 18).setAlwaysShowFull(true) - .setBackgroundTexture(getOverlaysForSlot(isOutputs, true, slotIndex == fluidHandler.getTanks() - 1)) + .setBackgroundTexture(getOverlaysForSlot(isOutputs, true, slotIndex == fluidHandler.size() - 1)) .setContainerClicking(true, !isOutputs)); } } diff --git a/src/main/java/gregtech/api/recipes/ui/impl/AssemblyLineUI.java b/src/main/java/gregtech/api/recipes/ui/impl/AssemblyLineUI.java index adc2e1ff50b..89574ea497a 100644 --- a/src/main/java/gregtech/api/recipes/ui/impl/AssemblyLineUI.java +++ b/src/main/java/gregtech/api/recipes/ui/impl/AssemblyLineUI.java @@ -1,6 +1,6 @@ package gregtech.api.recipes.ui.impl; -import gregtech.api.capability.impl.FluidTankList; +import gregtech.api.capability.MultipleTankHandler; import gregtech.api.gui.GuiTextures; import gregtech.api.gui.ModularUI; import gregtech.api.gui.widgets.ProgressWidget; @@ -27,7 +27,8 @@ public AssemblyLineUI(@NotNull R recipeMap) { @Override @NotNull public ModularUI.Builder createJeiUITemplate(IItemHandlerModifiable importItems, IItemHandlerModifiable exportItems, - FluidTankList importFluids, FluidTankList exportFluids, int yOffset) { + MultipleTankHandler importFluids, MultipleTankHandler exportFluids, + int yOffset) { ModularUI.Builder builder = ModularUI.builder(GuiTextures.BACKGROUND, 176, 176) .widget(new ProgressWidget(200, 80, 1, 54, 72, GuiTextures.PROGRESS_BAR_ASSEMBLY_LINE, ProgressWidget.MoveType.HORIZONTAL)) @@ -41,7 +42,7 @@ public ModularUI.Builder createJeiUITemplate(IItemHandlerModifiable importItems, @Override protected void addInventorySlotGroup(@NotNull ModularUI.Builder builder, @NotNull IItemHandlerModifiable itemHandler, - @NotNull FluidTankList fluidHandler, boolean isOutputs, int yOffset) { + @NotNull MultipleTankHandler fluidHandler, boolean isOutputs, int yOffset) { int startInputsX = 80 - 4 * 18; int startInputsY = 37 - 2 * 18; diff --git a/src/main/java/gregtech/api/recipes/ui/impl/CokeOvenUI.java b/src/main/java/gregtech/api/recipes/ui/impl/CokeOvenUI.java index 3d453bfe012..d2920aff372 100644 --- a/src/main/java/gregtech/api/recipes/ui/impl/CokeOvenUI.java +++ b/src/main/java/gregtech/api/recipes/ui/impl/CokeOvenUI.java @@ -1,6 +1,6 @@ package gregtech.api.recipes.ui.impl; -import gregtech.api.capability.impl.FluidTankList; +import gregtech.api.capability.MultipleTankHandler; import gregtech.api.gui.GuiTextures; import gregtech.api.gui.ModularUI; import gregtech.api.gui.widgets.ProgressWidget; @@ -24,7 +24,8 @@ public CokeOvenUI(@NotNull R recipeMap) { @Override public ModularUI.Builder createJeiUITemplate(IItemHandlerModifiable importItems, IItemHandlerModifiable exportItems, - FluidTankList importFluids, FluidTankList exportFluids, int yOffset) { + MultipleTankHandler importFluids, MultipleTankHandler exportFluids, + int yOffset) { ModularUI.Builder builder = ModularUI.builder(GuiTextures.BACKGROUND, 176, 100) .widget(new ProgressWidget(200, 70, 19, 36, 18, GuiTextures.PROGRESS_BAR_COKE_OVEN, ProgressWidget.MoveType.HORIZONTAL)); diff --git a/src/main/java/gregtech/api/recipes/ui/impl/CrackerUnitUI.java b/src/main/java/gregtech/api/recipes/ui/impl/CrackerUnitUI.java index 9544113498d..28f9f77eff9 100644 --- a/src/main/java/gregtech/api/recipes/ui/impl/CrackerUnitUI.java +++ b/src/main/java/gregtech/api/recipes/ui/impl/CrackerUnitUI.java @@ -1,6 +1,6 @@ package gregtech.api.recipes.ui.impl; -import gregtech.api.capability.impl.FluidTankList; +import gregtech.api.capability.MultipleTankHandler; import gregtech.api.gui.GuiTextures; import gregtech.api.gui.ModularUI; import gregtech.api.gui.widgets.ProgressWidget; @@ -30,7 +30,8 @@ public CrackerUnitUI(@NotNull R recipeMap) { @Override public ModularUI.Builder createJeiUITemplate(IItemHandlerModifiable importItems, IItemHandlerModifiable exportItems, - FluidTankList importFluids, FluidTankList exportFluids, int yOffset) { + MultipleTankHandler importFluids, MultipleTankHandler exportFluids, + int yOffset) { ModularUI.Builder builder = ModularUI.defaultBuilder(yOffset); if (recipeMap().getMaxInputs() == 1) { addSlot(builder, 52, 24 + yOffset, 0, importItems, importFluids, false, false); diff --git a/src/main/java/gregtech/api/recipes/ui/impl/DistillationTowerUI.java b/src/main/java/gregtech/api/recipes/ui/impl/DistillationTowerUI.java index e11f636fe6a..7270ebe500b 100644 --- a/src/main/java/gregtech/api/recipes/ui/impl/DistillationTowerUI.java +++ b/src/main/java/gregtech/api/recipes/ui/impl/DistillationTowerUI.java @@ -1,6 +1,6 @@ package gregtech.api.recipes.ui.impl; -import gregtech.api.capability.impl.FluidTankList; +import gregtech.api.capability.MultipleTankHandler; import gregtech.api.gui.GuiTextures; import gregtech.api.gui.ModularUI; import gregtech.api.gui.resources.TextureArea; @@ -22,7 +22,7 @@ public DistillationTowerUI(@NotNull R recipeMap) { @Override protected void addSlot(ModularUI.Builder builder, int x, int y, int slotIndex, IItemHandlerModifiable itemHandler, - FluidTankList fluidHandler, boolean isFluid, boolean isOutputs) { + MultipleTankHandler fluidHandler, boolean isFluid, boolean isOutputs) { if (isFluid) { TankWidget tankWidget = new TankWidget(fluidHandler.getTankAt(slotIndex), x, y, 18, 18); TextureArea base = GuiTextures.FLUID_SLOT; @@ -50,7 +50,8 @@ else if (slotIndex == 2 || slotIndex == 5 || slotIndex == 8 || slotIndex == 11) @Override public ModularUI.Builder createJeiUITemplate(IItemHandlerModifiable importItems, IItemHandlerModifiable exportItems, - FluidTankList importFluids, FluidTankList exportFluids, int yOffset) { + MultipleTankHandler importFluids, MultipleTankHandler exportFluids, + int yOffset) { ModularUI.Builder builder = ModularUI.defaultBuilder(yOffset); builder.widget(new ProgressWidget(200, 47, 8, 66, 58, GuiTextures.PROGRESS_BAR_DISTILLATION_TOWER, ProgressWidget.MoveType.HORIZONTAL)); @@ -65,9 +66,9 @@ public ModularUI.Builder createJeiUITemplate(IItemHandlerModifiable importItems, @Override protected void addInventorySlotGroup(@NotNull ModularUI.Builder builder, @NotNull IItemHandlerModifiable itemHandler, - @NotNull FluidTankList fluidHandler, boolean isOutputs, int yOffset) { + @NotNull MultipleTankHandler fluidHandler, boolean isOutputs, int yOffset) { int itemInputsCount = itemHandler.getSlots(); - int fluidInputsCount = fluidHandler.getTanks(); + int fluidInputsCount = fluidHandler.size(); boolean invertFluids = false; if (itemInputsCount == 0) { int tmp = itemInputsCount; @@ -80,9 +81,9 @@ protected void addInventorySlotGroup(@NotNull ModularUI.Builder builder, int itemSlotsToDown = inputSlotGrid[1]; int startInputsX = isOutputs ? 104 : 68 - itemSlotsToLeft * 18; int startInputsY = 55 - (int) (itemSlotsToDown / 2.0 * 18) + yOffset; - boolean wasGroupOutput = itemHandler.getSlots() + fluidHandler.getTanks() == 12; + boolean wasGroupOutput = itemHandler.getSlots() + fluidHandler.size() == 12; if (wasGroupOutput && isOutputs) startInputsY -= 9; - if (itemHandler.getSlots() == 6 && fluidHandler.getTanks() == 2 && !isOutputs) startInputsY -= 9; + if (itemHandler.getSlots() == 6 && fluidHandler.size() == 2 && !isOutputs) startInputsY -= 9; if (!isOutputs) { addSlot(builder, 40, startInputsY + (itemSlotsToDown - 1) * 18 - 18, 0, itemHandler, fluidHandler, invertFluids, false); diff --git a/src/main/java/gregtech/api/recipes/ui/impl/FormingPressUI.java b/src/main/java/gregtech/api/recipes/ui/impl/FormingPressUI.java index 1ef4fbdcc31..21fb98a67b5 100644 --- a/src/main/java/gregtech/api/recipes/ui/impl/FormingPressUI.java +++ b/src/main/java/gregtech/api/recipes/ui/impl/FormingPressUI.java @@ -1,6 +1,6 @@ package gregtech.api.recipes.ui.impl; -import gregtech.api.capability.impl.FluidTankList; +import gregtech.api.capability.MultipleTankHandler; import gregtech.api.gui.GuiTextures; import gregtech.api.gui.ModularUI; import gregtech.api.gui.resources.TextureArea; @@ -24,7 +24,7 @@ public FormingPressUI(@NotNull R recipeMap) { @Override protected void addSlot(ModularUI.Builder builder, int x, int y, int slotIndex, IItemHandlerModifiable itemHandler, - FluidTankList fluidHandler, boolean isFluid, boolean isOutputs) { + MultipleTankHandler fluidHandler, boolean isFluid, boolean isOutputs) { SlotWidget slotWidget = new SlotWidget(itemHandler, slotIndex, x, y, true, !isOutputs); TextureArea base = GuiTextures.SLOT; if (isOutputs) diff --git a/src/main/java/gregtech/api/recipes/ui/impl/ResearchStationUI.java b/src/main/java/gregtech/api/recipes/ui/impl/ResearchStationUI.java index 6ba9dc82e48..142db120023 100644 --- a/src/main/java/gregtech/api/recipes/ui/impl/ResearchStationUI.java +++ b/src/main/java/gregtech/api/recipes/ui/impl/ResearchStationUI.java @@ -1,6 +1,6 @@ package gregtech.api.recipes.ui.impl; -import gregtech.api.capability.impl.FluidTankList; +import gregtech.api.capability.MultipleTankHandler; import gregtech.api.gui.GuiTextures; import gregtech.api.gui.ModularUI; import gregtech.api.gui.widgets.ImageWidget; @@ -31,7 +31,8 @@ public ResearchStationUI(@NotNull R recipeMap) { @Override @NotNull public ModularUI.Builder createJeiUITemplate(IItemHandlerModifiable importItems, IItemHandlerModifiable exportItems, - FluidTankList importFluids, FluidTankList exportFluids, int yOffset) { + MultipleTankHandler importFluids, MultipleTankHandler exportFluids, + int yOffset) { Pair pairedSuppliers = GTUtility.createPairedSupplier(200, 90, 0.75); return ModularUI.builder(GuiTextures.BACKGROUND, 176, 166) .widget(new ImageWidget(10, 0, 84, 60, GuiTextures.PROGRESS_BAR_RESEARCH_STATION_BASE)) diff --git a/src/main/java/gregtech/api/util/GTTransferUtils.java b/src/main/java/gregtech/api/util/GTTransferUtils.java index d79024f844b..651128764b8 100644 --- a/src/main/java/gregtech/api/util/GTTransferUtils.java +++ b/src/main/java/gregtech/api/util/GTTransferUtils.java @@ -1,6 +1,6 @@ package gregtech.api.util; -import gregtech.api.capability.IMultipleTankHandler; +import gregtech.api.capability.MultipleTankHandler; import net.minecraft.item.ItemStack; import net.minecraftforge.fluids.FluidActionResult; @@ -135,26 +135,24 @@ public static boolean addItemsToItemHandler(final IItemHandler handler, } /** - * Simulates the insertion of fluid into a target fluid handler, then optionally performs the insertion. - *
- *
+ * Simulates the insertion of fluid into a target fluid handler, then optionally performs the insertion.
+ *
* Simulating will not modify any of the input parameters. Insertion will either succeed completely, or fail - * without modifying anything. - * This method should be called with {@code simulate} {@code true} first, then {@code simulate} {@code false}, - * only if it returned {@code true}. + * without modifying anything. This method should be called with {@code simulate} {@code true} first, then + * {@code simulate} {@code false}, only if it returned {@code true}. * + * @param fluidStacks the items to insert into {@code fluidHandler}. * @param fluidHandler the target inventory * @param simulate whether to simulate ({@code true}) or actually perform the insertion ({@code false}) - * @param fluidStacks the items to insert into {@code fluidHandler}. * @return {@code true} if the insertion succeeded, {@code false} otherwise. */ - public static boolean addFluidsToFluidHandler(IMultipleTankHandler fluidHandler, - boolean simulate, - List fluidStacks) { + public static boolean addFluidsToFluidHandler(List fluidStacks, + MultipleTankHandler fluidHandler, + boolean simulate) { if (simulate) { - OverlayedFluidHandler overlayedFluidHandler = new OverlayedFluidHandler(fluidHandler); for (FluidStack fluidStack : fluidStacks) { - int inserted = overlayedFluidHandler.insertFluid(fluidStack, fluidStack.amount); + int inserted = fluidHandler.fill(fluidStack, false); if (inserted != fluidStack.amount) { return false; } diff --git a/src/main/java/gregtech/api/util/GTUtility.java b/src/main/java/gregtech/api/util/GTUtility.java index 42da3a04836..4e97ba39307 100644 --- a/src/main/java/gregtech/api/util/GTUtility.java +++ b/src/main/java/gregtech/api/util/GTUtility.java @@ -3,7 +3,7 @@ import gregtech.api.GTValues; import gregtech.api.GregTechAPI; import gregtech.api.block.machines.MachineItemBlock; -import gregtech.api.capability.IMultipleTankHandler; +import gregtech.api.capability.MultipleTankHandler; import gregtech.api.cover.CoverDefinition; import gregtech.api.fluids.GTFluid; import gregtech.api.gui.widgets.ProgressWidget; @@ -431,8 +431,8 @@ public int size() { * @return a list of fluidstack linked with given fluid handler * modifications in list will reflect on fluid handler and wise-versa */ - public static List fluidHandlerToList(IMultipleTankHandler fluidInputs) { - List backedList = fluidInputs.getFluidTanks(); + public static List fluidHandlerToList(MultipleTankHandler fluidInputs) { + List backedList = fluidInputs.getFluidTanks(); return new AbstractList() { @Override diff --git a/src/main/java/gregtech/api/util/OverlayedFluidHandler.java b/src/main/java/gregtech/api/util/OverlayedFluidHandler.java index d2d0dafb239..5240a8c0390 100644 --- a/src/main/java/gregtech/api/util/OverlayedFluidHandler.java +++ b/src/main/java/gregtech/api/util/OverlayedFluidHandler.java @@ -1,10 +1,12 @@ package gregtech.api.util; -import gregtech.api.capability.IMultipleTankHandler; +import gregtech.api.capability.MultipleTankHandler; +import gregtech.api.capability.MultipleTankHandler.Entry; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.capability.IFluidTankProperties; +import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -13,20 +15,20 @@ import java.util.List; /** - * Simulates consecutive fills to {@link IMultipleTankHandler} instance. + * Simulates consecutive fills to {@link MultipleTankHandler} instance. */ +@Deprecated +@ApiStatus.ScheduledForRemoval(inVersion = "2.9") public class OverlayedFluidHandler { private final List overlayedTanks; - public OverlayedFluidHandler(@NotNull IMultipleTankHandler tank) { + public OverlayedFluidHandler(@NotNull MultipleTankHandler tank) { this.overlayedTanks = new ArrayList<>(); - var entries = tank.getFluidTanks().toArray(new IMultipleTankHandler.ITankEntry[0]); - Arrays.sort(entries, IMultipleTankHandler.ENTRY_COMPARATOR); - for (var fluidTank : entries) { - for (IFluidTankProperties property : fluidTank.getTankProperties()) { - this.overlayedTanks.add(new OverlayedTank(property, fluidTank.allowSameFluidFill())); - } + Entry[] entries = tank.getFluidTanks().toArray(new Entry[0]); + Arrays.sort(entries, MultipleTankHandler.ENTRY_COMPARATOR); + for (Entry fluidTank : entries) { + this.overlayedTanks.add(new OverlayedTank(fluidTank, fluidTank.allowSameFluidFill())); } } diff --git a/src/main/java/gregtech/common/covers/CoverDigitalInterface.java b/src/main/java/gregtech/common/covers/CoverDigitalInterface.java index 0063a113faa..e46930a1de2 100644 --- a/src/main/java/gregtech/common/covers/CoverDigitalInterface.java +++ b/src/main/java/gregtech/common/covers/CoverDigitalInterface.java @@ -321,7 +321,7 @@ public void update() { int maxSlotLimit = Integer.MAX_VALUE; if (this.getCoverableView() instanceof MetaTileEntity metaTileEntity) { maxSlotLimit = this.mode == MODE.ITEM ? metaTileEntity.getImportItems().getSlots() : - metaTileEntity.getImportFluids().getTanks(); + metaTileEntity.getImportFluids().size(); } double x = 0; double y = 1 - rayTraceResult.hitVec.y + rayTraceResult.getBlockPos().getY(); diff --git a/src/main/java/gregtech/common/items/behaviors/TricorderBehavior.java b/src/main/java/gregtech/common/items/behaviors/TricorderBehavior.java index 0f8abef5cbe..16307fb5734 100644 --- a/src/main/java/gregtech/common/items/behaviors/TricorderBehavior.java +++ b/src/main/java/gregtech/common/items/behaviors/TricorderBehavior.java @@ -8,7 +8,7 @@ import gregtech.api.capability.IQuantumController; import gregtech.api.capability.IQuantumStorage; import gregtech.api.capability.IWorkable; -import gregtech.api.capability.impl.FluidTankList; +import gregtech.api.capability.MultipleTankHandler; import gregtech.api.items.metaitem.stats.IItemBehaviour; import gregtech.api.metatileentity.IDataInfoProvider; import gregtech.api.metatileentity.MetaTileEntity; @@ -170,7 +170,7 @@ public List getScannerInfo(EntityPlayer player, World world, Blo list.add(new TextComponentTranslation("behavior.tricorder.divider")); // fluid tanks - FluidTankList tanks = metaTileEntity.getImportFluids(); + MultipleTankHandler tanks = metaTileEntity.getImportFluids(); int tankIndex = 0; boolean allTanksEmpty = true; if (tanks != null && !tanks.getFluidTanks().isEmpty()) { @@ -298,7 +298,7 @@ else if (metaTileEntity instanceof IDataInfoProvider) list.add(new TextComponentTranslation("behavior.tricorder.quantum_controller.connected_items", TextFormatting.RED.toString() + handler.getItemDelegate().getSlots())); list.add(new TextComponentTranslation("behavior.tricorder.quantum_controller.connected_fluids", - TextFormatting.RED.toString() + handler.getFluidDelegate().getTanks())); + TextFormatting.RED.toString() + handler.getFluidDelegate().size())); } else if (metaTileEntity instanceof IQuantumStoragestorage) { var qcontrollor = storage.getQuantumController(); if (qcontrollor != null) { diff --git a/src/main/java/gregtech/common/metatileentities/electric/MetaTileEntityPump.java b/src/main/java/gregtech/common/metatileentities/electric/MetaTileEntityPump.java index d268521db3c..f6d5e27a873 100644 --- a/src/main/java/gregtech/common/metatileentities/electric/MetaTileEntityPump.java +++ b/src/main/java/gregtech/common/metatileentities/electric/MetaTileEntityPump.java @@ -1,6 +1,7 @@ package gregtech.common.metatileentities.electric; import gregtech.api.GTValues; +import gregtech.api.capability.MultipleTankHandler; import gregtech.api.capability.impl.FluidTankList; import gregtech.api.gui.GuiTextures; import gregtech.api.gui.ModularUI; @@ -120,7 +121,7 @@ public void receiveCustomData(int dataId, PacketBuffer buf) { } @Override - protected FluidTankList createExportFluidHandler() { + protected MultipleTankHandler createExportFluidHandler() { return new FluidTankList(false, new FluidTank(16000 * Math.max(1, getTier()))); } diff --git a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityPumpHatch.java b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityPumpHatch.java index a17b955729c..96c3d126e96 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityPumpHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/MetaTileEntityPumpHatch.java @@ -1,5 +1,6 @@ package gregtech.common.metatileentities.multi; +import gregtech.api.capability.MultipleTankHandler; import gregtech.api.capability.impl.FilteredItemHandler; import gregtech.api.capability.impl.FluidTankList; import gregtech.api.items.itemhandlers.GTItemStackHandler; @@ -88,7 +89,7 @@ public void renderMetaTileEntity(CCRenderState renderState, Matrix4 translation, } @Override - protected FluidTankList createExportFluidHandler() { + protected MultipleTankHandler createExportFluidHandler() { return new FluidTankList(false, new FluidTank(FLUID_TANK_SIZE)); } diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityDistillationTower.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityDistillationTower.java index 886cd35353d..f35ab3d3e63 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityDistillationTower.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityDistillationTower.java @@ -1,7 +1,7 @@ package gregtech.common.metatileentities.multi.electric; import gregtech.api.capability.IDistillationTower; -import gregtech.api.capability.IMultipleTankHandler; +import gregtech.api.capability.MultipleTankHandler; import gregtech.api.capability.impl.DistillationTowerLogicHandler; import gregtech.api.capability.impl.MultiblockRecipeLogic; import gregtech.api.metatileentity.MetaTileEntity; @@ -158,7 +158,7 @@ protected void outputRecipeOutputs() { } @Override - protected boolean checkOutputSpaceFluids(@NotNull Recipe recipe, @NotNull IMultipleTankHandler exportFluids) { + protected boolean checkOutputSpaceFluids(@NotNull Recipe recipe, @NotNull MultipleTankHandler exportFluids) { // We have already trimmed fluid outputs at this time if (!metaTileEntity.canVoidRecipeFluidOutputs() && !handler.applyFluidToOutputs(recipe.getAllFluidOutputs(), false)) { @@ -169,7 +169,7 @@ protected boolean checkOutputSpaceFluids(@NotNull Recipe recipe, @NotNull IMulti } @Override - protected IMultipleTankHandler getOutputTank() { + protected MultipleTankHandler getOutputTank() { return handler.getFluidTanks(); } } diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFluidDrill.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFluidDrill.java index dca07a39e5f..882d9e1acfd 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFluidDrill.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityFluidDrill.java @@ -3,8 +3,8 @@ import gregtech.api.GTValues; import gregtech.api.capability.GregtechTileCapabilities; import gregtech.api.capability.IEnergyContainer; -import gregtech.api.capability.IMultipleTankHandler; import gregtech.api.capability.IWorkable; +import gregtech.api.capability.MultipleTankHandler; import gregtech.api.capability.impl.EnergyContainerList; import gregtech.api.capability.impl.FluidDrillLogic; import gregtech.api.capability.impl.FluidTankList; @@ -61,8 +61,8 @@ public class MetaTileEntityFluidDrill extends MultiblockWithDisplayBase private final FluidDrillLogic minerLogic; private final int tier; - protected IMultipleTankHandler inputFluidInventory; - protected IMultipleTankHandler outputFluidInventory; + protected MultipleTankHandler inputFluidInventory; + protected MultipleTankHandler outputFluidInventory; protected IEnergyContainer energyContainer; public MetaTileEntityFluidDrill(ResourceLocation metaTileEntityId, int tier) { @@ -287,8 +287,8 @@ public void setWorkingEnabled(boolean isActivationAllowed) { } public boolean fillTanks(FluidStack stack, boolean simulate) { - return GTTransferUtils.addFluidsToFluidHandler(outputFluidInventory, simulate, - Collections.singletonList(stack)); + return GTTransferUtils.addFluidsToFluidHandler(Collections.singletonList(stack), outputFluidInventory, + simulate); } public int getEnergyTier() { diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityLargeMiner.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityLargeMiner.java index cc2b78fa6ba..98305ada7e0 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityLargeMiner.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityLargeMiner.java @@ -75,7 +75,7 @@ public class MetaTileEntityLargeMiner extends MultiblockWithDisplayBase private final int tier; private IEnergyContainer energyContainer; - protected IMultipleTankHandler inputFluidInventory; + protected MultipleTankHandler inputFluidInventory; protected IItemHandlerModifiable outputInventory; private boolean silkTouch = false; diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityProcessingArray.java b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityProcessingArray.java index 0a06b0fb546..ac1a15113cf 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityProcessingArray.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/MetaTileEntityProcessingArray.java @@ -1,7 +1,7 @@ package gregtech.common.metatileentities.multi.electric; import gregtech.api.GTValues; -import gregtech.api.capability.IMultipleTankHandler; +import gregtech.api.capability.MultipleTankHandler; import gregtech.api.capability.impl.AbstractRecipeLogic; import gregtech.api.capability.impl.MultiblockRecipeLogic; import gregtech.api.metatileentity.IMachineHatchMultiblock; @@ -398,7 +398,7 @@ public int getParallelLimit() { } @Override - protected Recipe findRecipe(long maxVoltage, IItemHandlerModifiable inputs, IMultipleTankHandler fluidInputs) { + protected Recipe findRecipe(long maxVoltage, IItemHandlerModifiable inputs, MultipleTankHandler fluidInputs) { return super.findRecipe(Math.min(super.getMaxVoltage(), this.machineVoltage), inputs, fluidInputs); } diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/LargeTurbineWorkableHandler.java b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/LargeTurbineWorkableHandler.java index 46edc9619e7..66b5811b53d 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/LargeTurbineWorkableHandler.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/LargeTurbineWorkableHandler.java @@ -1,8 +1,8 @@ package gregtech.common.metatileentities.multi.electric.generator; import gregtech.api.GTValues; -import gregtech.api.capability.IMultipleTankHandler; import gregtech.api.capability.IRotorHolder; +import gregtech.api.capability.MultipleTankHandler; import gregtech.api.capability.impl.MultiblockFuelRecipeLogic; import gregtech.api.metatileentity.multiblock.FuelMultiblockController; import gregtech.api.metatileentity.multiblock.MultiblockAbility; @@ -16,7 +16,6 @@ import net.minecraft.util.math.MathHelper; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.IFluidTank; -import net.minecraftforge.fluids.capability.IFluidHandler; import net.minecraftforge.items.IItemHandlerModifiable; import org.jetbrains.annotations.NotNull; @@ -113,7 +112,7 @@ protected boolean checkPreviousRecipe() { @Override protected @Nullable Recipe findRecipe(long maxVoltage, IItemHandlerModifiable inputs, - IMultipleTankHandler fluidInputs) { + MultipleTankHandler fluidInputs) { RecipeMap map = getRecipeMap(); if (map == null || !isRecipeMapValid(map)) { return null; @@ -183,9 +182,7 @@ public void invalidate() { public void updateTanks() { FuelMultiblockController controller = (FuelMultiblockController) this.metaTileEntity; - List tanks = controller.getNotifiedFluidInputList(); - for (IFluidTank tank : controller.getAbilities(MultiblockAbility.IMPORT_FLUIDS)) { - tanks.add((IFluidHandler) tank); - } + List tanks = controller.getNotifiedFluidInputList(); + tanks.addAll(controller.getAbilities(MultiblockAbility.IMPORT_FLUIDS)); } } diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java index 5bdd31eafc8..20e772e3542 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java @@ -3,7 +3,7 @@ import gregtech.api.GTValues; import gregtech.api.capability.GregtechCapabilities; import gregtech.api.capability.IEnergyContainer; -import gregtech.api.capability.IMultipleTankHandler; +import gregtech.api.capability.MultipleTankHandler; import gregtech.api.capability.impl.MultiblockFuelRecipeLogic; import gregtech.api.fluids.store.FluidStorageKeys; import gregtech.api.gui.GuiTextures; @@ -364,7 +364,7 @@ protected void updateRecipeProgress() { protected void checkOxygen() { // check oxygen if present to boost production, and if the dynamo hatch supports it if (combustionEngine.isBoostAllowed()) { - IMultipleTankHandler inputTank = combustionEngine.getInputFluidInventory(); + MultipleTankHandler inputTank = combustionEngine.getInputFluidInventory(); FluidStack boosterStack = isExtreme ? LIQUID_OXYGEN_STACK : OXYGEN_STACK; isOxygenBoosted = boosterStack.isFluidStackIdentical(inputTank.drain(boosterStack, false)); } @@ -379,7 +379,7 @@ protected void drainOxygen() { protected boolean checkLubricant() { // check lubricant and invalidate if it fails - IMultipleTankHandler inputTank = combustionEngine.getInputFluidInventory(); + MultipleTankHandler inputTank = combustionEngine.getInputFluidInventory(); if (LUBRICANT_STACK.isFluidStackIdentical(inputTank.drain(LUBRICANT_STACK, false))) { return true; } else { @@ -390,7 +390,7 @@ protected boolean checkLubricant() { protected void drainLubricant() { if (totalContinuousRunningTime == 1 || totalContinuousRunningTime % 72 == 0) { - IMultipleTankHandler inputTank = combustionEngine.getInputFluidInventory(); + MultipleTankHandler inputTank = combustionEngine.getInputFluidInventory(); inputTank.drain(LUBRICANT_STACK, true); } } diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityFluidHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityFluidHatch.java index 85519ccfda7..a1b2d1f60d6 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityFluidHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityFluidHatch.java @@ -4,8 +4,8 @@ import gregtech.api.capability.GregtechTileCapabilities; import gregtech.api.capability.IControllable; import gregtech.api.capability.IFilter; -import gregtech.api.capability.IFilteredFluidContainer; import gregtech.api.capability.IGhostSlotConfigurable; +import gregtech.api.capability.MultipleTankHandler; import gregtech.api.capability.impl.FilteredItemHandler; import gregtech.api.capability.impl.FluidTankList; import gregtech.api.capability.impl.GhostCircuitItemStackHandler; @@ -238,12 +238,12 @@ protected int getInventorySize() { } @Override - protected FluidTankList createImportFluidHandler() { + protected MultipleTankHandler createImportFluidHandler() { return isExportHatch ? new FluidTankList(false) : new FluidTankList(false, fluidTank); } @Override - protected FluidTankList createExportFluidHandler() { + protected MultipleTankHandler createExportFluidHandler() { return isExportHatch ? new FluidTankList(false, fluidTank) : new FluidTankList(false); } @@ -425,10 +425,11 @@ public void getSubItems(CreativeTabs creativeTab, NonNullList subItem } } - protected class HatchFluidTank extends NotifiableFluidTank implements IFilteredFluidContainer, IFilter { + protected class HatchFluidTank extends NotifiableFluidTank implements IFilter { public HatchFluidTank(int capacity, MetaTileEntity entityToNotify, boolean isExport) { super(capacity, entityToNotify, isExport); + setFilter(this); } @Override @@ -444,23 +445,12 @@ public int fillInternal(FluidStack resource, boolean doFill) { return accepted; } - @Override - public boolean canFillFluidType(FluidStack fluid) { - return test(fluid); - } - // override for visibility @Override public void onContentsChanged() { super.onContentsChanged(); } - @Nullable - @Override - public IFilter getFilter() { - return this; - } - @Override public boolean test(@NotNull FluidStack fluidStack) { if (!isExportHatch) return true; @@ -470,7 +460,8 @@ public boolean test(@NotNull FluidStack fluidStack) { @Override public int getPriority() { if (!isExportHatch) return IFilter.noPriority(); - return !locked || lockedFluid == null ? IFilter.noPriority() : IFilter.whitelistPriority(1); + return !locked || lockedFluid == null ? IFilter.noPriority() : + IFilter.whitelistPriority(1); } } } diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityMultiFluidHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityMultiFluidHatch.java index 2501b75a8db..18ce7b15705 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityMultiFluidHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityMultiFluidHatch.java @@ -3,6 +3,7 @@ import gregtech.api.capability.GregtechDataCodes; import gregtech.api.capability.GregtechTileCapabilities; import gregtech.api.capability.IControllable; +import gregtech.api.capability.MultipleTankHandler; import gregtech.api.capability.impl.FluidTankList; import gregtech.api.capability.impl.NotifiableFluidTank; import gregtech.api.metatileentity.MetaTileEntity; @@ -186,12 +187,12 @@ public void addToolUsages(ItemStack stack, @Nullable World world, List t } @Override - protected FluidTankList createImportFluidHandler() { + protected MultipleTankHandler createImportFluidHandler() { return isExportHatch ? new FluidTankList(false) : fluidTankList; } @Override - protected FluidTankList createExportFluidHandler() { + protected MultipleTankHandler createExportFluidHandler() { return isExportHatch ? fluidTankList : new FluidTankList(false); } diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityMultiblockNotifiablePart.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityMultiblockNotifiablePart.java index 7efd88c5471..ef5cd99c98f 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityMultiblockNotifiablePart.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityMultiblockNotifiablePart.java @@ -1,8 +1,7 @@ package gregtech.common.metatileentities.multi.multiblockpart; -import gregtech.api.capability.IMultipleTankHandler; import gregtech.api.capability.INotifiableHandler; -import gregtech.api.capability.impl.FluidTankList; +import gregtech.api.capability.MultipleTankHandler; import gregtech.api.capability.impl.ItemHandlerList; import gregtech.api.metatileentity.multiblock.MultiblockControllerBase; @@ -38,8 +37,8 @@ private List getItemHandlers() { return notifiables; } - private FluidTankList getFluidHandlers() { - FluidTankList handler = null; + private MultipleTankHandler getFluidHandlers() { + MultipleTankHandler handler = null; if (isExportHatch && getExportFluids().getFluidTanks().size() > 0) { handler = getExportFluids(); } else if (!isExportHatch && getImportFluids().getFluidTanks().size() > 0) { @@ -58,10 +57,10 @@ private List getPartHandlers() { } if (this.fluidInventory.getTankProperties().length > 0) { - FluidTankList fluidTankList = getFluidHandlers(); + MultipleTankHandler fluidTankList = getFluidHandlers(); if (fluidTankList != null) { for (IFluidTank fluidTank : fluidTankList) { - if (fluidTank instanceof IMultipleTankHandler.ITankEntry entry) { + if (fluidTank instanceof MultipleTankHandler.Entry entry) { fluidTank = entry.getDelegate(); } if (fluidTank instanceof INotifiableHandler) { diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityReservoirHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityReservoirHatch.java index 83488327c26..a6824bf3a41 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityReservoirHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityReservoirHatch.java @@ -2,6 +2,7 @@ import gregtech.api.GTValues; import gregtech.api.capability.IGhostSlotConfigurable; +import gregtech.api.capability.MultipleTankHandler; import gregtech.api.capability.impl.FilteredItemHandler; import gregtech.api.capability.impl.FluidTankList; import gregtech.api.capability.impl.GhostCircuitItemStackHandler; @@ -114,7 +115,7 @@ private int getInventorySize() { } @Override - protected FluidTankList createImportFluidHandler() { + protected MultipleTankHandler createImportFluidHandler() { return new FluidTankList(false, fluidTank); } diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java index 120b25e8827..fa299f8a65e 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/appeng/MetaTileEntityMEInputHatch.java @@ -4,6 +4,7 @@ import gregtech.api.capability.GregtechDataCodes; import gregtech.api.capability.GregtechTileCapabilities; import gregtech.api.capability.IDataStickIntractable; +import gregtech.api.capability.MultipleTankHandler; import gregtech.api.capability.impl.FluidTankList; import gregtech.api.gui.GuiTextures; import gregtech.api.gui.ModularUI; @@ -77,7 +78,7 @@ protected void initializeInventory() { } @Override - protected FluidTankList createImportFluidHandler() { + protected MultipleTankHandler createImportFluidHandler() { return new FluidTankList(false, getAEFluidHandler().getInventory()); } diff --git a/src/main/java/gregtech/common/metatileentities/steam/SteamMiner.java b/src/main/java/gregtech/common/metatileentities/steam/SteamMiner.java index 3f70bf75aaf..f84b45a384a 100644 --- a/src/main/java/gregtech/common/metatileentities/steam/SteamMiner.java +++ b/src/main/java/gregtech/common/metatileentities/steam/SteamMiner.java @@ -82,7 +82,7 @@ public MetaTileEntity createMetaTileEntity(IGregTechTileEntity tileEntity) { } @Override - public FluidTankList createImportFluidHandler() { + public MultipleTankHandler createImportFluidHandler() { return new FluidTankList(false, new FilteredFluidHandler(16000).setFilter(CommonFluidFilters.STEAM)); } diff --git a/src/main/java/gregtech/common/metatileentities/steam/boiler/SteamBoiler.java b/src/main/java/gregtech/common/metatileentities/steam/boiler/SteamBoiler.java index f322cfbc4b8..56b0ac50975 100644 --- a/src/main/java/gregtech/common/metatileentities/steam/boiler/SteamBoiler.java +++ b/src/main/java/gregtech/common/metatileentities/steam/boiler/SteamBoiler.java @@ -1,6 +1,7 @@ package gregtech.common.metatileentities.steam.boiler; import gregtech.api.GTValues; +import gregtech.api.capability.MultipleTankHandler; import gregtech.api.capability.impl.CommonFluidFilters; import gregtech.api.capability.impl.FilteredFluidHandler; import gregtech.api.capability.impl.FluidTankList; @@ -314,13 +315,13 @@ public double getFuelLeftPercent() { } @Override - protected FluidTankList createImportFluidHandler() { + protected MultipleTankHandler createImportFluidHandler() { this.waterFluidTank = new FilteredFluidHandler(16000).setFilter(CommonFluidFilters.BOILER_FLUID); return new FluidTankList(false, waterFluidTank); } @Override - protected FluidTankList createExportFluidHandler() { + protected MultipleTankHandler createExportFluidHandler() { this.steamFluidTank = new FluidTank(16000); return new FluidTankList(false, steamFluidTank); } diff --git a/src/main/java/gregtech/common/metatileentities/steam/boiler/SteamLavaBoiler.java b/src/main/java/gregtech/common/metatileentities/steam/boiler/SteamLavaBoiler.java index 1269bf30450..93b88a65ee1 100755 --- a/src/main/java/gregtech/common/metatileentities/steam/boiler/SteamLavaBoiler.java +++ b/src/main/java/gregtech/common/metatileentities/steam/boiler/SteamLavaBoiler.java @@ -2,6 +2,7 @@ import gregtech.api.GTValues; import gregtech.api.capability.IFilter; +import gregtech.api.capability.MultipleTankHandler; import gregtech.api.capability.impl.CommonFluidFilters; import gregtech.api.capability.impl.FilteredFluidHandler; import gregtech.api.capability.impl.FluidTankList; @@ -91,8 +92,8 @@ protected int getBaseSteamOutput() { } @Override - protected FluidTankList createImportFluidHandler() { - FluidTankList superHandler = super.createImportFluidHandler(); + protected MultipleTankHandler createImportFluidHandler() { + MultipleTankHandler superHandler = super.createImportFluidHandler(); this.fuelFluidTank = new FilteredFluidHandler(16000).setFilter(FUEL_FILTER); return new FluidTankList(false, superHandler, fuelFluidTank); } diff --git a/src/main/java/gregtech/common/metatileentities/steam/multiblockpart/MetaTileEntitySteamHatch.java b/src/main/java/gregtech/common/metatileentities/steam/multiblockpart/MetaTileEntitySteamHatch.java index bacb525a3aa..63d06ccee15 100644 --- a/src/main/java/gregtech/common/metatileentities/steam/multiblockpart/MetaTileEntitySteamHatch.java +++ b/src/main/java/gregtech/common/metatileentities/steam/multiblockpart/MetaTileEntitySteamHatch.java @@ -1,5 +1,6 @@ package gregtech.common.metatileentities.steam.multiblockpart; +import gregtech.api.capability.MultipleTankHandler; import gregtech.api.capability.impl.CommonFluidFilters; import gregtech.api.capability.impl.FilteredFluidHandler; import gregtech.api.capability.impl.FilteredItemHandler; @@ -108,7 +109,7 @@ public int getDefaultPaintingColor() { } @Override - protected FluidTankList createImportFluidHandler() { + protected MultipleTankHandler createImportFluidHandler() { return new FluidTankList(false, new FilteredFluidHandler(INVENTORY_SIZE) .setFilter(CommonFluidFilters.STEAM)); } diff --git a/src/main/java/gregtech/common/metatileentities/storage/MetaTileEntityBuffer.java b/src/main/java/gregtech/common/metatileentities/storage/MetaTileEntityBuffer.java index e7a94663d21..5cd5a5df886 100644 --- a/src/main/java/gregtech/common/metatileentities/storage/MetaTileEntityBuffer.java +++ b/src/main/java/gregtech/common/metatileentities/storage/MetaTileEntityBuffer.java @@ -100,7 +100,7 @@ public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager guiSyncManager) } List> tankWidgets = new ArrayList<>(); - for (int i = 0; i < this.fluidTankList.getTanks(); i++) { + for (int i = 0; i < this.fluidTankList.size(); i++) { tankWidgets.add(new ArrayList<>()); tankWidgets.get(i).add(new GTFluidSlot().syncHandler(this.fluidTankList.getTankAt(i))); } diff --git a/src/main/java/gregtech/common/metatileentities/storage/MetaTileEntityQuantumStorageController.java b/src/main/java/gregtech/common/metatileentities/storage/MetaTileEntityQuantumStorageController.java index 978fb816c46..32a99607356 100644 --- a/src/main/java/gregtech/common/metatileentities/storage/MetaTileEntityQuantumStorageController.java +++ b/src/main/java/gregtech/common/metatileentities/storage/MetaTileEntityQuantumStorageController.java @@ -4,9 +4,9 @@ import gregtech.api.capability.DualHandler; import gregtech.api.capability.GregtechDataCodes; import gregtech.api.capability.IEnergyContainer; -import gregtech.api.capability.IMultipleTankHandler; import gregtech.api.capability.IQuantumController; import gregtech.api.capability.IQuantumStorage; +import gregtech.api.capability.MultipleTankHandler; import gregtech.api.capability.impl.EnergyContainerList; import gregtech.api.capability.impl.FluidTankList; import gregtech.api.capability.impl.ItemHandlerList; @@ -466,7 +466,7 @@ public DualHandler getHandler() { private class QuantumControllerHandler extends DualHandler { private static final IItemHandlerModifiable EMPTY_ITEM = new ItemStackHandler(0); - private static final IMultipleTankHandler EMPTY_TANK = new FluidTankList(false); + private static final MultipleTankHandler EMPTY_TANK = new FluidTankList(false); private boolean dirty = true; public QuantumControllerHandler() { @@ -507,7 +507,7 @@ public boolean hasItemHandlers() { public boolean hasFluidTanks() { if (dirty) rebuildCache(); - return getTanks() > 0; + return size() > 0; } } } diff --git a/src/main/java/gregtech/common/metatileentities/storage/MetaTileEntityQuantumTank.java b/src/main/java/gregtech/common/metatileentities/storage/MetaTileEntityQuantumTank.java index 0d675b9b1c9..2092f6e5a94 100644 --- a/src/main/java/gregtech/common/metatileentities/storage/MetaTileEntityQuantumTank.java +++ b/src/main/java/gregtech/common/metatileentities/storage/MetaTileEntityQuantumTank.java @@ -1,9 +1,6 @@ package gregtech.common.metatileentities.storage; -import gregtech.api.capability.GregtechTileCapabilities; -import gregtech.api.capability.IActiveOutputSide; -import gregtech.api.capability.IFilter; -import gregtech.api.capability.IFilteredFluidContainer; +import gregtech.api.capability.*; import gregtech.api.capability.impl.FilteredItemHandler; import gregtech.api.capability.impl.FluidHandlerProxy; import gregtech.api.capability.impl.FluidTankList; @@ -253,12 +250,12 @@ public MetaTileEntity createMetaTileEntity(IGregTechTileEntity tileEntity) { } @Override - protected FluidTankList createImportFluidHandler() { + protected MultipleTankHandler createImportFluidHandler() { return new FluidTankList(false, fluidTank); } @Override - protected FluidTankList createExportFluidHandler() { + protected MultipleTankHandler createExportFluidHandler() { return new FluidTankList(false, fluidTank); } diff --git a/src/main/java/gregtech/integration/opencomputers/drivers/DriverRecipeMapMultiblockController.java b/src/main/java/gregtech/integration/opencomputers/drivers/DriverRecipeMapMultiblockController.java index 7db4e9bd232..1a81c354dad 100644 --- a/src/main/java/gregtech/integration/opencomputers/drivers/DriverRecipeMapMultiblockController.java +++ b/src/main/java/gregtech/integration/opencomputers/drivers/DriverRecipeMapMultiblockController.java @@ -1,7 +1,7 @@ package gregtech.integration.opencomputers.drivers; import gregtech.api.capability.GregtechTileCapabilities; -import gregtech.api.capability.IMultipleTankHandler; +import gregtech.api.capability.MultipleTankHandler; import gregtech.api.capability.impl.MultiblockRecipeLogic; import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; import gregtech.api.metatileentity.multiblock.RecipeMapMultiblockController; @@ -126,7 +126,7 @@ public Object[] getOutputInventory(final Context context, final Arguments args) } @NotNull - private Object[] getTank(IMultipleTankHandler handler) { + private Object[] getTank(MultipleTankHandler handler) { List> result = new ArrayList<>(); handler.getFluidTanks().forEach(tank -> { Map map = new Object2ObjectOpenHashMap<>(); diff --git a/src/test/java/gregtech/api/capability/impl/FluidTankListTest.java b/src/test/java/gregtech/api/capability/impl/FluidTankListTest.java index c6a04043724..a5307f4e154 100644 --- a/src/test/java/gregtech/api/capability/impl/FluidTankListTest.java +++ b/src/test/java/gregtech/api/capability/impl/FluidTankListTest.java @@ -2,7 +2,6 @@ import gregtech.Bootstrap; import gregtech.api.unification.material.Materials; -import gregtech.api.util.OverlayedFluidHandler; import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.FluidStack; @@ -313,9 +312,6 @@ private static final class FluidHandlerTester { private final FluidTankList tank; - @Nullable - private OverlayedFluidHandler overlayedFluidHandler; - FluidHandlerTester(FluidTankList tank) { this.tank = tank; } @@ -333,19 +329,8 @@ FluidHandlerTester fill(FluidStack fluidStack) { String tankString = this.tank.toString(true); int tankFillSim = this.tank.fill(fluidStack, false); - - if (this.overlayedFluidHandler != null) { - String overlayString = this.overlayedFluidHandler.toString(true); - int ofhSim = this.overlayedFluidHandler.insertFluid(fluidStack, fluidStack.amount); - - if (tankFillSim != ofhSim) { - throw new AssertionError("Result of simulation fill from tank and OFH differ.\n" + - "Tank Simulation: " + tankFillSim + ", OFH simulation: " + ofhSim + "\n" + - "Tank: " + tankString + "\n" + - "OFH: " + overlayString); - } - } int actualFill = this.tank.fill(fluidStack, true); + if (tankFillSim != actualFill) { throw new AssertionError("Simulation fill to tank and actual fill differ.\n" + "Simulated Fill: " + tankFillSim + ", Actual Fill: " + actualFill + "\n" + @@ -359,9 +344,6 @@ FluidHandlerTester drain(Fluid fluid, int amount) { } FluidHandlerTester drain(FluidStack fluidStack) { - if (this.overlayedFluidHandler != null) { - throw new IllegalStateException("Cannot drain stuff in simulation"); - } // make string representation before modifying the state, to produce better error message String tankString = this.tank.toString(true); @@ -377,9 +359,6 @@ FluidHandlerTester drain(FluidStack fluidStack) { } FluidHandlerTester drain(int amount) { - if (this.overlayedFluidHandler != null) { - throw new IllegalStateException("Cannot drain stuff in simulation"); - } // make string representation before modifying the state, to produce better error message String tankString = this.tank.toString(true); @@ -395,17 +374,13 @@ FluidHandlerTester drain(int amount) { } FluidHandlerTester beginSimulation() { - if (this.overlayedFluidHandler != null) { - throw new IllegalStateException("Simulation already begun"); - } - this.overlayedFluidHandler = new OverlayedFluidHandler(this.tank); return this; } FluidHandlerTester expectContents(@NotNull FluidStack... optionalFluidStacks) { - if (optionalFluidStacks.length != this.tank.getTanks()) { + if (optionalFluidStacks.length != this.tank.size()) { throw new IllegalArgumentException("Wrong number of fluids to compare; " + - "expected: " + this.tank.getTanks() + ", provided: " + optionalFluidStacks.length); + "expected: " + this.tank.size() + ", provided: " + optionalFluidStacks.length); } for (int i = 0; i < optionalFluidStacks.length; i++) { var tank = this.tank.getTankAt(i); diff --git a/src/test/java/gregtech/api/capability/impl/MultiblockRecipeLogicTest.java b/src/test/java/gregtech/api/capability/impl/MultiblockRecipeLogicTest.java index bfda73b5311..21b78c0fb3b 100644 --- a/src/test/java/gregtech/api/capability/impl/MultiblockRecipeLogicTest.java +++ b/src/test/java/gregtech/api/capability/impl/MultiblockRecipeLogicTest.java @@ -1,7 +1,7 @@ package gregtech.api.capability.impl; import gregtech.Bootstrap; -import gregtech.api.capability.IMultipleTankHandler; +import gregtech.api.capability.MultipleTankHandler; import gregtech.api.metatileentity.MetaTileEntity; import gregtech.api.metatileentity.MetaTileEntityHolder; import gregtech.api.metatileentity.multiblock.MultiblockAbility; @@ -205,12 +205,12 @@ protected IItemHandlerModifiable getOutputInventory() { } @Override - protected IMultipleTankHandler getInputTank() { + protected MultipleTankHandler getInputTank() { return importFluidBus.getImportFluids(); } @Override - protected IMultipleTankHandler getOutputTank() { + protected MultipleTankHandler getOutputTank() { return importFluidBus.getExportFluids(); } }; @@ -443,12 +443,12 @@ protected IItemHandlerModifiable getOutputInventory() { } @Override - protected IMultipleTankHandler getInputTank() { + protected MultipleTankHandler getInputTank() { return importFluidBus.getImportFluids(); } @Override - protected IMultipleTankHandler getOutputTank() { + protected MultipleTankHandler getOutputTank() { return importFluidBus.getExportFluids(); } @@ -670,12 +670,12 @@ protected IItemHandlerModifiable getOutputInventory() { } @Override - protected IMultipleTankHandler getInputTank() { + protected MultipleTankHandler getInputTank() { return new FluidTankList(false); } @Override - protected IMultipleTankHandler getOutputTank() { + protected MultipleTankHandler getOutputTank() { return new FluidTankList(false); } diff --git a/src/test/java/gregtech/api/recipes/logic/IParallelableRecipeLogicTest.java b/src/test/java/gregtech/api/recipes/logic/IParallelableRecipeLogicTest.java index 6354772d0bd..1828850f09d 100644 --- a/src/test/java/gregtech/api/recipes/logic/IParallelableRecipeLogicTest.java +++ b/src/test/java/gregtech/api/recipes/logic/IParallelableRecipeLogicTest.java @@ -1,7 +1,7 @@ package gregtech.api.recipes.logic; import gregtech.Bootstrap; -import gregtech.api.capability.IMultipleTankHandler; +import gregtech.api.capability.MultipleTankHandler; import gregtech.api.capability.impl.FluidTankList; import gregtech.api.capability.impl.MultiblockRecipeLogic; import gregtech.api.metatileentity.MetaTileEntity; @@ -332,7 +332,7 @@ public void findMultipliedRecipe_FluidOnlyMaxParallelTest() { importFluidBus.getImportFluids().fill(Materials.Toluene.getFluid(4000), true); secondImportFluidBus.getImportFluids().fill(Materials.RawGasoline.getFluid(50000), true); - IMultipleTankHandler tankHandler = new FluidTankList(false, importFluidBus.getImportFluids().getTankAt(0), + MultipleTankHandler tankHandler = new FluidTankList(false, importFluidBus.getImportFluids().getTankAt(0), secondImportFluidBus.getImportFluids().getTankAt(0)); RecipeBuilder parallelRecipe = logic.findMultipliedParallelRecipe(map, recipe, @@ -384,7 +384,7 @@ public void findMultipliedRecipe_FluidOnlyLessThanMaxParallelTest() { importFluidBus.getImportFluids().fill(Materials.Toluene.getFluid(2000), true); secondImportFluidBus.getImportFluids().fill(Materials.RawGasoline.getFluid(50000), true); - IMultipleTankHandler tankHandler = new FluidTankList(false, importFluidBus.getImportFluids().getTankAt(0), + MultipleTankHandler tankHandler = new FluidTankList(false, importFluidBus.getImportFluids().getTankAt(0), secondImportFluidBus.getImportFluids().getTankAt(0)); RecipeBuilder parallelRecipe = logic.findMultipliedParallelRecipe(map, recipe, diff --git a/src/test/java/gregtech/api/recipes/logic/ParallelLogicTest.java b/src/test/java/gregtech/api/recipes/logic/ParallelLogicTest.java index d8c75056966..d8818a91c33 100644 --- a/src/test/java/gregtech/api/recipes/logic/ParallelLogicTest.java +++ b/src/test/java/gregtech/api/recipes/logic/ParallelLogicTest.java @@ -2,7 +2,7 @@ import gregtech.Bootstrap; import gregtech.api.GTValues; -import gregtech.api.capability.IMultipleTankHandler; +import gregtech.api.capability.MultipleTankHandler; import gregtech.api.capability.impl.FluidTankList; import gregtech.api.recipes.Recipe; import gregtech.api.recipes.RecipeBuilder; @@ -12,7 +12,6 @@ import gregtech.api.recipes.builders.BlastRecipeBuilder; import gregtech.api.unification.material.Materials; import gregtech.api.util.GTHashMaps; -import gregtech.api.util.OverlayedFluidHandler; import gregtech.api.util.OverlayedItemHandler; import gregtech.common.metatileentities.MetaTileEntities; import gregtech.common.metatileentities.electric.SimpleMachineMetaTileEntityResizable; @@ -32,6 +31,7 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.notNullValue; +@SuppressWarnings("DataFlowIssue") public class ParallelLogicTest { MetaTileEntityItemBus importItemBus = new MetaTileEntityItemBus(gregtechId("item_bus.export.lv"), 1, false); @@ -355,7 +355,7 @@ public void limitParallelByFluids_MaxParallelTest() { importItemBus.getImportItems().insertItem(0, new ItemStack(Blocks.COBBLESTONE, 16), false); int itemRatio = ParallelLogic.limitParallelByFluids(recipe, - new OverlayedFluidHandler(exportFluidBus.getExportFluids()), parallelLimit); + exportFluidBus.getExportFluids(), parallelLimit); assertThat(itemRatio, is(4)); } @@ -385,7 +385,7 @@ public void limitParallelByFluids_PartialParallelsTest() { exportFluidBus.getExportFluids().fill(Materials.Acetone.getFluid(15800), true); int itemRatio = ParallelLogic.limitParallelByFluids(recipe, - new OverlayedFluidHandler(exportFluidBus.getExportFluids()), parallelLimit); + exportFluidBus.getExportFluids(), parallelLimit); assertThat(itemRatio, is(2)); } @@ -415,7 +415,7 @@ public void limitParallelByFluids_FluidOutputFullTest() { exportFluidBus.getExportFluids().fill(Materials.Acetone.getFluid(16000), true); int itemRatio = ParallelLogic.limitParallelByFluids(recipe, - new OverlayedFluidHandler(exportFluidBus.getExportFluids()), parallelLimit); + exportFluidBus.getExportFluids(), parallelLimit); assertThat(itemRatio, is(0)); } @@ -708,7 +708,7 @@ public void getMaxRatioFluid_DifferentNonConsumedTest() { importFluidBus.getImportFluids().fill(Materials.Water.getFluid(1000), true); secondImportFluidBus.getImportFluids().fill(Materials.Acetone.getFluid(1), true); - IMultipleTankHandler tankHandler = new FluidTankList(false, importFluidBus.getImportFluids().getTankAt(0), + MultipleTankHandler tankHandler = new FluidTankList(false, importFluidBus.getImportFluids().getTankAt(0), secondImportFluidBus.getImportFluids().getTankAt(0)); int fluidRatio = ParallelLogic.getMaxRatioFluid(GTHashMaps.fromFluidHandler(tankHandler),