diff --git a/src/main/java/gregtech/api/capability/DualHandler.java b/src/main/java/gregtech/api/capability/DualHandler.java index 78c0e46ebc3..1c23f685841 100644 --- a/src/main/java/gregtech/api/capability/DualHandler.java +++ b/src/main/java/gregtech/api/capability/DualHandler.java @@ -8,6 +8,7 @@ import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.IFluidTank; import net.minecraftforge.fluids.capability.IFluidTankProperties; +import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.IItemHandlerModifiable; import org.jetbrains.annotations.NotNull; @@ -15,18 +16,15 @@ import java.util.ArrayList; import java.util.List; -public class DualHandler implements IItemHandlerModifiable, IMultipleTankHandler, INotifiableHandler { +public class DualHandler implements IDualHandler, INotifiableHandler { - private static final ItemStackHashStrategy strategy = ItemStackHashStrategy.builder() - .compareItem(true) - .compareDamage(true) - .compareTag(true) - .compareCount(true) - .build(); @NotNull - IItemHandlerModifiable itemDelegate; + private static final ItemStackHashStrategy strategy = ItemStackHashStrategy.comparingAll(); + + @NotNull + protected IItemHandlerModifiable itemDelegate; @NotNull - IMultipleTankHandler fluidDelegate; + protected IMultipleTankHandler fluidDelegate; private final List unwrapped; @@ -53,14 +51,6 @@ public DualHandler(@NotNull IItemHandlerModifiable itemDelegate, this(itemDelegate, new FluidTankList(false, fluidTank), isExport); } - public IItemHandlerModifiable getItemDelegate() { - return this.itemDelegate; - } - - public IMultipleTankHandler getFluidDelegate() { - return this.fluidDelegate; - } - public boolean isExport() { return this.isExport; } @@ -71,12 +61,12 @@ public int getSlots() { } @Override - public ItemStack getStackInSlot(int slot) { + public @NotNull ItemStack getStackInSlot(int slot) { return itemDelegate.getStackInSlot(slot); } @Override - public ItemStack insertItem(int slot, ItemStack stack, boolean simulate) { + public @NotNull ItemStack insertItem(int slot, @NotNull ItemStack stack, boolean simulate) { var remainder = itemDelegate.insertItem(slot, stack, simulate); if (!simulate && !strategy.equals(remainder, stack)) onContentsChanged(); @@ -84,7 +74,7 @@ public ItemStack insertItem(int slot, ItemStack stack, boolean simulate) { } @Override - public ItemStack extractItem(int slot, int amount, boolean simulate) { + public @NotNull ItemStack extractItem(int slot, int amount, boolean simulate) { var extracted = itemDelegate.extractItem(slot, amount, simulate); if (!simulate && !extracted.isEmpty()) onContentsChanged(); @@ -97,7 +87,7 @@ public int getSlotLimit(int slot) { } @Override - public void setStackInSlot(int slot, ItemStack stack) { + public void setStackInSlot(int slot, @NotNull ItemStack stack) { var oldStack = itemDelegate.getStackInSlot(slot); itemDelegate.setStackInSlot(slot, stack); if (!strategy.equals(oldStack, stack)) @@ -172,6 +162,26 @@ public void removeNotifiableMetaTileEntity(MetaTileEntity metaTileEntity) { this.notifiableEntities.remove(metaTileEntity); } + @Override + public boolean hasFluidTanks() { + return getTanks() > 0; + } + + @Override + public boolean hasItemHandlers() { + return getSlots() > 0; + } + + @Override + public IMultipleTankHandler getDelegateTank() { + return this.fluidDelegate; + } + + @Override + public IItemHandler getDelegatItemHandler() { + return this.itemDelegate; + } + public static class DualEntry implements ITankEntry, INotifiableHandler { @NotNull @@ -191,18 +201,18 @@ public DualEntry(@NotNull DualHandler tank, @NotNull ITankEntry delegate) { } @Override - public @NotNull IFluidTank getDelegate() { + public @NotNull ITankEntry getDelegate() { return this.delegate; } @Override public IFluidTankProperties[] getTankProperties() { - return this.getTank().getTankProperties(); + return this.getDelegate().getTankProperties(); } @Override public int fill(FluidStack resource, boolean doFill) { - int filled = getTank().fill(resource, doFill); + int filled = getDelegate().fill(resource, doFill); if (doFill && filled > 0) tank.onContentsChanged(this); return filled; @@ -210,7 +220,7 @@ public int fill(FluidStack resource, boolean doFill) { @Override public FluidStack drain(FluidStack resource, boolean doDrain) { - var drained = getTank().drain(resource, doDrain); + var drained = getDelegate().drain(resource, doDrain); if (doDrain && drained != null) tank.onContentsChanged(this); return drained; @@ -218,17 +228,12 @@ public FluidStack drain(FluidStack resource, boolean doDrain) { @Override public FluidStack drain(int maxDrain, boolean doDrain) { - var drained = getTank().drain(maxDrain, doDrain); + var drained = getDelegate().drain(maxDrain, doDrain); if (doDrain && drained != null) tank.onContentsChanged(this); return drained; } - // this method might be redundant - private @NotNull ITankEntry getTank() { - return this.delegate; - } - @Override public void addNotifiableMetaTileEntity(MetaTileEntity metaTileEntity) { this.tank.addNotifiableMetaTileEntity(metaTileEntity); diff --git a/src/main/java/gregtech/api/capability/IDualHandler.java b/src/main/java/gregtech/api/capability/IDualHandler.java index 595efc6a9f2..8b2075a9718 100644 --- a/src/main/java/gregtech/api/capability/IDualHandler.java +++ b/src/main/java/gregtech/api/capability/IDualHandler.java @@ -1,14 +1,15 @@ package gregtech.api.capability; import net.minecraftforge.items.IItemHandler; +import net.minecraftforge.items.IItemHandlerModifiable; -public interface IDualHandler { +public interface IDualHandler extends IItemHandlerModifiable, IMultipleTankHandler { boolean hasFluidTanks(); boolean hasItemHandlers(); - IMultipleTankHandler getFluidTanks(); + IMultipleTankHandler getDelegateTank(); - IItemHandler getItemHandlers(); + IItemHandler getDelegatItemHandler(); } diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockAbility.java b/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockAbility.java index acf01857545..f058b53fed4 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockAbility.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockAbility.java @@ -120,8 +120,4 @@ public List castList(AbilityInstances instances) { } return null; } - - public String getType() { - return this.clazz.getSimpleName(); - } } diff --git a/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockControllerBase.java b/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockControllerBase.java index b01cb5f36ba..49b277a4ff2 100644 --- a/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockControllerBase.java +++ b/src/main/java/gregtech/api/metatileentity/multiblock/MultiblockControllerBase.java @@ -386,6 +386,11 @@ public void checkStructurePattern() { } } + /** + * Checks if a multiblock ability at a given block pos should be added to the ability instances + * + * @return true if the ability should be added to this multiblocks ability instances + */ protected boolean checkAbilityPart(MultiblockAbility ability, BlockPos pos) { return true; } diff --git a/src/main/java/gregtech/common/items/behaviors/TricorderBehavior.java b/src/main/java/gregtech/common/items/behaviors/TricorderBehavior.java index 1045603125a..96ae5330aab 100644 --- a/src/main/java/gregtech/common/items/behaviors/TricorderBehavior.java +++ b/src/main/java/gregtech/common/items/behaviors/TricorderBehavior.java @@ -296,9 +296,9 @@ else if (metaTileEntity instanceof IDataInfoProvider) GTValues.VNF[tier])); var handler = quantumController.getHandler(); list.add(new TextComponentTranslation("behavior.tricorder.quantum_controller.connected_items", - TextFormatting.RED.toString() + handler.getItemHandlers().getSlots())); + TextFormatting.RED.toString() + handler.getDelegatItemHandler().getSlots())); list.add(new TextComponentTranslation("behavior.tricorder.quantum_controller.connected_fluids", - TextFormatting.RED.toString() + handler.getFluidTanks().getTanks())); + TextFormatting.RED.toString() + handler.getDelegateTank().getTanks())); } else if (metaTileEntity instanceof IQuantumStoragestorage) { var qcontrollor = storage.getQuantumController(); if (qcontrollor != null) { diff --git a/src/main/java/gregtech/common/metatileentities/storage/MetaTileEntityQuantumStorageController.java b/src/main/java/gregtech/common/metatileentities/storage/MetaTileEntityQuantumStorageController.java index c4431e902a9..64f00d4729d 100644 --- a/src/main/java/gregtech/common/metatileentities/storage/MetaTileEntityQuantumStorageController.java +++ b/src/main/java/gregtech/common/metatileentities/storage/MetaTileEntityQuantumStorageController.java @@ -1,9 +1,11 @@ package gregtech.common.metatileentities.storage; import gregtech.api.GTValues; +import gregtech.api.capability.DualHandler; import gregtech.api.capability.GregtechDataCodes; import gregtech.api.capability.IDualHandler; import gregtech.api.capability.IEnergyContainer; +import gregtech.api.capability.IMultipleTankHandler; import gregtech.api.capability.IQuantumController; import gregtech.api.capability.IQuantumStorage; import gregtech.api.capability.impl.EnergyContainerList; @@ -33,6 +35,8 @@ import net.minecraftforge.fluids.capability.CapabilityFluidHandler; import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.IItemHandler; +import net.minecraftforge.items.IItemHandlerModifiable; +import net.minecraftforge.items.ItemStackHandler; import codechicken.lib.render.CCRenderState; import codechicken.lib.render.pipeline.ColourMultiplier; @@ -331,7 +335,7 @@ public void rebuildNetwork() { } storage.setDisconnected(); } - handler.rebuildCache(); + handler.markDirty(); calculateEnergyUsage(); markDirty(); } @@ -439,9 +443,9 @@ public void readFromNBT(NBTTagCompound data) { public T getCapability(@NotNull Capability capability, EnumFacing side) { if (isPowered()) { if (capability == CapabilityItemHandler.ITEM_HANDLER_CAPABILITY && handler.hasItemHandlers()) { - return (T) handler.getItemHandlers(); + return (T) handler.getDelegatItemHandler(); } else if (capability == CapabilityFluidHandler.FLUID_HANDLER_CAPABILITY && handler.hasFluidTanks()) { - return (T) handler.getFluidTanks(); + return (T) handler.getDelegateTank(); } } @@ -460,17 +464,19 @@ public IDualHandler getHandler() { } // todo use DualHandler instead once the multis ability pr is merged - private class QuantumControllerHandler implements IDualHandler { + private class QuantumControllerHandler extends DualHandler { - // IFluidHandler saved values - private FluidTankList fluidTanks; + private static final IItemHandlerModifiable EMPTY_ITEM = new ItemStackHandler(0); + private static final IMultipleTankHandler EMPTY_TANK = new FluidTankList(false); + private boolean dirty = true; - // IItemHandler saved values - private ItemHandlerList itemHandlers; + public QuantumControllerHandler() { + super(EMPTY_ITEM, EMPTY_TANK, true); + } private void invalidate() { - fluidTanks = new FluidTankList(false); - itemHandlers = new ItemHandlerList(Collections.emptyList()); + fluidDelegate = EMPTY_TANK; + itemDelegate = EMPTY_ITEM; } private void rebuildCache() { @@ -486,34 +492,25 @@ private void rebuildCache() { } // todo allow this "allowSameFluidFill" to be configured in this controller? - this.fluidTanks = new FluidTankList(false, fluidTankList); - this.itemHandlers = new ItemHandlerList(itemHandlerList); + this.fluidDelegate = new FluidTankList(false, fluidTankList); + this.itemDelegate = new ItemHandlerList(itemHandlerList); + this.dirty = false; } - @Override - public boolean hasFluidTanks() { - return getFluidTanks().getTanks() > 0; + public void markDirty() { + this.dirty = true; } @Override public boolean hasItemHandlers() { - return !getItemHandlers().getBackingHandlers().isEmpty(); + if (dirty) rebuildCache(); + return super.hasItemHandlers(); } @Override - public FluidTankList getFluidTanks() { - if (fluidTanks == null) { - rebuildCache(); - } - return fluidTanks; - } - - @Override - public ItemHandlerList getItemHandlers() { - if (itemHandlers == null) { - rebuildCache(); - } - return itemHandlers; + public boolean hasFluidTanks() { + if (dirty) rebuildCache(); + return super.hasFluidTanks(); } } }