From 3b3bc4b9ad409aa26155d14a6aaafb09c73e94f7 Mon Sep 17 00:00:00 2001 From: Abdiel Kavash <19243993+AbdielKavash@users.noreply.github.com> Date: Thu, 31 Jul 2025 21:54:59 -0600 Subject: [PATCH] Add preset IAlignmentLimits constants. (#43) Many multiblocks can only be placed or rotated in certain orientations. This has been always done ad-hoc, with individual checks for each controller. This is inconsistent and sometimes it results in bugs where certain orientations are not allowed for no discernible reason; for example https://github.com/GTNewHorizons/GT-New-Horizons-Modpack/issues/14206. This PR introduces a short list of named constants to `IAlignmentLimits`, which describe common multiplboc orientations. These are currently: * `UNLIMITED`: Any orientation is allowed. Most multiblocks. * `UPRIGHT`: The multiblock must be in an upright position, with the top side facing up. Example: Distillation Tower, Ore Washing Plant. * `NOT_UPSIDE_DOWN`: The multiblock can be in any orientation, except for the top side facing directly downwards. This is currently only the Large Heat Exchanger and Integrated Ore Factory. * `FACING_UP`: The front of the controller must face up. Example: Flotation Cell, XL Turbines. Currently, these constants describe the allowed facings of *all* GT5U multiblocks. A multiblock can then simply return one of these constants from `getInitialAlignmentLimits()` to describe its valid orientations, instead of implementing the logic itself. This concentrates the code to one place, improves readability, and fixes any bugs connected with these checks being done wrong. Of course, even though the list is currently complete, if any future multiblock wants to implement its own strange restrictions on orientation, it can still implement its own check instead of returning one of the constants. A follow-up PR to GT5U implements this for all multiblocks which restrict valid orientations: https://github.com/GTNewHorizons/GT5-Unofficial/pull/4595 --- .../alignment/IAlignmentLimits.java | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/main/java/com/gtnewhorizon/structurelib/alignment/IAlignmentLimits.java b/src/main/java/com/gtnewhorizon/structurelib/alignment/IAlignmentLimits.java index 4cefb739..52f3e725 100644 --- a/src/main/java/com/gtnewhorizon/structurelib/alignment/IAlignmentLimits.java +++ b/src/main/java/com/gtnewhorizon/structurelib/alignment/IAlignmentLimits.java @@ -14,8 +14,28 @@ import com.gtnewhorizon.structurelib.alignment.enumerable.Rotation; public interface IAlignmentLimits { + /** + * Can be placed in any orientation. + */ IAlignmentLimits UNLIMITED = (direction, rotation, flip) -> true; + /** + * Must be standing upright; i.e., top side of the block facing up. + */ + IAlignmentLimits UPRIGHT = (direction, rotation, flip) -> direction.offsetY == 0 + && (flip.isVerticallyFliped() ? rotation.isUpsideDown() : rotation.isNotRotated()); + + /** + * Can be in any orientation except upside down; i.e., top side of the block facing down. + */ + IAlignmentLimits NOT_UPSIDE_DOWN = (direction, rotation, flip) -> direction.offsetY != 0 + || (flip.isVerticallyFliped() ? !rotation.isNotRotated() : !rotation.isUpsideDown()); + + /** + * Front side of the block must be facing up. + */ + IAlignmentLimits FACING_UP = (direction, rotation, flip) -> direction == ForgeDirection.UP; + boolean isNewExtendedFacingValid(ForgeDirection direction, Rotation rotation, Flip flip); default boolean isNewExtendedFacingValid(ExtendedFacing alignment) {