Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
56 changes: 55 additions & 1 deletion src/main/java/gregtech/api/capability/DualHandler.java
Original file line number Diff line number Diff line change
@@ -1,21 +1,26 @@
package gregtech.api.capability;

import gregtech.api.capability.impl.FluidTankList;
import gregtech.api.capability.impl.ItemHandlerList;
import gregtech.api.metatileentity.MetaTileEntity;
import gregtech.api.util.ItemStackHashStrategy;

import net.minecraft.item.ItemStack;
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 com.google.common.collect.ImmutableList;
import org.jetbrains.annotations.NotNull;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

public class DualHandler implements IItemHandlerModifiable, IMultipleTankHandler, INotifiableHandler {
public class DualHandler implements IItemHandlerModifiable, IMultipleTankHandler, INotifiableHandler,
IMultipleNotifiableHandler {

@NotNull
private static final ItemStackHashStrategy strategy = ItemStackHashStrategy.comparingAll();
Expand Down Expand Up @@ -158,11 +163,39 @@ public void addNotifiableMetaTileEntity(MetaTileEntity metaTileEntity) {
if (metaTileEntity == null || this.notifiableEntities.contains(metaTileEntity))
return;
this.notifiableEntities.add(metaTileEntity);
if (getItemDelegate() instanceof INotifiableHandler handler) {
handler.addNotifiableMetaTileEntity(metaTileEntity);
} else if (getItemDelegate() instanceof ItemHandlerList list) {
for (IItemHandler handler : list.getBackingHandlers()) {
if (handler instanceof INotifiableHandler notifiableHandler) {
notifiableHandler.addNotifiableMetaTileEntity(metaTileEntity);
}
}
}
for (ITankEntry entry : getFluidDelegate()) {
if (entry.getDelegate() instanceof INotifiableHandler handler) {
handler.addNotifiableMetaTileEntity(metaTileEntity);
}
}
}

@Override
public void removeNotifiableMetaTileEntity(MetaTileEntity metaTileEntity) {
this.notifiableEntities.remove(metaTileEntity);
if (getItemDelegate() instanceof INotifiableHandler handler) {
handler.removeNotifiableMetaTileEntity(metaTileEntity);
} else if (getItemDelegate() instanceof ItemHandlerList list) {
for (IItemHandler handler : list.getBackingHandlers()) {
if (handler instanceof INotifiableHandler notifiableHandler) {
notifiableHandler.removeNotifiableMetaTileEntity(metaTileEntity);
}
}
}
for (ITankEntry entry : getFluidDelegate()) {
if (entry.getDelegate() instanceof INotifiableHandler handler) {
handler.removeNotifiableMetaTileEntity(metaTileEntity);
}
}
}

public @NotNull IItemHandlerModifiable getItemDelegate() {
Expand All @@ -173,6 +206,27 @@ public void removeNotifiableMetaTileEntity(MetaTileEntity metaTileEntity) {
return fluidDelegate;
}

@Override
public @NotNull Collection<INotifiableHandler> getBackingNotifiers() {
ImmutableList.Builder<INotifiableHandler> handlerList = ImmutableList.builder();

if (itemDelegate instanceof IMultipleNotifiableHandler multipleNotifiableHandler) {
handlerList.addAll(multipleNotifiableHandler.getBackingNotifiers());
} else if (itemDelegate instanceof INotifiableHandler notifiableHandler) {
handlerList.add(notifiableHandler);
}

for (var tank : fluidDelegate) {
if (tank instanceof INotifiableHandler notifiableHandler) {
handlerList.add(notifiableHandler);
} else if (tank.getDelegate() instanceof INotifiableHandler notifiableHandler) {
handlerList.add(notifiableHandler);
}
}

return handlerList.build();
}

public static class DualEntry implements ITankEntry, INotifiableHandler {

@NotNull
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package gregtech.api.capability;

import org.jetbrains.annotations.NotNull;

import java.util.Collection;

public interface IMultipleNotifiableHandler {

@NotNull
Collection<INotifiableHandler> getBackingNotifiers();
}
19 changes: 18 additions & 1 deletion src/main/java/gregtech/api/capability/impl/ItemHandlerList.java
Original file line number Diff line number Diff line change
@@ -1,9 +1,13 @@
package gregtech.api.capability.impl;

import gregtech.api.capability.IMultipleNotifiableHandler;
import gregtech.api.capability.INotifiableHandler;

import net.minecraft.item.ItemStack;
import net.minecraftforge.items.IItemHandler;
import net.minecraftforge.items.IItemHandlerModifiable;

import com.google.common.collect.ImmutableList;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
import it.unimi.dsi.fastutil.objects.Object2IntArrayMap;
Expand All @@ -15,7 +19,7 @@
/**
* Efficiently delegates calls into multiple item handlers
*/
public class ItemHandlerList implements IItemHandlerModifiable {
public class ItemHandlerList implements IItemHandlerModifiable, IMultipleNotifiableHandler {

private final Int2ObjectMap<IItemHandler> handlerBySlotIndex = new Int2ObjectOpenHashMap<>();
private final Object2IntMap<IItemHandler> baseIndexOffset = new Object2IntArrayMap<>();
Expand Down Expand Up @@ -93,6 +97,19 @@ public Collection<IItemHandler> getBackingHandlers() {
return Collections.unmodifiableCollection(baseIndexOffset.keySet());
}

@Override
public @NotNull Collection<INotifiableHandler> getBackingNotifiers() {
ImmutableList.Builder<INotifiableHandler> notifiableHandlers = ImmutableList.builder();

for (var handler : getBackingHandlers()) {
if (handler instanceof INotifiableHandler notifiableHandler) {
notifiableHandlers.add(notifiableHandler);
}
}

return notifiableHandlers.build();
}

private boolean invalidSlot(int slot) {
return slot < 0 && slot >= this.getSlots();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import gregtech.api.capability.DualHandler;
import gregtech.api.capability.IEnergyContainer;
import gregtech.api.capability.IMultiblockController;
import gregtech.api.capability.IMultipleNotifiableHandler;
import gregtech.api.capability.IMultipleRecipeMaps;
import gregtech.api.capability.IMultipleTankHandler;
import gregtech.api.metatileentity.multiblock.MultiblockAbility;
Expand Down Expand Up @@ -146,9 +147,9 @@ protected boolean canWorkWithInputs() {
Iterator<IItemHandlerModifiable> invalidatedIter = invalidatedInputList.iterator();
while (invalidatedIter.hasNext()) {
IItemHandler invalidatedHandler = invalidatedIter.next();
if (invalidatedHandler instanceof ItemHandlerList) {
for (IItemHandler ih : ((ItemHandlerList) invalidatedHandler).getBackingHandlers()) {
if (ih == bus) {
if (invalidatedHandler instanceof IMultipleNotifiableHandler multipleNotifiableHandler) {
for (var notifiableHandler : multipleNotifiableHandler.getBackingNotifiers()) {
if (notifiableHandler == bus) {
canWork = true;
invalidatedIter.remove();
break;
Expand Down
39 changes: 39 additions & 0 deletions src/main/java/gregtech/api/util/GTUtility.java
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@
import net.minecraftforge.items.IItemHandlerModifiable;

import com.google.common.util.concurrent.AtomicDouble;
import it.unimi.dsi.fastutil.objects.Object2IntMap;
import it.unimi.dsi.fastutil.objects.ObjectOpenCustomHashSet;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.tuple.Pair;
Expand Down Expand Up @@ -1029,4 +1030,42 @@ public static boolean areFluidStacksEqual(@Nullable FluidStack a, @Nullable Flui
if (a == null) return false;
return a.isFluidEqual(b);
}

public static void collapseInventorySlotContents(IItemHandlerModifiable inventory) {
// Gather a snapshot of the provided inventory
Object2IntMap<ItemStack> inventoryContents = GTHashMaps.fromItemHandler(inventory, true);

List<ItemStack> inventoryItemContents = new ArrayList<>();

// Populate the list of item stacks in the inventory with apportioned item stacks, for easy replacement
for (Object2IntMap.Entry<ItemStack> e : inventoryContents.object2IntEntrySet()) {
ItemStack stack = e.getKey();
int count = e.getIntValue();
int maxStackSize = stack.getMaxStackSize();
while (count >= maxStackSize) {
ItemStack copy = stack.copy();
copy.setCount(maxStackSize);
inventoryItemContents.add(copy);
count -= maxStackSize;
}
if (count > 0) {
ItemStack copy = stack.copy();
copy.setCount(count);
inventoryItemContents.add(copy);
}
}

for (int i = 0; i < inventory.getSlots(); i++) {
ItemStack stackToMove;
// Ensure that we are not exceeding the List size when attempting to populate items
if (i >= inventoryItemContents.size()) {
stackToMove = ItemStack.EMPTY;
} else {
stackToMove = inventoryItemContents.get(i);
}

// Populate the slots
inventory.setStackInSlot(i, stackToMove);
}
}
}
4 changes: 4 additions & 0 deletions src/main/java/gregtech/client/renderer/texture/Textures.java
Original file line number Diff line number Diff line change
Expand Up @@ -348,6 +348,10 @@ public class Textures {
"overlay/machine/overlay_item_hatch_input");
public static final SimpleOverlayRenderer WATER_OVERLAY = new SimpleOverlayRenderer(
"overlay/machine/overlay_water");
public static final SimpleOverlayRenderer DUAL_HATCH_OUTPUT_OVERLAY = new SimpleOverlayRenderer(
"overlay/machine/overlay_dual_hatch_output");
public static final SimpleOverlayRenderer DUAL_HATCH_INPUT_OVERLAY = new SimpleOverlayRenderer(
"overlay/machine/overlay_dual_hatch_input");

public static final ICubeRenderer BRONZE_FIREBOX = new SidedCubeRenderer("casings/firebox/overlay/bronze");
public static final ICubeRenderer BRONZE_FIREBOX_ACTIVE = new FireboxActiveRenderer(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@
import gregtech.common.metatileentities.multi.multiblockpart.MetaTileEntityCleaningMaintenanceHatch;
import gregtech.common.metatileentities.multi.multiblockpart.MetaTileEntityComputationHatch;
import gregtech.common.metatileentities.multi.multiblockpart.MetaTileEntityDataAccessHatch;
import gregtech.common.metatileentities.multi.multiblockpart.MetaTileEntityDualHatch;
import gregtech.common.metatileentities.multi.multiblockpart.MetaTileEntityEnergyHatch;
import gregtech.common.metatileentities.multi.multiblockpart.MetaTileEntityFluidHatch;
import gregtech.common.metatileentities.multi.multiblockpart.MetaTileEntityItemBus;
Expand Down Expand Up @@ -246,6 +247,8 @@ private MetaTileEntities() {}
public static MetaTileEntityHPCACooler HPCA_HEAT_SINK_COMPONENT;
public static MetaTileEntityHPCACooler HPCA_ACTIVE_COOLER_COMPONENT;
public static MetaTileEntityHPCABridge HPCA_BRIDGE_COMPONENT;
public static MetaTileEntityDualHatch[] DUAL_INPUT_HATCH = new MetaTileEntityDualHatch[GTValues.V.length - 1];
public static MetaTileEntityDualHatch[] DUAL_OUTPUT_HATCH = new MetaTileEntityDualHatch[GTValues.V.length - 1];

// Used for addons if they wish to disable certain tiers of machines
private static final Map<String, Boolean> MID_TIER = new HashMap<>();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@
import gregtech.common.metatileentities.multi.multiblockpart.MetaTileEntityCleaningMaintenanceHatch;
import gregtech.common.metatileentities.multi.multiblockpart.MetaTileEntityComputationHatch;
import gregtech.common.metatileentities.multi.multiblockpart.MetaTileEntityDataAccessHatch;
import gregtech.common.metatileentities.multi.multiblockpart.MetaTileEntityDualHatch;
import gregtech.common.metatileentities.multi.multiblockpart.MetaTileEntityEnergyHatch;
import gregtech.common.metatileentities.multi.multiblockpart.MetaTileEntityFluidHatch;
import gregtech.common.metatileentities.multi.multiblockpart.MetaTileEntityItemBus;
Expand Down Expand Up @@ -1098,5 +1099,21 @@ private static void multiblockParts() {
MetaTileEntities.FLUID_EXPORT_HATCH_ME = MetaTileEntities.registerMetaTileEntity(11533,
new MetaTileEntityMEOutputHatch(gregtechId("me_export_fluid_hatch")));
}

// Dual Input Hatches
for (int tier = GTValues.ULV; tier <= (GregTechAPI.isHighTier() ? GTValues.OpV : GTValues.UHV); tier++) {
String voltageName = GTValues.VN[tier].toLowerCase();
MetaTileEntities.DUAL_INPUT_HATCH[tier] = MetaTileEntities.registerMetaTileEntity(11591 + tier,
new MetaTileEntityDualHatch(
gregtechId(String.format("%s.%s", "dual_input_hatch", voltageName)), tier, false));
}

// Dual Output Hatches
for (int tier = GTValues.ULV; tier <= (GregTechAPI.isHighTier() ? GTValues.OpV : GTValues.UHV); tier++) {
String voltageName = GTValues.VN[tier].toLowerCase();
MetaTileEntities.DUAL_INPUT_HATCH[tier] = MetaTileEntities.registerMetaTileEntity(11605 + tier,
new MetaTileEntityDualHatch(
gregtechId(String.format("%s.%s", "dual_output_hatch", voltageName)), tier, true));
}
}
}
Loading