// priority: 0

const registerGTCEuMachines = (event) => {

	const $SteamMulti = Java.loadClass('com.gregtechceu.gtceu.common.machine.multiblock.steam.SteamParallelMultiblockMachine');
	const $Tags = Java.loadClass("dev.latvian.mods.kubejs.util.Tags")
	const CoilWorkableElectricMultiblockMachine = Java.loadClass("com.gregtechceu.gtceu.api.machine.multiblock.CoilWorkableElectricMultiblockMachine")

	//#region Nether Dome

	event.create('nether_dome', 'multiblock')
		.rotationState(RotationState.NON_Y_AXIS)
		.recipeType('nether_dome')
		.appearanceBlock(GTBlocks.CASING_PTFE_INERT)
		.pattern(definition => FactoryBlockPattern.start()
			.aisle(" CCCCC ", " QQFQQ ", " QQFQQ ", " QQFQQ ", " QQFQQ ", "   F   ")
			.aisle("CBBBBBC", "Q#####Q", "Q#####Q", "Q#####Q", "QTTTTTQ", " QQQQQ ")
			.aisle("CBBBBBC", "Q#####Q", "Q#####Q", "Q#####Q", "QTTTTTQ", " QQQQQ ")
			.aisle("CBBBBBC", "F#####F", "F#####F", "F#####F", "FTTTTTF", "FQQQQQF")
			.aisle("CBBBBBC", "Q#####Q", "Q#####Q", "Q#####Q", "QTTTTTQ", " QQQQQ ")
			.aisle("CBBBBBC", "Q#####Q", "Q#####Q", "Q#####Q", "QTTTTTQ", " QQQQQ ")
			.aisle(" CCXCC ", " QGOGQ ", " QOPOQ ", " QOPOQ ", " QGOGQ ", "       ")
			.where('X', Predicates.controller(Predicates.blocks(definition.get())))
			.where('B', Predicates.blocks('tfc:rock/magma/basalt').setMinGlobalLimited(6)
				.or(Predicates.blocks('minecraft:netherrack').setMinGlobalLimited(10)))
			.where('T', Predicates.blocks('minecraft:glowstone').setMinGlobalLimited(5)
				.or(Predicates.blocks('minecraft:netherrack').setMinGlobalLimited(10)))
			.where('O', Predicates.blocks('minecraft:obsidian'))
			.where('F', Predicates.frames('black_steel'))
			.where('Q', Predicates.blocks('ae2:quartz_glass'))
			.where('G', Predicates.blocks('minecraft:gold_block')
				.or(Predicates.blocks('tfc:rock/raw/basalt'))
				.or(Predicates.blocks('tfc:rock/hardened/basalt'))
				.or(Predicates.blocks('tfc:rock/bricks/basalt'))
				.or(Predicates.blocks('tfc:rock/chiseled/basalt'))
				.or(Predicates.blocks('minecraft:obsidian'))
				.or(Predicates.blocks('minecraft:nether_bricks')))
			.where('P', Predicates.blocks('minecraft:purple_stained_glass_pane'))
			.where('C', Predicates.blocks(GTBlocks.CASING_PTFE_INERT.get()).setMinGlobalLimited(10)
				.or(Predicates.autoAbilities(definition.getRecipeTypes()))
				.or(Predicates.abilities(PartAbility.MAINTENANCE).setExactLimit(1)))
			.where('#', Predicates.air()
				.or(Predicates.blocks('minecraft:netherrack'))
				.or(Predicates.blocks('tfc:rock/magma/basalt'))
				.or(Predicates.blocks('minecraft:glowstone'))
				.or(Predicates.blocks('minecraft:nether_bricks')))
			.where(' ', Predicates.any())
			.build()
		)
		.shapeInfo(controller => MultiblockShapeInfo.builder()
			.aisle(" CeCeC ", " QQFQQ ", " QQFQQ ", " QQFQQ ", " QQFQQ ", "   F   ")
			.aisle("CMMMNNC", "Q    NQ", "Q     Q", "Q     Q", "QNTTNNQ", " QQQQQ ")
			.aisle("iMMNNNf", "QR    Q", "QR    Q", "Q  T  Q", "QNTTTNQ", " QQQQQ ")
			.aisle("CNMMMNC", "F    NF", "F     F", "F     F", "FNNTNNF", "FQQQQQF")
			.aisle("tNNNMNl", "Q    NQ", "Q    NQ", "Q     Q", "QNNNNNQ", " QQQQQ ")
			.aisle("CNNNNNC", "QN  NNQ", "Q    NQ", "Q    NQ", "QNNNNNQ", " QQQQQ ")
			.aisle(" mCXCC ", " QGOGQ ", " QOPOQ ", " QOPOQ ", " QGOGQ ", "       ")
			.where('X', controller, Direction.SOUTH)
			.where('C', GTBlocks.CASING_PTFE_INERT.get())
			.where('N', Block.getBlock('minecraft:netherrack'))
			.where('M', Block.getBlock('tfc:rock/magma/basalt'))
			.where('T', Block.getBlock('minecraft:glowstone'))
			.where('Q', Block.getBlock('ae2:quartz_glass'))
			.where('F', Block.getBlock('gtceu:black_steel_frame'))
			.where('G', Block.getBlock('minecraft:gold_block'))
			.where('O', Block.getBlock('minecraft:obsidian'))
			.where('P', Block.getBlock('minecraft:purple_stained_glass_pane'))
			.where('R', Block.getBlock('minecraft:nether_bricks'))
			.where(' ', Block.getBlock('minecraft:air'))

			.where('m', GTMachines.MAINTENANCE_HATCH, Direction.SOUTH)
			.where('i', GTMachines.ITEM_IMPORT_BUS[GTValues.ULV], Direction.WEST)
			.where('t', GTMachines.ITEM_EXPORT_BUS[GTValues.ULV], Direction.WEST)
			.where('f', GTMachines.FLUID_IMPORT_HATCH[GTValues.MV], Direction.EAST)
			.where('l', GTMachines.FLUID_EXPORT_HATCH[GTValues.MV], Direction.EAST)
			.where('e', GTMachines.ENERGY_INPUT_HATCH[GTValues.MV], Direction.NORTH)
			.build()
		)
		.workableCasingModel(
			"gtceu:block/casings/solid/machine_casing_inert_ptfe",
			"gtceu:block/machines/gas_collector")

	//#endregion

	//#region End Dome

	event.create('end_dome', 'multiblock')
		.rotationState(RotationState.NON_Y_AXIS)
		.recipeType('end_dome')
		.appearanceBlock(GTBlocks.CASING_TITANIUM_STABLE)
		.pattern(definition => FactoryBlockPattern.start()
			.aisle(" CCCCC ", " QQFQQ ", " QQFQQ ", " QQFQQ ", " QQFQQ ", "   F   ", "       ")
			.aisle("CBBBBBC", "QOOOOOQ", "QOOOOOQ", "QOOOOOQ", "QOOOOOQ", " QSSSQ ", "  GGG  ")
			.aisle("CBBBBBC", "QOOOOOQ", "QOOOOOQ", "QOOOOOQ", "QOOOOOQ", " SNNNS ", " G   G ")
			.aisle("CBBBBBC", "FOOEOOF", "FOOOOOF", "FOOOOOF", "FOOOOOF", "FSNNNSF", " G   G ")
			.aisle("CBBBBBC", "QOOOOOQ", "QOOOOOQ", "QOOOOOQ", "QOOOOOQ", " SNNNS ", " G   G ")
			.aisle("CBBBBBC", "QOOOOOQ", "QOOOOOQ", "QOOOOOQ", "QOOOOOQ", " QSSSQ ", "  GGG  ")
			.aisle(" CCXCC ", " QQFQQ ", " QQFQQ ", " QQFQQ ", " QQFQQ ", "   F   ", "       ")
			.where('X', Predicates.controller(Predicates.blocks(definition.get())))
			.where('B', Predicates.blocks('minecraft:end_stone').setMinGlobalLimited(20)
				.or(Predicates.blocks('minecraft:black_concrete')))
			.where('O', Predicates.blocks('minecraft:obsidian').setMinGlobalLimited(8)
				.or(Predicates.air()))
			.where('F', Predicates.frames('titanium'))
			.where('Q', Predicates.blocks('ae2:quartz_glass'))
			.where('E', Predicates.blocks('minecraft:dragon_egg'))
			.where('S', Predicates.blocks('tfg:artificial_end_portal_frame'))
			.where('N', Predicates.blocks('minecraft:black_concrete'))
			.where('G', Predicates.blocks('tfc:ore/small_malachite')
				.or(Predicates.blocks('tfc:ore/small_native_copper'))
				.or(Predicates.blocks('tfc:ore/small_native_gold'))
				.or(Predicates.blocks('tfc:ore/small_hematite'))
				.or(Predicates.blocks('tfc:ore/small_native_silver'))
				.or(Predicates.blocks('tfc:ore/small_cassiterite'))
				.or(Predicates.blocks('tfc:ore/small_bismuthinite'))
				.or(Predicates.blocks('tfc:ore/small_garnierite'))
				.or(Predicates.blocks('tfc:ore/small_malachite'))
				.or(Predicates.blocks('tfc:ore/small_magnetite'))
				.or(Predicates.blocks('tfc:ore/small_limonite'))
				.or(Predicates.blocks('tfc:ore/small_sphalerite'))
				.or(Predicates.blocks('tfc:ore/small_tetrahedrite')))
			.where('C', Predicates.blocks(GTBlocks.CASING_TITANIUM_STABLE.get()).setMinGlobalLimited(10)
				.or(Predicates.autoAbilities(definition.getRecipeTypes()))
				.or(Predicates.abilities(PartAbility.MAINTENANCE).setExactLimit(1)))
			.where(' ', Predicates.any())
			.build()
		)
		.shapeInfo(controller => MultiblockShapeInfo.builder()
			.aisle(" CeCeC ", " QQFQQ ", " QQFQQ ", " QQFQQ ", " QQFQQ ", "   F   ", "       ")
			.aisle("CBBBBBC", "Q  O  Q", "Q  O  Q", "Q     Q", "Q     Q", " QSSSQ ", "  123  ")
			.aisle("iBBBBBf", "QO   OQ", "QO    Q", "QO    Q", "Q     Q", " SNNNS ", " y   4 ")
			.aisle("CBBBBBC", "F  E  F", "F     F", "F     F", "F     F", "FSNNNSF", " z   5 ")
			.aisle("tBBBBNl", "Q O   Q", "Q O   Q", "Q     Q", "Q     Q", " SNNNS ", " 0   6 ")
			.aisle("CNBBNNC", "Q     Q", "Q     Q", "Q     Q", "Q     Q", " QSSSQ ", "  987  ")
			.aisle(" mCXCC ", " QQFQQ ", " QQFQQ ", " QQFQQ ", " QQFQQ ", "   F   ", "       ")
			.where('X', controller, Direction.SOUTH)
			.where('C', GTBlocks.CASING_TITANIUM_STABLE.get())
			.where('B', Block.getBlock('minecraft:end_stone'))
			.where('N', Block.getBlock('minecraft:black_concrete'))
			.where('O', Block.getBlock('minecraft:obsidian'))
			.where('F', Block.getBlock('gtceu:titanium_frame'))
			.where('Q', Block.getBlock('ae2:quartz_glass'))
			.where(' ', Block.getBlock('minecraft:air'))
			.where('S', Block.getBlock('tfg:artificial_end_portal_frame'))
			.where('E', Block.getBlock('minecraft:dragon_egg'))

			.where('1', Block.getBlock('tfc:ore/small_native_copper'))
			.where('2', Block.getBlock('tfc:ore/small_native_gold'))
			.where('3', Block.getBlock('tfc:ore/small_hematite'))
			.where('4', Block.getBlock('tfc:ore/small_native_silver'))
			.where('5', Block.getBlock('tfc:ore/small_cassiterite'))
			.where('6', Block.getBlock('tfc:ore/small_bismuthinite'))
			.where('7', Block.getBlock('tfc:ore/small_garnierite'))
			.where('8', Block.getBlock('tfc:ore/small_malachite'))
			.where('9', Block.getBlock('tfc:ore/small_magnetite'))
			.where('0', Block.getBlock('tfc:ore/small_limonite'))
			.where('z', Block.getBlock('tfc:ore/small_sphalerite'))
			.where('y', Block.getBlock('tfc:ore/small_tetrahedrite'))

			.where('m', GTMachines.MAINTENANCE_HATCH, Direction.SOUTH)
			.where('i', GTMachines.ITEM_IMPORT_BUS[GTValues.ULV], Direction.WEST)
			.where('t', GTMachines.ITEM_EXPORT_BUS[GTValues.ULV], Direction.WEST)
			.where('f', GTMachines.FLUID_IMPORT_HATCH[GTValues.MV], Direction.EAST)
			.where('l', GTMachines.FLUID_EXPORT_HATCH[GTValues.MV], Direction.EAST)
			.where('e', GTMachines.ENERGY_INPUT_HATCH[GTValues.HV], Direction.NORTH)
			.build()
		)
		.workableCasingModel(
			"gtceu:block/casings/solid/machine_casing_stable_titanium",
			"gtceu:block/machines/gas_collector")

	//#endregion

	//#region Steam Bloomery

	event.create('steam_bloomery', 'multiblock')
		.machine((holder) => new $SteamMulti(holder, 8))
		.rotationState(RotationState.NON_Y_AXIS)
		.recipeType('steam_bloomery')
		.recipeModifier((machine, recipe) => $SteamMulti.recipeModifier(machine, recipe), true)
		.appearanceBlock(GTBlocks.CASING_BRONZE_BRICKS)
		.pattern(definition => FactoryBlockPattern.start()
			.aisle(" F ", " C ", " E ", " E ", " E ")
			.aisle("FCF", "C#C", "E#E", "E#E", "E#E")
			.aisle(" F ", "CXC", " E ", " E ", " E ")
			.where('X', Predicates.controller(Predicates.blocks(definition.get())))
			.where('C', Predicates.blockTag($Tags.block("tfc:bloomery_insulation")))
			.where('F', Predicates.blocks(GTBlocks.FIREBOX_BRONZE.get())
				.or(Predicates.abilities(PartAbility.STEAM).setExactLimit(1)))
			.where('E', Predicates.abilities(PartAbility.STEAM_IMPORT_ITEMS).setMaxGlobalLimited(2)
				.or(Predicates.abilities(PartAbility.STEAM_EXPORT_ITEMS).setExactLimit(1))
				.or(Predicates.blockTag($Tags.block("tfc:bloomery_insulation"))))
			.where('#', Predicates.air())
			.where(' ', Predicates.any())
			.build()
		)
		.shapeInfo(controller => MultiblockShapeInfo.builder()
			.aisle(" F ", " C ", " C ", " C ", " C ")
			.aisle("FCF", "C#C", "C#C", "C#C", "C#C")
			.aisle(" i ", "CXC", " O ", " I ", " C ")
			.where('X', controller, Direction.SOUTH)
			.where('C', Block.getBlock('tfc:rock/bricks/rhyolite'))
			.where('F', GTBlocks.FIREBOX_BRONZE.get())
			.where('i', GTMachines.STEAM_HATCH, Direction.SOUTH)
			.where('O', GTMachines.STEAM_EXPORT_BUS, Direction.SOUTH)
			.where('I', GTMachines.STEAM_IMPORT_BUS, Direction.SOUTH)
			.build()
		)
		.workableCasingModel(
			"gtceu:block/casings/solid/machine_casing_bronze_plated_bricks",
			"tfg:block/steam_bloomery")
	//#endregion

	//#region Large Solar Panels
	//Tier 1
		event.create('large_solar_panel', 'multiblock')
		.regressWhenWaiting(false)
		.rotationState(RotationState.NON_Y_AXIS)
		.generator(true)
		.recipeType('large_solar_panel')
		.noRecipeModifier()
		.appearanceBlock(() => Block.getBlock('tfg:casings/machine_casing_iron_desh'))
		.pattern(definition => FactoryBlockPattern.start()
			.aisle("       S   S       ", "       S   S       ", "       CCCCC       ", "                   ", "                   ", "                   ", "                   ", "                   ", "                   ", "                   ", "                   ", "                   ", "                   ", "                   ")
			.aisle("     S       S     ", "     S       S     ", "    CC       CC    ", "                   ", "                   ", "                   ", "                   ", "                   ", "                   ", "                   ", "                   ", "                   ", "                   ", "                   ")
			.aisle("       S   S       ", "       CCCCC       ", "   CC         CC   ", "                   ", "                   ", "                   ", "                   ", "                   ", "                   ", "                   ", "                   ", "                   ", "                   ", "                   ")
			.aisle("     S       S     ", "    CC       CC    ", "  C             C  ", "                   ", "                   ", "                   ", "                   ", "                   ", "                   ", "                   ", "                   ", "                   ", "                   ", "                   ")
			.aisle("        CCC        ", "   CC         CC   ", " CC             CC ", "                   ", "                   ", "                   ", "                   ", "                   ", "                   ", "                   ", "                   ", "                   ", "                   ", "                   ")
			.aisle(" S S CC     CC S S ", " S C           C S ", " C               C ", "                   ", "                   ", "                   ", "                   ", "                   ", "                   ", "                   ", "                   ", "                   ", "                   ", "                   ")
			.aisle("     C       C     ", "                   ", "                   ", "                   ", "                   ", "                   ", "                   ", "                   ", "                   ", "                   ", "                   ", "                   ", "                   ", "                   ")
			.aisle("S S             S S", "S C             C S", "C                 C", "                   ", "                   ", "                   ", "                   ", "                   ", "                   ", "                   ", "                   ", "                   ", "                   ", "                   ")
			.aisle("    C   FFF   C    ", "  C     B B     C  ", "C       B B       C", "        B B        ", "        B B        ", "        B B        ", "        B B        ", "        B B        ", "        B B        ", "        B B        ", "        EEE        ", "        GGG        ", "        GGG        ", "        GGG        ")
			.aisle("    C   FIF   C    ", "  C      I      C  ", "C        I        C", "         I         ", "         I         ", "         I         ", "         I         ", "         I         ", "         I         ", "         I         ", "        EIE        ", "        GIG        ", "        GKG        ", "        GGG        ")
			.aisle("    C   FHF   C    ", "  C     B B     C  ", "C       B B       C", "        B B        ", "        B B        ", "        B B        ", "        B B        ", "        B B        ", "        B B        ", "        B B        ", "        EEE        ", "        GGG        ", "        GGG        ", "        GGG        ")
			.aisle("S S             S S", "S C             C S", "C                 C", "                   ", "                   ", "                   ", "                   ", "                   ", "                   ", "                   ", "                   ", "                   ", "                   ", "                   ")
			.aisle("     C       C     ", "                   ", "                   ", "                   ", "                   ", "                   ", "                   ", "                   ", "                   ", "                   ", "                   ", "                   ", "                   ", "                   ")
			.aisle(" S S CC     CC S S ", " S C           C S ", " C               C ", "                   ", "                   ", "                   ", "                   ", "                   ", "                   ", "                   ", "                   ", "                   ", "                   ", "                   ")
			.aisle("        CCC        ", "   CC         CC   ", " CC             CC ", "                   ", "                   ", "                   ", "                   ", "                   ", "                   ", "                   ", "                   ", "                   ", "                   ", "                   ")
			.aisle("     S       S     ", "    CC       CC    ", "  C             C  ", "                   ", "                   ", "                   ", "                   ", "                   ", "                   ", "                   ", "                   ", "                   ", "                   ", "                   ")
			.aisle("       S   S       ", "       CCCCC       ", "   CC         CC   ", "                   ", "                   ", "                   ", "                   ", "                   ", "                   ", "                   ", "                   ", "                   ", "                   ", "                   ")
			.aisle("     S       S     ", "     S       S     ", "    CC       CC    ", "                   ", "                   ", "                   ", "                   ", "                   ", "                   ", "                   ", "                   ", "                   ", "                   ", "                   ")
			.aisle("       S   S       ", "       S   S       ", "       CCCCC       ", "                   ", "                   ", "                   ", "                   ", "                   ", "                   ", "                   ", "                   ", "                   ", "                   ", "                   ")
			.where("H", Predicates.controller(Predicates.blocks(definition.get())))
			.where("B", Predicates.blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.StainlessSteel)))
			.where("S", Predicates.blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Steel)))
			.where("C", Predicates.blocks("tfg:casings/machine_casing_blue_solar_panel"))
			.where("E", Predicates.blocks("ad_astra:iron_plateblock"))
			.where("F", Predicates.blocks("tfg:casings/machine_casing_iron_desh")
				.or(Predicates.autoAbilities(definition.getRecipeTypes()))
				.or(Predicates.abilities(PartAbility.MAINTENANCE).setExactLimit(1))
			)
			.where("G", Predicates.blocks("ae2:quartz_glass"))
			.where("I", Predicates.blocks("tfg:casings/machine_casing_iron_desh"))
			.where("K", Predicates.blocks("tfg:reflector"))
			.where(" ", Predicates.any())
			.build()
		)
		.workableCasingModel('tfg:block/casings/machine_casing_iron_desh', 'gtceu:block/multiblock/hpca')

	//Tier 2
		event.create('large_solar_panel_tier2', 'multiblock')
		.regressWhenWaiting(false)
		.rotationState(RotationState.NON_Y_AXIS)
		.generator(true)
		.recipeType('large_solar_panel_tier2')
		.noRecipeModifier()
		.appearanceBlock(() => Block.getBlock('tfg:casings/machine_casing_iron_desh'))
		.pattern(definition => FactoryBlockPattern.start()
			.aisle("          A     A          ", "          A     A          ", "          S     S          ", "          S     S          ", "          CCCCCCC          ", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ")
			.aisle("        A         A        ", "        A         A        ", "        S         S        ", "        S         S        ", "      CCC         CCC      ", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ")
			.aisle("          S     S          ", "          S     S          ", "          S     S          ", "          CCCCCCC          ", "     CC             CC     ", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ")
			.aisle("     A  S         S  A     ", "     A  S         S  A     ", "     S  S         S  S     ", "     S CC         CC S     ", "     C               C     ", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ")
			.aisle("           S   S           ", "           S   S           ", "           CCCCC           ", "      C             C      ", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ")
			.aisle("   A     S       S     A   ", "   A     S       S     A   ", "   S    CC       CC    S   ", "   S CC             CC S   ", "  CC                   CC  ", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ")
			.aisle("           S   S           ", "           CCCCC           ", "       CC         CC       ", "    CC               CC    ", " CC                     CC ", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ")
			.aisle("         S       S         ", "        CC       CC        ", "      C             C      ", "   C                   C   ", " C                       C ", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ")
			.aisle(" A S        CCC        S A ", " A S   CC         CC   S A ", " S S CC             CC S S ", " S C                   C S ", " C                       C ", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ")
			.aisle("     S S CC     CC S S     ", "     S C           C S     ", "     C               C     ", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ")
			.aisle("A S      C       C      S A", "A S                     S A", "S S                     S S", "S C                     C S", "C                         C", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ")
			.aisle("    S S             S S    ", "    S C             C S    ", "    C                 C    ", "  C                     C  ", "C                         C", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ")
			.aisle("        C   III   C        ", "      C     B B     C      ", "    C       B B       C    ", "  C         B B         C  ", "C           B B           C", "            B B            ", "            B B            ", "            B B            ", "            B B            ", "            B B            ", "            DDD            ", "            EEE            ", "            EEE            ", "            EEE            ")
			.aisle("        C   IFI   C        ", "      C      F      C      ", "    C        F        C    ", "  C          F          C  ", "C            F            C", "             F             ", "             F             ", "             F             ", "             F             ", "             F             ", "            DFD            ", "            EFE            ", "            EGE            ", "            EEE            ")
			.aisle("        C   IHI   C        ", "      C     B B     C      ", "    C       B B       C    ", "  C         B B         C  ", "C           B B           C", "            B B            ", "            B B            ", "            B B            ", "            B B            ", "            B B            ", "            DDD            ", "            EEE            ", "            EEE            ", "            EEE            ")
			.aisle("    S S             S S    ", "    S C             C S    ", "    C                 C    ", "  C                     C  ", "C                         C", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ")
			.aisle("A S      C       C      S A", "A S                     S A", "S S                     S S", "S C                     C S", "C                         C", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ")
			.aisle("     S S CC     CC S S     ", "     S C           C S     ", "     C               C     ", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ")
			.aisle(" A S        CCC        S A ", " A S   CC         CC   S A ", " S S CC             CC S S ", " S C                   C S ", " C                       C ", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ")
			.aisle("         S       S         ", "        CC       CC        ", "      C             C      ", "   C                   C   ", " C                       C ", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ")
			.aisle("           S   S           ", "           CCCCC           ", "       CC         CC       ", "    CC               CC    ", " CC                     CC ", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ")
			.aisle("   A     S       S     A   ", "   A     S       S     A   ", "   S    CC       CC    S   ", "   S CC             CC S   ", "  CC                   CC  ", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ")
			.aisle("           S   S           ", "           S   S           ", "           CCCCC           ", "      C             C      ", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ")
			.aisle("     A  S         S  A     ", "     A  S         S  A     ", "     S  S         S  S     ", "     S CC         CC S     ", "     C               C     ", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ")
			.aisle("          S     S          ", "          S     S          ", "          S     S          ", "          CCCCCCC          ", "     CC             CC     ", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ")
			.aisle("        A         A        ", "        A         A        ", "        S         S        ", "        S         S        ", "      CCC         CCC      ", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ")
			.aisle("          A     A          ", "          A     A          ", "          S     S          ", "          S     S          ", "          CCCCCCC          ", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ", "                           ")
			.where("A", Predicates.blocks('gtceu:light_concrete')
				.or(Predicates.blocks('gtceu:polished_light_concrete'))
				.or(Predicates.blocks('gtceu:light_concrete_bricks'))
				.or(Predicates.blocks('gtceu:cracked_light_concrete_bricks'))
				.or(Predicates.blocks('gtceu:mossy_light_concrete_bricks'))
				.or(Predicates.blocks('gtceu:chiseled_light_concrete'))
				.or(Predicates.blocks('gtceu:light_concrete_tile'))
				.or(Predicates.blocks('gtceu:light_concrete_small_tile'))
				.or(Predicates.blocks('gtceu:light_concrete_windmill_a'))
				.or(Predicates.blocks('gtceu:light_concrete_windmill_b'))
				.or(Predicates.blocks('gtceu:small_light_concrete_bricks'))
				.or(Predicates.blocks('gtceu:square_light_concrete_bricks'))
				.or(Predicates.blocks('gtceu:dark_concrete'))
				.or(Predicates.blocks('gtceu:polished_dark_concrete'))
				.or(Predicates.blocks('gtceu:dark_concrete_bricks'))
				.or(Predicates.blocks('gtceu:cracked_dark_concrete_bricks'))
				.or(Predicates.blocks('gtceu:mossy_dark_concrete_bricks'))
				.or(Predicates.blocks('gtceu:chiseled_dark_concrete'))
				.or(Predicates.blocks('gtceu:dark_concrete_tile'))
				.or(Predicates.blocks('gtceu:dark_concrete_small_tile'))
				.or(Predicates.blocks('gtceu:dark_concrete_windmill_a'))
				.or(Predicates.blocks('gtceu:dark_concrete_windmill_b'))
				.or(Predicates.blocks('gtceu:small_dark_concrete_bricks'))
				.or(Predicates.blocks('gtceu:square_dark_concrete_bricks'))
			)
			.where("B", Predicates.blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.TungstenSteel)))
			.where("S", Predicates.blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.Aluminium)))
			.where("C", Predicates.blocks("tfg:casings/machine_casing_green_solar_panel"))
			.where("D", Predicates.blocks("ad_astra:iron_plateblock"))
			.where("E", Predicates.blocks("ae2:quartz_glass"))
			.where("F", Predicates.blocks("tfg:casings/machine_casing_iron_desh"))
			.where("G", Predicates.blocks("tfg:reflector"))
			.where("H", Predicates.controller(Predicates.blocks(definition.get())))
			.where("I", Predicates.blocks("tfg:casings/machine_casing_iron_desh")
				.or(Predicates.autoAbilities(definition.getRecipeTypes()))
				.or(Predicates.abilities(PartAbility.MAINTENANCE).setExactLimit(1))
			)
			.where(" ", Predicates.any())
			.build()
		)
		.workableCasingModel('tfg:block/casings/machine_casing_iron_desh', 'gtceu:block/multiblock/hpca')

	//Tier 3
		event.create('large_solar_panel_tier3', 'multiblock')
		.regressWhenWaiting(false)
		.rotationState(RotationState.NON_Y_AXIS)
		.generator(true)
		.recipeType('large_solar_panel_tier3')
		.recipeModifiers([GTRecipeModifiers.PARALLEL_HATCH])
		.appearanceBlock(() => Block.getBlock('tfg:casings/machine_casing_iron_desh'))
		.pattern(definition => FactoryBlockPattern.start()
			.aisle("             A       A             ", "             A       A             ", "             A       A             ", "             S       S             ", "             S       S             ", "             S       S             ", "             CCCCCCCCC             ", "                                   ", "                                   ", "                                   ", "                                   ", "                                   ", "                                   ", "                                   ")
			.aisle("           A           A           ", "           A           A           ", "           A           A           ", "           S           S           ", "           S           S           ", "           S           S           ", "          CC           CC          ", "                                   ", "                                   ", "                                   ", "                                   ", "                                   ", "                                   ", "                                   ")
			.aisle("              A     A              ", "              A     A              ", "              S     S              ", "              S     S              ", "              S     S              ", "              CCCCCCC              ", "        CCC             CCC        ", "                                   ", "                                   ", "                                   ", "                                   ", "                                   ", "                                   ", "                                   ")
			.aisle("        A   A         A   A        ", "        A   A         A   A        ", "        A   S         S   A        ", "        S   S         S   S        ", "        S   S         S   S        ", "        S CCC         CCC S        ", "        C                 C        ", "                                   ", "                                   ", "                                   ", "                                   ", "                                   ", "                                   ", "                                   ")
			.aisle("      A A     S     S     A A      ", "      A A     S     S     A A      ", "      A S     S     S     S A      ", "      S S     S     S     S S      ", "      S S     CCCCCCC     S S      ", "      S CCC             CCC S      ", "     CC                     CC     ", "                                   ", "                                   ", "                                   ", "                                   ", "                                   ", "                                   ", "                                   ")
			.aisle("       A    S         S    A       ", "       A    S         S    A       ", "       S    S         S    S       ", "       S    S         S    S       ", "       S  CCC         CCC  S       ", "       C                   C       ", "    CC                       CC    ", "                                   ", "                                   ", "                                   ", "                                   ", "                                   ", "                                   ", "                                   ")
			.aisle("    A         S     S         A    ", "    A         S     S         A    ", "    A         S     S         A    ", "    S         CCCCCCC         S    ", "    S    CC             CC    S    ", "    S CC                   CC S    ", "    C                         C    ", "                                   ", "                                   ", "                                   ", "                                   ", "                                   ", "                                   ", "                                   ")
			.aisle("     A   S  S         S  S   A     ", "     A   S  S         S  S   A     ", "     S   S  S         S  S   S     ", "     S   S CC         CC S   S     ", "     S   C               C   S     ", "     CC                     CC     ", "                                   ", "                                   ", "                                   ", "                                   ", "                                   ", "                                   ", "                                   ", "                                   ")
			.aisle("   AA          S   S          AA   ", "   AA          S   S          AA   ", "   AS          CCCCC          SA   ", "   SS     C             C     SS   ", "   SS                         SS   ", "   SC                         CS   ", "  CC                           CC  ", "                                   ", "                                   ", "                                   ", "                                   ", "                                   ", "                                   ", "                                   ")
			.aisle("       S     S       S     S       ", "       S     S       S     S       ", "       S    CC       CC    S       ", "       S CC             CC S       ", "      CC                   CC      ", "    C                         C    ", "  C                             C  ", "                                   ", "                                   ", "                                   ", "                                   ", "                                   ", "                                   ", "                                   ")
			.aisle("               S   S               ", "               CCCCC               ", "           CC         CC           ", "        CC               CC        ", "     CC                     CC     ", "   CC                         CC   ", " CC                             CC ", "                                   ", "                                   ", "                                   ", "                                   ", "                                   ", "                                   ", "                                   ")
			.aisle(" A           S       S           A ", " A          CC       CC          A ", " A        C             C        A ", " S     C                   C     S ", " S   C                       C   S ", " S C                           C S ", " C                               C ", "                                   ", "                                   ", "                                   ", "                                   ", "                                   ", "                                   ", "                                   ")
			.aisle("   A S S        CCC        S S A   ", "   A S S   CC         CC   S S A   ", "   S S S CC             CC S S S   ", "   S S C                   C S S   ", "   S C                       C S   ", "   C                           C   ", "                                   ", "                                   ", "                                   ", "                                   ", "                                   ", "                                   ", "                                   ", "                                   ")
			.aisle("A        S S CC     CC S S        A", "A        S C           C S        A", "A        C               C        A", "S                                 S", "S                                 S", "S                                 S", "C                                 C", "                                   ", "                                   ", "                                   ", "                                   ", "                                   ", "                                   ", "                                   ")
			.aisle("  A S S      C       C      S S A  ", "  A S S                     S S A  ", "  S S S                     S S S  ", "  S S C                     C S S  ", "  S C                         C S  ", "  C                             C  ", "C                                 C", "                                   ", "                                   ", "                                   ", "                                   ", "                                   ", "                                   ", "                                   ")
			.aisle("        S S             S S        ", "        S C             C S        ", "        C                 C        ", "      C                     C      ", "    C                         C    ", "  C                             C  ", "C                                 C", "                                   ", "                                   ", "                                   ", "                                   ", "                                   ", "                                   ", "                                   ")
			.aisle("            C   III   C            ", "          C     B B     C          ", "        C       B B       C        ", "      C         B B         C      ", "    C           B B           C    ", "  C             B B             C  ", "C               B B               C", "                B B                ", "                B B                ", "                B B                ", "                DDD                ", "                EEE                ", "                EEE                ", "                EEE                ")
			.aisle("            C   IFI   C            ", "          C      F      C          ", "        C        F        C        ", "      C          F          C      ", "    C            F            C    ", "  C              F              C  ", "C                F                C", "                 F                 ", "                 F                 ", "                 F                 ", "                DFD                ", "                EFE                ", "                EGE                ", "                EEE                ")
			.aisle("            C   IHI   C            ", "          C     B B     C          ", "        C       B B       C        ", "      C         B B         C      ", "    C           B B           C    ", "  C             B B             C  ", "C               B B               C", "                B B                ", "                B B                ", "                B B                ", "                DDD                ", "                EEE                ", "                EEE                ", "                EEE                ")
			.aisle("        S S             S S        ", "        S C             C S        ", "        C                 C        ", "      C                     C      ", "    C                         C    ", "  C                             C  ", "C                                 C", "                                   ", "                                   ", "                                   ", "                                   ", "                                   ", "                                   ", "                                   ")
			.aisle("  A S S      C       C      S S A  ", "  A S S                     S S A  ", "  S S S                     S S S  ", "  S S C                     C S S  ", "  S C                         C S  ", "  C                             C  ", "C                                 C", "                                   ", "                                   ", "                                   ", "                                   ", "                                   ", "                                   ", "                                   ")
			.aisle("A        S S CC     CC S S        A", "A        S C           C S        A", "A        C               C        A", "S                                 S", "S                                 S", "S                                 S", "C                                 C", "                                   ", "                                   ", "                                   ", "                                   ", "                                   ", "                                   ", "                                   ")
			.aisle("   A S S        CCC        S S A   ", "   A S S   CC         CC   S S A   ", "   S S S CC             CC S S S   ", "   S S C                   C S S   ", "   S C                       C S   ", "   C                           C   ", "                                   ", "                                   ", "                                   ", "                                   ", "                                   ", "                                   ", "                                   ", "                                   ")
			.aisle(" A           S       S           A ", " A          CC       CC          A ", " A        C             C        A ", " S     C                   C     S ", " S   C                       C   S ", " S C                           C S ", " C                               C ", "                                   ", "                                   ", "                                   ", "                                   ", "                                   ", "                                   ", "                                   ")
			.aisle("               S   S               ", "               CCCCC               ", "           CC         CC           ", "        CC               CC        ", "     CC                     CC     ", "   CC                         CC   ", " CC                             CC ", "                                   ", "                                   ", "                                   ", "                                   ", "                                   ", "                                   ", "                                   ")
			.aisle("       S     S       S     S       ", "       S     S       S     S       ", "       S    CC       CC    S       ", "       S CC             CC S       ", "      CC                   CC      ", "    C                         C    ", "  C                             C  ", "                                   ", "                                   ", "                                   ", "                                   ", "                                   ", "                                   ", "                                   ")
			.aisle("   AA          S   S          AA   ", "   AA          S   S          AA   ", "   AS          CCCCC          SA   ", "   SS     C             C     SS   ", "   SS                         SS   ", "   SC                         CS   ", "  CC                           CC  ", "                                   ", "                                   ", "                                   ", "                                   ", "                                   ", "                                   ", "                                   ")
			.aisle("     A   S  S         S  S   A     ", "     A   S  S         S  S   A     ", "     S   S  S         S  S   S     ", "     S   S CC         CC S   S     ", "     S   C               C   S     ", "     CC                     CC     ", "                                   ", "                                   ", "                                   ", "                                   ", "                                   ", "                                   ", "                                   ", "                                   ")
			.aisle("    A         S     S         A    ", "    A         S     S         A    ", "    A         S     S         A    ", "    S         CCCCCCC         S    ", "    S    CC             CC    S    ", "    S CC                   CC S    ", "    C                         C    ", "                                   ", "                                   ", "                                   ", "                                   ", "                                   ", "                                   ", "                                   ")
			.aisle("       A    S         S    A       ", "       A    S         S    A       ", "       S    S         S    S       ", "       S    S         S    S       ", "       S  CCC         CCC  S       ", "       C                   C       ", "    CC                       CC    ", "                                   ", "                                   ", "                                   ", "                                   ", "                                   ", "                                   ", "                                   ")
			.aisle("      A A     S     S     A A      ", "      A A     S     S     A A      ", "      A S     S     S     S A      ", "      S S     S     S     S S      ", "      S S     CCCCCCC     S S      ", "      S CCC             CCC S      ", "     CC                     CC     ", "                                   ", "                                   ", "                                   ", "                                   ", "                                   ", "                                   ", "                                   ")
			.aisle("        A   A         A   A        ", "        A   A         A   A        ", "        A   S         S   A        ", "        S   S         S   S        ", "        S   S         S   S        ", "        S CCC         CCC S        ", "        C                 C        ", "                                   ", "                                   ", "                                   ", "                                   ", "                                   ", "                                   ", "                                   ")
			.aisle("              A     A              ", "              A     A              ", "              S     S              ", "              S     S              ", "              S     S              ", "              CCCCCCC              ", "        CCC             CCC        ", "                                   ", "                                   ", "                                   ", "                                   ", "                                   ", "                                   ", "                                   ")
			.aisle("           A           A           ", "           A           A           ", "           A           A           ", "           S           S           ", "           S           S           ", "           S           S           ", "          CC           CC          ", "                                   ", "                                   ", "                                   ", "                                   ", "                                   ", "                                   ", "                                   ")
			.aisle("             A       A             ", "             A       A             ", "             A       A             ", "             S       S             ", "             S       S             ", "             S       S             ", "             CCCCCCCCC             ", "                                   ", "                                   ", "                                   ", "                                   ", "                                   ", "                                   ", "                                   ")
			.where("A", Predicates.blocks('gtceu:light_concrete')
				.or(Predicates.blocks('gtceu:polished_light_concrete'))
				.or(Predicates.blocks('gtceu:light_concrete_bricks'))
				.or(Predicates.blocks('gtceu:cracked_light_concrete_bricks'))
				.or(Predicates.blocks('gtceu:mossy_light_concrete_bricks'))
				.or(Predicates.blocks('gtceu:chiseled_light_concrete'))
				.or(Predicates.blocks('gtceu:light_concrete_tile'))
				.or(Predicates.blocks('gtceu:light_concrete_small_tile'))
				.or(Predicates.blocks('gtceu:light_concrete_windmill_a'))
				.or(Predicates.blocks('gtceu:light_concrete_windmill_b'))
				.or(Predicates.blocks('gtceu:small_light_concrete_bricks'))
				.or(Predicates.blocks('gtceu:square_light_concrete_bricks'))
				.or(Predicates.blocks('gtceu:dark_concrete'))
				.or(Predicates.blocks('gtceu:polished_dark_concrete'))
				.or(Predicates.blocks('gtceu:dark_concrete_bricks'))
				.or(Predicates.blocks('gtceu:cracked_dark_concrete_bricks'))
				.or(Predicates.blocks('gtceu:mossy_dark_concrete_bricks'))
				.or(Predicates.blocks('gtceu:chiseled_dark_concrete'))
				.or(Predicates.blocks('gtceu:dark_concrete_tile'))
				.or(Predicates.blocks('gtceu:dark_concrete_small_tile'))
				.or(Predicates.blocks('gtceu:dark_concrete_windmill_a'))
				.or(Predicates.blocks('gtceu:dark_concrete_windmill_b'))
				.or(Predicates.blocks('gtceu:small_dark_concrete_bricks'))
				.or(Predicates.blocks('gtceu:square_dark_concrete_bricks'))
			)
			.where("B", Predicates.blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.RhodiumPlatedPalladium)))
			.where("S", Predicates.blocks(ChemicalHelper.getBlock(TagPrefix.frameGt, GTMaterials.StainlessSteel)))
			.where("C", Predicates.blocks("tfg:casings/machine_casing_red_solar_panel"))
			.where("D", Predicates.blocks("ad_astra:iron_plateblock"))
			.where("E", Predicates.blocks("ae2:quartz_glass"))
			.where("F", Predicates.blocks("tfg:casings/machine_casing_iron_desh"))
			.where("G", Predicates.blocks("tfg:reflector"))
			.where("H", Predicates.controller(Predicates.blocks(definition.get())))
			.where("I", Predicates.blocks("tfg:casings/machine_casing_iron_desh")
				.or(Predicates.autoAbilities(definition.getRecipeTypes()))
				.or(Predicates.abilities(PartAbility.MAINTENANCE).setExactLimit(1))
				.or(Predicates.abilities(PartAbility.PARALLEL_HATCH).setMaxGlobalLimited(1))
			)
			.where(" ", Predicates.any())
			.build()
		)
		.workableCasingModel('tfg:block/casings/machine_casing_iron_desh', 'gtceu:block/multiblock/hpca')


	//#endregion

	//#region Nuclear Multiblocks

	// Nuclear Fuel Factory

	event.create('nuclear_fuel_factory', 'multiblock')
		.rotationState(RotationState.NON_Y_AXIS)
		.recipeType('nuclear_fuel_factory')
        .recipeModifiers([GTRecipeModifiers.PARALLEL_HATCH, GTRecipeModifiers.ELECTRIC_OVERCLOCK.apply(OverclockingLogic.NON_PERFECT_OVERCLOCK)])
		.appearanceBlock(() => Block.getBlock('gtceu:atomic_casing'))
		.pattern(definition => FactoryBlockPattern.start()
			.aisle('RLLLR', 'I   I', 'I   I', 'I   I', 'RLLLR')
			.aisle('LRRRL', ' KPK ', ' KPK ', ' KPK ', 'LRRRL')
			.aisle('LRSRL', ' PCP ', ' PCP ', ' PCP ', 'LRSRL')
			.aisle('LRRRL', ' KPK ', ' KPK ', ' KPK ', 'LRRRL')
			.aisle('RLXLR', 'I   I', 'I   I', 'I   I', 'RLLLR')
			.where('X', Predicates.controller(Predicates.blocks(definition.get())))
			.where('R', Predicates.blocks('gtceu:atomic_casing'))
			.where('I', Predicates.blocks('gtceu:stainless_steel_frame'))
			.where('G', Predicates.blocks('gtceu:high_temperature_smelting_casing'))
			.where('P', Predicates.blocks('gtceu:laminated_glass'))
			.where('S', Predicates.blocks(GTBlocks.CASING_ENGINE_INTAKE.get()))
			.where('K', Predicates.blocks('gtceu:high_temperature_smelting_casing'))
			.where('C', Predicates.blocks(GTBlocks.COIL_RTMALLOY.get()))
			.where('L', Predicates.blocks('gtceu:atomic_casing')
				.or(Predicates.abilities(PartAbility.IMPORT_ITEMS).setPreviewCount(1))
				.or(Predicates.abilities(PartAbility.EXPORT_ITEMS).setPreviewCount(1))
				.or(Predicates.abilities(PartAbility.MAINTENANCE).setExactLimit(1))
				.or(Predicates.abilities(PartAbility.IMPORT_FLUIDS).setPreviewCount(1))
				.or(Predicates.abilities(PartAbility.INPUT_ENERGY).setExactLimit(1))
				.or(Predicates.abilities(PartAbility.PARALLEL_HATCH).setExactLimit(1)))
			.where('#', Predicates.air())
			.where(' ', Predicates.any())
			.build()
		)
		.workableCasingModel(
			'gtceu:block/casings/gcym/atomic_casing',
			'gtceu:block/machines/fermenter')

	// Nuclear Heat Exchanger

	event.create('heat_exchanger', 'multiblock')
		.rotationState(RotationState.NON_Y_AXIS)
		.recipeType('heat_exchanger')
        .recipeModifiers([GTRecipeModifiers.OC_PERFECT_SUBTICK])
		.appearanceBlock(() => Block.getBlock('gtceu:high_temperature_smelting_casing'))
		.pattern(definition => FactoryBlockPattern.start()
			.aisle('       ','BBBBBBB','BCCCCCB','BBBBBBB','       ')
			.aisle('AAAAAAA','A#####A','BDDDDDB','A#####A','AAAAAAA')
			.aisle('AFFFFFA','B#####B','LEEEEEL','B#####B','AFFFFFA')
			.aisle('AAAAAAA','A#####A','BDDDDDB','A#####A','AAAAAAA')
			.aisle('       ','BBBXBBB','BCCCCCB','BBBMBBB','       ')
			.where('X', Predicates.controller(Predicates.blocks(definition.get())))
			.where('A', Predicates.blocks('gtceu:atomic_casing'))
			.where('B', Predicates.blocks('gtceu:high_temperature_smelting_casing')
				.or(Predicates.abilities(PartAbility.INPUT_ENERGY).setExactLimit(1)))
			.where('C', Predicates.blocks('gtceu:laminated_glass'))
			.where('D', Predicates.blocks(GTBlocks.FIREBOX_TITANIUM.get()))
			.where('E', Predicates.blocks(GTBlocks.CASING_TITANIUM_PIPE.get()))
			.where('F', Predicates.blocks(GTBlocks.CASING_ENGINE_INTAKE.get()))
			.where('L', Predicates.blocks('gtceu:high_temperature_smelting_casing')
				.or(Predicates.abilities(PartAbility.IMPORT_FLUIDS_4X).setExactLimit(1))
				.or(Predicates.abilities(PartAbility.EXPORT_FLUIDS_4X).setExactLimit(1)))
			.where('M', Predicates.abilities(PartAbility.MAINTENANCE).setExactLimit(1)
				.or(Predicates.blocks('gtceu:high_temperature_smelting_casing')))
			.where('#', Predicates.air())
			.where(' ', Predicates.any())
			.build()
		)
		.workableCasingModel(
			"gtceu:block/casings/gcym/high_temperature_smelting_casing",
			"gtceu:block/machines/fluid_heater")

	// Nuclear Fission Reactor

	event.create('fission_reactor', 'multiblock')
		.rotationState(RotationState.NON_Y_AXIS)
		.recipeType('fission_reactor')
        .recipeModifiers([GTRecipeModifiers.OC_PERFECT_SUBTICK])
		.appearanceBlock(() => Block.getBlock('gtceu:atomic_casing'))
		.pattern(definition => FactoryBlockPattern.start()
			.aisle('LLLLL','ABCBA','ABCBA','ABCBA','ABCBA','ABCBA','LLLLL')
			.aisle('LAAAL','BE#EB','BE#EB','BE#EB','BE#EB','BE#EB','LAAAL')
			.aisle('LAAAL','C#D#C','C#D#C','C#D#C','C#D#C','C#D#C','LAAAL')
			.aisle('LAAAL','BE#EB','BE#EB','BE#EB','BE#EB','BE#EB','LAAAL')
			.aisle('LLXLL','ABCBA','ABCBA','ABCBA','ABCBA','ABCBA','LLLLL')
			.where('X', Predicates.controller(Predicates.blocks(definition.get())))
			.where('A', Predicates.blocks('gtceu:high_temperature_smelting_casing'))
			.where('B', Predicates.blocks('gtceu:atomic_casing'))
			.where('C', Predicates.blocks('gtceu:laminated_glass'))
			.where('D', Predicates.blocks(GTBlocks.FIREBOX_TITANIUM.get()))
			.where('E', Predicates.blocks('gtceu:titanium_frame'))
			.where('F', Predicates.blocks(GTBlocks.CASING_ENGINE_INTAKE.get()))
			.where('L', Predicates.blocks('gtceu:atomic_casing').setMinGlobalLimited(10)
				.or(Predicates.abilities(PartAbility.IMPORT_FLUIDS).setPreviewCount(1))
				.or(Predicates.abilities(PartAbility.EXPORT_FLUIDS).setPreviewCount(1))
				.or(Predicates.abilities(PartAbility.IMPORT_ITEMS).setPreviewCount(1))
				.or(Predicates.abilities(PartAbility.INPUT_ENERGY).setExactLimit(1))
				.or(Predicates.abilities(PartAbility.MAINTENANCE).setExactLimit(1)))
			.where('#', Predicates.air())
			.where(' ', Predicates.any())
			.build()
		)
		.workableCasingModel(
			"gtceu:block/casings/gcym/atomic_casing",
			"gtceu:block/machines/electromagnetic_separator")

	//#endregion

	//#region Evaporation Tower

	event.create('evaporation_tower', 'multiblock')
		.rotationState(RotationState.NON_Y_AXIS)
		.recipeType('evaporation_tower')
		.noRecipeModifier()
		.appearanceBlock(() => Block.getBlock('tfg:casings/machine_casing_stainless_evaporation'))
		.pattern(definition => FactoryBlockPattern.start()
			.aisle('ZBZ','CCC','CCC','CCC',' A ')
			.aisle('BAB','C#C','C#C','C#C','AAA')
			.aisle('ZXZ','CCC','CCC','CCC',' A ')
			.where('X', Predicates.controller(Predicates.blocks(definition.get())))
			.where('A', Predicates.blocks('tfg:casings/machine_casing_stainless_evaporation'))
			.where('B', Predicates.blocks('tfg:casings/machine_casing_stainless_evaporation')
				.or(Predicates.abilities(PartAbility.IMPORT_FLUIDS).setMaxGlobalLimited(1).setPreviewCount(1))
				.or(Predicates.abilities(PartAbility.EXPORT_ITEMS).setMaxGlobalLimited(1).setPreviewCount(1))
				.or(Predicates.abilities(PartAbility.INPUT_ENERGY).setExactLimit(1)))
			.where('C', Predicates.blocks('tfg:casings/machine_casing_stainless_evaporation')
				.or(Predicates.abilities(PartAbility.EXPORT_FLUIDS).setPreviewCount(1))
				.or(Predicates.abilities(PartAbility.MAINTENANCE).setExactLimit(1)))
			.where('Z', Predicates.blocks('gtceu:aluminium_frame'))
			.where('#', Predicates.air())
			.where(' ', Predicates.any())
			.build()
		)
		.workableCasingModel(
			'gtceu:block/casings/solid/machine_casing_stainless_evaporation',
			'gtceu:block/multiblock/distillation_tower')

	//#endregion
	
	//#region Ore Line

	// Ostrum Harvester

	event.create('ostrum_harvester', 'multiblock')
		.machine((holder) => new CoilWorkableElectricMultiblockMachine(holder))
		.rotationState(RotationState.NON_Y_AXIS)
		.recipeType('ostrum_harvester')
		.recipeModifiers([GTRecipeModifiers.OC_NON_PERFECT, (machine, recipe) => GTRecipeModifiers.crackerOverclock(machine, recipe)])
		.appearanceBlock(() => Block.getBlock('gtceu:nonconducting_casing'))
		.pattern(definition => FactoryBlockPattern.start()
			.aisle('     ' ,'A   A', 'AAAAA', 'ACCCA', 'AAEAA', ' AAA ')
			.aisle('     ' ,'     ', 'BBBBB', 'B   B', 'BB BB', ' BFB ')
			.aisle('     ' ,'     ', 'ADDDA', 'D   D', 'A   A', ' BFB ')
			.aisle('  G  ' ,'     ', 'ADDDA', 'D   D', 'A   A', ' BFB ')
			.aisle('     ' ,'     ', 'ADDDA', 'D   D', 'A   A', ' BFB ')
			.aisle('     ' ,'     ', 'BBBBB', 'B   B', 'BB BB', ' BFB ')
			.aisle('     ' ,'A   A', 'AAAAA', 'ACXCA', 'AACAA', ' AAA ')
			.where('X', Predicates.controller(Predicates.blocks(definition.get())))
			.where('A', Predicates.blocks('gtceu:secure_maceration_casing'))
			.where('B', Predicates.blocks('gtceu:nonconducting_casing'))
			.where('C', Predicates.blocks('gtceu:nonconducting_casing')
				.or(Predicates.abilities(PartAbility.IMPORT_FLUIDS).setMaxGlobalLimited(1).setPreviewCount(1))
				.or(Predicates.abilities(PartAbility.EXPORT_ITEMS).setMaxGlobalLimited(1).setPreviewCount(1))
				.or(Predicates.abilities(PartAbility.INPUT_ENERGY).setMaxGlobalLimited(2).setPreviewCount(2))
				.or(Predicates.abilities(PartAbility.MAINTENANCE).setExactLimit(1).setPreviewCount(1)))
			.where('D', Predicates.blocks('tfg:casings/machine_casing_vacuum_engine_intake'))
			.where('E', Predicates.blocks('gtceu:nonconducting_casing')
				.or(Predicates.abilities(PartAbility.MUFFLER).setExactLimit(1).setPreviewCount(1)))
			.where('F', Predicates.heatingCoils())
			.where('G', Predicates.blocks('tfg:spice'))
			.where('#', Predicates.air())
			.where(' ', Predicates.any())
			.build()
		)
		.workableCasingModel(
			'gtceu:block/casings/gcym/nonconducting_casing',
			'gtceu:block/multiblock/distillation_tower')

	// Moon Harvester

	event.create('moon_dust_harvester', 'multiblock')
		.machine((holder) => new CoilWorkableElectricMultiblockMachine(holder))
		.rotationState(RotationState.NON_Y_AXIS)
		.recipeType('moon_dust_harvester')
		.recipeModifiers([GTRecipeModifiers.OC_NON_PERFECT, (machine, recipe) => GTRecipeModifiers.crackerOverclock(machine, recipe)])
		.appearanceBlock(() => Block.getBlock('gtceu:nonconducting_casing'))
		.pattern(definition => FactoryBlockPattern.start()
			.aisle('A   A', 'AAAAA', 'ACCCA', 'AAEAA', ' AAA ')
			.aisle('     ', 'BBBBB', 'B   B', 'BB BB', ' BFB ')
			.aisle('     ', 'ADDDA', 'D   D', 'A   A', ' BFB ')
			.aisle('     ', 'ADDDA', 'D   D', 'A   A', ' BFB ')
			.aisle('     ', 'ADDDA', 'D   D', 'A   A', ' BFB ')
			.aisle('     ', 'BBBBB', 'B   B', 'BB BB', ' BFB ')
			.aisle('A   A', 'AAAAA', 'ACXCA', 'AACAA', ' AAA ')
			.where('X', Predicates.controller(Predicates.blocks(definition.get())))
			.where('A', Predicates.blocks('tfg:casings/machine_casing_iron_desh'))
			.where('B', Predicates.blocks('gtceu:nonconducting_casing'))
			.where('C', Predicates.blocks('gtceu:nonconducting_casing')
				.or(Predicates.abilities(PartAbility.IMPORT_ITEMS).setMaxGlobalLimited(1).setPreviewCount(1))
				.or(Predicates.abilities(PartAbility.EXPORT_ITEMS).setMaxGlobalLimited(1).setPreviewCount(1))
				.or(Predicates.abilities(PartAbility.INPUT_ENERGY).setMinGlobalLimited(1).setMaxGlobalLimited(2).setPreviewCount(1))
				.or(Predicates.abilities(PartAbility.MAINTENANCE).setExactLimit(1).setPreviewCount(1)))
			.where('D', Predicates.blocks('tfg:casings/machine_casing_vacuum_engine_intake'))
			.where('E', Predicates.blocks('gtceu:nonconducting_casing'))
			.where('F', Predicates.heatingCoils())
			.where('#', Predicates.air())
			.where(' ', Predicates.any())
			.build()
		)
		.workableCasingModel(
			'gtceu:block/casings/gcym/nonconducting_casing',
			'gtceu:block/multiblock/distillation_tower')

	// Extraterrestrial Ore Fabricator

	event.create('extraterrestrial_ore_fabricator', 'multiblock')
		.rotationState(RotationState.NON_Y_AXIS)
		.recipeType('extraterrestrial_ore_fabricator')
        .recipeModifiers([GTRecipeModifiers.PARALLEL_HATCH, GTRecipeModifiers.OC_NON_PERFECT])
		.appearanceBlock(() => Block.getBlock('tfg:casings/machine_casing_mars'))
		.pattern(definition => FactoryBlockPattern.start()
			.aisle('AAAAAAAAA', 'AAAAAAAAA', 'AAAAAAAAA', '         ', '         ' )
			.aisle('BAAAAAAAA', 'B#######D', 'BBBBBBBAA', ' BCCCB   ', ' BBBBB   ' )
			.aisle('AAAAAAAAA', 'A#######D', 'BB###BBGA', ' C###C   ', ' BBHBB   ' )
			.aisle('BEBEBEAAA', 'BEBEBEA#D', 'BBBBBBBAA', ' BCCCB   ', ' BBBBB   ' )
			.aisle('A#####AFA', 'A#####AXA', 'AAAAAAAFA', '         ', '         ' )
			.where('X', Predicates.controller(Predicates.blocks(definition.get())))
			.where('A', Predicates.blocks('tfg:casings/machine_casing_mars')
				.or(Predicates.abilities(PartAbility.INPUT_ENERGY).setMinGlobalLimited(1).setMaxGlobalLimited(2)))
			.where('B', Predicates.blocks('gtceu:high_temperature_smelting_casing'))
			.where('C', Predicates.blocks('tfg:casings/machine_casing_vacuum_engine_intake'))
			.where('D', Predicates.blocks('gtceu:heat_vent'))
			.where('E', Predicates.blocks('tfg:casings/machine_casing_mars')
				.or(Predicates.abilities(PartAbility.IMPORT_FLUIDS).setMaxGlobalLimited(6)))
			.where('F', Predicates.blocks('tfg:casings/machine_casing_mars')
				.or(Predicates.abilities(PartAbility.MAINTENANCE).setExactLimit(1)))
			.where('G', Predicates.abilities(PartAbility.MUFFLER).setExactLimit(1))
			.where('H', Predicates.abilities(PartAbility.EXPORT_ITEMS).setExactLimit(1))
			.where('#', Predicates.air())
			.where(' ', Predicates.any())
			.build()
		)
		.shapeInfo(controller => MultiblockShapeInfo.builder()
			.aisle('KKAAAAAAA', 'AAAAAAAAA', 'AAAAAAAAA', '         ', '         ' )
			.aisle('BAAAAAAAA', 'B       D', 'BBBBBBBAA', ' BCCCB   ', ' BBBBB   ' )
			.aisle('AAAAAAAAA', 'A       D', 'BB   BBGA', ' C   C   ', ' BBHBB   ' )
			.aisle('BEBEBEAAA', 'BEBEBEA#D', 'BBBBBBBAA', ' BCCCB   ', ' BBBBB   ' )
			.aisle('A     AMA', 'A     AXA', 'AAAAAAAAA', '         ', '         ' )
			.where('X', controller, Direction.SOUTH)
			.where('A', Block.getBlock('tfg:casings/machine_casing_mars'))
			.where('B', Block.getBlock('gtceu:high_temperature_smelting_casing'))
			.where('C', Block.getBlock('tfg:casings/machine_casing_vacuum_engine_intake'))
			.where('D', Block.getBlock('gtceu:heat_vent'))
			.where('E', GTMachines.FLUID_IMPORT_HATCH[GTValues.EV], Direction.SOUTH)
			.where('G', GTMachines.MUFFLER_HATCH[GTValues.LV], Direction.UP)
			.where('H', GTMachines.ITEM_EXPORT_BUS[GTValues.EV], Direction.UP)
			.where('M', GTMachines.AUTO_MAINTENANCE_HATCH, Direction.SOUTH)
			.where('K', GTMachines.ENERGY_INPUT_HATCH[GTValues.HV], Direction.NORTH)
			.where(' ', Block.getBlock('minecraft:air'))
			.build()
		)

		.workableCasingModel(
			'tfg:block/casings/machine_casing_mars',
			'gtceu:block/machines/thermal_centrifuge')

}