Skip to content

Commit

Permalink
Added the ability to filter outputs to ME Output Bus and Hatch
Browse files Browse the repository at this point in the history
  • Loading branch information
Diamantino-Op committed Jan 19, 2025
1 parent 1195aca commit 4e2e2ec
Show file tree
Hide file tree
Showing 4 changed files with 246 additions and 11 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2370,7 +2370,11 @@ protected <T extends MTEHatchOutput> List<? extends IFluidStore> getFluidOutputS
public boolean canDumpItemToME() {
for (MTEHatch tHatch : validMTEList(mOutputBusses)) {
if (tHatch instanceof MTEHatchOutputBusME) {
if ((((MTEHatchOutputBusME) tHatch).canAcceptItem())) {
if (((MTEHatchOutputBusME) tHatch).isLocked()) {
return false;
}

if (((MTEHatchOutputBusME) tHatch).canAcceptItem()) {
return true;
}
}
Expand All @@ -2382,7 +2386,11 @@ public boolean canDumpItemToME() {
public boolean canDumpFluidToME() {
for (IFluidStore tHatch : getFluidOutputSlots(new FluidStack[0])) {
if (tHatch instanceof MTEHatchOutputME) {
if ((((MTEHatchOutputME) tHatch).canAcceptFluid())) {
if (((MTEHatchOutputME) tHatch).isFluidLocked()) {
return false;
}

if (((MTEHatchOutputME) tHatch).canAcceptFluid()) {
return true;
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,11 @@

import javax.annotation.Nullable;

import appeng.api.implementations.items.IStorageCell;
import appeng.items.contents.CellConfig;
import com.glodblock.github.common.item.FCBaseItemCell;
import com.glodblock.github.common.storage.IStorageFluidCell;
import com.gtnewhorizons.modularui.api.forge.ItemHandlerHelper;
import net.minecraft.client.gui.GuiScreen;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
Expand All @@ -21,6 +26,7 @@
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.ChatComponentTranslation;
import net.minecraft.util.EnumChatFormatting;
import net.minecraft.util.StatCollector;
import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;

Expand Down Expand Up @@ -57,9 +63,11 @@
import gregtech.api.util.GTUtility;
import mcp.mobius.waila.api.IWailaConfigHandler;
import mcp.mobius.waila.api.IWailaDataAccessor;
import net.minecraftforge.fluids.FluidContainerRegistry;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fluids.IFluidContainerItem;

public class MTEHatchOutputBusME extends MTEHatchOutputBus implements IPowerChannelState {

protected static final long DEFAULT_CAPACITY = 1_600;
protected long baseCapacity = DEFAULT_CAPACITY;

Expand All @@ -72,6 +80,8 @@ public class MTEHatchOutputBusME extends MTEHatchOutputBus implements IPowerChan
long lastInputTick = 0;
long tickCounter = 0;
boolean additionalConnection = false;
EntityPlayer lastClickedPlayer = null;
List<ItemStack> lockedItems = new ArrayList<>();

public MTEHatchOutputBusME(int aID, String aName, String aNameRegional) {
super(
Expand All @@ -81,7 +91,8 @@ public MTEHatchOutputBusME(int aID, String aName, String aNameRegional) {
3,
new String[] { "Item Output for Multiblocks", "Stores directly into ME", "Can cache 1600 items by default",
"Change cache size by inserting a storage cell",
"Change ME connection behavior by right-clicking with wire cutter" },
"Change ME connection behavior by right-clicking with wire cutter",
"To set output item filter, place an ME Disk that has the items in its filter settings into the slot"},
1);
}

Expand Down Expand Up @@ -146,6 +157,22 @@ public boolean canAcceptItem() {
* @return amount of items left over
*/
public int store(final ItemStack stack) {
if (!lockedItems.isEmpty()) {
boolean isOk = false;

for (ItemStack lockedItem : lockedItems) {
if (lockedItem.isItemEqual(stack)) {
isOk = true;

break;
}
}

if (!isOk) {
return stack.stackSize;
}
}

// Always allow insertion on the same tick so we can output the entire recipe
if (canAcceptItem() || (lastInputTick == tickCounter)) {
itemCache.add(
Expand Down Expand Up @@ -183,6 +210,8 @@ public void onFacingChange() {

@Override
public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) {
this.lastClickedPlayer = aPlayer;

GTUIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer);
return true;
}
Expand Down Expand Up @@ -257,6 +286,8 @@ public boolean isActive() {

@Override
public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
checkItemLock();

if (getBaseMetaTileEntity().isServerSide()) {
tickCounter = aTick;
if (tickCounter > (lastOutputTick + 40)) flushCachedStack();
Expand All @@ -266,8 +297,63 @@ public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
}

@Override
public void addAdditionalTooltipInformation(ItemStack stack, List<String> tooltip) {
public boolean isLocked() {
return !this.lockedItems.isEmpty();
}

private void checkItemLock() {
ItemStack upgradeItemStack = mInventory[0];

if (upgradeItemStack != null && upgradeItemStack.getItem() instanceof ItemBasicStorageCell) {
if (this.lockedItems.isEmpty()) {
CellConfig cfg = (CellConfig) ((ItemBasicStorageCell) upgradeItemStack.getItem()).getConfigInventory(upgradeItemStack);

if (!cfg.isEmpty()) {
StringBuilder builder = new StringBuilder();

boolean hadFilters = false;
boolean isFirst = true;

for (int i = 0; i < cfg.getSizeInventory(); i++) {
ItemStack stack = cfg.getStackInSlot(i);

if (stack != null) {
hadFilters = true;

lockedItems.add(ItemHandlerHelper.copyStackWithSize(stack, 1));

if (isFirst) {
builder.append(stack.getDisplayName());

isFirst = false;
} else {
builder.append(", ").append(stack.getDisplayName());
}
}
}

if (hadFilters) {
if (lastClickedPlayer != null) {
GTUtility.sendChatToPlayer(lastClickedPlayer, StatCollector.translateToLocalFormatted("GT5U.hatch.item.filterchat", builder));
}

markDirty();
}
}
}
} else {
if (!this.lockedItems.isEmpty()) {
this.lockedItems.clear();

markDirty();

GTUtility.sendChatToPlayer(lastClickedPlayer, "Fluid lock disabled");
}
}
}

@Override
public void addAdditionalTooltipInformation(ItemStack stack, List<String> tooltip) {
if (stack.hasTagCompound() && stack.stackTagCompound.hasKey("baseCapacity")) {
tooltip.add(
"Current cache capacity: " + EnumChatFormatting.YELLOW
Expand All @@ -286,6 +372,16 @@ public void setItemNBT(NBTTagCompound aNBT) {
public void saveNBTData(NBTTagCompound aNBT) {
super.saveNBTData(aNBT);

NBTTagList lockedItemsTag = new NBTTagList();

for (ItemStack stack : this.lockedItems) {
NBTTagCompound stackTag = new NBTTagCompound();
stack.writeToNBT(stackTag);
lockedItemsTag.appendTag(stackTag);
}

aNBT.setTag("lockedItems", lockedItemsTag);

NBTTagList items = new NBTTagList();
for (IAEItemStack s : itemCache) {
if (s.getStackSize() == 0) continue;
Expand All @@ -304,6 +400,15 @@ public void saveNBTData(NBTTagCompound aNBT) {
public void loadNBTData(NBTTagCompound aNBT) {
super.loadNBTData(aNBT);

NBTBase lockedItemsTag = aNBT.getTag("lockedItems");

if (lockedItemsTag instanceof NBTTagList lockedItemsList) {
for (int i = 0; i < lockedItemsList.tagCount(); i++) {
NBTTagCompound stackTag = lockedItemsList.getCompoundTagAt(i);
this.lockedItems.add(GTUtility.loadItem(stackTag));
}
}

NBTBase t = aNBT.getTag("cachedStack"); // legacy
if (t instanceof NBTTagCompound) itemCache.add(
AEApi.instance()
Expand Down
Loading

0 comments on commit 4e2e2ec

Please sign in to comment.