From 7ed516e30ba224b4b8e3fad9c836c22ca00bfcdb Mon Sep 17 00:00:00 2001 From: Jason Mitchell Date: Fri, 20 Jan 2023 00:30:50 -0800 Subject: MTE Inventory updates (#1496) * MTE Inventory updates * Separate Input/Output inventory * Use a LinkedHashMap to ensure inventory orders are deterministic * Input/Output work on either Input/Output inventories * MTE Inventory * Add GT_Packet_MultiTileEntity * More dyanmic packet with packetFeatures * Add IMTE_HasModes for MultiBlockPart * Help with MTE Inventory (#1613) * convert inventory to use ItemStackHandler * Update MUI * inventories * move Iteminventory to its own method Co-authored-by: miozune * Update MUI * Update MUI * Add IMultiBlockPart * Mte fluid inventory (#1639) * first work on fluid inventory * make gui work with numbers not dividable by 4 * use math.min * add outputfluids saving * actually working * Update MUI Co-authored-by: miozune * Ticking Covers! * Parts now register covers with the controller * Controllers now tick covers on parts * Break cover ticking out into `tickCoverAtSide` Fix some inventory methods on MultiBlockController * Filter on tickable covers * Improve GUIs for MTEs (#1650) * working controller GUI * locked inventory selection work * input and output locking of inventories Co-authored-by: miozune * spotless * CoverInfo refactor (#1654) * Add `CoverInfo` and deprecate the old fields to hold cover information * Disable MTE registration * Fix NPE - Return EMPTY_INFO for SIDE_UNKNOWN Temporarily add back old NBT saving in case of a revert so covers aren't lost. * Actually save the old NBT data, instead of empty Co-authored-by: BlueWeabo <76872108+BlueWeabo@users.noreply.github.com> Co-authored-by: miozune --- .../api/metatileentity/BaseMetaPipeEntity.java | 170 ++------ .../api/metatileentity/BaseMetaTileEntity.java | 127 ++---- .../api/metatileentity/CoverableTileEntity.java | 453 +++++++++++---------- .../metatileentity/GregTechTileClientEvents.java | 2 +- .../api/metatileentity/MetaPipeEntity.java | 71 ++-- .../api/metatileentity/MetaTileEntity.java | 47 +-- .../implementations/GT_MetaPipeEntity_Cable.java | 68 ++-- .../implementations/GT_MetaPipeEntity_Fluid.java | 79 ++-- .../implementations/GT_MetaPipeEntity_Item.java | 60 ++- .../GT_MetaTileEntity_BasicMachine.java | 5 +- .../GT_MetaTileEntity_Hatch_InputBus.java | 8 +- .../GT_MetaTileEntity_Hatch_Output.java | 24 +- 12 files changed, 473 insertions(+), 641 deletions(-) (limited to 'src/main/java/gregtech/api/metatileentity') diff --git a/src/main/java/gregtech/api/metatileentity/BaseMetaPipeEntity.java b/src/main/java/gregtech/api/metatileentity/BaseMetaPipeEntity.java index 09b62c0657..31a341040e 100644 --- a/src/main/java/gregtech/api/metatileentity/BaseMetaPipeEntity.java +++ b/src/main/java/gregtech/api/metatileentity/BaseMetaPipeEntity.java @@ -22,6 +22,7 @@ import gregtech.api.util.GT_Log; import gregtech.api.util.GT_ModHandler; import gregtech.api.util.GT_OreDictUnificator; import gregtech.api.util.GT_Utility; +import gregtech.common.covers.CoverInfo; import java.util.*; import net.minecraft.block.Block; import net.minecraft.entity.Entity; @@ -79,7 +80,7 @@ public class BaseMetaPipeEntity extends CommonMetaTileEntity public void addToLock(TileEntity tileEntity, int side) { if (node != null) { - Lock lock = node.locks[side]; + final Lock lock = node.locks[side]; if (lock != null) { lock.addTileEntity(tileEntity); } @@ -90,7 +91,7 @@ public class BaseMetaPipeEntity extends CommonMetaTileEntity public void removeFromLock(TileEntity tileEntity, int side) { if (node != null) { - Lock lock = node.locks[side]; + final Lock lock = node.locks[side]; if (lock != null) { lock.removeTileEntity(tileEntity); } @@ -100,7 +101,7 @@ public class BaseMetaPipeEntity extends CommonMetaTileEntity } public void reloadLocks() { - IMetaTileEntity meta = getMetaTileEntity(); + final IMetaTileEntity meta = getMetaTileEntity(); if (meta instanceof MetaPipeEntity) { ((MetaPipeEntity) meta).reloadLocks(); } @@ -283,12 +284,12 @@ public class BaseMetaPipeEntity extends CommonMetaTileEntity (short) yCoord, zCoord, mID, - mCoverSides[0], - mCoverSides[1], - mCoverSides[2], - mCoverSides[3], - mCoverSides[4], - mCoverSides[5], + getCoverInfoAtSide((byte) 0).getCoverID(), + getCoverInfoAtSide((byte) 1).getCoverID(), + getCoverInfoAtSide((byte) 2).getCoverID(), + getCoverInfoAtSide((byte) 3).getCoverID(), + getCoverInfoAtSide((byte) 4).getCoverID(), + getCoverInfoAtSide((byte) 5).getCoverID(), oTextureData = mConnections, oUpdateData = hasValidMetaTileEntity() ? mMetaTileEntity.getUpdateData() : 0, oRedstoneData = (byte) (((mSidedRedstone[0] > 0) ? 1 : 0) @@ -705,16 +706,16 @@ public class BaseMetaPipeEntity extends CommonMetaTileEntity @Override public ITexture[] getTexture(Block aBlock, byte aSide) { - ITexture rIcon = getCoverTexture(aSide); + final ITexture rIcon = getCoverTexture(aSide); if (rIcon != null) return new ITexture[] {rIcon}; return getTextureUncovered(aSide); } @Override public ITexture[] getTextureCovered(byte aSide) { - ITexture coverTexture = getCoverTexture(aSide); - ITexture[] textureUncovered = getTextureUncovered(aSide); - ITexture[] textureCovered; + final ITexture coverTexture = getCoverTexture(aSide); + final ITexture[] textureUncovered = getTextureUncovered(aSide); + final ITexture[] textureCovered; if (coverTexture != null) { textureCovered = Arrays.copyOf(textureUncovered, textureUncovered.length + 1); textureCovered[textureUncovered.length] = coverTexture; @@ -762,18 +763,11 @@ public class BaseMetaPipeEntity extends CommonMetaTileEntity @Override public ArrayList getDrops() { - ItemStack rStack = new ItemStack(GregTech_API.sBlockMachines, 1, mID); - NBTTagCompound tNBT = new NBTTagCompound(); - if (mStrongRedstone > 0) tNBT.setByte("mStrongRedstone", mStrongRedstone); - boolean hasCover = false; - for (byte i = 0; i < mCoverSides.length; i++) { - if (mCoverSides[i] != 0) { - if (mCoverData[i] != null) // this really shouldn't be null if a cover is there already, but whatever - tNBT.setTag(COVER_DATA_NBT_KEYS[i], mCoverData[i].saveDataToNBT()); - hasCover = true; - } - } - if (hasCover) tNBT.setIntArray("mCoverSides", mCoverSides); + final ItemStack rStack = new ItemStack(GregTech_API.sBlockMachines, 1, mID); + final NBTTagCompound tNBT = new NBTTagCompound(); + + writeCoverNBT(tNBT, true); + if (hasValidMetaTileEntity()) mMetaTileEntity.setItemNBT(tNBT); if (!tNBT.hasNoTags()) rStack.setTagCompound(tNBT); @@ -791,15 +785,15 @@ public class BaseMetaPipeEntity extends CommonMetaTileEntity if (isClientSide()) { // Configure Cover, sneak can also be: screwdriver, wrench, side cutter, soldering iron if (aPlayer.isSneaking()) { - byte tSide = + final byte tSide = (getCoverIDAtSide(aSide) == 0) ? GT_Utility.determineWrenchingSide(aSide, aX, aY, aZ) : aSide; - return (getCoverBehaviorAtSideNew(tSide).hasCoverGUI()); + return (getCoverInfoAtSide(tSide).hasCoverGUI()); } else if (getCoverBehaviorAtSideNew(aSide).onCoverRightclickClient(aSide, this, aPlayer, aX, aY, aZ)) { return true; } } if (isServerSide()) { - ItemStack tCurrentItem = aPlayer.inventory.getCurrentItem(); + final ItemStack tCurrentItem = aPlayer.inventory.getCurrentItem(); if (tCurrentItem != null) { if (getColorization() >= 0 && GT_Utility.areStacksEqual(new ItemStack(Items.water_bucket, 1), tCurrentItem)) { @@ -808,7 +802,7 @@ public class BaseMetaPipeEntity extends CommonMetaTileEntity setColorization((byte) -1); return true; } - byte tSide = GT_Utility.determineWrenchingSide(aSide, aX, aY, aZ); + final byte tSide = GT_Utility.determineWrenchingSide(aSide, aX, aY, aZ); if (GT_Utility.isStackInList(tCurrentItem, GregTech_API.sWrenchList)) { if (mMetaTileEntity.onWrenchRightClick(aSide, tSide, aPlayer, aX, aY, aZ)) { mMetaTileEntity.markDirty(); @@ -823,16 +817,7 @@ public class BaseMetaPipeEntity extends CommonMetaTileEntity if (GT_ModHandler.damageOrDechargeItem(tCurrentItem, 1, 200, aPlayer)) { setCoverDataAtSide( tSide, - getCoverBehaviorAtSideNew(tSide) - .onCoverScrewdriverClick( - tSide, - getCoverIDAtSide(tSide), - getComplexCoverDataAtSide(tSide), - this, - aPlayer, - 0.5F, - 0.5F, - 0.5F)); + getCoverInfoAtSide(tSide).onCoverScrewdriverClick(aPlayer, 0.5F, 0.5F, 0.5F)); mMetaTileEntity.onScrewdriverRightClick(tSide, aPlayer, aX, aY, aZ); mMetaTileEntity.markDirty(); GT_Utility.sendSoundToPlayers( @@ -841,17 +826,7 @@ public class BaseMetaPipeEntity extends CommonMetaTileEntity } else { if (GT_ModHandler.damageOrDechargeItem(tCurrentItem, 1, 1000, aPlayer)) { setCoverDataAtSide( - aSide, - getCoverBehaviorAtSideNew(aSide) - .onCoverScrewdriverClick( - aSide, - getCoverIDAtSide(aSide), - getComplexCoverDataAtSide(aSide), - this, - aPlayer, - aX, - aY, - aZ)); + aSide, getCoverInfoAtSide(aSide).onCoverScrewdriverClick(aPlayer, aX, aY, aZ)); mMetaTileEntity.onScrewdriverRightClick(aSide, aPlayer, aX, aY, aZ); mMetaTileEntity.markDirty(); GT_Utility.sendSoundToPlayers( @@ -925,7 +900,9 @@ public class BaseMetaPipeEntity extends CommonMetaTileEntity byte coverSide = aSide; if (getCoverIDAtSide(aSide) == 0) coverSide = tSide; - if (getCoverIDAtSide(coverSide) == 0) { + final CoverInfo coverInfo = getCoverInfoAtSide(coverSide); + + if (coverInfo.getCoverID() == 0) { if (GT_Utility.isStackInList(tCurrentItem, GregTech_API.sCovers.keySet())) { if (GregTech_API.getCoverBehaviorNew(tCurrentItem) .isCoverPlaceable(coverSide, tCurrentItem, this) @@ -951,34 +928,18 @@ public class BaseMetaPipeEntity extends CommonMetaTileEntity } } else if (aPlayer.isSneaking()) { // Sneak click, no tool -> open cover config or turn back. aSide = (getCoverIDAtSide(aSide) == 0) ? GT_Utility.determineWrenchingSide(aSide, aX, aY, aZ) : aSide; - return getCoverIDAtSide(aSide) > 0 - && getCoverBehaviorAtSideNew(aSide) - .onCoverShiftRightClick( - aSide, - getCoverIDAtSide(aSide), - getComplexCoverDataAtSide(aSide), - this, - aPlayer); + final CoverInfo coverInfo = getCoverInfoAtSide(aSide); + return coverInfo.isValid() && coverInfo.onCoverShiftRightClick(aPlayer); } - if (getCoverBehaviorAtSideNew(aSide) - .onCoverRightClick( - aSide, - getCoverIDAtSide(aSide), - getComplexCoverDataAtSide(aSide), - this, - aPlayer, - aX, - aY, - aZ)) return true; + if (getCoverInfoAtSide(aSide).onCoverRightClick(aPlayer, aX, aY, aZ)) return true; } - if (!getCoverBehaviorAtSideNew(aSide) - .isGUIClickable(aSide, getCoverIDAtSide(aSide), getComplexCoverDataAtSide(aSide), this)) return false; + if (!getCoverInfoAtSide(aSide).isGUIClickable()) return false; try { if (!aPlayer.isSneaking() && hasValidMetaTileEntity()) { - boolean handled = mMetaTileEntity.onRightclick(this, aPlayer, aSide, aX, aY, aZ); + final boolean handled = mMetaTileEntity.onRightclick(this, aPlayer, aSide, aX, aY, aZ); if (handled) { mMetaTileEntity.markDirty(); } @@ -1034,21 +995,9 @@ public class BaseMetaPipeEntity extends CommonMetaTileEntity */ @Override public int[] getAccessibleSlotsFromSide(int aSide) { - if (canAccessData() - && (getCoverBehaviorAtSideNew((byte) aSide) - .letsItemsOut( - (byte) aSide, - getCoverIDAtSide((byte) aSide), - getComplexCoverDataAtSide((byte) aSide), - -1, - this) - || getCoverBehaviorAtSideNew((byte) aSide) - .letsItemsIn( - (byte) aSide, - getCoverIDAtSide((byte) aSide), - getComplexCoverDataAtSide((byte) aSide), - -1, - this))) return mMetaTileEntity.getAccessibleSlotsFromSide(aSide); + final CoverInfo coverInfo = getCoverInfoAtSide((byte) aSide); + if (canAccessData() && (coverInfo.letsItemsOut(-1) || coverInfo.letsItemsIn(-1))) + return mMetaTileEntity.getAccessibleSlotsFromSide(aSide); return GT_Values.emptyIntArray; } @@ -1058,13 +1007,7 @@ public class BaseMetaPipeEntity extends CommonMetaTileEntity @Override public boolean canInsertItem(int aIndex, ItemStack aStack, int aSide) { return canAccessData() - && getCoverBehaviorAtSideNew((byte) aSide) - .letsItemsIn( - (byte) aSide, - getCoverIDAtSide((byte) aSide), - getComplexCoverDataAtSide((byte) aSide), - aIndex, - this) + && getCoverInfoAtSide((byte) aSide).letsItemsIn(aIndex) && mMetaTileEntity.canInsertItem(aIndex, aStack, aSide); } @@ -1206,30 +1149,18 @@ public class BaseMetaPipeEntity extends CommonMetaTileEntity private boolean canMoveFluidOnSide(ForgeDirection aSide, Fluid aFluid, boolean isFill) { if (aSide == ForgeDirection.UNKNOWN) return true; - IFluidHandler tTileEntity = getITankContainerAtSide((byte) aSide.ordinal()); + final IFluidHandler tTileEntity = getITankContainerAtSide((byte) aSide.ordinal()); // Only require a connection if there's something to connect to - Allows fluid cells & buckets to interact with // the pipe if (tTileEntity != null && !mMetaTileEntity.isConnectedAtSide((byte) aSide.ordinal())) return false; if (isFill && mMetaTileEntity.isLiquidInput((byte) aSide.ordinal()) - && getCoverBehaviorAtSideNew((byte) aSide.ordinal()) - .letsFluidIn( - (byte) aSide.ordinal(), - getCoverIDAtSide((byte) aSide.ordinal()), - getComplexCoverDataAtSide((byte) aSide.ordinal()), - aFluid, - this)) return true; + && getCoverInfoAtSide((byte) aSide.ordinal()).letsFluidIn(aFluid)) return true; if (!isFill && mMetaTileEntity.isLiquidOutput((byte) aSide.ordinal()) - && getCoverBehaviorAtSideNew((byte) aSide.ordinal()) - .letsFluidOut( - (byte) aSide.ordinal(), - getCoverIDAtSide((byte) aSide.ordinal()), - getComplexCoverDataAtSide((byte) aSide.ordinal()), - aFluid, - this)) return true; + && getCoverInfoAtSide((byte) aSide.ordinal()).letsFluidOut(aFluid)) return true; return false; } @@ -1281,24 +1212,11 @@ public class BaseMetaPipeEntity extends CommonMetaTileEntity @Override public FluidTankInfo[] getTankInfo(ForgeDirection aSide) { + final CoverInfo coverInfo = getCoverInfoAtSide((byte) aSide.ordinal()); if (canAccessData() && (aSide == ForgeDirection.UNKNOWN - || (mMetaTileEntity.isLiquidInput((byte) aSide.ordinal()) - && getCoverBehaviorAtSideNew((byte) aSide.ordinal()) - .letsFluidIn( - (byte) aSide.ordinal(), - getCoverIDAtSide((byte) aSide.ordinal()), - getComplexCoverDataAtSide((byte) aSide.ordinal()), - null, - this)) - || (mMetaTileEntity.isLiquidOutput((byte) aSide.ordinal()) - && getCoverBehaviorAtSideNew((byte) aSide.ordinal()) - .letsFluidOut( - (byte) aSide.ordinal(), - getCoverIDAtSide((byte) aSide.ordinal()), - getComplexCoverDataAtSide((byte) aSide.ordinal()), - null, - this)) + || (mMetaTileEntity.isLiquidInput((byte) aSide.ordinal()) && coverInfo.letsFluidIn(null)) + || (mMetaTileEntity.isLiquidOutput((byte) aSide.ordinal()) && coverInfo.letsFluidOut(null)) // Doesn't need to be connected to get Tank Info -- otherwise things can't connect )) return mMetaTileEntity.getTankInfo(aSide); return new FluidTankInfo[] {}; @@ -1308,7 +1226,7 @@ public class BaseMetaPipeEntity extends CommonMetaTileEntity public boolean addStackToSlot(int aIndex, ItemStack aStack) { if (GT_Utility.isStackInvalid(aStack)) return true; if (aIndex < 0 || aIndex >= getSizeInventory()) return false; - ItemStack tStack = getStackInSlot(aIndex); + final ItemStack tStack = getStackInSlot(aIndex); if (GT_Utility.isStackInvalid(tStack)) { setInventorySlotContents(aIndex, aStack); return true; diff --git a/src/main/java/gregtech/api/metatileentity/BaseMetaTileEntity.java b/src/main/java/gregtech/api/metatileentity/BaseMetaTileEntity.java index 821cfcd8a7..1e8ffa0994 100644 --- a/src/main/java/gregtech/api/metatileentity/BaseMetaTileEntity.java +++ b/src/main/java/gregtech/api/metatileentity/BaseMetaTileEntity.java @@ -1,6 +1,7 @@ package gregtech.api.metatileentity; import static gregtech.GT_Mod.GT_FML_LOGGER; +import static gregtech.api.enums.GT_Values.ALL_VALID_SIDES; import static gregtech.api.enums.GT_Values.NW; import static gregtech.api.enums.GT_Values.V; import static gregtech.api.objects.XSTR.XSTR_INSTANCE; @@ -40,6 +41,7 @@ import gregtech.api.net.GT_Packet_TileEntity; import gregtech.api.objects.GT_ItemStack; import gregtech.api.util.*; import gregtech.common.GT_Pollution; +import gregtech.common.covers.CoverInfo; import ic2.api.Direction; import java.lang.reflect.Field; import java.util.*; @@ -215,8 +217,6 @@ public class BaseMetaTileEntity extends CommonMetaTileEntity loadMetaTileNBT(aNBT); } - if (mCoverData == null || mCoverData.length != 6) mCoverData = new ISerializableObject[6]; - if (mCoverSides.length != 6) mCoverSides = new int[] {0, 0, 0, 0, 0, 0}; if (mSidedRedstone.length != 6) if (hasValidMetaTileEntity() && mMetaTileEntity.hasSidedRedstoneOutputBehavior()) mSidedRedstone = new byte[] {0, 0, 0, 0, 0, 0}; @@ -400,7 +400,7 @@ public class BaseMetaTileEntity extends CommonMetaTileEntity } if (mMetaTileEntity.isEnetOutput() || mMetaTileEntity.isEnetInput()) { - for (byte i = 0; i < 6; i++) { + for (byte i : ALL_VALID_SIDES) { boolean temp = isEnergyInputSide(i); if (temp != mActiveEUInputs[i]) { mActiveEUInputs[i] = temp; @@ -656,12 +656,12 @@ public class BaseMetaTileEntity extends CommonMetaTileEntity (short) yCoord, zCoord, mID, - mCoverSides[0], - mCoverSides[1], - mCoverSides[2], - mCoverSides[3], - mCoverSides[4], - mCoverSides[5], + getCoverInfoAtSide((byte) 0).getCoverID(), + getCoverInfoAtSide((byte) 1).getCoverID(), + getCoverInfoAtSide((byte) 2).getCoverID(), + getCoverInfoAtSide((byte) 3).getCoverID(), + getCoverInfoAtSide((byte) 4).getCoverID(), + getCoverInfoAtSide((byte) 5).getCoverID(), oTextureData = (byte) ((mFacing & 7) | (mActive ? 8 : 0) | (mRedstone ? 16 : 0) @@ -1147,7 +1147,7 @@ public class BaseMetaTileEntity extends CommonMetaTileEntity public void generatePowerNodes() { if (isServerSide() && (isEnetInput() || isEnetOutput())) { final int time = MinecraftServer.getServer().getTickCounter(); - for (byte i = 0; i < 6; i++) { + for (byte i : ALL_VALID_SIDES) { if (outputsEnergyTo(i, false) || inputEnergyFrom(i, false)) { final IGregTechTileEntity TE = getIGregTechTileEntityAtSide(i); if (TE instanceof BaseMetaPipeEntity) { @@ -1252,8 +1252,7 @@ public class BaseMetaTileEntity extends CommonMetaTileEntity private boolean isEnergyInputSide(byte aSide) { if (aSide >= 0 && aSide < 6) { - if (!getCoverBehaviorAtSideNew(aSide) - .letsEnergyIn(aSide, getCoverIDAtSide(aSide), getComplexCoverDataAtSide(aSide), this)) return false; + if (!getCoverInfoAtSide(aSide).letsEnergyIn()) return false; if (isInvalid() || mReleaseEnergy) return false; if (canAccessData() && mMetaTileEntity.isElectric() && mMetaTileEntity.isEnetInput()) return mMetaTileEntity.isInputFacing(aSide); @@ -1263,9 +1262,7 @@ public class BaseMetaTileEntity extends CommonMetaTileEntity private boolean isEnergyOutputSide(byte aSide) { if (aSide >= 0 && aSide < 6) { - if (!getCoverBehaviorAtSideNew(aSide) - .letsEnergyOut(aSide, getCoverIDAtSide(aSide), getComplexCoverDataAtSide(aSide), this)) - return false; + if (!getCoverInfoAtSide(aSide).letsEnergyOut()) return false; if (isInvalid() || mReleaseEnergy) return mReleaseEnergy; if (canAccessData() && mMetaTileEntity.isElectric() && mMetaTileEntity.isEnetOutput()) return mMetaTileEntity.isOutputFacing(aSide); @@ -1460,10 +1457,9 @@ public class BaseMetaTileEntity extends CommonMetaTileEntity return true; } - if (!getCoverBehaviorAtSideNew(aSide) - .isGUIClickable(aSide, getCoverIDAtSide(aSide), getComplexCoverDataAtSide(aSide), this)) - return false; + if (!getCoverInfoAtSide(aSide).isGUIClickable()) return false; } + if (isServerSide()) { if (!privateAccess() || aPlayer.getDisplayName().equalsIgnoreCase(getOwnerName())) { final ItemStack tCurrentItem = aPlayer.inventory.getCurrentItem(); @@ -1622,6 +1618,7 @@ public class BaseMetaTileEntity extends CommonMetaTileEntity return true; } } + // End item != null } else if (aPlayer.isSneaking()) { // Sneak click, no tool -> open cover config if possible. aSide = (getCoverIDAtSide(aSide) == 0) ? GT_Utility.determineWrenchingSide(aSide, aX, aY, aZ) @@ -1647,9 +1644,7 @@ public class BaseMetaTileEntity extends CommonMetaTileEntity aY, aZ)) return true; - if (!getCoverBehaviorAtSideNew(aSide) - .isGUIClickable(aSide, getCoverIDAtSide(aSide), getComplexCoverDataAtSide(aSide), this)) - return false; + if (!getCoverInfoAtSide(aSide).isGUIClickable()) return false; if (isUpgradable() && tCurrentItem != null) { if (ItemList.Upgrade_Muffler.isStackEqual(aPlayer.inventory.getCurrentItem())) { @@ -1736,21 +1731,9 @@ public class BaseMetaTileEntity extends CommonMetaTileEntity */ @Override public int[] getAccessibleSlotsFromSide(int aSide) { - if (canAccessData() - && (getCoverBehaviorAtSideNew((byte) aSide) - .letsItemsOut( - (byte) aSide, - getCoverIDAtSide((byte) aSide), - getComplexCoverDataAtSide((byte) aSide), - -1, - this) - || getCoverBehaviorAtSideNew((byte) aSide) - .letsItemsIn( - (byte) aSide, - getCoverIDAtSide((byte) aSide), - getComplexCoverDataAtSide((byte) aSide), - -1, - this))) return mMetaTileEntity.getAccessibleSlotsFromSide(aSide); + final CoverInfo coverInfo = getCoverInfoAtSide((byte) aSide); + if (canAccessData() && (coverInfo.letsItemsOut(-1) || coverInfo.letsItemsIn(-1))) + return mMetaTileEntity.getAccessibleSlotsFromSide(aSide); return GT_Values.emptyIntArray; } @@ -1761,13 +1744,7 @@ public class BaseMetaTileEntity extends CommonMetaTileEntity public boolean canInsertItem(int aIndex, ItemStack aStack, int aSide) { return canAccessData() && (mRunningThroughTick || !mInputDisabled) - && getCoverBehaviorAtSideNew((byte) aSide) - .letsItemsIn( - (byte) aSide, - getCoverIDAtSide((byte) aSide), - getComplexCoverDataAtSide((byte) aSide), - aIndex, - this) + && getCoverInfoAtSide((byte) aSide).letsItemsIn(aIndex) && mMetaTileEntity.canInsertItem(aIndex, aStack, aSide); } @@ -1998,13 +1975,9 @@ public class BaseMetaTileEntity extends CommonMetaTileEntity && (mRunningThroughTick || !mInputDisabled) && (aSide == ForgeDirection.UNKNOWN || (mMetaTileEntity.isLiquidInput((byte) aSide.ordinal()) - && getCoverBehaviorAtSideNew((byte) aSide.ordinal()) - .letsFluidIn( - (byte) aSide.ordinal(), - getCoverIDAtSide((byte) aSide.ordinal()), - getComplexCoverDataAtSide((byte) aSide.ordinal()), - aFluid == null ? null : aFluid.getFluid(), - this)))) return mMetaTileEntity.fill(aSide, aFluid, doFill); + && getCoverInfoAtSide((byte) aSide.ordinal()) + .letsFluidIn(aFluid == null ? null : aFluid.getFluid())))) + return mMetaTileEntity.fill(aSide, aFluid, doFill); return 0; } @@ -2015,17 +1988,14 @@ public class BaseMetaTileEntity extends CommonMetaTileEntity && (mRunningThroughTick || !mOutputDisabled) && (aSide == ForgeDirection.UNKNOWN || (mMetaTileEntity.isLiquidOutput((byte) aSide.ordinal()) - && getCoverBehaviorAtSideNew((byte) aSide.ordinal()) + && getCoverInfoAtSide((byte) aSide.ordinal()) .letsFluidOut( - (byte) aSide.ordinal(), - getCoverIDAtSide((byte) aSide.ordinal()), - getComplexCoverDataAtSide((byte) aSide.ordinal()), mMetaTileEntity.getFluid() == null ? null : mMetaTileEntity .getFluid() - .getFluid(), - this)))) return mMetaTileEntity.drain(aSide, maxDrain, doDrain); + .getFluid())))) + return mMetaTileEntity.drain(aSide, maxDrain, doDrain); return null; } @@ -2036,13 +2006,9 @@ public class BaseMetaTileEntity extends CommonMetaTileEntity && (mRunningThroughTick || !mOutputDisabled) && (aSide == ForgeDirection.UNKNOWN || (mMetaTileEntity.isLiquidOutput((byte) aSide.ordinal()) - && getCoverBehaviorAtSideNew((byte) aSide.ordinal()) - .letsFluidOut( - (byte) aSide.ordinal(), - getCoverIDAtSide((byte) aSide.ordinal()), - getComplexCoverDataAtSide((byte) aSide.ordinal()), - aFluid == null ? null : aFluid.getFluid(), - this)))) return mMetaTileEntity.drain(aSide, aFluid, doDrain); + && getCoverInfoAtSide((byte) aSide.ordinal()) + .letsFluidOut(aFluid == null ? null : aFluid.getFluid())))) + return mMetaTileEntity.drain(aSide, aFluid, doDrain); return null; } @@ -2053,13 +2019,8 @@ public class BaseMetaTileEntity extends CommonMetaTileEntity && (mRunningThroughTick || !mInputDisabled) && (aSide == ForgeDirection.UNKNOWN || (mMetaTileEntity.isLiquidInput((byte) aSide.ordinal()) - && getCoverBehaviorAtSideNew((byte) aSide.ordinal()) - .letsFluidIn( - (byte) aSide.ordinal(), - getCoverIDAtSide((byte) aSide.ordinal()), - getComplexCoverDataAtSide((byte) aSide.ordinal()), - aFluid, - this)))) return mMetaTileEntity.canFill(aSide, aFluid); + && getCoverInfoAtSide((byte) aSide.ordinal()).letsFluidIn(aFluid)))) + return mMetaTileEntity.canFill(aSide, aFluid); return false; } @@ -2070,13 +2031,8 @@ public class BaseMetaTileEntity extends CommonMetaTileEntity && (mRunningThroughTick || !mOutputDisabled) && (aSide == ForgeDirection.UNKNOWN || (mMetaTileEntity.isLiquidOutput((byte) aSide.ordinal()) - && getCoverBehaviorAtSideNew((byte) aSide.ordinal()) - .letsFluidOut( - (byte) aSide.ordinal(), - getCoverIDAtSide((byte) aSide.ordinal()), - getComplexCoverDataAtSide((byte) aSide.ordinal()), - aFluid, - this)))) return mMetaTileEntity.canDrain(aSide, aFluid); + && getCoverInfoAtSide((byte) aSide.ordinal()).letsFluidOut(aFluid)))) + return mMetaTileEntity.canDrain(aSide, aFluid); return false; } @@ -2087,21 +2043,10 @@ public class BaseMetaTileEntity extends CommonMetaTileEntity if (canAccessData() && (aSide == ForgeDirection.UNKNOWN || (mMetaTileEntity.isLiquidInput(tSide) - && getCoverBehaviorAtSideNew(tSide) - .letsFluidIn( - tSide, - getCoverIDAtSide(tSide), - getComplexCoverDataAtSide(tSide), - null, - this)) + && getCoverInfoAtSide(tSide).letsFluidIn(null)) || (mMetaTileEntity.isLiquidOutput(tSide) - && getCoverBehaviorAtSideNew(tSide) - .letsFluidOut( - tSide, - getCoverIDAtSide(tSide), - getComplexCoverDataAtSide(tSide), - null, - this)))) return mMetaTileEntity.getTankInfo(aSide); + && getCoverInfoAtSide(tSide).letsFluidOut(null)))) + return mMetaTileEntity.getTankInfo(aSide); return new FluidTankInfo[] {}; } diff --git a/src/main/java/gregtech/api/metatileentity/CoverableTileEntity.java b/src/main/java/gregtech/api/metatileentity/CoverableTileEntity.java index 2d29c7b70d..cbd39d3d15 100644 --- a/src/main/java/gregtech/api/metatileentity/CoverableTileEntity.java +++ b/src/main/java/gregtech/api/metatileentity/CoverableTileEntity.java @@ -21,7 +21,6 @@ import gregtech.GT_Mod; import gregtech.api.GregTech_API; import gregtech.api.enums.GT_Values; import gregtech.api.enums.Textures; -import gregtech.api.gui.modularui.GT_CoverUIBuildContext; import gregtech.api.gui.modularui.GUITextureSet; import gregtech.api.interfaces.ITexture; import gregtech.api.interfaces.tileentity.ICoverable; @@ -34,6 +33,7 @@ import gregtech.api.util.GT_CoverBehavior; import gregtech.api.util.GT_CoverBehaviorBase; import gregtech.api.util.ISerializableObject; import gregtech.common.GT_Client; +import gregtech.common.covers.CoverInfo; import gregtech.common.covers.GT_Cover_Fluidfilter; import java.util.ArrayList; import java.util.Arrays; @@ -49,6 +49,7 @@ import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; import net.minecraft.tileentity.TileEntity; import net.minecraft.util.EnumChatFormatting; import net.minecraft.util.StatCollector; @@ -61,6 +62,16 @@ public abstract class CoverableTileEntity extends BaseTileEntity implements ICov .mapToInt(Enum::ordinal) .mapToObj(i -> "mCoverData" + i) .toArray(String[]::new); + + // New Cover Information + protected final CoverInfo[] coverInfos = new CoverInfo[] {null, null, null, null, null, null}; + + protected byte[] mSidedRedstone = new byte[] {15, 15, 15, 15, 15, 15}; + protected boolean mRedstone = false; + protected byte mStrongRedstone = 0; + + /* Deprecated Cover Variables */ + @Deprecated protected final GT_CoverBehaviorBase[] mCoverBehaviors = new GT_CoverBehaviorBase[] { GregTech_API.sNoBehavior, GregTech_API.sNoBehavior, @@ -69,26 +80,39 @@ public abstract class CoverableTileEntity extends BaseTileEntity implements ICov GregTech_API.sNoBehavior, GregTech_API.sNoBehavior }; - protected byte[] mSidedRedstone = new byte[] {15, 15, 15, 15, 15, 15}; - protected boolean mRedstone = false; - protected byte mStrongRedstone = 0; + @Deprecated protected int[] mCoverSides = new int[] {0, 0, 0, 0, 0, 0}; + + @Deprecated protected ISerializableObject[] mCoverData = new ISerializableObject[6]; + + @Deprecated protected final boolean[] mCoverNeedUpdate = new boolean[] {false, false, false, false, false, false}; + /* End Deprecated Cover Variables */ + protected short mID = 0; public long mTickTimer = 0; protected void writeCoverNBT(NBTTagCompound aNBT, boolean isDrop) { - boolean hasCover = false; - for (int i = 0; i < mCoverData.length; i++) { - if (mCoverSides[i] != 0 && mCoverData[i] != null) { - aNBT.setTag(COVER_DATA_NBT_KEYS[i], mCoverData[i].saveDataToNBT()); - hasCover = true; - } + final NBTTagList tList = new NBTTagList(); + final int[] coverSides = new int[] {0, 0, 0, 0, 0, 0}; + + for (byte i = 0; i < coverInfos.length; i++) { + final CoverInfo coverInfo = getCoverInfoAtSide(i); + if (!coverInfo.isValid()) continue; + + // Backwards compat, in case of a revert... for now + tList.appendTag(coverInfo.writeToNBT(new NBTTagCompound())); + aNBT.setTag(COVER_DATA_NBT_KEYS[i], coverInfo.getCoverData().saveDataToNBT()); + } + if (tList.tagCount() > 0) { + aNBT.setTag(GT_Values.NBT.COVERS, tList); + // Backwards compat, in case of a revert... for now + aNBT.setIntArray("mCoverSides", coverSides); } + if (mStrongRedstone > 0) aNBT.setByte("mStrongRedstone", mStrongRedstone); - if (hasCover) aNBT.setIntArray("mCoverSides", mCoverSides); if (!isDrop) { aNBT.setByteArray("mRedstoneSided", mSidedRedstone); @@ -97,40 +121,63 @@ public abstract class CoverableTileEntity extends BaseTileEntity implements ICov } protected void readCoverNBT(NBTTagCompound aNBT) { - mCoverSides = aNBT.hasKey("mCoverSides") ? aNBT.getIntArray("mCoverSides") : new int[] {0, 0, 0, 0, 0, 0}; mRedstone = aNBT.getBoolean("mRedstone"); mSidedRedstone = aNBT.hasKey("mRedstoneSided") ? aNBT.getByteArray("mRedstoneSided") : new byte[] {15, 15, 15, 15, 15, 15}; mStrongRedstone = aNBT.getByte("mStrongRedstone"); - for (byte i = 0; i < 6; i++) mCoverBehaviors[i] = GregTech_API.getCoverBehaviorNew(mCoverSides[i]); + if (aNBT.hasKey(GT_Values.NBT.COVERS)) { + readCoverInfoNBT(aNBT); + } else if (aNBT.hasKey("mCoverSides")) { + readLegacyCoverInfoNBT(aNBT); + } + } - // check old form of data - mCoverData = new ISerializableObject[6]; - if (aNBT.hasKey("mCoverData", 11) && aNBT.getIntArray("mCoverData").length == 6) { - final int[] tOldData = aNBT.getIntArray("mCoverData"); - for (int i = 0; i < tOldData.length; i++) { - if (mCoverBehaviors[i] instanceof GT_Cover_Fluidfilter) { + public void readCoverInfoNBT(NBTTagCompound aNBT) { + final NBTTagList tList = aNBT.getTagList(GT_Values.NBT.COVERS, 10); + for (byte i = 0; i < tList.tagCount(); i++) { + final NBTTagCompound tNBT = tList.getCompoundTagAt(i); + final CoverInfo coverInfo = new CoverInfo(this, tNBT); + this.setCoverInfoAtSide(coverInfo.getSide(), coverInfo); + if (coverInfo.isDataNeededOnClient()) issueCoverUpdate(i); + } + } + + public void readLegacyCoverInfoNBT(NBTTagCompound aNBT) { + final int[] coverIDs = + aNBT.hasKey("mCoverSides") ? aNBT.getIntArray("mCoverSides") : new int[] {0, 0, 0, 0, 0, 0}; + final boolean hasOldCoverData = (aNBT.hasKey("mCoverData", 11) && aNBT.getIntArray("mCoverData").length == 6); + final int[] tOldData = hasOldCoverData ? aNBT.getIntArray("mCoverData") : new int[] {}; + + for (byte i : ALL_VALID_SIDES) { + if (coverIDs[i] == 0) continue; + + final CoverInfo coverInfo = new CoverInfo(i, coverIDs[i], this, null); + final GT_CoverBehaviorBase coverBehavior = coverInfo.getCoverBehavior(); + if (coverBehavior == GregTech_API.sNoBehavior) continue; + + ISerializableObject coverData = null; + if (hasOldCoverData) { + if (coverBehavior instanceof GT_Cover_Fluidfilter) { final String filterKey = String.format("fluidFilter%d", i); if (aNBT.hasKey(filterKey)) { - mCoverData[i] = mCoverBehaviors[i].createDataObject( - (tOldData[i] & 7) | (FluidRegistry.getFluidID(aNBT.getString(filterKey)) << 3)); + coverData = coverInfo + .getCoverBehavior() + .createDataObject( + (tOldData[i] & 7) | (FluidRegistry.getFluidID(aNBT.getString(filterKey)) << 3)); } - } else if (mCoverBehaviors[i] != null && mCoverBehaviors[i] != GregTech_API.sNoBehavior) { - mCoverData[i] = mCoverBehaviors[i].createDataObject(tOldData[i]); + } else { + coverData = coverBehavior.createDataObject(tOldData[i]); } - } - } else { - // no old data - for (byte i = 0; i < 6; i++) { - if (mCoverBehaviors[i] == null) continue; + } else { if (aNBT.hasKey(COVER_DATA_NBT_KEYS[i])) - mCoverData[i] = mCoverBehaviors[i].createDataObject(aNBT.getTag(COVER_DATA_NBT_KEYS[i])); - else mCoverData[i] = mCoverBehaviors[i].createDataObject(); - if (mCoverBehaviors[i].isDataNeededOnClient(i, mCoverSides[i], mCoverData[i], this)) - issueCoverUpdate(i); + coverData = coverBehavior.createDataObject(aNBT.getTag(COVER_DATA_NBT_KEYS[i])); } + + if (coverData != null) coverInfo.setCoverData(coverData); + setCoverInfoAtSide(i, coverInfo); + if (coverInfo.isDataNeededOnClient()) issueCoverUpdate(i); } } @@ -138,33 +185,45 @@ public abstract class CoverableTileEntity extends BaseTileEntity implements ICov protected boolean doCoverThings() { for (byte i : ALL_VALID_SIDES) { - if (getCoverIDAtSide(i) != 0) { - final GT_CoverBehaviorBase tCover = getCoverBehaviorAtSideNew(i); - final int tCoverTickRate = tCover.getTickRate(i, getCoverIDAtSide(i), mCoverData[i], this); - if (tCoverTickRate > 0 && mTickTimer % tCoverTickRate == 0) { - final byte tRedstone = - tCover.isRedstoneSensitive(i, getCoverIDAtSide(i), mCoverData[i], this, mTickTimer) - ? getInputRedstoneSignal(i) - : 0; - mCoverData[i] = - tCover.doCoverThings(i, tRedstone, getCoverIDAtSide(i), mCoverData[i], this, mTickTimer); - if (!isStillValid()) return false; - } - } + if (!tickCoverAtSide(i)) return false; } return true; } + public boolean tickCoverAtSide(byte aSide) { + return tickCoverAtSide(aSide, mTickTimer); + } + + /** + * Returns false if the tile is no longer valid after ticking the cover + */ + public boolean tickCoverAtSide(byte aSide, long aTickTimer) { + final CoverInfo coverInfo = getCoverInfoAtSide(aSide); + if (!coverInfo.isValid()) return true; + final int tCoverTickRate = coverInfo.getTickRate(); + if (tCoverTickRate > 0 && aTickTimer % tCoverTickRate == 0) { + final byte tRedstone = coverInfo.isRedstoneSensitive(aTickTimer) ? getInputRedstoneSignal(aSide) : 0; + coverInfo.setCoverData(coverInfo.doCoverThings(aTickTimer, tRedstone)); + return isStillValid(); + } + + return true; + } + public abstract boolean allowCoverOnSide(byte aSide, GT_ItemStack aCoverID); protected void checkDropCover() { - for (byte i : ALL_VALID_SIDES) - if (getCoverIDAtSide(i) != 0) - if (!allowCoverOnSide(i, new GT_ItemStack(getCoverIDAtSide(i)))) dropCover(i, i, true); + for (byte i : ALL_VALID_SIDES) { + final int coverId = getCoverIDAtSide(i); + if (coverId != 0) if (!allowCoverOnSide(i, new GT_ItemStack(coverId))) dropCover(i, i, true); + } } protected void updateCoverBehavior() { - for (byte i : ALL_VALID_SIDES) mCoverBehaviors[i] = GregTech_API.getCoverBehaviorNew(mCoverSides[i]); + for (byte i : ALL_VALID_SIDES) { + final CoverInfo coverInfo = getCoverInfoAtSide(i); + if (coverInfo.isValid()) coverInfo.updateCoverBehavior(); + } } @Override @@ -172,32 +231,20 @@ public abstract class CoverableTileEntity extends BaseTileEntity implements ICov // If we've got a null worldObj we're getting called as a part of readingNBT from a non tickable MultiTileEntity // on chunk load before the world is set // so we'll want to send a cover update. - if (worldObj == null - || (isServerSide() - && getCoverBehaviorAtSideNew(aSide) - .isDataNeededOnClient( - aSide, getCoverIDAtSide(aSide), getComplexCoverDataAtSide(aSide), this))) - mCoverNeedUpdate[aSide] = true; + final CoverInfo coverInfo = getCoverInfoAtSide(aSide); + if (worldObj == null || (isServerSide() && coverInfo.isDataNeededOnClient())) coverInfo.setNeedsUpdate(true); } public final ITexture getCoverTexture(byte aSide) { - if (getCoverIDAtSide(aSide) == 0) return null; + final CoverInfo coverInfo = getCoverInfoAtSide(aSide); + if (!coverInfo.isValid()) return null; if (GT_Mod.instance.isClientSide() && (GT_Client.hideValue & 0x1) != 0) { return Textures.BlockIcons.HIDDEN_TEXTURE[0]; // See through } - GT_CoverBehaviorBase coverBehavior = getCoverBehaviorAtSideNew(aSide); - final ITexture coverTexture; - if (coverBehavior != null) { - if (!(this instanceof BaseMetaPipeEntity)) { - coverTexture = coverBehavior.getSpecialCoverFGTexture( - aSide, getCoverIDAtSide(aSide), getComplexCoverDataAtSide(aSide), this); - } else { - coverTexture = coverBehavior.getSpecialCoverTexture( - aSide, getCoverIDAtSide(aSide), getComplexCoverDataAtSide(aSide), this); - } - } else { - coverTexture = null; - } + final ITexture coverTexture = (!(this instanceof BaseMetaPipeEntity)) + ? coverInfo.getSpecialCoverFGTexture() + : coverInfo.getSpecialCoverTexture(); + return coverTexture != null ? coverTexture : GregTech_API.sCovers.get(new GT_ItemStack(getCoverIDAtSide(aSide))); @@ -206,16 +253,14 @@ public abstract class CoverableTileEntity extends BaseTileEntity implements ICov protected void requestCoverDataIfNeeded() { if (worldObj == null || !worldObj.isRemote) return; for (byte i : ALL_VALID_SIDES) { - if (getCoverBehaviorAtSideNew(i) - .isDataNeededOnClient(i, getCoverIDAtSide(i), getComplexCoverDataAtSide(i), this)) - NW.sendToServer(new GT_Packet_RequestCoverData(i, getCoverIDAtSide(i), this)); + final CoverInfo coverInfo = getCoverInfoAtSide(i); + if (coverInfo.isDataNeededOnClient()) NW.sendToServer(new GT_Packet_RequestCoverData(coverInfo, this)); } } @Override public void setCoverIdAndDataAtSide(byte aSide, int aId, ISerializableObject aData) { - if (setCoverIDAtSideNoUpdate(aSide, aId)) { - setCoverDataAtSide(aSide, aData); + if (setCoverIDAtSideNoUpdate(aSide, aId, aData)) { issueCoverUpdate(aSide); issueBlockUpdate(); } @@ -223,20 +268,19 @@ public abstract class CoverableTileEntity extends BaseTileEntity implements ICov @Override public void setCoverIDAtSide(byte aSide, int aID) { - if (setCoverIDAtSideNoUpdate(aSide, aID)) { - issueCoverUpdate(aSide); - issueBlockUpdate(); - } + setCoverIdAndDataAtSide(aSide, aID, null); } @Override public boolean setCoverIDAtSideNoUpdate(byte aSide, int aID) { - if (aSide >= 0 && aSide < 6 && mCoverSides[aSide] != aID) { - if (aID == 0 && isClientSide()) - mCoverBehaviors[aSide].onDropped(aSide, mCoverSides[aSide], mCoverData[aSide], this); - mCoverSides[aSide] = aID; - mCoverBehaviors[aSide] = GregTech_API.getCoverBehaviorNew(aID); - mCoverData[aSide] = mCoverBehaviors[aSide].createDataObject(); + return setCoverIDAtSideNoUpdate(aSide, aID, null); + } + + public boolean setCoverIDAtSideNoUpdate(byte aSide, int aID, ISerializableObject aData) { + final CoverInfo oldCoverInfo = getCoverInfoAtSide(aSide); + if (aSide >= 0 && aSide < 6 && oldCoverInfo.getCoverID() != aID) { + if (aID == 0 && isClientSide()) oldCoverInfo.onDropped(); + setCoverInfoAtSide(aSide, new CoverInfo(aSide, aID, this, aData)); return true; } return false; @@ -245,23 +289,22 @@ public abstract class CoverableTileEntity extends BaseTileEntity implements ICov @Override @Deprecated public void setCoverDataAtSide(byte aSide, int aData) { - if (aSide >= 0 && aSide < 6 && mCoverData[aSide] instanceof ISerializableObject.LegacyCoverData) - mCoverData[aSide] = new ISerializableObject.LegacyCoverData(aData); + final CoverInfo coverInfo = getCoverInfoAtSide(aSide); + if (coverInfo.isValid() && coverInfo.getCoverData() instanceof ISerializableObject.LegacyCoverData) + coverInfo.setCoverData(new ISerializableObject.LegacyCoverData(aData)); } @Override public void setCoverDataAtSide(byte aSide, ISerializableObject aData) { - if (aSide >= 0 - && aSide < 6 - && getCoverBehaviorAtSideNew(aSide) != null - && getCoverBehaviorAtSideNew(aSide).cast(aData) != null) mCoverData[aSide] = aData; + final CoverInfo coverInfo = getCoverInfoAtSide(aSide); + if (coverInfo.isValid() && coverInfo.getCoverBehavior().cast(aData) != null) coverInfo.setCoverData(aData); } @Override @Deprecated public GT_CoverBehavior getCoverBehaviorAtSide(byte aSide) { - if (aSide >= 0 && aSide < mCoverBehaviors.length && mCoverBehaviors[aSide] instanceof GT_CoverBehavior) - return (GT_CoverBehavior) mCoverBehaviors[aSide]; + final GT_CoverBehaviorBase behavior = getCoverInfoAtSide(aSide).getCoverBehavior(); + if (behavior instanceof GT_CoverBehavior) return (GT_CoverBehavior) behavior; return GregTech_API.sNoBehavior; } @@ -272,14 +315,12 @@ public abstract class CoverableTileEntity extends BaseTileEntity implements ICov @Override public int getCoverIDAtSide(byte aSide) { - if (aSide >= 0 && aSide < 6) return mCoverSides[aSide]; - return 0; + return getCoverInfoAtSide(aSide).getCoverID(); } @Override public ItemStack getCoverItemAtSide(byte aSide) { - return getCoverBehaviorAtSideNew(aSide) - .getDisplayStack(getCoverIDAtSide(aSide), getComplexCoverDataAtSide(aSide)); + return getCoverInfoAtSide(aSide).getDisplayStack(); } @Override @@ -295,57 +336,71 @@ public abstract class CoverableTileEntity extends BaseTileEntity implements ICov @Override @Deprecated public int getCoverDataAtSide(byte aSide) { - if (aSide >= 0 && aSide < 6 && mCoverData[aSide] instanceof ISerializableObject.LegacyCoverData) - return ((ISerializableObject.LegacyCoverData) mCoverData[aSide]).get(); + final ISerializableObject coverData = getCoverInfoAtSide(aSide).getCoverData(); + if (coverData instanceof ISerializableObject.LegacyCoverData) { + return ((ISerializableObject.LegacyCoverData) coverData).get(); + } return 0; } @Override public ISerializableObject getComplexCoverDataAtSide(byte aSide) { - if (aSide >= 0 && aSide < 6 && getCoverBehaviorAtSideNew(aSide) != null) return mCoverData[aSide]; - return GregTech_API.sNoBehavior.createDataObject(); + return getCoverInfoAtSide(aSide).getCoverData(); } @Override public GT_CoverBehaviorBase getCoverBehaviorAtSideNew(byte aSide) { - if (aSide >= 0 && aSide < 6) return mCoverBehaviors[aSide]; - return GregTech_API.sNoBehavior; + return getCoverInfoAtSide(aSide).getCoverBehavior(); + } + + public void setCoverInfoAtSide(byte aSide, CoverInfo coverInfo) { + if (aSide >= 0 && aSide < 6) coverInfos[aSide] = coverInfo; } @Override - public boolean dropCover(byte aSide, byte aDroppedSide, boolean aForced) { - if (getCoverBehaviorAtSideNew(aSide) - .onCoverRemoval(aSide, getCoverIDAtSide(aSide), mCoverData[aSide], this, aForced) - || aForced) { - final ItemStack tStack = getCoverBehaviorAtSideNew(aSide) - .getDrop(aSide, getCoverIDAtSide(aSide), getComplexCoverDataAtSide(aSide), this); - if (tStack != null) { - getCoverBehaviorAtSideNew(aSide) - .onDropped(aSide, getCoverIDAtSide(aSide), getComplexCoverDataAtSide(aSide), this); - final EntityItem tEntity = new EntityItem( - worldObj, - getOffsetX(aDroppedSide, 1) + 0.5, - getOffsetY(aDroppedSide, 1) + 0.5, - getOffsetZ(aDroppedSide, 1) + 0.5, - tStack); - tEntity.motionX = 0; - tEntity.motionY = 0; - tEntity.motionZ = 0; - worldObj.spawnEntityInWorld(tEntity); - } + public CoverInfo getCoverInfoAtSide(byte aSide) { + if (aSide >= 0 && aSide < 6) { + if (coverInfos[aSide] == null) coverInfos[aSide] = new CoverInfo(aSide, this); + return coverInfos[aSide]; + } + return CoverInfo.EMPTY_INFO; + } + + public void clearCoverInfoAtSide(byte aSide) { + if (aSide >= 0 && aSide < 6) { setCoverIDAtSide(aSide, 0); - updateOutputRedstoneSignal(aSide); + } + } - return true; + @Override + public boolean dropCover(byte aSide, byte aDroppedSide, boolean aForced) { + final CoverInfo coverInfo = getCoverInfoAtSide(aSide); + if (!coverInfo.isValid()) return false; + if (!coverInfo.onCoverRemoval(aForced) && !aForced) return false; + final ItemStack tStack = coverInfo.getDrop(); + if (tStack != null) { + coverInfo.onDropped(); + final EntityItem tEntity = new EntityItem( + worldObj, + getOffsetX(aDroppedSide, 1) + 0.5, + getOffsetY(aDroppedSide, 1) + 0.5, + getOffsetZ(aDroppedSide, 1) + 0.5, + tStack); + tEntity.motionX = 0; + tEntity.motionY = 0; + tEntity.motionZ = 0; + worldObj.spawnEntityInWorld(tEntity); } - return false; + clearCoverInfoAtSide(aSide); + updateOutputRedstoneSignal(aSide); + + return true; } protected void onBaseTEDestroyed() { - for (byte side = 0; side < 6; ++side) { - GT_CoverBehaviorBase behavior = getCoverBehaviorAtSideNew(side); - if (behavior != GregTech_API.sNoBehavior) - behavior.onBaseTEDestroyed(side, getCoverIDAtSide(side), mCoverData[side], this); + for (byte side : ALL_VALID_SIDES) { + final CoverInfo coverInfo = getCoverInfoAtSide(side); + if (coverInfo.isValid()) coverInfo.onBaseTEDestroyed(); } } @@ -435,49 +490,38 @@ public abstract class CoverableTileEntity extends BaseTileEntity implements ICov @Override public void receiveCoverData(byte aCoverSide, int aCoverID, int aCoverData) { - if ((aCoverSide >= 0 && aCoverSide < 6)) { - GT_CoverBehaviorBase behaviorBase = getCoverBehaviorAtSideNew(aCoverSide); - if (behaviorBase == GregTech_API.sNoBehavior) return; + if (aCoverSide < 0 || aCoverSide >= 6) return; + final CoverInfo oldCoverInfo = getCoverInfoAtSide(aCoverSide); + if (!oldCoverInfo.isValid()) return; - setCoverIDAtSideNoUpdate(aCoverSide, aCoverID); - setCoverDataAtSide(aCoverSide, aCoverData); - } + setCoverIDAtSideNoUpdate(aCoverSide, aCoverID); + setCoverDataAtSide(aCoverSide, aCoverData); } @Override public void receiveCoverData( byte aCoverSide, int aCoverID, ISerializableObject aCoverData, EntityPlayerMP aPlayer) { - if ((aCoverSide >= 0 && aCoverSide < 6)) { - GT_CoverBehaviorBase behaviorBase = getCoverBehaviorAtSideNew(aCoverSide); - if (behaviorBase == GregTech_API.sNoBehavior) return; - - behaviorBase.preDataChanged( - aCoverSide, - getCoverIDAtSide(aCoverSide), - aCoverID, - getComplexCoverDataAtSide(aCoverSide), - aCoverData, - this); - - setCoverIDAtSideNoUpdate(aCoverSide, aCoverID); - setCoverDataAtSide(aCoverSide, aCoverData); - if (isClientSide()) { - behaviorBase.onDataChanged(aCoverSide, aCoverID, aCoverData, this); - } + if (aCoverSide < 0 || aCoverSide >= 6) return; + + final CoverInfo oldCoverInfo = getCoverInfoAtSide(aCoverSide); + + if (!oldCoverInfo.isValid()) return; + oldCoverInfo.preDataChanged(aCoverID, aCoverData); + setCoverIDAtSideNoUpdate(aCoverSide, aCoverID, aCoverData); + + if (isClientSide()) { + getCoverInfoAtSide(aCoverSide).onDataChanged(); } } protected void sendCoverDataIfNeeded() { if (worldObj == null || worldObj.isRemote) return; - final int mCoverNeedUpdateLength = mCoverNeedUpdate.length; - for (byte i = 0; i < mCoverNeedUpdateLength; i++) { - if (mCoverNeedUpdate[i]) { + for (byte i : ALL_VALID_SIDES) { + final CoverInfo coverInfo = getCoverInfoAtSide(i); + if (coverInfo.needsUpdate()) { NW.sendPacketToAllPlayersInRange( - worldObj, - new GT_Packet_SendCoverData(i, getCoverIDAtSide(i), getComplexCoverDataAtSide(i), this), - xCoord, - zCoord); - mCoverNeedUpdate[i] = false; + worldObj, new GT_Packet_SendCoverData(coverInfo, this), xCoord, zCoord); + coverInfo.setNeedsUpdate(false); } } } @@ -488,31 +532,25 @@ public abstract class CoverableTileEntity extends BaseTileEntity implements ICov final NBTTagCompound tag = accessor.getNBTData(); final byte currentFacing = (byte) accessor.getSide().ordinal(); - final int[] coverSides = tag.getIntArray("mCoverSides"); - // Not all data is available on the client, so get it from the NBT packet - if (coverSides != null && coverSides.length == 6) { - for (ForgeDirection direction : ForgeDirection.VALID_DIRECTIONS) { - final byte side = (byte) direction.ordinal(); - final int coverId = coverSides[side]; - final GT_CoverBehaviorBase behavior = GregTech_API.getCoverBehaviorNew(coverId); - - if (coverId != 0 && behavior != null && behavior != GregTech_API.sNoBehavior) { - if (tag.hasKey(CoverableTileEntity.COVER_DATA_NBT_KEYS[side])) { - final ISerializableObject dataObject = - behavior.createDataObject(tag.getTag(CoverableTileEntity.COVER_DATA_NBT_KEYS[side])); - final ItemStack coverStack = behavior.getDisplayStack(coverId, dataObject); - if (coverStack != null) - currenttip.add(StatCollector.translateToLocalFormatted( - "GT5U.waila.cover", - currentFacing == side -