From 775088d23a95a41b539cd1a6c350babc8c14bba4 Mon Sep 17 00:00:00 2001 From: gebardensprache Date: Tue, 16 Jun 2026 00:39:52 +0900 Subject: [PATCH 01/20] feat: extendable & additional multiblock demo --- .../extendable/AdditionalMultiblockBase.kt | 30 ++++++++++++ .../extendable/AdditionalStructureManager.kt | 49 +++++++++++++++++++ .../extendable/ExtendableMultiblockBase.kt | 41 ++++++++++++++++ 3 files changed, 120 insertions(+) create mode 100644 src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/AdditionalMultiblockBase.kt create mode 100644 src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/AdditionalStructureManager.kt create mode 100644 src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/ExtendableMultiblockBase.kt 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..a52b2964d --- /dev/null +++ b/src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/AdditionalMultiblockBase.kt @@ -0,0 +1,30 @@ +package gregtechlite.gtlitecore.api.metatileentity.multiblock.extendable + +import gregtech.api.capability.IControllable +import gregtech.api.metatileentity.multiblock.MultiblockWithDisplayBase +import net.minecraft.util.ResourceLocation + +abstract class AdditionalMultiblockBase>(metaTileEntityId: ResourceLocation) : + MultiblockWithDisplayBase(metaTileEntityId), IControllable +{ + protected var mainController: ExtendableMultiblockBase? = null + + override fun hasMaintenanceMechanics() = false + override fun isWorkingEnabled() = isStructureFormed && isConnected() + + protected fun isConnected() = mainController != null && mainController!!.isWorkingEnabled + + fun connect(controller: ExtendableMultiblockBase) { + mainController = controller + } + + override fun updateFormedValid() + { + mainController?.addAdditional(this) + } + + override fun invalidateStructure() + { + mainController?.removeAdditional(pos) + } +} \ 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..e9b5d1a42 --- /dev/null +++ b/src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/AdditionalStructureManager.kt @@ -0,0 +1,49 @@ +package gregtechlite.gtlitecore.api.metatileentity.multiblock.extendable + +import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap +import net.minecraft.nbt.NBTTagCompound +import net.minecraft.nbt.NBTTagList +import net.minecraft.util.ResourceLocation +import net.minecraft.util.math.BlockPos +import kotlin.streams.toList + +open class AdditionalStructureManager>(protected val base: ExtendableMultiblockBase) +{ + protected val structures: Object2ObjectOpenHashMap> = Object2ObjectOpenHashMap() + + fun add(additionalMultiblockBase: AdditionalMultiblockBase) + { + structures[additionalMultiblockBase.pos] = additionalMultiblockBase + } + + fun get(metaTileEntityId: ResourceLocation): Collection> = structures.values.stream().filter { it.metaTileEntityId.equals(metaTileEntityId) }.toList() + + fun get(pos: BlockPos): AdditionalMultiblockBase? = structures[pos] + + fun remove(pos: BlockPos) = structures.remove(pos) + + fun serialize(): NBTTagCompound { + val nbt = NBTTagCompound() + val list = NBTTagList() + structures.keys.forEach { + val pos = NBTTagCompound() + pos.setInteger("X", it.x) + pos.setInteger("Y", it.y) + pos.setInteger("Z", it.z) + list.appendTag(pos) + } + nbt.setTag("BlockPoses", list) + return nbt + } + + fun deserialize(nbt: NBTTagCompound): List { + return 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/ExtendableMultiblockBase.kt b/src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/ExtendableMultiblockBase.kt new file mode 100644 index 000000000..71f663136 --- /dev/null +++ b/src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/ExtendableMultiblockBase.kt @@ -0,0 +1,41 @@ +package gregtechlite.gtlitecore.api.metatileentity.multiblock.extendable + +import gregtech.api.capability.IControllable +import gregtech.api.capability.IWorkable +import gregtech.api.metatileentity.multiblock.MultiblockWithDisplayBase +import gregtech.api.util.GTUtility +import net.minecraft.nbt.NBTTagCompound +import net.minecraft.util.ResourceLocation +import net.minecraft.util.math.BlockPos + +abstract class ExtendableMultiblockBase>(metaTileEntityId: ResourceLocation) : + MultiblockWithDisplayBase(metaTileEntityId), IWorkable, IControllable +{ + protected val additionalStructureManager: AdditionalStructureManager = AdditionalStructureManager(this) + + fun removeAdditional(pos: BlockPos) { + additionalStructureManager.remove(pos) + } + + fun addAdditional(additionalMultiblockBase: AdditionalMultiblockBase) { + additionalStructureManager.add(additionalMultiblockBase) + } + + 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) + } + } + } +} \ No newline at end of file From 689319ecb4c35e2cbd403d4f5dd5af7f3298dd90 Mon Sep 17 00:00:00 2001 From: Magic_Sweepy Date: Tue, 16 Jun 2026 11:52:14 +0800 Subject: [PATCH 02/20] clean up some syntax & use mutable list but not collection --- .../extendable/AdditionalMultiblockBase.kt | 7 ++-- .../extendable/AdditionalStructureManager.kt | 33 ++++++++----------- .../extendable/ExtendableMultiblockBase.kt | 17 +++++----- 3 files changed, 27 insertions(+), 30 deletions(-) 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 index a52b2964d..cb26594c1 100644 --- a/src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/AdditionalMultiblockBase.kt +++ b/src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/AdditionalMultiblockBase.kt @@ -4,8 +4,8 @@ import gregtech.api.capability.IControllable import gregtech.api.metatileentity.multiblock.MultiblockWithDisplayBase import net.minecraft.util.ResourceLocation -abstract class AdditionalMultiblockBase>(metaTileEntityId: ResourceLocation) : - MultiblockWithDisplayBase(metaTileEntityId), IControllable +abstract class AdditionalMultiblockBase>(metaTileEntityId: ResourceLocation) + : MultiblockWithDisplayBase(metaTileEntityId), IControllable { protected var mainController: ExtendableMultiblockBase? = null @@ -14,7 +14,8 @@ abstract class AdditionalMultiblockBase>(metaTil protected fun isConnected() = mainController != null && mainController!!.isWorkingEnabled - fun connect(controller: ExtendableMultiblockBase) { + fun connect(controller: ExtendableMultiblockBase) + { mainController = controller } 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 index e9b5d1a42..20d0f8a75 100644 --- a/src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/AdditionalStructureManager.kt +++ b/src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/AdditionalStructureManager.kt @@ -1,49 +1,44 @@ package gregtechlite.gtlitecore.api.metatileentity.multiblock.extendable -import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap +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 -import kotlin.streams.toList open class AdditionalStructureManager>(protected val base: ExtendableMultiblockBase) { - protected val structures: Object2ObjectOpenHashMap> = Object2ObjectOpenHashMap() + protected val structures = openHashMapOf>() fun add(additionalMultiblockBase: AdditionalMultiblockBase) { structures[additionalMultiblockBase.pos] = additionalMultiblockBase } - fun get(metaTileEntityId: ResourceLocation): Collection> = structures.values.stream().filter { it.metaTileEntityId.equals(metaTileEntityId) }.toList() + 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 serialize(): NBTTagCompound { + fun serialize(): NBTTagCompound + { val nbt = NBTTagCompound() val list = NBTTagList() structures.keys.forEach { - val pos = NBTTagCompound() - pos.setInteger("X", it.x) - pos.setInteger("Y", it.y) - pos.setInteger("Z", it.z) + 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 { - return nbt.getTagList("BlockPoses", 10).filterIsInstance().map { - BlockPos( - it.getInteger("X"), - it.getInteger("Y"), - it.getInteger("Z") - ) - } - } - + 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/ExtendableMultiblockBase.kt b/src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/ExtendableMultiblockBase.kt index 71f663136..5c4b78d8c 100644 --- a/src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/ExtendableMultiblockBase.kt +++ b/src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/ExtendableMultiblockBase.kt @@ -8,16 +8,18 @@ import net.minecraft.nbt.NBTTagCompound import net.minecraft.util.ResourceLocation import net.minecraft.util.math.BlockPos -abstract class ExtendableMultiblockBase>(metaTileEntityId: ResourceLocation) : - MultiblockWithDisplayBase(metaTileEntityId), IWorkable, IControllable +abstract class ExtendableMultiblockBase>(metaTileEntityId: ResourceLocation) + : MultiblockWithDisplayBase(metaTileEntityId), IWorkable, IControllable { protected val additionalStructureManager: AdditionalStructureManager = AdditionalStructureManager(this) - fun removeAdditional(pos: BlockPos) { + fun removeAdditional(pos: BlockPos) + { additionalStructureManager.remove(pos) } - fun addAdditional(additionalMultiblockBase: AdditionalMultiblockBase) { + fun addAdditional(additionalMultiblockBase: AdditionalMultiblockBase) + { additionalStructureManager.add(additionalMultiblockBase) } @@ -27,15 +29,14 @@ abstract class ExtendableMultiblockBase>(metaTile return super.writeToNBT(data) } - override fun readFromNBT(data: NBTTagCompound?) { + 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) - } + .forEach { additionalMultiblockBase -> additionalMultiblockBase.connect(this) } } } } \ No newline at end of file From 32bea4c98e38cafb6964035ba4af58294a3eb384 Mon Sep 17 00:00:00 2001 From: gebardensprache Date: Wed, 17 Jun 2026 19:55:46 +0900 Subject: [PATCH 03/20] feat: decoupling logic & new connect logic - `ExtendableMultiblock.kt` for implement - call `AdditionalStructureManager#getAbilities` to get all abilities about emb & amb - WIP: recipe logic and property --- .../extendable/AdditionalMultiblockBase.kt | 18 +++----- .../extendable/AdditionalStructureManager.kt | 9 +++- .../extendable/ExtendableMultiblock.kt | 20 +++++++++ .../extendable/ExtendableMultiblockBase.kt | 14 +++---- .../recipe/ExtendableMultiblockRecipeLogic.kt | 9 ++++ .../recipe/RecipeMapExtendableMultiblock.kt | 42 +++++++++++++++++++ .../recipe/RequestAdditionalProperty.kt | 26 ++++++++++++ 7 files changed, 115 insertions(+), 23 deletions(-) create mode 100644 src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/ExtendableMultiblock.kt create mode 100644 src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/recipe/ExtendableMultiblockRecipeLogic.kt create mode 100644 src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/recipe/RecipeMapExtendableMultiblock.kt create mode 100644 src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/recipe/RequestAdditionalProperty.kt 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 index cb26594c1..dcbf14006 100644 --- a/src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/AdditionalMultiblockBase.kt +++ b/src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/AdditionalMultiblockBase.kt @@ -4,28 +4,20 @@ import gregtech.api.capability.IControllable import gregtech.api.metatileentity.multiblock.MultiblockWithDisplayBase import net.minecraft.util.ResourceLocation -abstract class AdditionalMultiblockBase>(metaTileEntityId: ResourceLocation) +abstract class AdditionalMultiblockBase>(metaTileEntityId: ResourceLocation) : MultiblockWithDisplayBase(metaTileEntityId), IControllable { - protected var mainController: ExtendableMultiblockBase? = null + protected var mainController: ExtendableMultiblock? = null override fun hasMaintenanceMechanics() = false override fun isWorkingEnabled() = isStructureFormed && isConnected() - protected fun isConnected() = mainController != null && mainController!!.isWorkingEnabled + protected fun isConnected() = mainController != null && mainController!!.isWorkingEnabled() - fun connect(controller: ExtendableMultiblockBase) + fun connect(controller: ExtendableMultiblock) { + mainController?.removeAdditional(pos) mainController = controller - } - - override fun updateFormedValid() - { mainController?.addAdditional(this) } - - override fun invalidateStructure() - { - mainController?.removeAdditional(pos) - } } \ 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 index 20d0f8a75..92805ced2 100644 --- a/src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/AdditionalStructureManager.kt +++ b/src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/AdditionalStructureManager.kt @@ -1,12 +1,13 @@ package gregtechlite.gtlitecore.api.metatileentity.multiblock.extendable +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: ExtendableMultiblockBase) +open class AdditionalStructureManager>(protected val base: ExtendableMultiblock) { protected val structures = openHashMapOf>() @@ -22,6 +23,12 @@ open class AdditionalStructureManager>(protected fun remove(pos: BlockPos) = structures.remove(pos) + 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() 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..9596a680c --- /dev/null +++ b/src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/ExtendableMultiblock.kt @@ -0,0 +1,20 @@ +package gregtechlite.gtlitecore.api.metatileentity.multiblock.extendable + +import gregtech.api.capability.IMultiblockController +import net.minecraft.util.math.BlockPos + +interface ExtendableMultiblock>: IMultiblockController +{ + fun getAdditionalStructureManager(): AdditionalStructureManager + + fun isWorkingEnabled(): Boolean + + fun addAdditional(additionalMultiblockBase: AdditionalMultiblockBase) { + getAdditionalStructureManager().add(additionalMultiblockBase) + } + + fun removeAdditional(pos: BlockPos) + { + getAdditionalStructureManager().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 index 5c4b78d8c..230e066c8 100644 --- a/src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/ExtendableMultiblockBase.kt +++ b/src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/ExtendableMultiblockBase.kt @@ -2,25 +2,21 @@ package gregtechlite.gtlitecore.api.metatileentity.multiblock.extendable import gregtech.api.capability.IControllable import gregtech.api.capability.IWorkable +import gregtech.api.metatileentity.multiblock.MultiblockAbility import gregtech.api.metatileentity.multiblock.MultiblockWithDisplayBase import gregtech.api.util.GTUtility import net.minecraft.nbt.NBTTagCompound import net.minecraft.util.ResourceLocation -import net.minecraft.util.math.BlockPos abstract class ExtendableMultiblockBase>(metaTileEntityId: ResourceLocation) - : MultiblockWithDisplayBase(metaTileEntityId), IWorkable, IControllable + : MultiblockWithDisplayBase(metaTileEntityId), IWorkable, IControllable, ExtendableMultiblock { protected val additionalStructureManager: AdditionalStructureManager = AdditionalStructureManager(this) + override fun getAdditionalStructureManager(): AdditionalStructureManager = additionalStructureManager - fun removeAdditional(pos: BlockPos) + override fun getAbilities(ability: MultiblockAbility): List { - additionalStructureManager.remove(pos) - } - - fun addAdditional(additionalMultiblockBase: AdditionalMultiblockBase) - { - additionalStructureManager.add(additionalMultiblockBase) + return super.getAbilities(ability).also { it.addAll(additionalStructureManager.getAbilities(ability)) } } override fun writeToNBT(data: NBTTagCompound?): NBTTagCompound? diff --git a/src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/recipe/ExtendableMultiblockRecipeLogic.kt b/src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/recipe/ExtendableMultiblockRecipeLogic.kt new file mode 100644 index 000000000..2f10f85ee --- /dev/null +++ b/src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/recipe/ExtendableMultiblockRecipeLogic.kt @@ -0,0 +1,9 @@ +package gregtechlite.gtlitecore.api.metatileentity.multiblock.extendable.recipe + +import gregtech.api.capability.impl.MultiblockRecipeLogic +import gregtechlite.gtlitecore.api.metatileentity.multiblock.extendable.AdditionalStructureManager + +open class ExtendableMultiblockRecipeLogic>(controller: RecipeMapExtendableMultiblock, + protected val manager: AdditionalStructureManager) + : MultiblockRecipeLogic(controller) +{} \ No newline at end of file diff --git a/src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/recipe/RecipeMapExtendableMultiblock.kt b/src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/recipe/RecipeMapExtendableMultiblock.kt new file mode 100644 index 000000000..33b5fdb7a --- /dev/null +++ b/src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/recipe/RecipeMapExtendableMultiblock.kt @@ -0,0 +1,42 @@ +package gregtechlite.gtlitecore.api.metatileentity.multiblock.extendable.recipe + +import gregtech.api.capability.IControllable +import gregtech.api.capability.IWorkable +import gregtech.api.metatileentity.multiblock.MultiblockAbility +import gregtech.api.metatileentity.multiblock.RecipeMapMultiblockController +import gregtech.api.recipes.RecipeMap +import gregtech.api.util.GTUtility +import gregtechlite.gtlitecore.api.metatileentity.multiblock.extendable.AdditionalMultiblockBase +import gregtechlite.gtlitecore.api.metatileentity.multiblock.extendable.AdditionalStructureManager +import gregtechlite.gtlitecore.api.metatileentity.multiblock.extendable.ExtendableMultiblock +import net.minecraft.nbt.NBTTagCompound +import net.minecraft.util.ResourceLocation + +abstract class RecipeMapExtendableMultiblock>(metaTileEntityId: ResourceLocation, recipeMap: RecipeMap<*>) + : RecipeMapMultiblockController(metaTileEntityId, recipeMap), IWorkable, IControllable, ExtendableMultiblock +{ + protected val additionalStructureManager: AdditionalStructureManager = AdditionalStructureManager(this) + override fun getAdditionalStructureManager(): AdditionalStructureManager = additionalStructureManager + + override fun getAbilities(ability: MultiblockAbility): List + { + return super.getAbilities(ability).also { it.addAll(additionalStructureManager.getAbilities(ability)) } + } + + 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) } + } + } +} \ No newline at end of file diff --git a/src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/recipe/RequestAdditionalProperty.kt b/src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/recipe/RequestAdditionalProperty.kt new file mode 100644 index 000000000..32ace43ec --- /dev/null +++ b/src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/recipe/RequestAdditionalProperty.kt @@ -0,0 +1,26 @@ +package gregtechlite.gtlitecore.api.metatileentity.multiblock.extendable.recipe + +import gregtech.api.recipes.properties.RecipeProperty +import net.minecraft.client.Minecraft +import net.minecraft.client.resources.I18n +import net.minecraft.nbt.NBTBase +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", ResourceLocation::class.java) +{ + override fun serialize(value: Any): NBTBase = NBTTagString(value.toString()) + + override fun deserialize(nbt: NBTBase): Any = (nbt as? NBTTagString)!!.string + + @SideOnly(Side.CLIENT) + override fun drawInfo(mc: Minecraft, x: Int, y: Int, color: Int, value: Any) + { + val split = value.toString().split(":") + mc.fontRenderer.drawString( + I18n.format("gtlitecore.recipe.request_additional_structures", "${split[0]}.machine.${split[1]}.name") + , x, y, color) + } +} \ No newline at end of file From 5e84ceb559fa03793052f9a331a42c9de071c11d Mon Sep 17 00:00:00 2001 From: gebardensprache Date: Wed, 17 Jun 2026 20:15:19 +0900 Subject: [PATCH 04/20] fix: move to correct dir & interface rewrite --- .../logic}/ExtendableMultiblockRecipeLogic.kt | 6 ++++-- .../multiblock/extendable/ExtendableMultiblock.kt | 6 +++--- .../multiblock/extendable/ExtendableMultiblockBase.kt | 3 +-- .../{recipe => }/RecipeMapExtendableMultiblock.kt | 8 ++------ .../property}/RequestAdditionalProperty.kt | 2 +- 5 files changed, 11 insertions(+), 14 deletions(-) rename src/main/kotlin/gregtechlite/gtlitecore/api/{metatileentity/multiblock/extendable/recipe => capability/logic}/ExtendableMultiblockRecipeLogic.kt (73%) rename src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/{recipe => }/RecipeMapExtendableMultiblock.kt (74%) rename src/main/kotlin/gregtechlite/gtlitecore/api/{metatileentity/multiblock/extendable/recipe => recipe/property}/RequestAdditionalProperty.kt (92%) diff --git a/src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/recipe/ExtendableMultiblockRecipeLogic.kt b/src/main/kotlin/gregtechlite/gtlitecore/api/capability/logic/ExtendableMultiblockRecipeLogic.kt similarity index 73% rename from src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/recipe/ExtendableMultiblockRecipeLogic.kt rename to src/main/kotlin/gregtechlite/gtlitecore/api/capability/logic/ExtendableMultiblockRecipeLogic.kt index 2f10f85ee..420e156f1 100644 --- a/src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/recipe/ExtendableMultiblockRecipeLogic.kt +++ b/src/main/kotlin/gregtechlite/gtlitecore/api/capability/logic/ExtendableMultiblockRecipeLogic.kt @@ -1,9 +1,11 @@ -package gregtechlite.gtlitecore.api.metatileentity.multiblock.extendable.recipe +package gregtechlite.gtlitecore.api.capability.logic import gregtech.api.capability.impl.MultiblockRecipeLogic import gregtechlite.gtlitecore.api.metatileentity.multiblock.extendable.AdditionalStructureManager +import gregtechlite.gtlitecore.api.metatileentity.multiblock.extendable.RecipeMapExtendableMultiblock open class ExtendableMultiblockRecipeLogic>(controller: RecipeMapExtendableMultiblock, - protected val manager: AdditionalStructureManager) + protected val manager: AdditionalStructureManager +) : MultiblockRecipeLogic(controller) {} \ 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 index 9596a680c..8de208d99 100644 --- a/src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/ExtendableMultiblock.kt +++ b/src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/ExtendableMultiblock.kt @@ -5,16 +5,16 @@ import net.minecraft.util.math.BlockPos interface ExtendableMultiblock>: IMultiblockController { - fun getAdditionalStructureManager(): AdditionalStructureManager + var additionalStructureManager: AdditionalStructureManager fun isWorkingEnabled(): Boolean fun addAdditional(additionalMultiblockBase: AdditionalMultiblockBase) { - getAdditionalStructureManager().add(additionalMultiblockBase) + additionalStructureManager.add(additionalMultiblockBase) } fun removeAdditional(pos: BlockPos) { - getAdditionalStructureManager().remove(pos) + 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 index 230e066c8..8ea9e7f43 100644 --- a/src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/ExtendableMultiblockBase.kt +++ b/src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/ExtendableMultiblockBase.kt @@ -11,8 +11,7 @@ import net.minecraft.util.ResourceLocation abstract class ExtendableMultiblockBase>(metaTileEntityId: ResourceLocation) : MultiblockWithDisplayBase(metaTileEntityId), IWorkable, IControllable, ExtendableMultiblock { - protected val additionalStructureManager: AdditionalStructureManager = AdditionalStructureManager(this) - override fun getAdditionalStructureManager(): AdditionalStructureManager = additionalStructureManager + override var additionalStructureManager: AdditionalStructureManager = AdditionalStructureManager(this) override fun getAbilities(ability: MultiblockAbility): List { diff --git a/src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/recipe/RecipeMapExtendableMultiblock.kt b/src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/RecipeMapExtendableMultiblock.kt similarity index 74% rename from src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/recipe/RecipeMapExtendableMultiblock.kt rename to src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/RecipeMapExtendableMultiblock.kt index 33b5fdb7a..50aec5fb8 100644 --- a/src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/recipe/RecipeMapExtendableMultiblock.kt +++ b/src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/RecipeMapExtendableMultiblock.kt @@ -1,4 +1,4 @@ -package gregtechlite.gtlitecore.api.metatileentity.multiblock.extendable.recipe +package gregtechlite.gtlitecore.api.metatileentity.multiblock.extendable import gregtech.api.capability.IControllable import gregtech.api.capability.IWorkable @@ -6,17 +6,13 @@ import gregtech.api.metatileentity.multiblock.MultiblockAbility import gregtech.api.metatileentity.multiblock.RecipeMapMultiblockController import gregtech.api.recipes.RecipeMap import gregtech.api.util.GTUtility -import gregtechlite.gtlitecore.api.metatileentity.multiblock.extendable.AdditionalMultiblockBase -import gregtechlite.gtlitecore.api.metatileentity.multiblock.extendable.AdditionalStructureManager -import gregtechlite.gtlitecore.api.metatileentity.multiblock.extendable.ExtendableMultiblock import net.minecraft.nbt.NBTTagCompound import net.minecraft.util.ResourceLocation abstract class RecipeMapExtendableMultiblock>(metaTileEntityId: ResourceLocation, recipeMap: RecipeMap<*>) : RecipeMapMultiblockController(metaTileEntityId, recipeMap), IWorkable, IControllable, ExtendableMultiblock { - protected val additionalStructureManager: AdditionalStructureManager = AdditionalStructureManager(this) - override fun getAdditionalStructureManager(): AdditionalStructureManager = additionalStructureManager + override var additionalStructureManager: AdditionalStructureManager = AdditionalStructureManager(this) override fun getAbilities(ability: MultiblockAbility): List { diff --git a/src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/recipe/RequestAdditionalProperty.kt b/src/main/kotlin/gregtechlite/gtlitecore/api/recipe/property/RequestAdditionalProperty.kt similarity index 92% rename from src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/recipe/RequestAdditionalProperty.kt rename to src/main/kotlin/gregtechlite/gtlitecore/api/recipe/property/RequestAdditionalProperty.kt index 32ace43ec..a5ee5e46c 100644 --- a/src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/recipe/RequestAdditionalProperty.kt +++ b/src/main/kotlin/gregtechlite/gtlitecore/api/recipe/property/RequestAdditionalProperty.kt @@ -1,4 +1,4 @@ -package gregtechlite.gtlitecore.api.metatileentity.multiblock.extendable.recipe +package gregtechlite.gtlitecore.api.recipe.property import gregtech.api.recipes.properties.RecipeProperty import net.minecraft.client.Minecraft From 9c29340c5a196c2f562cf4b6c08bcbfd0a584200 Mon Sep 17 00:00:00 2001 From: Magic_Sweepy Date: Wed, 17 Jun 2026 19:24:35 +0800 Subject: [PATCH 05/20] l10n for machine name in request addition recipe property --- .../multiblock/extendable/ExtendableMultiblock.kt | 3 ++- .../api/recipe/property/RequestAdditionalProperty.kt | 5 ++--- src/main/resources/assets/gtlitecore/lang/en_us.lang | 2 ++ src/main/resources/assets/gtlitecore/lang/zh_cn.lang | 2 ++ 4 files changed, 8 insertions(+), 4 deletions(-) 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 index 8de208d99..33a267be9 100644 --- a/src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/ExtendableMultiblock.kt +++ b/src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/ExtendableMultiblock.kt @@ -9,7 +9,8 @@ interface ExtendableMultiblock>: IMultiblockControlle fun isWorkingEnabled(): Boolean - fun addAdditional(additionalMultiblockBase: AdditionalMultiblockBase) { + fun addAdditional(additionalMultiblockBase: AdditionalMultiblockBase) + { additionalStructureManager.add(additionalMultiblockBase) } diff --git a/src/main/kotlin/gregtechlite/gtlitecore/api/recipe/property/RequestAdditionalProperty.kt b/src/main/kotlin/gregtechlite/gtlitecore/api/recipe/property/RequestAdditionalProperty.kt index a5ee5e46c..e3d6a7293 100644 --- a/src/main/kotlin/gregtechlite/gtlitecore/api/recipe/property/RequestAdditionalProperty.kt +++ b/src/main/kotlin/gregtechlite/gtlitecore/api/recipe/property/RequestAdditionalProperty.kt @@ -19,8 +19,7 @@ object RequestAdditionalProperty: RecipeProperty("request_addi override fun drawInfo(mc: Minecraft, x: Int, y: Int, color: Int, value: Any) { val split = value.toString().split(":") - mc.fontRenderer.drawString( - I18n.format("gtlitecore.recipe.request_additional_structures", "${split[0]}.machine.${split[1]}.name") - , x, y, color) + mc.fontRenderer.drawString(I18n.format("gtlitecore.recipe.request_additional_structures", + I18n.format("${split[0]}.machine.${split[1]}.name")), x, y, color) } } \ No newline at end of file diff --git a/src/main/resources/assets/gtlitecore/lang/en_us.lang b/src/main/resources/assets/gtlitecore/lang/en_us.lang index 29cdf2807..819260e5a 100644 --- a/src/main/resources/assets/gtlitecore/lang/en_us.lang +++ b/src/main/resources/assets/gtlitecore/lang/en_us.lang @@ -1760,6 +1760,8 @@ 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 Additional Structure: %s + # Machines gtlitecore.machine.polisher.lv.name=§7Basic§f Polisher gtlitecore.machine.polisher.lv.tooltip=Electric Stonecutter diff --git a/src/main/resources/assets/gtlitecore/lang/zh_cn.lang b/src/main/resources/assets/gtlitecore/lang/zh_cn.lang index 6e2c83952..29316139e 100644 --- a/src/main/resources/assets/gtlitecore/lang/zh_cn.lang +++ b/src/main/resources/assets/gtlitecore/lang/zh_cn.lang @@ -1760,6 +1760,8 @@ 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 + # Machines gtlitecore.machine.polisher.lv.name=§7基础§f抛光机 gtlitecore.machine.polisher.lv.tooltip=电动切石机 From 486010732c9b41e985241ff04b4fc0c99382c5e5 Mon Sep 17 00:00:00 2001 From: Magic_Sweepy Date: Wed, 17 Jun 2026 19:50:11 +0800 Subject: [PATCH 06/20] connect interaction between AMB and EMB via data stick --- .../extendable/AdditionalMultiblockBase.kt | 21 +++++++++++++- .../extendable/ExtendableMultiblockBase.kt | 29 ++++++++++++++++++- .../RecipeMapExtendableMultiblock.kt | 29 ++++++++++++++++++- .../assets/gtlitecore/lang/en_us.lang | 6 ++++ .../assets/gtlitecore/lang/zh_cn.lang | 6 ++++ 5 files changed, 88 insertions(+), 3 deletions(-) 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 index dcbf14006..073fe62fe 100644 --- a/src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/AdditionalMultiblockBase.kt +++ b/src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/AdditionalMultiblockBase.kt @@ -1,11 +1,16 @@ package gregtechlite.gtlitecore.api.metatileentity.multiblock.extendable import gregtech.api.capability.IControllable +import gregtech.api.capability.IDataStickIntractable import gregtech.api.metatileentity.multiblock.MultiblockWithDisplayBase +import net.minecraft.entity.player.EntityPlayer +import net.minecraft.item.ItemStack +import net.minecraft.nbt.NBTTagCompound import net.minecraft.util.ResourceLocation +import net.minecraft.util.text.TextComponentTranslation abstract class AdditionalMultiblockBase>(metaTileEntityId: ResourceLocation) - : MultiblockWithDisplayBase(metaTileEntityId), IControllable + : MultiblockWithDisplayBase(metaTileEntityId), IControllable, IDataStickIntractable { protected var mainController: ExtendableMultiblock? = null @@ -20,4 +25,18 @@ abstract class AdditionalMultiblockBase>(metaTileEnt mainController = controller mainController?.addAdditional(this) } + + 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) + } } \ 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 index 8ea9e7f43..204f5dde5 100644 --- a/src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/ExtendableMultiblockBase.kt +++ b/src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/ExtendableMultiblockBase.kt @@ -1,15 +1,20 @@ package gregtechlite.gtlitecore.api.metatileentity.multiblock.extendable 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.util.GTUtility +import net.minecraft.entity.player.EntityPlayer +import net.minecraft.item.ItemStack import net.minecraft.nbt.NBTTagCompound 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, ExtendableMultiblock + : MultiblockWithDisplayBase(metaTileEntityId), IWorkable, IControllable, IDataStickIntractable, ExtendableMultiblock { override var additionalStructureManager: AdditionalStructureManager = AdditionalStructureManager(this) @@ -34,4 +39,26 @@ abstract class ExtendableMultiblockBase>(metaTile .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) + } + } + } } \ 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 index 50aec5fb8..1c27549c2 100644 --- a/src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/RecipeMapExtendableMultiblock.kt +++ b/src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/RecipeMapExtendableMultiblock.kt @@ -1,16 +1,21 @@ package gregtechlite.gtlitecore.api.metatileentity.multiblock.extendable 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.recipes.RecipeMap import gregtech.api.util.GTUtility +import net.minecraft.entity.player.EntityPlayer +import net.minecraft.item.ItemStack import net.minecraft.nbt.NBTTagCompound 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, ExtendableMultiblock + : RecipeMapMultiblockController(metaTileEntityId, recipeMap), IWorkable, IControllable, IDataStickIntractable, ExtendableMultiblock { override var additionalStructureManager: AdditionalStructureManager = AdditionalStructureManager(this) @@ -35,4 +40,26 @@ abstract class RecipeMapExtendableMultiblock .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) + } + } + } } \ No newline at end of file diff --git a/src/main/resources/assets/gtlitecore/lang/en_us.lang b/src/main/resources/assets/gtlitecore/lang/en_us.lang index 819260e5a..741ff8f22 100644 --- a/src/main/resources/assets/gtlitecore/lang/en_us.lang +++ b/src/main/resources/assets/gtlitecore/lang/en_us.lang @@ -1762,6 +1762,12 @@ gtlitecore.recipe.acceleration_track_tier.5=Acceleration Track Tier: MK5 gtlitecore.recipe.request_additional_structures=Required Additional Structure: %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 diff --git a/src/main/resources/assets/gtlitecore/lang/zh_cn.lang b/src/main/resources/assets/gtlitecore/lang/zh_cn.lang index 29316139e..21e81859e 100644 --- a/src/main/resources/assets/gtlitecore/lang/zh_cn.lang +++ b/src/main/resources/assets/gtlitecore/lang/zh_cn.lang @@ -1762,6 +1762,12 @@ 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=电动切石机 From c351bcecb8f06ad65986680ae2e40ec434d58b88 Mon Sep 17 00:00:00 2001 From: Magic_Sweepy Date: Wed, 17 Jun 2026 20:00:23 +0800 Subject: [PATCH 07/20] raw recipe logic --- .../logic/ExtendableMultiblockRecipeLogic.kt | 20 ++++++++++++++++--- .../RecipeMapExtendableMultiblock.kt | 6 ++++++ 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/src/main/kotlin/gregtechlite/gtlitecore/api/capability/logic/ExtendableMultiblockRecipeLogic.kt b/src/main/kotlin/gregtechlite/gtlitecore/api/capability/logic/ExtendableMultiblockRecipeLogic.kt index 420e156f1..eb3d9f03d 100644 --- a/src/main/kotlin/gregtechlite/gtlitecore/api/capability/logic/ExtendableMultiblockRecipeLogic.kt +++ b/src/main/kotlin/gregtechlite/gtlitecore/api/capability/logic/ExtendableMultiblockRecipeLogic.kt @@ -1,11 +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 -) + protected val manager: AdditionalStructureManager) : MultiblockRecipeLogic(controller) -{} \ No newline at end of file +{ + 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 requiredId = recipe.getProperty(RequestAdditionalProperty, null) ?: return false + return manager.get(requiredId).isNotEmpty() + } +} 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 index 1c27549c2..9f2f81fb3 100644 --- a/src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/RecipeMapExtendableMultiblock.kt +++ b/src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/RecipeMapExtendableMultiblock.kt @@ -7,6 +7,7 @@ import gregtech.api.metatileentity.multiblock.MultiblockAbility import gregtech.api.metatileentity.multiblock.RecipeMapMultiblockController import gregtech.api.recipes.RecipeMap import gregtech.api.util.GTUtility +import gregtechlite.gtlitecore.api.capability.logic.ExtendableMultiblockRecipeLogic import net.minecraft.entity.player.EntityPlayer import net.minecraft.item.ItemStack import net.minecraft.nbt.NBTTagCompound @@ -19,6 +20,11 @@ abstract class RecipeMapExtendableMultiblock { override var additionalStructureManager: AdditionalStructureManager = AdditionalStructureManager(this) + init + { + recipeMapWorkable = ExtendableMultiblockRecipeLogic(this, additionalStructureManager) + } + override fun getAbilities(ability: MultiblockAbility): List { return super.getAbilities(ability).also { it.addAll(additionalStructureManager.getAbilities(ability)) } From e2103b0693bf9c7dcb97541399d69199a0413e66 Mon Sep 17 00:00:00 2001 From: Magic_Sweepy Date: Thu, 18 Jun 2026 11:38:04 +0800 Subject: [PATCH 08/20] try to support multi request additional structures --- .../property/RequestAdditionalProperty.kt | 32 +++++++++++++++---- .../value/RequestAdditionalPropertyValue.kt | 8 +++++ 2 files changed, 34 insertions(+), 6 deletions(-) create mode 100644 src/main/kotlin/gregtechlite/gtlitecore/api/recipe/property/value/RequestAdditionalPropertyValue.kt diff --git a/src/main/kotlin/gregtechlite/gtlitecore/api/recipe/property/RequestAdditionalProperty.kt b/src/main/kotlin/gregtechlite/gtlitecore/api/recipe/property/RequestAdditionalProperty.kt index e3d6a7293..089c3533a 100644 --- a/src/main/kotlin/gregtechlite/gtlitecore/api/recipe/property/RequestAdditionalProperty.kt +++ b/src/main/kotlin/gregtechlite/gtlitecore/api/recipe/property/RequestAdditionalProperty.kt @@ -1,25 +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", ResourceLocation::class.java) +object RequestAdditionalProperty: RecipeProperty( + "request_additional", RequestAdditionalPropertyValue::class.java) { - override fun serialize(value: Any): NBTBase = NBTTagString(value.toString()) + 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 = (nbt as? NBTTagString)!!.string + 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 split = value.toString().split(":") - mc.fontRenderer.drawString(I18n.format("gtlitecore.recipe.request_additional_structures", - I18n.format("${split[0]}.machine.${split[1]}.name")), x, y, color) + 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 From 8fa05392e984aed31908bc3247559f73d185616c Mon Sep 17 00:00:00 2001 From: Magic_Sweepy Date: Thu, 18 Jun 2026 12:08:21 +0800 Subject: [PATCH 09/20] multi value support & port pcb to extendable recipe logic --- .../logic/ExtendableMultiblockRecipeLogic.kt | 4 +- .../api/recipe/GTLiteRecipeProperties.kt | 5 -- .../recipe/builder/PCBFactoryRecipeBuilder.kt | 61 ++++++++----------- .../multiblock/MultiblockPCBFactory.kt | 12 ++-- .../producer/PCBFactoryRecipeProducer.kt | 47 ++++++-------- 5 files changed, 55 insertions(+), 74 deletions(-) diff --git a/src/main/kotlin/gregtechlite/gtlitecore/api/capability/logic/ExtendableMultiblockRecipeLogic.kt b/src/main/kotlin/gregtechlite/gtlitecore/api/capability/logic/ExtendableMultiblockRecipeLogic.kt index eb3d9f03d..7cd7901ce 100644 --- a/src/main/kotlin/gregtechlite/gtlitecore/api/capability/logic/ExtendableMultiblockRecipeLogic.kt +++ b/src/main/kotlin/gregtechlite/gtlitecore/api/capability/logic/ExtendableMultiblockRecipeLogic.kt @@ -19,7 +19,7 @@ open class ExtendableMultiblockRecipeLogic>( private fun checkAdditionalRequirement(recipe: Recipe): Boolean { if (!recipe.hasProperty(RequestAdditionalProperty)) return true - val requiredId = recipe.getProperty(RequestAdditionalProperty, null) ?: return false - return manager.get(requiredId).isNotEmpty() + 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/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..5b6535fdb 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_component_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/common/metatileentity/multiblock/MultiblockPCBFactory.kt b/src/main/kotlin/gregtechlite/gtlitecore/common/metatileentity/multiblock/MultiblockPCBFactory.kt index 80dad50a9..333f55084 100644 --- a/src/main/kotlin/gregtechlite/gtlitecore/common/metatileentity/multiblock/MultiblockPCBFactory.kt +++ b/src/main/kotlin/gregtechlite/gtlitecore/common/metatileentity/multiblock/MultiblockPCBFactory.kt @@ -411,12 +411,12 @@ class MultiblockPCBFactory(id: ResourceLocation) : RecipeMapMultiblockController traceSize = clamp(traceSize + 25, minTraceSize, maxTraceSize) } - override fun checkRecipe(recipe: Recipe, consumeIfSuccess: Boolean): Boolean - { - return super.checkRecipe(recipe, consumeIfSuccess) - && recipe.getProperty(GTLiteRecipeProperties.PCB_FACTORY_TIER, 0)!! <= mainUpgradeNumber - && recipe.getProperty(GTLiteRecipeProperties.PCB_FACTORY_BIO_CHAMBER_UPGRADE, 0)!! <= auxiliaryUpgradeNumber - } + // override fun checkRecipe(recipe: Recipe, consumeIfSuccess: Boolean): Boolean + // { + // return super.checkRecipe(recipe, consumeIfSuccess) + // && recipe.getProperty(GTLiteRecipeProperties.PCB_FACTORY_TIER, 0)!! <= mainUpgradeNumber + // && recipe.getProperty(GTLiteRecipeProperties.PCB_FACTORY_BIO_CHAMBER_UPGRADE, 0)!! <= auxiliaryUpgradeNumber + // } private inner class PCBFactoryRecipeLogic(mte: RecipeMapMultiblockController) : MultiblockRecipeLogic(mte) { 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) } } From 5acaac8bb2220dd92584061f7404b82dc893f07b Mon Sep 17 00:00:00 2001 From: Magic_Sweepy Date: Thu, 18 Jun 2026 12:43:21 +0800 Subject: [PATCH 10/20] some missing overriden in AMB and EMB --- .../multiblock/extendable/AdditionalMultiblockBase.kt | 2 ++ .../multiblock/extendable/ExtendableMultiblockBase.kt | 2 ++ .../multiblock/extendable/RecipeMapExtendableMultiblock.kt | 6 ++++++ 3 files changed, 10 insertions(+) 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 index 073fe62fe..1992dc313 100644 --- a/src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/AdditionalMultiblockBase.kt +++ b/src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/AdditionalMultiblockBase.kt @@ -39,4 +39,6 @@ abstract class AdditionalMultiblockBase>(metaTileEnt 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 } \ 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 index 204f5dde5..9c4d944ca 100644 --- a/src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/ExtendableMultiblockBase.kt +++ b/src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/ExtendableMultiblockBase.kt @@ -61,4 +61,6 @@ abstract class ExtendableMultiblockBase>(metaTile } } } + + override fun onDataStickRightClick(p0: EntityPlayer?, p1: ItemStack?): Boolean = false } \ 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 index 9f2f81fb3..fd1fc80bd 100644 --- a/src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/RecipeMapExtendableMultiblock.kt +++ b/src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/RecipeMapExtendableMultiblock.kt @@ -68,4 +68,10 @@ abstract class RecipeMapExtendableMultiblock } } } + + override fun onDataStickRightClick(player: EntityPlayer, stack: ItemStack): Boolean = false + + override fun getProgress(): Int = recipeMapWorkable.progress + + override fun getMaxProgress(): Int = recipeMapWorkable.maxProgress } \ No newline at end of file From 13522973e042353515b8cdeea4a350bb961bc360 Mon Sep 17 00:00:00 2001 From: Magic_Sweepy Date: Thu, 18 Jun 2026 13:00:52 +0800 Subject: [PATCH 11/20] render oriented front overlay for AMB --- .../multiblock/extendable/AdditionalMultiblockBase.kt | 10 ++++++++++ 1 file changed, 10 insertions(+) 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 index 1992dc313..712f7eb68 100644 --- a/src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/AdditionalMultiblockBase.kt +++ b/src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/AdditionalMultiblockBase.kt @@ -1,5 +1,8 @@ package gregtechlite.gtlitecore.api.metatileentity.multiblock.extendable +import codechicken.lib.render.CCRenderState +import codechicken.lib.render.pipeline.IVertexOperation +import codechicken.lib.vec.Matrix4 import gregtech.api.capability.IControllable import gregtech.api.capability.IDataStickIntractable import gregtech.api.metatileentity.multiblock.MultiblockWithDisplayBase @@ -41,4 +44,11 @@ abstract class AdditionalMultiblockBase>(metaTileEnt } 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 From 7d70c9b8b22a2f69bb6ef43f28eacc3441c83a6d Mon Sep 17 00:00:00 2001 From: Magic_Sweepy Date: Thu, 18 Jun 2026 13:11:53 +0800 Subject: [PATCH 12/20] fix unmodifiable operation for abilities of EMB --- .../multiblock/extendable/ExtendableMultiblockBase.kt | 4 +++- .../multiblock/extendable/RecipeMapExtendableMultiblock.kt | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) 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 index 9c4d944ca..07dd1484b 100644 --- a/src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/ExtendableMultiblockBase.kt +++ b/src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/ExtendableMultiblockBase.kt @@ -20,7 +20,9 @@ abstract class ExtendableMultiblockBase>(metaTile override fun getAbilities(ability: MultiblockAbility): List { - return super.getAbilities(ability).also { it.addAll(additionalStructureManager.getAbilities(ability)) } + val abilities = super.getAbilities(ability).toMutableList() + abilities.addAll(additionalStructureManager.getAbilities(ability)) + return abilities } override fun writeToNBT(data: NBTTagCompound?): NBTTagCompound? 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 index fd1fc80bd..d3ee1efb5 100644 --- a/src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/RecipeMapExtendableMultiblock.kt +++ b/src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/RecipeMapExtendableMultiblock.kt @@ -27,7 +27,9 @@ abstract class RecipeMapExtendableMultiblock override fun getAbilities(ability: MultiblockAbility): List { - return super.getAbilities(ability).also { it.addAll(additionalStructureManager.getAbilities(ability)) } + val abilities = super.getAbilities(ability).toMutableList() + abilities.addAll(additionalStructureManager.getAbilities(ability)) + return abilities } override fun writeToNBT(data: NBTTagCompound?): NBTTagCompound? From ba4a34ada4d160792f927f52b029606b36a5a8f6 Mon Sep 17 00:00:00 2001 From: Magic_Sweepy Date: Thu, 18 Jun 2026 14:00:02 +0800 Subject: [PATCH 13/20] reimpl working status and persist it --- .../extendable/AdditionalMultiblockBase.kt | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) 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 index 712f7eb68..760fa8d07 100644 --- a/src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/AdditionalMultiblockBase.kt +++ b/src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/AdditionalMultiblockBase.kt @@ -3,23 +3,39 @@ package gregtechlite.gtlitecore.api.metatileentity.multiblock.extendable import codechicken.lib.render.CCRenderState import codechicken.lib.render.pipeline.IVertexOperation import codechicken.lib.vec.Matrix4 +import gregtech.api.capability.GregtechDataCodes.WORKING_ENABLED import gregtech.api.capability.IControllable import gregtech.api.capability.IDataStickIntractable import gregtech.api.metatileentity.multiblock.MultiblockWithDisplayBase 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 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) @@ -29,6 +45,41 @@ abstract class AdditionalMultiblockBase>(metaTileEnt 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 onDataStickLeftClick(player: EntityPlayer, stack: ItemStack) { val tag = stack.tagCompound ?: NBTTagCompound() From 96436be3b9e14f00ff5ae9c451b0f566c7c60668 Mon Sep 17 00:00:00 2001 From: Magic_Sweepy Date: Thu, 18 Jun 2026 15:20:31 +0800 Subject: [PATCH 14/20] first-step rework PCB factory & shortcut recipe display text --- .../recipe/builder/PCBFactoryRecipeBuilder.kt | 2 +- .../client/renderer/texture/GTLiteOverlays.kt | 4 + .../metatileentity/GTLiteMetaTileEntities.kt | 65 ++- .../multiblock/MultiblockPCBFactory.kt | 430 ++++++------------ .../module/MultiblockBioCultivationChamber.kt | 59 +++ .../MultiblockMicroscaleCircuitDetector.kt | 62 +++ .../module/MultiblockNanolithographyArray.kt | 63 +++ .../MultiblockThermosinkCoolingTower.kt | 75 +++ .../module/MultiblockWaterCoolingTower.kt | 70 +++ .../assets/gtlitecore/lang/en_us.lang | 24 +- .../assets/gtlitecore/lang/zh_cn.lang | 24 +- 11 files changed, 549 insertions(+), 329 deletions(-) create mode 100644 src/main/kotlin/gregtechlite/gtlitecore/common/metatileentity/multiblock/module/MultiblockBioCultivationChamber.kt create mode 100644 src/main/kotlin/gregtechlite/gtlitecore/common/metatileentity/multiblock/module/MultiblockMicroscaleCircuitDetector.kt create mode 100644 src/main/kotlin/gregtechlite/gtlitecore/common/metatileentity/multiblock/module/MultiblockNanolithographyArray.kt create mode 100644 src/main/kotlin/gregtechlite/gtlitecore/common/metatileentity/multiblock/module/MultiblockThermosinkCoolingTower.kt create mode 100644 src/main/kotlin/gregtechlite/gtlitecore/common/metatileentity/multiblock/module/MultiblockWaterCoolingTower.kt 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 5b6535fdb..bb52686e1 100644 --- a/src/main/kotlin/gregtechlite/gtlitecore/api/recipe/builder/PCBFactoryRecipeBuilder.kt +++ b/src/main/kotlin/gregtechlite/gtlitecore/api/recipe/builder/PCBFactoryRecipeBuilder.kt @@ -18,7 +18,7 @@ class PCBFactoryRecipeBuilder : RecipeBuilder { val nanoArray = GTLiteMod.id("nanolithography_array") // T2 val circDetector = GTLiteMod.id("microscale_circuit_detector") // T3 - val bioChamber = GTLiteMod.id("bio_component_cultivation_chamber") // Bio Chamber Upgrade + val bioChamber = GTLiteMod.id("bio_cultivation_chamber") // Bio Chamber Upgrade // TODO: Gooware: Nonlinear Thermodynamic Cycle Unit, Optical: Optoelectronic Carving Room, // Spintronic: Electromagnetic Effect Generator 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 333f55084..291927834 100644 --- a/src/main/kotlin/gregtechlite/gtlitecore/common/metatileentity/multiblock/MultiblockPCBFactory.kt +++ b/src/main/kotlin/gregtechlite/gtlitecore/common/metatileentity/multiblock/MultiblockPCBFactory.kt @@ -19,8 +19,8 @@ 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.OverclockingLogic.PERFECT_DURATION_FACTOR +import gregtech.api.recipes.logic.OverclockingLogic.STD_DURATION_FACTOR import gregtech.api.unification.OreDictUnifier import gregtech.api.unification.material.Materials.Gold import gregtech.api.unification.material.Materials.Osmiridium @@ -31,10 +31,10 @@ 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.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 @@ -47,6 +47,7 @@ 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.MultiblockNanolithographyArray import net.minecraft.client.resources.I18n import net.minecraft.init.Blocks import net.minecraft.item.ItemStack @@ -61,28 +62,14 @@ import net.minecraftforge.fml.relauncher.SideOnly import kotlin.math.floor /** - * 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: */ -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 +81,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 +103,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 +149,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) { @@ -418,84 +251,97 @@ class MultiblockPCBFactory(id: ResourceLocation) : RecipeMapMultiblockController // && recipe.getProperty(GTLiteRecipeProperties.PCB_FACTORY_BIO_CHAMBER_UPGRADE, 0)!! <= auxiliaryUpgradeNumber // } - private inner class PCBFactoryRecipeLogic(mte: RecipeMapMultiblockController) : MultiblockRecipeLogic(mte) + private inner class PCBFactoryRecipeLogic(mte: RecipeMapExtendableMultiblock) : ExtendableMultiblockRecipeLogic(mte, additionalStructureManager) { - 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 - } - - override fun getParallelLimit() = calculateParallelByNanites() - - override fun setMaxProgress(maxProgress: Int) - { - maxProgressTime = when (traceSize) + if (additionalStructureManager.get(GTLiteMod.id("water_cooling_tower")).isNotEmpty()) // 4/2 { - 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 + 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 updateRecipeProgress() + override fun getOverclockingVoltageFactor(): Double { - 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() - } + 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 } - private fun calculateParallelByNanites(): Int - { - val itemInputInventory = getAbilities(IMPORT_ITEMS) - val itemInputs = ItemHandlerList(itemInputInventory) - var parallelBase = 0 - for (i in 0 until itemInputs.slots) - { - 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 - } - } - return parallelBase - } + + + // override fun getParallelLimit() = calculateParallelByNanites() +// + // 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() + // } + // } +// + // private fun calculateParallelByNanites(): Int + // { + // val itemInputInventory = getAbilities(IMPORT_ITEMS) + // val itemInputs = ItemHandlerList(itemInputInventory) + // var parallelBase = 0 + // for (i in 0 until itemInputs.slots) + // { + // 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 + // } + // } + // return parallelBase + // } } 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..b2a96a28a --- /dev/null +++ b/src/main/kotlin/gregtechlite/gtlitecore/common/metatileentity/multiblock/module/MultiblockMicroscaleCircuitDetector.kt @@ -0,0 +1,62 @@ +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.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)) + .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"))) + } +} \ 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..73e62691d --- /dev/null +++ b/src/main/kotlin/gregtechlite/gtlitecore/common/metatileentity/multiblock/module/MultiblockNanolithographyArray.kt @@ -0,0 +1,63 @@ +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.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)) + .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"))) + } +} 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..1d5b62b52 --- /dev/null +++ b/src/main/kotlin/gregtechlite/gtlitecore/common/metatileentity/multiblock/module/MultiblockWaterCoolingTower.kt @@ -0,0 +1,70 @@ +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.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)) + .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")) + } +} \ No newline at end of file diff --git a/src/main/resources/assets/gtlitecore/lang/en_us.lang b/src/main/resources/assets/gtlitecore/lang/en_us.lang index 741ff8f22..b29e6bb1b 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,7 +1754,7 @@ 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 Additional Structure: %s +gtlitecore.recipe.request_additional_structures=Required: %s # Machine API contexts gtlitecore.machine.additional_structure.data_stick.name=§oAdditional Structure Configuration Data @@ -2439,6 +2433,22 @@ 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.microscale_circuit_detector.name=Microscale Circuit Component Detector + +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.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 21e81859e..e69e735e1 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,7 +1754,7 @@ 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 +gtlitecore.recipe.request_additional_structures=需要:%s # Machine API contexts gtlitecore.machine.additional_structure.data_stick.name=§o附属结构配置数据 @@ -2439,6 +2433,22 @@ 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.microscale_circuit_detector.name=微尺度电路元件检测器 + +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.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来塑造纳米锻炉,第一批纳米蜂群将引导金属与电路的融合过程。 From 38b56e700907e18b08f511fda81b03ae25d2e9ed Mon Sep 17 00:00:00 2001 From: Magic_Sweepy Date: Thu, 18 Jun 2026 16:00:47 +0800 Subject: [PATCH 15/20] parallel and overclocking mechanism for pcb factory --- .../multiblock/MultiblockPCBFactory.kt | 78 +++++++++++-------- .../MultiblockMicroscaleCircuitDetector.kt | 8 +- .../module/MultiblockNanolithographyArray.kt | 8 +- .../assets/gtlitecore/lang/en_us.lang | 4 + .../assets/gtlitecore/lang/zh_cn.lang | 4 + 5 files changed, 66 insertions(+), 36 deletions(-) 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 291927834..8578aa129 100644 --- a/src/main/kotlin/gregtechlite/gtlitecore/common/metatileentity/multiblock/MultiblockPCBFactory.kt +++ b/src/main/kotlin/gregtechlite/gtlitecore/common/metatileentity/multiblock/MultiblockPCBFactory.kt @@ -1,5 +1,6 @@ package gregtechlite.gtlitecore.common.metatileentity.multiblock +import com.morphismmc.morphismlib.util.ItemUtil import gregtech.api.GTValues.ULV import gregtech.api.capability.impl.EnergyContainerList import gregtech.api.capability.impl.ItemHandlerList @@ -8,6 +9,7 @@ import gregtech.api.gui.Widget import gregtech.api.metatileentity.MetaTileEntity import gregtech.api.metatileentity.interfaces.IGregTechTileEntity import gregtech.api.metatileentity.multiblock.IMultiblockPart +import gregtech.api.metatileentity.multiblock.MultiblockAbility import gregtech.api.metatileentity.multiblock.MultiblockAbility.EXPORT_ITEMS import gregtech.api.metatileentity.multiblock.MultiblockAbility.IMPORT_FLUIDS import gregtech.api.metatileentity.multiblock.MultiblockAbility.IMPORT_ITEMS @@ -33,6 +35,7 @@ import gregtech.common.blocks.MetaBlocks import gregtech.common.metatileentities.MetaTileEntities import gregtechlite.gtlitecore.GTLiteMod import gregtechlite.gtlitecore.api.capability.logic.ExtendableMultiblockRecipeLogic +import gregtechlite.gtlitecore.api.metatileentity.multiblock.extendable.AdditionalMultiblockBase import gregtechlite.gtlitecore.api.metatileentity.multiblock.extendable.RecipeMapExtendableMultiblock import gregtechlite.gtlitecore.api.recipe.GTLiteRecipeMaps.PCB_FACTORY_RECIPES import gregtechlite.gtlitecore.api.unification.GTLiteMaterials.HSLASteel @@ -48,6 +51,10 @@ 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.MultiblockNanolithographyArray +import gregtechlite.gtlitecore.common.metatileentity.multiblock.module.MultiblockMicroscaleCircuitDetector +import gregtechlite.gtlitecore.common.metatileentity.multiblock.module.MultiblockWaterCoolingTower +import gregtechlite.gtlitecore.common.metatileentity.multiblock.module.MultiblockThermosinkCoolingTower +import gregtechlite.gtlitecore.common.metatileentity.multiblock.module.MultiblockBioCultivationChamber import net.minecraft.client.resources.I18n import net.minecraft.init.Blocks import net.minecraft.item.ItemStack @@ -59,12 +66,15 @@ 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.min /** * Additional Structures: * - T2: [MultiblockNanolithographyArray] - * - T3: + * - T3: [MultiblockMicroscaleCircuitDetector] + * - Cooling Upgrade: [MultiblockWaterCoolingTower] + * - Advanced Cooling Upgrade: [MultiblockThermosinkCoolingTower] + * - Bio Chamber Upgrade: [MultiblockBioCultivationChamber] */ class MultiblockPCBFactory>(id: ResourceLocation) : RecipeMapExtendableMultiblock(id, PCB_FACTORY_RECIPES) @@ -244,13 +254,6 @@ class MultiblockPCBFactory>(id: ResourceLocation) traceSize = clamp(traceSize + 25, minTraceSize, maxTraceSize) } - // override fun checkRecipe(recipe: Recipe, consumeIfSuccess: Boolean): Boolean - // { - // return super.checkRecipe(recipe, consumeIfSuccess) - // && recipe.getProperty(GTLiteRecipeProperties.PCB_FACTORY_TIER, 0)!! <= mainUpgradeNumber - // && recipe.getProperty(GTLiteRecipeProperties.PCB_FACTORY_BIO_CHAMBER_UPGRADE, 0)!! <= auxiliaryUpgradeNumber - // } - private inner class PCBFactoryRecipeLogic(mte: RecipeMapExtendableMultiblock) : ExtendableMultiblockRecipeLogic(mte, additionalStructureManager) { @@ -273,10 +276,40 @@ class MultiblockPCBFactory>(id: ResourceLocation) return 1.0 // 1/1 } + override fun getParallelLimit(): Int + { + 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()) + { + 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 getParallelLimit() = calculateParallelByNanites() -// // override fun setMaxProgress(maxProgress: Int) // { // maxProgressTime = when (traceSize) @@ -320,29 +353,6 @@ class MultiblockPCBFactory>(id: ResourceLocation) // decreaseProgress() // } // } -// - // private fun calculateParallelByNanites(): Int - // { - // val itemInputInventory = getAbilities(IMPORT_ITEMS) - // val itemInputs = ItemHandlerList(itemInputInventory) - // var parallelBase = 0 - // for (i in 0 until itemInputs.slots) - // { - // 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 - // } - // } - // return parallelBase - // } - } } \ 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 index b2a96a28a..2075838d7 100644 --- a/src/main/kotlin/gregtechlite/gtlitecore/common/metatileentity/multiblock/module/MultiblockMicroscaleCircuitDetector.kt +++ b/src/main/kotlin/gregtechlite/gtlitecore/common/metatileentity/multiblock/module/MultiblockMicroscaleCircuitDetector.kt @@ -3,6 +3,7 @@ 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 @@ -43,7 +44,10 @@ class MultiblockMicroscaleCircuitDetector>(id: Resou .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)) + .where('K', states(casingState) + .setMinGlobalLimited(282) + .or(abilities(IMPORT_ITEMS) + .setPreviewCount(1))) .where('L', states(secondCasingState)) .where('#', air()) .where(' ', any()) @@ -58,5 +62,7 @@ class MultiblockMicroscaleCircuitDetector>(id: Resou 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 index 73e62691d..fc0457493 100644 --- a/src/main/kotlin/gregtechlite/gtlitecore/common/metatileentity/multiblock/module/MultiblockNanolithographyArray.kt +++ b/src/main/kotlin/gregtechlite/gtlitecore/common/metatileentity/multiblock/module/MultiblockNanolithographyArray.kt @@ -3,6 +3,7 @@ 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 @@ -44,7 +45,10 @@ class MultiblockNanolithographyArray>(id: ResourceLo .aisle("EEEE", "E##E", "E##E", "FEEF", "FEEF", " ", " ") .aisle("FEEF", "FSEF", "FEEF", " ", " ", " ", " ") .where('S', selfPredicate()) - .where('E', states(casingState)) + .where('E', states(casingState) + .setMinGlobalLimited(140) + .or(abilities(IMPORT_ITEMS) + .setPreviewCount(1))) .where('F', frames(Osmiridium)) .where('#', air()) .where(' ', any()) @@ -59,5 +63,7 @@ class MultiblockNanolithographyArray>(id: ResourceLo 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/resources/assets/gtlitecore/lang/en_us.lang b/src/main/resources/assets/gtlitecore/lang/en_us.lang index b29e6bb1b..60c92b151 100644 --- a/src/main/resources/assets/gtlitecore/lang/en_us.lang +++ b/src/main/resources/assets/gtlitecore/lang/en_us.lang @@ -2436,8 +2436,12 @@ gtlitecore.machine.pcb_factory.trace_size.increment=§a缩短25μm线宽 /n§7 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 diff --git a/src/main/resources/assets/gtlitecore/lang/zh_cn.lang b/src/main/resources/assets/gtlitecore/lang/zh_cn.lang index e69e735e1..533ab2111 100644 --- a/src/main/resources/assets/gtlitecore/lang/zh_cn.lang +++ b/src/main/resources/assets/gtlitecore/lang/zh_cn.lang @@ -2436,8 +2436,12 @@ gtlitecore.machine.pcb_factory.trace_size.increment=§a缩短25μm线宽 /n§7 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=生物元件培养室 From 56eadd9dd002ac9543830dd4ab8a252ad26e6832 Mon Sep 17 00:00:00 2001 From: gebardensprache Date: Thu, 18 Jun 2026 17:25:30 +0900 Subject: [PATCH 16/20] fix: nbt data persistence --- .../extendable/ExtendableMultiblockBase.kt | 18 ++++++++++++++++++ .../RecipeMapExtendableMultiblock.kt | 18 ++++++++++++++++++ 2 files changed, 36 insertions(+) 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 index 07dd1484b..2bf2cac20 100644 --- a/src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/ExtendableMultiblockBase.kt +++ b/src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/ExtendableMultiblockBase.kt @@ -9,6 +9,7 @@ import gregtech.api.util.GTUtility 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 @@ -65,4 +66,21 @@ abstract class ExtendableMultiblockBase>(metaTile } 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 index d3ee1efb5..6490a84d1 100644 --- a/src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/RecipeMapExtendableMultiblock.kt +++ b/src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/RecipeMapExtendableMultiblock.kt @@ -11,6 +11,7 @@ import gregtechlite.gtlitecore.api.capability.logic.ExtendableMultiblockRecipeLo 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 @@ -76,4 +77,21 @@ abstract class RecipeMapExtendableMultiblock 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 From 01df0156a45e8a5e9198b15fe1d51167d16a5494 Mon Sep 17 00:00:00 2001 From: Magic_Sweepy Date: Thu, 18 Jun 2026 17:30:18 +0800 Subject: [PATCH 17/20] recipes for new pcb machines --- .../GTLiteOrganicChemistryMaterials.kt | 2 +- .../material/GTLiteSecondDegreeMaterials.kt | 8 +- .../material/info/GTLiteMaterialFlags.kt | 11 ++ .../recipe/machine/MachineRecipeLoader.kt | 150 +++++++++++++++++- 4 files changed, 165 insertions(+), 6 deletions(-) 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/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) From 0fa0f0bb890734d548dbdb58b5a4af709d2dc524 Mon Sep 17 00:00:00 2001 From: Magic_Sweepy Date: Thu, 18 Jun 2026 18:32:25 +0800 Subject: [PATCH 18/20] clean up deprecated pcb factory tooltips --- .../assets/gtlitecore/lang/en_us.lang | 22 ++++++------------- .../assets/gtlitecore/lang/zh_cn.lang | 20 +++++------------ 2 files changed, 13 insertions(+), 29 deletions(-) diff --git a/src/main/resources/assets/gtlitecore/lang/en_us.lang b/src/main/resources/assets/gtlitecore/lang/en_us.lang index 60c92b151..d3a1eb754 100644 --- a/src/main/resources/assets/gtlitecore/lang/en_us.lang +++ b/src/main/resources/assets/gtlitecore/lang/en_us.lang @@ -2409,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=冷却已启用 diff --git a/src/main/resources/assets/gtlitecore/lang/zh_cn.lang b/src/main/resources/assets/gtlitecore/lang/zh_cn.lang index 533ab2111..4fc0d5bd1 100644 --- a/src/main/resources/assets/gtlitecore/lang/zh_cn.lang +++ b/src/main/resources/assets/gtlitecore/lang/zh_cn.lang @@ -2410,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=冷却已启用 From 85231467b5878182bfec9f898155f711cfbbdcb0 Mon Sep 17 00:00:00 2001 From: Magic_Sweepy Date: Fri, 19 Jun 2026 18:14:51 +0800 Subject: [PATCH 19/20] allow water cooling tower has some speed bonus for pcb factory --- .../multiblock/MultiblockPCBFactory.kt | 83 ++++++++++++------- .../module/MultiblockWaterCoolingTower.kt | 8 +- .../assets/gtlitecore/lang/en_us.lang | 1 + .../assets/gtlitecore/lang/zh_cn.lang | 1 + 4 files changed, 61 insertions(+), 32 deletions(-) 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 8578aa129..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,15 +1,12 @@ package gregtechlite.gtlitecore.common.metatileentity.multiblock import com.morphismmc.morphismlib.util.ItemUtil -import gregtech.api.GTValues.ULV 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 import gregtech.api.metatileentity.multiblock.IMultiblockPart -import gregtech.api.metatileentity.multiblock.MultiblockAbility import gregtech.api.metatileentity.multiblock.MultiblockAbility.EXPORT_ITEMS import gregtech.api.metatileentity.multiblock.MultiblockAbility.IMPORT_FLUIDS import gregtech.api.metatileentity.multiblock.MultiblockAbility.IMPORT_ITEMS @@ -17,55 +14,43 @@ 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.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.GTLiteMod +import gregtechlite.gtlitecore.api.SECOND import gregtechlite.gtlitecore.api.capability.logic.ExtendableMultiblockRecipeLogic -import gregtechlite.gtlitecore.api.metatileentity.multiblock.extendable.AdditionalMultiblockBase import gregtechlite.gtlitecore.api.metatileentity.multiblock.extendable.RecipeMapExtendableMultiblock import gregtechlite.gtlitecore.api.recipe.GTLiteRecipeMaps.PCB_FACTORY_RECIPES 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.MultiblockNanolithographyArray +import gregtechlite.gtlitecore.common.metatileentity.multiblock.module.MultiblockBioCultivationChamber import gregtechlite.gtlitecore.common.metatileentity.multiblock.module.MultiblockMicroscaleCircuitDetector -import gregtechlite.gtlitecore.common.metatileentity.multiblock.module.MultiblockWaterCoolingTower +import gregtechlite.gtlitecore.common.metatileentity.multiblock.module.MultiblockNanolithographyArray import gregtechlite.gtlitecore.common.metatileentity.multiblock.module.MultiblockThermosinkCoolingTower -import gregtechlite.gtlitecore.common.metatileentity.multiblock.module.MultiblockBioCultivationChamber +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.max import kotlin.math.min /** @@ -196,14 +181,7 @@ class MultiblockPCBFactory>(id: ResourceLocation) 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 @@ -256,6 +234,7 @@ class MultiblockPCBFactory>(id: ResourceLocation) private inner class PCBFactoryRecipeLogic(mte: RecipeMapExtendableMultiblock) : ExtendableMultiblockRecipeLogic(mte, additionalStructureManager) { + private var hasWaterCooling: Boolean = false override fun getOverclockingDurationFactor(): Double { @@ -310,6 +289,48 @@ class MultiblockPCBFactory>(id: ResourceLocation) return min(count + countAdvanced, Int.MAX_VALUE - 1) // I think it's safe... may some edge case will break this? } + override fun updateRecipeProgress() + { + 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)) + { + 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 > ((SECOND - 1) * recipeEUt)) + hasNotEnoughEnergy = false + } + else if (recipeEUt > 0) + { + hasNotEnoughEnergy = true + decreaseProgress() + } + } + + override fun modifyOverclockPost(ocResult: OCResult, storage: RecipePropertyStorage) + { + super.modifyOverclockPost(ocResult, storage) + // +400% | D' = D / (1 + 4.0) = D / 5.0 + if (hasWaterCooling) + { + ocResult.setDuration(max(1, (ocResult.duration() * 1.0 / 5.0).toInt())) + } + } + // override fun setMaxProgress(maxProgress: Int) // { // maxProgressTime = when (traceSize) 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 index 1d5b62b52..6e6136eea 100644 --- a/src/main/kotlin/gregtechlite/gtlitecore/common/metatileentity/multiblock/module/MultiblockWaterCoolingTower.kt +++ b/src/main/kotlin/gregtechlite/gtlitecore/common/metatileentity/multiblock/module/MultiblockWaterCoolingTower.kt @@ -3,6 +3,7 @@ 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 @@ -45,7 +46,11 @@ class MultiblockWaterCoolingTower>(id: ResourceLocat .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)) + .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)) @@ -66,5 +71,6 @@ class MultiblockWaterCoolingTower>(id: ResourceLocat 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/resources/assets/gtlitecore/lang/en_us.lang b/src/main/resources/assets/gtlitecore/lang/en_us.lang index d3a1eb754..372882e5d 100644 --- a/src/main/resources/assets/gtlitecore/lang/en_us.lang +++ b/src/main/resources/assets/gtlitecore/lang/en_us.lang @@ -2440,6 +2440,7 @@ gtlitecore.machine.bio_cultivation_chamber.name=Bio Component Cultivation Chambe 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. diff --git a/src/main/resources/assets/gtlitecore/lang/zh_cn.lang b/src/main/resources/assets/gtlitecore/lang/zh_cn.lang index 4fc0d5bd1..569f730c8 100644 --- a/src/main/resources/assets/gtlitecore/lang/zh_cn.lang +++ b/src/main/resources/assets/gtlitecore/lang/zh_cn.lang @@ -2440,6 +2440,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工厂 From e4b7f31939e71aa3767f0cd93c75898af66cf691 Mon Sep 17 00:00:00 2001 From: gebardensprache Date: Fri, 19 Jun 2026 20:55:13 +0900 Subject: [PATCH 20/20] feat(gui): additional list, highlight (TODO), additional controller maintenance problem share. --- .../extendable/AdditionalMultiblockBase.kt | 77 ++++++++++++++++++- .../extendable/AdditionalStructureManager.kt | 6 ++ .../extendable/ExtendableMultiblock.kt | 5 ++ .../extendable/ExtendableMultiblockBase.kt | 23 ++++++ .../RecipeMapExtendableMultiblock.kt | 23 ++++++ 5 files changed, 131 insertions(+), 3 deletions(-) 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 index 760fa8d07..a374a4a5d 100644 --- a/src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/AdditionalMultiblockBase.kt +++ b/src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/AdditionalMultiblockBase.kt @@ -3,16 +3,26 @@ 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 @@ -38,7 +48,7 @@ abstract class AdditionalMultiblockBase>(metaTileEnt protected fun isConnected() = mainController != null && mainController!!.isWorkingEnabled() - fun connect(controller: ExtendableMultiblock) + fun connect(controller: ExtendableMultiblock?) { mainController?.removeAdditional(pos) mainController = controller @@ -80,6 +90,65 @@ abstract class AdditionalMultiblockBase>(metaTileEnt } } + 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() @@ -96,8 +165,10 @@ abstract class AdditionalMultiblockBase>(metaTileEnt override fun onDataStickRightClick(player: EntityPlayer, stack: ItemStack): Boolean = false - override fun renderMetaTileEntity(renderState: CCRenderState, translation: Matrix4, - pipeline: Array) + override fun renderMetaTileEntity( + renderState: CCRenderState, translation: Matrix4, + pipeline: Array, + ) { super.renderMetaTileEntity(renderState, translation, pipeline) frontOverlay.renderOrientedState(renderState, translation, pipeline, frontFacing, isActive, isWorkingEnabled) 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 index 92805ced2..4900957a3 100644 --- a/src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/AdditionalStructureManager.kt +++ b/src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/AdditionalStructureManager.kt @@ -1,5 +1,7 @@ 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 @@ -23,6 +25,10 @@ open class AdditionalStructureManager>(protected val 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) } } 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 index 33a267be9..b1d51f026 100644 --- a/src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/ExtendableMultiblock.kt +++ b/src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/ExtendableMultiblock.kt @@ -6,6 +6,11 @@ import net.minecraft.util.math.BlockPos interface ExtendableMultiblock>: IMultiblockController { var additionalStructureManager: AdditionalStructureManager + val maintenanceProblem: Byte + + fun getPos(): BlockPos + + fun highlightController() fun isWorkingEnabled(): Boolean 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 index 2bf2cac20..21a27a57f 100644 --- a/src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/ExtendableMultiblockBase.kt +++ b/src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/ExtendableMultiblockBase.kt @@ -1,11 +1,15 @@ 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 @@ -18,6 +22,7 @@ abstract class ExtendableMultiblockBase>(metaTile : MultiblockWithDisplayBase(metaTileEntityId), IWorkable, IControllable, IDataStickIntractable, ExtendableMultiblock { override var additionalStructureManager: AdditionalStructureManager = AdditionalStructureManager(this) + override val maintenanceProblem: Byte = maintenanceProblems override fun getAbilities(ability: MultiblockAbility): List { @@ -26,6 +31,24 @@ abstract class ExtendableMultiblockBase>(metaTile 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()) 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 index 6490a84d1..93ff275d6 100644 --- a/src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/RecipeMapExtendableMultiblock.kt +++ b/src/main/kotlin/gregtechlite/gtlitecore/api/metatileentity/multiblock/extendable/RecipeMapExtendableMultiblock.kt @@ -1,13 +1,17 @@ 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 @@ -20,6 +24,7 @@ abstract class RecipeMapExtendableMultiblock : RecipeMapMultiblockController(metaTileEntityId, recipeMap), IWorkable, IControllable, IDataStickIntractable, ExtendableMultiblock { override var additionalStructureManager: AdditionalStructureManager = AdditionalStructureManager(this) + override val maintenanceProblem: Byte = maintenanceProblems init { @@ -33,6 +38,24 @@ abstract class RecipeMapExtendableMultiblock 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())