aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/gregtech/api/multitileentity/multiblock/base/MultiBlockPart.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/gregtech/api/multitileentity/multiblock/base/MultiBlockPart.java')
-rw-r--r--src/main/java/gregtech/api/multitileentity/multiblock/base/MultiBlockPart.java274
1 files changed, 246 insertions, 28 deletions
diff --git a/src/main/java/gregtech/api/multitileentity/multiblock/base/MultiBlockPart.java b/src/main/java/gregtech/api/multitileentity/multiblock/base/MultiBlockPart.java
index 628992a931..36fbf35961 100644
--- a/src/main/java/gregtech/api/multitileentity/multiblock/base/MultiBlockPart.java
+++ b/src/main/java/gregtech/api/multitileentity/multiblock/base/MultiBlockPart.java
@@ -15,6 +15,15 @@ import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_PIPE_IN;
import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_PIPE_OUT;
import static org.apache.commons.lang3.ObjectUtils.firstNonNull;
+import com.gtnewhorizons.modularui.api.forge.IItemHandlerModifiable;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow.Builder;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+import com.gtnewhorizons.modularui.common.widget.DrawableWidget;
+import com.gtnewhorizons.modularui.common.widget.DropDownWidget;
+import com.gtnewhorizons.modularui.common.widget.FluidSlotWidget;
+import com.gtnewhorizons.modularui.common.widget.Scrollable;
+import com.gtnewhorizons.modularui.common.widget.SlotWidget;
import gregtech.api.enums.GT_Values;
import gregtech.api.enums.Textures;
import gregtech.api.interfaces.IIconContainer;
@@ -22,11 +31,12 @@ import gregtech.api.interfaces.ITexture;
import gregtech.api.multitileentity.MultiTileEntityRegistry;
import gregtech.api.multitileentity.base.BaseNontickableMultiTileEntity;
import gregtech.api.multitileentity.interfaces.IMultiBlockController;
+import gregtech.api.multitileentity.interfaces.IMultiBlockPart;
import gregtech.api.multitileentity.interfaces.IMultiTileEntity.IMTE_BreakBlock;
+import gregtech.api.multitileentity.interfaces.IMultiTileEntity.IMTE_HasModes;
import gregtech.api.render.TextureFactory;
-import gregtech.api.util.GT_CoverBehaviorBase;
import gregtech.api.util.GT_Utility;
-import gregtech.api.util.ISerializableObject;
+import gregtech.common.covers.CoverInfo;
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.Arrays;
@@ -44,8 +54,10 @@ import net.minecraftforge.common.util.ForgeDirection;
import net.minecraftforge.fluids.Fluid;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fluids.FluidTankInfo;
+import net.minecraftforge.fluids.IFluidTank;
-public class MultiBlockPart extends BaseNontickableMultiTileEntity implements IMTE_BreakBlock {
+public class MultiBlockPart extends BaseNontickableMultiTileEntity
+ implements IMultiBlockPart, IMTE_BreakBlock, IMTE_HasModes {
public static final int NOTHING = 0,
ENERGY_IN = B[0],
ENERGY_OUT = B[1],
@@ -63,6 +75,9 @@ public class MultiBlockPart extends BaseNontickableMultiTileEntity implements IM
protected int mAllowedModes = NOTHING; // BITMASK - Modes allowed for this part
protected byte mMode = 0; // Mode selected for this part
+ protected String mLockedInventory = GT_Values.E;
+ protected int mLockedInventoryIndex = 0;
+
/**
* What Part Tier is this part? All Basic Casings are Tier 1, and will allow:
* Energy, Item, Fluid input/output. Some of the more advanced modes can be set to require a higher tier part.
@@ -71,14 +86,15 @@ public class MultiBlockPart extends BaseNontickableMultiTileEntity implements IM
return 1;
}
- public int getLockedInventory() {
- return -1;
+ public String getLockedInventory() {
+ return mLockedInventory.equals("") ? null : mLockedInventory;
}
public void setTarget(IMultiBlockController aTarget, int aAllowedModes) {
mTarget = aTarget;
mTargetPos = (mTarget == null ? null : mTarget.getCoords());
mAllowedModes = aAllowedModes;
+ if (mTarget != null) registerCovers(mTarget);
}
@Override
@@ -106,6 +122,8 @@ public class MultiBlockPart extends BaseNontickableMultiTileEntity implements IM
final TileEntity te = worldObj.getTileEntity(mTargetPos.posX, mTargetPos.posY, mTargetPos.posZ);
if (te instanceof IMultiBlockController) {
mTarget = (IMultiBlockController) te;
+ // Register our covers with the controller
+ registerCovers(mTarget);
} else {
mTargetPos = null;
}
@@ -116,6 +134,46 @@ public class MultiBlockPart extends BaseNontickableMultiTileEntity implements IM
} else return mTarget;
}
+ public void registerCovers(IMultiBlockController controller) {
+ for (byte i : ALL_VALID_SIDES) {
+ final CoverInfo coverInfo = getCoverInfoAtSide(i);
+ if (coverInfo.isValid() && coverInfo.getTickRate() > 0) {
+ controller.registerCoveredPartOnSide(i, this);
+ }
+ }
+ }
+
+ @Override
+ public void setCoverItemAtSide(byte aSide, ItemStack aCover) {
+ super.setCoverItemAtSide(aSide, aCover);
+ // TODO: Filter on tickable covers
+ final IMultiBlockController tTarget = getTarget(true);
+ if (tTarget != null) {
+ final CoverInfo coverInfo = getCoverInfoAtSide(aSide);
+ if (coverInfo.isValid() && coverInfo.getTickRate() > 0) {
+ tTarget.registerCoveredPartOnSide(aSide, this);
+ }
+ }
+ }
+
+ public void unregisterCovers(IMultiBlockController controller) {
+ for (byte i : ALL_VALID_SIDES) {
+ if (getCoverInfoAtSide(i).isValid()) {
+ controller.unregisterCoveredPartOnSide(i, this);
+ }
+ }
+ }
+
+ @Override
+ public boolean dropCover(byte aSide, byte aDroppedSide, boolean aForced) {
+ final boolean res = super.dropCover(aSide, aDroppedSide, aForced);
+ final IMultiBlockController tTarget = getTarget(true);
+ if (tTarget != null) {
+ tTarget.unregisterCoveredPartOnSide(aSide, this);
+ }
+ return res;
+ }
+
@Override
public void readMultiTileNBT(NBTTagCompound aNBT) {
if (aNBT.hasKey(NBT.ALLOWED_MODES)) mAllowedModes = aNBT.getInteger(NBT.ALLOWED_MODES);
@@ -124,6 +182,12 @@ public class MultiBlockPart extends BaseNontickableMultiTileEntity implements IM
mTargetPos = new ChunkCoordinates(
aNBT.getInteger(NBT.TARGET_X), aNBT.getShort(NBT.TARGET_Y), aNBT.getInteger(NBT.TARGET_Z));
}
+ if (aNBT.hasKey(NBT.LOCKED_INVENTORY)) {
+ mLockedInventory = aNBT.getString(NBT.LOCKED_INVENTORY);
+ }
+ if (aNBT.hasKey(NBT.LOCKED_INVENTORY_INDEX)) {
+ mLockedInventoryIndex = aNBT.getInteger(NBT.LOCKED_INVENTORY_INDEX);
+ }
}
@Override
@@ -136,12 +200,49 @@ public class MultiBlockPart extends BaseNontickableMultiTileEntity implements IM
aNBT.setShort(NBT.TARGET_Y, (short) mTargetPos.posY);
aNBT.setInteger(NBT.TARGET_Z, mTargetPos.posZ);
}
+ if (mLockedInventory != null) {
+ aNBT.setString(NBT.LOCKED_INVENTORY, mLockedInventory);
+ }
+ if (mLockedInventoryIndex != 0) {
+ aNBT.setInteger(NBT.LOCKED_INVENTORY_INDEX, mLockedInventoryIndex);
+ }
+ }
+
+ @Override
+ public void setTargetPos(ChunkCoordinates aTargetPos) {
+ mTargetPos = aTargetPos;
+ }
+
+ @Override
+ public ChunkCoordinates getTargetPos() {
+ return mTargetPos;
+ }
+
+ @Override
+ public void setMode(byte aMode) {
+ mMode = aMode;
+ }
+
+ @Override
+ public byte getMode() {
+ return mMode;
+ }
+
+ @Override
+ public int getAllowedModes() {
+ return mAllowedModes;
+ }
+
+ @Override
+ public void setAllowedModes(int aAllowedModes) {
+ mAllowedModes = aAllowedModes;
}
/**
* True if `aMode` is one of the allowed modes
*/
public boolean hasMode(int aMode) {
+ // This is not sent to the client
return (mAllowedModes & aMode) != 0;
}
@@ -158,7 +259,10 @@ public class MultiBlockPart extends BaseNontickableMultiTileEntity implements IM
@Override
public boolean breakBlock() {
final IMultiBlockController tTarget = getTarget(false);
- if (tTarget != null) tTarget.onStructureChange();
+ if (tTarget != null) {
+ unregisterCovers(tTarget);
+ tTarget.onStructureChange();
+ }
return false;
}
@@ -176,16 +280,6 @@ public class MultiBlockPart extends BaseNontickableMultiTileEntity implements IM
}
@Override
- public byte getTextureData() {
- return mMode;
- }
-
- @Override
- public void setTextureData(byte aData) {
- mMode = aData;
- }
-
- @Override
public void loadTextureNBT(NBTTagCompound aNBT) {
// Loading the registry
final String textureName = aNBT.getString(NBT.TEXTURE);
@@ -365,13 +459,10 @@ public class MultiBlockPart extends BaseNontickableMultiTileEntity implements IM
final IMultiBlockController controller = getTarget(true);
if (controller == null) return GT_Values.emptyFluidTankInfo;
- final GT_CoverBehaviorBase<?> tCover = getCoverBehaviorAtSideNew(aSide);
- final int coverId = getCoverIDAtSide(aSide);
- final ISerializableObject complexCoverData = getComplexCoverDataAtSide(aSide);
+ final CoverInfo coverInfo = getCoverInfoAtSide(aSide);
- if ((controller.isLiquidInput(aSide) && tCover.letsFluidIn(aSide, coverId, complexCoverData, null, controller))
- || (controller.isLiquidOutput(aSide)
- && tCover.letsFluidOut(aSide, coverId, complexCoverData, null, controller)))
+ if ((controller.isLiquidInput(aSide) && coverInfo.letsFluidIn(null, controller))
+ || (controller.isLiquidOutput(aSide) && coverInfo.letsFluidOut(null, controller)))
return controller.getTankInfo(this, aDirection);
return GT_Values.emptyFluidTankInfo;
@@ -441,7 +532,7 @@ public class MultiBlockPart extends BaseNontickableMultiTileEntity implements IM
@Override
public boolean decreaseStoredEnergyUnits(long aEnergy, boolean aIgnoreTooLittleEnergy) {
- if (!modeSelected(ENERGY_IN)) return false;
+ if (!modeSelected(ENERGY_OUT)) return false;
final IMultiBlockController controller = getTarget(true);
return controller != null
&& hasMode(ENERGY_OUT)
@@ -536,14 +627,14 @@ public class MultiBlockPart extends BaseNontickableMultiTileEntity implements IM
@Override
public boolean addStackToSlot(int aIndex, ItemStack aStack) {
- if (!modeSelected(ITEM_IN)) return false;
+ if (!modeSelected(ITEM_IN, ITEM_OUT)) return false;
final IMultiBlockController controller = getTarget(true);
return (controller != null && controller.addStackToSlot(this, aIndex, aStack));
}
@Override
public boolean addStackToSlot(int aIndex, ItemStack aStack, int aAmount) {
- if (!modeSelected(ITEM_IN)) return false;
+ if (!modeSelected(ITEM_IN, ITEM_OUT)) return false;
final IMultiBlockController controller = getTarget(true);
return (controller != null && controller.addStackToSlot(this, aIndex, aStack, aAmount));
}
@@ -558,7 +649,7 @@ public class MultiBlockPart extends BaseNontickableMultiTileEntity implements IM
@Override
public boolean canInsertItem(int aSlot, ItemStack aStack, int aSide) {
- if (!modeSelected(ITEM_IN)
+ if (!modeSelected(ITEM_IN, ITEM_OUT)
|| (mFacing != SIDE_UNKNOWN && (mFacing != aSide || !coverLetsItemsIn((byte) aSide, aSlot))))
return false;
final IMultiBlockController controller = getTarget(true);
@@ -567,7 +658,7 @@ public class MultiBlockPart extends BaseNontickableMultiTileEntity implements IM
@Override
public boolean canExtractItem(int aSlot, ItemStack aStack, int aSide) {
- if (!modeSelected(ITEM_OUT)
+ if (!modeSelected(ITEM_IN, ITEM_OUT)
|| (mFacing != SIDE_UNKNOWN && (mFacing != aSide || !coverLetsItemsOut((byte) aSide, aSlot))))
return false;
final IMultiBlockController controller = getTarget(true);
@@ -590,7 +681,7 @@ public class MultiBlockPart extends BaseNontickableMultiTileEntity implements IM
@Override
public ItemStack decrStackSize(int aSlot, int aDecrement) {
- if (!modeSelected(ITEM_OUT)) return null;
+ if (!modeSelected(ITEM_IN, ITEM_OUT)) return null;
final IMultiBlockController controller = getTarget(true);
return controller != null ? controller.decrStackSize(this, aSlot, aDecrement) : null;
}
@@ -628,4 +719,131 @@ public class MultiBlockPart extends BaseNontickableMultiTileEntity implements IM
// End Inventory
+ // === Modular UI ===
+ @Override
+ public boolean useModularUI() {
+ return true;
+ }
+
+ @Override
+ public String getLocalName() {
+ if (modeSelected(ITEM_IN)) return "Input Inventory";
+ if (modeSelected(ITEM_OUT)) return "Output Inventory";
+ if (modeSelected(FLUID_IN)) return "Fluid Input Hatch";
+ if (modeSelected(FLUID_OUT)) return "Fluid Output Hatch";
+
+ return "Unknown";
+ }
+
+ @Override
+ public boolean hasGui(byte aSide) {
+ // UIs only for specific mode(s)
+ if (modeSelected(ITEM_IN, ITEM_OUT, FLUID_IN, FLUID_OUT)) return true;
+
+ return false;
+ }
+
+ protected void addItemInventory(Builder builder, UIBuildContext buildContext) {
+ final IMultiBlockController controller = getTarget(false);
+ if (controller == null) {
+ return;
+ }
+ final IItemHandlerModifiable inv = controller.getInventoryForGUI(this);
+ final Scrollable scrollable = new Scrollable().setVerticalScroll();
+ for (int rows = 0; rows * 4 < Math.min(inv.getSlots(), 128); rows++) {
+ int columnsToMake = Math.min(Math.min(inv.getSlots(), 128) - rows * 4, 4);
+ for (int column = 0; column < columnsToMake; column++) {
+ scrollable.widget(new SlotWidget(inv, rows * 4 + column)
+ .setPos(column * 18, rows * 18)
+ .setSize(18, 18));
+ }
+ }
+ builder.widget(scrollable.setSize(18 * 4 + 4, 18 * 4).setPos(52, 18));
+ DropDownWidget dropDown = new DropDownWidget();
+ builder.widget(dropDown.addDropDownItemsSimple(
+ controller.getInventoryNames(this),
+ (buttonWidget, index, label, setSelected) -> buttonWidget.setOnClick((clickData, widget) -> {
+ if (getNameOfInventoryFromIndex(controller, index).equals("all")) {
+ mLockedInventory = GT_Values.E;
+ mLockedInventoryIndex = 0;
+ } else {
+ mLockedInventory = getNameOfInventoryFromIndex(controller, index);
+ mLockedInventoryIndex = index;
+ }
+ setSelected.run();
+ }),
+ true)
+ .setSelected(mLockedInventoryIndex)
+ .setExpandedMaxHeight(60)
+ .setDirection(DropDownWidget.Direction.DOWN)
+ .setPos(53, 5)
+ .setSize(70, 11));
+ }
+
+ protected String getNameOfInventoryFromIndex(final IMultiBlockController controller, int index) {
+ final List<String> invNames = controller.getInventoryNames(this);
+ if (index > invNames.size()) {
+ return invNames.get(0);
+ }
+ return invNames.get(index);
+ }
+
+ protected void addFluidInventory(Builder builder, UIBuildContext buildContext) {
+ final IMultiBlockController controller = getTarget(false);
+ if (controller == null) {
+ return;
+ }
+ final IFluidTank[] tanks = controller.getFluidTanksForGUI(this);
+ final Scrollable scrollable = new Scrollable().setVerticalScroll();
+ for (int rows = 0; rows * 4 < tanks.length; rows++) {
+ int columnsToMake = Math.min(tanks.length - rows * 4, 4);
+ for (int column = 0; column < columnsToMake; column++) {
+ FluidSlotWidget fluidSlot = new FluidSlotWidget(tanks[rows * 4 + column]);
+ if (modeSelected(FLUID_OUT)) {
+ fluidSlot.setInteraction(true, false);
+ }
+ scrollable.widget(fluidSlot.setPos(column * 18, rows * 18).setSize(18, 18));
+ }
+ }
+ builder.widget(scrollable.setSize(18 * 4 + 4, 18 * 4).setPos(52, 7));
+ }
+
+ @Override
+ public void addUIWidgets(Builder builder, UIBuildContext buildContext) {
+ if (modeSelected(ITEM_IN, ITEM_OUT)) {
+ addItemInventory(builder, buildContext);
+ }
+ if (modeSelected(FLUID_IN, FLUID_OUT)) {
+ addFluidInventory(builder, buildContext);
+ }
+ }
+
+ @Override
+ public ModularWindow createWindow(UIBuildContext buildContext) {
+ if (isServerSide()) {
+ issueClientUpdate();
+ }
+ System.out.println("MultiBlockPart::createWindow");
+ return super.createWindow(buildContext);
+ }
+
+ @Override
+ protected int getGUIHeight() {
+ if (modeSelected(ITEM_IN, ITEM_OUT)) {
+ return super.getGUIHeight() + 11;
+ }
+ return super.getGUIHeight();
+ }
+
+ @Override
+ public void addGregTechLogo(Builder builder) {
+ if (modeSelected(ITEM_IN, ITEM_OUT)) {
+ builder.widget(new DrawableWidget()
+ .setDrawable(getGUITextureSet().getGregTechLogo())
+ .setSize(17, 17)
+ .setPos(152, 74));
+ } else {
+ super.addGregTechLogo(builder);
+ }
+ }
}