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 ++++++++++++++++------ 1 file changed, 21 insertions(+), 7 deletions(-) (limited to 'src/main/java/gregtech/api/metatileentity/CoverableTileEntity.java') 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; } -- cgit