Fix and Improve Custom Multis (#483)

Adds Front Overlays back
Fix Muffler Hatch not being allowed everywhere (multiverse)
Adds Maintenance and Min Casing Requirements to all multis
Add distinct mode to some multis

Note: the HM crafting recipe for naq reactors has been removed, as the new assembly line recipe added applies to both NM and HM.

Fixes #504
Fixes #505
Fixes #513

[EXPAND]
[[messages]]
messageTitle = "Improve Custom Multis"
messageBody = """
  [COMBINE]
    commits = [\"bd58b9072f45d647734ae66168cbd27bf9b2f220\"]
  [COMBINE]
  """

[[messages]]
messageTitle = "Fix Custom Multis"
messageBody = """
  [BUG]

  [IGNORE]
    checks = { compareNot = \"1.7-alpha-1\" }
  [IGNORE]

  [DETAILS]
    details = [
      \"Fixes Multiverse Projector Muffler Hatch Issues\",
      \"Fixes Naquadah Reactors\"
    ]
  [DETAILS]
  """
[EXPAND]

[FIXUP]
[[fixes]]
sha = "bd58b9072f45d647734ae66168cbd27bf9b2f220"
newTitle = "Update GT and Related Mods for 1.7"
newBody = """
  [EXPAND]
  [[messages]]
    messageTitle = \"Update GT to 2.7.4\"
    messageBody = \"\"\"
      [BREAKING]
      [DETAILS]
      details = [
        \\"**Lots of Recipes have been moved to the Assembly Line, and now require Assembly Line Research.**\\",
        \\"Adds Assembly Line Research\\",
        \\"Adds ME Hatches and Buses, for combining Multiblocks with AE Networks\\",
        \\"Adds Filtered Output Hatches\\",
        \\"Adds EU Multiblock Power Storage\\",
        \\"Adds Multiblock Transformer and Laser Power Transfer\\",
        \\"Adds Long Distance Pipes\\",
        \\"Creating Waypoints in the Prospector\\",
        \\"Fixing many bugs\\",
        \\"And many more!\\"
      ]
      [DETAILS]
    \"\"\"

  [[messages]]
    messageTitle = \"Multiblock Changes\"
    messageBody = \"\"\"
      [BREAKING]
      [DETAILS]
      details = [
        \\"Multiblocks accept a new **maximum** of 2 Energy Hatches.\\",
        \\"All Custom Multiblocks, such as Naquadah Reactors and Multiverse Projectors, now have **minimum casing requirements** and a **maintenance hatch**.\\",
        \\"Some Custom Multiblocks now have Distinct Mode\\",
        \\"All Custom Multiblocks now have custom Front Overlays\\",
        \\"Reworked & Improved Multiblock UIs\\"
      ]
      [DETAILS]
    \"\"\"
  [EXPAND]
  """
[FIXUP]
This commit is contained in:
Integer Limit 2023-11-09 09:21:58 +11:00 committed by IntegerLimit
parent 9fc71696fc
commit 0da5fe0971
10 changed files with 288 additions and 308 deletions

View File

@ -0,0 +1,21 @@
import gregtech.api.capability.impl.MultiblockFuelRecipeLogic
import gregtech.api.metatileentity.multiblock.RecipeMapMultiblockController
import gregtech.api.GTValues
public class NaqRecipeLogic extends MultiblockFuelRecipeLogic {
public NaqRecipeLogic(RecipeMapMultiblockController tileEntity) {
super(tileEntity)
}
@Override
public int getParallelLimit() {
// No Parallel for Naq Reactors
return 1
}
@Override
public boolean isAllowOverclocking() {
return false;
}
}

View File

@ -0,0 +1,153 @@
import gregtech.api.metatileentity.multiblock.FuelMultiblockController
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.common.blocks.BlockMetalCasing.MetalCasingType
import gregtech.common.blocks.MetaBlocks
import gregtech.api.recipes.RecipeMap
import net.minecraft.block.state.IBlockState
import gregicality.multiblocks.api.render.GCYMTextures
import gregtech.client.renderer.texture.Textures
import gregtech.api.metatileentity.multiblock.MultiblockAbility
import gregicality.multiblocks.common.block.GCYMMetaBlocks
import gregicality.multiblocks.common.block.blocks.BlockLargeMultiblockCasing
import gregtech.common.blocks.MetaBlocks
import gregtech.common.blocks.BlockGlassCasing
import net.minecraft.util.text.ITextComponent
import net.minecraft.util.text.Style
import net.minecraft.util.text.TextComponentTranslation
import net.minecraft.util.text.TextFormatting
import net.minecraft.util.text.event.HoverEvent
import gregtech.api.util.TextFormattingUtil
import gregtech.api.util.GTUtility
import gregtech.api.GTValues
import net.minecraft.item.ItemStack
import net.minecraft.world.World
import gregtech.client.utils.TooltipHelper
import net.minecraftforge.fml.relauncher.Side
import net.minecraftforge.fml.relauncher.SideOnly
public class NaquadahReactor extends FuelMultiblockController {
public final int numSpatial
public final IBlockState bottomFiller
public final IBlockState topFiller
public final int tier
public static final int AMP = 3
NaquadahReactor(ResourceLocation metaTileEntityId, RecipeMap recipeMap, int tier, int numSpatial, IBlockState bottomFiller, IBlockState topFiller) {
super(metaTileEntityId, recipeMap, tier)
this.tier = tier
this.numSpatial = numSpatial
this.bottomFiller = bottomFiller
this.topFiller = topFiller
this.recipeMapWorkable = new NaqRecipeLogic(this)
}
@Override
MetaTileEntity createMetaTileEntity(IGregTechTileEntity tileEntity) {
return new NaquadahReactor(metaTileEntityId, recipeMap, tier, numSpatial, bottomFiller, topFiller)
}
@Override
protected BlockPattern createStructurePattern() {
String[] aisle1 = new String[this.numSpatial + 2]
String[] aisle2 = new String[this.numSpatial + 2]
String[] aisle3 = new String[this.numSpatial + 2]
aisle1[0] = "CCC"
aisle2[0] = "CCC"
aisle3[0] = "CSC"
// Loop for numSpatial times, starting from index 1, adding spatials to outside aisles
for (int i = 1; i <= numSpatial; i++) {
aisle1[i] = "PGP"
aisle3[i] = "PGP"
}
// Loop for numSpatial - 1 times, starting from index 1, adding bottomFillers to inside aisle
for (int i = 1; i < numSpatial; i++) {
aisle2[i] = "GBG"
}
// Add top filler
aisle2[numSpatial] = "GTG"
aisle1[numSpatial + 1] = "CCC"
aisle2[numSpatial + 1] = "CCC"
aisle3[numSpatial + 1] = "CCC"
return FactoryBlockPattern.start()
.aisle(aisle1)
.aisle(aisle2)
.aisle(aisle3)
.where('S' as char, selfPredicate())
.where('G' as char, states(getGlassState()))
.where('P' as char, states(blockstate('appliedenergistics2:spatial_pylon'))) // Blockstate works here with no variants
.where('T' as char, states(this.topFiller))
.where('B' as char, states(this.bottomFiller))
.where('C' as char, states(getCasingState()).setMinGlobalLimited(10)
.or(abilities(MultiblockAbility.OUTPUT_ENERGY).setExactLimit(1))
.or(autoAbilities(false, true, true, true, false, false, false)))
.build()
}
@Override
@SideOnly(Side.CLIENT)
ICubeRenderer getBaseTexture(IMultiblockPart sourcePart) {
return GCYMTextures.MIXER_CASING
}
@Override
@SideOnly(Side.CLIENT)
protected ICubeRenderer getFrontOverlay() {
return Textures.FUSION_REACTOR_OVERLAY
}
/* Would use blockstate handler, but does not work with special variants and types here? */
public IBlockState getCasingState() {
return GCYMMetaBlocks.LARGE_MULTIBLOCK_CASING.getState(BlockLargeMultiblockCasing.CasingType.MIXER_CASING)
}
public IBlockState getGlassState() {
return MetaBlocks.TRANSPARENT_CASING.getState(BlockGlassCasing.CasingType.FUSION_GLASS)
}
@Override
@SideOnly(Side.CLIENT)
protected void addDisplayText(List<ITextComponent> textList) {
if (!isStructureFormed()) {
ITextComponent tooltip = new TextComponentTranslation("gregtech.multiblock.invalid_structure.tooltip")
tooltip.setStyle(new Style().setColor(TextFormatting.GRAY))
textList.add(new TextComponentTranslation("gregtech.multiblock.invalid_structure")
.setStyle(new Style().setColor(TextFormatting.RED)
.setHoverEvent(new HoverEvent(HoverEvent.Action.SHOW_TEXT, tooltip))))
}
else {
long produces = GTValues.V[tier] * AMP
String voltageName = GTValues.VNF[GTUtility.getFloorTierByVoltage(produces)] + TextFormatting.RESET
textList.add(new TextComponentTranslation("gregtech.multiblock.max_energy_per_tick", TextFormattingUtil.formatNumbers(produces), voltageName))
if (!recipeMapWorkable.isWorkingEnabled()) {
textList.add(new TextComponentTranslation("gregtech.multiblock.work_paused"))
} else if (recipeMapWorkable.isActive()) {
textList.add(new TextComponentTranslation("gregtech.multiblock.running"))
int currentProgress = (int) (recipeMapWorkable.getProgressPercent() * 100)
textList.add(new TextComponentTranslation("gregtech.multiblock.progress", currentProgress))
} else {
textList.add(new TextComponentTranslation("gregtech.multiblock.idling"))
}
}
}
@Override
@SideOnly(Side.CLIENT)
public void addInformation(ItemStack stack, World player, List<String> tooltip, boolean advanced) {
super.addInformation(stack, player, tooltip, advanced)
// Must not import I18n as not available on server
// Must call .toString() otherwise groovy tries to find an override for the + operator
tooltip.add(net.minecraft.client.resources.I18n.format("tooltip.contenttweaker.naquadah_reactor.produces", AMP, GTValues.VNF[tier] + TextFormatting.RESET.toString()))
tooltip.add(TooltipHelper.RAINBOW_SLOW.toString() + net.minecraft.client.resources.I18n.format("gui.contenttweaker.naquadah_reactor.overclock"))
}
}

View File

@ -0,0 +1,7 @@
import gregtech.api.recipes.RecipeMap
import gregtech.api.recipes.builders.*
public class NomiRecipeMaps {
public static RecipeMap<FuelRecipeBuilder> NAQUADAH_REACTOR_1;
public static RecipeMap<FuelRecipeBuilder> NAQUADAH_REACTOR_2;
}

View File

@ -0,0 +1,20 @@
import gregtech.common.metatileentities.MetaTileEntities
import gregtech.api.recipes.RecipeMap
import io.sommers.packmode.PMConfig
int naqFirstID
if (PMConfig.getPackMode() == "normal") {
naqFirstID = 32004
} else {
naqFirstID = 32003
}
/* Blockstate handler with variants works here */
MetaTileEntities.registerMetaTileEntity(naqFirstID, new NaquadahReactor(new ResourceLocation("multiblocktweaker", "naquadah_reactor_1"), RecipeMap.getByName("naquadah_reactor_1"), 7, 3, blockstate('gregtech:meta_block_compressed_8', 'variant=gregtech__duranium'), blockstate('extendedcrafting:trimmed', 'variant=ultimate')))
if (PMConfig.getPackMode() == "normal") {
MetaTileEntities.registerMetaTileEntity(++naqFirstID, new NaquadahReactor(new ResourceLocation("multiblocktweaker", "naquadah_reactor_2"), RecipeMap.getByName("naquadah_reactor_2"), 8, 4, blockstate('gregtech:meta_block_compressed_27', 'variant=gregtech__ruthenium_trinium_americium_neutronate'), blockstate('extendedcrafting:storage', 'variant=ultimate')))
} else {
MetaTileEntities.registerMetaTileEntity(++naqFirstID, new NaquadahReactor(new ResourceLocation("multiblocktweaker", "naquadah_reactor_2"), RecipeMap.getByName("naquadah_reactor_2"), 8, 4, blockstate('gregtech:meta_block_compressed_2006', 'variant=gregtech__taranium'), blockstate('extendedcrafting:storage', 'variant=ultimate')))
}

View File

@ -0,0 +1,14 @@
import gregtech.api.recipes.RecipeMap
import gregtech.api.recipes.builders.*
import gregtech.core.sound.GTSoundEvents
import gregtech.api.gui.GuiTextures
NomiRecipeMaps.NAQUADAH_REACTOR_1 = new RecipeMap<>("naquadah_reactor_1", 1, 1, 0, 0, new FuelRecipeBuilder(), false)
.setSlotOverlay(false, false, GuiTextures.ATOMIC_OVERLAY_1).setSlotOverlay(false, true, GuiTextures.ATOMIC_OVERLAY_1)
.setSlotOverlay(true, false, GuiTextures.ATOMIC_OVERLAY_1).setSlotOverlay(true, true, GuiTextures.ATOMIC_OVERLAY_1)
.setSound(GTSoundEvents.TURBINE);
NomiRecipeMaps.NAQUADAH_REACTOR_2 = new RecipeMap<>("naquadah_reactor_2", 1, 1, 0, 0, new FuelRecipeBuilder(), false)
.setSlotOverlay(false, false, GuiTextures.ATOMIC_OVERLAY_1).setSlotOverlay(false, true, GuiTextures.ATOMIC_OVERLAY_1)
.setSlotOverlay(true, false, GuiTextures.ATOMIC_OVERLAY_1).setSlotOverlay(true, true, GuiTextures.ATOMIC_OVERLAY_1)
.setSound(GTSoundEvents.TURBINE);

View File

@ -4,7 +4,13 @@
"version": "1.0.0", "version": "1.0.0",
"debug": false, "debug": false,
"classes": { "classes": {
"preInit": [] "preInit": [
"classes/preInit/"
],
"init": [
"classes/init/NaqRecipeLogic.groovy",
"classes/init"
]
}, },
"loaders": { "loaders": {
"preInit": [ "preInit": [

View File

@ -391,6 +391,9 @@ item.contenttweaker.pulsatingmesh.name=Pulsating Mesh
tile.contenttweaker.simulation_casing.name=Naquadah-Plated Dark Steel Machine Casing tile.contenttweaker.simulation_casing.name=Naquadah-Plated Dark Steel Machine Casing
tile.contenttweaker.simulation_casing_2.name=Naquadah Machine Casing tile.contenttweaker.simulation_casing_2.name=Naquadah Machine Casing
gui.contenttweaker.naquadah_reactor.overclock=Does not overclock!
tooltip.contenttweaker.naquadah_reactor.produces=Produces exactly %s amps of %s.
multiblocktweaker.machine.microverse_projector_basic.name=Basic Microverse Projector multiblocktweaker.machine.microverse_projector_basic.name=Basic Microverse Projector
multiblocktweaker.machine.microverse_projector_advanced.name=Advanced Microverse Projector multiblocktweaker.machine.microverse_projector_advanced.name=Advanced Microverse Projector
multiblocktweaker.machine.microverse_projector_advanced_ii.name=Advanced Microverse Projector II multiblocktweaker.machine.microverse_projector_advanced_ii.name=Advanced Microverse Projector II

View File

@ -122,8 +122,8 @@ val dml_sim_chamber = Builder.start("dml_sim_chamber", 3100)
.where('G', <metastate:appliedenergistics2:quartz_vibrant_glass:0>) .where('G', <metastate:appliedenergistics2:quartz_vibrant_glass:0>)
.where('O', <metastate:extendedcrafting:storage:4> /* omnium */) .where('O', <metastate:extendedcrafting:storage:4> /* omnium */)
.where('-', CTPredicate.getAny()) .where('-', CTPredicate.getAny())
.where('C', CTPredicate.states(<metastate:gcym:large_multiblock_casing:11>) .where('C', CTPredicate.states(<metastate:gcym:large_multiblock_casing:11>).setMinGlobalLimited(30)
| controller.autoAbilities(true, false, true, true, false, false, false)) | controller.autoAbilities(true, true, true, true, false, false, false))
.build(); .build();
} as IPatternBuilderFunction) } as IPatternBuilderFunction)
.withRecipeMap( .withRecipeMap(
@ -135,9 +135,10 @@ val dml_sim_chamber = Builder.start("dml_sim_chamber", 3100)
.build()) .build())
.withBaseTexture(<metastate:gcym:large_multiblock_casing:11>) .withBaseTexture(<metastate:gcym:large_multiblock_casing:11>)
.buildAndRegister(); .buildAndRegister();
dml_sim_chamber.hasMaintenanceMechanics = false; dml_sim_chamber.hasMaintenanceMechanics = true;
dml_sim_chamber.hasMufflerMechanics = false; dml_sim_chamber.hasMufflerMechanics = false;
//dml_sim_chamber.frontOverlay = <cube_renderer:CREATIVE_CONTAINER_OVERLAY>; dml_sim_chamber.canBeDistinct = true;
dml_sim_chamber.frontOverlay = <cube_renderer:FUSION_REACTOR_OVERLAY>;
//Recipe for Controller //Recipe for Controller
// Moved to Groovy // Moved to Groovy

View File

@ -26,14 +26,13 @@ val microverse_projector_basic = Builder.start("mbt:microverse_projector_basic")
.withPattern(function(controller as IControllerTile) as IBlockPattern { .withPattern(function(controller as IControllerTile) as IBlockPattern {
return FactoryBlockPattern.start() return FactoryBlockPattern.start()
.aisle("CCC", "CVC", "CCC") .aisle("CCC", "CVC", "CCC")
.aisle("CCC", "GDG", "CMC") .aisle("CCC", "GDG", "CCC")
.aisle("CSC", "CGC", "CCC") .aisle("CSC", "CGC", "CCC")
.where('S', controller.self()) .where('S', controller.self())
.where('G', <blockstate:gregtech:transparent_casing>) .where('G', <blockstate:gregtech:transparent_casing>)
.where('V', <metastate:gregtech:multiblock_casing:2>) .where('V', <metastate:gregtech:multiblock_casing:2>)
.where('D', <metastate:chisel:diamond:3>) .where('D', <metastate:chisel:diamond:3>)
.where('M', CTPredicate.abilities(<mte_ability:MUFFLER_HATCH>)) .where("C", CTPredicate.states(<blockstate:contenttweaker:microverse_casing>).setMinGlobalLimited(12) | controller.autoAbilities(true, true, true, true, true, false, true))
.where("C", CTPredicate.states(<blockstate:contenttweaker:microverse_casing>).setMinGlobalLimited(12) | controller.autoAbilities(true, true, true, true, true, false, false))
.build(); .build();
} as IPatternBuilderFunction) } as IPatternBuilderFunction)
.withRecipeMap( .withRecipeMap(
@ -50,7 +49,8 @@ val microverse_projector_basic = Builder.start("mbt:microverse_projector_basic")
microverse_projector_basic.hasMufflerMechanics = true; microverse_projector_basic.hasMufflerMechanics = true;
microverse_projector_basic.hasMaintenanceMechanics = true; microverse_projector_basic.hasMaintenanceMechanics = true;
//microverse_projector_basic.frontOverlay = <cube_renderer:COMPRESSOR_OVERLAY>; microverse_projector_basic.canBeDistinct = true;
microverse_projector_basic.frontOverlay = <cube_renderer:COMPRESSOR_OVERLAY>;
// Advanced Microverse Projector // Advanced Microverse Projector
val microverse_projector_advanced = Builder.start("mbt:microverse_projector_advanced") val microverse_projector_advanced = Builder.start("mbt:microverse_projector_advanced")
@ -69,7 +69,7 @@ val microverse_projector_advanced = Builder.start("mbt:microverse_projector_adva
"GDDDG", "GDDDG",
"CVCVC") "CVCVC")
.aisle( .aisle(
"CCMCC", "CCCCC",
"GDDDG", "GDDDG",
"GD DG", "GD DG",
"GDDDG", "GDDDG",
@ -91,8 +91,7 @@ val microverse_projector_advanced = Builder.start("mbt:microverse_projector_adva
.where('D', <metastate:chisel:diamond:3>) .where('D', <metastate:chisel:diamond:3>)
.where('V', <metastate:gregtech:multiblock_casing:2>) .where('V', <metastate:gregtech:multiblock_casing:2>)
.where(' ', CTPredicate.getAny()) .where(' ', CTPredicate.getAny())
.where('M', CTPredicate.abilities(<mte_ability:MUFFLER_HATCH>)) .where("C", CTPredicate.states(<blockstate:contenttweaker:microverse_casing>).setMinGlobalLimited(45) | controller.autoAbilities(true, true, true, true, false, false, true))
.where("C", CTPredicate.states(<blockstate:contenttweaker:microverse_casing>).setMinGlobalLimited(45) | controller.autoAbilities(true, true, true, true, false, false, false))
.build(); .build();
} as IPatternBuilderFunction) } as IPatternBuilderFunction)
.withRecipeMap( .withRecipeMap(
@ -108,7 +107,8 @@ val microverse_projector_advanced = Builder.start("mbt:microverse_projector_adva
microverse_projector_advanced.hasMufflerMechanics = true; microverse_projector_advanced.hasMufflerMechanics = true;
microverse_projector_advanced.hasMaintenanceMechanics = true; microverse_projector_advanced.hasMaintenanceMechanics = true;
//microverse_projector_advanced.frontOverlay = <cube_renderer:COMPRESSOR_OVERLAY>; microverse_projector_advanced.canBeDistinct = true;
microverse_projector_advanced.frontOverlay = <cube_renderer:COMPRESSOR_OVERLAY>;
// Advanced Microverse Projector II // Advanced Microverse Projector II
val microverse_projector_advanced_ii = Builder.start("mbt:microverse_projector_advanced_ii") val microverse_projector_advanced_ii = Builder.start("mbt:microverse_projector_advanced_ii")
@ -119,7 +119,7 @@ val microverse_projector_advanced_ii = Builder.start("mbt:microverse_projector_a
" ", " ",
" CCCCC ", " CCCCC ",
" CVCVC ", " CVCVC ",
" CCMCC ", " CCCCC ",
" CVCVC ", " CVCVC ",
" CCCCC ", " CCCCC ",
" ", " ",
@ -190,7 +190,6 @@ val microverse_projector_advanced_ii = Builder.start("mbt:microverse_projector_a
.where('V', <blockstate:gregtech:multiblock_casing>) .where('V', <blockstate:gregtech:multiblock_casing>)
.where(' ', CTPredicate.getAny()) .where(' ', CTPredicate.getAny())
.where('D', <metastate:chisel:diamond:3>) .where('D', <metastate:chisel:diamond:3>)
.where('M', CTPredicate.abilities(<mte_ability:MUFFLER_HATCH>))
.where("C", CTPredicate.states(<blockstate:contenttweaker:microverse_casing>).setMinGlobalLimited(115) | controller.autoAbilities(true, true, true, true, false, false, true)) .where("C", CTPredicate.states(<blockstate:contenttweaker:microverse_casing>).setMinGlobalLimited(115) | controller.autoAbilities(true, true, true, true, false, false, true))
.build(); .build();
} as IPatternBuilderFunction) } as IPatternBuilderFunction)
@ -207,128 +206,19 @@ val microverse_projector_advanced_ii = Builder.start("mbt:microverse_projector_a
microverse_projector_advanced_ii.hasMufflerMechanics = true; microverse_projector_advanced_ii.hasMufflerMechanics = true;
microverse_projector_advanced_ii.hasMaintenanceMechanics = true; microverse_projector_advanced_ii.hasMaintenanceMechanics = true;
//microverse_projector_advanced_ii.frontOverlay = <cube_renderer:COMPRESSOR_OVERLAY>; microverse_projector_advanced_ii.canBeDistinct = true;
microverse_projector_advanced_ii.frontOverlay = <cube_renderer:COMPRESSOR_OVERLAY>;
<gcym:large_multiblock_casing:9>.displayName = "Reaction-Safe Casing";
// Naquadah Reactor 1 // Naquadah Reactor 1
<gcym:large_multiblock_casing:9>.displayName = "Reaction-Safe Casing"; // Groovy (special generator)
val naquadah_reactor_1 = Builder.start("naquadah_reactor_1")
.withPattern(function(controller as IControllerTile) as IBlockPattern {
return FactoryBlockPattern.start()
.aisle(
"CCC",
"PGP",
"PGP",
"PGP",
"CCC"
)
.aisle(
"CCC",
"GNG",
"GNG",
"GOG",
"CCC"
)
.aisle(
"CSC",
"PGP",
"PGP",
"PGP",
"CCC"
)
.where('S', controller.self())
.where('G', <metastate:gregtech:transparent_casing:1>)
.where('P', <blockstate:appliedenergistics2:spatial_pylon>)
.where('O', <metastate:extendedcrafting:trimmed:5>)
.where('N', <metastate:gregtech:meta_block_compressed_8:1>)
.where('C', CTPredicate.states(<metastate:gcym:large_multiblock_casing:9>)
| CTPredicate.abilities(<mte_ability:IMPORT_ITEMS>).setMinGlobalLimited(1).setPreviewCount(1)
| CTPredicate.abilities(<mte_ability:EXPORT_ITEMS>).setMinGlobalLimited(1).setPreviewCount(1)
| CTPredicate.abilities(<mte_ability:OUTPUT_ENERGY>).setMinGlobalLimited(1).setMaxGlobalLimited(3).setPreviewCount(1)
)
.build();
} as IPatternBuilderFunction)
.withRecipeMap(
FactoryRecipeMap.start("naquadah_reactor_1")
.minInputs(1)
.maxInputs(1)
.minOutputs(1)
.maxOutputs(1)
.build())
.withBaseTexture(<metastate:gcym:large_multiblock_casing:9>)
.buildAndRegister();
naquadah_reactor_1.hasMufflerMechanics = false;
naquadah_reactor_1.hasMaintenanceMechanics = false;
//naquadah_reactor_1.frontOverlay = <cube_renderer:CANNER_OVERLAY>;
naquadah_reactor_1.runOverclockingLogic = function(recipelogic as IRecipeLogic, recipe as IRecipe, negativeEU as bool, maxOverclocks as int) as int[] {
return IRecipeLogic.standardOverclockingLogic(recipe.getEUt() * (negativeEU ? -1 : 1), recipelogic.maxVoltage, recipe.getDuration(), 1, 1, 0); // 1x duration, 1x voltage, 0 overclocks
} as IRunOverclockingLogicFunction;
<metaitem:multiblocktweaker:naquadah_reactor_1>.addTooltip(format.yellow("Produces exactly 3A ZPM, does not overclock"));
// Naquadah Reactor 2 // Naquadah Reactor 2
val naquadah_reactor_2 = Builder.start("naquadah_reactor_2") // Groovy (special generator)
.withPattern(function(controller as IControllerTile) as IBlockPattern {
return FactoryBlockPattern.start()
.aisle(
"CCC",
"PGP",
"PGP",
"PGP",
"PGP",
"CCC"
)
.aisle(
"CCC",
"GNG",
"GNG",
"GNG",
"GOG",
"CCC"
)
.aisle(
"CSC",
"PGP",
"PGP",
"PGP",
"PGP",
"CCC"
)
.where('S', controller.self())
.where('P', <blockstate:appliedenergistics2:spatial_pylon>)
.where('G', <metastate:gregtech:transparent_casing:1>)
.where('O', <metastate:extendedcrafting:storage:4>)
.where('N', <metastate:gregtech:meta_block_compressed_2006:13>)
.where('C', CTPredicate.states(<metastate:gcym:large_multiblock_casing:9>)
| CTPredicate.abilities(<mte_ability:IMPORT_ITEMS>).setMinGlobalLimited(1).setPreviewCount(1)
| CTPredicate.abilities(<mte_ability:EXPORT_ITEMS>).setMinGlobalLimited(1).setPreviewCount(1)
| CTPredicate.abilities(<mte_ability:OUTPUT_ENERGY>).setMinGlobalLimited(1).setMaxGlobalLimited(3).setPreviewCount(1)
)
.build();
} as IPatternBuilderFunction)
.withRecipeMap(
FactoryRecipeMap.start("naquadah_reactor_2")
.minInputs(1)
.maxInputs(1)
.minOutputs(1)
.maxOutputs(1)
.build())
.withBaseTexture(<metastate:gcym:large_multiblock_casing:9>)
.buildAndRegister();
naquadah_reactor_2.hasMufflerMechanics = false;
naquadah_reactor_2.hasMaintenanceMechanics = false;
//naquadah_reactor_2.frontOverlay = <cube_renderer:CANNER_OVERLAY>;
naquadah_reactor_2.runOverclockingLogic = function(recipelogic as IRecipeLogic, recipe as IRecipe, negativeEU as bool, maxOverclocks as int) as int[] {
return IRecipeLogic.standardOverclockingLogic(recipe.getEUt() * (negativeEU ? -1 : 1), recipelogic.maxVoltage, recipe.getDuration(), 1, 1, 0); // 1x duration, 1x voltage, 0 overclocks
} as IRunOverclockingLogicFunction;
<metaitem:multiblocktweaker:naquadah_reactor_2>.addTooltip(format.yellow("Produces exactly 3A UV, does not overclock"));
// Actualization Chamber // Actualization Chamber
val actualization_chamber = Builder.start("actualization_chamber") val actualization_chamber = Builder.start("actualization_chamber", 32005)
.withPattern(function(controller as IControllerTile) as IBlockPattern { .withPattern(function(controller as IControllerTile) as IBlockPattern {
return FactoryBlockPattern.start() return FactoryBlockPattern.start()
.aisle("CCC","GGG","CCC") .aisle("CCC","GGG","CCC")
@ -337,8 +227,8 @@ val actualization_chamber = Builder.start("actualization_chamber")
.where('S', controller.self()) .where('S', controller.self())
.where('O', <metastate:gregtech:fusion_casing:1>) .where('O', <metastate:gregtech:fusion_casing:1>)
.where('G', <metastate:gregtech:transparent_casing:1>) .where('G', <metastate:gregtech:transparent_casing:1>)
.where('C', CTPredicate.states(<metastate:gregtech:fusion_casing:4>) .where('C', CTPredicate.states(<metastate:gregtech:fusion_casing:4>).setMinGlobalLimited(9)
| controller.autoAbilities(true, false, true, true, false, false, false) | controller.autoAbilities(true, true, true, true, false, false, false)
) )
.build(); .build();
} as IPatternBuilderFunction) } as IPatternBuilderFunction)
@ -354,11 +244,12 @@ val actualization_chamber = Builder.start("actualization_chamber")
.buildAndRegister(); .buildAndRegister();
actualization_chamber.hasMufflerMechanics = false; actualization_chamber.hasMufflerMechanics = false;
actualization_chamber.hasMaintenanceMechanics = false; actualization_chamber.hasMaintenanceMechanics = true;
//actualization_chamber.frontOverlay = <cube_renderer:ENDER_FLUID_LINK>; actualization_chamber.canBeDistinct = true;
actualization_chamber.frontOverlay = <cube_renderer:ENDER_FLUID_LINK>;
// Universal Crystallizer // Universal Crystallizer
val universal_crystallizer = Builder.start("universal_crystallizer") val universal_crystallizer = Builder.start("universal_crystallizer", 32006)
.withPattern(function(controller as IControllerTile) as IBlockPattern { .withPattern(function(controller as IControllerTile) as IBlockPattern {
return FactoryBlockPattern.start(RelativeDirection.FRONT, RelativeDirection.UP, RelativeDirection.LEFT) return FactoryBlockPattern.start(RelativeDirection.FRONT, RelativeDirection.UP, RelativeDirection.LEFT)
.aisle("AAAAAAA", .aisle("AAAAAAA",
@ -436,7 +327,8 @@ val universal_crystallizer = Builder.start("universal_crystallizer")
universal_crystallizer.hasMufflerMechanics = false; universal_crystallizer.hasMufflerMechanics = false;
universal_crystallizer.hasMaintenanceMechanics = true; universal_crystallizer.hasMaintenanceMechanics = true;
//universal_crystallizer.frontOverlay = <cube_renderer:CREATIVE_CONTAINER_OVERLAY>; universal_crystallizer.canBeDistinct = true;
universal_crystallizer.frontOverlay = <cube_renderer:CREATIVE_CONTAINER_OVERLAY>;
// multiblock controller recipes // multiblock controller recipes
recipes.addShaped("microverse_projector_basic", <metaitem:mbt:microverse_projector_basic>, [ recipes.addShaped("microverse_projector_basic", <metaitem:mbt:microverse_projector_basic>, [
@ -458,26 +350,8 @@ recipes.addShaped("microverse_projector_advanced_ii", <metaitem:mbt:microverse_p
]); ]);
makeShaped("naquadah_reactor_1", <metaitem:multiblocktweaker:naquadah_reactor_1>, // Naquadah Reactor
["NCN", // Moved to Groovy
"GSG",
"PPP"],
{ C : <ore:circuitIv>, //T5
G : <gregtech:transparent_casing:1>,
S : <metaitem:cover.screen>,
P : <appliedenergistics2:spatial_pylon>,
N : <extendedcrafting:material:33>}); //Omnium Nugget
makeShaped("naquadah_reactor_2", <metaitem:multiblocktweaker:naquadah_reactor_2>,
["NCN",
"GSG",
"PPP"],
{ C : <ore:circuitLuv>, //T6
G : <gregtech:transparent_casing:1>,
S : <metaitem:cover.screen>,
P : <appliedenergistics2:spatial_pylon>,
N : <extendedcrafting:material:32>}); //Omnium Ingot
makeExtremeRecipe5(<metaitem:multiblocktweaker:actualization_chamber>, makeExtremeRecipe5(<metaitem:multiblocktweaker:actualization_chamber>,
["PPPPP", ["PPPPP",
@ -1570,37 +1444,32 @@ actualization_chamber.recipeMap
<minecraft:dragon_egg> * 64) <minecraft:dragon_egg> * 64)
.buildAndRegister(); .buildAndRegister();
// Naquadah Reactor Mk1 Recipes // Naquadah Reactor Mk1 Recipes
naquadah_reactor_1.recipeMap <recipemap:naquadah_reactor_1>.recipeBuilder()
.recipeBuilder()
.duration(938) .duration(938)
.EUt(-393216) .EUt(393216)
.inputs(<metaitem:boltNaquadahEnriched>) .inputs(<metaitem:boltNaquadahEnriched>)
.outputs(<metaitem:boltLead>) .outputs(<metaitem:boltLead>)
.buildAndRegister(); .buildAndRegister();
naquadah_reactor_1.recipeMap <recipemap:naquadah_reactor_1>.recipeBuilder()
.recipeBuilder()
.duration(3750) .duration(3750)
.EUt(-393216) .EUt(393216)
.inputs(<metaitem:boltNaquadria>) .inputs(<metaitem:boltNaquadria>)
.outputs(<metaitem:boltLead>) .outputs(<metaitem:boltLead>)
.buildAndRegister(); .buildAndRegister();
// Naquadah Reactor Mk2 Recipes // Naquadah Reactor Mk2 Recipes
naquadah_reactor_2.recipeMap <recipemap:naquadah_reactor_2>.recipeBuilder()
.recipeBuilder()
.duration(1875) .duration(1875)
.EUt(-1572864) .EUt(1572864)
.inputs(<metaitem:boltNaquadahEnriched>) .inputs(<metaitem:boltNaquadahEnriched>)
.outputs(<metaitem:boltLead>) .outputs(<metaitem:boltLead>)
.buildAndRegister(); .buildAndRegister();
naquadah_reactor_2.recipeMap <recipemap:naquadah_reactor_2>.recipeBuilder()
.recipeBuilder()
.duration(7500) .duration(7500)
.EUt(-1572864) .EUt(1572864)
.inputs(<metaitem:boltNaquadria>) .inputs(<metaitem:boltNaquadria>)
.outputs(<metaitem:boltLead>) .outputs(<metaitem:boltLead>)
.buildAndRegister(); .buildAndRegister();

View File

@ -25,14 +25,13 @@ val microverse_projector_basic = Builder.start("mbt:microverse_projector_basic")
.withPattern(function(controller as IControllerTile) as IBlockPattern { .withPattern(function(controller as IControllerTile) as IBlockPattern {
return FactoryBlockPattern.start() return FactoryBlockPattern.start()
.aisle("CCC", "CVC", "CCC") .aisle("CCC", "CVC", "CCC")
.aisle("CCC", "GDG", "CMC") .aisle("CCC", "GDG", "CCC")
.aisle("CSC", "CGC", "CCC") .aisle("CSC", "CGC", "CCC")
.where('S', controller.self()) .where('S', controller.self())
.where('G', <blockstate:gregtech:transparent_casing>) .where('G', <blockstate:gregtech:transparent_casing>)
.where('V', <metastate:gregtech:multiblock_casing:2>) .where('V', <metastate:gregtech:multiblock_casing:2>)
.where('D', <metastate:chisel:diamond:3>) .where('D', <metastate:chisel:diamond:3>)
.where('M', CTPredicate.abilities(<mte_ability:MUFFLER_HATCH>)) .where("C", CTPredicate.states(<blockstate:contenttweaker:microverse_casing>).setMinGlobalLimited(12) | controller.autoAbilities(true, true, true, true, true, false, true))
.where("C", CTPredicate.states(<blockstate:contenttweaker:microverse_casing>).setMinGlobalLimited(12) | controller.autoAbilities(true, true, true, true, true, false, false))
.build(); .build();
} as IPatternBuilderFunction) } as IPatternBuilderFunction)
.withRecipeMap( .withRecipeMap(
@ -49,7 +48,8 @@ val microverse_projector_basic = Builder.start("mbt:microverse_projector_basic")
microverse_projector_basic.hasMufflerMechanics = true; microverse_projector_basic.hasMufflerMechanics = true;
microverse_projector_basic.hasMaintenanceMechanics = true; microverse_projector_basic.hasMaintenanceMechanics = true;
//microverse_projector_basic.frontOverlay = <cube_renderer:COMPRESSOR_OVERLAY>; microverse_projector_basic.canBeDistinct = true;
microverse_projector_basic.frontOverlay = <cube_renderer:COMPRESSOR_OVERLAY>;
// Advanced Microverse Projector // Advanced Microverse Projector
val microverse_projector_advanced = Builder.start("mbt:microverse_projector_advanced") val microverse_projector_advanced = Builder.start("mbt:microverse_projector_advanced")
@ -68,7 +68,7 @@ val microverse_projector_advanced = Builder.start("mbt:microverse_projector_adva
"GDDDG", "GDDDG",
"CVCVC") "CVCVC")
.aisle( .aisle(
"CCMCC", "CCCCC",
"GDDDG", "GDDDG",
"GD DG", "GD DG",
"GDDDG", "GDDDG",
@ -90,8 +90,7 @@ val microverse_projector_advanced = Builder.start("mbt:microverse_projector_adva
.where('D', <metastate:chisel:diamond:3>) .where('D', <metastate:chisel:diamond:3>)
.where('V', <metastate:gregtech:multiblock_casing:2>) .where('V', <metastate:gregtech:multiblock_casing:2>)
.where(' ', CTPredicate.getAny()) .where(' ', CTPredicate.getAny())
.where('M', CTPredicate.abilities(<mte_ability:MUFFLER_HATCH>)) .where("C", CTPredicate.states(<blockstate:contenttweaker:microverse_casing>).setMinGlobalLimited(45) | controller.autoAbilities(true, true, true, true, false, false, true))
.where("C", CTPredicate.states(<blockstate:contenttweaker:microverse_casing>).setMinGlobalLimited(45) | controller.autoAbilities(true, true, true, true, false, false, false))
.build(); .build();
} as IPatternBuilderFunction) } as IPatternBuilderFunction)
.withRecipeMap( .withRecipeMap(
@ -107,7 +106,8 @@ val microverse_projector_advanced = Builder.start("mbt:microverse_projector_adva
microverse_projector_advanced.hasMufflerMechanics = true; microverse_projector_advanced.hasMufflerMechanics = true;
microverse_projector_advanced.hasMaintenanceMechanics = true; microverse_projector_advanced.hasMaintenanceMechanics = true;
//microverse_projector_advanced.frontOverlay = <cube_renderer:COMPRESSOR_OVERLAY>; microverse_projector_advanced.canBeDistinct = true;
microverse_projector_advanced.frontOverlay = <cube_renderer:COMPRESSOR_OVERLAY>;
// Advanced Microverse Projector II // Advanced Microverse Projector II
val microverse_projector_advanced_ii = Builder.start("mbt:microverse_projector_advanced_ii") val microverse_projector_advanced_ii = Builder.start("mbt:microverse_projector_advanced_ii")
@ -118,7 +118,7 @@ val microverse_projector_advanced_ii = Builder.start("mbt:microverse_projector_a
" ", " ",
" CCCCC ", " CCCCC ",
" CVCVC ", " CVCVC ",
" CCMCC ", " CCCCC ",
" CVCVC ", " CVCVC ",
" CCCCC ", " CCCCC ",
" ", " ",
@ -189,7 +189,6 @@ val microverse_projector_advanced_ii = Builder.start("mbt:microverse_projector_a
.where('V', <blockstate:gregtech:multiblock_casing>) .where('V', <blockstate:gregtech:multiblock_casing>)
.where(' ', CTPredicate.getAny()) .where(' ', CTPredicate.getAny())
.where('D', <metastate:chisel:diamond:3>) .where('D', <metastate:chisel:diamond:3>)
.where('M', CTPredicate.abilities(<mte_ability:MUFFLER_HATCH>))
.where("C", CTPredicate.states(<blockstate:contenttweaker:microverse_casing>).setMinGlobalLimited(115) | controller.autoAbilities(true, true, true, true, false, false, true)) .where("C", CTPredicate.states(<blockstate:contenttweaker:microverse_casing>).setMinGlobalLimited(115) | controller.autoAbilities(true, true, true, true, false, false, true))
.build(); .build();
} as IPatternBuilderFunction) } as IPatternBuilderFunction)
@ -206,7 +205,8 @@ val microverse_projector_advanced_ii = Builder.start("mbt:microverse_projector_a
microverse_projector_advanced_ii.hasMufflerMechanics = true; microverse_projector_advanced_ii.hasMufflerMechanics = true;
microverse_projector_advanced_ii.hasMaintenanceMechanics = true; microverse_projector_advanced_ii.hasMaintenanceMechanics = true;
//microverse_projector_advanced_ii.frontOverlay = <cube_renderer:COMPRESSOR_OVERLAY>; microverse_projector_advanced_ii.canBeDistinct = true;
microverse_projector_advanced_ii.frontOverlay = <cube_renderer:COMPRESSOR_OVERLAY>;
// Creative Tank Provider // Creative Tank Provider
val creative_tank_provider = Builder.start("mbt:creative_tank_provider") val creative_tank_provider = Builder.start("mbt:creative_tank_provider")
@ -217,7 +217,7 @@ val creative_tank_provider = Builder.start("mbt:creative_tank_provider")
.aisle("CCC", "CSC", "CCC") .aisle("CCC", "CSC", "CCC")
.where('S', controller.self()) .where('S', controller.self())
.where('F', <metastate:gregtech:meta_block_frame_24:12>) // Tungstencarbide Frame Box .where('F', <metastate:gregtech:meta_block_frame_24:12>) // Tungstencarbide Frame Box
.where("C", CTPredicate.states(<metastate:gcym:large_multiblock_casing:11>).setMinGlobalLimited(15) | controller.autoAbilities(true, false, true, true, false, false, false)) .where("C", CTPredicate.states(<metastate:gcym:large_multiblock_casing:11>).setMinGlobalLimited(15) | controller.autoAbilities(true, true, true, true, false, false, false))
.build(); .build();
} as IPatternBuilderFunction) } as IPatternBuilderFunction)
.withRecipeMap( .withRecipeMap(
@ -231,126 +231,16 @@ val creative_tank_provider = Builder.start("mbt:creative_tank_provider")
.buildAndRegister(); .buildAndRegister();
creative_tank_provider.hasMufflerMechanics = false; creative_tank_provider.hasMufflerMechanics = false;
creative_tank_provider.hasMaintenanceMechanics = false; creative_tank_provider.hasMaintenanceMechanics = true;
creative_tank_provider.frontOverlay = <cube_renderer:CREATIVE_CONTAINER_OVERLAY>;
<gcym:large_multiblock_casing:9>.displayName = "Reaction-Safe Casing";
// Naquadah Reactor 1 // Naquadah Reactor 1
<gcym:large_multiblock_casing:9>.displayName = "Reaction-Safe Casing"; // Groovy (special generator)
val naquadah_reactor_1 = Builder.start("naquadah_reactor_1")
.withPattern(function(controller as IControllerTile) as IBlockPattern {
return FactoryBlockPattern.start()
.aisle(
"CCC",
"PGP",
"PGP",
"PGP",
"CCC"
)
.aisle(
"CCC",
"GNG",
"GNG",
"GOG",
"CCC"
)
.aisle(
"CSC",
"PGP",
"PGP",
"PGP",
"CCC"
)
.where('S', controller.self())
.where('G', <metastate:gregtech:transparent_casing:1>)
.where('P', <blockstate:appliedenergistics2:spatial_pylon>)
.where('O', <metastate:extendedcrafting:trimmed:5>)
.where('N', <metastate:gregtech:meta_block_compressed_8:1>)
.where('C', CTPredicate.states(<metastate:gcym:large_multiblock_casing:9>)
| CTPredicate.abilities(<mte_ability:IMPORT_ITEMS>).setMinGlobalLimited(1).setPreviewCount(1)
| CTPredicate.abilities(<mte_ability:EXPORT_ITEMS>).setMinGlobalLimited(1).setPreviewCount(1)
| CTPredicate.abilities(<mte_ability:OUTPUT_ENERGY>).setMinGlobalLimited(1).setMaxGlobalLimited(3).setPreviewCount(1)
)
.build();
} as IPatternBuilderFunction)
.withRecipeMap(
FactoryRecipeMap.start("naquadah_reactor_1")
.minInputs(1)
.maxInputs(1)
.minOutputs(1)
.maxOutputs(1)
.build())
.withBaseTexture(<metastate:gcym:large_multiblock_casing:9>)
.buildAndRegister();
naquadah_reactor_1.hasMufflerMechanics = false;
naquadah_reactor_1.hasMaintenanceMechanics = false;
//naquadah_reactor_1.frontOverlay = <cube_renderer:CANNER_OVERLAY>;
naquadah_reactor_1.runOverclockingLogic = function(recipelogic as IRecipeLogic, recipe as IRecipe, negativeEU as bool, maxOverclocks as int) as int[] {
return IRecipeLogic.standardOverclockingLogic(recipe.getEUt() * (negativeEU ? -1 : 1), recipelogic.maxVoltage, recipe.getDuration(), 1, 1, 0); // 1x duration, 1x voltage, 0 overclocks
} as IRunOverclockingLogicFunction;
<metaitem:multiblocktweaker:naquadah_reactor_1>.addTooltip(format.yellow("Produces exactly 3A ZPM, does not overclock"));
// Naquadah Reactor 2 // Naquadah Reactor 2
val naquadah_reactor_2 = Builder.start("naquadah_reactor_2") // Groovy (special generator)
.withPattern(function(controller as IControllerTile) as IBlockPattern {
return FactoryBlockPattern.start()
.aisle(
"CCC",
"PGP",
"PGP",
"PGP",
"PGP",
"CCC"
)
.aisle(
"CCC",
"GNG",
"GNG",
"GNG",
"GOG",
"CCC"
)
.aisle(
"CSC",
"PGP",
"PGP",
"PGP",
"PGP",
"CCC"
)
.where('S', controller.self())
.where('P', <blockstate:appliedenergistics2:spatial_pylon>)
.where('G', <metastate:gregtech:transparent_casing:1>)
.where('O', <metastate:extendedcrafting:storage:4>)
.where('N', <metastate:gregtech:meta_block_compressed_27:0>)
.where('C', CTPredicate.states(<metastate:gcym:large_multiblock_casing:9>)
| CTPredicate.abilities(<mte_ability:IMPORT_ITEMS>).setMinGlobalLimited(1).setPreviewCount(1)
| CTPredicate.abilities(<mte_ability:EXPORT_ITEMS>).setMinGlobalLimited(1).setPreviewCount(1)
| CTPredicate.abilities(<mte_ability:OUTPUT_ENERGY>).setMinGlobalLimited(1).setMaxGlobalLimited(3).setPreviewCount(1)
)
.build();
} as IPatternBuilderFunction)
.withRecipeMap(
FactoryRecipeMap.start("naquadah_reactor_2")
.minInputs(1)
.maxInputs(1)
.minOutputs(1)
.maxOutputs(1)
.build())
.withBaseTexture(<metastate:gcym:large_multiblock_casing:9>)
.buildAndRegister();
naquadah_reactor_2.hasMufflerMechanics = false;
naquadah_reactor_2.hasMaintenanceMechanics = false;
//naquadah_reactor_2.frontOverlay = <cube_renderer:CANNER_OVERLAY>;
naquadah_reactor_2.runOverclockingLogic = function(recipelogic as IRecipeLogic, recipe as IRecipe, negativeEU as bool, maxOverclocks as int) as int[] {
return IRecipeLogic.standardOverclockingLogic(recipe.getEUt() * (negativeEU ? -1 : 1), recipelogic.maxVoltage, recipe.getDuration(), 1, 1, 0); // 1x duration, 1x voltage, 0 overclocks
} as IRunOverclockingLogicFunction;
<metaitem:multiblocktweaker:naquadah_reactor_2>.addTooltip(format.yellow("Produces exactly 3A UV, does not overclock"));
// multiblock controller recipes // multiblock controller recipes
recipes.addShaped("microverse_projector_basic", <metaitem:mbt:microverse_projector_basic>, [ recipes.addShaped("microverse_projector_basic", <metaitem:mbt:microverse_projector_basic>, [
@ -799,35 +689,31 @@ creative_tank_provider.recipeMap
// Naquadah Reactor Mk1 Recipes // Naquadah Reactor Mk1 Recipes
naquadah_reactor_1.recipeMap <recipemap:naquadah_reactor_1>.recipeBuilder()
.recipeBuilder()
.duration(938) .duration(938)
.EUt(-393216) .EUt(393216)
.inputs(<metaitem:boltNaquadahEnriched>) .inputs(<metaitem:boltNaquadahEnriched>)
.outputs(<metaitem:boltLead>) .outputs(<metaitem:boltLead>)
.buildAndRegister(); .buildAndRegister();
naquadah_reactor_1.recipeMap <recipemap:naquadah_reactor_1>.recipeBuilder()
.recipeBuilder()
.duration(3750) .duration(3750)
.EUt(-393216) .EUt(393216)
.inputs(<metaitem:boltNaquadria>) .inputs(<metaitem:boltNaquadria>)
.outputs(<metaitem:boltLead>) .outputs(<metaitem:boltLead>)
.buildAndRegister(); .buildAndRegister();
// Naquadah Reactor Mk2 Recipes // Naquadah Reactor Mk2 Recipes
naquadah_reactor_2.recipeMap <recipemap:naquadah_reactor_2>.recipeBuilder()
.recipeBuilder()
.duration(1875) .duration(1875)
.EUt(-1572864) .EUt(1572864)
.inputs(<metaitem:boltNaquadahEnriched>) .inputs(<metaitem:boltNaquadahEnriched>)
.outputs(<metaitem:boltLead>) .outputs(<metaitem:boltLead>)
.buildAndRegister(); .buildAndRegister();
naquadah_reactor_2.recipeMap <recipemap:naquadah_reactor_2>.recipeBuilder()
.recipeBuilder()
.duration(7500) .duration(7500)
.EUt(-1572864) .EUt(1572864)
.inputs(<metaitem:boltNaquadria>) .inputs(<metaitem:boltNaquadria>)
.outputs(<metaitem:boltLead>) .outputs(<metaitem:boltLead>)
.buildAndRegister(); .buildAndRegister();