From 0bbd5f72b17f212b4dcdcc5268b8c2dd1ed68e5c Mon Sep 17 00:00:00 2001 From: tth05 <36999320+tth05@users.noreply.github.com> Date: Fri, 12 Jan 2024 21:14:43 +0100 Subject: Add valid covers bit mask to CoverableTileEntity (#2446) * Add valid covers bit mask to CoverableTileEntity Optimization to do as little work as possible in doCoverThings() * Ensure `coverBehavior` is never null and remove null check from `getCoverBehavior` --- .../api/metatileentity/CoverableTileEntity.java | 28 ++++++++++++++++------ .../java/gregtech/common/covers/CoverInfo.java | 8 +++---- 2 files changed, 25 insertions(+), 11 deletions(-) (limited to 'src') diff --git a/src/main/java/gregtech/api/metatileentity/CoverableTileEntity.java b/src/main/java/gregtech/api/metatileentity/CoverableTileEntity.java index dd1eb24960..6adf7d2f1d 100644 --- a/src/main/java/gregtech/api/metatileentity/CoverableTileEntity.java +++ b/src/main/java/gregtech/api/metatileentity/CoverableTileEntity.java @@ -80,6 +80,7 @@ public abstract class CoverableTileEntity extends BaseTileEntity implements ICov // New Cover Information protected final CoverInfo[] coverInfos = new CoverInfo[] { null, null, null, null, null, null }; + private byte validCoversMask; protected byte[] mSidedRedstone = new byte[] { 15, 15, 15, 15, 15, 15 }; protected boolean mRedstone = false; @@ -182,9 +183,15 @@ public abstract class CoverableTileEntity extends BaseTileEntity implements ICov public abstract boolean isStillValid(); protected boolean doCoverThings() { - for (ForgeDirection side : ForgeDirection.VALID_DIRECTIONS) { - if (!tickCoverAtSide(side)) return false; + byte validCoversMask = this.validCoversMask; + if (validCoversMask == 0) return true; + + ForgeDirection[] validDirections = ForgeDirection.VALID_DIRECTIONS; + for (int i = Integer.numberOfTrailingZeros(validCoversMask); i < 6; i++) { + if (((validCoversMask >>> i) & 1) == 0) continue; + if (!tickCoverAtSide(validDirections[i])) return false; } + return true; } @@ -349,16 +356,23 @@ public abstract class CoverableTileEntity extends BaseTileEntity implements ICov return getCoverInfoAtSide(side).getCoverBehavior(); } - public void setCoverInfoAtSide(ForgeDirection side, CoverInfo coverInfo) { - if (side != ForgeDirection.UNKNOWN) coverInfos[side.ordinal()] = coverInfo; + public final void setCoverInfoAtSide(ForgeDirection side, CoverInfo coverInfo) { + if (side != ForgeDirection.UNKNOWN) { + coverInfos[side.ordinal()] = coverInfo; + + byte sideMask = (byte) (1 << side.ordinal()); + validCoversMask &= (byte) ~sideMask; + if (coverInfo.isValid()) validCoversMask |= sideMask; + } } @Override - public CoverInfo getCoverInfoAtSide(ForgeDirection side) { + public final CoverInfo getCoverInfoAtSide(ForgeDirection side) { final int ordinalSide = side.ordinal(); if (side != ForgeDirection.UNKNOWN) { - if (coverInfos[ordinalSide] == null) coverInfos[ordinalSide] = new CoverInfo(side, this); - return coverInfos[side.ordinal()]; + CoverInfo coverInfo = coverInfos[ordinalSide]; + if (coverInfo == null) coverInfo = (coverInfos[ordinalSide] = new CoverInfo(side, this)); + return coverInfo; } return CoverInfo.EMPTY_INFO; } diff --git a/src/main/java/gregtech/common/covers/CoverInfo.java b/src/main/java/gregtech/common/covers/CoverInfo.java index 7f45085ead..3deafba899 100644 --- a/src/main/java/gregtech/common/covers/CoverInfo.java +++ b/src/main/java/gregtech/common/covers/CoverInfo.java @@ -33,8 +33,8 @@ public final class CoverInfo { public static final CoverInfo EMPTY_INFO = new CoverInfo(ForgeDirection.UNKNOWN, null); private final ForgeDirection coverSide; private int coverID = 0; - private GT_CoverBehaviorBase coverBehavior = null; - private ISerializableObject coverData = null; + private GT_CoverBehaviorBase coverBehavior; + private ISerializableObject coverData; private final WeakReference coveredTile; private boolean needsUpdate = false; @@ -43,6 +43,7 @@ public final class CoverInfo { public CoverInfo(ForgeDirection side, ICoverable aTile) { coverSide = side; coveredTile = new WeakReference<>(aTile); + coverBehavior = GregTech_API.sNoBehavior; } public CoverInfo(ForgeDirection side, int aID, ICoverable aTile, ISerializableObject aCoverData) { @@ -89,8 +90,7 @@ public final class CoverInfo { } public GT_CoverBehaviorBase getCoverBehavior() { - if (coverBehavior != null) return coverBehavior; - return GregTech_API.sNoBehavior; + return coverBehavior; } public ISerializableObject getCoverData() { -- cgit