aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/gregtech/common/covers
diff options
context:
space:
mode:
authorJason Mitchell <mitchej@gmail.com>2023-01-20 00:30:50 -0800
committerGitHub <noreply@github.com>2023-01-20 09:30:50 +0100
commit7ed516e30ba224b4b8e3fad9c836c22ca00bfcdb (patch)
treebea33f6637b929427e9abbe733e19606f8bf9032 /src/main/java/gregtech/common/covers
parent750a4070af4756e3708e2b2555b9874864bf3cfb (diff)
downloadGT5-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')
-rw-r--r--src/main/java/gregtech/common/covers/CoverInfo.java235
-rw-r--r--src/main/java/gregtech/common/covers/GT_Cover_ControlsWork.java6
-rw-r--r--src/main/java/gregtech/common/covers/GT_Cover_Conveyor.java10
-rw-r--r--src/main/java/gregtech/common/covers/GT_Cover_FacadeBase.java24
-rw-r--r--src/main/java/gregtech/common/covers/GT_Cover_RedstoneTransmitterExternal.java6
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;
}
}