From ecbc76dc6d2f1e4fd5de6cafc7b3fa4f74e8c1c2 Mon Sep 17 00:00:00 2001 From: kstvr32 <109012629+kstvr32@users.noreply.github.com> Date: Thu, 26 Dec 2024 16:35:17 -0500 Subject: [PATCH] Updates Structure checks to add error hinting (#3254) Co-authored-by: kstvr32 Co-authored-by: Martin Robertz --- .../tileentities/multis/MTEWindmill.java | 6 + .../multis/mega/MegaMultiBlockBase.java | 5 + src/main/java/bartworks/util/BWUtil.java | 17 +++ .../tileEntity/MTEFuelRefineFactory.java | 106 ++++++---------- .../goodgenerator/util/StructureHelper.java | 115 ------------------ .../gregtech/api/util/GTStructureUtility.java | 56 +++++++++ .../api/util/HatchElementBuilder.java | 20 +++ .../multi/MTEConcreteBackfillerBase.java | 3 +- .../machines/multi/MTEDrillerBase.java | 1 - .../multi/MTELargeChemicalReactor.java | 7 ++ .../base/GTPPMultiBlockBase.java | 12 ++ .../chemplant/MTEChemicalPlant.java | 6 + ...aTileEntity_PowerSubStationController.java | 32 ++++- .../MTELapotronicSuperCapacitor.java | 11 +- .../common/tileentities/MTETankTFFT.java | 7 ++ 15 files changed, 213 insertions(+), 191 deletions(-) delete mode 100644 src/main/java/goodgenerator/util/StructureHelper.java diff --git a/src/main/java/bartworks/common/tileentities/multis/MTEWindmill.java b/src/main/java/bartworks/common/tileentities/multis/MTEWindmill.java index f86c2a9cc86..40a7aba420b 100644 --- a/src/main/java/bartworks/common/tileentities/multis/MTEWindmill.java +++ b/src/main/java/bartworks/common/tileentities/multis/MTEWindmill.java @@ -153,6 +153,12 @@ public boolean check(MTEWindmill t, World world, int x, int y, int z) { return t.setRotorBlock(tileEntity); } + @Override + public boolean couldBeValid(MTEWindmill mteWindmill, World world, int x, int y, int z, ItemStack trigger) { + TileEntity tileEntity = world.getTileEntity(x, y, z); + return tileEntity instanceof TileEntityRotorBlock; + } + @Override public boolean spawnHint(MTEWindmill t, World world, int x, int y, int z, ItemStack trigger) { StructureLibAPI.hintParticle(world, x, y, z, StructureLibAPI.getBlockHint(), 0); diff --git a/src/main/java/bartworks/common/tileentities/multis/mega/MegaMultiBlockBase.java b/src/main/java/bartworks/common/tileentities/multis/mega/MegaMultiBlockBase.java index a164a7afd28..fc7ca95aae7 100644 --- a/src/main/java/bartworks/common/tileentities/multis/mega/MegaMultiBlockBase.java +++ b/src/main/java/bartworks/common/tileentities/multis/mega/MegaMultiBlockBase.java @@ -172,6 +172,11 @@ public boolean check(T o, World world, int x, int y, int z) { return world.isAirBlock(x, y, z); } + @Override + public boolean couldBeValid(T o, World world, int x, int y, int z, ItemStack trigger) { + return check(o, world, x, y, z); + } + @Override public boolean spawnHint(T o, World world, int x, int y, int z, ItemStack trigger) { if (world.blockExists(x, y, z) && !world.isAirBlock(x, y, z)) diff --git a/src/main/java/bartworks/util/BWUtil.java b/src/main/java/bartworks/util/BWUtil.java index ad75eb275e8..5f536030518 100644 --- a/src/main/java/bartworks/util/BWUtil.java +++ b/src/main/java/bartworks/util/BWUtil.java @@ -304,6 +304,18 @@ public boolean check(T te, World world, int x, int y, int z) { return getter.apply(te) == glassTier; } + @Override + public boolean couldBeValid(T te, World world, int x, int y, int z, ItemStack trigger) { + if (world.isAirBlock(x, y, z)) return false; + Block block = world.getBlock(x, y, z); + int meta = world.getBlockMetadata(x, y, z); + + int glassTier = GlassTier.getGlassTier(block, meta); + + // If it is not a glass, the tier will be 0. + return glassTier != 0 && glassTier != notset && glassTier >= mintier && glassTier <= maxtier; + } + @Override public boolean spawnHint(T te, World world, int x, int y, int z, ItemStack itemStack) { StructureLibAPI.hintParticle(world, x, y, z, StructureLibAPI.getBlockHint(), aDots - 1); @@ -340,6 +352,11 @@ public boolean check(T te, World world, int x, int y, int z) { return glassTier >= mintier && glassTier <= maxtier; } + @Override + public boolean couldBeValid(T te, World world, int x, int y, int z, ItemStack trigger) { + return check(te, world, x, y, z); + } + @Override public boolean spawnHint(T te, World world, int x, int y, int z, ItemStack itemStack) { StructureLibAPI.hintParticle(world, x, y, z, StructureLibAPI.getBlockHint(), aDots - 1); diff --git a/src/main/java/goodgenerator/blocks/tileEntity/MTEFuelRefineFactory.java b/src/main/java/goodgenerator/blocks/tileEntity/MTEFuelRefineFactory.java index bb39f70e838..6b4e4f42829 100644 --- a/src/main/java/goodgenerator/blocks/tileEntity/MTEFuelRefineFactory.java +++ b/src/main/java/goodgenerator/blocks/tileEntity/MTEFuelRefineFactory.java @@ -1,30 +1,29 @@ package goodgenerator.blocks.tileEntity; import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock; -import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofChain; -import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass; +import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlocksTiered; import static com.gtnewhorizon.structurelib.structure.StructureUtility.transpose; import static gregtech.api.util.GTStructureUtility.buildHatchAdder; +import java.util.ArrayList; +import java.util.List; + import net.minecraft.block.Block; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.util.StatCollector; -import net.minecraft.world.World; import net.minecraftforge.common.util.ForgeDirection; +import org.apache.commons.lang3.tuple.Pair; import org.jetbrains.annotations.NotNull; -import com.gtnewhorizon.structurelib.StructureLibAPI; import com.gtnewhorizon.structurelib.alignment.constructable.IConstructable; import com.gtnewhorizon.structurelib.alignment.constructable.ISurvivalConstructable; -import com.gtnewhorizon.structurelib.structure.AutoPlaceEnvironment; import com.gtnewhorizon.structurelib.structure.IStructureDefinition; -import com.gtnewhorizon.structurelib.structure.IStructureElement; import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment; +import com.gtnewhorizon.structurelib.structure.ITierConverter; import com.gtnewhorizon.structurelib.structure.StructureDefinition; -import com.gtnewhorizon.structurelib.structure.StructureUtility; import goodgenerator.api.recipe.GoodGeneratorRecipeMaps; import goodgenerator.blocks.tileEntity.base.MTETooltipMultiBlockBaseEM; @@ -55,7 +54,6 @@ public class MTEFuelRefineFactory extends MTETooltipMultiBlockBaseEM implements private IStructureDefinition multiDefinition = null; private int Tier = -1; - private final int[] cnt = new int[] { 0, 0, 0, 0 }; private static final Block[] coils = new Block[] { Loaders.FRF_Coil_1, Loaders.FRF_Coil_2, Loaders.FRF_Coil_3, Loaders.FRF_Coil_4 }; @@ -118,64 +116,42 @@ public IStructureDefinition getStructure_EM() { .addElement('G', ofBlock(Loaders.fieldRestrictingGlass, 0)) .addElement( 'F', - ofChain( - onElementPass(x -> ++x.cnt[0], ofFieldCoil(0)), - onElementPass(x -> ++x.cnt[1], ofFieldCoil(1)), - onElementPass(x -> ++x.cnt[2], ofFieldCoil(2)), - onElementPass(x -> ++x.cnt[3], ofFieldCoil(3)))) + ofBlocksTiered( + fieldCoilTierConverter(), + getAllFieldCoilTiers(), + -1, + MTEFuelRefineFactory::setCoilTier, + MTEFuelRefineFactory::getCoilTier)) .build(); } return multiDefinition; } - public static IStructureElement ofFieldCoil(int aIndex) { - return new IStructureElement<>() { - - @Override - public boolean check(T t, World world, int x, int y, int z) { - Block block = world.getBlock(x, y, z); - return block.equals(coils[aIndex]); - } - - @Override - public boolean spawnHint(T t, World world, int x, int y, int z, ItemStack trigger) { - StructureLibAPI.hintParticle(world, x, y, z, coils[getIndex(trigger)], 0); - return true; - } - - private int getIndex(ItemStack trigger) { - int s = trigger.stackSize; - if (s > 4 || s <= 0) s = 4; - return s - 1; + public static ITierConverter fieldCoilTierConverter() { + return (block, meta) -> { + for (int i = 0; i < coils.length; i++) { + if (block.equals(coils[i])) { + return i + 1; + } } + return null; + }; + } - @Override - public boolean placeBlock(T t, World world, int x, int y, int z, ItemStack trigger) { - return world.setBlock(x, y, z, coils[getIndex(trigger)], 0, 3); - } + public static List> getAllFieldCoilTiers() { + ArrayList> tiers = new ArrayList<>(); + for (Block coil : coils) { + tiers.add(Pair.of(coil, 0)); + } + return tiers; + } - @Override - public BlocksToPlace getBlocksToPlace(T t, World world, int x, int y, int z, ItemStack trigger, - AutoPlaceEnvironment env) { - return BlocksToPlace.create(coils[getIndex(trigger)], 0); - } + private void setCoilTier(int tier) { + this.Tier = tier; + } - @Override - public PlaceResult survivalPlaceBlock(T t, World world, int x, int y, int z, ItemStack trigger, - AutoPlaceEnvironment env) { - if (check(t, world, x, y, z)) return PlaceResult.SKIP; - return StructureUtility.survivalPlaceBlock( - coils[getIndex(trigger)], - 0, - world, - x, - y, - z, - env.getSource(), - env.getActor(), - env.getChatter()); - } - }; + private int getCoilTier() { + return this.Tier; } @Override @@ -216,22 +192,8 @@ public String[] getStructureDescription(ItemStack itemStack) { @Override public boolean checkMachine_EM(IGregTechTileEntity aBaseMetaTileEntity, ItemStack aStack) { - cnt[0] = 0; - cnt[1] = 0; - cnt[2] = 0; - cnt[3] = 0; - return structureCheck_EM(mName, 7, 12, 1) && getTier() != -1; - } - - public int getTier() { - for (int i = 0; i < 4; i++) { - if (cnt[i] == 32) { - Tier = i + 1; - return i; - } - } Tier = -1; - return -1; + return structureCheck_EM(mName, 7, 12, 1); } @Override diff --git a/src/main/java/goodgenerator/util/StructureHelper.java b/src/main/java/goodgenerator/util/StructureHelper.java deleted file mode 100644 index 215f6fc1cad..00000000000 --- a/src/main/java/goodgenerator/util/StructureHelper.java +++ /dev/null @@ -1,115 +0,0 @@ -package goodgenerator.util; - -import java.util.Arrays; -import java.util.function.BiConsumer; -import java.util.function.BiPredicate; -import java.util.function.Function; - -import net.minecraft.block.Block; -import net.minecraft.init.Items; -import net.minecraft.item.ItemBlock; -import net.minecraft.item.ItemStack; -import net.minecraft.tileentity.TileEntity; -import net.minecraft.util.IIcon; -import net.minecraft.world.World; - -import com.gtnewhorizon.structurelib.StructureLibAPI; -import com.gtnewhorizon.structurelib.structure.IStructureElement; - -import gregtech.api.enums.Materials; -import gregtech.api.enums.OrePrefixes; -import gregtech.api.metatileentity.BaseMetaPipeEntity; -import gregtech.api.metatileentity.implementations.MTEFrame; -import gregtech.api.util.GTOreDictUnificator; - -public class StructureHelper { - - public static IStructureElement addFrame(Materials aMaterials) { - return new IStructureElement<>() { - - private IIcon[] mIcons; - - @Override - public boolean check(T t, World world, int x, int y, int z) { - TileEntity tBlock = world.getTileEntity(x, y, z); - if (tBlock instanceof BaseMetaPipeEntity tFrame) { - if (tFrame.isInvalidTileEntity()) return false; - if (tFrame.getMetaTileEntity() instanceof MTEFrame) { - return ((MTEFrame) tFrame.getMetaTileEntity()).mMaterial == aMaterials; - } - } - return false; - } - - @Override - public boolean spawnHint(T t, World world, int x, int y, int z, ItemStack trigger) { - if (mIcons == null) { - mIcons = new IIcon[6]; - Arrays.fill(mIcons, aMaterials.mIconSet.mTextures[OrePrefixes.frameGt.mTextureIndex].getIcon()); - } - StructureLibAPI.hintParticleTinted(world, x, y, z, mIcons, aMaterials.mRGBa); - return true; - } - - @Override - public boolean placeBlock(T t, World world, int x, int y, int z, ItemStack trigger) { - ItemStack tFrame = GTOreDictUnificator.get(OrePrefixes.frameGt, aMaterials, 1); - if (tFrame.getItem() instanceof ItemBlock tFrameStackItem) { - return tFrameStackItem - .placeBlockAt(tFrame, null, world, x, y, z, 6, 0, 0, 0, Items.feather.getDamage(tFrame)); - } - return false; - } - }; - } - - // Only support to use meta to tier - public static IStructureElement addTieredBlock(Block aBlock, BiConsumer aSetTheFuckingMeta, - Function aGetTheFuckingMeta, int maxMeta) { - return addTieredBlock(aBlock, (t, i) -> { - aSetTheFuckingMeta.accept(t, i); - return true; - }, aGetTheFuckingMeta, maxMeta); - } - - public static IStructureElement addTieredBlock(Block aBlock, BiPredicate aSetTheFuckingMeta, - Function aGetTheFuckingMeta, int maxMeta) { - - return new IStructureElement<>() { - - @Override - public boolean check(T t, World world, int x, int y, int z) { - Block tBlock = world.getBlock(x, y, z); - if (aBlock == tBlock) { - Integer currentMeta = aGetTheFuckingMeta.apply(t); - int newMeta = tBlock.getDamageValue(world, x, y, z) + 1; - if (newMeta > maxMeta) return false; - if (currentMeta == 0) { - return aSetTheFuckingMeta.test(t, newMeta); - } else { - return currentMeta == newMeta; - } - } - return false; - } - - @Override - public boolean spawnHint(T t, World world, int x, int y, int z, ItemStack trigger) { - StructureLibAPI.hintParticle(world, x, y, z, aBlock, getMeta(trigger)); - return true; - } - - @Override - public boolean placeBlock(T t, World world, int x, int y, int z, ItemStack trigger) { - return world.setBlock(x, y, z, aBlock, getMeta(trigger), 3); - } - - private int getMeta(ItemStack trigger) { - int meta = trigger.stackSize - 1; - if (meta <= 0) meta = 0; - if (meta >= maxMeta) meta = maxMeta - 1; - return meta; - } - }; - } -} diff --git a/src/main/java/gregtech/api/util/GTStructureUtility.java b/src/main/java/gregtech/api/util/GTStructureUtility.java index 0b6b26dfbdd..2cb1cb0be96 100644 --- a/src/main/java/gregtech/api/util/GTStructureUtility.java +++ b/src/main/java/gregtech/api/util/GTStructureUtility.java @@ -55,6 +55,7 @@ import gregtech.api.interfaces.IHeatingCoil; import gregtech.api.interfaces.metatileentity.IMetaTileEntity; import gregtech.api.interfaces.tileentity.IGregTechTileEntity; +import gregtech.api.metatileentity.implementations.MTEHatch; import gregtech.api.metatileentity.implementations.MTETieredMachineBlock; import gregtech.common.blocks.BlockCasings5; import gregtech.common.blocks.BlockCyclotronCoils; @@ -95,6 +96,11 @@ public boolean check(T t, World world, int x, int y, int z) { return false; } + @Override + public boolean couldBeValid(T t, World world, int x, int y, int z, ItemStack trigger) { + return check(t, world, x, y, z); + } + @Override public boolean placeBlock(T t, World world, int x, int y, int z, ItemStack trigger) { world.setBlock(x, y, z, Blocks.water, 0, 2); @@ -132,6 +138,11 @@ public boolean check(T t, World world, int x, int y, int z) { return false; } + @Override + public boolean couldBeValid(T t, World world, int x, int y, int z, ItemStack trigger) { + return check(t, world, x, y, z); + } + @Override public boolean spawnHint(T t, World world, int x, int y, int z, ItemStack trigger) { if (mIcons == null) { @@ -249,6 +260,12 @@ public boolean check(T t, World world, int x, int y, int z) { && aHatchAdder.apply(t, (IGregTechTileEntity) tileEntity, (short) aTextureIndex); } + @Override + public boolean couldBeValid(T t, World world, int x, int y, int z, ItemStack trigger) { + TileEntity tileEntity = world.getTileEntity(x, y, z); + return tileEntity instanceof IGregTechTileEntity; + } + @Override public boolean spawnHint(T t, World world, int x, int y, int z, ItemStack trigger) { StructureLibAPI.hintParticle(world, x, y, z, aHintBlock, aHintMeta); @@ -325,6 +342,12 @@ public boolean check(T t, World world, int x, int y, int z) { && aHatchAdder.apply(t, (IGregTechTileEntity) tileEntity, (short) aTextureIndex); } + @Override + public boolean couldBeValid(T t, World world, int x, int y, int z, ItemStack trigger) { + TileEntity tileEntity = world.getTileEntity(x, y, z); + return tileEntity instanceof IGregTechTileEntity; + } + @Override public boolean spawnHint(T t, World world, int x, int y, int z, ItemStack trigger) { StructureLibAPI.hintParticle(world, x, y, z, aHintBlock, aHintMeta); @@ -417,6 +440,14 @@ public boolean check(T t, World world, int x, int y, int z) { || (worldBlock == placeCasing && worldBlock.getDamageValue(world, x, y, z) == placeCasingMeta); } + @Override + public boolean couldBeValid(T t, World world, int x, int y, int z, ItemStack trigger) { + TileEntity tileEntity = world.getTileEntity(x, y, z); + Block worldBlock = world.getBlock(x, y, z); + return (tileEntity instanceof IGregTechTileEntity) + || (worldBlock == placeCasing && worldBlock.getDamageValue(world, x, y, z) == placeCasingMeta); + } + @Override public boolean spawnHint(T t, World world, int x, int y, int z, ItemStack trigger) { StructureLibAPI.hintParticle(world, x, y, z, aHintBlock, hintMeta); @@ -480,6 +511,15 @@ public boolean check(T t, World world, int x, int y, int z) { } } + @Override + public boolean couldBeValid(T t, World world, int x, int y, int z, ItemStack trigger) { + Block block = world.getBlock(x, y, z); + if (!(block instanceof IHeatingCoil)) return false; + HeatingCoilLevel blockLevel = ((IHeatingCoil) block).getCoilHeat(world.getBlockMetadata(x, y, z)); + HeatingCoilLevel expectedLevel = getHeatFromHint(trigger); + return blockLevel == expectedLevel; + } + @Override public boolean spawnHint(T t, World world, int x, int y, int z, ItemStack trigger) { StructureLibAPI.hintParticle(world, x, y, z, GregTechAPI.sBlockCasings5, getMetaFromHint(trigger)); @@ -587,6 +627,17 @@ public boolean check(T t, World world, int x, int y, int z) { } } + @Override + public boolean couldBeValid(T t, World world, int x, int y, int z, ItemStack trigger) { + Block block = world.getBlock(x, y, z); + if (block != GregTechAPI.sSolenoidCoilCasings) return false; + + int expectedMeta = getMetaFromHint(trigger); + int blockMeta = world.getBlockMetadata(x, y, z); + + return expectedMeta == blockMeta; + } + @Override public boolean spawnHint(T t, World world, int x, int y, int z, ItemStack trigger) { StructureLibAPI @@ -659,6 +710,11 @@ public static Predicate filterByMTEClass(List filterByMTETier(int aMinTier, int aMaxTier) { return is -> { IMetaTileEntity tile = ItemMachines.getMetaTileEntity(is); + + if (tile instanceof MTEHatch hatch) { + if (hatch.getTierForStructure() <= aMaxTier && hatch.getTierForStructure() >= aMinTier) return true; + } + return tile instanceof MTETieredMachineBlock && ((MTETieredMachineBlock) tile).mTier <= aMaxTier && ((MTETieredMachineBlock) tile).mTier >= aMinTier; }; diff --git a/src/main/java/gregtech/api/util/HatchElementBuilder.java b/src/main/java/gregtech/api/util/HatchElementBuilder.java index d5517a451eb..045fd4ffe9d 100644 --- a/src/main/java/gregtech/api/util/HatchElementBuilder.java +++ b/src/main/java/gregtech/api/util/HatchElementBuilder.java @@ -402,6 +402,13 @@ public boolean check(T t, World world, int x, int y, int z) { && mAdder.apply(t, (IGregTechTileEntity) tileEntity, (short) mCasingIndex); } + @Override + public boolean couldBeValid(T t, World world, int x, int y, int z, ItemStack trigger) { + // without modifying state, the best we can do is verify that this is a GT TE. + TileEntity tileEntity = world.getTileEntity(x, y, z); + return tileEntity instanceof IGregTechTileEntity; + } + @Override public boolean spawnHint(T t, World world, int x, int y, int z, ItemStack trigger) { StructureLibAPI.hintParticle(world, x, y, z, StructureLibAPI.getBlockHint(), mDot - 1); @@ -420,6 +427,19 @@ public boolean check(T t, World world, int x, int y, int z) { && mAdder.apply(t, (IGregTechTileEntity) tileEntity, (short) mCasingIndex); } + @Override + public boolean couldBeValid(T t, World world, int x, int y, int z, ItemStack trigger) { + TileEntity tileEntity = world.getTileEntity(x, y, z); + if (tileEntity instanceof IGregTechTileEntity gtTileEntity) { + // verify that the block matches the item hatch filter + ItemStack blockItem = gtTileEntity.getMetaTileEntity() + .getStackForm(0); + return mHatchItemFilter.apply(t, trigger) + .test(blockItem); + } + return false; + } + @Override public boolean spawnHint(T t, World world, int x, int y, int z, ItemStack trigger) { StructureLibAPI.hintParticle(world, x, y, z, StructureLibAPI.getBlockHint(), mDot - 1); diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/MTEConcreteBackfillerBase.java b/src/main/java/gregtech/common/tileentities/machines/multi/MTEConcreteBackfillerBase.java index 1ed03c7f2e2..b61973edc76 100644 --- a/src/main/java/gregtech/common/tileentities/machines/multi/MTEConcreteBackfillerBase.java +++ b/src/main/java/gregtech/common/tileentities/machines/multi/MTEConcreteBackfillerBase.java @@ -5,6 +5,7 @@ import static gregtech.api.enums.HatchElement.InputBus; import static gregtech.api.enums.HatchElement.InputHatch; import static gregtech.api.enums.HatchElement.Maintenance; +import static gregtech.api.enums.HatchElement.OutputBus; import static gregtech.api.metatileentity.BaseTileEntity.TOOLTIP_DELAY; import java.util.List; @@ -125,7 +126,7 @@ protected boolean checkHatches() { @Override protected List> getAllowedHatches() { - return ImmutableList.of(InputHatch, InputBus, Maintenance, Energy); + return ImmutableList.of(InputHatch, InputBus, OutputBus, Maintenance, Energy); } @Override diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/MTEDrillerBase.java b/src/main/java/gregtech/common/tileentities/machines/multi/MTEDrillerBase.java index 4f7788d39c9..a729edeaeff 100644 --- a/src/main/java/gregtech/common/tileentities/machines/multi/MTEDrillerBase.java +++ b/src/main/java/gregtech/common/tileentities/machines/multi/MTEDrillerBase.java @@ -116,7 +116,6 @@ protected IStructureDefinition computeValue(Class type) { 'b', lazy( t -> buildHatchAdder(MTEDrillerBase.class).atLeastList(t.getAllowedHatches()) - .adder(MTEDrillerBase::addToMachineList) .casingIndex(t.casingTextureIndex) .dot(1) .buildAndChain( diff --git a/src/main/java/gregtech/common/tileentities/machines/multi/MTELargeChemicalReactor.java b/src/main/java/gregtech/common/tileentities/machines/multi/MTELargeChemicalReactor.java index 02c8f19ae0c..1d4026aff66 100644 --- a/src/main/java/gregtech/common/tileentities/machines/multi/MTELargeChemicalReactor.java +++ b/src/main/java/gregtech/common/tileentities/machines/multi/MTELargeChemicalReactor.java @@ -235,6 +235,13 @@ public boolean check(MTELargeChemicalReactor t, World world, int x, int y, int z } } + @Override + public boolean couldBeValid(MTELargeChemicalReactor t, World world, int x, int y, int z, ItemStack trigger) { + Block block = world.getBlock(x, y, z); + return block instanceof IHeatingCoil + && ((IHeatingCoil) block).getCoilHeat(world.getBlockMetadata(x, y, z)) != HeatingCoilLevel.None; + } + @Override public boolean spawnHint(MTELargeChemicalReactor t, World world, int x, int y, int z, ItemStack trigger) { StructureLibAPI.hintParticle(world, x, y, z, GregTechAPI.sBlockCasings5, 0); diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/base/GTPPMultiBlockBase.java b/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/base/GTPPMultiBlockBase.java index 08ee64597c9..22f0ec2701c 100644 --- a/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/base/GTPPMultiBlockBase.java +++ b/src/main/java/gtPlusPlus/xmod/gregtech/api/metatileentity/implementations/base/GTPPMultiBlockBase.java @@ -1068,6 +1068,18 @@ public boolean check(T t, World world, int x, int y, int z) { return false; } + @Override + public boolean couldBeValid(T t, World world, int x, int y, int z, ItemStack trigger) { + Block tBlock = world.getBlock(x, y, z); + if (aBlock == tBlock) { + int expectedMeta = getMeta(trigger); + int blockMeta = tBlock.getDamageValue(world, x, y, z) + 1; + if (blockMeta > maxMeta || blockMeta < minMeta + 1) return false; + return expectedMeta == blockMeta; + } + return false; + } + @Override public boolean spawnHint(T t, World world, int x, int y, int z, ItemStack trigger) { StructureLibAPI.hintParticle(world, x, y, z, aBlock, getMeta(trigger)); diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/chemplant/MTEChemicalPlant.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/chemplant/MTEChemicalPlant.java index e6ab4b7c1c4..41075e8d583 100644 --- a/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/chemplant/MTEChemicalPlant.java +++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/production/chemplant/MTEChemicalPlant.java @@ -263,6 +263,12 @@ public boolean check(MTEChemicalPlant t, World world, int x, int y, int z) { } else return false; } + @Override + public boolean couldBeValid(MTEChemicalPlant mteChemicalPlant, World world, int x, int y, int z, + ItemStack trigger) { + return check(aIndex, world, x, y, z); + } + private boolean check(int aIndex, World world, int x, int y, int z) { Block block = world.getBlock(x, y, z); int meta = world.getBlockMetadata(x, y, z); diff --git a/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/storage/GregtechMetaTileEntity_PowerSubStationController.java b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/storage/GregtechMetaTileEntity_PowerSubStationController.java index 492cb11081e..01aaf05b4f8 100644 --- a/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/storage/GregtechMetaTileEntity_PowerSubStationController.java +++ b/src/main/java/gtPlusPlus/xmod/gregtech/common/tileentities/machines/multi/storage/GregtechMetaTileEntity_PowerSubStationController.java @@ -1,6 +1,7 @@ package gtPlusPlus.xmod.gregtech.common.tileentities.machines.multi.storage; import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock; +import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlocksTiered; import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofChain; import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass; import static com.gtnewhorizon.structurelib.structure.StructureUtility.onlyIf; @@ -15,6 +16,9 @@ import static gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GTPPMultiBlockBase.GTPPHatchElement.TTDynamo; import static gtPlusPlus.xmod.gregtech.api.metatileentity.implementations.base.GTPPMultiBlockBase.GTPPHatchElement.TTEnergy; +import java.util.ArrayList; +import java.util.List; + import javax.annotation.Nullable; import net.minecraft.block.Block; @@ -26,6 +30,7 @@ import net.minecraftforge.common.util.Constants.NBT; import net.minecraftforge.common.util.ForgeDirection; +import org.apache.commons.lang3.tuple.Pair; import org.jetbrains.annotations.NotNull; import com.gtnewhorizon.structurelib.StructureLibAPI; @@ -35,6 +40,7 @@ import com.gtnewhorizon.structurelib.structure.IStructureDefinition; import com.gtnewhorizon.structurelib.structure.IStructureElement; import com.gtnewhorizon.structurelib.structure.ISurvivalBuildEnvironment; +import com.gtnewhorizon.structurelib.structure.ITierConverter; import com.gtnewhorizon.structurelib.structure.StructureDefinition; import com.gtnewhorizon.structurelib.structure.StructureUtility; import com.gtnewhorizons.modularui.api.NumberFormatMUI; @@ -286,12 +292,36 @@ public IStructureDefinition ge onElementPass(x -> ++x.cellCount[3], ofCell(7)), onElementPass(x -> ++x.cellCount[4], ofCell(8)), onElementPass(x -> ++x.cellCount[5], ofCell(9)))))))) - .addElement('H', ofCell(4)) + .addElement( + 'H', + withChannel( + "cell", + // Adding this so preview looks correct + ofBlocksTiered(cellTierConverter(), getAllCellTiers(), -1, (te, t) -> {}, (te) -> -1))) .build(); } return STRUCTURE_DEFINITION; } + public static ITierConverter cellTierConverter() { + return (block, meta) -> { + int tier = getCellTier(block, meta); + if (tier == -1) return null; + return tier; + }; + } + + public static List> getAllCellTiers() { + ArrayList> tiers = new ArrayList<>(); + tiers.add(Pair.of(ModBlocks.blockCasings2Misc, 7)); + tiers.add(Pair.of(ModBlocks.blockCasings3Misc, 4)); + tiers.add(Pair.of(ModBlocks.blockCasings3Misc, 5)); + tiers.add(Pair.of(ModBlocks.blockCasings3Misc, 6)); + tiers.add(Pair.of(ModBlocks.blockCasings3Misc, 7)); + tiers.add(Pair.of(ModBlocks.blockCasings3Misc, 8)); + return tiers; + } + public static IStructureElement ofCell(int aIndex) { return new IStructureElement() { diff --git a/src/main/java/kekztech/common/tileentities/MTELapotronicSuperCapacitor.java b/src/main/java/kekztech/common/tileentities/MTELapotronicSuperCapacitor.java index 1bffe0045d2..4ae99ac3638 100644 --- a/src/main/java/kekztech/common/tileentities/MTELapotronicSuperCapacitor.java +++ b/src/main/java/kekztech/common/tileentities/MTELapotronicSuperCapacitor.java @@ -1,6 +1,7 @@ package kekztech.common.tileentities; import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlock; +import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofBlockAnyMeta; import static com.gtnewhorizon.structurelib.structure.StructureUtility.ofChain; import static com.gtnewhorizon.structurelib.structure.StructureUtility.onElementPass; import static com.gtnewhorizon.structurelib.structure.StructureUtility.onlyIf; @@ -240,6 +241,14 @@ public boolean check(MTELapotronicSuperCapacitor t, World world, int x, int y, i return true; } + @Override + public boolean couldBeValid(MTELapotronicSuperCapacitor mteLapotronicSuperCapacitor, + World world, int x, int y, int z, ItemStack trigger) { + Block worldBlock = world.getBlock(x, y, z); + int meta = worldBlock.getDamageValue(world, x, y, z); + return LSC_PART == worldBlock && meta != 0; + } + private int getHint(ItemStack stack) { return Capacitor.VALUES_BY_TIER[min( Capacitor.VALUES_BY_TIER.length, @@ -288,7 +297,7 @@ public PlaceResult survivalPlaceBlock(MTELapotronicSuperCapacitor t, World world chatter); } })))) - .addElement('C', ofBlock(LSC_PART, 1)) + .addElement('C', ofBlockAnyMeta(LSC_PART, 1)) .build(); private static final BigInteger MAX_LONG = BigInteger.valueOf(Long.MAX_VALUE); diff --git a/src/main/java/kekztech/common/tileentities/MTETankTFFT.java b/src/main/java/kekztech/common/tileentities/MTETankTFFT.java index 39c2c4d9a68..f19cd5fabfd 100644 --- a/src/main/java/kekztech/common/tileentities/MTETankTFFT.java +++ b/src/main/java/kekztech/common/tileentities/MTETankTFFT.java @@ -134,6 +134,13 @@ public boolean check(MTETankTFFT t, World world, int x, int y, int z) { return true; } + @Override + public boolean couldBeValid(MTETankTFFT t, World world, int x, int y, int z, ItemStack trigger) { + Block worldBlock = world.getBlock(x, y, z); + int meta = worldBlock.getDamageValue(world, x, y, z); + return TFFT_FIELD == worldBlock && meta != 0; + } + private int getHint(ItemStack stack) { return Math.min(Field.VALUES.length, ChannelDataAccessor.getChannelData(stack, "field")); }