diff options
| author | Jason Mitchell <mitchej@gmail.com> | 2023-01-20 00:30:50 -0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-01-20 09:30:50 +0100 |
| commit | 7ed516e30ba224b4b8e3fad9c836c22ca00bfcdb (patch) | |
| tree | bea33f6637b929427e9abbe733e19606f8bf9032 /src/main/java/gregtech/common/covers | |
| parent | 750a4070af4756e3708e2b2555b9874864bf3cfb (diff) | |
| download | GT5-Unofficial-7ed516e30ba224b4b8e3fad9c836c22ca00bfcdb.tar.gz GT5-Unofficial-7ed516e30ba224b4b8e3fad9c836c22ca00bfcdb.tar.bz2 GT5-Unofficial-7ed516e30ba224b4b8e3fad9c836c22ca00bfcdb.zip | |
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 <miozune@gmail.com>
* 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 <miozune@gmail.com>
* 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 <miozune@gmail.com>
* 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 <miozune@gmail.com>
Diffstat (limited to 'src/main/java/gregtech/common/covers')
5 files changed, 260 insertions, 21 deletions
diff --git a/src/main/java/gregtech/common/covers/CoverInfo.java b/src/main/java/gregtech/common/covers/CoverInfo.java new file mode 100644 index 0000000000..58b1afe5ba --- /dev/null +++ b/src/main/java/gregtech/common/covers/CoverInfo.java @@ -0,0 +1,235 @@ +package gregtech.common.covers; + +import static gregtech.api.enums.GT_Values.SIDE_UNKNOWN; + +import com.gtnewhorizons.modularui.api.screen.ModularWindow; +import gregtech.api.GregTech_API; +import gregtech.api.gui.modularui.GT_CoverUIBuildContext; +import gregtech.api.interfaces.ITexture; +import gregtech.api.interfaces.tileentity.ICoverable; +import gregtech.api.util.GT_CoverBehaviorBase; +import gregtech.api.util.ISerializableObject; +import java.lang.ref.WeakReference; +import net.minecraft.block.Block; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.item.ItemStack; +import net.minecraft.nbt.NBTTagCompound; +import net.minecraftforge.fluids.Fluid; + +public final class CoverInfo { + private static final String NBT_SIDE = "s", NBT_ID = "id", NBT_DATA = "d"; + + public static final CoverInfo EMPTY_INFO = new CoverInfo(SIDE_UNKNOWN, null); + private byte coverSide; + private int coverID = 0; + private GT_CoverBehaviorBase<?> coverBehavior = null; + private ISerializableObject coverData = null; + private final WeakReference<ICoverable> coveredTile; + private boolean needsUpdate = false; + + public CoverInfo(byte aSide, ICoverable aTile) { + coverSide = aSide; + coveredTile = new WeakReference<>(aTile); + } + + public CoverInfo(byte aSide, int aID, ICoverable aTile, ISerializableObject aCoverData) { + coverSide = aSide; + coverID = aID; + coverBehavior = GregTech_API.getCoverBehaviorNew(aID); + coverData = aCoverData == null ? coverBehavior.createDataObject() : aCoverData; + coveredTile = new WeakReference<>(aTile); + } + + public CoverInfo(ICoverable aTile, NBTTagCompound aNBT) { + coverSide = aNBT.getByte(NBT_SIDE); + coverID = aNBT.getInteger(NBT_ID); + coverBehavior = GregTech_API.getCoverBehaviorNew(coverID); + coverData = aNBT.hasKey(NBT_DATA) + ? coverBehavior.createDataObject(aNBT.getTag(NBT_DATA)) + : coverBehavior.createDataObject(); + coveredTile = new WeakReference<>(aTile); + } + + public boolean isValid() { + return coverID != 0 && coverSide != SIDE_UNKNOWN; + } + + public NBTTagCompound writeToNBT(NBTTagCompound aNBT) { + aNBT.setByte(NBT_SIDE, coverSide); + aNBT.setInteger(NBT_ID, coverID); + if (coverData != null) aNBT.setTag(NBT_DATA, coverData.saveDataToNBT()); + + return aNBT; + } + + public int getCoverID() { + return coverID; + } + + public boolean needsUpdate() { + return needsUpdate; + } + + public void setNeedsUpdate(boolean aUpdate) { + needsUpdate = aUpdate; + } + + public GT_CoverBehaviorBase<?> getCoverBehavior() { + if (coverBehavior != null) return coverBehavior; + return GregTech_API.sNoBehavior; + } + + public ISerializableObject getCoverData() { + if (coverData != null) return coverData; + return GregTech_API.sNoBehavior.createDataObject(); + } + + public boolean onCoverRemoval(boolean aForced) { + return getCoverBehavior().onCoverRemoval(coverSide, coverID, coverData, coveredTile.get(), aForced); + } + + public ItemStack getDrop() { + return getCoverBehavior().getDrop(coverSide, coverID, coverData, coveredTile.get()); + } + + public ItemStack getDisplayStack() { + return getCoverBehavior().getDisplayStack(coverID, coverData); + } + + public boolean isDataNeededOnClient() { + return getCoverBehavior().isDataNeededOnClient(coverSide, coverID, coverData, coveredTile.get()); + } + + public void onDropped() { + getCoverBehavior().onDropped(coverSide, coverID, coverData, coveredTile.get()); + } + + public void setCoverData(ISerializableObject aData) { + coverData = aData; + } + + public ITexture getSpecialCoverFGTexture() { + return getCoverBehavior().getSpecialCoverFGTexture(coverSide, coverID, coverData, coveredTile.get()); + } + + public ITexture getSpecialCoverTexture() { + return getCoverBehavior().getSpecialCoverTexture(coverSide, coverID, coverData, coveredTile.get()); + } + + public int getTickRate() { + return getCoverBehavior().getTickRate(coverSide, coverID, coverData, coveredTile.get()); + } + + public byte getSide() { + return coverSide; + } + + public ICoverable getTile() { + return coveredTile.get(); + } + + public boolean isRedstoneSensitive(long aTickTimer) { + return getCoverBehavior().isRedstoneSensitive(coverSide, coverID, coverData, coveredTile.get(), aTickTimer); + } + + public ISerializableObject doCoverThings(long aTickTimer, byte aRedstone) { + return getCoverBehavior() + .doCoverThings(coverSide, aRedstone, coverID, coverData, coveredTile.get(), aTickTimer); + } + + public void onBaseTEDestroyed() { + getCoverBehavior().onBaseTEDestroyed(coverSide, coverID, coverData, coveredTile.get()); + } + + public void updateCoverBehavior() { + coverBehavior = GregTech_API.getCoverBehaviorNew(coverID); + } + + public void preDataChanged(int aCoverID, ISerializableObject aCoverData) { + getCoverBehavior().preDataChanged(coverSide, coverID, aCoverID, coverData, aCoverData, coveredTile.get()); + } + + public void onDataChanged() { + getCoverBehavior().onDataChanged(coverSide, coverID, coverData, coveredTile.get()); + } + + public String getBehaviorDescription() { + return getCoverBehavior().getDescription(coverSide, coverID, coverData, null); + } + + public ModularWindow createWindow(EntityPlayer player) { + final GT_CoverUIBuildContext buildContext = + new GT_CoverUIBuildContext(player, coverID, coverSide, coveredTile.get(), true); + return getCoverBehavior().createWindow(buildContext); + } + + public boolean isGUIClickable() { + return getCoverBehavior().isGUIClickable(coverSide, coverID, coverData, coveredTile.get()); + } + + public boolean hasCoverGUI() { + return getCoverBehavior().hasCoverGUI(); + } + + public boolean useModularUI() { + return getCoverBehavior().useModularUI(); + } + + public boolean letsItemsIn(int aSlot) { + return getCoverBehavior().letsItemsIn(coverSide, coverID, coverData, aSlot, coveredTile.get()); + } + + public boolean letsItemsOut(int aSlot) { + return getCoverBehavior().letsItemsOut(coverSide, coverID, coverData, aSlot, coveredTile.get()); + } + + public boolean letsFluidIn(Fluid aFluid) { + return letsFluidIn(aFluid, coveredTile.get()); + } + + public boolean letsFluidOut(Fluid aFluid) { + return letsFluidOut(aFluid, coveredTile.get()); + } + + public boolean letsFluidIn(Fluid aFluid, ICoverable tile) { + return getCoverBehavior().letsFluidIn(coverSide, coverID, coverData, aFluid, tile); + } + + public boolean letsFluidOut(Fluid aFluid, ICoverable tile) { + return getCoverBehavior().letsFluidOut(coverSide, coverID, coverData, aFluid, tile); + } + + public boolean letsEnergyIn() { + return getCoverBehavior().letsEnergyIn(coverSide, coverID, coverData, coveredTile.get()); + } + + public boolean letsEnergyOut() { + return getCoverBehavior().letsEnergyOut(coverSide, coverID, coverData, coveredTile.get()); + } + + public boolean alwaysLookConnected() { + return getCoverBehavior().alwaysLookConnected(coverSide, coverID, coverData, coveredTile.get()); + } + + public boolean onCoverRightClick(EntityPlayer aPlayer, float aX, float aY, float aZ) { + return getCoverBehavior() + .onCoverRightClick(coverSide, coverID, coverData, coveredTile.get(), aPlayer, aX, aY, aZ); + } + + public boolean onCoverShiftRightClick(EntityPlayer aPlayer) { + return getCoverBehavior().onCoverShiftRightClick(coverSide, coverID, coverData, coveredTile.get(), aPlayer); + } + + public ISerializableObject onCoverScrewdriverClick(EntityPlayer aPlayer, float aX, float aY, float aZ) { + return getCoverBehavior() + .onCoverScrewdriverClick(coverSide, coverID, coverData, coveredTile.get(), aPlayer, aX, aY, aZ); + } + + public Block getFacadeBlock() { + return getCoverBehavior().getFacadeBlock(coverSide, coverID, coverData, coveredTile.get()); + } + + public int getFacadeMeta() { + return getCoverBehavior().getFacadeMeta(coverSide, coverID, coverData, coveredTile.get()); + } +} diff --git a/src/main/java/gregtech/common/covers/GT_Cover_ControlsWork.java b/src/main/java/gregtech/common/covers/GT_Cover_ControlsWork.java index 270a221a08..f45ffbf2e8 100644 --- a/src/main/java/gregtech/common/covers/GT_Cover_ControlsWork.java +++ b/src/main/java/gregtech/common/covers/GT_Cover_ControlsWork.java @@ -1,5 +1,7 @@ package gregtech.common.covers; +import static gregtech.api.enums.GT_Values.ALL_VALID_SIDES; + import com.gtnewhorizons.modularui.api.screen.ModularWindow; import com.gtnewhorizons.modularui.common.widget.TextWidget; import gregtech.api.gui.modularui.GT_CoverUIBuildContext; @@ -168,8 +170,8 @@ public class GT_Cover_ControlsWork extends GT_CoverBehavior implements IControls @Override public boolean isCoverPlaceable(byte aSide, ItemStack aStack, ICoverable aTileEntity) { if (!super.isCoverPlaceable(aSide, aStack, aTileEntity)) return false; - for (byte i = 0; i < 6; i++) { - if (aTileEntity.getCoverBehaviorAtSideNew(i) instanceof IControlsWorkCover) { + for (byte tSide : ALL_VALID_SIDES) { + if (aTileEntity.getCoverBehaviorAtSideNew(tSide) instanceof IControlsWorkCover) { return false; } } diff --git a/src/main/java/gregtech/common/covers/GT_Cover_Conveyor.java b/src/main/java/gregtech/common/covers/GT_Cover_Conveyor.java index dc3bcc4f7b..54e9e50d8b 100644 --- a/src/main/java/gregtech/common/covers/GT_Cover_Conveyor.java +++ b/src/main/java/gregtech/common/covers/GT_Cover_Conveyor.java @@ -58,11 +58,11 @@ public class GT_Cover_Conveyor extends GT_CoverBehavior { return aCoverVariable; } } - TileEntity tTileEntity = aTileEntity.getTileEntityAtSide(aSide); - Object fromEntity = aCoverVariable % 2 == 0 ? aTileEntity : tTileEntity, - toEntity = aCoverVariable % 2 != 0 ? aTileEntity : tTileEntity; - byte fromSide = aCoverVariable % 2 != 0 ? GT_Utility.getOppositeSide(aSide) : aSide, - toSide = aCoverVariable % 2 == 0 ? GT_Utility.getOppositeSide(aSide) : aSide; + final TileEntity tTileEntity = aTileEntity.getTileEntityAtSide(aSide); + final Object fromEntity = aCoverVariable % 2 == 0 ? aTileEntity : tTileEntity; + final Object toEntity = aCoverVariable % 2 != 0 ? aTileEntity : tTileEntity; + final byte fromSide = aCoverVariable % 2 != 0 ? GT_Utility.getOppositeSide(aSide) : aSide; + final byte toSide = aCoverVariable % 2 == 0 ? GT_Utility.getOppositeSide(aSide) : aSide; moveMultipleItemStacks( fromEntity, diff --git a/src/main/java/gregtech/common/covers/GT_Cover_FacadeBase.java b/src/main/java/gregtech/common/covers/GT_Cover_FacadeBase.java index a2707043ef..7c55a9dce8 100644 --- a/src/main/java/gregtech/common/covers/GT_Cover_FacadeBase.java +++ b/src/main/java/gregtech/common/covers/GT_Cover_FacadeBase.java @@ -1,5 +1,7 @@ package gregtech.common.covers; +import static gregtech.api.enums.GT_Values.ALL_VALID_SIDES; + import com.google.common.io.ByteArrayDataInput; import com.gtnewhorizons.modularui.api.drawable.ItemDrawable; import com.gtnewhorizons.modularui.api.screen.ModularWindow; @@ -120,6 +122,7 @@ public abstract class GT_Cover_FacadeBase extends GT_CoverBehaviorBase<GT_Cover_ public void placeCover(byte aSide, ItemStack aCover, ICoverable aTileEntity) { aTileEntity.setCoverIdAndDataAtSide( aSide, GT_Utility.stackToInt(aCover), new FacadeData(GT_Utility.copyAmount(1, aCover), 0)); + if (aTileEntity.isClientSide()) GT_RenderingWorld.getInstance() .register( @@ -193,7 +196,7 @@ public abstract class GT_Cover_FacadeBase extends GT_CoverBehaviorBase<GT_Cover_ @Override protected void onDroppedImpl(byte aSide, int aCoverID, FacadeData aCoverVariable, ICoverable aTileEntity) { if (aTileEntity.isClientSide()) { - for (byte i = 0; i < 6; i++) { + for (byte i : ALL_VALID_SIDES) { if (i == aSide) continue; // since we do not allow multiple type of facade per block, this check would be enough. if (aTileEntity.getCoverBehaviorAtSideNew(i) instanceof GT_Cover_FacadeBase) return; @@ -231,23 +234,20 @@ public abstract class GT_Cover_FacadeBase extends GT_CoverBehaviorBase<GT_Cover_ // to render it correctly require changing GT_Block_Machine to render in both pass, which is not really a good // idea... if (!super.isCoverPlaceable(aSide, aStack, aTileEntity)) return false; - Block targetBlock = getTargetBlock(aStack); + final Block targetBlock = getTargetBlock(aStack); if (targetBlock == null) return false; // we allow one single type of facade on the same block for now // otherwise it's not clear which block this block should impersonate // this restriction can be lifted later by specifying a certain facade as dominate one as an extension to this // class - for (byte i = 0; i < 6; i++) { + for (byte i : ALL_VALID_SIDES) { if (i == aSide) continue; - GT_CoverBehaviorBase<?> behavior = aTileEntity.getCoverBehaviorAtSideNew(i); - if (behavior == null) continue; - Block facadeBlock = behavior.getFacadeBlock( - i, aTileEntity.getCoverIDAtSide(i), aTileEntity.getComplexCoverDataAtSide(i), aTileEntity); + final CoverInfo coverInfo = aTileEntity.getCoverInfoAtSide(i); + if (!coverInfo.isValid()) continue; + final Block facadeBlock = coverInfo.getFacadeBlock(); if (facadeBlock == null) continue; if (facadeBlock != targetBlock) return false; - if (behavior.getFacadeMeta( - i, aTileEntity.getCoverIDAtSide(i), aTileEntity.getComplexCoverDataAtSide(i), aTileEntity) - != getTargetMeta(aStack)) return false; + if (coverInfo.getFacadeMeta() != getTargetMeta(aStack)) return false; } return true; } @@ -272,7 +272,7 @@ public abstract class GT_Cover_FacadeBase extends GT_CoverBehaviorBase<GT_Cover_ @Nonnull @Override public NBTBase saveDataToNBT() { - NBTTagCompound tag = new NBTTagCompound(); + final NBTTagCompound tag = new NBTTagCompound(); if (mStack != null) tag.setTag("mStack", mStack.writeToNBT(new NBTTagCompound())); tag.setByte("mFlags", (byte) mFlags); return tag; @@ -286,7 +286,7 @@ public abstract class GT_Cover_FacadeBase extends GT_CoverBehaviorBase<GT_Cover_ @Override public void loadDataFromNBT(NBTBase aNBT) { - NBTTagCompound tag = (NBTTagCompound) aNBT; + final NBTTagCompound tag = (NBTTagCompound) aNBT; mStack = ItemStack.loadItemStackFromNBT(tag.getCompoundTag("mStack")); mFlags = tag.getByte("mFlags"); } diff --git a/src/main/java/gregtech/common/covers/GT_Cover_RedstoneTransmitterExternal.java b/src/main/java/gregtech/common/covers/GT_Cover_RedstoneTransmitterExternal.java index 92445fa038..984e817665 100644 --- a/src/main/java/gregtech/common/covers/GT_Cover_RedstoneTransmitterExternal.java +++ b/src/main/java/gregtech/common/covers/GT_Cover_RedstoneTransmitterExternal.java @@ -1,5 +1,7 @@ package gregtech.common.covers; +import static gregtech.api.enums.GT_Values.ALL_VALID_SIDES; + import gregtech.api.GregTech_API; import gregtech.api.interfaces.ITexture; import gregtech.api.interfaces.covers.IControlsWorkCover; @@ -53,8 +55,8 @@ public class GT_Cover_RedstoneTransmitterExternal extends GT_Cover_RedstoneWirel @Override public boolean isCoverPlaceable(byte aSide, ItemStack aStack, ICoverable aTileEntity) { if (!super.isCoverPlaceable(aSide, aStack, aTileEntity)) return false; - for (byte i = 0; i < 6; i++) { - if (aTileEntity.getCoverBehaviorAtSideNew(i) instanceof IControlsWorkCover) { + for (byte tSide : ALL_VALID_SIDES) { + if (aTileEntity.getCoverBehaviorAtSideNew(tSide) instanceof IControlsWorkCover) { return false; } } |
