items and fluids should be sub-interfaces

This commit is contained in:
Talrey 2022-05-13 15:32:05 -07:00
parent b088843aa1
commit 9647046753
4 changed files with 39 additions and 29 deletions

View file

@ -117,7 +117,7 @@ public class ConnectivityHandler {
if (beWidth == bestWidth && beWidth*beWidth * be.getHeight() == bestAmount) return bestAmount;
splitMultiAndInvalidate(be, cache, false);
if (be.hasFluid()) be.setTankSize(0, bestAmount);
if (be instanceof IMultiTileContainer.Fluid ifluid && ifluid.hasTank()) ifluid.setTankSize(0, bestAmount);
tryToFormNewMultiOfWidth(be, bestWidth, cache, false);
@ -140,8 +140,8 @@ public class ConnectivityHandler {
// optional fluid handling
IFluidTank beTank = null;
FluidStack fluid = FluidStack.EMPTY;
if (be.hasFluid()) {
beTank = be.getTank(0);
if (be instanceof IMultiTileContainer.Fluid ifluid && ifluid.hasTank()) {
beTank = ifluid.getTank(0);
fluid = beTank.getFluid();
}
Direction.Axis axis = be.getMainConnectionAxis();
@ -182,8 +182,10 @@ public class ConnectivityHandler {
if (axis == Direction.Axis.X && conPos.getZ() + otherWidth > origin.getZ() + width) break Search;
}
}
FluidStack otherFluid = controller.getFluid(0);
if (!fluid.isEmpty() && !otherFluid.isEmpty() && !fluid.isFluidEqual(otherFluid)) break Search;
if (controller instanceof IMultiTileContainer.Fluid ifluidCon && ifluidCon.hasTank()) {
FluidStack otherFluid = ifluidCon.getFluid(0);
if (!fluid.isEmpty() && !otherFluid.isEmpty() && !fluid.isFluidEqual(otherFluid)) break Search;
}
}
}
amount += width * width;
@ -208,15 +210,17 @@ public class ConnectivityHandler {
extraData = be.modifyExtraData(extraData);
if (part.hasFluid()) {
IFluidTank tankAt = part.getTank(0);
if (part instanceof IMultiTileContainer.Fluid ifluidPart && ifluidPart.hasTank()) {
IFluidTank tankAt = ifluidPart.getTank(0);
FluidStack fluidAt = tankAt.getFluid();
if (!fluidAt.isEmpty()) {
// making this generic would be a rather large mess, unfortunately
if (beTank != null && fluid.isEmpty() && beTank instanceof CreativeFluidTankTileEntity.CreativeSmartFluidTank) {
((CreativeFluidTankTileEntity.CreativeSmartFluidTank)beTank).setContainedFluid(fluidAt);
}
if (be.hasFluid() && beTank != null) beTank.fill(fluidAt, IFluidHandler.FluidAction.EXECUTE);
if (be instanceof IMultiTileContainer.Fluid ifluidBE && ifluidBE.hasTank() && beTank != null) {
beTank.fill(fluidAt, IFluidHandler.FluidAction.EXECUTE);
}
}
tankAt.drain(tankAt.getCapacity(), IFluidHandler.FluidAction.EXECUTE);
}
@ -259,11 +263,11 @@ public class ConnectivityHandler {
// fluid handling, if present
FluidStack toDistribute = FluidStack.EMPTY;
int maxCapacity = 0;
if (be.hasFluid()) {
toDistribute = be.getFluid(0);
maxCapacity = be.getTankSize(0);
if (be instanceof IMultiTileContainer.Fluid ifluidBE && ifluidBE.hasTank()) {
toDistribute = ifluidBE.getFluid(0);
maxCapacity = ifluidBE.getTankSize(0);
if (!toDistribute.isEmpty() && !be.isRemoved()) toDistribute.shrink(maxCapacity);
be.setTankSize(0, 1);
ifluidBE.setTankSize(0, 1);
}
for (int yOffset = 0; yOffset < height; yOffset++) {
@ -284,7 +288,7 @@ public class ConnectivityHandler {
if (!toDistribute.isEmpty() && partAt != be) {
FluidStack copy = toDistribute.copy();
IFluidTank tank = partAt.getTank(0);
IFluidTank tank = (partAt instanceof IMultiTileContainer.Fluid ifluidPart ? ifluidPart.getTank(0) : null);
// making this generic would be a rather large mess, unfortunately
if (tank instanceof CreativeFluidTankTileEntity.CreativeSmartFluidTank creativeTank) {
if (creativeTank.isEmpty()) creativeTank.setContainedFluid(toDistribute);
@ -293,7 +297,7 @@ public class ConnectivityHandler {
int split = Math.min(maxCapacity, toDistribute.getAmount());
copy.setAmount(split);
toDistribute.shrink(split);
tank.fill(copy, IFluidHandler.FluidAction.EXECUTE);
if (tank != null) tank.fill(copy, IFluidHandler.FluidAction.EXECUTE);
}
}
if (tryReconnect) {
@ -306,10 +310,10 @@ public class ConnectivityHandler {
}
}
}
if (be.hasItems()) {
if (be instanceof IMultiTileContainer.Inventory iinv && iinv.hasInventory()) {
be.getCapability(CapabilityItemHandler.ITEM_HANDLER_CAPABILITY).invalidate();
}
if (be.hasFluid()) {
if (be instanceof IMultiTileContainer.Fluid ifluid && ifluid.hasTank()) {
be.getCapability(CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY).invalidate();
}
if (tryReconnect) {

View file

@ -36,7 +36,7 @@ import net.minecraftforge.fluids.capability.IFluidHandler;
import net.minecraftforge.fluids.capability.IFluidHandler.FluidAction;
import net.minecraftforge.fluids.capability.templates.FluidTank;
public class FluidTankTileEntity extends SmartTileEntity implements IHaveGoggleInformation, IMultiTileContainer {
public class FluidTankTileEntity extends SmartTileEntity implements IHaveGoggleInformation, IMultiTileContainer.Fluid {
private static final int MAX_SIZE = 3;
@ -522,7 +522,7 @@ public class FluidTankTileEntity extends SmartTileEntity implements IHaveGoggleI
public void setWidth(int width) { this.width = width; }
@Override
public boolean hasFluid() { return true; }
public boolean hasTank() { return true; }
@Override
public int getTankSize(int tank) { return getCapacityMultiplier(); }

View file

@ -26,7 +26,7 @@ import net.minecraftforge.items.IItemHandlerModifiable;
import net.minecraftforge.items.ItemStackHandler;
import net.minecraftforge.items.wrapper.CombinedInvWrapper;
public class ItemVaultTileEntity extends SmartTileEntity implements IMultiTileContainer {
public class ItemVaultTileEntity extends SmartTileEntity implements IMultiTileContainer.Inventory {
protected LazyOptional<IItemHandler> itemCapability;
@ -304,5 +304,5 @@ public class ItemVaultTileEntity extends SmartTileEntity implements IMultiTileCo
public void setWidth(int width) { this.radius = width; }
@Override
public boolean hasItems() { return true; }
public boolean hasInventory() { return true; }
}

View file

@ -56,14 +56,20 @@ public interface IMultiTileContainer {
int getWidth ();
void setWidth (int width);
// optional item handling
default boolean hasItems () { return false; }
public interface Inventory extends IMultiTileContainer {
default boolean hasInventory() { return false; }
}
// optional fluid handling
// done here rather than through the Capability to allow greater flexibility
default boolean hasFluid () { return false; }
default int getTankSize (int tank) { return 0; }
default void setTankSize (int tank, int blocks) {}
default IFluidTank getTank (int tank) { return null; }
default FluidStack getFluid (int tank) { return FluidStack.EMPTY; }
public interface Fluid extends IMultiTileContainer {
// done here rather than through the Capability to allow greater flexibility
default boolean hasTank() { return false; }
default int getTankSize(int tank) { return 0; }
default void setTankSize(int tank, int blocks) {}
default IFluidTank getTank(int tank) { return null; }
default FluidStack getFluid(int tank) { return FluidStack.EMPTY; }
}
}