diff --git a/src/main/kotlin/gregtechlite/gtlitecore/api/capability/logic/ExtendableMultiblockRecipeLogic.kt b/src/main/kotlin/gregtechlite/gtlitecore/api/capability/logic/ExtendableMultiblockRecipeLogic.kt new file mode 100644 index 000000000..7cd7901ce --- /dev/null +++ b/src/main/kotlin/gregtechlite/gtlitecore/api/capability/logic/ExtendableMultiblockRecipeLogic.kt @@ -0,0 +1,25 @@ +package gregtechlite.gtlitecore.api.capability.logic + +import gregtech.api.capability.impl.MultiblockRecipeLogic +import gregtech.api.recipes.Recipe +import gregtechlite.gtlitecore.api.metatileentity.multiblock.extendable.AdditionalStructureManager +import gregtechlite.gtlitecore.api.metatileentity.multiblock.extendable.RecipeMapExtendableMultiblock +import gregtechlite.gtlitecore.api.recipe.property.RequestAdditionalProperty + +open class ExtendableMultiblockRecipeLogic>(controller: RecipeMapExtendableMultiblock, + protected val manager: AdditionalStructureManager) + : MultiblockRecipeLogic(controller) +{ + override fun checkRecipe(recipe: Recipe): Boolean + = super.checkRecipe(recipe) && checkAdditionalRequirement(recipe) + + override fun canProgressRecipe(): Boolean + = super.canProgressRecipe() && (previousRecipe?.let { checkAdditionalRequirement(it) } ?: true) + + private fun checkAdditionalRequirement(recipe: Recipe): Boolean + { + if (!recipe.hasProperty(RequestAdditionalProperty)) return true + val requirement = recipe.getProperty(RequestAdditionalProperty, null) ?: return false + return requirement.additionalStructures.all { manager.get(it).isNotEmpty() } + } +} diff --git a/src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/AdditionalMultiblockBase.kt b/src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/AdditionalMultiblockBase.kt new file mode 100644 index 000000000..a374a4a5d --- /dev/null +++ b/src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/AdditionalMultiblockBase.kt @@ -0,0 +1,176 @@ +package gregtechlite.gtlitecore.api.metatileentity.multiblock.extendable + +import codechicken.lib.render.CCRenderState +import codechicken.lib.render.pipeline.IVertexOperation +import codechicken.lib.vec.Matrix4 +import com.cleanroommc.modularui.api.widget.IWidget +import com.cleanroommc.modularui.drawable.ItemDrawable +import com.cleanroommc.modularui.value.sync.PanelSyncManager +import com.cleanroommc.modularui.widgets.ButtonWidget +import gregtech.api.capability.GregtechDataCodes.WORKING_ENABLED +import gregtech.api.capability.IControllable +import gregtech.api.capability.IDataStickIntractable +import gregtech.api.metatileentity.multiblock.MultiblockWithDisplayBase +import gregtech.api.metatileentity.multiblock.ui.MultiblockUIBuilder +import gregtech.api.metatileentity.multiblock.ui.MultiblockUIFactory +import gregtech.api.util.KeyUtil +import gregtechlite.gtlitecore.api.gui.GTLiteMuiTextures +import net.minecraft.client.resources.I18n +import net.minecraft.entity.player.EntityPlayer +import net.minecraft.item.ItemStack +import net.minecraft.nbt.NBTTagCompound +import net.minecraft.network.PacketBuffer +import net.minecraft.util.ResourceLocation +import net.minecraft.util.text.TextComponentTranslation +import java.awt.event.MouseEvent + +abstract class AdditionalMultiblockBase>(metaTileEntityId: ResourceLocation) + : MultiblockWithDisplayBase(metaTileEntityId), IControllable, IDataStickIntractable +{ + @JvmField + protected var mainController: ExtendableMultiblock? = null + @JvmField + protected var isWorkingEnabled: Boolean = false + + override fun hasMaintenanceMechanics() = false + + override fun isWorkingEnabled() = isStructureFormed && isConnected() + + override fun setWorkingEnabled(workingStatus: Boolean) + { + isWorkingEnabled = workingStatus + markDirty() + if (world != null && !world.isRemote) + { + writeCustomData(WORKING_ENABLED) { it.writeBoolean(isWorkingEnabled) } + } + } + + protected fun isConnected() = mainController != null && mainController!!.isWorkingEnabled() + + fun connect(controller: ExtendableMultiblock?) + { + mainController?.removeAdditional(pos) + mainController = controller + mainController?.addAdditional(this) + } + + override fun writeToNBT(data: NBTTagCompound): NBTTagCompound + { + super.writeToNBT(data) + data.setBoolean("isWorkingEnabled", isWorkingEnabled) + return data + } + + override fun readFromNBT(data: NBTTagCompound) + { + super.readFromNBT(data) + setWorkingEnabled(data.getBoolean("isWorkingEnabled")) + } + + override fun writeInitialSyncData(buf: PacketBuffer) + { + super.writeInitialSyncData(buf) + buf.writeBoolean(isWorkingEnabled) + } + + override fun receiveInitialSyncData(buf: PacketBuffer) + { + super.receiveInitialSyncData(buf) + setWorkingEnabled(buf.readBoolean()) + } + + override fun receiveCustomData(dataId: Int, buf: PacketBuffer) + { + super.receiveCustomData(dataId, buf) + if (dataId == WORKING_ENABLED) + { + isWorkingEnabled = buf.readBoolean() + scheduleRenderUpdate() + } + } + + override fun configureWarningText(builder: MultiblockUIBuilder?) + { + if (mainController?.isStructureFormed!!) + { + builder?.addMaintenanceProblemLines(mainController?.maintenanceProblem!!, true) + } + } + + override fun createUIFactory(): MultiblockUIFactory? + { + return super.createUIFactory() + .createFlexButton { _, guiSyncManager -> + guiSyncManager.registerSyncedAction("highlight_main_controller") { mainController?.highlightController() } + return@createFlexButton ButtonWidget() + .background(GTLiteMuiTextures.BUTTON_ENABLE_MODULE) + .disableHoverBackground() + .onMousePressed { + guiSyncManager.callSyncedAction("highlight_main_controller") + true + } + .tooltip { tooltip -> + tooltip.addLine(KeyUtil.lang("gtlitecore.machine.extendable.highlight_main_controller")) + } + } + } + + fun highlightController() { + TODO() + } + + fun getButton(panelSyncManager: PanelSyncManager): IWidget + { + panelSyncManager.registerSyncedAction("highlight_controller") { highlightController() } + return ButtonWidget() + .size(18, 18) + .overlay(ItemDrawable(stackForm)) + .addTooltipStringLines(listOf( + I18n.format(this.metaFullName), + I18n.format("gtlitecore.machine.extendable.additional_button_action") // TODO + )) + .onMousePressed { + if (it == 1) + { + // Highlight + panelSyncManager.callSyncedAction("highlight_controller") + return@onMousePressed true + } + else if (it == 2) + { + // Other action... TODO + return@onMousePressed true + } + else + { + return@onMousePressed false + } + } + } + + override fun onDataStickLeftClick(player: EntityPlayer, stack: ItemStack) + { + val tag = stack.tagCompound ?: NBTTagCompound() + tag.setTag("AdditionalPos", NBTTagCompound().apply { + setInteger("X", pos.x) + setInteger("Y", pos.y) + setInteger("Z", pos.z) + }) + stack.tagCompound = tag + stack.setTranslatableName("gtlitecore.machine.additional_structure.data_stick.name") + player.sendStatusMessage(TextComponentTranslation("gtlitecore.machine.additional_structure.pos_saved", + pos.x, pos.y, pos.z), true) + } + + override fun onDataStickRightClick(player: EntityPlayer, stack: ItemStack): Boolean = false + + override fun renderMetaTileEntity( + renderState: CCRenderState, translation: Matrix4, + pipeline: Array, + ) + { + super.renderMetaTileEntity(renderState, translation, pipeline) + frontOverlay.renderOrientedState(renderState, translation, pipeline, frontFacing, isActive, isWorkingEnabled) + } +} \ No newline at end of file diff --git a/src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/AdditionalStructureManager.kt b/src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/AdditionalStructureManager.kt new file mode 100644 index 000000000..4900957a3 --- /dev/null +++ b/src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/AdditionalStructureManager.kt @@ -0,0 +1,57 @@ +package gregtechlite.gtlitecore.api.metatileentity.multiblock.extendable + +import com.cleanroommc.modularui.api.widget.IWidget +import com.cleanroommc.modularui.value.sync.PanelSyncManager +import gregtech.api.metatileentity.multiblock.MultiblockAbility +import gregtechlite.gtlitecore.api.collection.openHashMapOf +import net.minecraft.nbt.NBTTagCompound +import net.minecraft.nbt.NBTTagList +import net.minecraft.util.ResourceLocation +import net.minecraft.util.math.BlockPos + +open class AdditionalStructureManager>(protected val base: ExtendableMultiblock) +{ + protected val structures = openHashMapOf>() + + fun add(additionalMultiblockBase: AdditionalMultiblockBase) + { + structures[additionalMultiblockBase.pos] = additionalMultiblockBase + } + + fun get(metaTileEntityId: ResourceLocation): MutableList> + = structures.values.filter { it.metaTileEntityId.equals(metaTileEntityId) }.toMutableList() + + fun get(pos: BlockPos): AdditionalMultiblockBase? = structures[pos] + + fun remove(pos: BlockPos) = structures.remove(pos) + + fun getWidgets(panelSyncManager: PanelSyncManager): List { + return structures.values.map { it.getButton(panelSyncManager) }.toList() + } + + fun getAbilities(ability: MultiblockAbility): MutableList { + val abilities = ArrayList() + structures.values.forEach { it.getAbilities(ability).also { ab -> abilities.addAll(ab) } } + return abilities + } + + fun serialize(): NBTTagCompound + { + val nbt = NBTTagCompound() + val list = NBTTagList() + structures.keys.forEach { + val pos = NBTTagCompound().apply { + setInteger("X", it.x) + setInteger("Y", it.y) + setInteger("Z", it.z) + } + list.appendTag(pos) + } + nbt.setTag("BlockPoses", list) + return nbt + } + + fun deserialize(nbt: NBTTagCompound): List + = nbt.getTagList("BlockPoses", 10).filterIsInstance() + .map { BlockPos(it.getInteger("X"), it.getInteger("Y"), it.getInteger("Z")) } +} \ No newline at end of file diff --git a/src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/ExtendableMultiblock.kt b/src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/ExtendableMultiblock.kt new file mode 100644 index 000000000..b1d51f026 --- /dev/null +++ b/src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/ExtendableMultiblock.kt @@ -0,0 +1,26 @@ +package gregtechlite.gtlitecore.api.metatileentity.multiblock.extendable + +import gregtech.api.capability.IMultiblockController +import net.minecraft.util.math.BlockPos + +interface ExtendableMultiblock>: IMultiblockController +{ + var additionalStructureManager: AdditionalStructureManager + val maintenanceProblem: Byte + + fun getPos(): BlockPos + + fun highlightController() + + fun isWorkingEnabled(): Boolean + + fun addAdditional(additionalMultiblockBase: AdditionalMultiblockBase) + { + additionalStructureManager.add(additionalMultiblockBase) + } + + fun removeAdditional(pos: BlockPos) + { + additionalStructureManager.remove(pos) + } +} \ No newline at end of file diff --git a/src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/ExtendableMultiblockBase.kt b/src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/ExtendableMultiblockBase.kt new file mode 100644 index 000000000..21a27a57f --- /dev/null +++ b/src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/ExtendableMultiblockBase.kt @@ -0,0 +1,109 @@ +package gregtechlite.gtlitecore.api.metatileentity.multiblock.extendable + +import com.cleanroommc.modularui.widgets.ButtonWidget +import gregtech.api.capability.IControllable +import gregtech.api.capability.IDataStickIntractable +import gregtech.api.capability.IWorkable +import gregtech.api.metatileentity.multiblock.MultiblockAbility +import gregtech.api.metatileentity.multiblock.MultiblockWithDisplayBase +import gregtech.api.metatileentity.multiblock.ui.MultiblockUIFactory +import gregtech.api.util.GTUtility +import gregtech.api.util.KeyUtil +import gregtechlite.gtlitecore.api.gui.GTLiteMuiTextures +import net.minecraft.entity.player.EntityPlayer +import net.minecraft.item.ItemStack +import net.minecraft.nbt.NBTTagCompound +import net.minecraft.network.PacketBuffer +import net.minecraft.util.ResourceLocation +import net.minecraft.util.math.BlockPos +import net.minecraft.util.text.TextComponentTranslation + +abstract class ExtendableMultiblockBase>(metaTileEntityId: ResourceLocation) + : MultiblockWithDisplayBase(metaTileEntityId), IWorkable, IControllable, IDataStickIntractable, ExtendableMultiblock +{ + override var additionalStructureManager: AdditionalStructureManager = AdditionalStructureManager(this) + override val maintenanceProblem: Byte = maintenanceProblems + + override fun getAbilities(ability: MultiblockAbility): List + { + val abilities = super.getAbilities(ability).toMutableList() + abilities.addAll(additionalStructureManager.getAbilities(ability)) + return abilities + } + + override fun createUIFactory(): MultiblockUIFactory? + { + return super.createUIFactory() + .createFlexButton { _, guiSyncManager -> + guiSyncManager.registerSyncedAction("refresh_structure_pattern") { reinitializeStructurePattern() } + return@createFlexButton ButtonWidget() + .background(GTLiteMuiTextures.BUTTON_REFRESH_STRUCTURE_PATTERN) + .disableHoverBackground() + .onMousePressed { + guiSyncManager.callSyncedAction("refresh_structure_pattern") + true + } + .tooltip { tooltip -> + tooltip.addLine(KeyUtil.lang("gtlitecore.machine.space_elevator.refresh_structure_pattern")) + } + } + } + + override fun writeToNBT(data: NBTTagCompound?): NBTTagCompound? + { + data?.setTag("Additional", additionalStructureManager.serialize()) + return super.writeToNBT(data) + } + + override fun readFromNBT(data: NBTTagCompound?) + { + super.readFromNBT(data) + data?.getCompoundTag("Additional")?.let { + additionalStructureManager.deserialize(it) + .map { pos -> GTUtility.getMetaTileEntity(world, pos) } + .filterIsInstance>() + .forEach { additionalMultiblockBase -> additionalMultiblockBase.connect(this) } + } + } + + @Suppress("UNCHECKED_CAST") + override fun onDataStickLeftClick(player: EntityPlayer, stack: ItemStack) + { + val tag = stack.tagCompound ?: return + if (tag.hasKey("AdditionalPos")) + { + val posTag = tag.getCompoundTag("AdditionalPos") + val targetPos = BlockPos(posTag.getInteger("X"), posTag.getInteger("Y"), posTag.getInteger("Z")) + + val mte = GTUtility.getMetaTileEntity(world, targetPos) + if (mte is AdditionalMultiblockBase<*>) + { + (mte as AdditionalMultiblockBase).connect(this) + player.sendStatusMessage(TextComponentTranslation("gtlitecore.machine.additional_structure.connected"), true) + } + else + { + player.sendStatusMessage(TextComponentTranslation("gtlitecore.machine.additional_structure.not_found"), true) + } + } + } + + override fun onDataStickRightClick(p0: EntityPlayer?, p1: ItemStack?): Boolean = false + + override fun writeInitialSyncData(buf: PacketBuffer) + { + super.writeInitialSyncData(buf) + buf.writeCompoundTag(additionalStructureManager.serialize()) + } + + override fun receiveInitialSyncData(buf: PacketBuffer) + { + super.receiveInitialSyncData(buf) + buf.readCompoundTag()?.let { + additionalStructureManager.deserialize(it) + .map { pos -> GTUtility.getMetaTileEntity(world, pos) } + .filterIsInstance>() + .forEach { additionalMultiblockBase -> additionalMultiblockBase.connect(this) } + } + } +} \ No newline at end of file diff --git a/src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/RecipeMapExtendableMultiblock.kt b/src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/RecipeMapExtendableMultiblock.kt new file mode 100644 index 000000000..93ff275d6 --- /dev/null +++ b/src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/RecipeMapExtendableMultiblock.kt @@ -0,0 +1,120 @@ +package gregtechlite.gtlitecore.api.metatileentity.multiblock.extendable + +import com.cleanroommc.modularui.widgets.ButtonWidget +import gregtech.api.capability.IControllable +import gregtech.api.capability.IDataStickIntractable +import gregtech.api.capability.IWorkable +import gregtech.api.metatileentity.multiblock.MultiblockAbility +import gregtech.api.metatileentity.multiblock.RecipeMapMultiblockController +import gregtech.api.metatileentity.multiblock.ui.MultiblockUIFactory +import gregtech.api.recipes.RecipeMap +import gregtech.api.util.GTUtility +import gregtech.api.util.KeyUtil +import gregtechlite.gtlitecore.api.capability.logic.ExtendableMultiblockRecipeLogic +import gregtechlite.gtlitecore.api.gui.GTLiteMuiTextures +import net.minecraft.entity.player.EntityPlayer +import net.minecraft.item.ItemStack +import net.minecraft.nbt.NBTTagCompound +import net.minecraft.network.PacketBuffer +import net.minecraft.util.ResourceLocation +import net.minecraft.util.math.BlockPos +import net.minecraft.util.text.TextComponentTranslation + +abstract class RecipeMapExtendableMultiblock>(metaTileEntityId: ResourceLocation, recipeMap: RecipeMap<*>) + : RecipeMapMultiblockController(metaTileEntityId, recipeMap), IWorkable, IControllable, IDataStickIntractable, ExtendableMultiblock +{ + override var additionalStructureManager: AdditionalStructureManager = AdditionalStructureManager(this) + override val maintenanceProblem: Byte = maintenanceProblems + + init + { + recipeMapWorkable = ExtendableMultiblockRecipeLogic(this, additionalStructureManager) + } + + override fun getAbilities(ability: MultiblockAbility): List + { + val abilities = super.getAbilities(ability).toMutableList() + abilities.addAll(additionalStructureManager.getAbilities(ability)) + return abilities + } + + override fun createUIFactory(): MultiblockUIFactory? + { + return super.createUIFactory() + .createFlexButton { _, guiSyncManager -> + guiSyncManager.registerSyncedAction("refresh_structure_pattern") { reinitializeStructurePattern() } + return@createFlexButton ButtonWidget() + .background(GTLiteMuiTextures.BUTTON_REFRESH_STRUCTURE_PATTERN) + .disableHoverBackground() + .onMousePressed { + guiSyncManager.callSyncedAction("refresh_structure_pattern") + true + } + .tooltip { tooltip -> + tooltip.addLine(KeyUtil.lang("gtlitecore.machine.space_elevator.refresh_structure_pattern")) + } + } + } + + override fun writeToNBT(data: NBTTagCompound?): NBTTagCompound? + { + data?.setTag("Additional", additionalStructureManager.serialize()) + return super.writeToNBT(data) + } + + override fun readFromNBT(data: NBTTagCompound?) + { + super.readFromNBT(data) + data?.getCompoundTag("Additional")?.let { + additionalStructureManager.deserialize(it) + .map { pos -> GTUtility.getMetaTileEntity(world, pos) } + .filterIsInstance>() + .forEach { additionalMultiblockBase -> additionalMultiblockBase.connect(this) } + } + } + + @Suppress("UNCHECKED_CAST") + override fun onDataStickLeftClick(player: EntityPlayer, stack: ItemStack) + { + val tag = stack.tagCompound ?: return + if (tag.hasKey("AdditionalPos")) + { + val posTag = tag.getCompoundTag("AdditionalPos") + val targetPos = BlockPos(posTag.getInteger("X"), posTag.getInteger("Y"), posTag.getInteger("Z")) + + val mte = GTUtility.getMetaTileEntity(world, targetPos) + if (mte is AdditionalMultiblockBase<*>) + { + (mte as AdditionalMultiblockBase).connect(this) + player.sendStatusMessage(TextComponentTranslation("gtlitecore.machine.additional_structure.connected"), true) + } + else + { + player.sendStatusMessage(TextComponentTranslation("gtlitecore.machine.additional_structure.not_found"), true) + } + } + } + + override fun onDataStickRightClick(player: EntityPlayer, stack: ItemStack): Boolean = false + + override fun getProgress(): Int = recipeMapWorkable.progress + + override fun getMaxProgress(): Int = recipeMapWorkable.maxProgress + + override fun writeInitialSyncData(buf: PacketBuffer) + { + super.writeInitialSyncData(buf) + buf.writeCompoundTag(additionalStructureManager.serialize()) + } + + override fun receiveInitialSyncData(buf: PacketBuffer) + { + super.receiveInitialSyncData(buf) + buf.readCompoundTag()?.let { + additionalStructureManager.deserialize(it) + .map { pos -> GTUtility.getMetaTileEntity(world, pos) } + .filterIsInstance>() + .forEach { additionalMultiblockBase -> additionalMultiblockBase.connect(this) } + } + } +} \ No newline at end of file diff --git a/src/main/kotlin/gregtechlite/gtlitecore/api/recipe/GTLiteRecipeProperties.kt b/src/main/kotlin/gregtechlite/gtlitecore/api/recipe/GTLiteRecipeProperties.kt index 8f37b3219..0fc60e679 100644 --- a/src/main/kotlin/gregtechlite/gtlitecore/api/recipe/GTLiteRecipeProperties.kt +++ b/src/main/kotlin/gregtechlite/gtlitecore/api/recipe/GTLiteRecipeProperties.kt @@ -20,8 +20,6 @@ object GTLiteRecipeProperties lateinit var MINIMUM_HEIGHT: RecipeProperty lateinit var NANO_FORGE_TIER: RecipeProperty lateinit var NO_COIL_TEMPERATURE: RecipeProperty - lateinit var PCB_FACTORY_BIO_CHAMBER_UPGRADE: RecipeProperty - lateinit var PCB_FACTORY_TIER: RecipeProperty lateinit var QUANTUM_FORCE_TRANSFORMER_TIER: RecipeProperty internal fun init() @@ -46,9 +44,6 @@ object GTLiteRecipeProperties listOf(I18n.format("gtlitecore.recipe.temperature", it)) } } - - PCB_FACTORY_TIER = tierProperty(GTLiteMod.id("pcb_factory_tier")) - PCB_FACTORY_BIO_CHAMBER_UPGRADE = tierProperty(GTLiteMod.id("pcb_factory_auxiliary_tier")) } FusionEUToStartProperty.getInstance().apply { diff --git a/src/main/kotlin/gregtechlite/gtlitecore/api/recipe/builder/PCBFactoryRecipeBuilder.kt b/src/main/kotlin/gregtechlite/gtlitecore/api/recipe/builder/PCBFactoryRecipeBuilder.kt index 7aeaa5a38..bb52686e1 100644 --- a/src/main/kotlin/gregtechlite/gtlitecore/api/recipe/builder/PCBFactoryRecipeBuilder.kt +++ b/src/main/kotlin/gregtechlite/gtlitecore/api/recipe/builder/PCBFactoryRecipeBuilder.kt @@ -3,17 +3,27 @@ package gregtechlite.gtlitecore.api.recipe.builder import gregtech.api.recipes.Recipe import gregtech.api.recipes.RecipeBuilder import gregtech.api.recipes.RecipeMap -import gregtech.api.util.EnumValidationResult -import gregtechlite.gtlitecore.api.LOGGER +import gregtechlite.gtlitecore.GTLiteMod import gregtechlite.gtlitecore.api.extension.buildToString -import gregtechlite.gtlitecore.api.recipe.GTLiteRecipeProperties +import gregtechlite.gtlitecore.api.recipe.property.RequestAdditionalProperty +import gregtechlite.gtlitecore.api.recipe.property.value.RequestAdditionalPropertyValue +import net.minecraft.util.ResourceLocation class PCBFactoryRecipeBuilder : RecipeBuilder { - val tier - get() = recipePropertyStorage?.let { recipePropertyStorage.get(GTLiteRecipeProperties.PCB_FACTORY_TIER, 0) } ?: 0 - val upgradeTier - get() = recipePropertyStorage?.let { recipePropertyStorage.get(GTLiteRecipeProperties.PCB_FACTORY_BIO_CHAMBER_UPGRADE, 0) } ?: 0 + val requests + get() = recipePropertyStorage?.let { recipePropertyStorage.get(RequestAdditionalProperty, null) } + + companion object + { + val nanoArray = GTLiteMod.id("nanolithography_array") // T2 + val circDetector = GTLiteMod.id("microscale_circuit_detector") // T3 + val bioChamber = GTLiteMod.id("bio_cultivation_chamber") // Bio Chamber Upgrade + + // TODO: Gooware: Nonlinear Thermodynamic Cycle Unit, Optical: Optoelectronic Carving Room, + // Spintronic: Electromagnetic Effect Generator + // These additional structures are some idea for high tier circuit boards, maybe add it in the future. + } constructor() @@ -24,42 +34,25 @@ class PCBFactoryRecipeBuilder : RecipeBuilder override fun copy(): PCBFactoryRecipeBuilder = PCBFactoryRecipeBuilder(this) + fun requireStruct(vararg ids: ResourceLocation): PCBFactoryRecipeBuilder = apply { + recipePropertyStorage?.get(RequestAdditionalProperty, null)?.additionalStructures?.addAll(ids) + ?: applyProperty(RequestAdditionalProperty, RequestAdditionalPropertyValue(mutableListOf(*ids))) + } + override fun applyPropertyCT(key: String, value: Any): Boolean { - if (key == GTLiteRecipeProperties.PCB_FACTORY_TIER.key) - { - tier((value as Number).toInt()) - return true - } - if (key == GTLiteRecipeProperties.PCB_FACTORY_BIO_CHAMBER_UPGRADE.key) + if (key == RequestAdditionalProperty.key) { - upgradeTier((value as Number).toInt()) + (value as RequestAdditionalPropertyValue).additionalStructures.forEach { + requireStruct(ResourceLocation(it.toString())) + } return true } return super.applyPropertyCT(key, value) } - fun tier(tier: Int): PCBFactoryRecipeBuilder = apply { - if (tier <= 0) - { - LOGGER.error("PCB Factory Tier cannot be less than 0", IllegalArgumentException()) - recipeStatus = EnumValidationResult.INVALID - } - applyProperty(GTLiteRecipeProperties.PCB_FACTORY_TIER, tier) - } - - fun upgradeTier(tier: Int): PCBFactoryRecipeBuilder = apply { - if (tier <= 0) - { - LOGGER.error("PCB Factory Auxiliary Tier cannot be less than 0", IllegalArgumentException()) - recipeStatus = EnumValidationResult.INVALID - } - applyProperty(GTLiteRecipeProperties.PCB_FACTORY_BIO_CHAMBER_UPGRADE, tier) - } - override fun toString(): String = buildToString { appendSuper(super.toString()) - append(GTLiteRecipeProperties.PCB_FACTORY_TIER.key, tier) - append(GTLiteRecipeProperties.PCB_FACTORY_BIO_CHAMBER_UPGRADE.key, upgradeTier) + append(RequestAdditionalProperty.key, requests?.additionalStructures?.joinToString()) } } diff --git a/src/main/kotlin/gregtechlite/gtlitecore/api/recipe/property/RequestAdditionalProperty.kt b/src/main/kotlin/gregtechlite/gtlitecore/api/recipe/property/RequestAdditionalProperty.kt new file mode 100644 index 000000000..089c3533a --- /dev/null +++ b/src/main/kotlin/gregtechlite/gtlitecore/api/recipe/property/RequestAdditionalProperty.kt @@ -0,0 +1,45 @@ +package gregtechlite.gtlitecore.api.recipe.property + +import gregtech.api.recipes.properties.RecipeProperty +import gregtechlite.gtlitecore.api.recipe.property.value.RequestAdditionalPropertyValue +import net.minecraft.client.Minecraft +import net.minecraft.client.resources.I18n +import net.minecraft.nbt.NBTBase +import net.minecraft.nbt.NBTTagList +import net.minecraft.nbt.NBTTagString +import net.minecraft.util.ResourceLocation +import net.minecraftforge.fml.relauncher.Side +import net.minecraftforge.fml.relauncher.SideOnly + +object RequestAdditionalProperty: RecipeProperty( + "request_additional", RequestAdditionalPropertyValue::class.java) +{ + override fun serialize(value: Any): NBTBase + { + val tags = NBTTagList() + castValue(value).additionalStructures.forEach { + tags.appendTag(NBTTagString(it.toString())) + } + return tags + } + + override fun deserialize(nbt: NBTBase): Any + { + val preparedValue = RequestAdditionalPropertyValue() + if (nbt is NBTTagList) + { + nbt.forEach { preparedValue.additionalStructures.add(ResourceLocation((it as NBTTagString).string)) } + } + return preparedValue + } + + @SideOnly(Side.CLIENT) + override fun drawInfo(mc: Minecraft, x: Int, y: Int, color: Int, value: Any) + { + val names = castValue(value).additionalStructures.joinToString(", ") { id -> + val split = id.toString().split(":") + I18n.format("${split[0]}.machine.${split[1]}.name") + } + mc.fontRenderer.drawString(I18n.format("gtlitecore.recipe.request_additional_structures", names), x, y, color) + } +} \ No newline at end of file diff --git a/src/main/kotlin/gregtechlite/gtlitecore/api/recipe/property/value/RequestAdditionalPropertyValue.kt b/src/main/kotlin/gregtechlite/gtlitecore/api/recipe/property/value/RequestAdditionalPropertyValue.kt new file mode 100644 index 000000000..414f38281 --- /dev/null +++ b/src/main/kotlin/gregtechlite/gtlitecore/api/recipe/property/value/RequestAdditionalPropertyValue.kt @@ -0,0 +1,8 @@ +package gregtechlite.gtlitecore.api.recipe.property.value + +import net.minecraft.util.ResourceLocation + +class RequestAdditionalPropertyValue(val additionalStructures: MutableList) +{ + constructor(vararg additionalStructures: ResourceLocation) : this(mutableListOf(*additionalStructures)) +} \ No newline at end of file diff --git a/src/main/kotlin/gregtechlite/gtlitecore/api/unification/material/GTLiteOrganicChemistryMaterials.kt b/src/main/kotlin/gregtechlite/gtlitecore/api/unification/material/GTLiteOrganicChemistryMaterials.kt index e3a8d7532..57b965315 100644 --- a/src/main/kotlin/gregtechlite/gtlitecore/api/unification/material/GTLiteOrganicChemistryMaterials.kt +++ b/src/main/kotlin/gregtechlite/gtlitecore/api/unification/material/GTLiteOrganicChemistryMaterials.kt @@ -705,7 +705,7 @@ object GTLiteOrganicChemistryMaterials polymer() liquid() color(0xE165A7) - flags(DISABLE_DECOMPOSITION, NO_SMASHING, NO_SMELTING, GENERATE_PLATE, GENERATE_FOIL) + flags(DISABLE_DECOMPOSITION, NO_SMASHING, NO_SMELTING, GENERATE_PLATE, GENERATE_FOIL, GENERATE_FINE_WIRE) components(Edot, 1, PolystyreneSulfonate, 1) cableProp(V[ZPM], 6, 1) } diff --git a/src/main/kotlin/gregtechlite/gtlitecore/api/unification/material/GTLiteSecondDegreeMaterials.kt b/src/main/kotlin/gregtechlite/gtlitecore/api/unification/material/GTLiteSecondDegreeMaterials.kt index e02b1fc4d..0fa94ce33 100644 --- a/src/main/kotlin/gregtechlite/gtlitecore/api/unification/material/GTLiteSecondDegreeMaterials.kt +++ b/src/main/kotlin/gregtechlite/gtlitecore/api/unification/material/GTLiteSecondDegreeMaterials.kt @@ -367,7 +367,7 @@ object GTLiteSecondDegreeMaterials fluid() color(0xB4B414).iconSet(SHINY) components(Chrome, 13, Nickel, 3, Molybdenum, 2, Copper, 10, Tungsten, 2, Steel, 20) - flags(EXT_METAL, DECOMPOSITION_BY_CENTRIFUGING, GENERATE_FRAME, GENERATE_BOLT_SCREW) + flags(EXT_METAL, DECOMPOSITION_BY_CENTRIFUGING, GENERATE_FRAME, GENERATE_BOLT_SCREW, GENERATE_ROTOR) blastProp(5400, GasTier.HIGH, // HSS-G VA[IV], 48 * SECOND, VA[EV], 5 * SECOND + 8 * TICK) @@ -621,7 +621,7 @@ object GTLiteSecondDegreeMaterials fluid() color(0xE564E4).iconSet(SHINY) components(Nickel, 22, Cobalt, 4, Chrome, 3, Aluminium, 3, Tungsten, 2, Hafnium, 1, Rhenium, 2, Tantalum, 3) - flags(EXT2_METAL, DECOMPOSITION_BY_CENTRIFUGING, GENERATE_FRAME) + flags(EXT2_METAL, DECOMPOSITION_BY_CENTRIFUGING, GENERATE_FRAME, GENERATE_DOUBLE_PLATE) blastProp(6800, GasTier.HIGH, // Naquadah VA[LuV], 30 * SECOND, VA[EV], 25 * SECOND) @@ -839,7 +839,7 @@ object GTLiteSecondDegreeMaterials color(0x3467BA).iconSet(SHINY) components(Inconel718, 8, EglinSteel, 5, NaquadahEnriched, 4, TungstenSteel, 4, Cerium, 3, Antimony, 2, Platinum, 2, Ytterbium, 1) - flags(EXT2_METAL, GENERATE_DOUBLE_PLATE, GENERATE_DENSE) + flags(EXT2_METAL, GENERATE_DOUBLE_PLATE, GENERATE_DENSE, GENERATE_FINE_WIRE) blastProp(10400, GasTier.HIGHER, // Tritanium VA[UV], 30 * SECOND, VA[LuV], 15 * SECOND) @@ -881,7 +881,7 @@ object GTLiteSecondDegreeMaterials fluid() colorAverage().iconSet(METALLIC) components(Hafnium, 1, Carbon, 1) - flags(EXT_METAL, DECOMPOSITION_BY_CENTRIFUGING, GENERATE_BOLT_SCREW) + flags(EXT_METAL, DECOMPOSITION_BY_CENTRIFUGING, GENERATE_BOLT_SCREW, GENERATE_DOUBLE_PLATE) blastProp(4090, GasTier.MID, // RTM Alloy VA[EV], 1 * MINUTE + 5 * SECOND, VA[HV], 30 * SECOND) diff --git a/src/main/kotlin/gregtechlite/gtlitecore/api/unification/material/info/GTLiteMaterialFlags.kt b/src/main/kotlin/gregtechlite/gtlitecore/api/unification/material/info/GTLiteMaterialFlags.kt index db091d4a0..c79fd76aa 100644 --- a/src/main/kotlin/gregtechlite/gtlitecore/api/unification/material/info/GTLiteMaterialFlags.kt +++ b/src/main/kotlin/gregtechlite/gtlitecore/api/unification/material/info/GTLiteMaterialFlags.kt @@ -12,6 +12,7 @@ import gregtech.api.unification.material.Materials.BlackBronze import gregtech.api.unification.material.Materials.BlueSteel import gregtech.api.unification.material.Materials.BlueTopaz import gregtech.api.unification.material.Materials.Bohrium +import gregtech.api.unification.material.Materials.BorosilicateGlass import gregtech.api.unification.material.Materials.Brass import gregtech.api.unification.material.Materials.Bronze import gregtech.api.unification.material.Materials.Cadmium @@ -37,6 +38,7 @@ import gregtech.api.unification.material.Materials.Emerald import gregtech.api.unification.material.Materials.Erbium import gregtech.api.unification.material.Materials.Europium import gregtech.api.unification.material.Materials.Fermium +import gregtech.api.unification.material.Materials.Gadolinium import gregtech.api.unification.material.Materials.GarnetRed import gregtech.api.unification.material.Materials.GarnetYellow import gregtech.api.unification.material.Materials.Germanium @@ -50,6 +52,7 @@ import gregtech.api.unification.material.Materials.HSSE import gregtech.api.unification.material.Materials.HSSG import gregtech.api.unification.material.Materials.HSSS import gregtech.api.unification.material.Materials.Hafnium +import gregtech.api.unification.material.Materials.Holmium import gregtech.api.unification.material.Materials.Inconel718 import gregtech.api.unification.material.Materials.Indium import gregtech.api.unification.material.Materials.Invar @@ -255,6 +258,7 @@ object GTLiteMaterialFlags Seaborgium.addFlags(GENERATE_BOLT_SCREW) Mendelevium.addFlags(GENERATE_BOLT_SCREW) VanadiumGallium.addFlags(GENERATE_BOLT_SCREW) + Palladium.addFlags(GENERATE_BOLT_SCREW) // boule Diamond.addFlags(GENERATE_BOULE) @@ -407,6 +411,7 @@ object GTLiteMaterialFlags GarnetYellow.addFlags(GENERATE_LENS) Monazite.addFlags(GENERATE_LENS) Zircon.addFlags(GENERATE_LENS) + BorosilicateGlass.addFlags(GENERATE_LENS) // nanite Carbon.addFlags(GENERATE_NANITE) @@ -466,6 +471,9 @@ object GTLiteMaterialFlags Copernicium.addFlags(GENERATE_PLATE) Sulfur.addFlags(GENERATE_PLATE) Roentgenium.addFlags(GENERATE_PLATE) + BorosilicateGlass.addFlags(GENERATE_PLATE) + Gadolinium.addFlags(GENERATE_PLATE) + Holmium.addFlags(GENERATE_PLATE) // plateDouble Inconel718.addFlags(GENERATE_DOUBLE_PLATE) @@ -553,6 +561,7 @@ object GTLiteMaterialFlags Neutronium.addFlags(GENERATE_ROTOR) Duranium.addFlags(GENERATE_ROTOR) VanadiumGallium.addFlags(GENERATE_ROTOR) + Palladium.addFlags(GENERATE_ROTOR) // round Steel.addFlags(GENERATE_ROUND) @@ -664,6 +673,8 @@ object GTLiteMaterialFlags Duranium.addFlags(GENERATE_FINE_WIRE) Rhenium.addFlags(GENERATE_FINE_WIRE) Polycaprolactam.addFlags(GENERATE_FINE_WIRE) + Holmium.addFlags(GENERATE_FINE_WIRE) + Neutronium.addFlags(GENERATE_FINE_WIRE) // Disabled pyrochlore and tantalite ore composition for Niobium-Tantalum chain. Pyrochlore.addFlags(DISABLE_DECOMPOSITION) diff --git a/src/main/kotlin/gregtechlite/gtlitecore/client/renderer/texture/GTLiteOverlays.kt b/src/main/kotlin/gregtechlite/gtlitecore/client/renderer/texture/GTLiteOverlays.kt index d4438dd3f..bab5b1355 100644 --- a/src/main/kotlin/gregtechlite/gtlitecore/client/renderer/texture/GTLiteOverlays.kt +++ b/src/main/kotlin/gregtechlite/gtlitecore/client/renderer/texture/GTLiteOverlays.kt @@ -253,6 +253,10 @@ object GTLiteOverlays val VANADIUM_GALLIUM_CASING = casingId("metal/vanadium_gallium") @JvmField val NEUTRONIUM_CASING = casingId("metal/neutronium") + @JvmField + val OSMIRIDIUM_CASING = casingId("metal/osmiridium") + @JvmField + val INFINITY_COOLING_CASING = casingId("special/infinity_cooling_casing") // endregion diff --git a/src/main/kotlin/gregtechlite/gtlitecore/common/metatileentity/GTLiteMetaTileEntities.kt b/src/main/kotlin/gregtechlite/gtlitecore/common/metatileentity/GTLiteMetaTileEntities.kt index ba80c20d3..698e1a8f1 100644 --- a/src/main/kotlin/gregtechlite/gtlitecore/common/metatileentity/GTLiteMetaTileEntities.kt +++ b/src/main/kotlin/gregtechlite/gtlitecore/common/metatileentity/GTLiteMetaTileEntities.kt @@ -131,8 +131,13 @@ import gregtechlite.gtlitecore.common.metatileentity.multiblock.mega.MultiblockE import gregtechlite.gtlitecore.common.metatileentity.multiblock.mega.MultiblockMatterReshapingFramework import gregtechlite.gtlitecore.common.metatileentity.multiblock.mega.MultiblockNanoAssemblyComplex import gregtechlite.gtlitecore.common.metatileentity.multiblock.mega.MultiblockPlasmaArcTransmitter +import gregtechlite.gtlitecore.common.metatileentity.multiblock.module.MultiblockBioCultivationChamber +import gregtechlite.gtlitecore.common.metatileentity.multiblock.module.MultiblockMicroscaleCircuitDetector +import gregtechlite.gtlitecore.common.metatileentity.multiblock.module.MultiblockNanolithographyArray import gregtechlite.gtlitecore.common.metatileentity.multiblock.module.MultiblockSpaceAssembler import gregtechlite.gtlitecore.common.metatileentity.multiblock.module.MultiblockSpacePump +import gregtechlite.gtlitecore.common.metatileentity.multiblock.module.MultiblockThermosinkCoolingTower +import gregtechlite.gtlitecore.common.metatileentity.multiblock.module.MultiblockWaterCoolingTower import gregtechlite.gtlitecore.common.metatileentity.multiblock.primitive.MultiblockAdvancedPrimitiveBlastFurnace import gregtechlite.gtlitecore.common.metatileentity.multiblock.primitive.MultiblockCoagulationTank import gregtechlite.gtlitecore.common.metatileentity.multiblock.steam.SteamMultiblockAlloySmelter @@ -295,7 +300,12 @@ object GTLiteMetaTileEntities lateinit var COSMIC_RAY_DETECTOR: MultiblockCosmicRayDetector lateinit var STELLAR_FORGE: MultiblockStellarForge lateinit var PLASMA_ENHANCED_CVD_UNIT: MultiblockPlasmaEnhancedCVDUnit - lateinit var PCB_FACTORY: MultiblockPCBFactory + lateinit var PCB_FACTORY: MultiblockPCBFactory<*> + lateinit var NANOLITHOGRAPHY_ARRAY: MultiblockNanolithographyArray<*> + lateinit var MICROSCALE_CIRCUIT_DETECTOR: MultiblockMicroscaleCircuitDetector<*> + lateinit var BIO_CULTIVATION_CHAMBER: MultiblockBioCultivationChamber<*> + lateinit var WATER_COOLING_TOWER: MultiblockWaterCoolingTower<*> + lateinit var THERMOSINK_COOLING_TOWER: MultiblockThermosinkCoolingTower<*> lateinit var NANO_FORGE: MultiblockNanoForge lateinit var QUANTUM_FORCE_TRANSFORMER: MultiblockQuantumForceTransformer lateinit var ANTIMATTER_FORGE: MultiblockAntimatterForge @@ -804,27 +814,38 @@ object GTLiteMetaTileEntities STELLAR_FORGE = register(10023, MultiblockStellarForge(GTLiteMod.id("stellar_forge"))) PLASMA_ENHANCED_CVD_UNIT = register(10024, MultiblockPlasmaEnhancedCVDUnit(GTLiteMod.id("plasma_enhanced_cvd_unit"))) PCB_FACTORY = register(10025, MultiblockPCBFactory(GTLiteMod.id("pcb_factory"))) - NANO_FORGE = register(10026, MultiblockNanoForge(GTLiteMod.id("nano_forge"))) - QUANTUM_FORCE_TRANSFORMER = register(10027, MultiblockQuantumForceTransformer(GTLiteMod.id("quantum_force_transformer"))) - ANTIMATTER_FORGE = register(10028, MultiblockAntimatterForge(GTLiteMod.id("antimatter_forge"))) - ANTIMATTER_GENERATOR = register(10029, MultiblockAntimatterGenerator(GTLiteMod.id("antimatter_generator"))) - SPACE_ELEVATOR = register(10030, MultiblockSpaceElevator(GTLiteMod.id("space_elevator"))) - SPACE_ASSEMBLER_MK1 = register(10031, MultiblockSpaceAssembler(GTLiteMod.id("space_assembler_module.mk1"), UHV, 1, 1)) - SPACE_ASSEMBLER_MK2 = register(10032, MultiblockSpaceAssembler(GTLiteMod.id("space_assembler_module.mk2"), UEV, 2, 3)) - SPACE_ASSEMBLER_MK3 = register(10033, MultiblockSpaceAssembler(GTLiteMod.id("space_assembler_module.mk3"), UIV, 3, 5)) - - // 10034 TODO SPACE_MINER_MK1 - // 10035 TODO SPACE_MINER_MK2 - // 10036 TODO SPACE_MINER_MK3 - - SPACE_PUMP_MK1 = register(10037, MultiblockSpacePump(GTLiteMod.id("space_pump_module.mk1"), UV, 1, 1)) - SPACE_PUMP_MK2 = register(10038, MultiblockSpacePump(GTLiteMod.id("space_pump_module.mk2"), UHV, 2, 2)) - SPACE_PUMP_MK3 = register(10039, MultiblockSpacePump(GTLiteMod.id("space_pump_module.mk3"), UEV, 3, 4)) - - // 10040 TODO DYSON_SWARM_GROUND_UNIT - - ENERGY_INFUSER = register(10041, MultiblockEnergyInfuser(GTLiteMod.id("energy_infuser"))) - INTEGRATED_ORE_PROCESSOR = register(10042, MultiblockIntegratedOreProcessor(GTLiteMod.id("integrated_ore_processor"))) + NANOLITHOGRAPHY_ARRAY = register(10026, MultiblockNanolithographyArray(GTLiteMod.id("nanolithography_array"))) + MICROSCALE_CIRCUIT_DETECTOR = register(10027, MultiblockMicroscaleCircuitDetector(GTLiteMod.id("microscale_circuit_detector"))) + BIO_CULTIVATION_CHAMBER = register(10028, MultiblockBioCultivationChamber(GTLiteMod.id("bio_cultivation_chamber"))) + // Gooware 29 + // Optic 30 + // Spintronic 31 + WATER_COOLING_TOWER = register(10032, MultiblockWaterCoolingTower(GTLiteMod.id("water_cooling_tower"))) + THERMOSINK_COOLING_TOWER = register(10033, MultiblockThermosinkCoolingTower(GTLiteMod.id("thermosink_cooling_tower"))) + NANO_FORGE = register(10034, MultiblockNanoForge(GTLiteMod.id("nano_forge"))) + // T2 35 + // T3 36 + // T4 37 + QUANTUM_FORCE_TRANSFORMER = register(10038, MultiblockQuantumForceTransformer(GTLiteMod.id("quantum_force_transformer"))) + ANTIMATTER_FORGE = register(10039, MultiblockAntimatterForge(GTLiteMod.id("antimatter_forge"))) + ANTIMATTER_GENERATOR = register(10040, MultiblockAntimatterGenerator(GTLiteMod.id("antimatter_generator"))) + SPACE_ELEVATOR = register(10041, MultiblockSpaceElevator(GTLiteMod.id("space_elevator"))) + SPACE_ASSEMBLER_MK1 = register(10042, MultiblockSpaceAssembler(GTLiteMod.id("space_assembler_module.mk1"), UHV, 1, 1)) + SPACE_ASSEMBLER_MK2 = register(10043, MultiblockSpaceAssembler(GTLiteMod.id("space_assembler_module.mk2"), UEV, 2, 3)) + SPACE_ASSEMBLER_MK3 = register(10044, MultiblockSpaceAssembler(GTLiteMod.id("space_assembler_module.mk3"), UIV, 3, 5)) + + // 10045 TODO SPACE_MINER_MK1 + // 10046 TODO SPACE_MINER_MK2 + // 10047 TODO SPACE_MINER_MK3 + + SPACE_PUMP_MK1 = register(10048, MultiblockSpacePump(GTLiteMod.id("space_pump_module.mk1"), UV, 1, 1)) + SPACE_PUMP_MK2 = register(10049, MultiblockSpacePump(GTLiteMod.id("space_pump_module.mk2"), UHV, 2, 2)) + SPACE_PUMP_MK3 = register(10050, MultiblockSpacePump(GTLiteMod.id("space_pump_module.mk3"), UEV, 3, 4)) + + // 10051 TODO DYSON_SWARM_GROUND_UNIT + + ENERGY_INFUSER = register(10052, MultiblockEnergyInfuser(GTLiteMod.id("energy_infuser"))) + INTEGRATED_ORE_PROCESSOR = register(10053, MultiblockIntegratedOreProcessor(GTLiteMod.id("integrated_ore_processor"))) // ... diff --git a/src/main/kotlin/gregtechlite/gtlitecore/common/metatileentity/multiblock/MultiblockPCBFactory.kt b/src/main/kotlin/gregtechlite/gtlitecore/common/metatileentity/multiblock/MultiblockPCBFactory.kt index 80dad50a9..c9c275f18 100644 --- a/src/main/kotlin/gregtechlite/gtlitecore/common/metatileentity/multiblock/MultiblockPCBFactory.kt +++ b/src/main/kotlin/gregtechlite/gtlitecore/common/metatileentity/multiblock/MultiblockPCBFactory.kt @@ -1,9 +1,8 @@ package gregtechlite.gtlitecore.common.metatileentity.multiblock -import gregtech.api.GTValues.ULV +import com.morphismmc.morphismlib.util.ItemUtil import gregtech.api.capability.impl.EnergyContainerList import gregtech.api.capability.impl.ItemHandlerList -import gregtech.api.capability.impl.MultiblockRecipeLogic import gregtech.api.gui.Widget import gregtech.api.metatileentity.MetaTileEntity import gregtech.api.metatileentity.interfaces.IGregTechTileEntity @@ -15,74 +14,57 @@ import gregtech.api.metatileentity.multiblock.MultiblockAbility.INPUT_ENERGY import gregtech.api.metatileentity.multiblock.MultiblockAbility.INPUT_LASER import gregtech.api.metatileentity.multiblock.MultiblockAbility.MAINTENANCE_HATCH import gregtech.api.metatileentity.multiblock.MultiblockAbility.SUBSTATION_INPUT_ENERGY -import gregtech.api.metatileentity.multiblock.RecipeMapMultiblockController import gregtech.api.pattern.BlockPattern import gregtech.api.pattern.FactoryBlockPattern -import gregtech.api.pattern.MultiblockShapeInfo -import gregtech.api.pattern.PatternMatchContext -import gregtech.api.recipes.Recipe +import gregtech.api.recipes.logic.OCResult +import gregtech.api.recipes.logic.OverclockingLogic.PERFECT_DURATION_FACTOR +import gregtech.api.recipes.logic.OverclockingLogic.STD_DURATION_FACTOR +import gregtech.api.recipes.properties.RecipePropertyStorage import gregtech.api.unification.OreDictUnifier +import gregtech.api.unification.material.Materials.DistilledWater import gregtech.api.unification.material.Materials.Gold -import gregtech.api.unification.material.Materials.Osmiridium import gregtech.api.unification.material.Materials.Silver -import gregtech.api.util.RelativeDirection.DOWN -import gregtech.api.util.RelativeDirection.FRONT -import gregtech.api.util.RelativeDirection.LEFT import gregtech.client.renderer.ICubeRenderer -import gregtech.common.blocks.MetaBlocks -import gregtech.common.metatileentities.MetaTileEntities -import gregtechlite.gtlitecore.api.pattern.TraceabilityPredicates.SNOW_LAYER -import gregtechlite.gtlitecore.api.pattern.TraceabilityPredicates.optionalStates +import gregtechlite.gtlitecore.GTLiteMod +import gregtechlite.gtlitecore.api.SECOND +import gregtechlite.gtlitecore.api.capability.logic.ExtendableMultiblockRecipeLogic +import gregtechlite.gtlitecore.api.metatileentity.multiblock.extendable.RecipeMapExtendableMultiblock import gregtechlite.gtlitecore.api.recipe.GTLiteRecipeMaps.PCB_FACTORY_RECIPES -import gregtechlite.gtlitecore.api.recipe.GTLiteRecipeProperties import gregtechlite.gtlitecore.api.unification.GTLiteMaterials.HSLASteel import gregtechlite.gtlitecore.api.unification.ore.GTLiteOrePrefix.nanite import gregtechlite.gtlitecore.client.renderer.texture.GTLiteOverlays -import gregtechlite.gtlitecore.common.block.adapter.GTBoilerCasing import gregtechlite.gtlitecore.common.block.adapter.GTCleanroomCasing -import gregtechlite.gtlitecore.common.block.adapter.GTFusionCasing import gregtechlite.gtlitecore.common.block.adapter.GTGlassCasing -import gregtechlite.gtlitecore.common.block.adapter.GTMetalCasing import gregtechlite.gtlitecore.common.block.adapter.GTMultiblockCasing import gregtechlite.gtlitecore.common.block.variant.MetalCasing import gregtechlite.gtlitecore.common.block.variant.MultiblockCasing -import gregtechlite.gtlitecore.common.metatileentity.GTLiteMetaTileEntities +import gregtechlite.gtlitecore.common.metatileentity.multiblock.module.MultiblockBioCultivationChamber +import gregtechlite.gtlitecore.common.metatileentity.multiblock.module.MultiblockMicroscaleCircuitDetector +import gregtechlite.gtlitecore.common.metatileentity.multiblock.module.MultiblockNanolithographyArray +import gregtechlite.gtlitecore.common.metatileentity.multiblock.module.MultiblockThermosinkCoolingTower +import gregtechlite.gtlitecore.common.metatileentity.multiblock.module.MultiblockWaterCoolingTower import net.minecraft.client.resources.I18n -import net.minecraft.init.Blocks import net.minecraft.item.ItemStack -import net.minecraft.nbt.NBTTagCompound -import net.minecraft.network.PacketBuffer -import net.minecraft.util.EnumFacing import net.minecraft.util.ResourceLocation import net.minecraft.util.math.MathHelper.clamp import net.minecraft.world.World import net.minecraftforge.fml.relauncher.Side import net.minecraftforge.fml.relauncher.SideOnly -import kotlin.math.floor +import kotlin.math.max +import kotlin.math.min /** - * TODO Redo structure pattern checking with Mui2 and patterning structures when GTCEu merged related - * pull (patterning MTEs and Mui2 rework). + * Additional Structures: + * - T2: [MultiblockNanolithographyArray] + * - T3: [MultiblockMicroscaleCircuitDetector] + * - Cooling Upgrade: [MultiblockWaterCoolingTower] + * - Advanced Cooling Upgrade: [MultiblockThermosinkCoolingTower] + * - Bio Chamber Upgrade: [MultiblockBioCultivationChamber] */ -class MultiblockPCBFactory(id: ResourceLocation) : RecipeMapMultiblockController(id, PCB_FACTORY_RECIPES) +class MultiblockPCBFactory>(id: ResourceLocation) + : RecipeMapExtendableMultiblock(id, PCB_FACTORY_RECIPES) { - - /** - * Main structure level of PCB Factory, has 3 upgrade. - */ - private var mainUpgradeNumber = 0 - /** - * Auxiliary structure level of PCB Factory, has 1 upgrade now. - */ - private var auxiliaryUpgradeNumber = 0 - /** - * Cooling structure level of PCB Factory, has 2 upgrade now. - */ - private var coolingUpgradeNumber = 0 - - /** - * Trace size to modify durations and OC params, default: 100μm, range: 25~200μm. - */ + // Trace size to modify durations and OC params, default: 100μm, range: 25~200μm. private var traceSize = 100 private val minTraceSize = 25 private val maxTraceSize = 200 @@ -94,59 +76,16 @@ class MultiblockPCBFactory(id: ResourceLocation) : RecipeMapMultiblockController companion object { - private val casingState = MetalCasing.IRIDIUM.state + private val firstCasingState = MetalCasing.IRIDIUM.state private val secondCasingState = GTCleanroomCasing.PLASCRETE.state private val thirdCasingState = GTMultiblockCasing.GRATE_CASING.state private val fourthCasingState = MultiblockCasing.SUBSTRATE_CASING.state - private val fifthCasingState = MetalCasing.OSMIRIDIUM.state - private val sixthCasingState = MetalCasing.NAQUADAH_ALLOY.state - private val seventhCasingState = MetalCasing.NEUTRONIUM.state - private val eighthCasingState = MultiblockCasing.INFINITY_COOLING_CASING.state - private val ninthCasingState = GTMetalCasing.STAINLESS_CLEAN.state - - private val pipeCasingState= GTBoilerCasing.TUNGSTENSTEEL_PIPE.state - private val turbineCasingState = GTMultiblockCasing.EXTREME_ENGINE_INTAKE_CASING.state - - private val coilState = GTFusionCasing.SUPERCONDUCTOR_COIL.state private val glassState= GTGlassCasing.LAMINATED_GLASS.state } override fun createMetaTileEntity(te: IGregTechTileEntity): MetaTileEntity = MultiblockPCBFactory(metaTileEntityId) - /** - * PCB Factory has an asynchronous upgrade system, which used 3 params to control it: - * - [mainUpgradeNumber]: Main structure tier predicate (3); - * - [auxiliaryUpgradeNumber]: Auxiliary structure tier predicate (1); - * - [coolingUpgradeNumber]: Cooling structure tier predicate (2). - */ - override fun formStructure(context: PatternMatchContext) - { - super.formStructure(context) - // Main structure upgrade numbers. - mainUpgradeNumber += 1 // T1 structure for default - if (context.get("MainStructureUpgradeT2") != null) - mainUpgradeNumber += 1 // T2 structure upgrade - if (context.get("MainStructureUpgradeT3") != null) - mainUpgradeNumber += 1 // T3 structure upgrade - // Auxiliary structure upgrade numbers. - if (context.get("BioChamberStructureUpgrade") != null) - auxiliaryUpgradeNumber += 1 // Bio chamber structure upgrade - // Cooling structure upgrade numbers. - if (context.get("CoolingStructureUpgradeT1") != null) - coolingUpgradeNumber += 1 // Liquid cooling tower structure upgrade - if (context.get("CoolingStructureUpgradeT2") != null) - coolingUpgradeNumber += 1 // Thermosink structure upgrade - } - - override fun invalidate() - { - super.invalidate() - mainUpgradeNumber = 0 - auxiliaryUpgradeNumber = 0 - coolingUpgradeNumber = 0 - } - override fun initializeAbilities() { super.initializeAbilities() @@ -159,67 +98,34 @@ class MultiblockPCBFactory(id: ResourceLocation) : RecipeMapMultiblockController // @formatter:off override fun createStructurePattern(): BlockPattern = FactoryBlockPattern.start() - .aisle(" gHHHg nTTTn ", " gPPPg nQQQn ", " g g n n ", " g g n n ", " gJJJg nRRRn ", " g g n n ", " g g n n ", " g g n n ", " g g n n ", " gIIIg nTTTn ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") - .aisle(" HHHHH TTTTT ", " PIIIP QOOOQ ", " III OOO ", " III OOO ", " JIIIJ ROOOR ", " III OOO ", " III OOO ", " PPP QQQ ", " III TTT ", " I###I T###T ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") - .aisle(" HHHHH TTTTT ", " PI*IP QOUOQ ", " I#I OUO ", " I#I OUO ", " JI#IJ ROUOR ", " I#I OUO ", " I#I OUO ", " P#P QUQ ", " I#I TUT ", " I###I T###T ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") - .aisle(" KKKKK HHHHH TTTTT ", " PIIIP QOOOQ ", " III OOO ", " III OOO ", " JIIIJ ROOOR ", " III OOO ", " III OOO ", " PPP QQQ ", " III TTT ", " I###I T###T ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") - .aisle("KKKKKKK gHHHg nTTTn ", " KKK gPPPg nQQQn ", " KKK g g n n ", " KKK g g n n ", " KKK gJJJg nRRRn ", " KKK g g n n ", " KKK g g n n ", " KKK g g n n ", " KKK g g n n ", " KKK gIIIg nTTTn ", " KKK ", " KKK ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") - .aisle("KKKKKKK ", " K###K ", " K###K ", " K###K ", " K###K ", " K###K ", " K###K ", " K###K ", " K###K ", " K###K ", " K###K ", " K###K ", " LLL ", " LLL ", " ", " ", " ", " ", " ", " ", " ", " ") - .aisle("KKKKKKK ", " K###K ", " K###K ", " K###K ", " K###K ", " K###K ", " K###K ", " K###K ", " K###K ", " K###K ", " L#L ", " K###K ", " L#L ", " L#L ", " LKL ", " LKL ", " K ", " K ", " K ", " K ", " K ", " ") - .aisle("KKKKKKK fEEf ", " K###K fEEf ", " K###K fEEf ", " K###K ", " K###K ", " K###K ", " K###K ", " K###K ", " K###K ", " K###K ", " L#L ", " K###K ", " L#L ", " L#L ", " L#L ", " L#L ", " L#L ", " L#L ", " L#L ", " L#L ", " K ", " K ") - .aisle("KKKKKKK EEEE ", " K###K E##E ", " K###K E##E ", " K###K fEEf ", " K###K fEEf ", " K###K ", " L#L ", " L#L ", " L#L ", " K###K ", " L#L ", " K###K ", " K###K ", " K###K ", " K###K ", " K###K ", " K###K ", " K###K ", " L#L ", " L#L ", " K ", " K ") - .aisle("KKKKKKK EEEEFCCCCCF ", " K###K E##EFCCCCCF ", " K###K E##EFCCCCCF ", " K###K E##EFCCCCCF ", " K###K E##EF F ", " K###K fEEf ", " L#L ", " L#L ", " L#L ", " K###K ", " L#L ", " K###K ", " K###K ", " K###K ", " K###K ", " K###K ", " K###K ", " K###K ", " L#L ", " LKL ", " K ", " ") - .aisle("KKKKKKK EEEECcccccC hMMMh hMMMh", " K###K E##EC#####C hNNNh hNNNh", " K###K E##EC#####C hNNNh hNNNh", " K###K E##EC#####C hNNNh hNNNh", " K###K E##ECCCCCCC h h h h", " K###K EEEEF F ", " LLL fEEf ", " LLL ", " LLL ", " K###K ", " K###K ", " K###K ", " K#L#K ", " K#L#K ", " K#L#K ", " K###K ", " K###K ", " K###K ", " LLL ", " LLL ", " ", " ") - .aisle("KKKKKKK EEEECcccccC MMMMM MMMMM", " KKK E##ED#XXX#D N###N N###N", " KKK E##ED#####D N###N N###N", " KKK E##EC#####C N###N N###N", " KKK E##ECCCCCCC MMM MMM ", " KKK EEEEF F ", " fEEf ", " ", " ", " KKK ", " KKK ", " KKK ", " K K ", " K K ", " K K ", " KKK ", " KKK ", " KKK ", " ", " ", " ", " ") - .aisle(" KKKKK EEEECcccccC MMMMM MMMMM", " E##ED#XXX#D N###N N###N", " E##ED#####D N###N N###N", " E##EC#####C N###N N###N", " E##ECCCCCCC MMM MMM ", " EEEEFFFFFFF M M ", " fEEf MMMMMM ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") - .aisle(" EEEECcccccC MMMMM MMMMM", " E##ED#XXX#D N###N N###N", " E##ED#####D N###N N###N", " E##EC#####C N###N N###N", " E##ECGGGGGC MMM MMM ", " EEEEF F ", " fEEf ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") - .aisle(" EEEECcccccC hMMMh hMMMh", " E##EC#####C hNNNh hNNNh", " E##EC#####C hNNNh hNNNh", " E##EC#####C hNNNh hNNNh", " E##ECGGGGGC h h h h", " EEEEF F ", " fEEf ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") - .aisle(" EEEEFCCSCCF ", " E##EFGGGGGF ", " E##EFGGGGGF ", " E##EFGGGGGF ", " E##EFFFFFFF ", " fEEf ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") - .aisle(" EEEE ", " E##E ", " E##E ", " fEEf ", " fEEf ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") - .aisle(" fEEf ", " fEEf ", " fEEf ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") - // Multiblock controller + .aisle("FCCCCCF", "FCCCCCF", "FCCCCCF", "FCCCCCF", "F F", " ") + .aisle("CcccccC", "C#####C", "C#####C", "C#####C", "CCCCCCC", "F F") + .aisle("CcccccC", "D#XXX#D", "D#####D", "C#####C", "CCCCCCC", "F F") + .aisle("CcccccC", "D#XXX#D", "D#####D", "C#####C", "CCCCCCC", "FFFFFFF") + .aisle("CcccccC", "D#XXX#D", "D#####D", "C#####C", "CGGGGGC", "F F") + .aisle("CcccccC", "C#####C", "C#####C", "C#####C", "CGGGGGC", "F F") + .aisle("FCCSCCF", "FGGGGGF", "FGGGGGF", "FGGGGGF", "FFFFFFF", " ") .where('S', selfPredicate()) - // T1 Main structure - .where('C', states(casingState) // Iridium casing + .where('C', states(firstCasingState) .setMinGlobalLimited(40) .or(abilities(MAINTENANCE_HATCH) - .setExactLimit(1)) + .setExactLimit(1)) .or(abilities(INPUT_ENERGY) - .setMaxGlobalLimited(2)) + .setMaxGlobalLimited(2)) .or(abilities(INPUT_LASER) - .setMaxGlobalLimited(1)) - .or(abilities(IMPORT_ITEMS, EXPORT_ITEMS, IMPORT_FLUIDS))) - .where('c', states(secondCasingState)) // Plascrete - .where('D', states(thirdCasingState)) // Grate casing + .setMaxGlobalLimited(1)) + .or(abilities(IMPORT_ITEMS) + .setPreviewCount(1)) + .or(abilities(EXPORT_ITEMS) + .setPreviewCount(1)) + .or(abilities(IMPORT_FLUIDS) + .setPreviewCount(1))) + .where('c', states(secondCasingState)) + .where('D', states(thirdCasingState)) .where('F', frames(HSLASteel)) - .where('G', states(glassState)) // Laminated glass - .where('X', states(fourthCasingState)) // Substrate casing - // T2 Main structure - .where('E', optionalStates("MainStructureUpgradeT2", fifthCasingState)) // Osmiridium casing - .where('f', optionalStates("MainStructureUpgradeT2", MetaBlocks.FRAMES[Osmiridium]!!.getBlock(Osmiridium))) - // Liquid Cooling Tower structure - .where('H', optionalStates("CoolingStructureUpgradeT1", fifthCasingState)) // Osmiridium casing - .where('I', optionalStates("CoolingStructureUpgradeT1", sixthCasingState)) // Naquadah Alloy casing - .where('J', optionalStates("CoolingStructureUpgradeT1", turbineCasingState)) // Extreme intake casing - .where('P', optionalStates("CoolingStructureUpgradeT1", pipeCasingState)) // Tungsten steel pipe casing - .where('g', optionalStates("CoolingStructureUpgradeT1", MetaBlocks.FRAMES[HSLASteel]!!.getBlock(HSLASteel))) - // T3 Main structure - .where('K', optionalStates("MainStructureUpgradeT3", seventhCasingState)) // Neutronium casing - .where('L', optionalStates("MainStructureUpgradeT3", sixthCasingState)) // Naquadah Alloy casing - // Bio Chamber structure - .where('M', optionalStates("BioChamberStructureUpgrade", ninthCasingState)) // Stainless Steel casing - .where('h', optionalStates("BioChamberStructureUpgrade", MetaBlocks.FRAMES[HSLASteel]!!.getBlock(HSLASteel))) - .where('N', optionalStates("BioChamberStructureUpgrade", glassState)) - // Thermosink structure - .where('O', optionalStates("CoolingStructureUpgradeT2", eighthCasingState)) // Infinity cooling machine casing - .where('Q', optionalStates("CoolingStructureUpgradeT2", pipeCasingState)) // Tungsten steel pipe casing - .where('R', optionalStates("CoolingStructureUpgradeT2", turbineCasingState)) // Extreme intake casing - .where('T', optionalStates("CoolingStructureUpgradeT2", fifthCasingState)) // Osmiridium casing - .where('U', optionalStates("CoolingStructureUpgradeT2", coilState)) // Superconductor coil - .where('n', optionalStates("CoolingStructureUpgradeT2", MetaBlocks.FRAMES[HSLASteel]!!.getBlock(HSLASteel))) - // Misc structure contents + .where('G', states(glassState)) + .where('X', states(fourthCasingState)) .where('#', air()) - .where('*', air().or(SNOW_LAYER)) .where(' ', any()) .build() @@ -238,110 +144,32 @@ class MultiblockPCBFactory(id: ResourceLocation) : RecipeMapMultiblockController return group }*/ - override fun writeToNBT(data: NBTTagCompound): NBTTagCompound - { - data.setInteger("TraceSize", traceSize) - return super.writeToNBT(data) - } - - override fun readFromNBT(data: NBTTagCompound) - { - traceSize = data.getInteger("TraceSize") - super.readFromNBT(data) - } - - override fun writeInitialSyncData(buf: PacketBuffer) - { - super.writeInitialSyncData(buf) - buf.writeVarInt(traceSize) - } - - override fun receiveInitialSyncData(buf: PacketBuffer) - { - super.receiveInitialSyncData(buf) - traceSize = buf.readVarInt() - } + // override fun writeToNBT(data: NBTTagCompound): NBTTagCompound + // { + // data.setInteger("TraceSize", traceSize) + // return super.writeToNBT(data) + // } +// + // override fun readFromNBT(data: NBTTagCompound) + // { + // traceSize = data.getInteger("TraceSize") + // super.readFromNBT(data) + // } +// + // override fun writeInitialSyncData(buf: PacketBuffer) + // { + // super.writeInitialSyncData(buf) + // buf.writeVarInt(traceSize) + // } +// + // override fun receiveInitialSyncData(buf: PacketBuffer) + // { + // super.receiveInitialSyncData(buf) + // traceSize = buf.readVarInt() + // } override fun getBaseTexture(sourcePart: IMultiblockPart?): ICubeRenderer = GTLiteOverlays.IRIDIUM_CASING - // @formatter:off - - override fun getMatchingShapes(): MutableList - { - val shapeInfo: MutableList = ArrayList() - val builder = MultiblockShapeInfo.builder(LEFT, DOWN, FRONT) - .aisle(" gHHHg nTTTn ", " gPPPg nQQQn ", " g g n n ", " g g n n ", " gJJJg nRRRn ", " g g n n ", " g g n n ", " g g n n ", " g g n n ", " gIIIg nTTTn ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") - .aisle(" HHHHH TTTTT ", " PIIIP QOOOQ ", " III OOO ", " III OOO ", " JIIIJ ROOOR ", " III OOO ", " III OOO ", " PPP QQQ ", " III TTT ", " I###I T###T ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") - .aisle(" HHHHH TTTTT ", " PI*IP QOUOQ ", " I#I OUO ", " I#I OUO ", " JI#IJ ROUOR ", " I#I OUO ", " I#I OUO ", " P#P QUQ ", " I#I TUT ", " I###I T###T ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") - .aisle(" KKKKK HHHHH TTTTT ", " PIIIP QOOOQ ", " III OOO ", " III OOO ", " JIIIJ ROOOR ", " III OOO ", " III OOO ", " PPP QQQ ", " III TTT ", " I###I T###T ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") - .aisle("KKKKKKK gHHHg nTTTn ", " KKK gPPPg nQQQn ", " KKK g g n n ", " KKK g g n n ", " KKK gJJJg nRRRn ", " KKK g g n n ", " KKK g g n n ", " KKK g g n n ", " KKK g g n n ", " KKK gIIIg nTTTn ", " KKK ", " KKK ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") - .aisle("KKKKKKK ", " K###K ", " K###K ", " K###K ", " K###K ", " K###K ", " K###K ", " K###K ", " K###K ", " K###K ", " K###K ", " K###K ", " LLL ", " LLL ", " ", " ", " ", " ", " ", " ", " ", " ") - .aisle("KKKKKKK ", " K###K ", " K###K ", " K###K ", " K###K ", " K###K ", " K###K ", " K###K ", " K###K ", " K###K ", " L#L ", " K###K ", " L#L ", " L#L ", " LKL ", " LKL ", " K ", " K ", " K ", " K ", " K ", " ") - .aisle("KKKKKKK fEEf ", " K###K fEEf ", " K###K fEEf ", " K###K ", " K###K ", " K###K ", " K###K ", " K###K ", " K###K ", " K###K ", " L#L ", " K###K ", " L#L ", " L#L ", " L#L ", " L#L ", " L#L ", " L#L ", " L#L ", " L#L ", " K ", " K ") - .aisle("KKKKKKK EEEE ", " K###K E##E ", " K###K E##E ", " K###K fEEf ", " K###K fEEf ", " K###K ", " L#L ", " L#L ", " L#L ", " K###K ", " L#L ", " K###K ", " K###K ", " K###K ", " K###K ", " K###K ", " K###K ", " K###K ", " L#L ", " L#L ", " K ", " K ") - .aisle("KKKKKKK EEEEFCCCeeF ", " K###K E##EFCCCCCF ", " K###K E##EFCCCCCF ", " K###K E##EFCCCCCF ", " K###K E##EF F ", " K###K fEEf ", " L#L ", " L#L ", " L#L ", " K###K ", " L#L ", " K###K ", " K###K ", " K###K ", " K###K ", " K###K ", " K###K ", " K###K ", " L#L ", " LKL ", " K ", " ") - .aisle("KKKKKKK EEEECcccccC hMMMh hMMMh", " K###K E##EC#####C hNNNh hNNNh", " K###K E##EC#####C hNNNh hNNNh", " K###K E##EC#####C hNNNh hNNNh", " K###K E##ECCCCCCC h h h h", " K###K EEEEF F ", " LLL fEEf ", " LLL ", " LLL ", " K###K ", " K###K ", " K###K ", " K#L#K ", " K#L#K ", " K#L#K ", " K###K ", " K###K ", " K###K ", " LLL ", " LLL ", " ", " ") - .aisle("KKKKKKK EEEECcccccC MMMMM MMMMM", " KKK E##ED#XXX#D N###N N###N", " KKK E##ED#####D N###N N###N", " KKK E##EC#####C N###N N###N", " KKK E##ECCCCCCC MMM MMM ", " KKK EEEEF F ", " fEEf ", " ", " ", " KKK ", " KKK ", " KKK ", " K K ", " K K ", " K K ", " KKK ", " KKK ", " KKK ", " ", " ", " ", " ") - .aisle(" KKKKK EEEECcccccC MMMMM MMMMM", " E##ED#XXX#D N###N N###N", " E##ED#####D N###N N###N", " E##EC#####C N###N N###N", " E##ECCCCCCC MMM MMM ", " EEEEFFFFFFF M M ", " fEEf MMMMMM ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") - .aisle(" EEEECcccccC MMMMM MMMMM", " E##ED#XXX#D N###N N###N", " E##ED#####D N###N N###N", " E##EC#####C N###N N###N", " E##ECGGGGGC MMM MMM ", " EEEEF F ", " fEEf ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") - .aisle(" EEEECcccccC hMMMh hMMMh", " E##EC#####C hNNNh hNNNh", " E##EC#####C hNNNh hNNNh", " E##EC#####C hNNNh hNNNh", " E##ECGGGGGC h h h h", " EEEEF F ", " fEEf ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") - .aisle(" EEEEFijSmkF ", " E##EFGGGGGF ", " E##EFGGGGGF ", " E##EFGGGGGF ", " E##EFFFFFFF ", " fEEf ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") - .aisle(" EEEE ", " E##E ", " E##E ", " fEEf ", " fEEf ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") - .aisle(" fEEf ", " fEEf ", " fEEf ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") - .where('S', GTLiteMetaTileEntities.PCB_FACTORY, EnumFacing.SOUTH) - .where('C', casingState) // Iridium casing - .where('c', secondCasingState) // Plascrete - .where('D', thirdCasingState) // Grate casing - .where('F', MetaBlocks.FRAMES[HSLASteel]!!.getBlock(HSLASteel)) - .where('G', glassState) - .where('X', fourthCasingState) - .where('i', MetaTileEntities.ITEM_IMPORT_BUS[ULV], EnumFacing.SOUTH) - .where('j', MetaTileEntities.ITEM_EXPORT_BUS[ULV], EnumFacing.SOUTH) - .where('k', MetaTileEntities.FLUID_IMPORT_HATCH[ULV], EnumFacing.SOUTH) - .where('m', MetaTileEntities.MAINTENANCE_HATCH, EnumFacing.SOUTH) - .where('e', MetaTileEntities.ENERGY_INPUT_HATCH[ULV], EnumFacing.NORTH) - .where('#', Blocks.AIR.defaultState) - .where('*', Blocks.AIR.defaultState) - .where(' ', Blocks.AIR.defaultState) - shapeInfo.add(builder.build()) - // T2 main structure - shapeInfo.add(builder - .where('E', fifthCasingState) // Osmiridium casing - .where('f', MetaBlocks.FRAMES[Osmiridium]!!.getBlock(Osmiridium)) - .build()) - // Liquid Cooling Tower structure - shapeInfo.add(builder - .where('H', fifthCasingState) // Osmiridium casing - .where('I', sixthCasingState) // Naquadah Alloy casing - .where('J', turbineCasingState) // Extreme intake casing - .where('P', pipeCasingState) // Tungsten steel pipe casing - .where('g', MetaBlocks.FRAMES[HSLASteel]!!.getBlock(HSLASteel)) - .build()) - // T3 main structure - shapeInfo.add(builder - .where('K', seventhCasingState) // Neutronium casing - .where('L', sixthCasingState) // Naquadah Alloy casing - .build()) - // Bio Chamber structure - shapeInfo.add(builder - .where('M', ninthCasingState) // Stainless Steel casing - .where('h', MetaBlocks.FRAMES[HSLASteel]!!.getBlock(HSLASteel)) - .where('N', glassState) - .build()) - // Thermosink structure - shapeInfo.add(builder - .where('O', eighthCasingState) // Infinity cooling machine casing - .where('Q', pipeCasingState) // Tungsten steel pipe casing - .where('R', turbineCasingState) // Extreme intake casing - .where('T', fifthCasingState) // Osmiridium casing - .where('U', coilState) // Superconductor coil - .where('n', MetaBlocks.FRAMES[HSLASteel]!!.getBlock(HSLASteel)) - .build()) - return shapeInfo - } - - // @formatter:on - @SideOnly(Side.CLIENT) override fun addInformation(stack: ItemStack, world: World?, tooltip: MutableList, advanced: Boolean) { @@ -353,14 +181,7 @@ class MultiblockPCBFactory(id: ResourceLocation) : RecipeMapMultiblockController tooltip.add(I18n.format("gtlitecore.machine.pcb_factory.tooltip.5")) tooltip.add(I18n.format("gtlitecore.machine.pcb_factory.tooltip.6")) tooltip.add(I18n.format("gtlitecore.machine.pcb_factory.tooltip.7")) - tooltip.add(I18n.format("gtlitecore.machine.pcb_factory.tooltip.8")) - tooltip.add(I18n.format("gtlitecore.machine.pcb_factory.tooltip.9")) - tooltip.add(I18n.format("gtlitecore.machine.pcb_factory.tooltip.10")) - tooltip.add(I18n.format("gtlitecore.machine.pcb_factory.tooltip.11")) - tooltip.add(I18n.format("gtlitecore.machine.pcb_factory.tooltip.12")) - tooltip.add(I18n.format("gtlitecore.machine.pcb_factory.tooltip.13")) - tooltip.add(I18n.format("gtlitecore.machine.pcb_factory.tooltip.14")) - tooltip.add(I18n.format("gtlitecore.machine.pcb_factory.tooltip.15")) + tooltip.add(I18n.format("gtlitecore.tooltip.machine.laser_hatch")) } // TODO @@ -411,92 +232,148 @@ class MultiblockPCBFactory(id: ResourceLocation) : RecipeMapMultiblockController traceSize = clamp(traceSize + 25, minTraceSize, maxTraceSize) } - override fun checkRecipe(recipe: Recipe, consumeIfSuccess: Boolean): Boolean + private inner class PCBFactoryRecipeLogic(mte: RecipeMapExtendableMultiblock) : ExtendableMultiblockRecipeLogic(mte, additionalStructureManager) { - return super.checkRecipe(recipe, consumeIfSuccess) - && recipe.getProperty(GTLiteRecipeProperties.PCB_FACTORY_TIER, 0)!! <= mainUpgradeNumber - && recipe.getProperty(GTLiteRecipeProperties.PCB_FACTORY_BIO_CHAMBER_UPGRADE, 0)!! <= auxiliaryUpgradeNumber - } + private var hasWaterCooling: Boolean = false - private inner class PCBFactoryRecipeLogic(mte: RecipeMapMultiblockController) : MultiblockRecipeLogic(mte) - { - - override fun getOverclockingDurationFactor() = when (coolingUpgradeNumber) + override fun getOverclockingDurationFactor(): Double { - 0 -> 1.0 // Non OC - 1 -> 0.5 // Normal OC - 2 -> 0.25 // Perfect OC - else -> 0.0 // Error OC + if (additionalStructureManager.get(GTLiteMod.id("water_cooling_tower")).isNotEmpty()) // 4/2 + { + if (additionalStructureManager.get(GTLiteMod.id("thermosink_cooling_tower")).isNotEmpty()) // 4/4 + return PERFECT_DURATION_FACTOR + return STD_DURATION_FACTOR + } + return 1.0 // 1/1 } - override fun getParallelLimit() = calculateParallelByNanites() + override fun getOverclockingVoltageFactor(): Double + { + if (additionalStructureManager.get(GTLiteMod.id("water_cooling_tower")).isNotEmpty() + || additionalStructureManager.get(GTLiteMod.id("thermosink_cooling_tower")).isNotEmpty()) + return super.getOverclockingVoltageFactor() + return 1.0 // 1/1 + } - override fun setMaxProgress(maxProgress: Int) + override fun getParallelLimit(): Int { - maxProgressTime = when (traceSize) + val targetNanite = OreDictUnifier.get(nanite, Silver) + val targetAdvancedNanite = OreDictUnifier.get(nanite, Gold) + + var count = 0 + var countAdvanced = 0 + + if (additionalStructureManager.get(GTLiteMod.id("nanolithography_array")).isNotEmpty()) { - 25 -> floor(0.4 * maxProgress).toInt() - 50 -> floor(0.6 * maxProgress).toInt() - 75 -> floor(0.8 * maxProgress).toInt() - 125 -> floor(1.2 * maxProgress).toInt() - 150 -> floor(1.4 * maxProgress).toInt() - 175 -> floor(1.6 * maxProgress).toInt() - 200 -> floor(1.8 * maxProgress).toInt() - else -> maxProgress + val abilities = additionalStructureManager.get(GTLiteMod.id("nanolithography_array"))[0].getAbilities(IMPORT_ITEMS) + val itemInputs = ItemHandlerList(abilities) + for (i in 0 until itemInputs.slots) + { + val currentStack = itemInputs.getStackInSlot(i) + if (ItemUtil.areItemTagsEqual(targetNanite, currentStack, false)) + count = 2 * currentStack.count + } } + + if (additionalStructureManager.get(GTLiteMod.id("microscale_circuit_detector")).isNotEmpty()) + { + val abilities = additionalStructureManager.get(GTLiteMod.id("microscale_circuit_detector"))[0].getAbilities(IMPORT_ITEMS) + val itemInputs = ItemHandlerList(abilities) + for (i in 0 until itemInputs.slots) + { + val currentStack = itemInputs.getStackInSlot(i) + if (ItemUtil.areItemTagsEqual(targetAdvancedNanite, currentStack, false)) + countAdvanced = 4 * currentStack.count + } + } + return min(count + countAdvanced, Int.MAX_VALUE - 1) // I think it's safe... may some edge case will break this? } override fun updateRecipeProgress() { - val traceSizeFactor = when (traceSize) - { - 25 -> 2.5 - 50 -> 2 - 75 -> 1.5 - 125 -> 0.9 - 150 -> 0.8 - 175 -> 0.7 - 200 -> 0.6 - else -> 1 - } - val actuallyEnergyConsumed: Int = recipeEUt.toInt() * traceSizeFactor.toInt() - if (canRecipeProgress && drawEnergy(actuallyEnergyConsumed.toLong(), true)) + if (additionalStructureManager.get(GTLiteMod.id("water_cooling_tower")).isEmpty()) + return super.updateRecipeProgress() + + val abilities = additionalStructureManager.get(GTLiteMod.id("water_cooling_tower"))[0].getAbilities(IMPORT_FLUIDS) + if (canRecipeProgress && drawEnergy(recipeEUt, true)) { - drawEnergy(actuallyEnergyConsumed.toLong(), false) + val inputTank = abilities[0] + val coolant = DistilledWater.getFluid(50) + // Water cooling + if (coolant.isFluidStackIdentical(inputTank.fluid)) + { + inputTank.drain(coolant.amount, true) + hasWaterCooling = true + } + + // TODO: Trace Size + if (++progressTime > maxProgressTime) completeRecipe() - if (hasNotEnoughEnergy && energyInputPerSecond > 19L * actuallyEnergyConsumed.toLong()) + + if (hasNotEnoughEnergy && energyInputPerSecond > ((SECOND - 1) * recipeEUt)) hasNotEnoughEnergy = false } - else if (actuallyEnergyConsumed > 0) + else if (recipeEUt > 0) { hasNotEnoughEnergy = true decreaseProgress() } } - private fun calculateParallelByNanites(): Int + override fun modifyOverclockPost(ocResult: OCResult, storage: RecipePropertyStorage) { - val itemInputInventory = getAbilities(IMPORT_ITEMS) - val itemInputs = ItemHandlerList(itemInputInventory) - var parallelBase = 0 - for (i in 0 until itemInputs.slots) + super.modifyOverclockPost(ocResult, storage) + // +400% | D' = D / (1 + 4.0) = D / 5.0 + if (hasWaterCooling) { - parallelBase = itemInputs.getStackInSlot(i).count - if (mainUpgradeNumber == 2) - { - if (itemInputs.getStackInSlot(i).isItemEqual(OreDictUnifier.get(nanite, Silver))) - return parallelBase * 2 - } - if (mainUpgradeNumber == 3) - { - if (itemInputs.getStackInSlot(i).isItemEqual(OreDictUnifier.get(nanite, Gold))) - return parallelBase * 4 - } + ocResult.setDuration(max(1, (ocResult.duration() * 1.0 / 5.0).toInt())) } - return parallelBase } + // override fun setMaxProgress(maxProgress: Int) + // { + // maxProgressTime = when (traceSize) + // { + // 25 -> floor(0.4 * maxProgress).toInt() + // 50 -> floor(0.6 * maxProgress).toInt() + // 75 -> floor(0.8 * maxProgress).toInt() + // 125 -> floor(1.2 * maxProgress).toInt() + // 150 -> floor(1.4 * maxProgress).toInt() + // 175 -> floor(1.6 * maxProgress).toInt() + // 200 -> floor(1.8 * maxProgress).toInt() + // else -> maxProgress + // } + // } +// + // override fun updateRecipeProgress() + // { + // val traceSizeFactor = when (traceSize) + // { + // 25 -> 2.5 + // 50 -> 2 + // 75 -> 1.5 + // 125 -> 0.9 + // 150 -> 0.8 + // 175 -> 0.7 + // 200 -> 0.6 + // else -> 1 + // } + // val actuallyEnergyConsumed: Int = recipeEUt.toInt() * traceSizeFactor.toInt() + // if (canRecipeProgress && drawEnergy(actuallyEnergyConsumed.toLong(), true)) + // { + // drawEnergy(actuallyEnergyConsumed.toLong(), false) + // if (++progressTime > maxProgressTime) + // completeRecipe() + // if (hasNotEnoughEnergy && energyInputPerSecond > 19L * actuallyEnergyConsumed.toLong()) + // hasNotEnoughEnergy = false + // } + // else if (actuallyEnergyConsumed > 0) + // { + // hasNotEnoughEnergy = true + // decreaseProgress() + // } + // } } } \ No newline at end of file diff --git a/src/main/kotlin/gregtechlite/gtlitecore/common/metatileentity/multiblock/module/MultiblockBioCultivationChamber.kt b/src/main/kotlin/gregtechlite/gtlitecore/common/metatileentity/multiblock/module/MultiblockBioCultivationChamber.kt new file mode 100644 index 000000000..057d63cec --- /dev/null +++ b/src/main/kotlin/gregtechlite/gtlitecore/common/metatileentity/multiblock/module/MultiblockBioCultivationChamber.kt @@ -0,0 +1,59 @@ +package gregtechlite.gtlitecore.common.metatileentity.multiblock.module + +import gregtech.api.metatileentity.MetaTileEntity +import gregtech.api.metatileentity.interfaces.IGregTechTileEntity +import gregtech.api.metatileentity.multiblock.IMultiblockPart +import gregtech.api.pattern.BlockPattern +import gregtech.api.pattern.FactoryBlockPattern +import gregtech.client.renderer.ICubeRenderer +import gregtech.client.renderer.texture.Textures +import gregtechlite.gtlitecore.api.metatileentity.multiblock.extendable.AdditionalMultiblockBase +import gregtechlite.gtlitecore.api.unification.GTLiteMaterials.HSLASteel +import gregtechlite.gtlitecore.common.block.adapter.GTMetalCasing +import gregtechlite.gtlitecore.common.block.variant.GlassCasing +import gregtechlite.gtlitecore.common.metatileentity.multiblock.MultiblockPCBFactory +import net.minecraft.client.resources.I18n +import net.minecraft.item.ItemStack +import net.minecraft.util.ResourceLocation +import net.minecraft.world.World + +class MultiblockBioCultivationChamber>(id: ResourceLocation) : AdditionalMultiblockBase(id) +{ + companion object + { + private val casingState = GTMetalCasing.STAINLESS_CLEAN.state + private val glassState = GlassCasing.GREENHOUSE.state + } + + override fun createMetaTileEntity(te: IGregTechTileEntity): MetaTileEntity = MultiblockBioCultivationChamber(metaTileEntityId) + + override fun updateFormedValid() + { + mainController?.addAdditional(this) + } + + override fun createStructurePattern(): BlockPattern = FactoryBlockPattern.start() + .aisle("hMMMh hMMMh", "hNNNh hNNNh", "hNNNh hNNNh", "hNNNh hNNNh", "h h h h", " ", " ") + .aisle("MMMMM MMMMM", "N###N N###N", "N###N N###N", "N###N N###N", " MMM MMM ", " ", " ") + .aisle("MMMMM MMMMM", "N###N N###N", "N###N N###N", "N###N N###N", " MMM MMM ", " M M ", " MMMMMM ") + .aisle("MMMMM MMMMM", "N###N N###N", "N###N N###N", "N###N N###N", " MMM MMM ", " ", " ") + .aisle("hMSMh hMMMh", "hNNNh hNNNh", "hNNNh hNNNh", "hNNNh hNNNh", "h h h h", " ", " ") + .where('S', selfPredicate()) + .where('M', states(casingState)) + .where('h', frames(HSLASteel)) + .where('N', states(glassState)) + .where('#', air()) + .where(' ', any()) + .build() + + override fun getBaseTexture(source: IMultiblockPart?): ICubeRenderer = Textures.CLEAN_STAINLESS_STEEL_CASING + + override fun getFrontOverlay(): ICubeRenderer = Textures.PROCESSING_ARRAY_OVERLAY + + override fun addInformation(stack: ItemStack, world: World?, tooltip: MutableList, advanced: Boolean) + { + super.addInformation(stack, world, tooltip, advanced) + tooltip.add(I18n.format("gtlitecore.tooltip.machine.machine_type", + I18n.format("gtlitecore.machine.pcb_factory.additional_structure_name"))) + } +} \ No newline at end of file diff --git a/src/main/kotlin/gregtechlite/gtlitecore/common/metatileentity/multiblock/module/MultiblockMicroscaleCircuitDetector.kt b/src/main/kotlin/gregtechlite/gtlitecore/common/metatileentity/multiblock/module/MultiblockMicroscaleCircuitDetector.kt new file mode 100644 index 000000000..2075838d7 --- /dev/null +++ b/src/main/kotlin/gregtechlite/gtlitecore/common/metatileentity/multiblock/module/MultiblockMicroscaleCircuitDetector.kt @@ -0,0 +1,68 @@ +package gregtechlite.gtlitecore.common.metatileentity.multiblock.module + +import gregtech.api.metatileentity.MetaTileEntity +import gregtech.api.metatileentity.interfaces.IGregTechTileEntity +import gregtech.api.metatileentity.multiblock.IMultiblockPart +import gregtech.api.metatileentity.multiblock.MultiblockAbility.IMPORT_ITEMS +import gregtech.api.pattern.BlockPattern +import gregtech.api.pattern.FactoryBlockPattern +import gregtech.client.renderer.ICubeRenderer +import gregtech.client.renderer.texture.Textures +import gregtechlite.gtlitecore.api.metatileentity.multiblock.extendable.AdditionalMultiblockBase +import gregtechlite.gtlitecore.client.renderer.texture.GTLiteOverlays +import gregtechlite.gtlitecore.common.block.variant.MetalCasing +import gregtechlite.gtlitecore.common.metatileentity.multiblock.MultiblockPCBFactory +import net.minecraft.client.resources.I18n +import net.minecraft.item.ItemStack +import net.minecraft.util.ResourceLocation +import net.minecraft.world.World + +class MultiblockMicroscaleCircuitDetector>(id: ResourceLocation) : AdditionalMultiblockBase(id) +{ + companion object + { + private val casingState = MetalCasing.NEUTRONIUM.state + private val secondCasingState = MetalCasing.NAQUADAH_ALLOY.state + } + + override fun createMetaTileEntity(te: IGregTechTileEntity): MetaTileEntity = MultiblockMicroscaleCircuitDetector(metaTileEntityId) + + override fun updateFormedValid() + { + mainController?.addAdditional(this) + } + + override fun createStructurePattern(): BlockPattern = FactoryBlockPattern.start() + .aisle(" KKKKK ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle("KKKKKKK", " KKK ", " KKK ", " KKK ", " KKK ", " KKK ", " KKK ", " KKK ", " KKK ", " KKK ", " KKK ", " KKK ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle("KKKKKKK", " K###K ", " K###K ", " K###K ", " K###K ", " K###K ", " K###K ", " K###K ", " K###K ", " K###K ", " K###K ", " K###K ", " LLL ", " LLL ", " ", " ", " ", " ", " ", " ", " ", " ") + .aisle("KKKKKKK", " K###K ", " K###K ", " K###K ", " K###K ", " K###K ", " K###K ", " K###K ", " K###K ", " K###K ", " L#L ", " K###K ", " L#L ", " L#L ", " LKL ", " LKL ", " K ", " K ", " K ", " K ", " K ", " ") + .aisle("KKKKKKK", " K###K ", " K###K ", " K###K ", " K###K ", " K###K ", " K###K ", " K###K ", " K###K ", " K###K ", " L#L ", " K###K ", " L#L ", " L#L ", " L#L ", " L#L ", " L#L ", " L#L ", " L#L ", " L#L ", " K ", " K ") + .aisle("KKKKKKK", " K###K ", " K###K ", " K###K ", " K###K ", " K###K ", " L#L ", " L#L ", " L#L ", " K###K ", " L#L ", " K###K ", " K###K ", " K###K ", " K###K ", " K###K ", " K###K ", " K###K ", " L#L ", " L#L ", " K ", " K ") + .aisle("KKKKKKK", " K###K ", " K###K ", " K###K ", " K###K ", " K###K ", " L#L ", " L#L ", " L#L ", " K###K ", " L#L ", " K###K ", " K###K ", " K###K ", " K###K ", " K###K ", " K###K ", " K###K ", " L#L ", " LKL ", " K ", " ") + .aisle("KKKKKKK", " K###K ", " K###K ", " K###K ", " K###K ", " K###K ", " LLL ", " LLL ", " LLL ", " K###K ", " K###K ", " K###K ", " K#L#K ", " K#L#K ", " K#L#K ", " K###K ", " K###K ", " K###K ", " LLL ", " LLL ", " ", " ") + .aisle("KKKKKKK", " KKK ", " KKK ", " KKK ", " KKK ", " KKK ", " ", " ", " ", " KKK ", " KKK ", " KKK ", " K K ", " K K ", " K K ", " KKK ", " KKK ", " KKK ", " ", " ", " ", " ") + .aisle(" KKSKK ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ") + .where('S', selfPredicate()) + .where('K', states(casingState) + .setMinGlobalLimited(282) + .or(abilities(IMPORT_ITEMS) + .setPreviewCount(1))) + .where('L', states(secondCasingState)) + .where('#', air()) + .where(' ', any()) + .build() + + override fun getBaseTexture(source: IMultiblockPart?): ICubeRenderer = GTLiteOverlays.NEUTRONIUM_CASING + + override fun getFrontOverlay(): ICubeRenderer = Textures.PROCESSING_ARRAY_OVERLAY + + override fun addInformation(stack: ItemStack, world: World?, tooltip: MutableList, advanced: Boolean) + { + super.addInformation(stack, world, tooltip, advanced) + tooltip.add(I18n.format("gtlitecore.tooltip.machine.machine_type", + I18n.format("gtlitecore.machine.pcb_factory.additional_structure_name"))) + tooltip.add(I18n.format("gtlitecore.machine.microscale_circuit_detector.tooltip.1")) + tooltip.add(I18n.format("gtlitecore.machine.microscale_circuit_detector.tooltip.2")) + } +} \ No newline at end of file diff --git a/src/main/kotlin/gregtechlite/gtlitecore/common/metatileentity/multiblock/module/MultiblockNanolithographyArray.kt b/src/main/kotlin/gregtechlite/gtlitecore/common/metatileentity/multiblock/module/MultiblockNanolithographyArray.kt new file mode 100644 index 000000000..fc0457493 --- /dev/null +++ b/src/main/kotlin/gregtechlite/gtlitecore/common/metatileentity/multiblock/module/MultiblockNanolithographyArray.kt @@ -0,0 +1,69 @@ +package gregtechlite.gtlitecore.common.metatileentity.multiblock.module + +import gregtech.api.metatileentity.MetaTileEntity +import gregtech.api.metatileentity.interfaces.IGregTechTileEntity +import gregtech.api.metatileentity.multiblock.IMultiblockPart +import gregtech.api.metatileentity.multiblock.MultiblockAbility.IMPORT_ITEMS +import gregtech.api.pattern.BlockPattern +import gregtech.api.pattern.FactoryBlockPattern +import gregtech.api.unification.material.Materials.Osmiridium +import gregtech.client.renderer.ICubeRenderer +import gregtech.client.renderer.texture.Textures +import gregtechlite.gtlitecore.api.metatileentity.multiblock.extendable.AdditionalMultiblockBase +import gregtechlite.gtlitecore.client.renderer.texture.GTLiteOverlays +import gregtechlite.gtlitecore.common.block.variant.MetalCasing +import gregtechlite.gtlitecore.common.metatileentity.multiblock.MultiblockPCBFactory +import net.minecraft.client.resources.I18n +import net.minecraft.item.ItemStack +import net.minecraft.util.ResourceLocation +import net.minecraft.world.World + +class MultiblockNanolithographyArray>(id: ResourceLocation) : AdditionalMultiblockBase(id) +{ + companion object + { + private val casingState = MetalCasing.OSMIRIDIUM.state + } + + override fun createMetaTileEntity(te: IGregTechTileEntity): MetaTileEntity = MultiblockNanolithographyArray(metaTileEntityId) + + override fun updateFormedValid() + { + mainController?.addAdditional(this) + } + + override fun createStructurePattern(): BlockPattern = FactoryBlockPattern.start() + .aisle("FEEF", "FEEF", "FEEF", " ", " ", " ", " ") + .aisle("EEEE", "E##E", "E##E", "FEEF", "FEEF", " ", " ") + .aisle("EEEE", "E##E", "E##E", "E##E", "E##E", "FEEF", " ") + .aisle("EEEE", "E##E", "E##E", "E##E", "E##E", "EEEE", "FEEF") + .aisle("EEEE", "E##E", "E##E", "E##E", "E##E", "EEEE", "FEEF") + .aisle("EEEE", "E##E", "E##E", "E##E", "E##E", "EEEE", "FEEF") + .aisle("EEEE", "E##E", "E##E", "E##E", "E##E", "EEEE", "FEEF") + .aisle("EEEE", "E##E", "E##E", "E##E", "E##E", "EEEE", "FEEF") + .aisle("EEEE", "E##E", "E##E", "E##E", "E##E", "FEEF", " ") + .aisle("EEEE", "E##E", "E##E", "FEEF", "FEEF", " ", " ") + .aisle("FEEF", "FSEF", "FEEF", " ", " ", " ", " ") + .where('S', selfPredicate()) + .where('E', states(casingState) + .setMinGlobalLimited(140) + .or(abilities(IMPORT_ITEMS) + .setPreviewCount(1))) + .where('F', frames(Osmiridium)) + .where('#', air()) + .where(' ', any()) + .build() + + override fun getBaseTexture(source: IMultiblockPart?): ICubeRenderer = GTLiteOverlays.OSMIRIDIUM_CASING + + override fun getFrontOverlay(): ICubeRenderer = Textures.PROCESSING_ARRAY_OVERLAY + + override fun addInformation(stack: ItemStack, world: World?, tooltip: MutableList, advanced: Boolean) + { + super.addInformation(stack, world, tooltip, advanced) + tooltip.add(I18n.format("gtlitecore.tooltip.machine.machine_type", + I18n.format("gtlitecore.machine.pcb_factory.additional_structure_name"))) + tooltip.add(I18n.format("gtlitecore.machine.nanolithography_array.tooltip.1")) + tooltip.add(I18n.format("gtlitecore.machine.nanolithography_array.tooltip.2")) + } +} diff --git a/src/main/kotlin/gregtechlite/gtlitecore/common/metatileentity/multiblock/module/MultiblockThermosinkCoolingTower.kt b/src/main/kotlin/gregtechlite/gtlitecore/common/metatileentity/multiblock/module/MultiblockThermosinkCoolingTower.kt new file mode 100644 index 000000000..3694cbf26 --- /dev/null +++ b/src/main/kotlin/gregtechlite/gtlitecore/common/metatileentity/multiblock/module/MultiblockThermosinkCoolingTower.kt @@ -0,0 +1,75 @@ +package gregtechlite.gtlitecore.common.metatileentity.multiblock.module + +import gregtech.api.metatileentity.MetaTileEntity +import gregtech.api.metatileentity.interfaces.IGregTechTileEntity +import gregtech.api.metatileentity.multiblock.IMultiblockPart +import gregtech.api.pattern.BlockPattern +import gregtech.api.pattern.FactoryBlockPattern +import gregtech.client.renderer.ICubeRenderer +import gregtech.client.renderer.texture.Textures +import gregtechlite.gtlitecore.api.metatileentity.multiblock.extendable.AdditionalMultiblockBase +import gregtechlite.gtlitecore.api.pattern.TraceabilityPredicates.SNOW_LAYER +import gregtechlite.gtlitecore.api.unification.GTLiteMaterials.HSLASteel +import gregtechlite.gtlitecore.client.renderer.texture.GTLiteOverlays +import gregtechlite.gtlitecore.common.block.adapter.GTBoilerCasing +import gregtechlite.gtlitecore.common.block.adapter.GTFusionCasing +import gregtechlite.gtlitecore.common.block.adapter.GTMultiblockCasing +import gregtechlite.gtlitecore.common.block.variant.MetalCasing +import gregtechlite.gtlitecore.common.block.variant.MultiblockCasing +import gregtechlite.gtlitecore.common.metatileentity.multiblock.MultiblockPCBFactory +import net.minecraft.client.resources.I18n +import net.minecraft.item.ItemStack +import net.minecraft.util.ResourceLocation +import net.minecraft.world.World + +class MultiblockThermosinkCoolingTower>(id: ResourceLocation) : AdditionalMultiblockBase(id) +{ + companion object + { + private val casingState = MultiblockCasing.INFINITY_COOLING_CASING.state + private val secondCasingState = MetalCasing.OSMIRIDIUM.state + + private val pipeCasingState = GTBoilerCasing.TUNGSTENSTEEL_PIPE.state + private val turbineCasingState = GTMultiblockCasing.EXTREME_ENGINE_INTAKE_CASING.state + + private val coilState = GTFusionCasing.SUPERCONDUCTOR_COIL.state + } + + override fun createMetaTileEntity(te: IGregTechTileEntity): MetaTileEntity = MultiblockThermosinkCoolingTower(metaTileEntityId) + + override fun updateFormedValid() + { + mainController?.addAdditional(this) + } + + override fun createStructurePattern(): BlockPattern = FactoryBlockPattern.start() + .aisle("nTTTn", "nQQQn", "n n", "n n", "nRRRn", "n n", "n n", "n n", "n n", "nTTTn") + .aisle("TTTTT", "QOOOQ", " OOO ", " OOO ", "ROOOR", " OOO ", " OOO ", " QQQ ", " TTT ", "T***T") + .aisle("TTTTT", "QOUOQ", " OUO ", " OUO ", "ROUOR", " OUO ", " OUO ", " QUQ ", " TUT ", "T*#*T") + .aisle("TTTTT", "QOOOQ", " OOO ", " OOO ", "ROOOR", " OOO ", " OOO ", " QQQ ", " TTT ", "T***T") + .aisle("nTSTn", "nQQQn", "n n", "n n", "nRRRn", "n n", "n n", "n n", "n n", "nTTTn") + .where('S', selfPredicate()) + .where('O', states(casingState)) + .where('Q', states(pipeCasingState)) + .where('R', states(turbineCasingState)) + .where('T', states(secondCasingState)) + .where('U', states(coilState)) + .where('n', frames(HSLASteel)) + .where('*', air().or(SNOW_LAYER)) + .where('#', air()) + .where(' ', any()) + .build() + + override fun getBaseTexture(sourcePart: IMultiblockPart?): ICubeRenderer = GTLiteOverlays.INFINITY_COOLING_CASING + + override fun getFrontOverlay(): ICubeRenderer = Textures.PROCESSING_ARRAY_OVERLAY + + override fun addInformation(stack: ItemStack, world: World?, tooltip: MutableList, advanced: Boolean) + { + super.addInformation(stack, world, tooltip, advanced) + tooltip.add(I18n.format("gtlitecore.tooltip.machine.machine_type", + I18n.format("gtlitecore.machine.pcb_factory.additional_structure_name"))) + tooltip.add(I18n.format("gtlitecore.machine.thermosink_cooling_tower.tooltip.1")) + tooltip.add(I18n.format("gtlitecore.machine.thermosink_cooling_tower.tooltip.2")) + } +} \ No newline at end of file diff --git a/src/main/kotlin/gregtechlite/gtlitecore/common/metatileentity/multiblock/module/MultiblockWaterCoolingTower.kt b/src/main/kotlin/gregtechlite/gtlitecore/common/metatileentity/multiblock/module/MultiblockWaterCoolingTower.kt new file mode 100644 index 000000000..6e6136eea --- /dev/null +++ b/src/main/kotlin/gregtechlite/gtlitecore/common/metatileentity/multiblock/module/MultiblockWaterCoolingTower.kt @@ -0,0 +1,76 @@ +package gregtechlite.gtlitecore.common.metatileentity.multiblock.module + +import gregtech.api.metatileentity.MetaTileEntity +import gregtech.api.metatileentity.interfaces.IGregTechTileEntity +import gregtech.api.metatileentity.multiblock.IMultiblockPart +import gregtech.api.metatileentity.multiblock.MultiblockAbility.IMPORT_FLUIDS +import gregtech.api.pattern.BlockPattern +import gregtech.api.pattern.FactoryBlockPattern +import gregtech.client.renderer.ICubeRenderer +import gregtech.client.renderer.texture.Textures +import gregtechlite.gtlitecore.api.metatileentity.multiblock.extendable.AdditionalMultiblockBase +import gregtechlite.gtlitecore.api.pattern.TraceabilityPredicates.SNOW_LAYER +import gregtechlite.gtlitecore.api.unification.GTLiteMaterials.HSLASteel +import gregtechlite.gtlitecore.client.renderer.texture.GTLiteOverlays +import gregtechlite.gtlitecore.common.block.adapter.GTBoilerCasing +import gregtechlite.gtlitecore.common.block.adapter.GTMultiblockCasing +import gregtechlite.gtlitecore.common.block.variant.MetalCasing +import gregtechlite.gtlitecore.common.metatileentity.multiblock.MultiblockPCBFactory +import net.minecraft.client.resources.I18n +import net.minecraft.item.ItemStack +import net.minecraft.util.ResourceLocation +import net.minecraft.world.World + +class MultiblockWaterCoolingTower>(id: ResourceLocation) : AdditionalMultiblockBase(id) +{ + companion object + { + private val casingState = MetalCasing.OSMIRIDIUM.state + private val secondCasingState = MetalCasing.NAQUADAH_ALLOY.state + + private val pipeCasingState = GTBoilerCasing.TUNGSTENSTEEL_PIPE.state + private val turbineCasingState = GTMultiblockCasing.EXTREME_ENGINE_INTAKE_CASING.state + } + + override fun createMetaTileEntity(te: IGregTechTileEntity): MetaTileEntity = MultiblockWaterCoolingTower(metaTileEntityId) + + override fun updateFormedValid() + { + mainController?.addAdditional(this) + } + + override fun createStructurePattern(): BlockPattern = FactoryBlockPattern.start() + .aisle("gHHHg", "gPPPg", "g g", "g g", "gJJJg", "g g", "g g", "g g", "g g", "gIIIg") + .aisle("HHHHH", "PIIIP", " III ", " III ", "JIIIJ", " III ", " III ", " PPP ", " III ", "I***I") + .aisle("HHHHH", "PI*IP", " I#I ", " I#I ", "JI#IJ", " I#I ", " I#I ", " P#P ", " I#I ", "I*#*I") + .aisle("HHHHH", "PIIIP", " III ", " III ", "JIIIJ", " III ", " III ", " PPP ", " III ", "I***I") + .aisle("gHSHg", "gPPPg", "g g", "g g", "gJJJg", "g g", "g g", "g g", "g g", "gIIIg") + .where('S', selfPredicate()) + .where('H', states(casingState) + .setMinGlobalLimited(19) + .or(abilities(IMPORT_FLUIDS) + .setMaxGlobalLimited(1) + .setPreviewCount(1))) + .where('I', states(secondCasingState)) + .where('J', states(turbineCasingState)) + .where('P', states(pipeCasingState)) + .where('g', frames(HSLASteel)) + .where('*', air().or(SNOW_LAYER)) + .where('#', air()) + .where(' ', air()) + .build() + + override fun getBaseTexture(sourcePart: IMultiblockPart?): ICubeRenderer = GTLiteOverlays.OSMIRIDIUM_CASING + + override fun getFrontOverlay(): ICubeRenderer = Textures.PROCESSING_ARRAY_OVERLAY + + override fun addInformation(stack: ItemStack, world: World?, tooltip: MutableList, advanced: Boolean) + { + super.addInformation(stack, world, tooltip, advanced) + tooltip.add(I18n.format("gtlitecore.tooltip.machine.machine_type", + I18n.format("gtlitecore.machine.pcb_factory.additional_structure_name"))) + tooltip.add(I18n.format("gtlitecore.machine.water_cooling_tower.tooltip.1")) + tooltip.add(I18n.format("gtlitecore.machine.water_cooling_tower.tooltip.2")) + tooltip.add(I18n.format("gtlitecore.machine.water_cooling_tower.tooltip.3")) + } +} \ No newline at end of file diff --git a/src/main/kotlin/gregtechlite/gtlitecore/loader/recipe/machine/MachineRecipeLoader.kt b/src/main/kotlin/gregtechlite/gtlitecore/loader/recipe/machine/MachineRecipeLoader.kt index 3a3a4aecc..1264127be 100644 --- a/src/main/kotlin/gregtechlite/gtlitecore/loader/recipe/machine/MachineRecipeLoader.kt +++ b/src/main/kotlin/gregtechlite/gtlitecore/loader/recipe/machine/MachineRecipeLoader.kt @@ -26,6 +26,7 @@ import gregtech.api.unification.material.Materials.Berkelium import gregtech.api.unification.material.Materials.BlackBronze import gregtech.api.unification.material.Materials.BlackSteel import gregtech.api.unification.material.Materials.BlueSteel +import gregtech.api.unification.material.Materials.BorosilicateGlass import gregtech.api.unification.material.Materials.Brass import gregtech.api.unification.material.Materials.Bronze import gregtech.api.unification.material.Materials.Californium @@ -41,9 +42,12 @@ import gregtech.api.unification.material.Materials.Einsteinium import gregtech.api.unification.material.Materials.Electrum import gregtech.api.unification.material.Materials.EnrichedNaquadahTriniumEuropiumDuranide import gregtech.api.unification.material.Materials.Europium +import gregtech.api.unification.material.Materials.Gadolinium +import gregtech.api.unification.material.Materials.Germanium import gregtech.api.unification.material.Materials.Gold import gregtech.api.unification.material.Materials.Graphite import gregtech.api.unification.material.Materials.Helium +import gregtech.api.unification.material.Materials.Holmium import gregtech.api.unification.material.Materials.IndiumTinBariumTitaniumCuprate import gregtech.api.unification.material.Materials.Invar import gregtech.api.unification.material.Materials.Iridium @@ -62,6 +66,8 @@ import gregtech.api.unification.material.Materials.Nobelium import gregtech.api.unification.material.Materials.Osmiridium import gregtech.api.unification.material.Materials.Osmium import gregtech.api.unification.material.Materials.Oxygen +import gregtech.api.unification.material.Materials.PCBCoolant +import gregtech.api.unification.material.Materials.Palladium import gregtech.api.unification.material.Materials.Platinum import gregtech.api.unification.material.Materials.Polybenzimidazole import gregtech.api.unification.material.Materials.Polycaprolactam @@ -77,6 +83,7 @@ import gregtech.api.unification.material.Materials.Silver import gregtech.api.unification.material.Materials.SolderingAlloy import gregtech.api.unification.material.Materials.StainlessSteel import gregtech.api.unification.material.Materials.Steel +import gregtech.api.unification.material.Materials.SterileGrowthMedium import gregtech.api.unification.material.Materials.Thorium import gregtech.api.unification.material.Materials.Thulium import gregtech.api.unification.material.Materials.Tin @@ -102,6 +109,7 @@ import gregtech.api.unification.ore.OrePrefix.foil import gregtech.api.unification.ore.OrePrefix.frameGt import gregtech.api.unification.ore.OrePrefix.gear import gregtech.api.unification.ore.OrePrefix.gearSmall +import gregtech.api.unification.ore.OrePrefix.lens import gregtech.api.unification.ore.OrePrefix.pipeHugeFluid import gregtech.api.unification.ore.OrePrefix.pipeLargeFluid import gregtech.api.unification.ore.OrePrefix.pipeNormalFluid @@ -151,6 +159,8 @@ import gregtech.common.items.MetaItems.ELECTRIC_PUMP_UEV import gregtech.common.items.MetaItems.ELECTRIC_PUMP_UHV import gregtech.common.items.MetaItems.ELECTRIC_PUMP_UIV import gregtech.common.items.MetaItems.ELECTRIC_PUMP_UV +import gregtech.common.items.MetaItems.ELECTRIC_PUMP_ZPM +import gregtech.common.items.MetaItems.ELITE_CIRCUIT_BOARD import gregtech.common.items.MetaItems.EMITTER_EV import gregtech.common.items.MetaItems.EMITTER_HV import gregtech.common.items.MetaItems.EMITTER_IV @@ -184,7 +194,9 @@ import gregtech.common.items.MetaItems.SENSOR_IV import gregtech.common.items.MetaItems.SENSOR_LuV import gregtech.common.items.MetaItems.SENSOR_MV import gregtech.common.items.MetaItems.SENSOR_UHV +import gregtech.common.items.MetaItems.SENSOR_UV import gregtech.common.items.MetaItems.SENSOR_ZPM +import gregtech.common.items.MetaItems.STEM_CELLS import gregtech.common.items.MetaItems.TOOL_DATA_MODULE import gregtech.common.items.MetaItems.ULTRA_HIGH_POWER_INTEGRATED_CIRCUIT_WAFER import gregtech.common.items.MetaItems.VOLTAGE_COIL_HV @@ -199,12 +211,14 @@ import gregtech.common.metatileentities.MetaTileEntities.ASSEMBLY_LINE import gregtech.common.metatileentities.MetaTileEntities.AUTOCLAVE import gregtech.common.metatileentities.MetaTileEntities.BENDER import gregtech.common.metatileentities.MetaTileEntities.BREWERY +import gregtech.common.metatileentities.MetaTileEntities.CENTRAL_MONITOR import gregtech.common.metatileentities.MetaTileEntities.CENTRIFUGE import gregtech.common.metatileentities.MetaTileEntities.CHARGER import gregtech.common.metatileentities.MetaTileEntities.CHEMICAL_BATH import gregtech.common.metatileentities.MetaTileEntities.CIRCUIT_ASSEMBLER import gregtech.common.metatileentities.MetaTileEntities.COMPRESSOR import gregtech.common.metatileentities.MetaTileEntities.CUTTER +import gregtech.common.metatileentities.MetaTileEntities.DATA_BANK import gregtech.common.metatileentities.MetaTileEntities.DISTILLATION_TOWER import gregtech.common.metatileentities.MetaTileEntities.DISTILLERY import gregtech.common.metatileentities.MetaTileEntities.ELECTRIC_BLAST_FURNACE @@ -220,6 +234,7 @@ import gregtech.common.metatileentities.MetaTileEntities.FORGE_HAMMER import gregtech.common.metatileentities.MetaTileEntities.FORMING_PRESS import gregtech.common.metatileentities.MetaTileEntities.FUSION_REACTOR import gregtech.common.metatileentities.MetaTileEntities.GAS_COLLECTOR +import gregtech.common.metatileentities.MetaTileEntities.HIGH_PERFORMANCE_COMPUTING_ARRAY import gregtech.common.metatileentities.MetaTileEntities.HULL import gregtech.common.metatileentities.MetaTileEntities.IMPLOSION_COMPRESSOR import gregtech.common.metatileentities.MetaTileEntities.LARGE_CHEMICAL_REACTOR @@ -228,12 +243,14 @@ import gregtech.common.metatileentities.MetaTileEntities.LATHE import gregtech.common.metatileentities.MetaTileEntities.MACERATOR import gregtech.common.metatileentities.MetaTileEntities.MIXER import gregtech.common.metatileentities.MetaTileEntities.MULTI_FURNACE +import gregtech.common.metatileentities.MetaTileEntities.OBJECT_HOLDER import gregtech.common.metatileentities.MetaTileEntities.ORE_WASHER import gregtech.common.metatileentities.MetaTileEntities.PACKER import gregtech.common.metatileentities.MetaTileEntities.POLARIZER import gregtech.common.metatileentities.MetaTileEntities.POWER_TRANSFORMER import gregtech.common.metatileentities.MetaTileEntities.PRIMITIVE_BLAST_FURNACE import gregtech.common.metatileentities.MetaTileEntities.PYROLYSE_OVEN +import gregtech.common.metatileentities.MetaTileEntities.RESEARCH_STATION import gregtech.common.metatileentities.MetaTileEntities.ROCK_BREAKER import gregtech.common.metatileentities.MetaTileEntities.SCANNER import gregtech.common.metatileentities.MetaTileEntities.SIFTER @@ -257,6 +274,7 @@ import gregtechlite.gtlitecore.api.unification.GTLiteMaterials.BabbitAlloy import gregtechlite.gtlitecore.api.unification.GTLiteMaterials.BariumStrontiumTitanate import gregtechlite.gtlitecore.api.unification.GTLiteMaterials.Bedrockium import gregtechlite.gtlitecore.api.unification.GTLiteMaterials.BoronFranciumCarbideSuperconductor +import gregtechlite.gtlitecore.api.unification.GTLiteMaterials.CadmiumSelenide import gregtechlite.gtlitecore.api.unification.GTLiteMaterials.CinobiteA243 import gregtechlite.gtlitecore.api.unification.GTLiteMaterials.CosmicNeutronium import gregtechlite.gtlitecore.api.unification.GTLiteMaterials.DimensionallyShiftedSuperfluid @@ -267,8 +285,10 @@ import gregtechlite.gtlitecore.api.unification.GTLiteMaterials.FranciumCaesiumCa import gregtechlite.gtlitecore.api.unification.GTLiteMaterials.FreeElectronGas import gregtechlite.gtlitecore.api.unification.GTLiteMaterials.FullereneSuperconductor import gregtechlite.gtlitecore.api.unification.GTLiteMaterials.GSTGlass +import gregtechlite.gtlitecore.api.unification.GTLiteMaterials.GelidCryotheum import gregtechlite.gtlitecore.api.unification.GTLiteMaterials.Grisium import gregtechlite.gtlitecore.api.unification.GTLiteMaterials.HDCS +import gregtechlite.gtlitecore.api.unification.GTLiteMaterials.HafniumCarbide import gregtechlite.gtlitecore.api.unification.GTLiteMaterials.HalkoniteSteel import gregtechlite.gtlitecore.api.unification.GTLiteMaterials.HarmonicPhononMatter import gregtechlite.gtlitecore.api.unification.GTLiteMaterials.HastelloyN @@ -288,6 +308,7 @@ import gregtechlite.gtlitecore.api.unification.GTLiteMaterials.MetastableHassium import gregtechlite.gtlitecore.api.unification.GTLiteMaterials.MolybdenumDisilicide import gregtechlite.gtlitecore.api.unification.GTLiteMaterials.MutatedLivingSolder import gregtechlite.gtlitecore.api.unification.GTLiteMaterials.Nitinol60 +import gregtechlite.gtlitecore.api.unification.GTLiteMaterials.PedotPSS import gregtechlite.gtlitecore.api.unification.GTLiteMaterials.Pikyonium64B import gregtechlite.gtlitecore.api.unification.GTLiteMaterials.Plutonium244 import gregtechlite.gtlitecore.api.unification.GTLiteMaterials.PreciousMetalAlloy @@ -313,12 +334,17 @@ import gregtechlite.gtlitecore.api.unification.GTLiteMaterials.Tumbaga import gregtechlite.gtlitecore.api.unification.GTLiteMaterials.Vibranium import gregtechlite.gtlitecore.api.unification.GTLiteMaterials.VibraniumTritaniumActiniumIronSuperhydride import gregtechlite.gtlitecore.api.unification.GTLiteMaterials.WatertightSteel +import gregtechlite.gtlitecore.api.unification.GTLiteMaterials.ZephyreanAerotheum +import gregtechlite.gtlitecore.api.unification.GTLiteMaterials.Zeron100 import gregtechlite.gtlitecore.api.unification.ore.GTLiteOrePrefix.nanite import gregtechlite.gtlitecore.common.block.adapter.GTComputerCasing import gregtechlite.gtlitecore.common.block.adapter.GTFireboxCasing +import gregtechlite.gtlitecore.common.block.adapter.GTFusionCasing import gregtechlite.gtlitecore.common.block.adapter.GTGlassCasing import gregtechlite.gtlitecore.common.block.adapter.GTMetalCasing import gregtechlite.gtlitecore.common.block.adapter.GTMultiblockCasing +import gregtechlite.gtlitecore.common.block.adapter.GTTurbineCasing +import gregtechlite.gtlitecore.common.block.variant.ActiveUniqueCasing import gregtechlite.gtlitecore.common.block.variant.Manipulator import gregtechlite.gtlitecore.common.block.variant.MetalCasing import gregtechlite.gtlitecore.common.block.variant.MultiblockCasing @@ -326,7 +352,9 @@ import gregtechlite.gtlitecore.common.block.variant.aerospace.AerospaceCasing import gregtechlite.gtlitecore.common.block.variant.fusion.FusionCoil import gregtechlite.gtlitecore.common.block.variant.science.ScienceCasing import gregtechlite.gtlitecore.common.item.GTLiteMetaItems.ATTO_PIC_CHIP +import gregtechlite.gtlitecore.common.item.GTLiteMetaItems.CIRCUIT_PATTERN import gregtechlite.gtlitecore.common.item.GTLiteMetaItems.FEMTO_PIC_CHIP +import gregtechlite.gtlitecore.common.item.GTLiteMetaItems.HELIUM_NEON_LASER import gregtechlite.gtlitecore.common.item.GTLiteMetaItems.MINING_DRONE_LV import gregtechlite.gtlitecore.common.item.GTLiteMetaItems.NANO_PIC_CHIP import gregtechlite.gtlitecore.common.item.GTLiteMetaItems.PICO_PIC_CHIP @@ -338,6 +366,7 @@ import gregtechlite.gtlitecore.common.metatileentity.GTLiteMetaTileEntities.ANTI import gregtechlite.gtlitecore.common.metatileentity.GTLiteMetaTileEntities.ANTIMATTER_GENERATOR import gregtechlite.gtlitecore.common.metatileentity.GTLiteMetaTileEntities.BATH_CONDENSER import gregtechlite.gtlitecore.common.metatileentity.GTLiteMetaTileEntities.BEDROCK_DRILLING_RIG +import gregtechlite.gtlitecore.common.metatileentity.GTLiteMetaTileEntities.BIO_CULTIVATION_CHAMBER import gregtechlite.gtlitecore.common.metatileentity.GTLiteMetaTileEntities.BIO_REACTOR import gregtechlite.gtlitecore.common.metatileentity.GTLiteMetaTileEntities.BURNER_REACTOR import gregtechlite.gtlitecore.common.metatileentity.GTLiteMetaTileEntities.CATALYTIC_REFORMER @@ -403,10 +432,12 @@ import gregtechlite.gtlitecore.common.metatileentity.GTLiteMetaTileEntities.LASE import gregtechlite.gtlitecore.common.metatileentity.GTLiteMetaTileEntities.LASER_OUTPUT_HATCH_1048576 import gregtechlite.gtlitecore.common.metatileentity.GTLiteMetaTileEntities.MASS_FABRICATOR import gregtechlite.gtlitecore.common.metatileentity.GTLiteMetaTileEntities.MATTER_RESHAPING_FRAMEWORK +import gregtechlite.gtlitecore.common.metatileentity.GTLiteMetaTileEntities.MICROSCALE_CIRCUIT_DETECTOR import gregtechlite.gtlitecore.common.metatileentity.GTLiteMetaTileEntities.MINING_DRONE_AIRPORT import gregtechlite.gtlitecore.common.metatileentity.GTLiteMetaTileEntities.MOB_EXTRACTOR import gregtechlite.gtlitecore.common.metatileentity.GTLiteMetaTileEntities.MOB_SLAUGHTER import gregtechlite.gtlitecore.common.metatileentity.GTLiteMetaTileEntities.MULTICOOKER +import gregtechlite.gtlitecore.common.metatileentity.GTLiteMetaTileEntities.NANOLITHOGRAPHY_ARRAY import gregtechlite.gtlitecore.common.metatileentity.GTLiteMetaTileEntities.NANOSCALE_FABRICATOR import gregtechlite.gtlitecore.common.metatileentity.GTLiteMetaTileEntities.NANO_ASSEMBLY_COMPLEX import gregtechlite.gtlitecore.common.metatileentity.GTLiteMetaTileEntities.NANO_FORGE @@ -430,9 +461,11 @@ import gregtechlite.gtlitecore.common.metatileentity.GTLiteMetaTileEntities.SPAC import gregtechlite.gtlitecore.common.metatileentity.GTLiteMetaTileEntities.STEAM_ENGINE import gregtechlite.gtlitecore.common.metatileentity.GTLiteMetaTileEntities.STELLAR_FORGE import gregtechlite.gtlitecore.common.metatileentity.GTLiteMetaTileEntities.SUPERCRITICAL_FLUID_TURBINE +import gregtechlite.gtlitecore.common.metatileentity.GTLiteMetaTileEntities.THERMOSINK_COOLING_TOWER import gregtechlite.gtlitecore.common.metatileentity.GTLiteMetaTileEntities.TOOL_CASTER import gregtechlite.gtlitecore.common.metatileentity.GTLiteMetaTileEntities.VACUUM_CHAMBER import gregtechlite.gtlitecore.common.metatileentity.GTLiteMetaTileEntities.VOLCANUS +import gregtechlite.gtlitecore.common.metatileentity.GTLiteMetaTileEntities.WATER_COOLING_TOWER import net.minecraft.init.Items.FISHING_ROD internal object MachineRecipeLoader @@ -1216,12 +1249,127 @@ internal object MachineRecipeLoader EUt(VA[LuV]) duration(1 * MINUTE) scannerResearch { - it.researchStack(WETWARE_CIRCUIT_BOARD.stack()) + it.researchStack(ELITE_CIRCUIT_BOARD.stack()) .EUt(VA[IV]) .duration(1 * MINUTE) } } + // PCB T2 - Nanolithography Array + ASSEMBLY_LINE_RECIPES.addRecipe { + input(NANOSCALE_FABRICATOR) + input(LASER_ENGRAVER[ZPM]) + input(EMITTER_ZPM, 2) + input(HELIUM_NEON_LASER) + input(CIRCUIT_PATTERN) + input(lens, BorosilicateGlass, 16) + input(ELITE_CIRCUIT_BOARD, 64) + input(plate, Germanium, 32) + input(plate, Gadolinium, 32) + input(cableGtSingle, VanadiumGallium, 16) + fluidInputs(SolderingAlloy.getFluid(L * 80)) + fluidInputs(CadmiumSelenide.getFluid(L * 4)) + output(NANOLITHOGRAPHY_ARRAY) + EUt(VA[ZPM]) + duration(1 * MINUTE) + stationResearch { + it.researchStack(NANOSCALE_FABRICATOR.stack()) + .EUt(VA[ZPM]) + .CWUt(8) + } + } + + // PCB T3 - Microscale Circuit Detector + ASSEMBLY_LINE_RECIPES.addRecipe { + input(RESEARCH_STATION) + input(HIGH_PERFORMANCE_COMPUTING_ARRAY) + input(DATA_BANK) + input(CENTRAL_MONITOR, 4) + input(SENSOR_UV, 2) + input(circuit, Tier.UV, 4) + input(plate, Nobelium, 16) + input(plate, Trinaquadalloy, 16) + input(plateDouble, HafniumCarbide, 8) + input(plateDouble, ReneN5, 8) + input(foil, Pikyonium64B, 24) + input(wireGtSingle, EnrichedNaquadahTriniumEuropiumDuranide, 32) + fluidInputs(SolderingAlloy.getFluid(L * 160)) + fluidInputs(PCBCoolant.getFluid(256000)) + fluidInputs(GelidCryotheum.getFluid(512000)) + fluidInputs(Naquadria.getFluid(L * 32)) + output(MICROSCALE_CIRCUIT_DETECTOR) + EUt(VA[UV]) + duration(1 * MINUTE + 30 * SECOND) + stationResearch { + it.researchStack(OBJECT_HOLDER.stack()) + .EUt(VA[UV]) + .CWUt(16) + } + } + + // PCB Bio Upgrade - Bio Component Cultivation Chamber + ASSEMBLY_LINE_RECIPES.addRecipe { + input(BIO_REACTOR[ZPM]) + input(circuit, Tier.ZPM, 2) + input(WETWARE_CIRCUIT_BOARD, 8) + input(STEM_CELLS, 16) + input(ELECTRIC_PUMP_ZPM, 4) + input(wireFine, PedotPSS, 16) + input(wireFine, Holmium, 16) + fluidInputs(SolderingAlloy.getFluid(L * 32)) + fluidInputs(SterileGrowthMedium.getFluid(8000)) + output(BIO_CULTIVATION_CHAMBER) + EUt(VA[ZPM]) + duration(45 * SECOND) + scannerResearch { + it.researchStack(WETWARE_CIRCUIT_BOARD) + .EUt(VA[IV]) + .duration(1 * MINUTE + 30 * SECOND) + } + } + + // PCB Cooling Upgrade - Water Cooling Tower + ASSEMBLY_LINE_RECIPES.addRecipe { + inputs(GTMultiblockCasing.EXTREME_ENGINE_INTAKE_CASING.getStack(4)) + inputs(ActiveUniqueCasing.HEAT_VENT.getStack(16)) + input(ELECTRIC_PUMP_LuV, 8) + input(circuit, Tier.ZPM, 2) + input(rotor, Zeron100, 3) + input(rotor, Palladium, 6) + fluidInputs(SolderingAlloy.getFluid(L * 20)) + fluidInputs(ZephyreanAerotheum.getFluid(64000)) + output(WATER_COOLING_TOWER) + EUt(VA[ZPM]) + duration(30 * SECOND) + scannerResearch { + it.researchStack(GTComputerCasing.COMPUTER_HEAT_VENT.stack) + .EUt(VA[IV]) + .duration(1 * MINUTE) + } + } + + // PCB Advanced Cooling Upgrade - Thermosink Cooling Tower + ASSEMBLY_LINE_RECIPES.addRecipe { + inputs(MultiblockCasing.INFINITY_COOLING_CASING.getStack(4)) + inputs(GTFusionCasing.SUPERCONDUCTOR_COIL.getStack(16)) + input(circuit, Tier.UHV, 2) + input(foil, Adamantium, 16) + input(ELECTRIC_PUMP_UV) + input(SENSOR_UV) + input(wireFine, Neutronium, 16) + fluidInputs(MutatedLivingSolder.getFluid(L * 40)) + fluidInputs(Tairitsium.getFluid(L * 16)) + fluidInputs(CosmicNeutronium.getFluid(L * 8)) + output(THERMOSINK_COOLING_TOWER) + EUt(VA[UEV]) + duration(2 * MINUTE + 30 * SECOND) + stationResearch { + it.researchStack(MultiblockCasing.INFINITY_COOLING_CASING.stack) + .EUt(VA[UEV]) + .CWUt(24) + } + } + // Quantum Force Transformer ASSEMBLY_LINE_RECIPES.addRecipe { input(LARGE_MASS_FABRICATOR) diff --git a/src/main/kotlin/gregtechlite/gtlitecore/loader/recipe/producer/PCBFactoryRecipeProducer.kt b/src/main/kotlin/gregtechlite/gtlitecore/loader/recipe/producer/PCBFactoryRecipeProducer.kt index 3a3e8b6f6..79efe8d3d 100644 --- a/src/main/kotlin/gregtechlite/gtlitecore/loader/recipe/producer/PCBFactoryRecipeProducer.kt +++ b/src/main/kotlin/gregtechlite/gtlitecore/loader/recipe/producer/PCBFactoryRecipeProducer.kt @@ -35,6 +35,9 @@ import gregtech.common.items.MetaItems.EXTREME_CIRCUIT_BOARD import gregtech.common.items.MetaItems.PLASTIC_CIRCUIT_BOARD import gregtech.common.items.MetaItems.WETWARE_CIRCUIT_BOARD import gregtechlite.gtlitecore.api.recipe.GTLiteRecipeMaps.PCB_FACTORY_RECIPES +import gregtechlite.gtlitecore.api.recipe.builder.PCBFactoryRecipeBuilder.Companion.bioChamber +import gregtechlite.gtlitecore.api.recipe.builder.PCBFactoryRecipeBuilder.Companion.circDetector +import gregtechlite.gtlitecore.api.recipe.builder.PCBFactoryRecipeBuilder.Companion.nanoArray import gregtechlite.gtlitecore.api.unification.GTLiteMaterials.CarbonNanotube import gregtechlite.gtlitecore.api.unification.GTLiteMaterials.EthylenediaminePyrocatechol import gregtechlite.gtlitecore.api.unification.GTLiteMaterials.FluorinatedEthylenePropylene @@ -103,7 +106,6 @@ internal object PCBFactoryRecipeProducer outputs(*boards.toTypedArray()) EUt(VA[tier] * 3 / 4L) duration(ceil(600 / sqrt(1.5.pow(tier - 1.5))).toInt()) - tier(1) } } @@ -131,7 +133,7 @@ internal object PCBFactoryRecipeProducer outputs(*boards.toTypedArray()) EUt(VA[tier + 1] * 3 / 4L) duration(ceil(600 / sqrt(1.5.pow(tier - 1.5))).toInt()) - tier(2) + requireStruct(nanoArray) } } @@ -159,7 +161,7 @@ internal object PCBFactoryRecipeProducer outputs(*boards.toTypedArray()) EUt(VA[tier + 1] * 3 / 4L) duration(ceil(600 / sqrt(1.5.pow(tier - 1.5))).toInt()) - tier(3) + requireStruct(circDetector) } } @@ -190,7 +192,6 @@ internal object PCBFactoryRecipeProducer outputs(*boards.toTypedArray()) EUt(VA[tier] * 3 / 4L) duration(ceil(600 / sqrt(1.5.pow(tier - 2.5))).toInt()) - tier(1) } } @@ -218,7 +219,7 @@ internal object PCBFactoryRecipeProducer outputs(*boards.toTypedArray()) EUt(VA[tier + 1] * 3 / 4L) duration(ceil(500 / sqrt(1.5.pow(tier - 2.5))).toInt()) - tier(2) + requireStruct(nanoArray) } } @@ -246,7 +247,7 @@ internal object PCBFactoryRecipeProducer outputs(*boards.toTypedArray()) EUt(VA[tier + 1] * 3 / 4L) duration(ceil(400 / sqrt(1.5.pow(tier - 2.5))).toInt()) - tier(3) + requireStruct(circDetector) } } @@ -277,7 +278,6 @@ internal object PCBFactoryRecipeProducer outputs(*boards.toTypedArray()) EUt(VA[tier] * 3 / 4L) duration(ceil(600 / sqrt(1.5.pow(tier - 3.5))).toInt()) - tier(1) } } @@ -305,7 +305,7 @@ internal object PCBFactoryRecipeProducer outputs(*boards.toTypedArray()) EUt(VA[tier + 1] * 3 / 4L) duration(ceil(500 / sqrt(1.5.pow(tier - 3.5))).toInt()) - tier(2) + requireStruct(nanoArray) } } @@ -333,7 +333,7 @@ internal object PCBFactoryRecipeProducer outputs(*boards.toTypedArray()) EUt(VA[tier + 1] * 3 / 4L) duration(ceil(400 / sqrt(1.5.pow(tier - 3.5))).toInt()) - tier(3) + requireStruct(circDetector) } } @@ -364,7 +364,6 @@ internal object PCBFactoryRecipeProducer outputs(*boards.toTypedArray()) EUt(VA[tier] * 3 / 4L) duration(ceil(600 / sqrt(1.5.pow(tier - 4.5))).toInt()) - tier(1) } } @@ -392,7 +391,7 @@ internal object PCBFactoryRecipeProducer outputs(*boards.toTypedArray()) EUt(VA[tier + 1] * 3 / 4L) duration(ceil(500 / sqrt(1.5.pow(tier - 4.5))).toInt()) - tier(2) + requireStruct(nanoArray) } } @@ -420,7 +419,7 @@ internal object PCBFactoryRecipeProducer outputs(*boards.toTypedArray()) EUt(VA[tier + 1] * 3 / 4L) duration(ceil(400 / sqrt(1.5.pow(tier - 4.5))).toInt()) - tier(3) + requireStruct(circDetector) } } @@ -452,8 +451,7 @@ internal object PCBFactoryRecipeProducer outputs(*boards.toTypedArray()) EUt(VA[tier] * 3 / 4L) duration(ceil(600 / sqrt(1.5.pow(tier - 5.5))).toInt()) - tier(1) - upgradeTier(1) + requireStruct(bioChamber) } } @@ -482,8 +480,7 @@ internal object PCBFactoryRecipeProducer outputs(*boards.toTypedArray()) EUt(VA[tier + 1] * 3 / 4L) duration(ceil(500 / sqrt(1.5.pow(tier - 5.5))).toInt()) - tier(2) - upgradeTier(1) + requireStruct(nanoArray, bioChamber) } } @@ -511,8 +508,7 @@ internal object PCBFactoryRecipeProducer outputs(*boards.toTypedArray()) EUt(VA[tier + 1] * 3 / 4L) duration(ceil(400 / sqrt(1.5.pow(tier - 5.5))).toInt()) - tier(3) - upgradeTier(1) + requireStruct(circDetector, bioChamber) } } @@ -544,7 +540,6 @@ internal object PCBFactoryRecipeProducer outputs(*boards.toTypedArray()) EUt(VA[tier] * 3 / 4L) duration(ceil(600 / sqrt(1.5.pow(tier - 5.5))).toInt()) - tier(1) } } @@ -573,7 +568,7 @@ internal object PCBFactoryRecipeProducer outputs(*boards.toTypedArray()) EUt(VA[tier + 1] * 3 / 4L) duration(ceil(500 / sqrt(1.5.pow(tier - 6.5))).toInt()) - tier(2) + requireStruct(nanoArray) } } @@ -602,7 +597,7 @@ internal object PCBFactoryRecipeProducer outputs(*boards.toTypedArray()) EUt(VA[tier + 1] * 3 / 4L) duration(ceil(400 / sqrt(1.5.pow(tier - 6.5))).toInt()) - tier(3) + requireStruct(circDetector) } } @@ -634,7 +629,6 @@ internal object PCBFactoryRecipeProducer outputs(*boards.toTypedArray()) EUt(VA[tier] * 3 / 4L) duration(ceil(600 / sqrt(1.5.pow(tier - 5.5))).toInt()) - tier(1) } } @@ -663,7 +657,7 @@ internal object PCBFactoryRecipeProducer outputs(*boards.toTypedArray()) EUt(VA[tier + 1] * 3 / 4L) duration(ceil(500 / sqrt(1.5.pow(tier - 6.5))).toInt()) - tier(2) + requireStruct(nanoArray) } } @@ -692,7 +686,7 @@ internal object PCBFactoryRecipeProducer outputs(*boards.toTypedArray()) EUt(VA[tier + 1] * 3 / 4L) duration(ceil(400 / sqrt(1.5.pow(tier - 6.5))).toInt()) - tier(3) + requireStruct(circDetector) } } @@ -724,7 +718,6 @@ internal object PCBFactoryRecipeProducer outputs(*boards.toTypedArray()) EUt(VA[tier] * 3 / 4L) duration(ceil(600 / sqrt(1.5.pow(tier - 6.5))).toInt()) - tier(1) } } @@ -753,7 +746,7 @@ internal object PCBFactoryRecipeProducer outputs(*boards.toTypedArray()) EUt(VA[tier + 1] * 3 / 4L) duration(ceil(500 / sqrt(1.5.pow(tier - 6.5))).toInt()) - tier(2) + requireStruct(nanoArray) } } @@ -782,7 +775,7 @@ internal object PCBFactoryRecipeProducer outputs(*boards.toTypedArray()) EUt(VA[tier + 1] * 3 / 4L) duration(ceil(400 / sqrt(1.5.pow(tier - 6.5))).toInt()) - tier(3) + requireStruct(circDetector) } } diff --git a/src/main/resources/assets/gtlitecore/lang/en_us.lang b/src/main/resources/assets/gtlitecore/lang/en_us.lang index 29cdf2807..372882e5d 100644 --- a/src/main/resources/assets/gtlitecore/lang/en_us.lang +++ b/src/main/resources/assets/gtlitecore/lang/en_us.lang @@ -1736,12 +1736,6 @@ gtlitecore.recipe.component_assembly_line_tier.14=Component Assembly Casing Tier gtlitecore.recipe.min_height=Minimum Height: %s -gtlitecore.recipe.pcb_factory_tier=Structure Tier: Error -gtlitecore.recipe.pcb_factory_tier.1=Structure Tier: 1 -gtlitecore.recipe.pcb_factory_tier.2=Structure Tier: 2 -gtlitecore.recipe.pcb_factory_tier.3=Structure Tier: 3 -gtlitecore.recipe.pcb_factory_auxiliary_tier=Required Bio Chamber Upgrade - gtlitecore.recipe.nano_forge_tier=Structure Tier: Error gtlitecore.recipe.nano_forge_tier.1=Structure Tier: 1 gtlitecore.recipe.nano_forge_tier.2=Structure Tier: 2 @@ -1760,6 +1754,14 @@ gtlitecore.recipe.acceleration_track_tier.3=Acceleration Track Tier: MK3 gtlitecore.recipe.acceleration_track_tier.4=Acceleration Track Tier: MK4 gtlitecore.recipe.acceleration_track_tier.5=Acceleration Track Tier: MK5 +gtlitecore.recipe.request_additional_structures=Required: %s + +# Machine API contexts +gtlitecore.machine.additional_structure.data_stick.name=§oAdditional Structure Configuration Data +gtlitecore.machine.additional_structure.pos_saved=Saved Controller Pos (%s,%s,%s) of Additional Structure to Data Stick +gtlitecore.machine.additional_structure.connected=Connected Additional Structure to Main Structure +gtlitecore.machine.additional_structure.not_found=Not found any effective Additional Structure + # Machines gtlitecore.machine.polisher.lv.name=§7Basic§f Polisher gtlitecore.machine.polisher.lv.tooltip=Electric Stonecutter @@ -2407,21 +2409,13 @@ gtlitecore.machine.plasma_enhanced_cvd_unit.tooltip.1=驱使等离子体增强 gtlitecore.machine.plasma_enhanced_cvd_unit.tooltip.2=兼容所有普通§2化学气相沉积§7配方,拥有§f激光诱导化学气相沉积§r配方对应的高级配方。 gtlitecore.machine.pcb_factory.name=PCB Factory -gtlitecore.machine.pcb_factory.tooltip.1=专门用于生产电路基板的大型工厂 -gtlitecore.machine.pcb_factory.tooltip.2=带有多级附属结构,附属结构的等级限制了最大配方等级。 -gtlitecore.machine.pcb_factory.tooltip.3=2级与3级PCB工厂支持放置额外的§f纳米蜂群§7来增加并行数: -gtlitecore.machine.pcb_factory.tooltip.4=- 2级:每放入1个§6银纳米蜂群§7,并行数增加2; -gtlitecore.machine.pcb_factory.tooltip.5=- 3级:每放入1个§a金纳米蜂群§7,并行数增加4; -gtlitecore.machine.pcb_factory.tooltip.6=需要升级§d冷却结构§7才能解锁机器的超频功能: -gtlitecore.machine.pcb_factory.tooltip.7=- 建造§b水冷塔§7后,解锁配方的§f默认超频§7功能; -gtlitecore.machine.pcb_factory.tooltip.8=- 建造§9空冻塔§7后,解锁配方的§5无损超频§7功能; -gtlitecore.machine.pcb_factory.tooltip.9=建造§2生物室§7以解锁高级电路板配方。 -gtlitecore.machine.pcb_factory.tooltip.10=调整机器的线宽(默认§f100μm§7,每次±§f25μm§7)以获得特殊效果: -gtlitecore.machine.pcb_factory.tooltip.11=- 线宽每缩短§f25μm§7,配方时间就减少§f20%%§7,耗能就增加§f50%%§7; -gtlitecore.machine.pcb_factory.tooltip.12=- 线宽每放宽§f25μm§7,配方时间就增加§f20%%§7,耗能就减少§f10%%§7; -gtlitecore.machine.pcb_factory.tooltip.13=机器的最小线宽为§f25μm§7,最大线宽为§f200μm§7。 -gtlitecore.machine.pcb_factory.tooltip.14=允许使用任意种类的§f能源仓§7或§f激光靶仓§7输入能量 -gtlitecore.machine.pcb_factory.tooltip.15=§f如果你不知道如何获得纳米蜂群,请搜索§3纳米锻炉§f。 +gtlitecore.machine.pcb_factory.tooltip.1=Large Factory for Circuit Board Producing +gtlitecore.machine.pcb_factory.tooltip.2=Add §eAdditional Module§7 to unlock high tier recipes or enhance machine efficiency +gtlitecore.machine.pcb_factory.tooltip.3=§fCannot overclock§7 by default only if add corresponding Additional Module +gtlitecore.machine.pcb_factory.tooltip.4=Modify trace size (Default: §b100μm§7, each time ±§b25μm§7)of machine to get special efficiency: +gtlitecore.machine.pcb_factory.tooltip.5=- For every §f25μm§7 decrement, recipe duration decreases by §f20%%§7 and energy consumption increases by §f50%%§7. +gtlitecore.machine.pcb_factory.tooltip.6=- For every §f25μm§7 increment, recipe duration increases by §f20%%§7 and energy consumption decreases by §f10%%§7. +gtlitecore.machine.pcb_factory.tooltip.7=The minimum trace size is §f25μm§7 and maximum is §f200μm§7. gtlitecore.machine.pcb_factory.structure_info=Structure Tier: %s (Trace Size: %sμm) gtlitecore.machine.pcb_factory.structure_cooling=冷却已启用 @@ -2431,6 +2425,27 @@ gtlitecore.machine.pcb_factory.structure_bio_chamber=有机黏菌充斥于生物 gtlitecore.machine.pcb_factory.trace_size.decrement=§c放宽25μm线宽 /n§7配方时间增加20%%,耗电量减少10%% gtlitecore.machine.pcb_factory.trace_size.increment=§a缩短25μm线宽 /n§7配方时间减少20%%,耗电量增加50%% +gtlitecore.machine.pcb_factory.additional_structure_name=PCB Factory Additional Module + +gtlitecore.machine.nanolithography_array.name=Nanolithography Array +gtlitecore.machine.nanolithography_array.tooltip.1=Add Nanolithography functionality to the PCB Factory. +gtlitecore.machine.nanolithography_array.tooltip.2=Each 1 §dSilver Nanite§7 in §fItem Import Bus§7 will cause Parallel §e+2§7 + +gtlitecore.machine.microscale_circuit_detector.name=Microscale Circuit Component Detector +gtlitecore.machine.microscale_circuit_detector.tooltip.1=Add Microscale Detecting functionality to the PCB Factory +gtlitecore.machine.microscale_circuit_detector.tooltip.2=Each 1 §6Gold Nanite§7 in §fItem Import Bus§7 will cause Parallel §e+4§7 + +gtlitecore.machine.bio_cultivation_chamber.name=Bio Component Cultivation Chamber + +gtlitecore.machine.water_cooling_tower.name=Water Cooling Tower +gtlitecore.machine.water_cooling_tower.tooltip.1=Add Cooling functionality to the PCB Factory. +gtlitecore.machine.water_cooling_tower.tooltip.2=Unlocked §aStandard Overclock§7 when §6PCB Factory§7 has this module +gtlitecore.machine.water_cooling_tower.tooltip.3=Can input §bDistilled Water§7 to get §9+400%%§7 Speed Bonus for PCB Factory + +gtlitecore.machine.thermosink_cooling_tower.name=Thermosink Cooling Tower +gtlitecore.machine.thermosink_cooling_tower.tooltip.1=Add Extremely Cooling functionality to the PCB Factory. +gtlitecore.machine.thermosink_cooling_tower.tooltip.2=Unlocked §bPerfect Overclock§7 when §6PCB Factory§7 has this module + gtlitecore.machine.nano_forge.name=Nano Forge gtlitecore.machine.nano_forge.tooltip.1=以极高的能量融合金属与电路,进而淬炼出纳米蜂群 gtlitecore.machine.nano_forge.tooltip.2=你需要先制作§3碳纳米蜂群§7来塑造纳米锻炉,第一批纳米蜂群将引导金属与电路的融合过程。 diff --git a/src/main/resources/assets/gtlitecore/lang/zh_cn.lang b/src/main/resources/assets/gtlitecore/lang/zh_cn.lang index 6e2c83952..569f730c8 100644 --- a/src/main/resources/assets/gtlitecore/lang/zh_cn.lang +++ b/src/main/resources/assets/gtlitecore/lang/zh_cn.lang @@ -1736,12 +1736,6 @@ gtlitecore.recipe.component_assembly_line_tier.14=部件装配外壳等级:MAX gtlitecore.recipe.min_height=最低高度:%s -gtlitecore.recipe.pcb_factory_tier=结构等级:错误 -gtlitecore.recipe.pcb_factory_tier.1=结构等级:1 -gtlitecore.recipe.pcb_factory_tier.2=结构等级:2 -gtlitecore.recipe.pcb_factory_tier.3=结构等级:3 -gtlitecore.recipe.pcb_factory_auxiliary_tier=需要生物仓升级 - gtlitecore.recipe.nano_forge_tier=结构等级:错误 gtlitecore.recipe.nano_forge_tier.1=结构等级:1 gtlitecore.recipe.nano_forge_tier.2=结构等级:2 @@ -1760,6 +1754,14 @@ gtlitecore.recipe.acceleration_track_tier.3=加速轨道等级:MK3 gtlitecore.recipe.acceleration_track_tier.4=加速轨道等级:MK4 gtlitecore.recipe.acceleration_track_tier.5=加速轨道等级:MK5 +gtlitecore.recipe.request_additional_structures=需要:%s + +# Machine API contexts +gtlitecore.machine.additional_structure.data_stick.name=§o附属结构配置数据 +gtlitecore.machine.additional_structure.pos_saved=已将附属结构控制器坐标(%s,%s,%s)保存到闪存 +gtlitecore.machine.additional_structure.connected=已将附属结构连接至主结构 +gtlitecore.machine.additional_structure.not_found=未发现有效的附属结构 + # Machines gtlitecore.machine.polisher.lv.name=§7基础§f抛光机 gtlitecore.machine.polisher.lv.tooltip=电动切石机 @@ -2408,20 +2410,12 @@ gtlitecore.machine.plasma_enhanced_cvd_unit.tooltip.2=兼容所有普通§2化 gtlitecore.machine.pcb_factory.name=PCB工厂 gtlitecore.machine.pcb_factory.tooltip.1=专门用于生产电路基板的大型工厂 -gtlitecore.machine.pcb_factory.tooltip.2=带有多级附属结构,附属结构的等级限制了最大配方等级。 -gtlitecore.machine.pcb_factory.tooltip.3=2级与3级PCB工厂支持放置额外的§f纳米蜂群§7来增加并行数: -gtlitecore.machine.pcb_factory.tooltip.4=- 2级:每放入1个§6银纳米蜂群§7,并行数增加2; -gtlitecore.machine.pcb_factory.tooltip.5=- 3级:每放入1个§a金纳米蜂群§7,并行数增加4; -gtlitecore.machine.pcb_factory.tooltip.6=需要升级§d冷却结构§7才能解锁机器的超频功能: -gtlitecore.machine.pcb_factory.tooltip.7=- 建造§b水冷塔§7后,解锁配方的§f默认超频§7功能; -gtlitecore.machine.pcb_factory.tooltip.8=- 建造§9空冻塔§7后,解锁配方的§5无损超频§7功能; -gtlitecore.machine.pcb_factory.tooltip.9=建造§2生物室§7以解锁高级电路板配方。 -gtlitecore.machine.pcb_factory.tooltip.10=调整机器的线宽(默认§f100μm§7,每次±§f25μm§7)以获得特殊效果: -gtlitecore.machine.pcb_factory.tooltip.11=- 线宽每缩短§f25μm§7,配方时间就减少§f20%%§7,耗能就增加§f50%%§7; -gtlitecore.machine.pcb_factory.tooltip.12=- 线宽每放宽§f25μm§7,配方时间就增加§f20%%§7,耗能就减少§f10%%§7; -gtlitecore.machine.pcb_factory.tooltip.13=机器的最小线宽为§f25μm§7,最大线宽为§f200μm§7。 -gtlitecore.machine.pcb_factory.tooltip.14=允许使用任意种类的§f能源仓§7或§f激光靶仓§7输入能量 -gtlitecore.machine.pcb_factory.tooltip.15=§f如果你不知道如何获得纳米蜂群,请搜索§3纳米锻炉§f。 +gtlitecore.machine.pcb_factory.tooltip.2=建造§e附属模块§7来解锁高阶配方或增强机器性能 +gtlitecore.machine.pcb_factory.tooltip.3=默认情况下§f不会进行超频§7,需要建造对应的附属模块来解锁 +gtlitecore.machine.pcb_factory.tooltip.4=调整机器的线宽(默认§b100μm§7,每次±§b25μm§7)以获得特殊效果: +gtlitecore.machine.pcb_factory.tooltip.5=- 线宽每缩短§f25μm§7,配方时间就减少§f20%%§7,耗能就增加§f50%%§7; +gtlitecore.machine.pcb_factory.tooltip.6=- 线宽每放宽§f25μm§7,配方时间就增加§f20%%§7,耗能就减少§f10%%§7; +gtlitecore.machine.pcb_factory.tooltip.7=机器的最小线宽为§f25μm§7,最大线宽为§f200μm§7。 gtlitecore.machine.pcb_factory.structure_info=结构等级:%s (线宽:%sμm) gtlitecore.machine.pcb_factory.structure_cooling=冷却已启用 @@ -2431,6 +2425,27 @@ gtlitecore.machine.pcb_factory.structure_bio_chamber=有机黏菌充斥于生物 gtlitecore.machine.pcb_factory.trace_size.decrement=§c放宽25μm线宽 /n§7配方时间增加20%%,耗电量减少10%% gtlitecore.machine.pcb_factory.trace_size.increment=§a缩短25μm线宽 /n§7配方时间减少20%%,耗电量增加50%% +gtlitecore.machine.pcb_factory.additional_structure_name=PCB工厂附属模块 + +gtlitecore.machine.nanolithography_array.name=纳米光刻集群 +gtlitecore.machine.nanolithography_array.tooltip.1=将纳米光刻功能添加到PCB工厂 +gtlitecore.machine.nanolithography_array.tooltip.2=在本结构中的§f输入总线§7中每有1个§d银纳米蜂群§7,最大并行数§e+2§7 + +gtlitecore.machine.microscale_circuit_detector.name=微尺度电路元件检测器 +gtlitecore.machine.microscale_circuit_detector.tooltip.1=将微尺度检测功能添加到PCB工厂 +gtlitecore.machine.microscale_circuit_detector.tooltip.2=在本结构中的§f输入总线§7中每有1个§6金纳米蜂群§7,最大并行数§e+4§7 + +gtlitecore.machine.bio_cultivation_chamber.name=生物元件培养室 + +gtlitecore.machine.water_cooling_tower.name=水冷塔 +gtlitecore.machine.water_cooling_tower.tooltip.1=将冷却功能添加到PCB工厂 +gtlitecore.machine.water_cooling_tower.tooltip.2=当§6PCB工厂§7安装此模块时为其解锁§a常规超频§7功能 +gtlitecore.machine.water_cooling_tower.tooltip.3=可以输入§b蒸馏水§7来使PCB工厂获得§9+400%%§7的速度加成 + +gtlitecore.machine.thermosink_cooling_tower.name=空冻塔 +gtlitecore.machine.thermosink_cooling_tower.tooltip.1=将超级冷却功能添加到PCB工厂 +gtlitecore.machine.thermosink_cooling_tower.tooltip.2=当§6PCB工厂§7安装此模块时为其解锁§b无损超频§7功能 + gtlitecore.machine.nano_forge.name=纳米锻炉 gtlitecore.machine.nano_forge.tooltip.1=以极高的能量融合金属与电路,进而淬炼出纳米蜂群 gtlitecore.machine.nano_forge.tooltip.2=你需要先制作§3碳纳米蜂群§7来塑造纳米锻炉,第一批纳米蜂群将引导金属与电路的融合过程。