From eea1cbe45ba1912b6ee6b34a72cf46ee76dcbc0d Mon Sep 17 00:00:00 2001 From: takanashisatou Date: Sat, 5 Sep 2026 06:55:31 +0800 Subject: [PATCH 1/2] fix: migrate core machines to validated multiblock lifecycle --- .../KineticElectricMultiblockMachine.java | 77 +++++++++++++------ .../multiblock/SlaughterHouseMachine.java | 19 ++++- .../multiblock/electric/BioMachine.java | 2 +- .../electric/NeutronActivatorMachine.java | 75 +++++++++++++++--- .../Superconducting_Penning_Trap.java | 9 ++- .../electric/WideParticleAccelerator.java | 14 +++- .../LargeNaquadahReactorMachine.java | 1 + .../PhotovoltaicPowerStationMachine.java | 14 +++- .../generator/WindPowerArrayMachine.java | 14 +++- .../kinetic/KineticCentrifugeMachine.java | 4 +- .../kinetic/KineticMixerMachine.java | 4 +- .../part/CircuitBusPartMachine.java | 11 ++- 12 files changed, 195 insertions(+), 49 deletions(-) diff --git a/src/main/java/io/github/cpearl0/ctnhcore/common/machine/multiblock/KineticElectricMultiblockMachine.java b/src/main/java/io/github/cpearl0/ctnhcore/common/machine/multiblock/KineticElectricMultiblockMachine.java index ef0d773b..2113a421 100644 --- a/src/main/java/io/github/cpearl0/ctnhcore/common/machine/multiblock/KineticElectricMultiblockMachine.java +++ b/src/main/java/io/github/cpearl0/ctnhcore/common/machine/multiblock/KineticElectricMultiblockMachine.java @@ -33,6 +33,7 @@ import com.mo_guang.ctpp.common.blockentity.IKineticBlockEntityExtension; import com.mo_guang.ctpp.common.blockentity.KineticMachineBlockEntity; import com.mo_guang.ctpp.common.machine.IKineticMachine; +import com.mo_guang.ctpp.common.machine.multiblock.IMultiblockKineticOwner; import com.mo_guang.ctpp.common.machine.multiblock.part.KineticPartMachine; import com.simibubi.create.content.kinetics.base.KineticBlockEntity; import it.unimi.dsi.fastutil.longs.LongSet; @@ -44,7 +45,8 @@ import java.util.Objects; public class KineticElectricMultiblockMachine extends RecipeMultiblockMachine implements IFancyUIMachine, - IDisplayUIMachine, ITieredMachine, IOverclockMachine { + IDisplayUIMachine, ITieredMachine, IOverclockMachine, + IMultiblockKineticOwner { public KineticElectricMultiblockMachine(IMachineBlockEntity holder) { super(holder, new Object[0]); @@ -67,17 +69,13 @@ public KineticElectricMultiblockMachine(IMachineBlockEntity holder) { @Override public void onStructureInvalid() { super.onStructureInvalid(); - if (this.rotateBlocks != null && getLevel() != null) { - for (Long pos : this.rotateBlocks) { - BlockEntity blockEntity = getLevel().getBlockEntity(BlockPos.of(pos)); - if (blockEntity instanceof KineticBlockEntity kineticBlockEntity && - kineticBlockEntity instanceof IKineticBlockEntityExtension extension) { - extension.setCTNHVisualSpeed(0); - extension.setCTNHInMultiblock(false); - } - } - } + releaseRotateBlocks(this.rotateBlocks, null); + this.rotateBlocks = null; this.energyContainer = null; + this.maxTorque = 0.0F; + this.speed = 0.0F; + this.Ktier = 0; + this.inputPartsMax.clear(); this.tier = 0; } @@ -86,15 +84,10 @@ public void onStructureFormed() { super.onStructureFormed(); this.energyContainer = getEnergyContainer(); getKineticContainer(); - this.rotateBlocks = (LongSet) this.getMultiblockState().getMatchContext().getOrDefault("roBlocks", + LongSet newRotateBlocks = (LongSet) this.getMultiblockState().getMatchContext().getOrDefault("roBlocks", LongSets.emptySet()); - for (Long pos : this.rotateBlocks) { - BlockEntity blockEntity = getLevel().getBlockEntity(BlockPos.of(pos)); - if (blockEntity instanceof KineticBlockEntity kineticBlockEntity && - kineticBlockEntity instanceof IKineticBlockEntityExtension extension) { - extension.setCTNHInMultiblock(true); - } - } + releaseRotateBlocks(this.rotateBlocks, newRotateBlocks); + this.rotateBlocks = newRotateBlocks; this.updateActiveBlocks(this.recipeLogic.isWorking()); this.tier = getTier(); @@ -114,12 +107,22 @@ public void onPartUnload() { this.tier = 0; } + @Override + protected void onStructureRevalidationChanged(boolean pending) { + super.onStructureRevalidationChanged(pending); + if (pending) { + // Retain exact ownership across chunk unloads, while withdrawing this controller's visual request. + updateRotateBlocks(false); + } + } + ////////////////////////////////////// // ********** ACTIVE ***********// ////////////////////////////////////// public void updateActiveBlocks(boolean active) { - super.updateActiveBlocks(active); - this.updateRotateBlocks(active); + boolean operationalActive = active && isStructureOperational(); + super.updateActiveBlocks(operationalActive); + this.updateRotateBlocks(operationalActive); } public void updateRotateBlocks(boolean active) { @@ -129,6 +132,7 @@ public void updateRotateBlocks(boolean active) { while (a.hasNext()) { Long pos = a.next(); BlockPos blockPos = BlockPos.of(pos); + if (!Objects.requireNonNull(this.getLevel()).isLoaded(blockPos)) continue; BlockEntity blockEntity = ((Level) Objects.requireNonNull(this.getLevel())).getBlockEntity(blockPos); this.updateRotateBlock(active, blockEntity); } @@ -139,10 +143,21 @@ public void updateRotateBlock(boolean active, BlockEntity blockEntity) { if (blockEntity instanceof KineticBlockEntity kineticBlockEntity && kineticBlockEntity instanceof IKineticBlockEntityExtension extension && !(kineticBlockEntity instanceof KineticMachineBlockEntity)) { - extension.setCTNHVisualSpeed(active ? this.speed - 1 : 0); + extension.ctpp$claimMultiblockOwner(getPos(), getStructureInstanceId(), + active ? this.speed - 1 : 0.0F); } } + @Override + public boolean ownsKineticVisual(BlockPos pos) { + return rotateBlocks != null && rotateBlocks.contains(pos.asLong()); + } + + @Override + public float getKineticVisualSpeed(BlockPos pos) { + return ownsKineticVisual(pos) && isStructureOperational() && recipeLogic.isWorking() ? speed - 1 : 0.0F; + } + ////////////////////////////////////// // ********** GUI ***********// ////////////////////////////////////// @@ -206,6 +221,10 @@ public void attachTooltips(TooltipsPanel tooltipsPanel) { // ****** RECIPE LOGIC *******// ////////////////////////////////////// public void getKineticContainer() { + this.maxTorque = 0.0F; + this.speed = 0.0F; + this.Ktier = 0; + this.inputPartsMax.clear(); // 只限输入不能输出 for (IMultiPart part : this.getParts()) { if (part instanceof KineticPartMachine kineticPart) { @@ -225,6 +244,20 @@ public void getKineticContainer() { } } + private void releaseRotateBlocks(LongSet oldRotateBlocks, LongSet retainedRotateBlocks) { + if (oldRotateBlocks == null || getLevel() == null) return; + for (long pos : oldRotateBlocks) { + if (retainedRotateBlocks != null && retainedRotateBlocks.contains(pos)) continue; + BlockPos blockPos = BlockPos.of(pos); + if (!getLevel().isLoaded(blockPos)) continue; + BlockEntity blockEntity = getLevel().getBlockEntity(blockPos); + if (blockEntity instanceof KineticBlockEntity kineticBlockEntity && + kineticBlockEntity instanceof IKineticBlockEntityExtension extension) { + extension.ctpp$releaseMultiblockOwner(getPos(), getStructureInstanceId()); + } + } + } + public EnergyContainerList getEnergyContainer() { List containers = new ArrayList<>(); var handlers = getCapabilitiesFlat(IO.IN, EURecipeCapability.CAP); diff --git a/src/main/java/io/github/cpearl0/ctnhcore/common/machine/multiblock/SlaughterHouseMachine.java b/src/main/java/io/github/cpearl0/ctnhcore/common/machine/multiblock/SlaughterHouseMachine.java index 8bc30ceb..f1d4d1cd 100644 --- a/src/main/java/io/github/cpearl0/ctnhcore/common/machine/multiblock/SlaughterHouseMachine.java +++ b/src/main/java/io/github/cpearl0/ctnhcore/common/machine/multiblock/SlaughterHouseMachine.java @@ -21,6 +21,7 @@ import com.lowdragmc.lowdraglib.gui.widget.Widget; import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; +import com.lowdragmc.lowdraglib.syncdata.ISubscription; import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; import net.minecraft.nbt.CompoundTag; @@ -91,6 +92,7 @@ public class SlaughterHouseMachine extends RecipeElectricMultiblockMachine imple private int lootCacheTotalExperience = 0; private int lootCacheDuration = 0; private int lootCacheRepeatTimes = 1; + private final List structureSubscriptions = new ArrayList<>(); private final LinkedHashMap entityCache = new LinkedHashMap<>(ENTITY_CACHE_LIMIT, 0.75f, true) { @@ -128,6 +130,7 @@ public SlaughterHouseMachine(IMachineBlockEntity holder) { @Override public void onStructureFormed() { super.onStructureFormed(); + clearStructureSubscriptions(); if (getLevel() instanceof ServerLevel serverLevel) { getFakePlayer(serverLevel); } @@ -139,6 +142,7 @@ public void onStructureFormed() { @Override public void onStructureInvalid() { super.onStructureInvalid(); + clearStructureSubscriptions(); mobList.clear(); markMobListDirty(); clearLootCache(); @@ -148,6 +152,7 @@ public void onStructureInvalid() { @Override public void onUnload() { + clearStructureSubscriptions(); super.onUnload(); entityCache.clear(); lootTableCache.clear(); @@ -155,6 +160,13 @@ public void onUnload() { mobList.clear(); } + @Override + public void onPartUnload() { + clearStructureSubscriptions(); + super.onPartUnload(); + markMobListDirty(); + } + protected NotifiableItemStackHandler createMachineStorage(byte value) { return new NotifiableItemStackHandler( this, 1, IO.NONE, IO.BOTH, slots -> new CustomItemStackHandler(1) { @@ -288,11 +300,16 @@ private void attachInputChangeSubscriptions() { if (handlerList.getAllHandlers().stream() .noneMatch(handler -> handler.getHandlerIO().support(IO.IN))) continue; - traitSubscriptions.add(handlerList.subscribe(this::markMobListDirty, ItemRecipeCapability.CAP)); + structureSubscriptions.add(handlerList.subscribe(this::markMobListDirty, ItemRecipeCapability.CAP)); } } } + private void clearStructureSubscriptions() { + structureSubscriptions.forEach(ISubscription::unsubscribe); + structureSubscriptions.clear(); + } + private LivingEntity getOrCreateCachedEntity(ServerLevel level, String mobId) { var cached = entityCache.get(mobId); if (cached != null && cached.level() == level) { diff --git a/src/main/java/io/github/cpearl0/ctnhcore/common/machine/multiblock/electric/BioMachine.java b/src/main/java/io/github/cpearl0/ctnhcore/common/machine/multiblock/electric/BioMachine.java index ea023d90..56c46e88 100644 --- a/src/main/java/io/github/cpearl0/ctnhcore/common/machine/multiblock/electric/BioMachine.java +++ b/src/main/java/io/github/cpearl0/ctnhcore/common/machine/multiblock/electric/BioMachine.java @@ -47,7 +47,7 @@ public BioMachine(IMachineBlockEntity holder) { @Override public void addDisplayText(List textList) { super.addDisplayText(textList); - if (isFormed) { + if (isStructureOperational()) { if (machineTemperature >= 36 && machineTemperature <= 38) { efficiency = 1.2; } else { diff --git a/src/main/java/io/github/cpearl0/ctnhcore/common/machine/multiblock/electric/NeutronActivatorMachine.java b/src/main/java/io/github/cpearl0/ctnhcore/common/machine/multiblock/electric/NeutronActivatorMachine.java index eb11f234..49156d2f 100644 --- a/src/main/java/io/github/cpearl0/ctnhcore/common/machine/multiblock/electric/NeutronActivatorMachine.java +++ b/src/main/java/io/github/cpearl0/ctnhcore/common/machine/multiblock/electric/NeutronActivatorMachine.java @@ -27,6 +27,7 @@ import com.lowdragmc.lowdraglib.gui.modular.ModularUI; import com.lowdragmc.lowdraglib.gui.widget.*; +import com.lowdragmc.lowdraglib.syncdata.ISubscription; import com.lowdragmc.lowdraglib.syncdata.annotation.DescSynced; import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; @@ -42,6 +43,7 @@ import com.ctnhlang.Prefix; import tech.vixhentx.mcmod.ctnhlib.langprovider.Lang; +import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; import java.util.List; @@ -63,14 +65,15 @@ public class NeutronActivatorMachine extends RecipeMultiblockMachine @Persisted private boolean isWorking = false; private ConditionalSubscriptionHandler neutronEnergySubs = new ConditionalSubscriptionHandler(this, - this::neutronEnergyUpdate, () -> isFormed); + this::neutronEnergyUpdate, this::isStructureOperational); private ConditionalSubscriptionHandler moderateSubs = new ConditionalSubscriptionHandler(this, this::moderateUpdate, - () -> eV > 0); + () -> !isStructureRevalidationPending() && eV > 0); private ConditionalSubscriptionHandler absorptionSubs = new ConditionalSubscriptionHandler(this, - this::absorptionUpdate, () -> eV > 0); + this::absorptionUpdate, () -> isStructureOperational() && eV > 0); private HashSet sensorMachines = null; private HashSet busMachines = null; private HashSet acceleratorMachines = null; + private final List structureSubscriptions = new ArrayList<>(); public NeutronActivatorMachine(IMachineBlockEntity holder, Object... args) { super(holder, args); @@ -87,26 +90,29 @@ public void onStructureFormed() { height = 0; super.onStructureFormed(); + clearStructureSubscriptions(); + sensorMachines = new HashSet<>(); + busMachines = new HashSet<>(); + acceleratorMachines = new HashSet<>(); + // Cache the result of getParts() to prevent repetitive calls var parts = getParts(); for (var part : parts) { for (var handlerList : part.getRecipeHandlers()) { - traitSubscriptions + structureSubscriptions .add(handlerList.subscribe(neutronEnergySubs::updateSubscription, EURecipeCapability.CAP)); - traitSubscriptions.add(handlerList.subscribe(moderateSubs::updateSubscription, EURecipeCapability.CAP)); - traitSubscriptions + structureSubscriptions + .add(handlerList.subscribe(moderateSubs::updateSubscription, EURecipeCapability.CAP)); + structureSubscriptions .add(handlerList.subscribe(absorptionSubs::updateSubscription, ItemRecipeCapability.CAP)); } if (part instanceof ItemBusPartMachine itemBusPartMachine) { - busMachines = (busMachines != null) ? busMachines : new HashSet<>(); busMachines.add(itemBusPartMachine); } if (part instanceof NeutronSensorMachine neutronSensorMachine) { - sensorMachines = sensorMachines != null ? sensorMachines : new HashSet<>(); sensorMachines.add(neutronSensorMachine); } if (part instanceof NeutronAcceleratorMachine neutronAcceleratorMachine) { - acceleratorMachines = acceleratorMachines != null ? acceleratorMachines : new HashSet<>(); acceleratorMachines.add(neutronAcceleratorMachine); } } @@ -125,16 +131,59 @@ public void onLoad() { moderateSubs.initialize(getLevel()); } + @Override + public void onUnload() { + clearStructureSubscriptions(); + super.onUnload(); + } + @Override public void onStructureInvalid() { super.onStructureInvalid(); + clearStructureSubscriptions(); + isWorking = false; height = 0; sensorMachines = null; busMachines = null; acceleratorMachines = null; + updateIndependentSubscriptions(); + } + + @Override + public void onPartUnload() { + super.onPartUnload(); + clearStructureSubscriptions(); + isWorking = false; + sensorMachines = null; + busMachines = null; + acceleratorMachines = null; + updateIndependentSubscriptions(); + } + + @Override + protected void onStructureRevalidationChanged(boolean pending) { + if (pending) { + isWorking = false; + } + updateIndependentSubscriptions(); + } + + private void updateIndependentSubscriptions() { + neutronEnergySubs.updateSubscription(); + moderateSubs.updateSubscription(); + absorptionSubs.updateSubscription(); + } + + private void clearStructureSubscriptions() { + structureSubscriptions.forEach(ISubscription::unsubscribe); + structureSubscriptions.clear(); } private void neutronEnergyUpdate() { + if (!isStructureOperational()) { + neutronEnergySubs.updateSubscription(); + return; + } if (acceleratorMachines == null) return; var anyWorking = false; for (var accelerator : acceleratorMachines) { @@ -153,6 +202,10 @@ private void neutronEnergyUpdate() { } private void moderateUpdate() { + if (isStructureRevalidationPending()) { + moderateSubs.updateSubscription(); + return; + } if (!isWorking && getOffsetTimer() % 20 == 0L) { this.eV = Math.max((eV - 72 * K), 0); } @@ -162,6 +215,10 @@ private void moderateUpdate() { } private void absorptionUpdate() { + if (!isStructureOperational()) { + absorptionSubs.updateSubscription(); + return; + } if (busMachines == null || eV <= 0) return; var hasSlower = false; for (var bus : busMachines) { diff --git a/src/main/java/io/github/cpearl0/ctnhcore/common/machine/multiblock/electric/Superconducting_Penning_Trap.java b/src/main/java/io/github/cpearl0/ctnhcore/common/machine/multiblock/electric/Superconducting_Penning_Trap.java index 63f24730..ecd94a73 100644 --- a/src/main/java/io/github/cpearl0/ctnhcore/common/machine/multiblock/electric/Superconducting_Penning_Trap.java +++ b/src/main/java/io/github/cpearl0/ctnhcore/common/machine/multiblock/electric/Superconducting_Penning_Trap.java @@ -95,6 +95,7 @@ public void onStructureFormed() { public void onStructureInvalid() { super.onStructureInvalid(); this.energyContainer = EnergyContainerList.EMPTY; + updateTickSubscription(); } @Override @@ -115,7 +116,7 @@ public void onLoad() { } protected void updateTickSubscription() { - if (isFormed) { + if (isStructureOperational()) { tickSubs = subscribeServerTick(tickSubs, this::tick); } else if (tickSubs != null) { tickSubs.unsubscribe(); @@ -123,6 +124,11 @@ protected void updateTickSubscription() { } } + @Override + protected void onStructureRevalidationChanged(boolean pending) { + updateTickSubscription(); + } + public boolean danger() { if (anti_nu > 0 || anti_proton > 0 || anti_electron > 0) { return true; @@ -164,6 +170,7 @@ private void consumeEnergy() { } public void tick() { + if (!isStructureOperational()) return; if (isWorkingEnabled()) consumeEnergy(); var level = getLevel(); var pos = MachineUtils.getOffset(this, 0, 20, 6); diff --git a/src/main/java/io/github/cpearl0/ctnhcore/common/machine/multiblock/electric/WideParticleAccelerator.java b/src/main/java/io/github/cpearl0/ctnhcore/common/machine/multiblock/electric/WideParticleAccelerator.java index 8f85b6aa..71ae666a 100644 --- a/src/main/java/io/github/cpearl0/ctnhcore/common/machine/multiblock/electric/WideParticleAccelerator.java +++ b/src/main/java/io/github/cpearl0/ctnhcore/common/machine/multiblock/electric/WideParticleAccelerator.java @@ -150,8 +150,14 @@ public void onUnload() { } } + @Override + public void onStructureInvalid() { + super.onStructureInvalid(); + updateTempSubscription(); + } + protected void updateTempSubscription() { - if (max_energy > store_energy && isFormed) { + if (max_energy > store_energy && isStructureOperational()) { EnergySubs = subscribeServerTick(EnergySubs, this::Energy_Adjust); } else if (EnergySubs != null) { EnergySubs.unsubscribe(); @@ -159,6 +165,11 @@ protected void updateTempSubscription() { } } + @Override + protected void onStructureRevalidationChanged(boolean pending) { + updateTempSubscription(); + } + protected void Speed_Down() { proton_speed -= Math.max(proton_speed * 0.05, 1); electric_speed -= Math.max(proton_speed * 0.05, 1); @@ -169,6 +180,7 @@ protected void Speed_Down() { } protected void Energy_Adjust() { + if (!isStructureOperational()) return; var consume = (long) ((proton_speed + electric_speed + nu_speed) * 10); if (getRecipeLogic().getStatus() != RecipeLogic.Status.WORKING) { // 不工作时,正常消耗和加速 diff --git a/src/main/java/io/github/cpearl0/ctnhcore/common/machine/multiblock/generator/LargeNaquadahReactorMachine.java b/src/main/java/io/github/cpearl0/ctnhcore/common/machine/multiblock/generator/LargeNaquadahReactorMachine.java index 276fb7e1..2b95533b 100644 --- a/src/main/java/io/github/cpearl0/ctnhcore/common/machine/multiblock/generator/LargeNaquadahReactorMachine.java +++ b/src/main/java/io/github/cpearl0/ctnhcore/common/machine/multiblock/generator/LargeNaquadahReactorMachine.java @@ -163,6 +163,7 @@ private boolean cool(FluidStack fluid, int duration) { @Override public void onStructureFormed() { super.onStructureFormed(); + hatchPartMachines.clear(); for (var part : getParts()) { if (part instanceof FluidHatchPartMachine fluidHatchPartMachine) { hatchPartMachines.add(fluidHatchPartMachine); diff --git a/src/main/java/io/github/cpearl0/ctnhcore/common/machine/multiblock/generator/PhotovoltaicPowerStationMachine.java b/src/main/java/io/github/cpearl0/ctnhcore/common/machine/multiblock/generator/PhotovoltaicPowerStationMachine.java index 94a71a16..5120b588 100644 --- a/src/main/java/io/github/cpearl0/ctnhcore/common/machine/multiblock/generator/PhotovoltaicPowerStationMachine.java +++ b/src/main/java/io/github/cpearl0/ctnhcore/common/machine/multiblock/generator/PhotovoltaicPowerStationMachine.java @@ -131,6 +131,8 @@ public void onStructureInvalid() { tickSubs.unsubscribe(); tickSubs = null; } + lastOutputEnergy = 0; + lastStatus = Status.INVALID; energyContainer = null; } @@ -169,7 +171,7 @@ public void onStructureFormed() { protected TickableSubscription tickSubs; protected void updateTickSubscription() { - if (isFormed) { + if (isStructureOperational()) { tickSubs = subscribeServerTick(tickSubs, this::tick); } else if (tickSubs != null) { tickSubs.unsubscribe(); @@ -177,7 +179,17 @@ protected void updateTickSubscription() { } } + @Override + protected void onStructureRevalidationChanged(boolean pending) { + if (pending) { + lastOutputEnergy = 0; + lastStatus = Status.INVALID; + } + updateTickSubscription(); + } + public void tick() { + if (!isStructureOperational()) return; var level = getLevel(); assert level != null; if (getPowerState() != Status.VALID) return; diff --git a/src/main/java/io/github/cpearl0/ctnhcore/common/machine/multiblock/generator/WindPowerArrayMachine.java b/src/main/java/io/github/cpearl0/ctnhcore/common/machine/multiblock/generator/WindPowerArrayMachine.java index d119508f..a797978c 100644 --- a/src/main/java/io/github/cpearl0/ctnhcore/common/machine/multiblock/generator/WindPowerArrayMachine.java +++ b/src/main/java/io/github/cpearl0/ctnhcore/common/machine/multiblock/generator/WindPowerArrayMachine.java @@ -90,7 +90,7 @@ public WindPowerArrayMachine(IMachineBlockEntity holder, int tier) { protected TickableSubscription tickSubs; protected void updateTickSubscription() { - if (isFormed && isWorkingEnabled) { + if (isStructureOperational() && isWorkingEnabled) { tickSubs = subscribeServerTick(tickSubs, this::tick); } else if (tickSubs != null) { tickSubs.unsubscribe(); @@ -98,6 +98,14 @@ protected void updateTickSubscription() { } } + @Override + protected void onStructureRevalidationChanged(boolean pending) { + if (pending) { + isActive = false; + } + updateTickSubscription(); + } + @Override public void onLoad() { super.onLoad(); @@ -268,7 +276,7 @@ private void updateEfficiencyPara() { @SuppressWarnings("DataFlowIssue") public void tick() { - if (!isWorkingEnabled || !netHandler.ensureNetInfo()) return; + if (!isStructureOperational() || !isWorkingEnabled || !netHandler.ensureNetInfo()) return; long time = getLevel().getGameTime(); if (time % 20 == 0) { isActive = !needFluid || netHandler.checkAndConsume(fluidAmount); @@ -281,7 +289,7 @@ public void tick() { @Override public void addDisplayText(List textList) { - if (isFormed && getLevel() instanceof ServerLevel) { + if (isStructureOperational() && getLevel() instanceof ServerLevel) { MultiblockDisplayText.builder(textList, isFormed()) .setWorkingStatus(isWorkingEnabled, isActive) .addWorkingStatusLine() diff --git a/src/main/java/io/github/cpearl0/ctnhcore/common/machine/multiblock/kinetic/KineticCentrifugeMachine.java b/src/main/java/io/github/cpearl0/ctnhcore/common/machine/multiblock/kinetic/KineticCentrifugeMachine.java index 73a6d7b1..f133b098 100644 --- a/src/main/java/io/github/cpearl0/ctnhcore/common/machine/multiblock/kinetic/KineticCentrifugeMachine.java +++ b/src/main/java/io/github/cpearl0/ctnhcore/common/machine/multiblock/kinetic/KineticCentrifugeMachine.java @@ -46,7 +46,7 @@ public void onStructureInvalid() { @Override public void updateMachineSpeed() { super.updateMachineSpeed(); - if (!contraptionEntity.isEmpty() && isFormed) { + if (!contraptionEntity.isEmpty() && isStructureOperational()) { for (int i = 0; i < contraptionEntity.size(); i++) { SimpleRotatingContraptionEntity entity = contraptionEntity.get(i); if (i == 0) { @@ -61,7 +61,7 @@ public void updateMachineSpeed() { @Override public void updateRotateBlocks(boolean active) { super.updateRotateBlocks(active); - if (active) { + if (active && isStructureOperational()) { if (contraptionEntity != null) for (int i = 0; i < contraptionEntity.size(); i++) { SimpleRotatingContraptionEntity entity = contraptionEntity.get(i); diff --git a/src/main/java/io/github/cpearl0/ctnhcore/common/machine/multiblock/kinetic/KineticMixerMachine.java b/src/main/java/io/github/cpearl0/ctnhcore/common/machine/multiblock/kinetic/KineticMixerMachine.java index 23c0af6b..d50709a7 100644 --- a/src/main/java/io/github/cpearl0/ctnhcore/common/machine/multiblock/kinetic/KineticMixerMachine.java +++ b/src/main/java/io/github/cpearl0/ctnhcore/common/machine/multiblock/kinetic/KineticMixerMachine.java @@ -46,7 +46,7 @@ public void onStructureInvalid() { @Override public void updateMachineSpeed() { super.updateMachineSpeed(); - if (!contraptionEntity.isEmpty() && isFormed) { + if (!contraptionEntity.isEmpty() && isStructureOperational()) { contraptionEntity.forEach(entity -> { entity.setRotationSpeedRPM(new Vec3(0, 1, 0), Math.min(speed, 128)); }); @@ -56,7 +56,7 @@ public void updateMachineSpeed() { @Override public void updateRotateBlocks(boolean active) { super.updateRotateBlocks(active); - if (active) { + if (active && isStructureOperational()) { if (contraptionEntity != null) contraptionEntity.forEach(entity -> { entity.setRotationSpeedRPM(new Vec3(0, 1, 0), Math.min(speed, 128)); diff --git a/src/main/java/io/github/cpearl0/ctnhcore/common/machine/multiblock/part/CircuitBusPartMachine.java b/src/main/java/io/github/cpearl0/ctnhcore/common/machine/multiblock/part/CircuitBusPartMachine.java index bfdf1049..31844e6a 100644 --- a/src/main/java/io/github/cpearl0/ctnhcore/common/machine/multiblock/part/CircuitBusPartMachine.java +++ b/src/main/java/io/github/cpearl0/ctnhcore/common/machine/multiblock/part/CircuitBusPartMachine.java @@ -8,7 +8,6 @@ import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IDistinctPart; -import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiController; import com.gregtechceu.gtceu.api.machine.multiblock.part.TieredIOPartMachine; import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; import com.gregtechceu.gtceu.api.recipe.GTRecipe; @@ -21,10 +20,10 @@ import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; import net.minecraft.MethodsReturnNonnullByDefault; +import net.minecraft.core.BlockPos; import net.minecraft.world.item.ItemStack; import lombok.Getter; -import org.jetbrains.annotations.MustBeInvokedByOverriders; import org.jetbrains.annotations.NotNull; import java.util.List; @@ -64,11 +63,11 @@ public void setDistinct(boolean isDistinct) { getInventory().setDistinct(isDistinct); } - @MustBeInvokedByOverriders @Override - public void removedFromController(IMultiController controller) { - super.removedFromController(controller); - isLocked = false; + public void onControllerBindingRetired(BlockPos controllerPos, long instanceId) { + if (!isFormed()) { + isLocked = false; + } } @Override From 5286947606e992d5ec599ce384a312576395ca94 Mon Sep 17 00:00:00 2001 From: takanashisatou Date: Sat, 5 Sep 2026 07:02:46 +0800 Subject: [PATCH 2/2] fix: migrate remaining core coil access and remove unused renderer --- .../client/renderer/LargeBottleRender.java | 68 ------------------- .../electric/BlazeBlastFurnaceMachine.java | 4 +- .../electric/FermentingTankMachine.java | 5 +- .../multiblock/electric/PlasmaAlloyBlast.java | 10 +-- .../multiblock/electric/SinopeChemical.java | 5 +- .../generator/WaterPowerStationMachine.java | 3 +- .../registry/CTNHRecipeModifiers.java | 6 +- .../machines/multiblock/MultiblocksA.java | 17 ++--- 8 files changed, 30 insertions(+), 88 deletions(-) delete mode 100644 src/main/java/io/github/cpearl0/ctnhcore/client/renderer/LargeBottleRender.java diff --git a/src/main/java/io/github/cpearl0/ctnhcore/client/renderer/LargeBottleRender.java b/src/main/java/io/github/cpearl0/ctnhcore/client/renderer/LargeBottleRender.java deleted file mode 100644 index 4ea55dbe..00000000 --- a/src/main/java/io/github/cpearl0/ctnhcore/client/renderer/LargeBottleRender.java +++ /dev/null @@ -1,68 +0,0 @@ -package io.github.cpearl0.ctnhcore.client.renderer; - -import com.gregtechceu.gtceu.api.machine.feature.multiblock.IFluidRenderMulti; -import com.gregtechceu.gtceu.client.renderer.block.FluidBlockRenderer; -import com.gregtechceu.gtceu.client.renderer.machine.DynamicRender; -import com.gregtechceu.gtceu.client.renderer.machine.DynamicRenderType; - -import net.minecraft.client.renderer.LightTexture; -import net.minecraft.client.renderer.MultiBufferSource; -import net.minecraft.world.level.material.Fluid; - -import com.mojang.blaze3d.vertex.PoseStack; - -public class LargeBottleRender extends DynamicRender { - - private final FluidBlockRenderer fluidBlockRenderer; - private Fluid cachedFluid; - - public LargeBottleRender() { - fluidBlockRenderer = FluidBlockRenderer.Builder.create() - .setFaceOffset(-0.125f) - .setForcedLight(LightTexture.FULL_BRIGHT) - .getRenderer(); - } - - @Override - public int getViewDistance() { - return 32; - } - - @Override - public void render(IFluidRenderMulti iFluidRenderMulti, float partialTicks, PoseStack stack, - MultiBufferSource buffer, - int combinedLight, int combinedOverlay) { - // if (!ConfigHolder.INSTANCE.client.renderer.renderFluids) return; - // if (blockEntity instanceof MetaMachineBlockEntity mm) { - // if (mm.metaMachine instanceof LargeBottleMachine tankMachine) { - // if(tankMachine.getTank().isEmpty()){ - // cachedFluid = null; - // } - // cachedFluid = tankMachine.getTank().getFluidInTank(0).getFluid(); - // - // if (cachedFluid == null) { - // return; - // } - // - // stack.pushPose(); - // var pose = stack.last().pose(); - // - // var fluidRenderType = ItemBlockRenderTypes.getRenderLayer(cachedFluid.defaultFluidState()); - // var consumer = buffer.getBuffer(RenderTypeHelper.getEntityRenderType(fluidRenderType, false)); - // - // var up = RelativeDirection.UP.getRelativeFacing(tankMachine.getFrontFacing(), tankMachine.getUpwardsFacing(), - // tankMachine.isFlipped()); - // if (up.getAxis() != Direction.Axis.Y) up = up.getOpposite(); - // fluidBlockRenderer.drawPlane(up, tankMachine.SideBlockOffsets, pose, consumer, cachedFluid, - // RenderUtil.FluidTextureType.STILL, combinedOverlay, tankMachine.getPos()); - // - // stack.popPose(); - // } - // } - } - - @Override - public DynamicRenderType getType() { - return null; - } -} diff --git a/src/main/java/io/github/cpearl0/ctnhcore/common/machine/multiblock/electric/BlazeBlastFurnaceMachine.java b/src/main/java/io/github/cpearl0/ctnhcore/common/machine/multiblock/electric/BlazeBlastFurnaceMachine.java index 8cb62570..8970227c 100644 --- a/src/main/java/io/github/cpearl0/ctnhcore/common/machine/multiblock/electric/BlazeBlastFurnaceMachine.java +++ b/src/main/java/io/github/cpearl0/ctnhcore/common/machine/multiblock/electric/BlazeBlastFurnaceMachine.java @@ -12,6 +12,7 @@ import com.gregtechceu.gtceu.api.recipe.handler.RecipeHandlerGroup; import com.gregtechceu.gtceu.api.recipe.modifier.ParallelLogic; import com.gregtechceu.gtceu.api.transfer.fluid.IFluidHandlerModifiable; +import com.gregtechceu.gtceu.common.machine.trait.multiblock.CoilMachineTrait; import net.minecraft.ChatFormatting; import net.minecraft.network.chat.Component; @@ -80,7 +81,8 @@ public void addDisplayText(@NotNull List textList) { if (isFormed()) { textList.add(Component.translatable("gtceu.multiblock.blast_furnace.max_temperature", - Component.literal(getCoilType().getCoilTemperature() + "K").withStyle(ChatFormatting.RED))); + Component.literal(getTrait(CoilMachineTrait.class).getCoilType().getCoilTemperature() + "K") + .withStyle(ChatFormatting.RED))); textList.add(blazeBlastFurnaceInfoPyrotheum.translate(current)); } } diff --git a/src/main/java/io/github/cpearl0/ctnhcore/common/machine/multiblock/electric/FermentingTankMachine.java b/src/main/java/io/github/cpearl0/ctnhcore/common/machine/multiblock/electric/FermentingTankMachine.java index 0832a257..65f05f72 100644 --- a/src/main/java/io/github/cpearl0/ctnhcore/common/machine/multiblock/electric/FermentingTankMachine.java +++ b/src/main/java/io/github/cpearl0/ctnhcore/common/machine/multiblock/electric/FermentingTankMachine.java @@ -10,6 +10,7 @@ import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.handler.RecipeHandlerGroup; import com.gregtechceu.gtceu.common.machine.multiblock.part.FluidHatchPartMachine; +import com.gregtechceu.gtceu.common.machine.trait.multiblock.CoilMachineTrait; import com.gregtechceu.gtceu.utils.FormattingUtil; import com.lowdragmc.lowdraglib.side.fluid.FluidStack; @@ -58,7 +59,9 @@ public void addDisplayText(List textList) { super.addDisplayText(textList); textList.add(Component.translatable("gtceu.multiblock.blast_furnace.max_temperature", Component .translatable(FormattingUtil.formatNumbers( - getCoilType().getCoilTemperature() + 100L * Math.max(0, getTier() - GTValues.MV)) + "K") + getTrait(CoilMachineTrait.class).getCoilType().getCoilTemperature() + + 100L * Math.max(0, getTier() - GTValues.MV)) + + "K") .setStyle(Style.EMPTY.withColor(ChatFormatting.RED)))); textList.add(textList.size(), growing_temperature.translate(String.format("%.1f", Machine_Temperature)) diff --git a/src/main/java/io/github/cpearl0/ctnhcore/common/machine/multiblock/electric/PlasmaAlloyBlast.java b/src/main/java/io/github/cpearl0/ctnhcore/common/machine/multiblock/electric/PlasmaAlloyBlast.java index 075362f9..c6a88b54 100644 --- a/src/main/java/io/github/cpearl0/ctnhcore/common/machine/multiblock/electric/PlasmaAlloyBlast.java +++ b/src/main/java/io/github/cpearl0/ctnhcore/common/machine/multiblock/electric/PlasmaAlloyBlast.java @@ -11,6 +11,7 @@ import com.gregtechceu.gtceu.api.recipe.handler.RecipeHandlerGroup; import com.gregtechceu.gtceu.api.recipe.modifier.ParallelLogic; import com.gregtechceu.gtceu.api.recipe.modifier.RecipeModifier; +import com.gregtechceu.gtceu.common.machine.trait.multiblock.CoilMachineTrait; import com.lowdragmc.lowdraglib.syncdata.annotation.Persisted; @@ -35,8 +36,8 @@ public PlasmaAlloyBlast(IMachineBlockEntity holder) { public void onStructureFormed() { super.onStructureFormed(); var tier = getTier(); - var coil_tier = getCoilTier(); - var coil_type = getCoilType().getCoilTemperature(); + var coil_tier = getTrait(CoilMachineTrait.class).getCoilTier(); + var coil_type = getTrait(CoilMachineTrait.class).getCoilType().getCoilTemperature(); islasor = 0; machine_level = coil_type / 1800; for (IMultiPart part : getParts()) { @@ -74,8 +75,9 @@ public static Component recipeModifier(MetaMachine machine, RecipeHandlerGroup g speed = 2.0; } total_speed = speed; - if (pmachine.getCoilType().getCoilTemperature() > 10000) { - total_speed += ((double) (pmachine.getCoilType().getCoilTemperature() - 10000) / 1800); + if (pmachine.getTrait(CoilMachineTrait.class).getCoilType().getCoilTemperature() > 10000) { + total_speed += ((double) (pmachine.getTrait(CoilMachineTrait.class).getCoilType().getCoilTemperature() - + 10000) / 1800); } if (MachineUtils.inputFluids(pmachine, CTNHMaterials.COMPRESSED_ADAMANTITE.getFluid(PLASMA, 100))) { total_speed *= 5; diff --git a/src/main/java/io/github/cpearl0/ctnhcore/common/machine/multiblock/electric/SinopeChemical.java b/src/main/java/io/github/cpearl0/ctnhcore/common/machine/multiblock/electric/SinopeChemical.java index d02af00a..4ccbce94 100644 --- a/src/main/java/io/github/cpearl0/ctnhcore/common/machine/multiblock/electric/SinopeChemical.java +++ b/src/main/java/io/github/cpearl0/ctnhcore/common/machine/multiblock/electric/SinopeChemical.java @@ -10,6 +10,7 @@ import com.gregtechceu.gtceu.api.recipe.modifier.ParallelLogic; import com.gregtechceu.gtceu.api.recipe.modifier.RecipeModifier; import com.gregtechceu.gtceu.common.data.GTMaterialBlocks; +import com.gregtechceu.gtceu.common.machine.trait.multiblock.CoilMachineTrait; import net.minecraft.network.chat.Component; @@ -45,8 +46,8 @@ public SinopeChemical(IMachineBlockEntity holder) { public void onStructureFormed() { super.onStructureFormed(); var tier = getTier(); - var coil_tier = getCoilTier(); - var coil_type = getCoilType().getCoilTemperature(); + var coil_tier = getTrait(CoilMachineTrait.class).getCoilTier(); + var coil_type = getTrait(CoilMachineTrait.class).getCoilType().getCoilTemperature(); machine_tier = coil_type / 1800; var blockpos = MachineUtils.getOffset(this, 0, 2, 2); var coreblock = Objects.requireNonNull(getLevel()).getBlockState(blockpos).getBlock(); diff --git a/src/main/java/io/github/cpearl0/ctnhcore/common/machine/multiblock/generator/WaterPowerStationMachine.java b/src/main/java/io/github/cpearl0/ctnhcore/common/machine/multiblock/generator/WaterPowerStationMachine.java index 303fbd06..108c4dfe 100644 --- a/src/main/java/io/github/cpearl0/ctnhcore/common/machine/multiblock/generator/WaterPowerStationMachine.java +++ b/src/main/java/io/github/cpearl0/ctnhcore/common/machine/multiblock/generator/WaterPowerStationMachine.java @@ -8,6 +8,7 @@ import com.gregtechceu.gtceu.api.recipe.RecipeHelper; import com.gregtechceu.gtceu.api.recipe.handler.RecipeHandlerGroup; import com.gregtechceu.gtceu.api.recipe.modifier.RecipeModifier; +import com.gregtechceu.gtceu.common.machine.trait.multiblock.CoilMachineTrait; import com.gregtechceu.gtceu.utils.FormattingUtil; import com.gregtechceu.gtceu.utils.GTUtil; @@ -25,7 +26,7 @@ public class WaterPowerStationMachine extends CoilWorkableElectricMultiblockMach public WaterPowerStationMachine(IMachineBlockEntity holder) { super(holder); - efficiency = 1 + 0.1 * getCoilTier(); + efficiency = 1 + 0.1 * getTrait(CoilMachineTrait.class).getCoilTier(); } public static Component recipeModifier(MetaMachine machine, RecipeHandlerGroup group, @NotNull GTRecipe recipe) { diff --git a/src/main/java/io/github/cpearl0/ctnhcore/registry/CTNHRecipeModifiers.java b/src/main/java/io/github/cpearl0/ctnhcore/registry/CTNHRecipeModifiers.java index bbf5bec4..0642f64a 100644 --- a/src/main/java/io/github/cpearl0/ctnhcore/registry/CTNHRecipeModifiers.java +++ b/src/main/java/io/github/cpearl0/ctnhcore/registry/CTNHRecipeModifiers.java @@ -16,6 +16,7 @@ import com.gregtechceu.gtceu.api.recipe.handler.RecipeHandlerGroup; import com.gregtechceu.gtceu.api.recipe.modifier.ParallelLogic; import com.gregtechceu.gtceu.api.recipe.modifier.RecipeModifier; +import com.gregtechceu.gtceu.common.machine.trait.multiblock.CoilMachineTrait; import net.minecraft.Util; import net.minecraft.network.chat.Component; @@ -84,7 +85,7 @@ public static Component accurateParallel(MetaMachine machine, RecipeHandlerGroup public static final RecipeModifier COIL_PARALLEL = (machine, group, recipe) -> CTNHRecipeModifiers.accurateParallel( machine, group, recipe, Math.min(2147483647, (int) Math.pow(2, - ((double) ((CoilWorkableElectricMultiblockMachine) machine).getCoilType().getCoilTemperature() / + ((double) machine.getTrait(CoilMachineTrait.class).getCoilType().getCoilTemperature() / 900)))); public static final Function MT_ELECTRIC_OVERCLOCK = Util @@ -118,8 +119,7 @@ public static Component chemicalPlantModifier(MetaMachine machine, RecipeHandler public static Component superEbfOverclock(MetaMachine machine, RecipeHandlerGroup group, @NotNull GTRecipe recipe) { if (machine instanceof CoilWorkableElectricMultiblockMachine coilMachine) { - final var blastFurnaceTemperature = coilMachine.getCoilType().getCoilTemperature() + - 100 * Math.max(0, coilMachine.getTier() - GTValues.MV); + final var blastFurnaceTemperature = coilMachine.getTrait(CoilMachineTrait.class).getWorkingTemperature(); var recipeTemp = recipe.data.getInt("ebf_temp"); if (!recipe.data.contains("ebf_temp") || recipe.data.getInt("ebf_temp") > blastFurnaceTemperature) { return gtceuRecipeModifierCoilTemperatureTooLow.translate(); diff --git a/src/main/java/io/github/cpearl0/ctnhcore/registry/machines/multiblock/MultiblocksA.java b/src/main/java/io/github/cpearl0/ctnhcore/registry/machines/multiblock/MultiblocksA.java index 8c1a96a4..60b41124 100644 --- a/src/main/java/io/github/cpearl0/ctnhcore/registry/machines/multiblock/MultiblocksA.java +++ b/src/main/java/io/github/cpearl0/ctnhcore/registry/machines/multiblock/MultiblocksA.java @@ -41,6 +41,7 @@ import com.gregtechceu.gtceu.common.data.*; import com.gregtechceu.gtceu.common.machine.multiblock.electric.FusionReactorMachine; import com.gregtechceu.gtceu.common.machine.multiblock.primitive.PrimitiveWorkableMachine; +import com.gregtechceu.gtceu.common.machine.trait.multiblock.CoilMachineTrait; import com.gregtechceu.gtceu.utils.FormattingUtil; import net.minecraft.ChatFormatting; @@ -1486,7 +1487,7 @@ public static MultiblockMachineDefinition registerPhotovoltaicPowerStation(Strin .build()) .additionalDisplay((controller, components) -> { if (controller.isFormed() && controller instanceof CoilWorkableElectricMultiblockMachine machine) { - components.add(Component.translatable("gtceu.multiblock.pyrolyse_oven.speed", machine.getCoilTier() == 0 ? 75 : 50 * (machine.getCoilTier() + 15))); + components.add(Component.translatable("gtceu.multiblock.pyrolyse_oven.speed", machine.getTrait(CoilMachineTrait.class).getCoilTier() == 0 ? 75 : 50 * (machine.getTrait(CoilMachineTrait.class).getCoilTier() + 15))); } }) .workableCasingModel(GTCEu.id("block/casings/solid/machine_casing_clean_stainless_steel"), GTCEu.id("block/machines/fluid_heater")) @@ -1972,7 +1973,7 @@ public static MultiblockMachineDefinition registerPhotovoltaicPowerStation(Strin .additionalDisplay((controller, components) -> { if (controller instanceof CoilWorkableElectricMultiblockMachine coilMachine && controller.isFormed()) { components.add(Component.translatable("gtceu.multiblock.blast_furnace.max_temperature", - Component.translatable(FormattingUtil.formatNumbers(coilMachine.getCoilType().getCoilTemperature() + + Component.translatable(FormattingUtil.formatNumbers(coilMachine.getTrait(CoilMachineTrait.class).getCoilType().getCoilTemperature() + 100L * Math.max(0, coilMachine.getTier() - MV)) + "K") .withStyle(ChatFormatting.RED))); } @@ -2014,7 +2015,7 @@ public static MultiblockMachineDefinition registerPhotovoltaicPowerStation(Strin .additionalDisplay((controller, components) -> { if (controller instanceof CoilWorkableElectricMultiblockMachine coilMachine && controller.isFormed()) { components.add(Component.translatable("gtceu.multiblock.cracking_unit.energy", - 100 - 10 * coilMachine.getCoilTier())); + 100 - 10 * coilMachine.getTrait(CoilMachineTrait.class).getCoilTier())); } }) .register(); @@ -2442,7 +2443,7 @@ public static MultiblockMachineDefinition registerChemicalGenerator(String name, .build()) .additionalDisplay((machine, list) -> { if (machine.isFormed() && machine instanceof CoilWorkableElectricMultiblockMachine coilMachine) { - list.add(Component.translatable("gtceu.multiblock.blast_furnace.max_temperature", Component.literal(coilMachine.getCoilType().getCoilTemperature() + "K").withStyle(ChatFormatting.RED))); + list.add(Component.translatable("gtceu.multiblock.blast_furnace.max_temperature", Component.literal(coilMachine.getTrait(CoilMachineTrait.class).getCoilType().getCoilTemperature() + "K").withStyle(ChatFormatting.RED))); } }) .workableCasingModel(GTCEu.id("block/casings/solid/machine_casing_heatproof"), GTCEu.id("block/multiblock/implosion_compressor")) @@ -2788,7 +2789,7 @@ public static MultiblockMachineDefinition registerChemicalGenerator(String name, .build()) .additionalDisplay((machine, l) -> { if (machine.isFormed() && machine instanceof CoilWorkableElectricMultiblockMachine cmachine) { - l.add(Component.translatable("gtceu.multiblock.blast_furnace.max_temperature", Component.literal(cmachine.getCoilType().getCoilTemperature() + "K").withStyle(ChatFormatting.RED))); + l.add(Component.translatable("gtceu.multiblock.blast_furnace.max_temperature", Component.literal(cmachine.getTrait(CoilMachineTrait.class).getCoilType().getCoilTemperature() + "K").withStyle(ChatFormatting.RED))); } }) .workableCasingModel(GTCEu.id("block/casings/solid/machine_casing_solid_steel"), GTCEu.id("block/multiblock/fusion_reactor")) @@ -2830,7 +2831,7 @@ public static MultiblockMachineDefinition registerChemicalGenerator(String name, .build()) .additionalDisplay((machine, list) -> { if (machine.isFormed() && machine instanceof CoilWorkableElectricMultiblockMachine coilMachine) { - list.add(Component.translatable("gtceu.multiblock.blast_furnace.max_temperature", Component.literal(coilMachine.getCoilType().getCoilTemperature() + "K").withStyle(ChatFormatting.RED))); + list.add(Component.translatable("gtceu.multiblock.blast_furnace.max_temperature", Component.literal(coilMachine.getTrait(CoilMachineTrait.class).getCoilType().getCoilTemperature() + "K").withStyle(ChatFormatting.RED))); } }) .workableCasingModel(GTCEu.id("block/casings/solid/machine_casing_stable_titanium"), GTCEu.id("block/multiblock/implosion_compressor")) @@ -2868,7 +2869,7 @@ public static MultiblockMachineDefinition registerChemicalGenerator(String name, .build()) .additionalDisplay((machine, list) -> { if (machine.isFormed() && machine instanceof CoilWorkableElectricMultiblockMachine coilMachine) { - list.add(Component.translatable("gtceu.multiblock.blast_furnace.max_temperature", Component.literal(coilMachine.getCoilType().getCoilTemperature() + "K").withStyle(ChatFormatting.RED))); + list.add(Component.translatable("gtceu.multiblock.blast_furnace.max_temperature", Component.literal(coilMachine.getTrait(CoilMachineTrait.class).getCoilType().getCoilTemperature() + "K").withStyle(ChatFormatting.RED))); } }) .workableCasingModel(GTCEu.id("block/casings/gcym/high_temperature_smelting_casing"), GTCEu.id("block/multiblock/implosion_compressor")) @@ -2900,7 +2901,7 @@ public static MultiblockMachineDefinition registerChemicalGenerator(String name, .build()) .additionalDisplay((machine, l) -> { if (machine.isFormed() && machine instanceof CoilWorkableElectricMultiblockMachine cmachine) { - l.add(Component.translatable("gtceu.multiblock.blast_furnace.max_temperature", Component.literal(cmachine.getCoilType().getCoilTemperature() + "K").withStyle(ChatFormatting.RED))); + l.add(Component.translatable("gtceu.multiblock.blast_furnace.max_temperature", Component.literal(cmachine.getTrait(CoilMachineTrait.class).getCoilType().getCoilTemperature() + "K").withStyle(ChatFormatting.RED))); } }) .workableCasingModel(GTCEu.id("block/casings/solid/machine_casing_solid_steel"), GTCEu.id("block/multiblock/implosion_compressor"))