aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/gregtech/api/metatileentity
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/gregtech/api/metatileentity')
-rw-r--r--src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_OutputBus.java123
-rw-r--r--src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_MultiBlockBase.java41
2 files changed, 156 insertions, 8 deletions
diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_OutputBus.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_OutputBus.java
index 3bd92c6871..4bb85cbd09 100644
--- a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_OutputBus.java
+++ b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_OutputBus.java
@@ -5,16 +5,25 @@ import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_PIPE_OUT;
import static gregtech.api.util.GT_Utility.moveMultipleItemStacks;
import net.minecraft.entity.player.EntityPlayer;
+import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
+import net.minecraft.util.ChatComponentTranslation;
import net.minecraftforge.common.util.ForgeDirection;
+import org.jetbrains.annotations.Nullable;
+
+import com.gtnewhorizons.modularui.api.forge.ItemHandlerHelper;
import com.gtnewhorizons.modularui.api.screen.ModularWindow;
import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
import gregtech.GT_Mod;
+import gregtech.api.enums.ItemList;
import gregtech.api.gui.modularui.GT_UIInfos;
+import gregtech.api.gui.widgets.GT_PhantomItemButton;
import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.metatileentity.IItemLockable;
import gregtech.api.interfaces.modularui.IAddUIWidgets;
import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
import gregtech.api.metatileentity.MetaTileEntity;
@@ -22,7 +31,12 @@ import gregtech.api.render.TextureFactory;
import gregtech.api.util.GT_Utility;
import gregtech.api.util.extensions.ArrayExt;
-public class GT_MetaTileEntity_Hatch_OutputBus extends GT_MetaTileEntity_Hatch implements IAddUIWidgets {
+public class GT_MetaTileEntity_Hatch_OutputBus extends GT_MetaTileEntity_Hatch implements IAddUIWidgets, IItemLockable {
+
+ private static final String DATA_STICK_DATA_TYPE = "outputBusFilter";
+ private static final String LOCKED_ITEM_NBT_KEY = "lockedItem";
+
+ protected ItemStack lockedItem = null;
public GT_MetaTileEntity_Hatch_OutputBus(int aID, String aName, String aNameRegional, int aTier) {
this(aID, aName, aNameRegional, aTier, getSlots(aTier));
@@ -37,7 +51,9 @@ public class GT_MetaTileEntity_Hatch_OutputBus extends GT_MetaTileEntity_Hatch i
slots,
ArrayExt.of(
"Item Output for Multiblocks",
- "Capacity: " + getSlots(tier) + " stack" + (getSlots(tier) >= 2 ? "s" : "")));
+ "Capacity: " + getSlots(tier) + " stack" + (getSlots(tier) >= 2 ? "s" : ""),
+ "Left click with data stick to save filter config",
+ "Right click with data stick to load filter config"));
}
public GT_MetaTileEntity_Hatch_OutputBus(int aID, String aName, String aNameRegional, int aTier,
@@ -107,8 +123,52 @@ public class GT_MetaTileEntity_Hatch_OutputBus extends GT_MetaTileEntity_Hatch i
@Override
public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) {
- GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer);
+ if (!acceptsItemLock() || !(aPlayer instanceof EntityPlayerMP)) {
+ GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer);
+ return super.onRightclick(aBaseMetaTileEntity, aPlayer);
+ }
+
+ final ItemStack dataStick = aPlayer.inventory.getCurrentItem();
+ if (!ItemList.Tool_DataStick.isStackEqual(dataStick, false, true)) {
+ GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer);
+ return super.onRightclick(aBaseMetaTileEntity, aPlayer);
+ }
+
+ if (!dataStick.hasTagCompound() || !DATA_STICK_DATA_TYPE.equals(dataStick.stackTagCompound.getString("type"))) {
+ aPlayer.addChatMessage(new ChatComponentTranslation("GT5U.machines.output_bus.invalid"));
+ return false;
+ }
+
+ final NBTTagCompound nbt = dataStick.stackTagCompound;
+ if (nbt.hasKey(LOCKED_ITEM_NBT_KEY)) {
+ lockedItem = ItemStack.loadItemStackFromNBT(nbt.getCompoundTag(LOCKED_ITEM_NBT_KEY));
+ } else {
+ lockedItem = null;
+ }
+ aPlayer.addChatMessage(new ChatComponentTranslation("GT5U.machines.output_bus.loaded"));
return true;
+
+ }
+
+ @Override
+ public void onLeftclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) {
+ if (!acceptsItemLock() || !(aPlayer instanceof EntityPlayerMP)) {
+ return;
+ }
+ final ItemStack dataStick = aPlayer.inventory.getCurrentItem();
+ if (!ItemList.Tool_DataStick.isStackEqual(dataStick, false, true)) {
+ return;
+ }
+
+ final NBTTagCompound nbt = new NBTTagCompound();
+ nbt.setString("type", DATA_STICK_DATA_TYPE);
+ if (lockedItem != null) {
+ nbt.setTag(LOCKED_ITEM_NBT_KEY, lockedItem.writeToNBT(new NBTTagCompound()));
+ }
+
+ dataStick.stackTagCompound = nbt;
+ dataStick.setStackDisplayName("Output Bus Configuration");
+ aPlayer.addChatMessage(new ChatComponentTranslation("GT5U.machines.output_bus.saved"));
}
/**
@@ -121,6 +181,11 @@ public class GT_MetaTileEntity_Hatch_OutputBus extends GT_MetaTileEntity_Hatch i
*/
public boolean storeAll(ItemStack aStack) {
markDirty();
+
+ if (lockedItem != null && !lockedItem.isItemEqual(aStack)) {
+ return false;
+ }
+
for (int i = 0, mInventoryLength = mInventory.length; i < mInventoryLength && aStack.stackSize > 0; i++) {
ItemStack tSlot = mInventory[i];
if (GT_Utility.isStackInvalid(tSlot)) {
@@ -186,6 +251,22 @@ public class GT_MetaTileEntity_Hatch_OutputBus extends GT_MetaTileEntity_Hatch i
}
@Override
+ public void saveNBTData(NBTTagCompound aNBT) {
+ super.saveNBTData(aNBT);
+ if (lockedItem != null) {
+ aNBT.setTag(LOCKED_ITEM_NBT_KEY, lockedItem.writeToNBT(new NBTTagCompound()));
+ }
+ }
+
+ @Override
+ public void loadNBTData(NBTTagCompound aNBT) {
+ super.loadNBTData(aNBT);
+ if (aNBT.hasKey(LOCKED_ITEM_NBT_KEY)) {
+ lockedItem = ItemStack.loadItemStackFromNBT(aNBT.getCompoundTag(LOCKED_ITEM_NBT_KEY));
+ }
+ }
+
+ @Override
public boolean useModularUI() {
return true;
}
@@ -198,5 +279,41 @@ public class GT_MetaTileEntity_Hatch_OutputBus extends GT_MetaTileEntity_Hatch i
case 2 -> getBaseMetaTileEntity().add3by3Slots(builder);
default -> getBaseMetaTileEntity().add4by4Slots(builder);
}
+
+ if (acceptsItemLock()) {
+ builder.widget(
+ new GT_PhantomItemButton(this).setPos(getGUIWidth() - 25, 40)
+ .setBackground(GT_PhantomItemButton.FILTER_BACKGROUND));
+ }
+ }
+
+ @Override
+ public void setLockedItem(@Nullable ItemStack itemStack) {
+ if (itemStack == null) {
+ clearLock();
+ } else {
+ lockedItem = ItemHandlerHelper.copyStackWithSize(itemStack, 1);
+ }
+ }
+
+ @Nullable
+ @Override
+ public ItemStack getLockedItem() {
+ return lockedItem;
+ }
+
+ @Override
+ public void clearLock() {
+ lockedItem = null;
+ }
+
+ @Override
+ public boolean isLocked() {
+ return lockedItem != null;
+ }
+
+ @Override
+ public boolean acceptsItemLock() {
+ return true;
}
}
diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_MultiBlockBase.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_MultiBlockBase.java
index 31052f8b8e..ca3e73dfbf 100644
--- a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_MultiBlockBase.java
+++ b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_MultiBlockBase.java
@@ -66,6 +66,7 @@ import gregtech.api.enums.VoidingMode;
import gregtech.api.gui.modularui.GT_UIInfos;
import gregtech.api.gui.modularui.GT_UITextures;
import gregtech.api.interfaces.fluid.IFluidStore;
+import gregtech.api.interfaces.metatileentity.IItemLockable;
import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
import gregtech.api.interfaces.modularui.ControllerWithOptionalFeatures;
import gregtech.api.interfaces.modularui.IAddGregtechLogo;
@@ -1285,12 +1286,14 @@ public abstract class GT_MetaTileEntity_MultiBlockBase extends MetaTileEntity
public boolean addOutput(ItemStack aStack) {
if (GT_Utility.isStackInvalid(aStack)) return false;
aStack = GT_Utility.copyOrNull(aStack);
- for (GT_MetaTileEntity_Hatch_OutputBus tHatch : filterValidMTEs(mOutputBusses)) {
- if (tHatch.storeAll(aStack)) {
- return true;
- }
+
+ final List<GT_MetaTileEntity_Hatch_OutputBus> filteredBuses = filterValidMTEs(mOutputBusses);
+ if (dumpItem(filteredBuses, aStack, true) || dumpItem(filteredBuses, aStack, false)) {
+ return true;
}
+
boolean outputSuccess = true;
+ // noinspection DataFlowIssue
while (outputSuccess && aStack.stackSize > 0) {
outputSuccess = false;
ItemStack single = aStack.splitStack(1);
@@ -1304,6 +1307,21 @@ public abstract class GT_MetaTileEntity_MultiBlockBase extends MetaTileEntity
return outputSuccess;
}
+ private boolean dumpItem(List<GT_MetaTileEntity_Hatch_OutputBus> outputBuses, ItemStack itemStack,
+ boolean restrictiveBusesOnly) {
+ for (GT_MetaTileEntity_Hatch_OutputBus outputBus : outputBuses) {
+ if (restrictiveBusesOnly && !outputBus.isLocked()) {
+ continue;
+ }
+
+ if (outputBus.storeAll(itemStack)) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
public boolean depleteInput(ItemStack aStack) {
if (GT_Utility.isStackInvalid(aStack)) return false;
FluidStack aLiquid = GT_Utility.getFluidForFilledItem(aStack, true);
@@ -2163,7 +2181,20 @@ public abstract class GT_MetaTileEntity_MultiBlockBase extends MetaTileEntity
if (!(tBus instanceof GT_MetaTileEntity_Hatch_OutputBus_ME)) {
final IInventory tBusInv = tBus.getBaseMetaTileEntity();
for (int i = 0; i < tBusInv.getSizeInventory(); i++) {
- ret.add(tBus.getStackInSlot(i));
+ final ItemStack stackInSlot = tBus.getStackInSlot(i);
+
+ if (stackInSlot == null && tBus instanceof IItemLockable lockable && lockable.isLocked()) {
+ // getItemOutputSlots is only used to calculate free room for the purposes of parallels and
+ // void protection. We can use a fake item stack here without creating weirdness in the output
+ // bus' actual inventory.
+ assert lockable.getLockedItem() != null;
+ ItemStack fakeItemStack = lockable.getLockedItem()
+ .copy();
+ fakeItemStack.stackSize = 0;
+ ret.add(fakeItemStack);
+ } else {
+ ret.add(stackInSlot);
+ }
}
}
}