Skip to content

Commit

Permalink
use dual handler in qstorage controller
Browse files Browse the repository at this point in the history
rename delegate methods
add annotations
add javadoc
remove unused method
  • Loading branch information
ghzdude committed Feb 22, 2025
1 parent e845563 commit 7946c82
Show file tree
Hide file tree
Showing 6 changed files with 73 additions and 69 deletions.
67 changes: 36 additions & 31 deletions src/main/java/gregtech/api/capability/DualHandler.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,25 +8,23 @@
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;

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<ITankEntry> unwrapped;

Expand All @@ -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;
}
Expand All @@ -71,20 +61,20 @@ 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();
return remainder;
}

@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();
Expand All @@ -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))
Expand Down Expand Up @@ -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
Expand All @@ -191,44 +201,39 @@ 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;
}

@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;
}

@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);
Expand Down
7 changes: 4 additions & 3 deletions src/main/java/gregtech/api/capability/IDualHandler.java
Original file line number Diff line number Diff line change
@@ -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();
}
Original file line number Diff line number Diff line change
Expand Up @@ -120,8 +120,4 @@ public <R> List<R> castList(AbilityInstances instances) {
}
return null;
}

public String getType() {
return this.clazz.getSimpleName();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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 <T> boolean checkAbilityPart(MultiblockAbility<T> ability, BlockPos pos) {
return true;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 IQuantumStorage<?>storage) {
var qcontrollor = storage.getQuantumController();
if (qcontrollor != null) {
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -331,7 +335,7 @@ public void rebuildNetwork() {
}
storage.setDisconnected();
}
handler.rebuildCache();
handler.markDirty();
calculateEnergyUsage();
markDirty();
}
Expand Down Expand Up @@ -439,9 +443,9 @@ public void readFromNBT(NBTTagCompound data) {
public <T> T getCapability(@NotNull Capability<T> 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();
}
}

Expand All @@ -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() {
Expand All @@ -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();
}
}
}

0 comments on commit 7946c82

Please sign in to comment.