diff options
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.java | 274 |
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); + } + } } |