Files
StructureLib/src/main/java/com/gtnewhorizon/structurelib/alignment/IAlignment.java
T

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

217 lines
7.3 KiB
Java
Raw Normal View History

package com.gtnewhorizon.structurelib.alignment;
import net.minecraftforge.common.util.ForgeDirection;
import com.gtnewhorizon.structurelib.alignment.enumerable.Direction;
import com.gtnewhorizon.structurelib.alignment.enumerable.ExtendedFacing;
import com.gtnewhorizon.structurelib.alignment.enumerable.Flip;
import com.gtnewhorizon.structurelib.alignment.enumerable.Rotation;
2022-07-08 17:14:18 +08:00
public interface IAlignment extends IAlignmentLimits, IAlignmentProvider {
2022-07-08 17:14:18 +08:00
int DIRECTIONS_COUNT = Direction.VALUES.length;
int ROTATIONS_COUNT = Rotation.VALUES.length;
int FLIPS_COUNT = Flip.VALUES.length;
2021-05-27 21:19:31 +08:00
int STATES_COUNT = ExtendedFacing.STATES_COUNT;
ExtendedFacing getExtendedFacing();
2021-12-22 21:17:39 +08:00
/**
* Set the facing without additional checks. Tools altering facing should use
* {@link #toolSetExtendedFacing(ExtendedFacing)} instead.
*/
void setExtendedFacing(ExtendedFacing alignment);
IAlignmentLimits getAlignmentLimits();
@Override
2022-07-08 17:14:18 +08:00
default IAlignment getAlignment() {
return this;
}
2022-07-08 17:14:18 +08:00
static int getAlignmentIndex(ForgeDirection direction, Rotation rotation, Flip flip) {
return (direction.ordinal() * ROTATIONS_COUNT + rotation.getIndex()) * FLIPS_COUNT + flip.getIndex();
}
2022-07-08 17:14:18 +08:00
default ForgeDirection getDirection() {
return getExtendedFacing().getDirection();
}
2022-07-08 17:14:18 +08:00
default void setDirection(ForgeDirection direction) {
setExtendedFacing(getExtendedFacing().with(direction));
}
2022-07-08 17:14:18 +08:00
default Rotation getRotation() {
return getExtendedFacing().getRotation();
}
2022-07-08 17:14:18 +08:00
default void setRotation(Rotation rotation) {
setExtendedFacing(getExtendedFacing().with(rotation));
}
2022-07-08 17:14:18 +08:00
default Flip getFlip() {
return getExtendedFacing().getFlip();
}
2022-07-08 17:14:18 +08:00
default void setFlip(Flip flip) {
setExtendedFacing(getExtendedFacing().with(flip));
}
2022-07-08 17:14:18 +08:00
default boolean toolSetDirection(ForgeDirection direction) {
if (direction == null || direction == ForgeDirection.UNKNOWN) {
2022-08-08 17:40:12 +08:00
for (int i = 0, j = getDirection().ordinal() + 1, valuesLength = Direction.VALUES.length; i
< valuesLength; i++) {
2021-06-16 13:46:24 +08:00
if (toolSetDirection(Direction.VALUES[(j + i) % valuesLength].getForgeDirection())) {
return true;
}
}
2022-07-08 17:14:18 +08:00
} else {
for (ExtendedFacing extendedFacing : ExtendedFacing.FOR_FACING.get(direction)) {
2022-07-08 17:14:18 +08:00
if (checkedSetExtendedFacing(extendedFacing)) {
return true;
}
}
}
return false;
}
2022-07-08 17:14:18 +08:00
default boolean checkedSetDirection(ForgeDirection direction) {
if (isNewDirectionValid(direction)) {
setDirection(direction);
return true;
}
return false;
}
2022-07-08 17:14:18 +08:00
default boolean canSetToDirectionAny(ForgeDirection direction) {
for (ExtendedFacing extendedFacing : ExtendedFacing.FOR_FACING.get(direction)) {
2022-07-08 17:14:18 +08:00
if (isNewExtendedFacingValid(extendedFacing)) {
return true;
}
}
return false;
}
default boolean toolSetRotation(Rotation rotation) {
2022-07-08 17:14:18 +08:00
if (rotation == null) {
int flips = Flip.VALUES.length;
int rotations = Rotation.VALUES.length;
2022-07-08 17:14:18 +08:00
for (int ii = 0, jj = getFlip().ordinal(); ii < flips; ii++) {
2021-06-16 13:46:24 +08:00
for (int i = 1, j = getRotation().ordinal(); i < rotations; i++) {
2022-08-08 17:40:12 +08:00
if (checkedSetExtendedFacing(
ExtendedFacing.of(
getDirection(),
Rotation.VALUES[(j + i) % rotations],
Flip.VALUES[(jj + ii) % flips]))) {
return true;
}
}
}
return false;
2022-07-08 17:14:18 +08:00
} else {
return checkedSetRotation(rotation);
}
}
2022-07-08 17:14:18 +08:00
default boolean checkedSetRotation(Rotation rotation) {
if (isNewRotationValid(rotation)) {
setRotation(rotation);
return true;
}
return false;
}
2022-07-08 17:14:18 +08:00
default boolean toolSetFlip(Flip flip) {
if (flip == null) {
2021-06-16 13:46:24 +08:00
for (int i = 1, j = getFlip().ordinal(), valuesLength = Flip.VALUES.length; i < valuesLength; i++) {
if (checkedSetFlip(Flip.VALUES[(j + i) % valuesLength])) {
return true;
}
}
return false;
2022-07-08 17:14:18 +08:00
} else {
return checkedSetFlip(flip);
}
}
2022-07-08 17:14:18 +08:00
default boolean checkedSetFlip(Flip flip) {
if (isNewFlipValid(flip)) {
setFlip(flip);
return true;
}
return false;
}
2022-07-08 17:14:18 +08:00
default boolean toolSetExtendedFacing(ExtendedFacing extendedFacing) {
if (extendedFacing == null) {
2022-08-08 17:40:12 +08:00
for (int i = 0, j = getExtendedFacing().ordinal() + 1, valuesLength = ExtendedFacing.VALUES.length; i
< valuesLength; i++) {
2022-07-08 17:14:18 +08:00
if (checkedSetExtendedFacing(ExtendedFacing.VALUES[(j + i) % valuesLength])) {
return true;
}
}
return false;
2022-07-08 17:14:18 +08:00
} else {
return checkedSetExtendedFacing(extendedFacing);
}
}
2022-07-08 17:14:18 +08:00
default boolean checkedSetExtendedFacing(ExtendedFacing alignment) {
if (isNewExtendedFacingValid(alignment)) {
setExtendedFacing(alignment);
return true;
}
return false;
}
default boolean isNewDirectionValid(ForgeDirection direction) {
2022-07-08 17:14:18 +08:00
return isNewExtendedFacingValid(direction, getRotation(), getFlip());
}
2022-07-08 17:14:18 +08:00
default boolean isNewRotationValid(Rotation rotation) {
return isNewExtendedFacingValid(getDirection(), rotation, getFlip());
}
2022-07-08 17:14:18 +08:00
default boolean isNewFlipValid(Flip flip) {
return isNewExtendedFacingValid(getDirection(), getRotation(), flip);
}
default boolean isExtendedFacingValid() {
2022-07-08 17:14:18 +08:00
return isNewExtendedFacingValid(getDirection(), getRotation(), getFlip());
}
@Override
2022-07-08 17:14:18 +08:00
default boolean isNewExtendedFacingValid(ForgeDirection direction, Rotation rotation, Flip flip) {
return getAlignmentLimits().isNewExtendedFacingValid(direction, rotation, flip);
}
@Override
2022-07-08 17:14:18 +08:00
default boolean isNewExtendedFacingValid(ExtendedFacing alignment) {
2022-08-08 17:40:12 +08:00
return getAlignmentLimits()
.isNewExtendedFacingValid(alignment.getDirection(), alignment.getRotation(), alignment.getFlip());
}
/**
* Check if this object support a flip change, assuming both direction and rotation is not changed.
*/
default boolean isFlipChangeAllowed() {
ExtendedFacing facing = getExtendedFacing();
for (Flip flip : Flip.VALUES) {
if (flip == getFlip()) continue;
if (isNewExtendedFacingValid(facing.with(flip))) return true;
}
return false;
}
/**
* Check if this object support a rotation change, assuming both direction and flip is not changed.
*/
default boolean isRotationChangeAllowed() {
ExtendedFacing facing = getExtendedFacing();
for (Rotation rotation : Rotation.VALUES) {
if (rotation == getRotation()) continue;
if (isNewExtendedFacingValid(facing.with(rotation))) return true;
}
return false;
}
2022-07-08 17:14:18 +08:00
}