From 29a13752eb6a3decbc5aca44a0e7e6a8fabd7494 Mon Sep 17 00:00:00 2001 From: tracer4b <61507029+tracer4b@users.noreply.github.com> Date: Wed, 7 Sep 2022 23:21:03 +0800 Subject: [PATCH 1/5] plasma cvd unit --- .../GCYSMetaTileEntities.java | 3 + .../MetaTileEntityPlasmaCVDUnit.java | 77 +++++++++++++++++++ .../recipe/GCYSMetaTileEntityLoader.java | 10 +++ .../resources/assets/gcys/lang/en_us.lang | 3 + 4 files changed, 93 insertions(+) create mode 100644 src/main/java/gregicality/science/common/metatileentities/multiblock/MetaTileEntityPlasmaCVDUnit.java diff --git a/src/main/java/gregicality/science/common/metatileentities/GCYSMetaTileEntities.java b/src/main/java/gregicality/science/common/metatileentities/GCYSMetaTileEntities.java index bacdb38f..083f5b37 100644 --- a/src/main/java/gregicality/science/common/metatileentities/GCYSMetaTileEntities.java +++ b/src/main/java/gregicality/science/common/metatileentities/GCYSMetaTileEntities.java @@ -45,6 +45,7 @@ public class GCYSMetaTileEntities { public static MetaTileEntityAxialCompressor SUPERSONIC_AXIAL_COMPRESSOR; public static MetaTileEntityTurbomolecularPump LOW_POWER_TURBOMOLECULAR_PUMP; public static MetaTileEntityTurbomolecularPump HIGH_POWER_TURBOMOLECULAR_PUMP; + public static MetaTileEntityPlasmaCVDUnit PLASMA_CVD_UNIT; public static void init() { // GCYM Machines: ID 2000-2099 @@ -86,8 +87,10 @@ public static void init() { SUPERSONIC_AXIAL_COMPRESSOR = registerMetaTileEntity(3912, new MetaTileEntityAxialCompressor(gcysId("axial_compressor.supersonic"), GTValues.LuV, 18E9, 50_000.0)); LOW_POWER_TURBOMOLECULAR_PUMP = registerMetaTileEntity(3913, new MetaTileEntityTurbomolecularPump(gcysId("turbomolecular_pump.low_power"), GTValues.EV, 1E-4, 10_000.0)); HIGH_POWER_TURBOMOLECULAR_PUMP = registerMetaTileEntity(3914, new MetaTileEntityTurbomolecularPump(gcysId("turbomolecular_pump.high_power"), GTValues.LuV, 1E-7, 50_000.0)); + PLASMA_CVD_UNIT = registerMetaTileEntity(3915, new MetaTileEntityPlasmaCVDUnit(gcysId("plasma_cvd_unit"))); } + @Nonnull private static ResourceLocation gcysId(String name) { return new ResourceLocation(GregicalityScience.MODID, name); diff --git a/src/main/java/gregicality/science/common/metatileentities/multiblock/MetaTileEntityPlasmaCVDUnit.java b/src/main/java/gregicality/science/common/metatileentities/multiblock/MetaTileEntityPlasmaCVDUnit.java new file mode 100644 index 00000000..8db3bf34 --- /dev/null +++ b/src/main/java/gregicality/science/common/metatileentities/multiblock/MetaTileEntityPlasmaCVDUnit.java @@ -0,0 +1,77 @@ +package gregicality.science.common.metatileentities.multiblock; + +import gregicality.multiblocks.api.render.GCYMTextures; +import gregicality.multiblocks.common.block.GCYMMetaBlocks; +import gregicality.multiblocks.common.block.blocks.BlockLargeMultiblockCasing; +import gregicality.multiblocks.common.block.blocks.BlockUniqueCasing; +import gregicality.science.api.metatileentity.multiblock.PressureMultiblockController; +import gregicality.science.api.recipes.GCYSRecipeMaps; +import gregicality.science.client.render.GCYSTextures; +import gregicality.science.common.block.GCYSMetaBlocks; +import gregicality.science.common.block.blocks.BlockGCYSMultiblockCasing; +import gregicality.science.common.block.blocks.BlockTransparentCasing; +import gregtech.api.metatileentity.MetaTileEntity; +import gregtech.api.metatileentity.interfaces.IGregTechTileEntity; +import gregtech.api.metatileentity.multiblock.IMultiblockPart; +import gregtech.api.pattern.BlockPattern; +import gregtech.api.pattern.FactoryBlockPattern; +import gregtech.client.renderer.ICubeRenderer; +import gregtech.client.renderer.texture.cube.OrientedOverlayRenderer; +import gregtech.common.blocks.BlockGlassCasing; +import gregtech.common.blocks.MetaBlocks; +import net.minecraft.block.state.IBlockState; +import net.minecraft.util.ResourceLocation; + +import javax.annotation.Nonnull; + +public class MetaTileEntityPlasmaCVDUnit extends PressureMultiblockController { + + public MetaTileEntityPlasmaCVDUnit(ResourceLocation metaTileEntityId) { + super(metaTileEntityId, GCYSRecipeMaps.PLASMA_CVD_RECIPES); + } + + @Override + public MetaTileEntity createMetaTileEntity(IGregTechTileEntity metaTileEntityHolder) { + return new MetaTileEntityPlasmaCVDUnit(metaTileEntityId); + } + + @Override + protected BlockPattern createStructurePattern() { + return FactoryBlockPattern.start() + .aisle("XXXXXXX", " XGGGX ", " XGGGX ", " ") + .aisle("XXXXXXX", "XAAAAAX", "X X", " XGGGX ") + .aisle("VXXXXXV", "VAAAAAV", "X X", " XGGGX ") + .aisle("XXXXXXX", "XAAAAAX", "X X", " XGGGX ") + .aisle("XXXXXXX", " SGGGX ", " XGGGX ", " ") + .where('S', selfPredicate()) + .where('X', states(getCasingState()).setMinGlobalLimited(40).or(autoAbilities())) + .where('G', states(getGlassState())) + .where('A', states(getSubstrateState())) + .where('V', states(GCYMMetaBlocks.UNIQUE_CASING.getState(BlockUniqueCasing.UniqueCasingType.HEAT_VENT))) + .where(' ', any()) + .build(); + } + + private static IBlockState getCasingState() { + return GCYMMetaBlocks.LARGE_MULTIBLOCK_CASING.getState(BlockLargeMultiblockCasing.CasingType.ATOMIC_CASING); + } + + private static IBlockState getSubstrateState() { + return GCYSMetaBlocks.MULTIBLOCK_CASING.getState(BlockGCYSMultiblockCasing.CasingType.ADVANCED_SUBSTRATE); + } + + private static IBlockState getGlassState() { + return MetaBlocks.TRANSPARENT_CASING.getState(BlockGlassCasing.CasingType.FUSION_GLASS); + } + + @Nonnull + @Override + protected OrientedOverlayRenderer getFrontOverlay() { + return GCYSTextures.CVD_UNIT_OVERLAY; + } + + @Override + public ICubeRenderer getBaseTexture(IMultiblockPart iMultiblockPart) { + return GCYMTextures.ATOMIC_CASING; + } +} diff --git a/src/main/java/gregicality/science/loaders/recipe/GCYSMetaTileEntityLoader.java b/src/main/java/gregicality/science/loaders/recipe/GCYSMetaTileEntityLoader.java index 6ff8e7ff..159b7eec 100644 --- a/src/main/java/gregicality/science/loaders/recipe/GCYSMetaTileEntityLoader.java +++ b/src/main/java/gregicality/science/loaders/recipe/GCYSMetaTileEntityLoader.java @@ -261,6 +261,16 @@ private static void multiblocks() { 'E', EMITTER_EV.getStackForm() ); + ModHandler.addShapedRecipe(true, "plasma_cvd_unit", PLASMA_CVD_UNIT.getStackForm(), + "PKP", "CHC", "ESE", + 'P', new UnificationEntry(plate, Adamantium), + 'K', new UnificationEntry(cableGtSingle, SiliconCarbide), + 'C', new UnificationEntry(circuit, MarkerMaterials.Tier.UV), + 'H', MetaTileEntities.HULL[UV].getStackForm(), + 'S', SENSOR_UV.getStackForm(), + 'E', EMITTER_UV.getStackForm() + ); + ModHandler.addShapedRecipe(true, "burner_reactor", BURNER_REACTOR.getStackForm(), "KRK", "IHI", "CMC", 'K', new UnificationEntry(cableGtSingle, Platinum), diff --git a/src/main/resources/assets/gcys/lang/en_us.lang b/src/main/resources/assets/gcys/lang/en_us.lang index be54f430..10b33a21 100644 --- a/src/main/resources/assets/gcys/lang/en_us.lang +++ b/src/main/resources/assets/gcys/lang/en_us.lang @@ -409,6 +409,9 @@ gcys.multiblock.turbomolecular_pump.tooltip.1=Decreases pressure by §b%sPa/s§7 gcys.multiblock.turbomolecular_pump.tooltip.2=Consumes §e%sL/s§7 Lubricant when decreasing pressure. gcys.multiblock.turbomolecular_pump.tooltip.3=Uses %s§7 power. Does not overclock. +# Plasma CVD Unit +gcys.machine.plasma_cvd_unit.name=Plasma CVD Unit + # Single Block Machines gcys.machine.dryer.lv.name=Basic Dryer From 1c1b4c566649a7f6bbd4c056d4b067b6038df9a4 Mon Sep 17 00:00:00 2001 From: tracer4b <61507029+tracer4b@users.noreply.github.com> Date: Thu, 8 Sep 2022 00:04:47 +0800 Subject: [PATCH 2/5] new bedrock drill --- .../MetaTileEntityIndustrialDrill.java | 49 ++++++++++--------- 1 file changed, 27 insertions(+), 22 deletions(-) diff --git a/src/main/java/gregicality/science/common/metatileentities/multiblock/MetaTileEntityIndustrialDrill.java b/src/main/java/gregicality/science/common/metatileentities/multiblock/MetaTileEntityIndustrialDrill.java index d5cec619..54b9bebc 100644 --- a/src/main/java/gregicality/science/common/metatileentities/multiblock/MetaTileEntityIndustrialDrill.java +++ b/src/main/java/gregicality/science/common/metatileentities/multiblock/MetaTileEntityIndustrialDrill.java @@ -7,6 +7,7 @@ import gregicality.science.client.render.GCYSTextures; import gregicality.science.common.block.GCYSMetaBlocks; import gregicality.science.common.block.blocks.BlockGCYSMultiblockCasing; +import gregicality.science.common.block.blocks.BlockTransparentCasing; import gregtech.api.capability.impl.MultiblockRecipeLogic; import gregtech.api.capability.impl.NotifiableItemStackHandler; import gregtech.api.metatileentity.MetaTileEntity; @@ -18,13 +19,12 @@ import gregtech.api.pattern.PatternMatchContext; import gregtech.api.pattern.TraceabilityPredicate; import gregtech.api.recipes.Recipe; +import gregtech.api.unification.material.Material; +import gregtech.api.unification.material.Materials; import gregtech.api.util.GTUtility; import gregtech.client.renderer.ICubeRenderer; import gregtech.client.renderer.texture.Textures; -import gregtech.common.blocks.BlockMetalCasing; -import gregtech.common.blocks.BlockMultiblockCasing; -import gregtech.common.blocks.BlockTurbineCasing; -import gregtech.common.blocks.MetaBlocks; +import gregtech.common.blocks.*; import net.minecraft.client.resources.I18n; import net.minecraft.item.ItemStack; import net.minecraft.util.ResourceLocation; @@ -50,27 +50,32 @@ public MetaTileEntity createMetaTileEntity(IGregTechTileEntity iGregTechTileEnti return new MetaTileEntityIndustrialDrill(metaTileEntityId); } + // Dimensions: 9 x (16 + 1) x 9 @Override protected BlockPattern createStructurePattern() { return FactoryBlockPattern.start() - .aisle(" ", "XXXXXXX", "X X", "X X", "X X", "X X", "X X", "XXXXXXX") - .aisle(" ", "X X", " ", " F F ", " ", " ", " ", "X F X") - .aisle(" ", "X X", " C ", " FCF ", " C ", " CVC ", " CVC ", "X BBB X") - .aisle(" R ", "X D X", " CGC ", " CGC ", " CGC ", " VGV ", " VGV ", "XFBBBFX") - .aisle(" ", "X X", " C ", " FCF ", " C ", " CSC ", " CVC ", "X BBB X") - .aisle(" ", "X X", " ", " F F ", " ", " ", " ", "X F X") - .aisle(" ", "XXXXXXX", "X X", "X X", "X X", "X X", "X X", "XXXXXXX") + .aisle(" ", " F F ", " F F ", " F F ", " F F ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle(" ", " GGGGG ", " GGGGG ", " GGGGG ", " F F ", " F F ", " F F ", " ", " ", " ", " ", " ", " AAA ", " AAA ", " ", " ", " ") + .aisle(" ", " G G ", " G G ", " G G ", " ", " ", " F F ", " F F ", " ", " ", " RXR ", " RXR ", " ADDDA ", " ADDDA ", " RXR ", " RXR ", " ") + .aisle(" ", "FG GF", "FG I I GF", "FG III GF", "FF FIF FF", " F FXF F ", " FFFXFFF ", " FFXFF ", " FXF ", " FXF ", " RXXXR ", " RDDDR ", " AEEDEEA ", " AEEDEEA ", " RDDDR ", " RDDDR ", " AAA ") + .aisle(" Z ", " G H G ", " G E G ", " G IDI G ", " IDI ", " XDX ", " XDX ", " XDX ", " XDX ", " XDX ", " XXDXX ", " XDDDX ", " ADDDDDA ", " ADDDDDA ", " XDDDX ", " XDDDX ", " AAA ") + .aisle(" ", "FG GF", "FG I I GF", "FG III GF", "FF FIF FF", " F FXF F ", " FFFXFFF ", " FFXFF ", " FXF ", " FXF ", " RXXXR ", " RDDDR ", " AEEDEEA ", " AEEDEEA ", " RDDDR ", " RDDDR ", " AAA ") + .aisle(" ", " G G ", " G G ", " G G ", " ", " ", " F F ", " F F ", " ", " ", " RSR ", " RXR ", " ADDDA ", " ADDDA ", " RXR ", " RXR ", " ") + .aisle(" ", " GGGGG ", " GGGGG ", " GGGGG ", " F F ", " F F ", " F F ", " ", " ", " ", " ", " ", " AAA ", " AAA ", " ", " ", " ") + .aisle(" ", " F F ", " F F ", " F F ", " F F ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") .where('S', selfPredicate()) - .where('X', states(GCYMMetaBlocks.LARGE_MULTIBLOCK_CASING.getState(BlockLargeMultiblockCasing.CasingType.ATOMIC_CASING))) - .where('F', states(MetaBlocks.FRAMES.get(GCYMMaterials.HSLASteel).getBlock(GCYMMaterials.HSLASteel))) - .where('C', states(MetaBlocks.METAL_CASING.getState(BlockMetalCasing.MetalCasingType.STEEL_SOLID))) - .where('G', states(MetaBlocks.TURBINE_CASING.getState(BlockTurbineCasing.TurbineCasingType.TUNGSTENSTEEL_GEARBOX))) - .where('V', states(MetaBlocks.MULTIBLOCK_CASING.getState(BlockMultiblockCasing.MultiblockCasingType.GRATE_CASING))) - .where('B', states(MetaBlocks.METAL_CASING.getState(BlockMetalCasing.MetalCasingType.STEEL_SOLID)) - .setMinGlobalLimited(4) - .or(autoAbilities(true, true, false, true, true, true, true))) - .where('D', states(GCYSMetaBlocks.MULTIBLOCK_CASING.getState(BlockGCYSMultiblockCasing.CasingType.DRILL_HEAD))) - .where('R', bedrockPredicate()) + .where('X', states(MetaBlocks.METAL_CASING.getState(BlockMetalCasing.MetalCasingType.TUNGSTENSTEEL_ROBUST)) + .setMinGlobalLimited(30) + .or(autoAbilities(true, true, false, true, true, true, true))) + .where('F', states(MetaBlocks.FRAMES.get(Materials.Darmstadtium).getBlock(Materials.Darmstadtium))) + .where('I', states(GCYMMetaBlocks.LARGE_MULTIBLOCK_CASING.getState(BlockLargeMultiblockCasing.CasingType.VIBRATION_SAFE_CASING))) + .where('G', states(GCYSMetaBlocks.TRANSPARENT_CASING.getState(BlockTransparentCasing.CasingType.PMMA))) + .where('R', states(MetaBlocks.MULTIBLOCK_CASING.getState(BlockMultiblockCasing.MultiblockCasingType.GRATE_CASING))) + .where('A', states(MetaBlocks.BOILER_CASING.getState(BlockBoilerCasing.BoilerCasingType.TUNGSTENSTEEL_PIPE))) + .where('E', states(MetaBlocks.TURBINE_CASING.getState(BlockTurbineCasing.TurbineCasingType.TUNGSTENSTEEL_GEARBOX))) + .where('D', states(MetaBlocks.METAL_CASING.getState(BlockMetalCasing.MetalCasingType.STEEL_SOLID))) // TODO Laser Focus Casing + .where('H', states(GCYSMetaBlocks.MULTIBLOCK_CASING.getState(BlockGCYSMultiblockCasing.CasingType.DRILL_HEAD))) + .where('Z', bedrockPredicate()) .where(' ', any()) .build(); } @@ -88,7 +93,7 @@ protected TraceabilityPredicate bedrockPredicate() { @Override public ICubeRenderer getBaseTexture(IMultiblockPart iMultiblockPart) { - return Textures.SOLID_STEEL_CASING; + return Textures.ROBUST_TUNGSTENSTEEL_CASING; } @Override From 778f5991c3a68d1ef5702f5a3c3d4d079abd2a63 Mon Sep 17 00:00:00 2001 From: tracer4b <61507029+tracer4b@users.noreply.github.com> Date: Thu, 8 Sep 2022 12:46:43 +0800 Subject: [PATCH 3/5] shift muffler position on burner --- .../multiblock/MetaTileEntityBurnerReactor.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/gregicality/science/common/metatileentities/multiblock/MetaTileEntityBurnerReactor.java b/src/main/java/gregicality/science/common/metatileentities/multiblock/MetaTileEntityBurnerReactor.java index f5b707b1..2d9faf97 100644 --- a/src/main/java/gregicality/science/common/metatileentities/multiblock/MetaTileEntityBurnerReactor.java +++ b/src/main/java/gregicality/science/common/metatileentities/multiblock/MetaTileEntityBurnerReactor.java @@ -43,8 +43,8 @@ public MetaTileEntity createMetaTileEntity(IGregTechTileEntity iGregTechTileEnti protected BlockPattern createStructurePattern() { return FactoryBlockPattern.start() .aisle("F F", "F X F", "FXXXF", "F X F", "F F", " ") - .aisle(" X ", " XCX ", "XCCCX", " XCX ", " X ", " X ") - .aisle(" XXX ", "XCCCX", "XK#KX", "XC#CX", " XCX ", " XMX ") + .aisle(" X ", " XCX ", "XCCCX", " XCX ", " M ", " X ") + .aisle(" XXX ", "XCCCX", "XK#KX", "XC#CX", " XCX ", " XXX ") .aisle(" X ", " XCX ", "XCCCX", " XCX ", " X ", " X ") .aisle("F F", "F X F", "FXSXF", "F X F", "F F", " ") .where('S', selfPredicate()) From f59bf22025012de7e95c26d9e2d96d1fd6b6d932 Mon Sep 17 00:00:00 2001 From: tracer4b <61507029+tracer4b@users.noreply.github.com> Date: Thu, 8 Sep 2022 12:46:54 +0800 Subject: [PATCH 4/5] LuV axial compressor --- .../MetaTileEntityAxialCompressor.java | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/main/java/gregicality/science/common/metatileentities/multiblock/pressure/MetaTileEntityAxialCompressor.java b/src/main/java/gregicality/science/common/metatileentities/multiblock/pressure/MetaTileEntityAxialCompressor.java index e825ccc4..5af97127 100644 --- a/src/main/java/gregicality/science/common/metatileentities/multiblock/pressure/MetaTileEntityAxialCompressor.java +++ b/src/main/java/gregicality/science/common/metatileentities/multiblock/pressure/MetaTileEntityAxialCompressor.java @@ -35,10 +35,7 @@ import gregtech.client.renderer.ICubeRenderer; import gregtech.client.renderer.texture.Textures; import gregtech.common.ConfigHolder; -import gregtech.common.blocks.BlockFireboxCasing; -import gregtech.common.blocks.BlockGlassCasing; -import gregtech.common.blocks.BlockMetalCasing; -import gregtech.common.blocks.MetaBlocks; +import gregtech.common.blocks.*; import net.minecraft.block.state.IBlockState; import net.minecraft.client.resources.I18n; import net.minecraft.entity.player.EntityPlayer; @@ -147,6 +144,27 @@ protected void resetTileAbilities() { @Override protected BlockPattern createStructurePattern() { + if (tier == GTValues.LuV) { + return FactoryBlockPattern.start() + .aisle(" F ", " F ", " XXX ", " XPX ", " XXX ", " F ", " F ") + .aisle(" ", " ", " XXX ", " XAX ", " XXX ", " ", " ").setRepeatable(2) + .aisle(" ", " X ", " XTX ", "GTATX", " XTX ", " G ", " ") + .aisle(" ", " X ", "XTATX", "GAAAG", "XTATX", " XGX ", " ").setRepeatable(3) + .aisle("F F", "FXXXF", "XBTBX", "XTSTX", "XBTBX", "FXXXF", "F F") + .where('S', selfPredicate()) + .where('F', states(getFrameState())) + .where('X', states(getCasingState()).setMinGlobalLimited(50) + .or(autoAbilities()) + .or(abilities(MultiblockAbility.IMPORT_FLUIDS).setExactLimit(1)) + .or(abilities(MultiblockAbility.INPUT_ENERGY).setMinGlobalLimited(1).setMaxGlobalLimited(3))) + .where('G', states(getGlassState())) + .where('B', states(MetaBlocks.MULTIBLOCK_CASING.getState(BlockMultiblockCasing.MultiblockCasingType.EXTREME_ENGINE_INTAKE_CASING))) + .where('T', states(MetaBlocks.BOILER_CASING.getState(BlockBoilerCasing.BoilerCasingType.TUNGSTENSTEEL_PIPE))) + .where('A', airfoilPredicate()) + .where('P', abilities(GCYSMultiblockAbility.PRESSURE_CONTAINER)) + .build(); + } + return FactoryBlockPattern.start() .aisle("FXF", "XPX", "XXX") .aisle("XXX", "GAG", "XXX").setRepeatable(4) From 5a3e33f617d51c99243bc631fcd597e64f23e9fd Mon Sep 17 00:00:00 2001 From: tracer4b <61507029+tracer4b@users.noreply.github.com> Date: Thu, 8 Sep 2022 12:47:04 +0800 Subject: [PATCH 5/5] LuV turbomolecular pump --- .../MetaTileEntityTurbomolecularPump.java | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/main/java/gregicality/science/common/metatileentities/multiblock/pressure/MetaTileEntityTurbomolecularPump.java b/src/main/java/gregicality/science/common/metatileentities/multiblock/pressure/MetaTileEntityTurbomolecularPump.java index 21b3a1a2..5f2f9adb 100644 --- a/src/main/java/gregicality/science/common/metatileentities/multiblock/pressure/MetaTileEntityTurbomolecularPump.java +++ b/src/main/java/gregicality/science/common/metatileentities/multiblock/pressure/MetaTileEntityTurbomolecularPump.java @@ -36,10 +36,7 @@ import gregtech.client.renderer.ICubeRenderer; import gregtech.client.renderer.texture.Textures; import gregtech.common.ConfigHolder; -import gregtech.common.blocks.BlockFireboxCasing; -import gregtech.common.blocks.BlockGlassCasing; -import gregtech.common.blocks.BlockMetalCasing; -import gregtech.common.blocks.MetaBlocks; +import gregtech.common.blocks.*; import net.minecraft.block.state.IBlockState; import net.minecraft.client.resources.I18n; import net.minecraft.entity.player.EntityPlayer; @@ -148,6 +145,27 @@ protected void resetTileAbilities() { @Override protected BlockPattern createStructurePattern() { + if (tier == GTValues.LuV) { + return FactoryBlockPattern.start() + .aisle(" ", " ", " ", " ", " XGX ", " XGX ", " XGX ", " XXX ") + .aisle(" F F ", " F F ", " FXF ", " FPF ", "XAAAX", "XPAPX", "XPAPX", "XBPBX") + .aisle(" ", " Z ", " XAX ", " PAP ", "GAAAG", "GAAAG", "GAAAG", "XPSPX") + .aisle(" F F ", " F F ", " FXF ", " FPF ", "XAAAX", "XPAPX", "XPAPX", "XBPBX") + .aisle(" ", " ", " ", " ", " XGX ", " XGX ", " XGX ", " XXX ") + .where('S', selfPredicate()) + .where('F', states(getFrameState())) + .where('X', states(getCasingState()).setMinGlobalLimited(32) + .or(autoAbilities()) + .or(abilities(MultiblockAbility.IMPORT_FLUIDS).setExactLimit(1)) + .or(abilities(MultiblockAbility.INPUT_ENERGY).setMinGlobalLimited(1).setMaxGlobalLimited(3))) + .where('G', states(getGlassState())) + .where('A', airfoilPredicate()) + .where('P', states(MetaBlocks.BOILER_CASING.getState(BlockBoilerCasing.BoilerCasingType.TUNGSTENSTEEL_PIPE))) + .where('B', states(MetaBlocks.MULTIBLOCK_CASING.getState(BlockMultiblockCasing.MultiblockCasingType.EXTREME_ENGINE_INTAKE_CASING))) + .where('Z', states(getCasingState()) + .or(abilities(GCYSMultiblockAbility.PRESSURE_CONTAINER).setExactLimit(1))) + .build(); + } return FactoryBlockPattern.start(RelativeDirection.RIGHT, RelativeDirection.FRONT, RelativeDirection.DOWN) .aisle("XXX", "XSX", "XXX") .aisle("XGX", "GAG", "XGX").setRepeatable(4)