From 1ff662fd478ea780665573d3008502373066e713 Mon Sep 17 00:00:00 2001 From: Serenibyss <10861407+serenibyss@users.noreply.github.com> Date: Tue, 16 Jan 2024 16:09:39 -0600 Subject: [PATCH] Fix LCE/ECE obstruction check (#2346) --- .../gregtech/api/util/RelativeDirection.java | 29 +++++++++++++++++++ .../MetaTileEntityLargeCombustionEngine.java | 23 ++++++++------- .../MetaTileEntityRotorHolder.java | 20 ++++++++----- 3 files changed, 53 insertions(+), 19 deletions(-) diff --git a/src/main/java/gregtech/api/util/RelativeDirection.java b/src/main/java/gregtech/api/util/RelativeDirection.java index 1e4b2102761..c55db969ee4 100644 --- a/src/main/java/gregtech/api/util/RelativeDirection.java +++ b/src/main/java/gregtech/api/util/RelativeDirection.java @@ -163,4 +163,33 @@ public static EnumFacing simulateAxisRotation(EnumFacing newFrontFacing, EnumFac return upwardsFacing.getOpposite(); } } + + /** + * Offset a BlockPos relatively in any direction by any amount. Pass negative values to offset down, right or + * backwards. + */ + public static BlockPos offsetPos(BlockPos pos, EnumFacing frontFacing, EnumFacing upwardsFacing, boolean isFlipped, + int upOffset, int leftOffset, int forwardOffset) { + if (upOffset == 0 && leftOffset == 0 && forwardOffset == 0) { + return pos; + } + + int oX = 0, oY = 0, oZ = 0; + final EnumFacing relUp = UP.getRelativeFacing(frontFacing, upwardsFacing, isFlipped); + oX += relUp.getXOffset() * upOffset; + oY += relUp.getYOffset() * upOffset; + oZ += relUp.getZOffset() * upOffset; + + final EnumFacing relLeft = LEFT.getRelativeFacing(frontFacing, upwardsFacing, isFlipped); + oX += relLeft.getXOffset() * leftOffset; + oY += relLeft.getYOffset() * leftOffset; + oZ += relLeft.getZOffset() * leftOffset; + + final EnumFacing relForward = FRONT.getRelativeFacing(frontFacing, upwardsFacing, isFlipped); + oX += relForward.getXOffset() * forwardOffset; + oY += relForward.getYOffset() * forwardOffset; + oZ += relForward.getZOffset() * forwardOffset; + + return pos.add(oX, oY, oZ); + } } diff --git a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java index 4b298f25cd0..7d58be463fe 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java +++ b/src/main/java/gregtech/common/metatileentities/multi/electric/generator/MetaTileEntityLargeCombustionEngine.java @@ -16,6 +16,7 @@ import gregtech.api.pattern.PatternMatchContext; import gregtech.api.recipes.RecipeMaps; import gregtech.api.unification.material.Materials; +import gregtech.api.util.RelativeDirection; import gregtech.api.util.TextComponentUtil; import gregtech.api.util.TextFormattingUtil; import gregtech.client.renderer.ICubeRenderer; @@ -28,7 +29,6 @@ import net.minecraft.block.state.IBlockState; import net.minecraft.client.resources.I18n; import net.minecraft.item.ItemStack; -import net.minecraft.util.EnumFacing; import net.minecraft.util.ResourceLocation; import net.minecraft.util.math.BlockPos; import net.minecraft.util.text.ITextComponent; @@ -192,18 +192,19 @@ protected void formStructure(PatternMatchContext context) { } private boolean checkIntakesObstructed() { - EnumFacing facing = this.getFrontFacing(); - boolean permuteXZ = facing.getAxis() == EnumFacing.Axis.Z; - BlockPos centerPos = this.getPos().offset(facing); - for (int x = -1; x < 2; x++) { - for (int y = -1; y < 2; y++) { - // Skip the controller block itself - if (x == 0 && y == 0) + for (int left = -1; left <= 1; left++) { + for (int up = -1; up <= 1; up++) { + if (left == 0 && up == 0) { + // Skip the controller block itself continue; - BlockPos blockPos = centerPos.add(permuteXZ ? x : 0, y, permuteXZ ? 0 : x); - IBlockState blockState = this.getWorld().getBlockState(blockPos); - if (!blockState.getBlock().isAir(blockState, this.getWorld(), blockPos)) + } + + final BlockPos checkPos = RelativeDirection.offsetPos( + getPos(), getFrontFacing(), getUpwardsFacing(), isFlipped(), up, left, 1); + final IBlockState state = getWorld().getBlockState(checkPos); + if (!state.getBlock().isAir(state, getWorld(), checkPos)) { return true; + } } } return false; diff --git a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityRotorHolder.java b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityRotorHolder.java index e36b9bb24d4..d78b7fe5042 100644 --- a/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityRotorHolder.java +++ b/src/main/java/gregtech/common/metatileentities/multi/multiblockpart/MetaTileEntityRotorHolder.java @@ -12,6 +12,7 @@ import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; import gregtech.api.metatileentity.multiblock.IMultiblockAbilityPart; import gregtech.api.metatileentity.multiblock.MultiblockAbility; +import gregtech.api.util.RelativeDirection; import gregtech.client.renderer.texture.Textures; import gregtech.common.items.behaviors.AbstractMaterialPartBehavior; import gregtech.common.items.behaviors.TurbineRotorBehavior; @@ -163,14 +164,17 @@ public boolean isFrontFaceFree() { } private boolean checkTurbineFaceFree() { - EnumFacing facing = getFrontFacing(); - boolean permuteXZ = facing.getAxis() == EnumFacing.Axis.Z; - BlockPos centerPos = getPos().offset(facing); - for (int x = -1; x < 2; x++) { - for (int y = -1; y < 2; y++) { - BlockPos blockPos = centerPos.add(permuteXZ ? x : 0, y, permuteXZ ? 0 : x); - IBlockState blockState = getWorld().getBlockState(blockPos); - if (!blockState.getBlock().isAir(blockState, getWorld(), blockPos)) { + final EnumFacing front = getFrontFacing(); + // this can be anything really, as long as it is not up/down when on Y axis + final EnumFacing upwards = front.getAxis() == EnumFacing.Axis.Y ? EnumFacing.NORTH : EnumFacing.UP; + + for (int left = -1; left <= 1; left++) { + for (int up = -1; up <= 1; up++) { + // flip doesn't affect anything here since we are checking a square anyway + final BlockPos checkPos = RelativeDirection.offsetPos( + getPos(), front, upwards, false, up, left, 1); + final IBlockState state = getWorld().getBlockState(checkPos); + if (!state.getBlock().isAir(state, getWorld(), checkPos)) { return false; } }