From d9832a660cc19f58ab0f1250c5f3a1677a36d435 Mon Sep 17 00:00:00 2001 From: Gustavo <77560533+gustovafing@users.noreply.github.com> Date: Fri, 6 Feb 2026 10:27:50 +1100 Subject: [PATCH 01/10] change sync logging (#4556) --- .../gregtechceu/gtceu/api/sync_system/SyncDataHolder.java | 6 ++++-- .../gregtechceu/gtceu/api/sync_system/TypeDeclaration.java | 5 +++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/api/sync_system/SyncDataHolder.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/SyncDataHolder.java index bf357ef8ae8..c16d2630b29 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/sync_system/SyncDataHolder.java +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/SyncDataHolder.java @@ -119,7 +119,8 @@ private static Tag serializeField(ISyncManaged holder, FieldSyncData field, } else if (currentValue instanceof ISyncManaged syncObj) { return syncObj.getSyncDataHolder().serializeNBT(writeClientFields); } else { - GTCEu.LOGGER.error("Sync: Failed to serialize field {}: Missing value transformer", field.fieldName); + GTCEu.LOGGER.error("Sync: Failed to serialize field {} in class {}: Missing value transformer for {}", + field.fieldName, holder.getClass().getName(), field.type); } } catch (Exception e) { @@ -166,7 +167,8 @@ private static void deserializeField(ISyncManaged holder, FieldSyncData field, if (currentVal instanceof ISyncManaged syncObj) syncObj.getSyncDataHolder().deserializeNBT(compound, readingClientFields); } else { - GTCEu.LOGGER.error("Sync: Failed to deserialize field {}: Missing value transformer", field.fieldName); + GTCEu.LOGGER.error("Sync: Failed to deserialize field {} in class {}: Missing value transformer for {}", + field.fieldName, holder.getClass().getName(), field.type); } } catch (Exception e) { GTCEu.LOGGER.error("Sync: Failed to deserialize field {}", field.fieldName); diff --git a/src/main/java/com/gregtechceu/gtceu/api/sync_system/TypeDeclaration.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/TypeDeclaration.java index b619e500f49..d90440ad76e 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/sync_system/TypeDeclaration.java +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/TypeDeclaration.java @@ -46,4 +46,9 @@ public TypeDeclaration getArrayComponentType() { "Attempted to get array component for non-array type %s".formatted(rawType)); return arrayComponentType; } + + @Override + public String toString() { + return rawType.toString(); + } } From cf547624dd17151304dfc5f4edddbebcd60fb5a4 Mon Sep 17 00:00:00 2001 From: Gustavo <77560533+gustovafing@users.noreply.github.com> Date: Fri, 6 Feb 2026 16:02:17 +1100 Subject: [PATCH 02/10] Refactor machine auto output behaviour (#4551) --- .../gtceu/api/block/MetaMachineBlock.java | 19 +- .../gtceu/api/capability/ICentralMonitor.java | 10 - .../AutoOutputFluidConfigHandler.java | 42 +- .../handlers/AutoOutputItemConfigHandler.java | 42 +- .../gtceu/api/machine/MetaMachine.java | 96 +---- .../api/machine/SimpleTieredMachine.java | 206 +-------- .../api/machine/WorkableTieredMachine.java | 3 +- .../CombinedDirectionalFancyConfigurator.java | 17 +- .../api/machine/feature/IAutoOutputBoth.java | 5 - .../api/machine/feature/IAutoOutputFluid.java | 25 -- .../api/machine/feature/IAutoOutputItem.java | 25 -- .../MultiblockControllerMachine.java | 24 -- .../api/machine/trait/AutoOutputTrait.java | 400 ++++++++++++++++++ .../machine/trait/FluidTankProxyTrait.java | 3 +- .../NBTSerializableTransformer.java | 3 +- .../data_transformers/ValueTransformer.java | 15 - .../collections/ListTransformer.java | 3 +- .../collections/ObjectArrayTransformer.java | 3 +- .../client/model/machine/MachineModel.java | 16 +- .../behavior/MachineConfigCopyBehaviour.java | 39 +- .../tool/behavior/ToolModeSwitchBehavior.java | 2 + .../machine/electric/BlockBreakerMachine.java | 160 +------ .../machine/electric/FisherMachine.java | 144 +------ .../electric/ItemCollectorMachine.java | 171 +------- .../common/machine/electric/MinerMachine.java | 91 +--- .../common/machine/electric/PumpMachine.java | 63 +-- .../electric/WorldAcceleratorMachine.java | 15 - .../electric/CentralMonitorMachine.java | 3 +- .../common/machine/storage/BufferMachine.java | 161 +------ .../machine/storage/CreativeChestMachine.java | 16 +- .../machine/storage/CreativeTankMachine.java | 11 +- .../common/machine/storage/DrumMachine.java | 166 +------- .../machine/storage/QuantumChestMachine.java | 152 +------ .../machine/storage/QuantumTankMachine.java | 164 +------ .../gtceu/config/ConfigHolder.java | 4 - .../machine/MEPatternBufferPartMachine.java | 20 +- .../MEPatternBufferProxyPartMachine.java | 6 +- .../provider/AutoOutputBlockProvider.java | 57 +-- .../jade/provider/MachineTraitProvider.java | 4 +- .../jade/provider/RecipeLogicProvider.java | 2 +- .../jade/provider/RecipeOutputProvider.java | 2 +- .../utils/data/TagCompatibilityFixer.java | 41 ++ 42 files changed, 728 insertions(+), 1723 deletions(-) delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/capability/ICentralMonitor.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/machine/feature/IAutoOutputBoth.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/machine/feature/IAutoOutputFluid.java delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/machine/feature/IAutoOutputItem.java create mode 100644 src/main/java/com/gregtechceu/gtceu/api/machine/trait/AutoOutputTrait.java create mode 100644 src/main/java/com/gregtechceu/gtceu/utils/data/TagCompatibilityFixer.java diff --git a/src/main/java/com/gregtechceu/gtceu/api/block/MetaMachineBlock.java b/src/main/java/com/gregtechceu/gtceu/api/block/MetaMachineBlock.java index 986fef65c54..1bacdd97fa4 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/block/MetaMachineBlock.java +++ b/src/main/java/com/gregtechceu/gtceu/api/block/MetaMachineBlock.java @@ -322,19 +322,32 @@ public InteractionResult use(BlockState state, Level world, BlockPos pos, Player ////////////////////////////////////// public boolean canConnectRedstone(BlockGetter level, BlockPos pos, Direction side) { - return MetaMachine.getMachine(level, pos).canConnectRedstone(side); + var machine = MetaMachine.getMachine(level, pos); + if (machine == null) return false; + return machine.canConnectRedstone(side); } @Override @SuppressWarnings("deprecation") // This is fine to override, just not to be called. public int getSignal(BlockState state, BlockGetter level, BlockPos pos, Direction direction) { - return MetaMachine.getMachine(level, pos).getOutputSignal(direction); + var machine = MetaMachine.getMachine(level, pos); + if (machine == null) return 0; + return machine.getOutputSignal(direction); + } + + @Override + public int getDirectSignal(BlockState state, BlockGetter level, BlockPos pos, Direction direction) { + var machine = MetaMachine.getMachine(level, pos); + if (machine == null) return 0; + return machine.getOutputDirectSignal(direction); } @Override @SuppressWarnings("deprecation") // This is fine to override, just not to be called. public int getAnalogOutputSignal(BlockState state, Level level, BlockPos pos) { - return MetaMachine.getMachine(level, pos).getAnalogOutputSignal(); + var machine = MetaMachine.getMachine(level, pos); + if (machine == null) return 0; + return machine.getAnalogOutputSignal(); } ///////// diff --git a/src/main/java/com/gregtechceu/gtceu/api/capability/ICentralMonitor.java b/src/main/java/com/gregtechceu/gtceu/api/capability/ICentralMonitor.java deleted file mode 100644 index 42d7fc528bb..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/capability/ICentralMonitor.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.gregtechceu.gtceu.api.capability; - -import com.gregtechceu.gtceu.common.machine.multiblock.electric.monitor.MonitorGroup; - -import java.util.List; - -public interface ICentralMonitor { - - List getMonitorGroups(); -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/directional/handlers/AutoOutputFluidConfigHandler.java b/src/main/java/com/gregtechceu/gtceu/api/gui/widget/directional/handlers/AutoOutputFluidConfigHandler.java index 52d88b34306..2803528e134 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/directional/handlers/AutoOutputFluidConfigHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/api/gui/widget/directional/handlers/AutoOutputFluidConfigHandler.java @@ -4,8 +4,7 @@ import com.gregtechceu.gtceu.api.gui.fancy.FancyMachineUIWidget; import com.gregtechceu.gtceu.api.gui.widget.ToggleButtonWidget; import com.gregtechceu.gtceu.api.gui.widget.directional.IDirectionalConfigHandler; -import com.gregtechceu.gtceu.api.machine.feature.IAutoOutputFluid; -import com.gregtechceu.gtceu.api.machine.feature.IAutoOutputItem; +import com.gregtechceu.gtceu.api.machine.trait.AutoOutputTrait; import com.gregtechceu.gtceu.data.lang.LangHandler; import com.lowdragmc.lowdraglib.gui.texture.GuiTextureGroup; @@ -40,12 +39,12 @@ public class AutoOutputFluidConfigHandler implements IDirectionalConfigHandler { GuiTextures.VANILLA_BUTTON, GuiTextures.IO_CONFIG_FLUID_MODES_BUTTON.getSubTexture(0, 2 / 3f, 1, 1 / 3f)); - private final IAutoOutputFluid machine; + private final AutoOutputTrait trait; private Direction side; private ButtonWidget ioModeButton; - public AutoOutputFluidConfigHandler(IAutoOutputFluid machine) { - this.machine = machine; + public AutoOutputFluidConfigHandler(AutoOutputTrait trait) { + this.trait = trait; } @Override @@ -61,8 +60,8 @@ public void updateScreen() { setButtonTexture(TEXTURE_OFF); setHoverTooltips(LangHandler.getMultiLang("gtceu.gui.fluid_auto_output.unselected") .toArray(Component[]::new)); - } else if (machine.getOutputFacingFluids() == side) { - if (machine.isAutoOutputFluids()) { + } else if (trait.getFluidOutputDirection() == side) { + if (trait.isAutoOutputFluids()) { setButtonTexture(TEXTURE_AUTO); setHoverTooltips("gtceu.gui.fluid_auto_output.enabled"); } else { @@ -79,7 +78,7 @@ public void updateScreen() { group.addWidget(new ToggleButtonWidget( 19, 0, 18, 18, GuiTextures.BUTTON_FLUID_OUTPUT, - machine::isAllowInputFromOutputSideFluids, machine::setAllowInputFromOutputSideFluids) + trait::allowsFluidInputFromOutputSide, trait::setAllowFluidInputFromOutputSide) .setShouldUseBaseBackground().setTooltipText("gtceu.gui.fluid_auto_output.allow_input")); return group; @@ -89,11 +88,11 @@ private void onIOModePressed(ClickData cd) { if (this.side == null) return; - if (machine.getOutputFacingFluids() == this.side) { - machine.setAutoOutputFluids(!machine.isAutoOutputFluids()); + if (trait.getFluidOutputDirection() == this.side) { + trait.setAllowAutoOutputFluids(!trait.isAutoOutputFluids()); } else { - machine.setAutoOutputFluids(false); - machine.setOutputFacingFluids(this.side); + trait.setAllowAutoOutputFluids(false); + trait.setFluidOutputDirection(this.side); } } @@ -109,14 +108,14 @@ public ScreenSide getScreenSide() { @Override public void handleClick(ClickData cd, Direction direction) { - if (!canHandleClick(cd) || !machine.hasAutoOutputFluid()) + if (!canHandleClick(cd) || !trait.supportsAutoOutputFluids()) return; - if (machine.getOutputFacingFluids() != side) { - machine.setOutputFacingFluids(side); - machine.setAutoOutputFluids(false); + if (trait.getFluidOutputDirection() != side) { + trait.setFluidOutputDirection(side); + trait.setAllowAutoOutputFluids(false); } else { - machine.setAutoOutputFluids(!machine.isAutoOutputFluids()); + trait.setAllowAutoOutputFluids(!trait.isAutoOutputFluids()); } } @@ -125,20 +124,17 @@ private boolean canHandleClick(ClickData cd) { if (cd.button == 1) return true; - if (!(machine instanceof IAutoOutputItem) && cd.button == 0) - return true; - return false; } @Override @OnlyIn(Dist.CLIENT) public void renderOverlay(SceneWidget sceneWidget, BlockPosFace blockPosFace) { - if (machine.getOutputFacingFluids() != blockPosFace.facing) + if (trait.getFluidOutputDirection() != blockPosFace.facing) return; sceneWidget.drawFacingBorder(new PoseStack(), blockPosFace, - machine.isAutoOutputFluids() ? 0xff00b4ff : 0x8f00b4ff, 2); + trait.isAutoOutputFluids() ? 0xff00b4ff : 0x8f00b4ff, 2); } @Override @@ -147,7 +143,7 @@ public void addAdditionalUIElements(WidgetGroup parent) { @Override public boolean isVisible() { - return machine.isAutoOutputFluids() && machine.getOutputFacingFluids() != null; + return trait.isAutoOutputFluids() && trait.getFluidOutputDirection() != null; } }; diff --git a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/directional/handlers/AutoOutputItemConfigHandler.java b/src/main/java/com/gregtechceu/gtceu/api/gui/widget/directional/handlers/AutoOutputItemConfigHandler.java index fb474eca88d..d8a1d7911a6 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/gui/widget/directional/handlers/AutoOutputItemConfigHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/api/gui/widget/directional/handlers/AutoOutputItemConfigHandler.java @@ -4,8 +4,7 @@ import com.gregtechceu.gtceu.api.gui.fancy.FancyMachineUIWidget; import com.gregtechceu.gtceu.api.gui.widget.ToggleButtonWidget; import com.gregtechceu.gtceu.api.gui.widget.directional.IDirectionalConfigHandler; -import com.gregtechceu.gtceu.api.machine.feature.IAutoOutputFluid; -import com.gregtechceu.gtceu.api.machine.feature.IAutoOutputItem; +import com.gregtechceu.gtceu.api.machine.trait.AutoOutputTrait; import com.gregtechceu.gtceu.data.lang.LangHandler; import com.lowdragmc.lowdraglib.gui.texture.GuiTextureGroup; @@ -39,12 +38,12 @@ public class AutoOutputItemConfigHandler implements IDirectionalConfigHandler { GuiTextures.VANILLA_BUTTON, GuiTextures.IO_CONFIG_ITEM_MODES_BUTTON.getSubTexture(0, 2 / 3f, 1, 1 / 3f)); - private final IAutoOutputItem machine; + private final AutoOutputTrait trait; private Direction side; private ButtonWidget ioModeButton; - public AutoOutputItemConfigHandler(IAutoOutputItem machine) { - this.machine = machine; + public AutoOutputItemConfigHandler(AutoOutputTrait trait) { + this.trait = trait; } @Override @@ -61,8 +60,8 @@ public void updateScreen() { setButtonTexture(TEXTURE_OFF); setHoverTooltips(LangHandler.getMultiLang("gtceu.gui.item_auto_output.unselected") .toArray(Component[]::new)); - } else if (machine.getOutputFacingItems() == side) { - if (machine.isAutoOutputItems()) { + } else if (trait.getItemOutputDirection() == side) { + if (trait.isAutoOutputItems()) { setButtonTexture(TEXTURE_AUTO); setHoverTooltips("gtceu.gui.item_auto_output.enabled"); } else { @@ -79,7 +78,7 @@ public void updateScreen() { group.addWidget(new ToggleButtonWidget( 19, 0, 18, 18, GuiTextures.BUTTON_ITEM_OUTPUT, - machine::isAllowInputFromOutputSideItems, machine::setAllowInputFromOutputSideItems) + trait::allowsItemInputFromOutputSide, trait::setAllowItemInputFromOutputSide) .setShouldUseBaseBackground().setTooltipText("gtceu.gui.item_auto_output.allow_input")); return group; @@ -89,11 +88,11 @@ private void onIOModePressed(ClickData cd) { if (this.side == null) return; - if (machine.getOutputFacingItems() == this.side) { - machine.setAutoOutputItems(!machine.isAutoOutputItems()); + if (trait.getItemOutputDirection() == this.side) { + trait.setAllowAutoOutputItems(!trait.isAutoOutputItems()); } else { - machine.setAutoOutputItems(false); - machine.setOutputFacingItems(this.side); + trait.setAllowAutoOutputItems(false); + trait.setItemOutputDirection(this.side); } } @@ -109,14 +108,14 @@ public ScreenSide getScreenSide() { @Override public void handleClick(ClickData cd, Direction direction) { - if (!canHandleClick(cd) || !machine.hasAutoOutputItem()) + if (!canHandleClick(cd) || !trait.supportsAutoOutputItems()) return; - if (machine.getOutputFacingItems() != side) { - machine.setOutputFacingItems(side); - machine.setAutoOutputItems(false); + if (trait.getItemOutputDirection() != side) { + trait.setItemOutputDirection(side); + trait.setAllowAutoOutputItems(false); } else { - machine.setAutoOutputItems(!machine.isAutoOutputItems()); + trait.setAllowAutoOutputItems(!trait.isAutoOutputItems()); } } @@ -125,20 +124,17 @@ private boolean canHandleClick(ClickData cd) { if (cd.button == 0) return true; - if (!(machine instanceof IAutoOutputFluid) && cd.button == 1) - return true; - return false; } @Override @OnlyIn(Dist.CLIENT) public void renderOverlay(SceneWidget sceneWidget, BlockPosFace blockPosFace) { - if (machine.getOutputFacingItems() != blockPosFace.facing) + if (trait.getItemOutputDirection() != blockPosFace.facing) return; sceneWidget.drawFacingBorder(new PoseStack(), blockPosFace, - machine.isAutoOutputItems() ? 0xffff6e0f : 0x8fff6e0f, 1); + trait.isAutoOutputItems() ? 0xffff6e0f : 0x8fff6e0f, 1); } @Override @@ -147,7 +143,7 @@ public void addAdditionalUIElements(WidgetGroup parent) { @Override public boolean isVisible() { - return machine.isAutoOutputItems() && machine.getOutputFacingItems() != null; + return trait.isAutoOutputItems() && trait.getItemOutputDirection() != null; } }; diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java index 6b3b1c21f55..48cd480efab 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java @@ -21,6 +21,7 @@ import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMaintenanceMachine; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; +import com.gregtechceu.gtceu.api.machine.trait.AutoOutputTrait; import com.gregtechceu.gtceu.api.machine.trait.MachineTrait; import com.gregtechceu.gtceu.api.machine.trait.MachineTraitHolder; import com.gregtechceu.gtceu.api.machine.trait.feature.IFrontFacingTrait; @@ -40,10 +41,10 @@ import com.gregtechceu.gtceu.common.cover.FluidFilterCover; import com.gregtechceu.gtceu.common.cover.ItemFilterCover; import com.gregtechceu.gtceu.common.cover.data.ManualIOMode; -import com.gregtechceu.gtceu.common.item.tool.behavior.ToolModeSwitchBehavior; import com.gregtechceu.gtceu.common.machine.owner.MachineOwner; import com.gregtechceu.gtceu.common.machine.owner.PlayerOwner; import com.gregtechceu.gtceu.utils.GTUtil; +import com.gregtechceu.gtceu.utils.data.TagCompatibilityFixer; import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; @@ -101,8 +102,6 @@ import javax.annotation.ParametersAreNonnullByDefault; -import static com.gregtechceu.gtceu.api.item.tool.ToolHelper.getBehaviorsTag; - @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class MetaMachine extends ManagedSyncBlockEntity implements IGregtechBlockEntity, IToolable, IToolGridHighlight, @@ -178,6 +177,12 @@ public void onRemoved() { if (this instanceof IMachineLife l) l.onMachineRemoved(); } + @Override + public void load(CompoundTag tag) { + TagCompatibilityFixer.fixMachineAutoOutputTag(tag); + super.load(tag); + } + @MustBeInvokedByOverriders public void onLoad() { getTraitHolder().getAllTraits().forEach(MachineTrait::onMachineLoad); @@ -374,26 +379,9 @@ protected InteractionResult onWrenchClick(Player playerIn, InteractionHand hand, return InteractionResult.FAIL; } setFrontFacing(gridSide); - } else { - var itemStack = playerIn.getItemInHand(hand); - var tagCompound = getBehaviorsTag(itemStack); - ToolModeSwitchBehavior.WrenchModeType type = ToolModeSwitchBehavior.WrenchModeType.values()[tagCompound - .getByte("Mode")]; - - if (type.isItem()) { - if (this instanceof IAutoOutputItem autoOutputItem && - (!hasFrontFacing() || gridSide != getFrontFacing())) { - autoOutputItem.setOutputFacingItems(gridSide); - } - } - if (type.isFluid()) { - if (this instanceof IAutoOutputFluid autoOutputFluid && - (!hasFrontFacing() || gridSide != getFrontFacing())) { - autoOutputFluid.setOutputFacingFluids(gridSide); - } - } + return InteractionResult.sidedSuccess(isRemote()); } - return InteractionResult.sidedSuccess(isRemote()); + return InteractionResult.PASS; } protected InteractionResult onSoftMalletClick(Player playerIn, InteractionHand hand, Direction gridSide, @@ -411,51 +399,6 @@ protected InteractionResult onSoftMalletClick(Player playerIn, InteractionHand h protected InteractionResult onScrewdriverClick(Player playerIn, InteractionHand hand, Direction gridSide, BlockHitResult hitResult) { if (isRemote()) return InteractionResult.SUCCESS; - if (playerIn.isShiftKeyDown()) { - boolean changed = false; - if (this instanceof IAutoOutputItem autoOutputItem) { - if (autoOutputItem.getOutputFacingItems() == gridSide) { - autoOutputItem.setAllowInputFromOutputSideItems(!autoOutputItem.isAllowInputFromOutputSideItems()); - playerIn.displayClientMessage(Component - .translatable("gtceu.machine.basic.input_from_output_side." + - (autoOutputItem.isAllowInputFromOutputSideItems() ? "allow" : "disallow")) - .append(Component.translatable("gtceu.creative.chest.item")), true); - changed = true; - } - } - if (this instanceof IAutoOutputFluid autoOutputFluid) { - if (autoOutputFluid.getOutputFacingFluids() == gridSide) { - autoOutputFluid - .setAllowInputFromOutputSideFluids(!autoOutputFluid.isAllowInputFromOutputSideFluids()); - playerIn.displayClientMessage(Component - .translatable("gtceu.machine.basic.input_from_output_side." + - (autoOutputFluid.isAllowInputFromOutputSideFluids() ? "allow" : "disallow")) - .append(Component.translatable("gtceu.creative.tank.fluid")), true); - changed = true; - } - } - if (changed) { - return InteractionResult.sidedSuccess(playerIn.level().isClientSide); - } - } else { - boolean changed = false; - if (this instanceof IAutoOutputItem autoOutputItem) { - if (autoOutputItem.getOutputFacingItems() == gridSide) { - autoOutputItem.setAutoOutputItems(!autoOutputItem.isAutoOutputItems()); - changed = true; - } - } - if (this instanceof IAutoOutputFluid autoOutputFluid) { - if (autoOutputFluid.getOutputFacingFluids() == gridSide) { - autoOutputFluid.setAutoOutputFluids(!autoOutputFluid.isAutoOutputFluids()); - changed = true; - - } - } - if (changed) { - return InteractionResult.sidedSuccess(playerIn.level().isClientSide); - } - } return InteractionResult.PASS; } @@ -526,9 +469,6 @@ public void clearInventory(IItemHandlerModifiable inventory) { public boolean shouldRenderGrid(Player player, BlockPos pos, BlockState state, ItemStack held, Set toolTypes) { if (toolTypes.contains(GTToolType.WRENCH)) return true; - if (toolTypes.contains(GTToolType.SCREWDRIVER) && - (this instanceof IAutoOutputItem || this instanceof IAutoOutputFluid)) - return true; for (CoverBehavior cover : coverContainer.getCovers()) { if (cover.shouldRenderGrid(player, pos, state, held, toolTypes)) return true; } @@ -536,7 +476,7 @@ public boolean shouldRenderGrid(Player player, BlockPos pos, BlockState state, I for (var trait : getTraitHolder().getAllTraits()) { if (trait instanceof IRenderingTrait renderingTrait) { var result = renderingTrait.shouldRenderGridOverlay(player, pos, state, held, toolTypes); - if (result) return result; + if (result) return true; } } @@ -553,7 +493,7 @@ public boolean shouldRenderGrid(Player player, BlockPos pos, BlockState state, I } if (toolTypes.contains(GTToolType.WRENCH)) { - if (!player.isShiftKeyDown()) { + if (player.isShiftKeyDown()) { if (isFacingValid(side) || (allowExtendedFacing() && hasFrontFacing() && side == getFrontFacing())) { return GuiTextures.TOOL_FRONT_FACING_ROTATION; } @@ -891,8 +831,9 @@ public IItemHandlerModifiable getItemHandlerCap(@Nullable Direction side, boolea if (list.isEmpty()) return null; var io = IO.BOTH; - if (side != null && this instanceof IAutoOutputItem autoOutput && autoOutput.getOutputFacingItems() == side && - !autoOutput.isAllowInputFromOutputSideItems()) { + var autoOutputTrait = getTraitHolder().getTrait(AutoOutputTrait.TYPE); + if (side != null && autoOutputTrait != null && autoOutputTrait.getItemOutputDirection() == side && + !autoOutputTrait.allowsItemInputFromOutputSide()) { io = IO.OUT; } @@ -915,8 +856,9 @@ public IFluidHandlerModifiable getFluidHandlerCap(@Nullable Direction side, bool if (list.isEmpty()) return null; var io = IO.BOTH; - if (side != null && this instanceof IAutoOutputFluid autoOutput && autoOutput.getOutputFacingFluids() == side && - !autoOutput.isAllowInputFromOutputSideFluids()) { + var autoOutputTrait = getTraitHolder().getTrait(AutoOutputTrait.TYPE); + if (side != null && autoOutputTrait != null && autoOutputTrait.getFluidOutputDirection() == side && + !autoOutputTrait.allowsFluidInputFromOutputSide()) { io = IO.OUT; } @@ -1062,7 +1004,7 @@ private static List getCapabilitiesFromTraits(List traits, public static class AE2CallWrapper { public static LazyOptional getGridNodeHostCapability(Capability cap, MetaMachine machine, - Direction side) { + @Nullable Direction side) { if (cap == Capabilities.IN_WORLD_GRID_NODE_HOST) { if (machine instanceof IInWorldGridNodeHost nodeHost) { return Capabilities.IN_WORLD_GRID_NODE_HOST.orEmpty(cap, LazyOptional.of(() -> nodeHost)); diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleTieredMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleTieredMachine.java index 71a9d768080..ef966694592 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleTieredMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleTieredMachine.java @@ -12,22 +12,19 @@ import com.gregtechceu.gtceu.api.gui.fancy.IFancyConfiguratorButton; import com.gregtechceu.gtceu.api.gui.widget.GhostCircuitSlotWidget; import com.gregtechceu.gtceu.api.gui.widget.SlotWidget; -import com.gregtechceu.gtceu.api.item.tool.GTToolType; import com.gregtechceu.gtceu.api.machine.fancyconfigurator.CircuitFancyConfigurator; -import com.gregtechceu.gtceu.api.machine.feature.IAutoOutputBoth; import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine; import com.gregtechceu.gtceu.api.machine.feature.IHasCircuitSlot; +import com.gregtechceu.gtceu.api.machine.trait.AutoOutputTrait; import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; import com.gregtechceu.gtceu.api.recipe.GTRecipeType; import com.gregtechceu.gtceu.api.recipe.ui.GTRecipeTypeUI; -import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; import com.gregtechceu.gtceu.common.item.IntCircuitBehaviour; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.data.lang.LangHandler; -import com.gregtechceu.gtceu.utils.GTTransferUtils; import com.gregtechceu.gtceu.utils.ISubscription; import com.lowdragmc.lowdraglib.gui.texture.GuiTextureGroup; @@ -38,22 +35,14 @@ import com.lowdragmc.lowdraglib.utils.Position; import net.minecraft.Util; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.TickTask; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; import com.google.common.collect.Tables; import com.mojang.blaze3d.MethodsReturnNonnullByDefault; import it.unimi.dsi.fastutil.ints.Int2IntFunction; import lombok.Getter; -import lombok.Setter; import org.jetbrains.annotations.Nullable; import java.util.*; @@ -67,34 +56,8 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class SimpleTieredMachine extends WorkableTieredMachine - implements IAutoOutputBoth, IFancyUIMachine, IHasCircuitSlot { + implements IFancyUIMachine, IHasCircuitSlot { - @SaveField - @SyncToClient - @RerenderOnChanged - protected Direction outputFacingItems; - @SaveField - @SyncToClient - @RerenderOnChanged - protected Direction outputFacingFluids; - @Getter - @SaveField - @SyncToClient - @RerenderOnChanged - protected boolean autoOutputItems; - @Getter - @SaveField - @SyncToClient - @RerenderOnChanged - protected boolean autoOutputFluids; - @Getter - @Setter - @SaveField - protected boolean allowInputFromOutputSideItems; - @Getter - @Setter - @SaveField - protected boolean allowInputFromOutputSideFluids; @Getter @SaveField protected final CustomItemStackHandler chargerInventory; @@ -102,14 +65,17 @@ public class SimpleTieredMachine extends WorkableTieredMachine @SaveField protected final NotifiableItemStackHandler circuitInventory; @Nullable - protected TickableSubscription autoOutputSubs, batterySubs; + protected TickableSubscription batterySubs; @Nullable - protected ISubscription exportItemSubs, exportFluidSubs, energySubs; + protected ISubscription energySubs; + @SaveField + @SyncToClient + public final AutoOutputTrait autoOutput; public SimpleTieredMachine(BlockEntityCreationInfo info, int tier, Int2IntFunction tankScalingFunction) { super(info, tier, tankScalingFunction); - this.outputFacingItems = hasFrontFacing() ? getFrontFacing().getOpposite() : Direction.UP; - this.outputFacingFluids = outputFacingItems; + + this.autoOutput = new AutoOutputTrait(this, List.of(exportItems), List.of(exportFluids)); this.chargerInventory = new CustomItemStackHandler() { @@ -133,12 +99,7 @@ public int getSlotLimit(int slot) { public void onLoad() { super.onLoad(); if (!isRemote()) { - if (getLevel() instanceof ServerLevel serverLevel) { - serverLevel.getServer().tell(new TickTask(0, this::updateAutoOutputSubscription)); - } updateBatterySubscription(); - exportItemSubs = exportItems.addChangedListener(this::updateAutoOutputSubscription); - exportFluidSubs = exportFluids.addChangedListener(this::updateAutoOutputSubscription); energySubs = energyContainer.addChangedListener(this::updateBatterySubscription); chargerInventory.setOnContentsChanged(this::updateBatterySubscription); } @@ -147,108 +108,12 @@ public void onLoad() { @Override public void onUnload() { super.onUnload(); - if (exportItemSubs != null) { - exportItemSubs.unsubscribe(); - exportItemSubs = null; - } - - if (exportFluidSubs != null) { - exportFluidSubs.unsubscribe(); - exportFluidSubs = null; - } - if (energySubs != null) { energySubs.unsubscribe(); energySubs = null; } } - ////////////////////////////////////// - // ******* Auto Output *******// - ////////////////////////////////////// - - @Override - public boolean hasAutoOutputFluid() { - return exportFluids.getTanks() > 0; - } - - @Override - public boolean hasAutoOutputItem() { - return exportItems.getSlots() > 0; - } - - @Override - public @Nullable Direction getOutputFacingFluids() { - if (hasAutoOutputFluid()) { - return outputFacingFluids; - } - return null; - } - - @Override - public @Nullable Direction getOutputFacingItems() { - if (hasAutoOutputItem()) { - return outputFacingItems; - } - return null; - } - - @Override - public void setAutoOutputItems(boolean allow) { - if (hasAutoOutputItem()) { - this.autoOutputItems = allow; - syncDataHolder.markClientSyncFieldDirty("autoOutputItems"); - updateAutoOutputSubscription(); - } - } - - @Override - public void setAutoOutputFluids(boolean allow) { - if (hasAutoOutputFluid()) { - this.autoOutputFluids = allow; - syncDataHolder.markClientSyncFieldDirty("autoOutputFluids"); - updateAutoOutputSubscription(); - } - } - - @Override - public void setOutputFacingFluids(@Nullable Direction outputFacing) { - if (hasAutoOutputFluid()) { - this.outputFacingFluids = outputFacing; - syncDataHolder.markClientSyncFieldDirty("outputFacingFluids"); - updateAutoOutputSubscription(); - } - } - - @Override - public void setOutputFacingItems(@Nullable Direction outputFacing) { - if (hasAutoOutputItem()) { - this.outputFacingItems = outputFacing; - syncDataHolder.markClientSyncFieldDirty("outputFacingItems"); - updateAutoOutputSubscription(); - } - } - - @Override - public void onNeighborChanged(Block block, BlockPos fromPos, boolean isMoving) { - super.onNeighborChanged(block, fromPos, isMoving); - updateAutoOutputSubscription(); - } - - protected void updateAutoOutputSubscription() { - var outputFacingItems = getOutputFacingItems(); - var outputFacingFluids = getOutputFacingFluids(); - if ((isAutoOutputItems() && !exportItems.isEmpty() && outputFacingItems != null && - GTTransferUtils.hasAdjacentItemHandler(getLevel(), getBlockPos(), outputFacingItems)) || - (isAutoOutputFluids() && !exportFluids.isEmpty() && outputFacingFluids != null && - GTTransferUtils.hasAdjacentFluidHandler(getLevel(), getBlockPos(), outputFacingFluids))) { - autoOutputSubs = subscribeServerTick(autoOutputSubs, this::autoOutput); - } else if (autoOutputSubs != null) { - autoOutputSubs.unsubscribe(); - autoOutputSubs = null; - } - } - protected void updateBatterySubscription() { if (energyContainer.dischargeOrRechargeEnergyContainers(chargerInventory, 0, true)) { batterySubs = subscribeServerTick(batterySubs, this::chargeBattery); @@ -264,26 +129,6 @@ protected void chargeBattery() { } } - protected void autoOutput() { - if (getOffsetTimer() % 5 == 0) { - if (isAutoOutputFluids() && getOutputFacingFluids() != null) { - exportFluids.exportToNearby(getOutputFacingFluids()); - } - if (isAutoOutputItems() && getOutputFacingItems() != null) { - exportItems.exportToNearby(getOutputFacingItems()); - } - } - updateAutoOutputSubscription(); - } - - @Override - public boolean isFacingValid(Direction facing) { - if (facing == getOutputFacingItems() || facing == getOutputFacingFluids()) { - return false; - } - return super.isFacingValid(facing); - } - ////////////////////////////////////// // ********** MISC ***********// ////////////////////////////////////// @@ -313,10 +158,10 @@ public long getDisplayRecipeVoltage() { public void attachConfigurators(ConfiguratorPanel configuratorPanel) { IFancyUIMachine.super.attachConfigurators(configuratorPanel); - if (hasAutoOutputFluid()) { + if (autoOutput.supportsAutoOutputFluids()) { configuratorPanel.attachConfigurators(createAutoOutputFluidConfigurator()); } - if (hasAutoOutputItem()) { + if (autoOutput.supportsAutoOutputItems()) { configuratorPanel.attachConfigurators(createAutoOutputItemConfigurator()); } @@ -329,16 +174,16 @@ private IFancyConfigurator createAutoOutputFluidConfigurator() { return createAutoOutputConfigurator( GuiTextures.IO_CONFIG_FLUID_MODES_BUTTON, "gtceu.gui.fluid_auto_output", - this::isAutoOutputFluids, - (cd, nextState) -> this.setAutoOutputFluids(nextState)); + this.autoOutput::isAutoOutputFluids, + (cd, nextState) -> this.autoOutput.setAllowAutoOutputFluids(nextState)); } private IFancyConfigurator createAutoOutputItemConfigurator() { return createAutoOutputConfigurator( GuiTextures.IO_CONFIG_ITEM_MODES_BUTTON, "gtceu.gui.item_auto_output", - this::isAutoOutputItems, - (cd, nextState) -> this.setAutoOutputItems(nextState)); + this.autoOutput::isAutoOutputItems, + (cd, nextState) -> this.autoOutput.setAllowAutoOutputItems(nextState)); } private IFancyConfigurator createAutoOutputConfigurator(ResourceTexture modesButtonTexture, @@ -443,25 +288,4 @@ protected static EditableUI createC protected IGuiTexture getCircuitSlotOverlay() { return GuiTextures.INT_CIRCUIT_OVERLAY; } - - ////////////////////////////////////// - // ******* Rendering ********// - ////////////////////////////////////// - @Override - public @Nullable ResourceTexture sideTips(Player player, BlockPos pos, BlockState state, Set toolTypes, - Direction side) { - if (toolTypes.contains(GTToolType.WRENCH)) { - if (!player.isShiftKeyDown()) { - if (!hasFrontFacing() || side != getFrontFacing()) { - return GuiTextures.TOOL_IO_FACING_ROTATION; - } - } - } - if (toolTypes.contains(GTToolType.SCREWDRIVER)) { - if (side == getOutputFacingItems() || side == getOutputFacingFluids()) { - return GuiTextures.TOOL_ALLOW_INPUT; - } - } - return super.sideTips(player, pos, state, toolTypes, side); - } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/WorkableTieredMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/WorkableTieredMachine.java index 48dec4acd99..ac5eb261ff0 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/WorkableTieredMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/WorkableTieredMachine.java @@ -192,8 +192,7 @@ public void clientTick() { if (previouslyMuffled != isMuffled) { previouslyMuffled = isMuffled; - if (recipeLogic != null) - recipeLogic.updateSound(); + recipeLogic.updateSound(); } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/fancyconfigurator/CombinedDirectionalFancyConfigurator.java b/src/main/java/com/gregtechceu/gtceu/api/machine/fancyconfigurator/CombinedDirectionalFancyConfigurator.java index e2f392b7861..456fa6204ba 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/fancyconfigurator/CombinedDirectionalFancyConfigurator.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/fancyconfigurator/CombinedDirectionalFancyConfigurator.java @@ -10,8 +10,7 @@ import com.gregtechceu.gtceu.api.gui.widget.directional.handlers.AutoOutputItemConfigHandler; import com.gregtechceu.gtceu.api.gui.widget.directional.handlers.CoverableConfigHandler; import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.api.machine.feature.IAutoOutputFluid; -import com.gregtechceu.gtceu.api.machine.feature.IAutoOutputItem; +import com.gregtechceu.gtceu.api.machine.trait.AutoOutputTrait; import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; import com.lowdragmc.lowdraglib.gui.widget.Widget; @@ -76,11 +75,17 @@ public List getTabTooltips() { static { // Left side: CONFIG_HANDLERS.add( - machine -> machine instanceof IAutoOutputItem autoOutputItem && autoOutputItem.hasAutoOutputItem() ? - () -> new AutoOutputItemConfigHandler(autoOutputItem) : null); + machine -> { + var trait = machine.getTraitHolder().getTrait(AutoOutputTrait.TYPE); + return trait != null && trait.supportsAutoOutputItems() ? + () -> new AutoOutputItemConfigHandler(trait) : null; + }); CONFIG_HANDLERS.add( - machine -> machine instanceof IAutoOutputFluid autoOutputFluid && autoOutputFluid.hasAutoOutputFluid() ? - () -> new AutoOutputFluidConfigHandler(autoOutputFluid) : null); + machine -> { + var trait = machine.getTraitHolder().getTrait(AutoOutputTrait.TYPE); + return trait != null && trait.supportsAutoOutputFluids() ? + () -> new AutoOutputFluidConfigHandler(trait) : null; + }); // Right side: CONFIG_HANDLERS.add(machine -> () -> new CoverableConfigHandler(machine.getCoverContainer())); diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IAutoOutputBoth.java b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IAutoOutputBoth.java deleted file mode 100644 index ce21d151ee7..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IAutoOutputBoth.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.gregtechceu.gtceu.api.machine.feature; - -public interface IAutoOutputBoth extends IAutoOutputItem, IAutoOutputFluid, IMachineFeature { - -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IAutoOutputFluid.java b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IAutoOutputFluid.java deleted file mode 100644 index 9a47c81243e..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IAutoOutputFluid.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.gregtechceu.gtceu.api.machine.feature; - -import net.minecraft.core.Direction; - -import org.jetbrains.annotations.Nullable; - -public interface IAutoOutputFluid extends IMachineFeature { - - boolean isAutoOutputFluids(); - - void setAutoOutputFluids(boolean allow); - - boolean isAllowInputFromOutputSideFluids(); - - void setAllowInputFromOutputSideFluids(boolean allow); - - @Nullable - Direction getOutputFacingFluids(); - - void setOutputFacingFluids(@Nullable Direction outputFacing); - - default boolean hasAutoOutputFluid() { - return true; - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IAutoOutputItem.java b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IAutoOutputItem.java deleted file mode 100644 index fb8ad43fd47..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IAutoOutputItem.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.gregtechceu.gtceu.api.machine.feature; - -import net.minecraft.core.Direction; - -import org.jetbrains.annotations.Nullable; - -public interface IAutoOutputItem extends IMachineFeature { - - boolean isAutoOutputItems(); - - void setAutoOutputItems(boolean allow); - - boolean isAllowInputFromOutputSideItems(); - - void setAllowInputFromOutputSideItems(boolean allow); - - @Nullable - Direction getOutputFacingItems(); - - void setOutputFacingItems(@Nullable Direction outputFacing); - - default boolean hasAutoOutputItem() { - return true; - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/MultiblockControllerMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/MultiblockControllerMachine.java index 64ec30a1ccf..6d001cc2ebc 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/MultiblockControllerMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/MultiblockControllerMachine.java @@ -22,11 +22,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResult; -import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.phys.BlockHitResult; import lombok.Getter; import org.jetbrains.annotations.NotNull; @@ -261,26 +257,6 @@ public void setUpwardsFacing(@NotNull Direction upwardsFacing) { } } - @Override - protected InteractionResult onWrenchClick(Player playerIn, InteractionHand hand, Direction gridSide, - BlockHitResult hitResult) { - if (gridSide == getFrontFacing() && allowExtendedFacing()) { - setUpwardsFacing(playerIn.isShiftKeyDown() ? getUpwardsFacing().getCounterClockWise() : - getUpwardsFacing().getClockWise()); - return InteractionResult.sidedSuccess(playerIn.level().isClientSide); - } - if (playerIn.isShiftKeyDown()) { - if (gridSide == getFrontFacing() || !isFacingValid(gridSide)) { - return InteractionResult.FAIL; - } - if (!isRemote()) { - setFrontFacing(gridSide); - } - return InteractionResult.sidedSuccess(playerIn.level().isClientSide); - } - return super.onWrenchClick(playerIn, hand, gridSide, hitResult); - } - @Override public void setFrontFacing(Direction facing) { super.setFrontFacing(facing); diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/AutoOutputTrait.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/AutoOutputTrait.java new file mode 100644 index 00000000000..b11770867d6 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/AutoOutputTrait.java @@ -0,0 +1,400 @@ +package com.gregtechceu.gtceu.api.machine.trait; + +import com.gregtechceu.gtceu.api.capability.recipe.IO; +import com.gregtechceu.gtceu.api.gui.GuiTextures; +import com.gregtechceu.gtceu.api.item.tool.GTToolType; +import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.api.machine.TickableSubscription; +import com.gregtechceu.gtceu.api.machine.trait.feature.IFrontFacingTrait; +import com.gregtechceu.gtceu.api.machine.trait.feature.IInteractionTrait; +import com.gregtechceu.gtceu.api.machine.trait.feature.IRenderingTrait; +import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; +import com.gregtechceu.gtceu.common.item.tool.behavior.ToolModeSwitchBehavior; +import com.gregtechceu.gtceu.utils.GTTransferUtils; +import com.gregtechceu.gtceu.utils.ISubscription; + +import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; +import net.minecraft.network.chat.Component; +import net.minecraft.server.TickTask; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.phys.BlockHitResult; +import net.minecraftforge.fluids.capability.IFluidHandler; +import net.minecraftforge.items.IItemHandler; + +import com.mojang.datafixers.util.Pair; +import lombok.Getter; +import lombok.Setter; +import org.jetbrains.annotations.Nullable; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Set; +import java.util.function.Predicate; + +import static com.gregtechceu.gtceu.api.item.tool.ToolHelper.getBehaviorsTag; + +public class AutoOutputTrait extends MachineTrait implements IRenderingTrait, IInteractionTrait, IFrontFacingTrait { + + public static final MachineTraitType TYPE = new MachineTraitType<>(AutoOutputTrait.class); + + @Getter + protected final List itemHandlers; + @Getter + protected final List fluidHandlers; + + @SaveField + @SyncToClient + @RerenderOnChanged + protected @Nullable Direction itemOutputDirection, fluidOutputDirection; + @Getter + @SaveField + @SyncToClient + @RerenderOnChanged + protected boolean autoOutputItems = false; + @Getter + @SaveField + @SyncToClient + @RerenderOnChanged + protected boolean autoOutputFluids = false; + @Setter + @SaveField + protected boolean allowItemInputFromOutputSide = false; + @Setter + @SaveField + protected boolean allowFluidInputFromOutputSide = false; + + @Setter + @Getter + protected int ticksPerCycle = 5; + @Setter + protected Predicate<@Nullable Direction> itemOutputDirectionValidator = $ -> true; + @Setter + protected Predicate<@Nullable Direction> fluidOutputDirectionValidator = $ -> true; + protected @Nullable TickableSubscription itemOutputSub, fluidOutputSub; + protected List itemSubs = new ArrayList<>(); + protected List fluidSubs = new ArrayList<>(); + private final boolean useDefaultToolHandlers; + + public AutoOutputTrait(MetaMachine machine, List itemHandlers, List fluidHandlers, + boolean useDefaultToolHandlers) { + super(machine); + + this.itemOutputDirection = machine.hasFrontFacing() ? machine.getFrontFacing().getOpposite() : Direction.UP; + this.fluidOutputDirection = itemOutputDirection; + + this.itemHandlers = itemHandlers.stream().filter(h -> { + if (h.getSlots() == 0) return false; + if (h instanceof ICapabilityTrait cap) return cap.canCapOutput(); + return true; + }).toList(); + this.fluidHandlers = fluidHandlers.stream().filter(h -> { + if (h.getTanks() == 0) return false; + if (h instanceof ICapabilityTrait cap) return cap.canCapOutput(); + return true; + }).toList(); + this.useDefaultToolHandlers = useDefaultToolHandlers; + } + + public AutoOutputTrait(MetaMachine machine, List itemHandlers, List fluidHandlers) { + this(machine, itemHandlers, fluidHandlers, true); + } + + @Override + public MachineTraitType getTraitType() { + return TYPE; + } + + public static AutoOutputTrait ofItems(MetaMachine machine, IItemHandler... itemHandlers) { + return new AutoOutputTrait(machine, Arrays.asList(itemHandlers), List.of()); + } + + public static AutoOutputTrait ofFluids(MetaMachine machine, IFluidHandler... fluidHandlers) { + return new AutoOutputTrait(machine, List.of(), Arrays.asList(fluidHandlers)); + } + + @Override + public void onMachineLoad() { + super.onMachineLoad(); + if (getLevel() instanceof ServerLevel serverLevel) { + serverLevel.getServer().tell(new TickTask(0, this::updateFluidOutputSubscription)); + serverLevel.getServer().tell(new TickTask(0, this::updateItemOutputSubscription)); + } + for (var handler : itemHandlers) { + if (handler instanceof NotifiableItemStackHandler notifiable) + itemSubs.add(notifiable.addChangedListener(this::updateItemOutputSubscription)); + } + + for (var handler : fluidHandlers) { + if (handler instanceof NotifiableFluidTank notifiable) + fluidSubs.add(notifiable.addChangedListener(this::updateFluidOutputSubscription)); + } + } + + @Override + public void onMachineUnload() { + if (itemOutputSub != null) { + itemOutputSub.unsubscribe(); + itemOutputSub = null; + } + if (fluidOutputSub != null) { + fluidOutputSub.unsubscribe(); + fluidOutputSub = null; + } + itemSubs.forEach(ISubscription::unsubscribe); + itemSubs.clear(); + fluidSubs.forEach(ISubscription::unsubscribe); + fluidSubs.clear(); + super.onMachineUnload(); + } + + @Override + public void onMachineNeighborChanged(Block block, BlockPos fromPos, boolean isMoving) { + updateItemOutputSubscription(); + updateFluidOutputSubscription(); + } + + public boolean supportsAutoOutputItems() { + return !itemHandlers.isEmpty(); + } + + public boolean supportsAutoOutputFluids() { + return !fluidHandlers.isEmpty(); + } + + public @Nullable Direction getItemOutputDirection() { + return supportsAutoOutputItems() ? itemOutputDirection : null; + } + + public @Nullable Direction getFluidOutputDirection() { + return supportsAutoOutputFluids() ? fluidOutputDirection : null; + } + + public boolean allowsItemInputFromOutputSide() { + return allowItemInputFromOutputSide; + } + + public boolean allowsFluidInputFromOutputSide() { + return allowFluidInputFromOutputSide; + } + + public void setAllowAutoOutputItems(boolean allow) { + if (supportsAutoOutputItems()) { + this.autoOutputItems = allow; + syncDataHolder.markClientSyncFieldDirty("autoOutputItems"); + updateItemOutputSubscription(); + } + } + + public void setAllowAutoOutputFluids(boolean allow) { + if (supportsAutoOutputFluids()) { + this.autoOutputFluids = allow; + syncDataHolder.markClientSyncFieldDirty("autoOutputFluids"); + updateFluidOutputSubscription(); + } + } + + public void setFluidOutputDirection(@Nullable Direction outputFacing) { + if (supportsAutoOutputFluids()) { + if (!fluidOutputDirectionValidator.test(outputFacing) || + (machine.hasFrontFacing() && machine.getFrontFacing() == outputFacing)) + return; + this.fluidOutputDirection = outputFacing; + syncDataHolder.markClientSyncFieldDirty("outputFacingFluids"); + updateFluidOutputSubscription(); + } + } + + public void setItemOutputDirection(@Nullable Direction outputFacing) { + if (supportsAutoOutputItems()) { + if (!itemOutputDirectionValidator.test(outputFacing) || + (machine.hasFrontFacing() && machine.getFrontFacing() == outputFacing)) + return; + this.itemOutputDirection = outputFacing; + syncDataHolder.markClientSyncFieldDirty("outputFacingItems"); + updateItemOutputSubscription(); + } + } + + private boolean shouldKeepItemSubscription() { + if (!supportsAutoOutputItems()) return false; + + if (!isAutoOutputItems() || getItemOutputDirection() == null || + !GTTransferUtils.hasAdjacentItemHandler(getLevel(), machine.getBlockPos(), getItemOutputDirection())) + return false; + return true; + } + + private boolean shouldKeepFluidSubscription() { + if (!supportsAutoOutputFluids()) return false; + if (!isAutoOutputFluids() || getFluidOutputDirection() == null || + !GTTransferUtils.hasAdjacentFluidHandler(getLevel(), machine.getBlockPos(), getFluidOutputDirection())) + return false; + return true; + } + + protected void updateItemOutputSubscription() { + if (shouldKeepItemSubscription()) { + itemOutputSub = machine.subscribeServerTick(itemOutputSub, this::autoOutputItems); + } else if (itemOutputSub != null) { + itemOutputSub.unsubscribe(); + itemOutputSub = null; + } + } + + protected void updateFluidOutputSubscription() { + if (shouldKeepFluidSubscription()) { + fluidOutputSub = machine.subscribeServerTick(fluidOutputSub, this::autoOutputFluids); + } else if (fluidOutputSub != null) { + fluidOutputSub.unsubscribe(); + fluidOutputSub = null; + } + } + + protected void autoOutputItems() { + if (machine.getOffsetTimer() % ticksPerCycle == 0 && getItemOutputDirection() != null) { + itemHandlers.forEach(this::exportItemToNearby); + } + updateItemOutputSubscription(); + } + + protected void autoOutputFluids() { + if (machine.getOffsetTimer() % ticksPerCycle == 0 && getFluidOutputDirection() != null) { + fluidHandlers.forEach(this::exportFluidToNearby); + } + updateFluidOutputSubscription(); + } + + private void exportFluidToNearby(IFluidHandler handler) { + var filter = getMachine().getFluidCapFilter(getFluidOutputDirection(), IO.OUT); + GTTransferUtils.getAdjacentFluidHandler(getLevel(), machine.getBlockPos(), getFluidOutputDirection()) + .ifPresent(adj -> GTTransferUtils.transferFluidsFiltered(handler, adj, filter)); + } + + private void exportItemToNearby(IItemHandler handler) { + var filter = getMachine().getItemCapFilter(getItemOutputDirection(), IO.OUT); + GTTransferUtils.getAdjacentItemHandler(getLevel(), machine.getBlockPos(), getItemOutputDirection()) + .ifPresent(adj -> GTTransferUtils.transferItemsFiltered(handler, adj, filter)); + } + + @Override + public boolean isValidFrontFace(Direction direction) { + return direction != getItemOutputDirection() && direction != getFluidOutputDirection(); + } + + @Override + public boolean shouldRenderGridOverlay(Player player, BlockPos pos, BlockState state, ItemStack held, + Set toolTypes) { + return toolTypes.contains(GTToolType.SCREWDRIVER) || toolTypes.contains(GTToolType.WRENCH); + } + + @Override + public @Nullable ResourceTexture getGridOverlayIcon(Player player, BlockPos pos, BlockState state, + Set toolTypes, Direction side) { + if (toolTypes.contains(GTToolType.WRENCH)) { + if (!player.isShiftKeyDown()) { + if (!machine.hasFrontFacing() || side != machine.getFrontFacing()) { + var canSwitchItemOutputToSide = supportsAutoOutputItems() && + itemOutputDirectionValidator.test(side) && side != getItemOutputDirection(); + var canSwitchFluidOutputToSide = supportsAutoOutputFluids() && + fluidOutputDirectionValidator.test(side) && side != getFluidOutputDirection(); + if (canSwitchItemOutputToSide || canSwitchFluidOutputToSide) + return GuiTextures.TOOL_IO_FACING_ROTATION; + } + } + } + if (toolTypes.contains(GTToolType.SCREWDRIVER)) { + if (side == getItemOutputDirection() || side == getFluidOutputDirection()) { + if (player.isShiftKeyDown()) return GuiTextures.TOOL_ALLOW_INPUT; + return GuiTextures.TOOL_AUTO_OUTPUT; + } + } + return null; + } + + @Override + public Pair onToolClick(Set toolType, Player player, + InteractionHand hand, Direction gridSide, + BlockHitResult hitResult) { + if (useDefaultToolHandlers) { + if (toolType.contains(GTToolType.WRENCH)) { + return Pair.of(GTToolType.WRENCH, onWrenchClick(player, hand, gridSide, hitResult)); + } + if (toolType.contains(GTToolType.SCREWDRIVER)) { + return Pair.of(GTToolType.SCREWDRIVER, onScrewdriverClick(player, hand, gridSide, hitResult)); + } + } + return IInteractionTrait.super.onToolClick(toolType, player, hand, gridSide, hitResult); + } + + private InteractionResult onWrenchClick(Player player, InteractionHand hand, Direction gridSide, + BlockHitResult hitResult) { + var itemStack = player.getItemInHand(hand); + var tagCompound = getBehaviorsTag(itemStack); + ToolModeSwitchBehavior.WrenchModeType type = ToolModeSwitchBehavior.WrenchModeType.VALUES[tagCompound + .getByte("Mode")]; + + boolean hasChanged = false; + if (type.isItem()) { + if ((!machine.hasFrontFacing() || gridSide != machine.getFrontFacing()) && + itemOutputDirectionValidator.test(gridSide)) { + setItemOutputDirection(gridSide); + hasChanged = true; + } + } + if (type.isFluid()) { + if ((!machine.hasFrontFacing() || gridSide != machine.getFrontFacing()) && + fluidOutputDirectionValidator.test(gridSide)) { + setFluidOutputDirection(gridSide); + hasChanged = true; + } + } + return hasChanged ? InteractionResult.sidedSuccess(machine.isRemote()) : InteractionResult.PASS; + } + + private InteractionResult onScrewdriverClick(Player player, InteractionHand hand, Direction gridSide, + BlockHitResult hitResult) { + boolean hasChanged = false; + if (player.isShiftKeyDown()) { + if (getItemOutputDirection() == gridSide) { + setAllowItemInputFromOutputSide(!allowsItemInputFromOutputSide()); + player.displayClientMessage(Component + .translatable("gtceu.machine.basic.input_from_output_side." + + (allowsItemInputFromOutputSide() ? "allow" : "disallow")) + .append(Component.translatable("gtceu.creative.chest.item")), true); + hasChanged = true; + } + + if (getFluidOutputDirection() == gridSide) { + setAllowFluidInputFromOutputSide(!allowsFluidInputFromOutputSide()); + player.displayClientMessage(Component + .translatable("gtceu.machine.basic.input_from_output_side." + + (allowsFluidInputFromOutputSide() ? "allow" : "disallow")) + .append(Component.translatable("gtceu.creative.tank.fluid")), true); + hasChanged = true; + } + + } else { + if (getItemOutputDirection() == gridSide) { + setAllowAutoOutputItems(!isAutoOutputItems()); + hasChanged = true; + } + if (getFluidOutputDirection() == gridSide) { + setAllowAutoOutputFluids(!isAutoOutputFluids()); + hasChanged = true; + } + } + return hasChanged ? InteractionResult.sidedSuccess(player.level().isClientSide) : InteractionResult.PASS; + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/FluidTankProxyTrait.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/FluidTankProxyTrait.java index 22d54ff1ef4..3cf525b8fa3 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/FluidTankProxyTrait.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/FluidTankProxyTrait.java @@ -12,6 +12,7 @@ import lombok.Setter; import lombok.experimental.Accessors; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; @Accessors(chain = true) public class FluidTankProxyTrait extends MachineTrait implements IFluidHandlerModifiable, ICapabilityTrait { @@ -27,7 +28,7 @@ public MachineTraitType getTraitType() { public final IO capabilityIO; @Setter @Getter - public IFluidHandlerModifiable proxy; + public @Nullable IFluidHandlerModifiable proxy; public FluidTankProxyTrait(MetaMachine machine, IO capabilityIO) { super(machine); diff --git a/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/NBTSerializableTransformer.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/NBTSerializableTransformer.java index 31b2e54210b..20a03a83877 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/NBTSerializableTransformer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/NBTSerializableTransformer.java @@ -1,6 +1,7 @@ package com.gregtechceu.gtceu.api.sync_system.data_transformers; import com.gregtechceu.gtceu.GTCEu; +import com.gregtechceu.gtceu.utils.data.TagCompatibilityFixer; import net.minecraft.nbt.Tag; import net.minecraftforge.common.util.INBTSerializable; @@ -24,7 +25,7 @@ public Tag serializeNBT(INBTSerializable value, "Sync: Deserialization of INBTSerializable objects requires an existing object, they cannot be instantiated purely from saved data."); return null; } - currentVal.deserializeNBT(ValueTransformer.stripLdlibWrapper(tag)); + currentVal.deserializeNBT(TagCompatibilityFixer.stripLDLibPayloadWrapper(tag)); return currentVal; } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/ValueTransformer.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/ValueTransformer.java index bf1506a9039..22a83bc1f86 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/ValueTransformer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/ValueTransformer.java @@ -3,7 +3,6 @@ import com.gregtechceu.gtceu.api.sync_system.ISyncManaged; import com.gregtechceu.gtceu.api.sync_system.TypeDeclaration; -import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.Tag; import org.jetbrains.annotations.NotNull; @@ -45,20 +44,6 @@ static TagType assertTagType(Class cls, Tag tag, } } - /** - * Extracts the actual data tag from an LDLib tag structure which is present in some serialized objects. - */ - static Tag stripLdlibWrapper(Tag t) { - if (!(t instanceof CompoundTag tag)) return t; - if (tag.contains("p") && tag.contains("t")) { - return tag.getCompound("p"); - } - if (tag.contains("t", Tag.TAG_COMPOUND)) { - return tag.getCompound("t").getCompound("p"); - } - return tag; - } - /** * A method which serializes this value into a tag, based on the current value and provided transformer context. */ diff --git a/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/ListTransformer.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/ListTransformer.java index 9647d994ad6..aa217e318dd 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/ListTransformer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/ListTransformer.java @@ -2,6 +2,7 @@ import com.gregtechceu.gtceu.api.sync_system.data_transformers.ValueTransformer; import com.gregtechceu.gtceu.api.sync_system.data_transformers.ValueTransformers; +import com.gregtechceu.gtceu.utils.data.TagCompatibilityFixer; import net.minecraft.nbt.ListTag; import net.minecraft.nbt.Tag; @@ -52,7 +53,7 @@ public Tag serializeNBT(List value, ValueTransformer.TransformerContext(); List finalCurrent = current; for (var t : listTag) { - T val = getElemTransformer(context).deserializeNBT(ValueTransformer.stripLdlibWrapper(t), + T val = getElemTransformer(context).deserializeNBT(TagCompatibilityFixer.stripLDLibPayloadWrapper(t), getInnerElemContext(null, context)); if (val != null) finalCurrent.add(val); } diff --git a/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/ObjectArrayTransformer.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/ObjectArrayTransformer.java index 1ecd2e5f8f5..1f665105fe0 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/ObjectArrayTransformer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/data_transformers/collections/ObjectArrayTransformer.java @@ -1,6 +1,7 @@ package com.gregtechceu.gtceu.api.sync_system.data_transformers.collections; import com.gregtechceu.gtceu.api.sync_system.data_transformers.ValueTransformer; +import com.gregtechceu.gtceu.utils.data.TagCompatibilityFixer; import net.minecraft.nbt.ListTag; import net.minecraft.nbt.Tag; @@ -49,7 +50,7 @@ public Tag serializeNBT(T[] value, ValueTransformer.TransformerContext cont current = Arrays.copyOf(current, listTag.size()); } for (int i = 0; i < listTag.size(); i++) { - T result = elementTransformer.deserializeNBT(ValueTransformer.stripLdlibWrapper(listTag.get(i)), + T result = elementTransformer.deserializeNBT(TagCompatibilityFixer.stripLDLibPayloadWrapper(listTag.get(i)), getInnerElemContext(current[i], context)); if (result == null) return current; current[i] = result; diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/machine/MachineModel.java b/src/main/java/com/gregtechceu/gtceu/client/model/machine/MachineModel.java index e2a0c4b3c0d..13ff5a4e2b1 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/machine/MachineModel.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/machine/MachineModel.java @@ -3,10 +3,9 @@ import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.machine.MachineDefinition; import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.api.machine.feature.IAutoOutputFluid; -import com.gregtechceu.gtceu.api.machine.feature.IAutoOutputItem; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiController; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; +import com.gregtechceu.gtceu.api.machine.trait.AutoOutputTrait; import com.gregtechceu.gtceu.client.model.BaseBakedModel; import com.gregtechceu.gtceu.client.model.IBlockEntityRendererBakedModel; import com.gregtechceu.gtceu.client.model.TextureOverrideModel; @@ -229,21 +228,22 @@ public List getMachineQuads(@Nullable BlockState blockState, @Nullabl } // render output overlays - if (machine instanceof IAutoOutputItem autoOutputItem) { - var itemFace = autoOutputItem.getOutputFacingItems(); + var outputTrait = machine.getTraitHolder().getTrait(AutoOutputTrait.TYPE); + if (outputTrait != null && outputTrait.supportsAutoOutputItems()) { + var itemFace = outputTrait.getItemOutputDirection(); if (itemFace != null && side == itemFace) { quads.add(StaticFaceBakery.bakeFace(StaticFaceBakery.OUTPUT_OVERLAY, side, pipeOverlaySprite)); - if (autoOutputItem.isAutoOutputItems()) { + if (outputTrait.isAutoOutputItems()) { quads.add(StaticFaceBakery.bakeFace(StaticFaceBakery.AUTO_OUTPUT_OVERLAY, side, itemOutputOverlaySprite)); } } } - if (machine instanceof IAutoOutputFluid autoOutputFluid) { - var fluidFace = autoOutputFluid.getOutputFacingFluids(); + if (outputTrait != null && outputTrait.supportsAutoOutputFluids()) { + var fluidFace = outputTrait.getFluidOutputDirection(); if (fluidFace != null && side == fluidFace) { quads.add(StaticFaceBakery.bakeFace(StaticFaceBakery.OUTPUT_OVERLAY, side, pipeOverlaySprite)); - if (autoOutputFluid.isAutoOutputFluids()) { + if (outputTrait.isAutoOutputFluids()) { quads.add(StaticFaceBakery.bakeFace(StaticFaceBakery.AUTO_OUTPUT_OVERLAY, side, fluidOutputOverlaySprite)); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/MachineConfigCopyBehaviour.java b/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/MachineConfigCopyBehaviour.java index f7990a8dad6..88434f8236d 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/MachineConfigCopyBehaviour.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/MachineConfigCopyBehaviour.java @@ -5,6 +5,7 @@ import com.gregtechceu.gtceu.api.item.component.IInteractionItem; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.feature.*; +import com.gregtechceu.gtceu.api.machine.trait.AutoOutputTrait; import com.gregtechceu.gtceu.common.item.IntCircuitBehaviour; import com.gregtechceu.gtceu.common.machine.owner.MachineOwner; import com.gregtechceu.gtceu.utils.GTTransferUtils; @@ -186,16 +187,19 @@ private static CompoundTag gatherMachineConfig(MetaMachine machine) { tag.putString(FACING_DIR, directionToString(machine.getFrontFacing())); - if (machine instanceof IAutoOutputItem autoOutputItem && autoOutputItem.getOutputFacingItems() != null) { - tag.putString(ITEM_OUTPUT_SIDE, directionToString(autoOutputItem.getOutputFacingItems())); - tag.putBoolean(ITEM_AUTO_OUTPUT, autoOutputItem.isAutoOutputItems()); - tag.putBoolean(ALLOW_ITEM_IN_FROM_OUT, autoOutputItem.isAllowInputFromOutputSideItems()); + var outputTrait = machine.getTraitHolder().getTrait(AutoOutputTrait.TYPE); + if (outputTrait != null && outputTrait.supportsAutoOutputItems() && + outputTrait.getItemOutputDirection() != null) { + tag.putString(ITEM_OUTPUT_SIDE, directionToString(outputTrait.getItemOutputDirection())); + tag.putBoolean(ITEM_AUTO_OUTPUT, outputTrait.isAutoOutputItems()); + tag.putBoolean(ALLOW_ITEM_IN_FROM_OUT, outputTrait.allowsItemInputFromOutputSide()); } - if (machine instanceof IAutoOutputFluid autoOutputFluid && autoOutputFluid.getOutputFacingFluids() != null) { - tag.putString(FLUID_OUTPUT_SIDE, directionToString(autoOutputFluid.getOutputFacingFluids())); - tag.putBoolean(FLUID_AUTO_OUTPUT, autoOutputFluid.isAutoOutputFluids()); - tag.putBoolean(ALLOW_FLUID_IN_FROM_OUT, autoOutputFluid.isAllowInputFromOutputSideFluids()); + if (outputTrait != null && outputTrait.supportsAutoOutputFluids() && + outputTrait.getFluidOutputDirection() != null) { + tag.putString(FLUID_OUTPUT_SIDE, directionToString(outputTrait.getFluidOutputDirection())); + tag.putBoolean(FLUID_AUTO_OUTPUT, outputTrait.isAutoOutputFluids()); + tag.putBoolean(ALLOW_FLUID_IN_FROM_OUT, outputTrait.allowsFluidInputFromOutputSide()); } if (machine instanceof IMufflableMachine mufflableMachine) { @@ -218,20 +222,19 @@ private static CompoundTag gatherMachineConfig(MetaMachine machine) { } private static void pasteMachineConfig(ServerPlayer player, MetaMachine machine, CompoundTag tag) { - if (machine instanceof IAutoOutputItem autoOutputItem) { + var outputTrait = machine.getTraitHolder().getTrait(AutoOutputTrait.TYPE); + if (outputTrait != null) { if (tag.contains(ITEM_OUTPUT_SIDE)) - autoOutputItem.setOutputFacingItems(stringToDirection(tag.getString(ITEM_OUTPUT_SIDE))); - if (tag.contains(ITEM_AUTO_OUTPUT)) autoOutputItem.setAutoOutputItems(tag.getBoolean(ITEM_AUTO_OUTPUT)); + outputTrait.setItemOutputDirection(stringToDirection(tag.getString(ITEM_OUTPUT_SIDE))); + if (tag.contains(ITEM_AUTO_OUTPUT)) outputTrait.setAllowAutoOutputItems(tag.getBoolean(ITEM_AUTO_OUTPUT)); if (tag.contains(ALLOW_ITEM_IN_FROM_OUT)) - autoOutputItem.setAllowInputFromOutputSideItems(tag.getBoolean(ALLOW_ITEM_IN_FROM_OUT)); - } - - if (machine instanceof IAutoOutputFluid autoOutputFluid) { + outputTrait.setAllowItemInputFromOutputSide(tag.getBoolean(ALLOW_ITEM_IN_FROM_OUT)); if (tag.contains(FLUID_OUTPUT_SIDE)) - autoOutputFluid.setOutputFacingFluids(stringToDirection(tag.getString(FLUID_OUTPUT_SIDE))); - if (tag.contains(FLUID_AUTO_OUTPUT)) autoOutputFluid.setAutoOutputFluids(tag.getBoolean(FLUID_AUTO_OUTPUT)); + outputTrait.setFluidOutputDirection(stringToDirection(tag.getString(FLUID_OUTPUT_SIDE))); + if (tag.contains(FLUID_AUTO_OUTPUT)) + outputTrait.setAllowAutoOutputFluids(tag.getBoolean(FLUID_AUTO_OUTPUT)); if (tag.contains(ALLOW_FLUID_IN_FROM_OUT)) - autoOutputFluid.setAllowInputFromOutputSideFluids(tag.getBoolean(ALLOW_FLUID_IN_FROM_OUT)); + outputTrait.setAllowFluidInputFromOutputSide(tag.getBoolean(ALLOW_FLUID_IN_FROM_OUT)); } Direction facingDir = Direction.byName(tag.getString(FACING_DIR)); diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/ToolModeSwitchBehavior.java b/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/ToolModeSwitchBehavior.java index 692109b0de2..8a235fddcbc 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/ToolModeSwitchBehavior.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/ToolModeSwitchBehavior.java @@ -127,6 +127,8 @@ public enum WrenchModeType { FLUID(Component.translatable("gtceu.mode.fluid")), BOTH(Component.translatable("gtceu.mode.both")); + public static final WrenchModeType[] VALUES = values(); + private final Component name; WrenchModeType(Component name) { diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/BlockBreakerMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/BlockBreakerMachine.java index e23dec41b32..5ae4bb47a6e 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/BlockBreakerMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/BlockBreakerMachine.java @@ -10,42 +10,31 @@ import com.gregtechceu.gtceu.api.gui.editor.EditableMachineUI; import com.gregtechceu.gtceu.api.gui.editor.EditableUI; import com.gregtechceu.gtceu.api.gui.widget.SlotWidget; -import com.gregtechceu.gtceu.api.item.tool.GTToolType; import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.TieredEnergyMachine; -import com.gregtechceu.gtceu.api.machine.feature.IAutoOutputItem; import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine; import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; +import com.gregtechceu.gtceu.api.machine.trait.AutoOutputTrait; import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; -import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.data.lang.LangHandler; -import com.gregtechceu.gtceu.utils.GTTransferUtils; import com.gregtechceu.gtceu.utils.ISubscription; -import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; import com.lowdragmc.lowdraglib.utils.Position; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.Util; import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.TickTask; import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResult; -import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.phys.BlockHitResult; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; @@ -53,7 +42,6 @@ import org.jetbrains.annotations.Nullable; import java.util.List; -import java.util.Set; import java.util.function.BiFunction; import javax.annotation.ParametersAreNonnullByDefault; @@ -61,33 +49,26 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class BlockBreakerMachine extends TieredEnergyMachine - implements IAutoOutputItem, IFancyUIMachine, IMachineLife, IControllable { + implements IFancyUIMachine, IMachineLife, IControllable { - @Getter - @SaveField - @SyncToClient - @RerenderOnChanged - protected Direction outputFacingItems; - @Getter - @SaveField - @SyncToClient - @RerenderOnChanged - protected boolean autoOutputItems; @SaveField protected final NotifiableItemStackHandler cache; @Getter @SaveField protected final CustomItemStackHandler chargerInventory; @Nullable - protected TickableSubscription autoOutputSubs, batterySubs, breakerSubs; + protected TickableSubscription batterySubs, breakerSubs; @Nullable - protected ISubscription exportItemSubs, energySubs; + protected ISubscription energySubs; private final int inventorySize; @SyncToClient private int blockBreakProgress = 0; private float currentHardness; private final long energyPerTick; public final float efficiencyMultiplier; + @SaveField + @SyncToClient + public final AutoOutputTrait autoOutput; @Getter @SaveField @@ -100,8 +81,9 @@ public BlockBreakerMachine(BlockEntityCreationInfo info, int tier) { this.cache = createCacheItemHandler(); this.chargerInventory = createChargerItemHandler(); this.energyPerTick = GTValues.V[tier - 1]; - setOutputFacingItems(getFrontFacing().getOpposite()); this.efficiencyMultiplier = 1.0f - getEfficiencyMultiplier(tier); + + this.autoOutput = AutoOutputTrait.ofItems(this, cache); } public static float getEfficiencyMultiplier(int tier) { @@ -136,10 +118,8 @@ public void onLoad() { super.onLoad(); if (!isRemote()) { if (getLevel() instanceof ServerLevel serverLevel) { - serverLevel.getServer().tell(new TickTask(0, this::updateAutoOutputSubscription)); serverLevel.getServer().tell(new TickTask(0, this::updateBreakerSubscription)); } - exportItemSubs = cache.addChangedListener(this::updateAutoOutputSubscription); energySubs = energyContainer.addChangedListener(() -> { this.updateBatterySubscription(); this.updateBreakerSubscription(); @@ -155,10 +135,6 @@ public void onUnload() { energySubs.unsubscribe(); energySubs = null; } - if (exportItemSubs != null) { - exportItemSubs.unsubscribe(); - exportItemSubs = null; - } } @Override @@ -171,7 +147,6 @@ public void onMachineRemoved() { public void onNeighborChanged(Block block, BlockPos fromPos, boolean isMoving) { super.onNeighborChanged(block, fromPos, isMoving); updateBreakerSubscription(); - updateAutoOutputSubscription(); } ////////////////////////////////////// @@ -203,10 +178,11 @@ public void breakerUpdate() { for (ItemStack drop : drops) { var remainder = tryFillCache(drop); if (!remainder.isEmpty()) { - if (getOutputFacingItems() == null) { + if (autoOutput.getItemOutputDirection() == null) { Block.popResource(getLevel(), getBlockPos(), remainder); } else { - Block.popResource(getLevel(), getBlockPos().relative(getOutputFacingItems()), + Block.popResource(getLevel(), + getBlockPos().relative(autoOutput.getItemOutputDirection()), remainder); } } @@ -273,46 +249,6 @@ public boolean drainEnergy(boolean simulate) { ////////////////////////////////////// // ******* Auto Output *******// ////////////////////////////////////// - @Override - public void setAutoOutputItems(boolean allow) { - this.autoOutputItems = allow; - syncDataHolder.markClientSyncFieldDirty("autoOutputItems"); - updateAutoOutputSubscription(); - } - - @Override - public boolean isAllowInputFromOutputSideItems() { - return false; - } - - @Override - public void setAllowInputFromOutputSideItems(boolean allow) {} - - @Override - public void setOutputFacingItems(@Nullable Direction outputFacing) { - this.outputFacingItems = outputFacing; - syncDataHolder.markClientSyncFieldDirty("outputFacingItems"); - updateAutoOutputSubscription(); - } - - protected void updateAutoOutputSubscription() { - var outputFacing = getOutputFacingItems(); - if ((isAutoOutputItems() && !cache.isEmpty()) && outputFacing != null && - GTTransferUtils.hasAdjacentItemHandler(getLevel(), getBlockPos(), outputFacing)) - autoOutputSubs = subscribeServerTick(autoOutputSubs, this::checkAutoOutput); - else if (autoOutputSubs != null) { - autoOutputSubs.unsubscribe(); - autoOutputSubs = null; - } - } - - protected void checkAutoOutput() { - if (getOffsetTimer() % 5 == 0) { - if (isAutoOutputItems() && getOutputFacingItems() != null) - cache.exportToNearby(getOutputFacingItems()); - updateAutoOutputSubscription(); - } - } protected void updateBatterySubscription() { if (energyContainer.dischargeOrRechargeEnergyContainers(chargerInventory, 0, true)) @@ -333,14 +269,6 @@ public boolean shouldWeatherOrTerrainExplosion() { return false; } - @Override - public boolean isFacingValid(Direction facing) { - if (facing == getOutputFacingItems()) { - return false; - } - return super.isFacingValid(facing); - } - public void setWorkingEnabled(boolean workingEnabled) { isWorkingEnabled = workingEnabled; syncDataHolder.markClientSyncFieldDirty("isWorkingEnabled"); @@ -423,68 +351,4 @@ protected static EditableUI createTemplate(int }); }); } - - ////////////////////////////////////// - // ******* Rendering ********// - ////////////////////////////////////// - @Override - public @Nullable ResourceTexture sideTips(Player player, BlockPos pos, BlockState state, Set toolTypes, - Direction side) { - if (toolTypes.contains(GTToolType.WRENCH)) { - if (!player.isShiftKeyDown()) { - if (!hasFrontFacing() || side != getFrontFacing()) { - return GuiTextures.TOOL_IO_FACING_ROTATION; - } - } - } else if (toolTypes.contains(GTToolType.SOFT_MALLET)) { - return isWorkingEnabled ? GuiTextures.TOOL_PAUSE : GuiTextures.TOOL_START; - } else if (toolTypes.contains(GTToolType.SCREWDRIVER)) { - if (side == getOutputFacingItems()) { - return GuiTextures.TOOL_ALLOW_INPUT; - } - } - return super.sideTips(player, pos, state, toolTypes, side); - } - - ////////////////////////////////////// - // ******* Interactions ********// - ////////////////////////////////////// - @Override - protected InteractionResult onWrenchClick(Player playerIn, InteractionHand hand, Direction gridSide, - BlockHitResult hitResult) { - if (!playerIn.isShiftKeyDown() && !isRemote()) { - var tool = playerIn.getItemInHand(hand); - if (tool.getDamageValue() >= tool.getMaxDamage()) return InteractionResult.PASS; - if (hasFrontFacing() && gridSide == getFrontFacing()) return InteractionResult.PASS; - - // important not to use getters here, which have different logic - Direction itemFacing = this.outputFacingItems; - - if (gridSide != itemFacing) { - // if it is a new side, move it - setOutputFacingItems(gridSide); - } else { - // remove the output facing when wrenching the current one to disable it - setOutputFacingItems(null); - } - return InteractionResult.sidedSuccess(playerIn.level().isClientSide); - } - - return super.onWrenchClick(playerIn, hand, gridSide, hitResult); - } - - @Override - protected InteractionResult onSoftMalletClick(Player playerIn, InteractionHand hand, Direction gridSide, - BlockHitResult hitResult) { - var controllable = GTCapabilityHelper.getControllable(getLevel(), getBlockPos(), gridSide); - if (controllable != null) { - if (!isRemote()) { - controllable.setWorkingEnabled(!controllable.isWorkingEnabled()); - playerIn.sendSystemMessage(Component.translatable(controllable.isWorkingEnabled() ? - "behaviour.soft_hammer.enabled" : "behaviour.soft_hammer.disabled")); - } - return InteractionResult.CONSUME; - } - return InteractionResult.PASS; - } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/FisherMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/FisherMachine.java index 3fed4ad7d57..a4cdfc0dd1f 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/FisherMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/FisherMachine.java @@ -11,59 +11,46 @@ import com.gregtechceu.gtceu.api.gui.editor.EditableUI; import com.gregtechceu.gtceu.api.gui.widget.SlotWidget; import com.gregtechceu.gtceu.api.gui.widget.ToggleButtonWidget; -import com.gregtechceu.gtceu.api.item.tool.GTToolType; import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.TieredEnergyMachine; -import com.gregtechceu.gtceu.api.machine.feature.IAutoOutputItem; import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine; import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; +import com.gregtechceu.gtceu.api.machine.trait.AutoOutputTrait; import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; -import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.data.lang.LangHandler; -import com.gregtechceu.gtceu.utils.GTTransferUtils; import com.gregtechceu.gtceu.utils.ISubscription; import com.lowdragmc.lowdraglib.gui.texture.ItemStackTexture; -import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; import com.lowdragmc.lowdraglib.utils.Position; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.Util; import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; import net.minecraft.core.NonNullList; import net.minecraft.network.chat.MutableComponent; import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.TickTask; import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.EntityType; -import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.projectile.FishingHook; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.material.Fluids; import net.minecraft.world.level.storage.loot.BuiltInLootTables; import net.minecraft.world.level.storage.loot.LootParams; import net.minecraft.world.level.storage.loot.LootTable; import net.minecraft.world.level.storage.loot.parameters.LootContextParamSets; import net.minecraft.world.level.storage.loot.parameters.LootContextParams; -import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.Vec3; import lombok.Getter; import lombok.Setter; import org.jetbrains.annotations.Nullable; -import java.util.Set; import java.util.function.BiFunction; import javax.annotation.ParametersAreNonnullByDefault; @@ -71,18 +58,8 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class FisherMachine extends TieredEnergyMachine - implements IAutoOutputItem, IFancyUIMachine, IMachineLife, IWorkable { + implements IFancyUIMachine, IMachineLife, IWorkable { - @Getter - @SaveField - @SyncToClient - @RerenderOnChanged - protected Direction outputFacingItems; - @Getter - @SaveField - @SyncToClient - @RerenderOnChanged - protected boolean autoOutputItems; @SaveField protected final NotifiableItemStackHandler cache; @Getter @@ -96,9 +73,9 @@ public class FisherMachine extends TieredEnergyMachine @SaveField protected final CustomItemStackHandler chargerInventory; @Nullable - protected TickableSubscription autoOutputSubs, batterySubs, fishingSubs; + protected TickableSubscription batterySubs, fishingSubs; @Nullable - protected ISubscription exportItemSubs, energySubs, baitSubs; + protected ISubscription energySubs, baitSubs; private final long energyPerTick; private final int inventorySize; @@ -126,6 +103,9 @@ public class FisherMachine extends TieredEnergyMachine @SaveField @SyncToClient protected boolean junkEnabled = true; + @SaveField + @SyncToClient + public final AutoOutputTrait autoOutput; public FisherMachine(BlockEntityCreationInfo info, int tier) { super(info, tier); @@ -142,7 +122,7 @@ public FisherMachine(BlockEntityCreationInfo info, int tier) { (ConfigHolder.INSTANCE.compat.energy.nativeEUToFE && GTCapabilityHelper.getForgeEnergyItem(item) != null)); - setOutputFacingItems(getFrontFacing()); + autoOutput = AutoOutputTrait.ofItems(this, cache); } public void setWorkingEnabled(boolean enabled) { @@ -159,11 +139,6 @@ public void setJunkEnabled(boolean enabled) { public void onLoad() { super.onLoad(); if (isRemote()) return; - - if (getLevel() instanceof ServerLevel serverLevel) - serverLevel.getServer().tell(new TickTask(0, this::updateAutoOutputSubscription)); - - exportItemSubs = cache.addChangedListener(this::updateAutoOutputSubscription); energySubs = energyContainer.addChangedListener(() -> { this.updateBatterySubscription(); this.updateFishingUpdateSubscription(); @@ -180,10 +155,6 @@ public void onUnload() { energySubs.unsubscribe(); energySubs = null; } - if (exportItemSubs != null) { - exportItemSubs.unsubscribe(); - exportItemSubs = null; - } if (baitSubs != null) { baitSubs.unsubscribe(); baitSubs = null; @@ -299,23 +270,6 @@ public boolean drainEnergy(boolean simulate) { return false; } - ////////////////////////////////////// - // ******* Auto Output *******// - ////////////////////////////////////// - @Override - public void setAutoOutputItems(boolean allow) { - this.autoOutputItems = allow; - syncDataHolder.markClientSyncFieldDirty("autoOutputItems"); - updateAutoOutputSubscription(); - } - - @Override - public void setOutputFacingItems(@Nullable Direction outputFacing) { - this.outputFacingItems = outputFacing; - syncDataHolder.markClientSyncFieldDirty("outputFacingItems"); - updateAutoOutputSubscription(); - } - protected void updateBatterySubscription() { if (energyContainer.dischargeOrRechargeEnergyContainers(chargerInventory, 0, true)) batterySubs = subscribeServerTick(batterySubs, this::chargeBattery); @@ -325,44 +279,11 @@ else if (batterySubs != null) { } } - protected void updateAutoOutputSubscription() { - var outputFacing = getOutputFacingItems(); - if ((isAutoOutputItems() && !cache.isEmpty()) && outputFacing != null && - GTTransferUtils.hasAdjacentItemHandler(getLevel(), getBlockPos(), outputFacing)) - autoOutputSubs = subscribeServerTick(autoOutputSubs, this::checkAutoOutput); - else if (autoOutputSubs != null) { - autoOutputSubs.unsubscribe(); - autoOutputSubs = null; - } - } - - protected void checkAutoOutput() { - if (getOffsetTimer() % 5 == 0) { - if (isAutoOutputItems() && getOutputFacingItems() != null) - cache.exportToNearby(getOutputFacingItems()); - updateAutoOutputSubscription(); - } - } - protected void chargeBattery() { if (!energyContainer.dischargeOrRechargeEnergyContainers(chargerInventory, 0, false)) updateBatterySubscription(); } - @Override - public boolean isFacingValid(Direction facing) { - if (facing == getOutputFacingItems()) { - return false; - } - return super.isFacingValid(facing); - } - - @Override - public void onNeighborChanged(Block block, BlockPos fromPos, boolean isMoving) { - super.onNeighborChanged(block, fromPos, isMoving); - updateAutoOutputSubscription(); - } - ////////////////////////////////////// // ********** GUI ***********// ////////////////////////////////////// @@ -474,53 +395,4 @@ protected static EditableUI createTemplate(int inven }); }); } - - ////////////////////////////////////// - // ******* Rendering ********// - ////////////////////////////////////// - @Override - public @Nullable ResourceTexture sideTips(Player player, BlockPos pos, BlockState state, Set toolTypes, - Direction side) { - if (toolTypes.contains(GTToolType.WRENCH)) { - if (!player.isShiftKeyDown()) { - if (!hasFrontFacing() || side != getFrontFacing()) { - return GuiTextures.TOOL_IO_FACING_ROTATION; - } - } - } else if (toolTypes.contains(GTToolType.SCREWDRIVER)) { - if (side == getOutputFacingItems()) { - return GuiTextures.TOOL_ALLOW_INPUT; - } - } else if (toolTypes.contains(GTToolType.SOFT_MALLET)) { - return this.isWorkingEnabled ? GuiTextures.TOOL_PAUSE : GuiTextures.TOOL_START; - } - return super.sideTips(player, pos, state, toolTypes, side); - } - - ////////////////////////////////////// - // ******* Interactions ********// - ////////////////////////////////////// - @Override - protected InteractionResult onWrenchClick(Player playerIn, InteractionHand hand, Direction gridSide, - BlockHitResult hitResult) { - if (!playerIn.isShiftKeyDown() && !isRemote()) { - var tool = playerIn.getItemInHand(hand); - if (tool.getDamageValue() >= tool.getMaxDamage()) return InteractionResult.PASS; - if (hasFrontFacing() && gridSide == getFrontFacing()) return InteractionResult.PASS; - - // important not to use getters here, which have different logic - Direction itemFacing = this.outputFacingItems; - - if (gridSide != itemFacing) { - // if it is a new side, move it - setOutputFacingItems(gridSide); - } else { - // remove the output facing when wrenching the current one to disable it - setOutputFacingItems(null); - } - return InteractionResult.sidedSuccess(playerIn.level().isClientSide); - } - - return super.onWrenchClick(playerIn, hand, gridSide, hitResult); - } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ItemCollectorMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ItemCollectorMachine.java index 08abbb811d7..22821876b65 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ItemCollectorMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ItemCollectorMachine.java @@ -12,13 +12,12 @@ import com.gregtechceu.gtceu.api.gui.editor.EditableUI; import com.gregtechceu.gtceu.api.gui.widget.IntInputWidget; import com.gregtechceu.gtceu.api.gui.widget.SlotWidget; -import com.gregtechceu.gtceu.api.item.tool.GTToolType; import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.TieredEnergyMachine; -import com.gregtechceu.gtceu.api.machine.feature.IAutoOutputItem; import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine; import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; +import com.gregtechceu.gtceu.api.machine.trait.AutoOutputTrait; import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; @@ -27,40 +26,29 @@ import com.gregtechceu.gtceu.common.data.GTItems; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.data.lang.LangHandler; -import com.gregtechceu.gtceu.utils.GTTransferUtils; import com.gregtechceu.gtceu.utils.ISubscription; -import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; import com.lowdragmc.lowdraglib.utils.Position; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.Util; import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.TickTask; import net.minecraft.server.level.ServerLevel; import net.minecraft.util.Mth; -import net.minecraft.world.InteractionHand; -import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.item.ItemEntity; -import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.levelgen.structure.BoundingBox; import net.minecraft.world.phys.AABB; -import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.Vec3; import lombok.Getter; import org.jetbrains.annotations.Nullable; import java.util.List; -import java.util.Set; import java.util.function.BiFunction; import javax.annotation.ParametersAreNonnullByDefault; @@ -68,24 +56,13 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class ItemCollectorMachine extends TieredEnergyMachine - implements IAutoOutputItem, IFancyUIMachine, IMachineLife, IWorkable { + implements IFancyUIMachine, IMachineLife, IWorkable { @Getter private static final int[] INVENTORY_SIZES = { 4, 9, 16, 25, 25 }; private static final double MOTION_MULTIPLIER = 0.04; private static final int BASE_EU_CONSUMPTION = 6; - @Nullable - @Getter - @SaveField - @SyncToClient - @RerenderOnChanged - protected Direction outputFacingItems; - @Getter - @SaveField - @SyncToClient - @RerenderOnChanged - protected boolean autoOutputItems; @SaveField protected final NotifiableItemStackHandler output; @@ -96,9 +73,9 @@ public class ItemCollectorMachine extends TieredEnergyMachine protected final CustomItemStackHandler filterInventory; @Nullable - protected TickableSubscription autoOutputSubs, batterySubs, collectionSubs; + protected TickableSubscription batterySubs, collectionSubs; @Nullable - protected ISubscription exportItemSubs, energySubs; + protected ISubscription energySubs; private final long energyPerTick; private final int inventorySize; @@ -125,6 +102,10 @@ public class ItemCollectorMachine extends TieredEnergyMachine @RerenderOnChanged private boolean active = false; + @SaveField + @SyncToClient + public final AutoOutputTrait autoOutput; + public ItemCollectorMachine(BlockEntityCreationInfo info, int tier) { super(info, tier); this.inventorySize = INVENTORY_SIZES[Mth.clamp(getTier(), 0, INVENTORY_SIZES.length - 1)]; @@ -132,10 +113,9 @@ public ItemCollectorMachine(BlockEntityCreationInfo info, int tier) { this.output = createOutputItemHandler(); this.chargerInventory = createChargerItemHandler(); this.filterInventory = createFilterItemHandler(); - + this.autoOutput = AutoOutputTrait.ofItems(this, output); maxRange = (int) Math.pow(2, tier + 2); range = maxRange; - setOutputFacingItems(getFrontFacing()); } ////////////////////////////////////// @@ -168,13 +148,9 @@ public void onLoad() { if (getLevel() instanceof ServerLevel serverLevel) { - serverLevel.getServer().tell(new TickTask(0, () -> { - this.updateAutoOutputSubscription(); - this.updateCollectionSubscription(); - })); + serverLevel.getServer().tell(new TickTask(0, this::updateCollectionSubscription)); } - exportItemSubs = output.addChangedListener(this::updateAutoOutputSubscription); energySubs = energyContainer.addChangedListener(() -> { this.updateBatterySubscription(); this.updateCollectionSubscription(); @@ -189,10 +165,6 @@ public void onUnload() { energySubs.unsubscribe(); energySubs = null; } - if (exportItemSubs != null) { - exportItemSubs.unsubscribe(); - exportItemSubs = null; - } } @Override @@ -301,31 +273,6 @@ public boolean drainEnergy(boolean simulate) { return false; } - ////////////////////////////////////// - // ******* Auto Output *******// - ////////////////////////////////////// - @Override - public void setAutoOutputItems(boolean allow) { - this.autoOutputItems = allow; - syncDataHolder.markClientSyncFieldDirty("autoOutputItems"); - updateAutoOutputSubscription(); - } - - @Override - public boolean isAllowInputFromOutputSideItems() { - return false; - } - - @Override - public void setAllowInputFromOutputSideItems(boolean allow) {} - - @Override - public void setOutputFacingItems(@Nullable Direction outputFacing) { - this.outputFacingItems = outputFacing; - syncDataHolder.markClientSyncFieldDirty("outputFacingItems"); - updateAutoOutputSubscription(); - } - protected void updateBatterySubscription() { if (energyContainer.dischargeOrRechargeEnergyContainers(chargerInventory, 0, true)) batterySubs = subscribeServerTick(batterySubs, this::chargeBattery); @@ -335,45 +282,12 @@ else if (batterySubs != null) { } } - protected void updateAutoOutputSubscription() { - var outputFacing = getOutputFacingItems(); - if ((isAutoOutputItems() && !output.isEmpty()) && outputFacing != null && - GTTransferUtils.hasAdjacentItemHandler(getLevel(), getBlockPos(), outputFacing)) - autoOutputSubs = subscribeServerTick(autoOutputSubs, this::autoOutput); - else if (autoOutputSubs != null) { - autoOutputSubs.unsubscribe(); - autoOutputSubs = null; - } - } - - protected void autoOutput() { - if (getOffsetTimer() % 5 == 0) { - if (isAutoOutputItems() && getOutputFacingItems() != null) - output.exportToNearby(getOutputFacingItems()); - updateAutoOutputSubscription(); - } - } - protected void chargeBattery() { if (!energyContainer.dischargeOrRechargeEnergyContainers(chargerInventory, 0, false)) { updateBatterySubscription(); } } - @Override - public boolean isFacingValid(Direction facing) { - if (facing == getOutputFacingItems()) { - return false; - } - return super.isFacingValid(facing); - } - - @Override - public void onNeighborChanged(Block block, BlockPos fromPos, boolean isMoving) { - super.onNeighborChanged(block, fromPos, isMoving); - updateAutoOutputSubscription(); - } - @Override public int getProgress() { return 0; @@ -496,69 +410,4 @@ protected static EditableUI createTemplate(in }); } - - ////////////////////////////////////// - // ******* Rendering ********// - ////////////////////////////////////// - @Override - public @Nullable ResourceTexture sideTips(Player player, BlockPos pos, BlockState state, Set toolTypes, - Direction side) { - if (toolTypes.contains(GTToolType.WRENCH)) { - if (!player.isShiftKeyDown()) { - if (!hasFrontFacing() || side != getFrontFacing()) { - return GuiTextures.TOOL_IO_FACING_ROTATION; - } - } - } else if (toolTypes.contains(GTToolType.SCREWDRIVER)) { - if (side == getOutputFacingItems()) { - return GuiTextures.TOOL_ALLOW_INPUT; - } - } else if (toolTypes.contains(GTToolType.SOFT_MALLET)) { - return isWorkingEnabled ? GuiTextures.TOOL_PAUSE : GuiTextures.TOOL_START; - } - - return super.sideTips(player, pos, state, toolTypes, side); - } - - ////////////////////////////////////// - // ******* Interactions ********// - ////////////////////////////////////// - @Override - protected InteractionResult onWrenchClick(Player playerIn, InteractionHand hand, Direction gridSide, - BlockHitResult hitResult) { - if (!playerIn.isShiftKeyDown() && !isRemote()) { - var tool = playerIn.getItemInHand(hand); - if (tool.getDamageValue() >= tool.getMaxDamage()) return InteractionResult.PASS; - if (hasFrontFacing() && gridSide == getFrontFacing()) return InteractionResult.PASS; - - // important not to use getters here, which have different logic - Direction itemFacing = this.outputFacingItems; - - if (gridSide != itemFacing) { - // if it is a new side, move it - setOutputFacingItems(gridSide); - } else { - // remove the output facing when wrenching the current one to disable it - setOutputFacingItems(null); - } - return InteractionResult.sidedSuccess(playerIn.level().isClientSide); - } - - return super.onWrenchClick(playerIn, hand, gridSide, hitResult); - } - - @Override - protected InteractionResult onSoftMalletClick(Player playerIn, InteractionHand hand, Direction gridSide, - BlockHitResult hitResult) { - var controllable = GTCapabilityHelper.getControllable(getLevel(), getBlockPos(), gridSide); - if (controllable != null) { - if (!isRemote()) { - controllable.setWorkingEnabled(!controllable.isWorkingEnabled()); - playerIn.sendSystemMessage(Component.translatable(controllable.isWorkingEnabled() ? - "behaviour.soft_hammer.enabled" : "behaviour.soft_hammer.disabled")); - } - return InteractionResult.CONSUME; - } - return InteractionResult.PASS; - } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/MinerMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/MinerMachine.java index 6b278a6ebe8..a5276ee2fe9 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/MinerMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/MinerMachine.java @@ -12,10 +12,9 @@ import com.gregtechceu.gtceu.api.gui.widget.SlotWidget; import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.WorkableTieredMachine; -import com.gregtechceu.gtceu.api.machine.feature.IAutoOutputItem; import com.gregtechceu.gtceu.api.machine.feature.IDataInfoProvider; import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine; -import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; +import com.gregtechceu.gtceu.api.machine.trait.AutoOutputTrait; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; @@ -23,7 +22,6 @@ import com.gregtechceu.gtceu.common.machine.trait.miner.MinerLogic; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.data.lang.LangHandler; -import com.gregtechceu.gtceu.utils.GTTransferUtils; import com.gregtechceu.gtceu.utils.ISubscription; import com.lowdragmc.lowdraglib.gui.widget.ComponentPanelWidget; @@ -34,23 +32,18 @@ import net.minecraft.ChatFormatting; import net.minecraft.Util; -import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.MutableComponent; import net.minecraft.network.chat.Style; import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.TickTask; -import net.minecraft.server.level.ServerLevel; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.block.Block; import net.minecraft.world.phys.BlockHitResult; import com.mojang.blaze3d.MethodsReturnNonnullByDefault; import lombok.Getter; -import lombok.Setter; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -64,30 +57,20 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class MinerMachine extends WorkableTieredMachine - implements IMiner, IControllable, IFancyUIMachine, IDataInfoProvider, IAutoOutputItem { + implements IMiner, IControllable, IFancyUIMachine, IDataInfoProvider { - @Getter - @SaveField - @SyncToClient - @RerenderOnChanged - protected Direction outputFacingItems; - @Getter - @SaveField - @SyncToClient - @RerenderOnChanged - protected boolean autoOutputItems; - @Getter - @Setter - @SaveField - protected boolean allowInputFromOutputSideItems; @Getter @SaveField protected final CustomItemStackHandler chargerInventory; private final long energyPerTick; @Nullable - protected TickableSubscription autoOutputSubs, batterySubs; + protected TickableSubscription batterySubs; @Nullable - protected ISubscription exportItemSubs, energySubs; + protected ISubscription energySubs; + + @SaveField + @SyncToClient + public final AutoOutputTrait autoOutput; public MinerMachine(BlockEntityCreationInfo info, int tier, int speed, int maximumRadius, int fortune) { super(info, tier, @@ -95,6 +78,8 @@ public MinerMachine(BlockEntityCreationInfo info, int tier, int speed, int maxim 0, (tier + 1) * (tier + 1), 0, 0, ($) -> 0); this.energyPerTick = GTValues.V[tier - 1]; this.chargerInventory = createChargerItemHandler(); + this.autoOutput = AutoOutputTrait.ofItems(this, exportItems); + autoOutput.setItemOutputDirectionValidator(d -> d != Direction.DOWN); } ////////////////////////////////////// @@ -122,21 +107,11 @@ public MinerLogic getRecipeLogic() { return (MinerLogic) super.getRecipeLogic(); } - @Override - public void onNeighborChanged(Block block, BlockPos fromPos, boolean isMoving) { - super.onNeighborChanged(block, fromPos, isMoving); - updateAutoOutputSubscription(); - } - @Override public void onLoad() { super.onLoad(); if (!isRemote()) { - if (getLevel() instanceof ServerLevel serverLevel) { - serverLevel.getServer().tell(new TickTask(0, this::updateAutoOutputSubscription)); - } updateBatterySubscription(); - exportItemSubs = exportItems.addChangedListener(this::updateAutoOutputSubscription); energySubs = energyContainer.addChangedListener(this::updateBatterySubscription); chargerInventory.setOnContentsChanged(this::updateBatterySubscription); } @@ -145,11 +120,6 @@ public void onLoad() { @Override public void onUnload() { super.onUnload(); - if (exportItemSubs != null) { - exportItemSubs.unsubscribe(); - exportItemSubs = null; - } - if (energySubs != null) { energySubs.unsubscribe(); energySubs = null; @@ -159,17 +129,6 @@ public void onUnload() { ////////////////////////////////////// // ********** LOGIC **********// ////////////////////////////////////// - protected void updateAutoOutputSubscription() { - var outputFace = getOutputFacingItems(); - if (isAutoOutputItems() && outputFace != null && !exportItems.isEmpty() && - GTTransferUtils.hasAdjacentItemHandler(getLevel(), getBlockPos(), outputFace)) { - autoOutputSubs = subscribeServerTick(autoOutputSubs, this::autoOutput); - } else if (autoOutputSubs != null) { - autoOutputSubs.unsubscribe(); - autoOutputSubs = null; - } - } - protected void updateBatterySubscription() { if (energyContainer.dischargeOrRechargeEnergyContainers(chargerInventory, 0, true)) { batterySubs = subscribeServerTick(batterySubs, this::chargeBattery); @@ -179,31 +138,6 @@ protected void updateBatterySubscription() { } } - protected void autoOutput() { - if (getOffsetTimer() % 5 == 0) { - if (isAutoOutputItems() && getOutputFacingItems() != null) { - exportItems.exportToNearby(getOutputFacingItems()); - } - } - updateAutoOutputSubscription(); - } - - @Override - public void setAutoOutputItems(boolean allow) { - this.autoOutputItems = allow; - syncDataHolder.markClientSyncFieldDirty("autoOutputItems"); - updateAutoOutputSubscription(); - } - - @Override - public void setOutputFacingItems(@Nullable Direction outputFacing) { - if (outputFacing != Direction.DOWN) { - this.outputFacingItems = outputFacing; - syncDataHolder.markClientSyncFieldDirty("outputFacingItems"); - updateAutoOutputSubscription(); - } - } - protected void chargeBattery() { if (!energyContainer.dischargeOrRechargeEnergyContainers(chargerInventory, 0, false)) { updateBatterySubscription(); @@ -280,9 +214,8 @@ protected static EditableUI createTemplate(int invent slot.setCanPutItems(false); } }); - WidgetUtils.widgetByIdForEach(group, "^component_panel$", ComponentPanelWidget.class, panel -> { - panel.textSupplier(machine::addDisplayText); - }); + WidgetUtils.widgetByIdForEach(group, "^component_panel$", ComponentPanelWidget.class, + panel -> panel.textSupplier(machine::addDisplayText)); }); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/PumpMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/PumpMachine.java index a187bc42868..6a8668edc29 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/PumpMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/PumpMachine.java @@ -7,19 +7,16 @@ import com.gregtechceu.gtceu.api.gui.UITemplate; import com.gregtechceu.gtceu.api.gui.widget.TankWidget; import com.gregtechceu.gtceu.api.gui.widget.ToggleButtonWidget; -import com.gregtechceu.gtceu.api.item.tool.GTToolType; import com.gregtechceu.gtceu.api.machine.TieredEnergyMachine; -import com.gregtechceu.gtceu.api.machine.feature.IAutoOutputFluid; import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.feature.IUIMachine; +import com.gregtechceu.gtceu.api.machine.trait.AutoOutputTrait; import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; -import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.common.data.GTBlocks; import com.lowdragmc.lowdraglib.gui.modular.ModularUI; -import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; import com.lowdragmc.lowdraglib.gui.widget.ImageWidget; import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; @@ -57,7 +54,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -public class PumpMachine extends TieredEnergyMachine implements IAutoOutputFluid, IUIMachine, IMachineLife { +public class PumpMachine extends TieredEnergyMachine implements IUIMachine, IMachineLife { public static final int BASE_PUMP_RADIUS = 16; public static final int EXTRA_PUMP_RADIUS = 4; @@ -67,47 +64,24 @@ public class PumpMachine extends TieredEnergyMachine implements IAutoOutputFluid @Getter @SaveField private int pumpHeadY; - @Getter - @SaveField - @SyncToClient - @RerenderOnChanged - protected boolean autoOutputFluids; @SaveField protected final NotifiableFluidTank cache; + @SaveField + @SyncToClient + public final AutoOutputTrait autoOutput; + public PumpMachine(BlockEntityCreationInfo info, int tier) { super(info, tier); this.cache = new NotifiableFluidTank(this, 1, 16 * FluidType.BUCKET_VOLUME * Math.max(1, getTier()), IO.NONE, IO.OUT); + this.autoOutput = AutoOutputTrait.ofFluids(this, cache); } ////////////////////////////////////// // ***** Initialization *****// ////////////////////////////////////// - @Override - public boolean isAllowInputFromOutputSideFluids() { - return false; - } - - @Override - public void setAllowInputFromOutputSideFluids(boolean allow) {} - - @Override - public Direction getOutputFacingFluids() { - return getFrontFacing(); - } - - public void setAutoOutputFluids(boolean autoOutputFluids) { - this.autoOutputFluids = autoOutputFluids; - syncDataHolder.markClientSyncFieldDirty("autoOutputFluids"); - } - - @Override - public void setOutputFacingFluids(@Nullable Direction outputFacing) { - setFrontFacing(outputFacing); - } - @Override public void onLoad() { super.onLoad(); @@ -507,8 +481,8 @@ private void pumpCycle() { } public void update() { - if (getOutputFacingFluids() != null) { - cache.exportToNearby(getOutputFacingFluids()); + if (autoOutput.getFluidOutputDirection() != null) { + cache.exportToNearby(autoOutput.getFluidOutputDirection()); } // do not do anything without enough energy supplied @@ -570,25 +544,10 @@ public ModularUI createUI(Player entityPlayer) { .widget(new TankWidget(cache.getStorages()[0], 90, 35, true, true) .setBackground(GuiTextures.FLUID_SLOT)) .widget(new ToggleButtonWidget(7, 53, 18, 18, - GuiTextures.BUTTON_FLUID_OUTPUT, this::isAutoOutputFluids, this::setAutoOutputFluids) + GuiTextures.BUTTON_FLUID_OUTPUT, this.autoOutput::isAutoOutputFluids, + this.autoOutput::setAllowAutoOutputFluids) .setShouldUseBaseBackground() .setTooltipText("gtceu.gui.fluid_auto_output.tooltip")) .widget(UITemplate.bindPlayerInventory(entityPlayer.getInventory(), GuiTextures.SLOT, 7, 84, true)); } - - ////////////////////////////////////// - // ******* Rendering ********// - ////////////////////////////////////// - @Override - public @Nullable ResourceTexture sideTips(Player player, BlockPos pos, BlockState state, Set toolTypes, - Direction side) { - if (toolTypes.contains(GTToolType.WRENCH)) { - if (player.isShiftKeyDown()) { - if (hasFrontFacing() && side != this.getFrontFacing() && isFacingValid(side)) { - return GuiTextures.TOOL_IO_FACING_ROTATION; - } - } - } - return super.sideTips(player, pos, state, toolTypes, side); - } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/WorldAcceleratorMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/WorldAcceleratorMachine.java index f8c36980058..4828888116c 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/WorldAcceleratorMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/WorldAcceleratorMachine.java @@ -4,7 +4,6 @@ import com.gregtechceu.gtceu.api.GTValues; import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.blockentity.PipeBlockEntity; -import com.gregtechceu.gtceu.api.capability.GTCapabilityHelper; import com.gregtechceu.gtceu.api.capability.IControllable; import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.item.tool.GTToolType; @@ -232,20 +231,6 @@ public void setWorkingEnabled(boolean workingEnabled) { return super.sideTips(player, pos, state, toolTypes, side); } - protected InteractionResult onSoftMalletClick(Player playerIn, InteractionHand hand, Direction gridSide, - BlockHitResult hitResult) { - var controllable = GTCapabilityHelper.getControllable(getLevel(), getBlockPos(), gridSide); - if (controllable != null) { - if (!isRemote()) { - controllable.setWorkingEnabled(!controllable.isWorkingEnabled()); - playerIn.sendSystemMessage(Component.translatable(controllable.isWorkingEnabled() ? - "behaviour.soft_hammer.enabled" : "behaviour.soft_hammer.disabled")); - } - return InteractionResult.CONSUME; - } - return InteractionResult.PASS; - } - @Override protected @NotNull InteractionResult onScrewdriverClick(Player playerIn, InteractionHand hand, Direction gridSide, BlockHitResult hitResult) { diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CentralMonitorMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CentralMonitorMachine.java index b0827e23796..13708588fbb 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CentralMonitorMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CentralMonitorMachine.java @@ -3,7 +3,6 @@ import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.GTCapabilityHelper; -import com.gregtechceu.gtceu.api.capability.ICentralMonitor; import com.gregtechceu.gtceu.api.capability.IMonitorComponent; import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.gui.GuiTextures; @@ -62,7 +61,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class CentralMonitorMachine extends WorkableElectricMultiblockMachine - implements IMonitorComponent, IDataInfoProvider, IMachineLife, ICentralMonitor { + implements IMonitorComponent, IDataInfoProvider, IMachineLife { @SaveField @SyncToClient diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/BufferMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/BufferMachine.java index 710259ffa32..9fa3d889e57 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/BufferMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/BufferMachine.java @@ -5,76 +5,32 @@ import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.gui.widget.SlotWidget; import com.gregtechceu.gtceu.api.gui.widget.TankWidget; -import com.gregtechceu.gtceu.api.item.tool.GTToolType; -import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.TieredMachine; -import com.gregtechceu.gtceu.api.machine.feature.IAutoOutputBoth; import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine; import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; +import com.gregtechceu.gtceu.api.machine.trait.AutoOutputTrait; import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; -import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; -import com.gregtechceu.gtceu.utils.GTTransferUtils; -import com.gregtechceu.gtceu.utils.ISubscription; -import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; import com.lowdragmc.lowdraglib.gui.widget.Widget; import com.lowdragmc.lowdraglib.gui.widget.WidgetGroup; import net.minecraft.MethodsReturnNonnullByDefault; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.server.TickTask; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; import lombok.Getter; -import lombok.Setter; -import org.jetbrains.annotations.Nullable; -import java.util.Set; +import java.util.List; import javax.annotation.ParametersAreNonnullByDefault; @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -public class BufferMachine extends TieredMachine implements IMachineLife, IAutoOutputBoth, IFancyUIMachine { +public class BufferMachine extends TieredMachine implements IMachineLife, IFancyUIMachine { public static final int TANK_SIZE = 64000; - @Getter - @SaveField - @SyncToClient - @RerenderOnChanged - protected @Nullable Direction outputFacingItems; - @Getter - @SaveField - @SyncToClient - @RerenderOnChanged - protected @Nullable Direction outputFacingFluids; - @Getter - @SaveField - @SyncToClient - @RerenderOnChanged - protected boolean autoOutputItems; - @Getter - @SaveField - @SyncToClient - @RerenderOnChanged - protected boolean autoOutputFluids; - @Getter - @Setter - @SaveField - protected boolean allowInputFromOutputSideItems; - @Getter - @Setter - @SaveField - protected boolean allowInputFromOutputSideFluids; - @SaveField @Getter protected final NotifiableItemStackHandler inventory; @@ -82,17 +38,16 @@ public class BufferMachine extends TieredMachine implements IMachineLife, IAutoO @SaveField @Getter protected final NotifiableFluidTank tank; + @SaveField + @SyncToClient - @Nullable - protected TickableSubscription autoOutputSubs; - - @Nullable - protected ISubscription invSubs, tankSubs; + public final AutoOutputTrait autoOutput; public BufferMachine(BlockEntityCreationInfo info, int tier) { super(info, tier); this.inventory = createInventory(); this.tank = createTank(); + this.autoOutput = new AutoOutputTrait(this, List.of(inventory), List.of(tank)); } //////////////////////////////// @@ -115,94 +70,6 @@ protected NotifiableFluidTank createTank() { return new NotifiableFluidTank(this, getTankSize(tier), TANK_SIZE, IO.BOTH); } - @Override - public void onLoad() { - super.onLoad(); - if (getLevel() instanceof ServerLevel serverLevel) { - serverLevel.getServer().tell(new TickTask(0, this::updateAutoOutputSubscription)); - } - this.invSubs = inventory.addChangedListener(this::updateAutoOutputSubscription); - this.tankSubs = tank.addChangedListener(this::updateAutoOutputSubscription); - } - - @Override - public void onUnload() { - super.onUnload(); - if (invSubs != null) { - invSubs.unsubscribe(); - this.invSubs = null; - } - - if (tankSubs != null) { - tankSubs.unsubscribe(); - this.tankSubs = null; - } - } - - //////////////////////////////// - // ******* Auto Output *******// - //////////////////////////////// - - @Override - public void setAutoOutputFluids(boolean allow) { - this.autoOutputFluids = allow; - syncDataHolder.markClientSyncFieldDirty("autoOutputFluids"); - updateAutoOutputSubscription(); - } - - @Override - public void setOutputFacingFluids(@Nullable Direction outputFacing) { - this.outputFacingFluids = outputFacing; - syncDataHolder.markClientSyncFieldDirty("outputFacingFluids"); - updateAutoOutputSubscription(); - } - - @Override - public void setAutoOutputItems(boolean allow) { - this.autoOutputItems = allow; - syncDataHolder.markClientSyncFieldDirty("autoOutputItems"); - updateAutoOutputSubscription(); - } - - @Override - public void setOutputFacingItems(@Nullable Direction outputFacing) { - this.outputFacingItems = outputFacing; - syncDataHolder.markClientSyncFieldDirty("outputFacingItems"); - updateAutoOutputSubscription(); - } - - @Override - public void onNeighborChanged(Block block, BlockPos fromPos, boolean isMoving) { - super.onNeighborChanged(block, fromPos, isMoving); - updateAutoOutputSubscription(); - } - - protected void updateAutoOutputSubscription() { - var outputFacingItems = getOutputFacingItems(); - var outputFacingFluids = getOutputFacingFluids(); - if ((isAutoOutputItems() && !inventory.isEmpty() && outputFacingItems != null && - GTTransferUtils.hasAdjacentItemHandler(getLevel(), getBlockPos(), outputFacingItems)) || - (isAutoOutputFluids() && !tank.isEmpty() && outputFacingFluids != null && - GTTransferUtils.hasAdjacentFluidHandler(getLevel(), getBlockPos(), outputFacingFluids))) { - autoOutputSubs = subscribeServerTick(autoOutputSubs, this::autoOutput); - } else if (autoOutputSubs != null) { - autoOutputSubs.unsubscribe(); - autoOutputSubs = null; - } - } - - protected void autoOutput() { - if (getOffsetTimer() % 5 == 0) { - if (isAutoOutputFluids() && getOutputFacingFluids() != null) { - tank.exportToNearby(getOutputFacingFluids()); - } - if (isAutoOutputItems() && getOutputFacingItems() != null) { - inventory.exportToNearby(getOutputFacingItems()); - } - } - updateAutoOutputSubscription(); - } - //////////////////////////////// // ********** GUI *********** // //////////////////////////////// @@ -234,20 +101,6 @@ public Widget createUIWidget() { return group; } - /////////////////////////////// - // ******* Rendering ********// - /////////////////////////////// - @Override - public @Nullable ResourceTexture sideTips(Player player, BlockPos pos, BlockState state, Set toolTypes, - Direction side) { - if (toolTypes.contains(GTToolType.SCREWDRIVER)) { - if (side == getOutputFacingItems() || side == getOutputFacingFluids()) { - return GuiTextures.TOOL_ALLOW_INPUT; - } - } - return super.sideTips(player, pos, state, toolTypes, side); - } - //////////////////////////////// // ********** Misc ***********// //////////////////////////////// diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CreativeChestMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CreativeChestMachine.java index daef71a5ae5..8a491110788 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CreativeChestMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CreativeChestMachine.java @@ -43,17 +43,14 @@ public CreativeChestMachine(BlockEntityCreationInfo info) { } @Override - protected ItemCache createCacheItemHandler() { - return new InfiniteCache(this); + public void onLoad() { + super.onLoad(); + if (!isRemote()) autoOutput.setTicksPerCycle(ticksPerCycle); } - protected void checkAutoOutput() { - if (getOffsetTimer() % ticksPerCycle == 0) { - if (isAutoOutputItems() && getOutputFacingItems() != null) { - cache.exportToNearby(getOutputFacingItems()); - } - updateAutoOutputSubscription(); - } + @Override + protected ItemCache createCacheItemHandler() { + return new InfiniteCache(this); } private InteractionResult updateStored(ItemStack item) { @@ -65,6 +62,7 @@ private InteractionResult updateStored(ItemStack item) { private void setTicksPerCycle(String value) { if (value.isEmpty()) return; ticksPerCycle = Integer.parseInt(value); + autoOutput.setTicksPerCycle(ticksPerCycle); onItemChanged(); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CreativeTankMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CreativeTankMachine.java index 342762674c6..de4aa043e68 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CreativeTankMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CreativeTankMachine.java @@ -51,13 +51,10 @@ protected FluidCache createCacheFluidHandler() { return new InfiniteCache(this); } - protected void checkAutoOutput() { - if (getOffsetTimer() % ticksPerCycle == 0) { - if (isAutoOutputFluids() && getOutputFacingFluids() != null) { - cache.exportToNearby(getOutputFacingFluids()); - } - updateAutoOutputSubscription(); - } + @Override + public void onLoad() { + super.onLoad(); + if (!isRemote()) autoOutput.setTicksPerCycle(ticksPerCycle); } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/DrumMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/DrumMachine.java index 52053fbaed3..243d8aa7e4d 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/DrumMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/DrumMachine.java @@ -4,35 +4,22 @@ import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.data.chemical.material.Material; import com.gregtechceu.gtceu.api.data.chemical.material.properties.PropertyKey; -import com.gregtechceu.gtceu.api.gui.GuiTextures; -import com.gregtechceu.gtceu.api.item.tool.GTToolType; import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.api.machine.TickableSubscription; -import com.gregtechceu.gtceu.api.machine.feature.IAutoOutputFluid; import com.gregtechceu.gtceu.api.machine.feature.IDropSaveMachine; import com.gregtechceu.gtceu.api.machine.feature.IInteractedMachine; +import com.gregtechceu.gtceu.api.machine.trait.AutoOutputTrait; import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; -import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; -import com.gregtechceu.gtceu.config.ConfigHolder; -import com.gregtechceu.gtceu.utils.GTTransferUtils; import com.gregtechceu.gtceu.utils.ISubscription; -import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; - import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.chat.Component; -import net.minecraft.server.TickTask; -import net.minecraft.server.level.ServerLevel; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.BlockHitResult; import net.minecraftforge.fluids.FluidStack; @@ -42,28 +29,19 @@ import lombok.Getter; import org.jetbrains.annotations.Nullable; -import java.util.Set; +import java.util.List; import javax.annotation.ParametersAreNonnullByDefault; @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -public class DrumMachine extends MetaMachine implements IAutoOutputFluid, IDropSaveMachine, IInteractedMachine { +public class DrumMachine extends MetaMachine implements IDropSaveMachine, IInteractedMachine { - @Getter - @SaveField - @SyncToClient - @RerenderOnChanged - protected boolean autoOutputFluids; - @SaveField - protected boolean allowInputFromOutputSideFluids; @Getter private final int maxStoredFluids; @SaveField protected final NotifiableFluidTank cache; @Nullable - protected TickableSubscription autoOutputSubs; - @Nullable protected ISubscription exportFluidSubs; @SaveField(nbtKey = "Fluid") @SyncToClient @@ -72,11 +50,18 @@ public class DrumMachine extends MetaMachine implements IAutoOutputFluid, IDropS @Getter protected final Material material; + @SaveField + @SyncToClient + public final AutoOutputTrait autoOutput; + public DrumMachine(BlockEntityCreationInfo info, Material material, int maxStoredFluids) { super(info); this.material = material; this.maxStoredFluids = maxStoredFluids; this.cache = createCacheFluidHandler(); + this.autoOutput = new AutoOutputTrait(this, List.of(), List.of(cache), false); + autoOutput.setFluidOutputDirection(Direction.DOWN); + autoOutput.setFluidOutputDirectionValidator(d -> d == Direction.DOWN); } ////////////////////////////////////// @@ -92,9 +77,6 @@ protected NotifiableFluidTank createCacheFluidHandler() { public void onLoad() { super.onLoad(); updateStoredFluidFromCache(); - if (getLevel() instanceof ServerLevel serverLevel) { - serverLevel.getServer().tell(new TickTask(0, this::updateAutoOutputSubscription)); - } this.exportFluidSubs = cache.addChangedListener(this::onFluidChanged); } @@ -102,7 +84,6 @@ private void onFluidChanged() { if (!isRemote()) { syncDataHolder.markClientSyncFieldDirty("stored"); updateStoredFluidFromCache(); - updateAutoOutputSubscription(); } } @@ -143,64 +124,6 @@ public boolean savePickClone() { return false; } - @Override - public void setAutoOutputFluids(boolean allow) { - this.autoOutputFluids = allow; - syncDataHolder.markClientSyncFieldDirty("autoOutputFluids"); - updateAutoOutputSubscription(); - } - - private static boolean canInputFluidsFromOutputSide() { - return ConfigHolder.INSTANCE.machines.allowDrumsInputFluidsFromOutputSide; - } - - @Override - public boolean isAllowInputFromOutputSideFluids() { - return canInputFluidsFromOutputSide() && this.allowInputFromOutputSideFluids; - } - - // always is facing down, and can never accept fluids from output side by default - @Override - public void setAllowInputFromOutputSideFluids(boolean allow) { - this.allowInputFromOutputSideFluids = allow; - } - - @Override - public void setOutputFacingFluids(@Nullable Direction outputFacing) { - updateAutoOutputSubscription(); - } - - @Override - public @Nullable Direction getOutputFacingFluids() { - return Direction.DOWN; - } - - @Override - public void onNeighborChanged(Block block, BlockPos fromPos, boolean isMoving) { - super.onNeighborChanged(block, fromPos, isMoving); - updateAutoOutputSubscription(); - } - - protected void updateAutoOutputSubscription() { - var outputFacing = getOutputFacingFluids(); - if ((isAutoOutputFluids() && !cache.isEmpty()) && outputFacing != null && - GTTransferUtils.hasAdjacentFluidHandler(getLevel(), getBlockPos(), outputFacing)) { - autoOutputSubs = subscribeServerTick(autoOutputSubs, this::checkAutoOutput); - } else if (autoOutputSubs != null) { - autoOutputSubs.unsubscribe(); - autoOutputSubs = null; - } - } - - protected void checkAutoOutput() { - if (getOffsetTimer() % 5 == 0) { - if (isAutoOutputFluids() && getOutputFacingFluids() != null) { - cache.exportToNearby(getOutputFacingFluids()); - } - updateAutoOutputSubscription(); - } - } - @Override public InteractionResult onUse(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) { @@ -213,73 +136,14 @@ public InteractionResult onUse(BlockState state, Level world, BlockPos pos, Play } @Override - public boolean saveBreak() { - return !stored.isEmpty(); - } - - @Override - protected InteractionResult onScrewdriverClick(Player playerIn, InteractionHand hand, Direction gridSide, + protected InteractionResult onScrewdriverClick(Player player, InteractionHand hand, Direction gridSide, BlockHitResult hitResult) { - if (!isRemote()) { - if (canInputFluidsFromOutputSide()) { - setAllowInputFromOutputSideFluids(!isAllowInputFromOutputSideFluids()); - playerIn.sendSystemMessage( - Component - .translatable("gtceu.machine.basic.input_from_output_side." + - (isAllowInputFromOutputSideFluids() ? "allow" : "disallow")) - .append(Component.translatable("gtceu.creative.tank.fluid"))); - } else if (!playerIn.isShiftKeyDown()) { - setAutoOutputFluids(!isAutoOutputFluids()); - playerIn.sendSystemMessage(Component - .translatable("gtceu.machine.drum." + (autoOutputFluids ? "enable" : "disable") + "_output")); - return InteractionResult.SUCCESS; - } - return InteractionResult.SUCCESS; - } - return super.onScrewdriverClick(playerIn, hand, gridSide, hitResult); + autoOutput.setAllowAutoOutputItems(!autoOutput.isAutoOutputItems()); + return InteractionResult.SUCCESS; } @Override - protected InteractionResult onSoftMalletClick(Player playerIn, InteractionHand hand, Direction gridSide, - BlockHitResult hitResult) { - if (!isRemote()) { - if (!playerIn.isShiftKeyDown()) { - setAutoOutputFluids(!isAutoOutputFluids()); - playerIn.sendSystemMessage( - Component.translatable( - "gtceu.machine.drum." + (autoOutputFluids ? "enable" : "disable") + "_output")); - return InteractionResult.SUCCESS; - } - } - return super.onSoftMalletClick(playerIn, hand, gridSide, hitResult); - } - - ////////////////////////////////////// - // ******* Rendering ********// - ////////////////////////////////////// - - @Override - public boolean shouldRenderGrid(Player player, BlockPos pos, BlockState state, ItemStack held, - Set toolTypes) { - return super.shouldRenderGrid(player, pos, state, held, toolTypes) || - toolTypes.contains(GTToolType.SOFT_MALLET) || toolTypes.contains(GTToolType.SCREWDRIVER); - } - - @Override - public @Nullable ResourceTexture sideTips(Player player, BlockPos pos, BlockState state, Set toolTypes, - Direction side) { - if (toolTypes.contains(GTToolType.SOFT_MALLET) || - (!canInputFluidsFromOutputSide() && toolTypes.contains(GTToolType.SCREWDRIVER))) { - if (side == getOutputFacingFluids()) { - return isAutoOutputFluids() ? GuiTextures.TOOL_DISABLE_AUTO_OUTPUT : GuiTextures.TOOL_AUTO_OUTPUT; - } - } - if (canInputFluidsFromOutputSide() && toolTypes.contains(GTToolType.SCREWDRIVER)) { - if (side == getOutputFacingFluids()) { - return GuiTextures.TOOL_ALLOW_INPUT; - } - } - - return super.sideTips(player, pos, state, toolTypes, side); + public boolean saveBreak() { + return !stored.isEmpty(); } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumChestMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumChestMachine.java index 1c1ebcbd898..4a0279a337f 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumChestMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumChestMachine.java @@ -9,15 +9,13 @@ import com.gregtechceu.gtceu.api.gui.widget.ToggleButtonWidget; import com.gregtechceu.gtceu.api.item.tool.GTToolType; import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.TieredMachine; -import com.gregtechceu.gtceu.api.machine.feature.IAutoOutputItem; import com.gregtechceu.gtceu.api.machine.feature.IDropSaveMachine; import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine; import com.gregtechceu.gtceu.api.machine.feature.IInteractedMachine; +import com.gregtechceu.gtceu.api.machine.trait.AutoOutputTrait; import com.gregtechceu.gtceu.api.machine.trait.MachineTrait; import com.gregtechceu.gtceu.api.machine.trait.MachineTraitType; -import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.api.transfer.fluid.IFluidHandlerModifiable; @@ -36,9 +34,6 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.chat.Component; -import net.minecraft.server.TickTask; -import net.minecraft.server.level.ServerLevel; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.player.Player; @@ -51,22 +46,18 @@ import net.minecraftforge.items.IItemHandlerModifiable; import net.minecraftforge.items.ItemHandlerHelper; -import com.mojang.blaze3d.MethodsReturnNonnullByDefault; import it.unimi.dsi.fastutil.objects.Object2LongOpenHashMap; import lombok.Getter; -import lombok.Setter; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.NotNullByDefault; import org.jetbrains.annotations.Nullable; import java.util.Set; import java.util.UUID; import java.util.function.Predicate; -import javax.annotation.ParametersAreNonnullByDefault; - -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -public class QuantumChestMachine extends TieredMachine implements IAutoOutputItem, IInteractedMachine, IControllable, +@NotNullByDefault +public class QuantumChestMachine extends TieredMachine implements IInteractedMachine, IControllable, IDropSaveMachine, IFancyUIMachine { /** @@ -77,20 +68,6 @@ public class QuantumChestMachine extends TieredMachine implements IAutoOutputIte */ public static final Object2LongOpenHashMap INTERACTION_LOGGER = new Object2LongOpenHashMap<>(); - @Getter - @SaveField - @SyncToClient - @RerenderOnChanged - protected @Nullable Direction outputFacingItems; - @Getter - @SaveField - @SyncToClient - @RerenderOnChanged - protected boolean autoOutputItems; - @Getter - @Setter - @SaveField - protected boolean allowInputFromOutputSideItems; @SaveField private boolean isVoiding; @@ -109,15 +86,16 @@ public class QuantumChestMachine extends TieredMachine implements IAutoOutputIte @SaveField protected long storedAmount = 0; - @Nullable - protected TickableSubscription autoOutputSubs; + @SaveField + @SyncToClient + public final AutoOutputTrait autoOutput; public QuantumChestMachine(BlockEntityCreationInfo info, int tier, long maxAmount) { super(info, tier); - this.outputFacingItems = getFrontFacing().getOpposite(); this.maxAmount = maxAmount; this.cache = createCacheItemHandler(); this.lockedItem = new CustomItemStackHandler(); + this.autoOutput = AutoOutputTrait.ofItems(this, cache); lockedItem.setOnContentsChanged(() -> syncDataHolder.markClientSyncFieldDirty("lockedItem")); } @@ -129,19 +107,10 @@ protected ItemCache createCacheItemHandler() { return new ItemCache(this); } - @Override - public void onLoad() { - super.onLoad(); - if (getLevel() instanceof ServerLevel serverLevel) { - serverLevel.getServer().tell(new TickTask(0, this::updateAutoOutputSubscription)); - } - } - protected void onItemChanged() { if (!isRemote()) { syncDataHolder.markClientSyncFieldDirty("storedAmount"); syncDataHolder.markClientSyncFieldDirty("stored"); - updateAutoOutputSubscription(); } } @@ -191,66 +160,20 @@ public void loadFromItem(CompoundTag tag) { // ******* Auto Output *******// ////////////////////////////////////// - @Override - public void setAutoOutputItems(boolean allow) { - this.autoOutputItems = allow; - syncDataHolder.markClientSyncFieldDirty("autoOutputItems"); - updateAutoOutputSubscription(); - } - - @Override - public void setOutputFacingItems(@Nullable Direction outputFacing) { - this.outputFacingItems = outputFacing; - syncDataHolder.markClientSyncFieldDirty("outputFacingItems"); - updateAutoOutputSubscription(); - } - - @Override - public void onNeighborChanged(Block block, BlockPos fromPos, boolean isMoving) { - super.onNeighborChanged(block, fromPos, isMoving); - updateAutoOutputSubscription(); - } - @Override public boolean isWorkingEnabled() { - return isAutoOutputItems(); + return autoOutput.isAutoOutputItems(); } @Override public void setWorkingEnabled(boolean isWorkingAllowed) { - setAutoOutputItems(isWorkingAllowed); - } - - protected void updateAutoOutputSubscription() { - var outputFacing = getOutputFacingItems(); - if ((isAutoOutputItems() && !stored.isEmpty()) && outputFacing != null && - GTTransferUtils.hasAdjacentItemHandler(getLevel(), getBlockPos(), outputFacing)) { - autoOutputSubs = subscribeServerTick(autoOutputSubs, this::checkAutoOutput); - } else if (autoOutputSubs != null) { - autoOutputSubs.unsubscribe(); - autoOutputSubs = null; - } - } - - protected void checkAutoOutput() { - if (getOffsetTimer() % 5 == 0) { - if (isAutoOutputItems() && getOutputFacingItems() != null) { - cache.exportToNearby(getOutputFacingItems()); - } - updateAutoOutputSubscription(); - } + autoOutput.setAllowAutoOutputItems(isWorkingAllowed); } ////////////////////////////////////// // ******* Interaction *******// ////////////////////////////////////// - @Override - public boolean isFacingValid(Direction facing) { - if (facing == outputFacingItems) return false; - return super.isFacingValid(facing); - } - @Override public InteractionResult onUse(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) { @@ -298,46 +221,6 @@ public boolean onLeftClick(Player player, Level world, InteractionHand hand, Blo return IInteractedMachine.super.onLeftClick(player, world, hand, pos, direction); } - @Override - protected InteractionResult onWrenchClick(Player playerIn, InteractionHand hand, Direction gridSide, - BlockHitResult hitResult) { - if (!playerIn.isShiftKeyDown() && !isRemote()) { - var tool = playerIn.getItemInHand(hand); - if (tool.getDamageValue() >= tool.getMaxDamage()) return InteractionResult.PASS; - if (hasFrontFacing() && gridSide == getFrontFacing()) return InteractionResult.PASS; - if (gridSide != getOutputFacingItems()) { - setOutputFacingItems(gridSide); - } else { - setOutputFacingItems(null); - } - return InteractionResult.sidedSuccess(playerIn.level().isClientSide); - } - - return super.onWrenchClick(playerIn, hand, gridSide, hitResult); - } - - @Override - protected InteractionResult onScrewdriverClick(Player playerIn, InteractionHand hand, Direction gridSide, - BlockHitResult hitResult) { - if (!isRemote()) { - if (gridSide == getOutputFacingItems()) { - if (isAllowInputFromOutputSideItems()) { - setAllowInputFromOutputSideItems(false); - playerIn.sendSystemMessage( - Component.translatable("gtceu.machine.basic.input_from_output_side.disallow") - .append(Component.translatable("gtceu.creative.chest.item"))); - } else { - setAllowInputFromOutputSideItems(true); - playerIn.sendSystemMessage( - Component.translatable("gtceu.machine.basic.input_from_output_side.allow") - .append(Component.translatable("gtceu.creative.chest.item"))); - } - } - return InteractionResult.SUCCESS; - } - return super.onScrewdriverClick(playerIn, hand, gridSide, hitResult); - } - public boolean isLocked() { return !lockedItem.getStackInSlot(0).isEmpty(); } @@ -389,7 +272,8 @@ public Widget createUIWidget() { stack -> stored.isEmpty() || GTUtil.isSameItemSameTags(stack, stored)) .setMaxStackSize(1)) .addWidget(new ToggleButtonWidget(4, 41, 18, 18, - GuiTextures.BUTTON_ITEM_OUTPUT, this::isAutoOutputItems, this::setAutoOutputItems) + GuiTextures.BUTTON_ITEM_OUTPUT, this.autoOutput::isAutoOutputItems, + this.autoOutput::setAllowAutoOutputItems) .setShouldUseBaseBackground() .setTooltipText("gtceu.gui.item_auto_output.tooltip")) .addWidget(new ToggleButtonWidget(22, 41, 18, 18, @@ -424,17 +308,7 @@ public Widget createUIWidget() { @Override public @Nullable ResourceTexture sideTips(Player player, BlockPos pos, BlockState state, Set toolTypes, Direction side) { - if (toolTypes.contains(GTToolType.WRENCH)) { - if (!player.isShiftKeyDown()) { - if (!hasFrontFacing() || side != getFrontFacing()) { - return GuiTextures.TOOL_IO_FACING_ROTATION; - } - } - } else if (toolTypes.contains(GTToolType.SCREWDRIVER)) { - if (side == getOutputFacingItems()) { - return GuiTextures.TOOL_ALLOW_INPUT; - } - } else if (toolTypes.contains(GTToolType.SOFT_MALLET)) { + if (toolTypes.contains(GTToolType.SOFT_MALLET)) { if (side == getFrontFacing()) return null; } return super.sideTips(player, pos, state, toolTypes, side); diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumTankMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumTankMachine.java index 4af4e9c4a34..3f267084a31 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumTankMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumTankMachine.java @@ -7,15 +7,13 @@ import com.gregtechceu.gtceu.api.gui.widget.PhantomFluidWidget; import com.gregtechceu.gtceu.api.gui.widget.TankWidget; import com.gregtechceu.gtceu.api.gui.widget.ToggleButtonWidget; -import com.gregtechceu.gtceu.api.item.tool.GTToolType; import com.gregtechceu.gtceu.api.machine.*; -import com.gregtechceu.gtceu.api.machine.feature.IAutoOutputFluid; import com.gregtechceu.gtceu.api.machine.feature.IDropSaveMachine; import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine; import com.gregtechceu.gtceu.api.machine.feature.IInteractedMachine; +import com.gregtechceu.gtceu.api.machine.trait.AutoOutputTrait; import com.gregtechceu.gtceu.api.machine.trait.MachineTrait; import com.gregtechceu.gtceu.api.machine.trait.MachineTraitType; -import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.api.transfer.fluid.CustomFluidTank; @@ -25,7 +23,6 @@ import com.gregtechceu.gtceu.utils.GTTransferUtils; import com.lowdragmc.lowdraglib.gui.editor.ColorPattern; -import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; import com.lowdragmc.lowdraglib.gui.widget.ImageWidget; import com.lowdragmc.lowdraglib.gui.widget.LabelWidget; import com.lowdragmc.lowdraglib.gui.widget.Widget; @@ -34,14 +31,10 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; -import net.minecraft.network.chat.Component; -import net.minecraft.server.TickTask; -import net.minecraft.server.level.ServerLevel; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.BlockHitResult; import net.minecraftforge.fluids.FluidStack; @@ -49,40 +42,21 @@ import net.minecraftforge.fluids.capability.IFluidHandler; import net.minecraftforge.items.IItemHandlerModifiable; -import com.mojang.blaze3d.MethodsReturnNonnullByDefault; import it.unimi.dsi.fastutil.objects.Object2LongArrayMap; import it.unimi.dsi.fastutil.objects.Object2LongMap; import lombok.Getter; -import lombok.Setter; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.NotNullByDefault; import org.jetbrains.annotations.Nullable; -import java.util.Set; import java.util.function.Predicate; -import javax.annotation.ParametersAreNonnullByDefault; - -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -public class QuantumTankMachine extends TieredMachine implements IAutoOutputFluid, IInteractedMachine, IControllable, +@NotNullByDefault +public class QuantumTankMachine extends TieredMachine implements IInteractedMachine, IControllable, IDropSaveMachine, IFancyUIMachine { public static Object2LongMap TANK_CAPACITY = new Object2LongArrayMap<>(); - @Getter - @SaveField - @SyncToClient - @RerenderOnChanged - protected @Nullable Direction outputFacingFluids; - @Getter - @SaveField - @SyncToClient - @RerenderOnChanged - protected boolean autoOutputFluids; - @Getter - @Setter - @SaveField - protected boolean allowInputFromOutputSideFluids; @SaveField private boolean isVoiding; @@ -102,15 +76,16 @@ public class QuantumTankMachine extends TieredMachine implements IAutoOutputFlui @SaveField protected long storedAmount = 0; - @Nullable - protected TickableSubscription autoOutputSubs; + @SaveField + @SyncToClient + public final AutoOutputTrait autoOutput; public QuantumTankMachine(BlockEntityCreationInfo info, int tier, long maxAmount) { super(info, tier); - this.outputFacingFluids = getFrontFacing().getOpposite(); this.maxAmount = maxAmount; this.cache = createCacheFluidHandler(); this.lockedFluid = new CustomFluidTank(1000); + this.autoOutput = AutoOutputTrait.ofFluids(this, cache); } ////////////////////////////////////// @@ -124,16 +99,12 @@ protected FluidCache createCacheFluidHandler() { @Override public void onLoad() { super.onLoad(); - if (getLevel() instanceof ServerLevel serverLevel) { - serverLevel.getServer().tell(new TickTask(0, this::updateAutoOutputSubscription)); - } } protected void onFluidChanged() { if (!isRemote()) { syncDataHolder.markClientSyncFieldDirty("storedAmount"); syncDataHolder.markClientSyncFieldDirty("stored"); - updateAutoOutputSubscription(); } } @@ -167,70 +138,20 @@ public boolean saveBreak() { return super.getFluidHandlerCap(side, useCoverCapability); } - ////////////////////////////////////// - // ******* Auto Output *******// - ////////////////////////////////////// - - @Override - public void setAutoOutputFluids(boolean allow) { - this.autoOutputFluids = allow; - syncDataHolder.markClientSyncFieldDirty("autoOutputFluids"); - updateAutoOutputSubscription(); - } - - @Override - public void setOutputFacingFluids(@Nullable Direction outputFacing) { - this.outputFacingFluids = outputFacing; - syncDataHolder.markClientSyncFieldDirty("outputFacingFluids"); - updateAutoOutputSubscription(); - } - @Override public boolean isWorkingEnabled() { - return isAutoOutputFluids(); + return autoOutput.isAutoOutputFluids(); } @Override public void setWorkingEnabled(boolean isWorkingAllowed) { - setAutoOutputFluids(isWorkingAllowed); - } - - @Override - public void onNeighborChanged(Block block, BlockPos fromPos, boolean isMoving) { - super.onNeighborChanged(block, fromPos, isMoving); - updateAutoOutputSubscription(); - } - - protected void updateAutoOutputSubscription() { - var outputFacing = getOutputFacingFluids(); - if ((isAutoOutputFluids() && !stored.isEmpty()) && outputFacing != null && - GTTransferUtils.hasAdjacentFluidHandler(getLevel(), getBlockPos(), outputFacing)) { - autoOutputSubs = subscribeServerTick(autoOutputSubs, this::checkAutoOutput); - } else if (autoOutputSubs != null) { - autoOutputSubs.unsubscribe(); - autoOutputSubs = null; - } - } - - protected void checkAutoOutput() { - if (getOffsetTimer() % 5 == 0) { - if (isAutoOutputFluids() && getOutputFacingFluids() != null) { - cache.exportToNearby(getOutputFacingFluids()); - } - updateAutoOutputSubscription(); - } + autoOutput.setAllowAutoOutputFluids(isWorkingAllowed); } ////////////////////////////////////// // ******* Interaction *******// ////////////////////////////////////// - @Override - public boolean isFacingValid(Direction facing) { - if (facing == outputFacingFluids) return false; - return super.isFacingValid(facing); - } - @Override public InteractionResult onUse(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) { @@ -242,46 +163,6 @@ public InteractionResult onUse(BlockState state, Level world, BlockPos pos, Play return IInteractedMachine.super.onUse(state, world, pos, player, hand, hit); } - @Override - protected InteractionResult onWrenchClick(Player playerIn, InteractionHand hand, Direction gridSide, - BlockHitResult hitResult) { - if (!playerIn.isShiftKeyDown() && !isRemote()) { - var tool = playerIn.getItemInHand(hand); - if (tool.getDamageValue() >= tool.getMaxDamage()) return InteractionResult.PASS; - if (hasFrontFacing() && gridSide == getFrontFacing()) return InteractionResult.PASS; - if (gridSide != getOutputFacingFluids()) { - setOutputFacingFluids(gridSide); - } else { - setOutputFacingFluids(null); - } - return InteractionResult.sidedSuccess(playerIn.level().isClientSide); - } - - return super.onWrenchClick(playerIn, hand, gridSide, hitResult); - } - - @Override - protected InteractionResult onScrewdriverClick(Player playerIn, InteractionHand hand, Direction gridSide, - BlockHitResult hitResult) { - if (!isRemote()) { - if (gridSide == getOutputFacingFluids()) { - if (isAllowInputFromOutputSideFluids()) { - setAllowInputFromOutputSideFluids(false); - playerIn.sendSystemMessage( - Component.translatable("gtceu.machine.basic.input_from_output_side.disallow") - .append(Component.translatable("gtceu.creative.tank.fluid"))); - } else { - setAllowInputFromOutputSideFluids(true); - playerIn.sendSystemMessage( - Component.translatable("gtceu.machine.basic.input_from_output_side.allow") - .append(Component.translatable("gtceu.creative.tank.fluid"))); - } - } - return InteractionResult.SUCCESS; - } - return super.onScrewdriverClick(playerIn, hand, gridSide, hitResult); - } - public boolean isLocked() { return !lockedFluid.isEmpty(); } @@ -337,7 +218,8 @@ public Widget createUIWidget() { .setShowAmount(false) .setBackground(ColorPattern.T_GRAY.rectTexture())) .addWidget(new ToggleButtonWidget(4, 41, 18, 18, - GuiTextures.BUTTON_FLUID_OUTPUT, this::isAutoOutputFluids, this::setAutoOutputFluids) + GuiTextures.BUTTON_FLUID_OUTPUT, this.autoOutput::isAutoOutputFluids, + this.autoOutput::setAllowAutoOutputFluids) .setShouldUseBaseBackground() .setTooltipText("gtceu.gui.fluid_auto_output.tooltip")) .addWidget(new ToggleButtonWidget(22, 41, 18, 18, @@ -352,28 +234,6 @@ public Widget createUIWidget() { return group; } - ////////////////////////////////////// - // ******* Rendering ********// - ////////////////////////////////////// - @Override - public @Nullable ResourceTexture sideTips(Player player, BlockPos pos, BlockState state, Set toolTypes, - Direction side) { - if (toolTypes.contains(GTToolType.WRENCH)) { - if (!player.isShiftKeyDown()) { - if (!hasFrontFacing() || side != getFrontFacing()) { - return GuiTextures.TOOL_IO_FACING_ROTATION; - } - } - } else if (toolTypes.contains(GTToolType.SCREWDRIVER)) { - if (side == getOutputFacingFluids()) { - return GuiTextures.TOOL_ALLOW_INPUT; - } - } else if (toolTypes.contains(GTToolType.SOFT_MALLET)) { - if (side == getFrontFacing()) return null; - } - return super.sideTips(player, pos, state, toolTypes, side); - } - protected class FluidCache extends MachineTrait implements IFluidHandler { public static final MachineTraitType TYPE = new MachineTraitType<>(FluidCache.class); diff --git a/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java b/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java index 0956ffa83be..c15a4275e3f 100644 --- a/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java +++ b/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java @@ -581,10 +581,6 @@ public static class MachineConfigs { }) public int steamMultiParallelAmount = 8; - @Configurable - @Configurable.Comment("Whether the Drums can input fluids from the output side (bottom).") - public boolean allowDrumsInputFluidsFromOutputSide = false; - @Configurable @Configurable.Comment("Small Steam Boiler Options") public SmallBoilers smallBoilers = new SmallBoilers(); diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEPatternBufferPartMachine.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEPatternBufferPartMachine.java index eef0e3b0589..46c6131fd6d 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEPatternBufferPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEPatternBufferPartMachine.java @@ -41,8 +41,6 @@ import net.minecraft.nbt.ListTag; import net.minecraft.nbt.Tag; import net.minecraft.network.chat.Component; -import net.minecraft.server.TickTask; -import net.minecraft.server.level.ServerLevel; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; @@ -159,17 +157,15 @@ public MEPatternBufferPartMachine(BlockEntityCreationInfo info) { @Override public void onLoad() { super.onLoad(); - if (getLevel() instanceof ServerLevel serverLevel) { - serverLevel.getServer().tell(new TickTask(1, () -> { - for (int i = 0; i < patternInventory.getSlots(); i++) { - var pattern = patternInventory.getStackInSlot(i); - var patternDetails = PatternDetailsHelper.decodePattern(pattern, getLevel()); - if (patternDetails != null) { - this.detailsSlotMap.put(patternDetails, this.internalInventory[i]); - } + if (!isRemote()) { + for (int i = 0; i < patternInventory.getSlots(); i++) { + var pattern = patternInventory.getStackInSlot(i); + var patternDetails = PatternDetailsHelper.decodePattern(pattern, getLevel()); + if (patternDetails != null) { + this.detailsSlotMap.put(patternDetails, this.internalInventory[i]); } - needPatternSync = true; - })); + } + needPatternSync = true; } } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEPatternBufferProxyPartMachine.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEPatternBufferProxyPartMachine.java index 563a6738e1a..ebbc916d1fb 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEPatternBufferProxyPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEPatternBufferProxyPartMachine.java @@ -17,8 +17,6 @@ import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; import net.minecraft.nbt.Tag; -import net.minecraft.server.TickTask; -import net.minecraft.server.level.ServerLevel; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.player.Player; @@ -56,9 +54,7 @@ public MEPatternBufferProxyPartMachine(BlockEntityCreationInfo info) { @Override public void onLoad() { super.onLoad(); - if (getLevel() instanceof ServerLevel level) { - level.getServer().tell(new TickTask(0, () -> this.setBuffer(bufferPos))); - } + if (!isRemote()) this.setBuffer(bufferPos); } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/AutoOutputBlockProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/AutoOutputBlockProvider.java index 9704b4ab201..275d4d8a3e8 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/AutoOutputBlockProvider.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/AutoOutputBlockProvider.java @@ -1,9 +1,7 @@ package com.gregtechceu.gtceu.integration.jade.provider; import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.api.machine.feature.IAutoOutputFluid; -import com.gregtechceu.gtceu.api.machine.feature.IAutoOutputItem; +import com.gregtechceu.gtceu.api.machine.trait.AutoOutputTrait; import net.minecraft.core.Direction; import net.minecraft.core.registries.BuiltInRegistries; @@ -11,59 +9,50 @@ import net.minecraft.nbt.Tag; import net.minecraft.network.chat.Component; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.block.entity.BlockEntity; import org.apache.commons.lang3.StringUtils; import snownee.jade.api.BlockAccessor; -import snownee.jade.api.IBlockComponentProvider; -import snownee.jade.api.IServerDataProvider; import snownee.jade.api.ITooltip; import snownee.jade.api.config.IPluginConfig; -public class AutoOutputBlockProvider implements IBlockComponentProvider, IServerDataProvider { +public class AutoOutputBlockProvider extends MachineTraitProvider { + + public AutoOutputBlockProvider() { + super(GTCEu.id("auto_output_info"), AutoOutputTrait.TYPE); + } @Override - public void appendTooltip(ITooltip iTooltip, BlockAccessor blockAccessor, IPluginConfig iPluginConfig) { - BlockEntity be = blockAccessor.getBlockEntity(); - if (be != null) { - CompoundTag data = blockAccessor.getServerData().getCompound(getUid().toString()); - if (data.contains("autoOutputItem", Tag.TAG_COMPOUND)) { - var tag = data.getCompound("autoOutputItem"); - addAutoOutputInfo(iTooltip, blockAccessor, tag, "gtceu.top.item_auto_output"); - } + protected void addTooltip(CompoundTag data, ITooltip tooltip, Player player, BlockAccessor block, + BlockEntity blockEntity, IPluginConfig config) { + if (data.contains("autoOutputItem", Tag.TAG_COMPOUND)) { + var tag = data.getCompound("autoOutputItem"); + addAutoOutputInfo(tooltip, block, tag, "gtceu.top.item_auto_output"); + } - if (data.contains("autoOutputFluid", Tag.TAG_COMPOUND)) { - var tag = data.getCompound("autoOutputFluid"); - addAutoOutputInfo(iTooltip, blockAccessor, tag, "gtceu.top.fluid_auto_output"); - } + if (data.contains("autoOutputFluid", Tag.TAG_COMPOUND)) { + var tag = data.getCompound("autoOutputFluid"); + addAutoOutputInfo(tooltip, block, tag, "gtceu.top.fluid_auto_output"); } } @Override - public void appendServerData(CompoundTag compoundTag, BlockAccessor blockAccessor) { - CompoundTag data = compoundTag.getCompound(getUid().toString()); - var level = blockAccessor.getLevel(); - var pos = blockAccessor.getPosition(); - if (MetaMachine.getMachine(level, pos) instanceof IAutoOutputItem outputItem) { - var direction = outputItem.getOutputFacingItems(); + protected void write(CompoundTag data, BlockAccessor blockAccessor, AutoOutputTrait trait) { + if (trait.supportsAutoOutputItems()) { + var direction = trait.getItemOutputDirection(); if (direction != null) { data.put("autoOutputItem", writeData(new CompoundTag(), direction, blockAccessor, - outputItem.isAllowInputFromOutputSideItems(), outputItem.isAutoOutputItems())); + trait.allowsItemInputFromOutputSide(), trait.isAutoOutputItems())); } } - if (MetaMachine.getMachine(level, pos) instanceof IAutoOutputFluid outputFluid) { - var direction = outputFluid.getOutputFacingFluids(); + if (trait.supportsAutoOutputFluids()) { + var direction = trait.getFluidOutputDirection(); if (direction != null) { data.put("autoOutputFluid", writeData(new CompoundTag(), direction, blockAccessor, - outputFluid.isAllowInputFromOutputSideFluids(), outputFluid.isAutoOutputFluids())); + trait.allowsFluidInputFromOutputSide(), trait.isAutoOutputFluids())); } } - compoundTag.put(getUid().toString(), data); - } - - @Override - public ResourceLocation getUid() { - return GTCEu.id("auto_output_info"); } private CompoundTag writeData(CompoundTag compoundTag, Direction direction, BlockAccessor blockAccessor, diff --git a/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/MachineTraitProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/MachineTraitProvider.java index 1ed9d65afc0..3d7c2edeeec 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/MachineTraitProvider.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/MachineTraitProvider.java @@ -45,11 +45,11 @@ public void appendServerData(CompoundTag compoundTag, BlockAccessor blockAccesso var be = blockAccessor.getBlockEntity(); if (be instanceof MetaMachine machine) { T t = machine.getTraitHolder().getTrait(traitType); - if (t != null) write(compoundTag.getCompound(uid.toString()), t); + if (t != null) write(compoundTag.getCompound(uid.toString()), blockAccessor, t); } } - protected abstract void write(CompoundTag data, T trait); + protected abstract void write(CompoundTag data, BlockAccessor blockAccessor, T trait); protected abstract void addTooltip(CompoundTag data, ITooltip tooltip, Player player, BlockAccessor block, BlockEntity blockEntity, IPluginConfig config); diff --git a/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/RecipeLogicProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/RecipeLogicProvider.java index e39657b0d4b..5fd25ad6761 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/RecipeLogicProvider.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/RecipeLogicProvider.java @@ -32,7 +32,7 @@ public RecipeLogicProvider() { } @Override - protected void write(CompoundTag data, RecipeLogic capability) { + protected void write(CompoundTag data, BlockAccessor blockAccessor, RecipeLogic capability) { data.putBoolean("Working", capability.isWorking()); var recipeInfo = new CompoundTag(); var recipe = capability.getLastRecipe(); diff --git a/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/RecipeOutputProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/RecipeOutputProvider.java index 3d6baeada20..193e5d5f8ce 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/RecipeOutputProvider.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/RecipeOutputProvider.java @@ -50,7 +50,7 @@ public RecipeOutputProvider() { } @Override - protected void write(CompoundTag data, RecipeLogic recipeLogic) { + protected void write(CompoundTag data, BlockAccessor blockAccessor, RecipeLogic recipeLogic) { if (recipeLogic.isWorking()) { data.putBoolean("Working", recipeLogic.isWorking()); var recipe = recipeLogic.getLastRecipe(); diff --git a/src/main/java/com/gregtechceu/gtceu/utils/data/TagCompatibilityFixer.java b/src/main/java/com/gregtechceu/gtceu/utils/data/TagCompatibilityFixer.java new file mode 100644 index 00000000000..f6ee9efc56f --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/utils/data/TagCompatibilityFixer.java @@ -0,0 +1,41 @@ +package com.gregtechceu.gtceu.utils.data; + +import net.minecraft.nbt.CompoundTag; +import net.minecraft.nbt.Tag; + +import lombok.AccessLevel; +import lombok.NoArgsConstructor; + +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public final class TagCompatibilityFixer { + + public static void fixMachineAutoOutputTag(CompoundTag machineTag) { + if (!machineTag.contains("autoOutput")) { + var outputTag = new CompoundTag(); + Tag itemOutputDirection = machineTag.get("outputFacingItems"); + Tag fluidOutputDirection = machineTag.get("outputFacingFluids"); + Tag autoOutputItems = machineTag.get("autoOutputItems"); + Tag autoOutputFluids = machineTag.get("autoOutputFluids"); + Tag allowInputItems = machineTag.get("allowInputFromOutputSideItems"); + Tag allowInputFluids = machineTag.get("allowInputFromOutputSideFluids"); + if (itemOutputDirection != null) outputTag.put("itemOutputDirection", itemOutputDirection); + if (fluidOutputDirection != null) outputTag.put("fluidOutputDirection", fluidOutputDirection); + if (autoOutputItems != null) outputTag.put("autoOutputItems", autoOutputItems); + if (autoOutputFluids != null) outputTag.put("autoOutputFluids", autoOutputFluids); + if (allowInputItems != null) outputTag.put("allowItemInputFromOutputSide", allowInputItems); + if (allowInputFluids != null) outputTag.put("allowFluidInputFromOutputSide", allowInputFluids); + machineTag.put("autoOutput", outputTag); + } + } + + public static Tag stripLDLibPayloadWrapper(Tag t) { + if (!(t instanceof CompoundTag tag)) return t; + if (tag.contains("p") && tag.contains("t")) { + return tag.getCompound("p"); + } + if (tag.contains("t", Tag.TAG_COMPOUND)) { + return tag.getCompound("t").getCompound("p"); + } + return tag; + } +} From 0c36ee3641b1923f834fc8585fad75effc417e86 Mon Sep 17 00:00:00 2001 From: TechLord22 <37029404+TechLord22@users.noreply.github.com> Date: Sat, 7 Feb 2026 19:41:18 -0500 Subject: [PATCH 03/10] Remove unchecked casts in TagPrefix (#4559) --- .../api/data/chemical/ChemicalHelper.java | 16 ++-- .../chemical/material/ItemMaterialData.java | 2 +- .../material/stack/MaterialEntry.java | 4 +- .../gtceu/api/data/tag/TagPrefix.java | 93 +++++++++++-------- .../item/IntersectionMapIngredient.java | 4 +- .../data/recipe/VanillaRecipeHelper.java | 10 +- 6 files changed, 75 insertions(+), 54 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/ChemicalHelper.java b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/ChemicalHelper.java index ae7d984611e..3cc568351df 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/ChemicalHelper.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/ChemicalHelper.java @@ -193,7 +193,7 @@ public static MaterialEntry getMaterialEntry(ItemLike itemLike) { MaterialEntry materialEntry1 = getMaterialEntry(itemTag); // check that it's not the empty marker and that it's not a parent tag if (!materialEntry1.isEmpty() && - Arrays.stream(materialEntry1.tagPrefix().getItemParentTags()).noneMatch(itemTag::equals)) { + materialEntry1.tagPrefix().getItemParentTags().stream().noneMatch(itemTag::equals)) { return materialEntry1; } } @@ -210,7 +210,7 @@ public static MaterialEntry getMaterialEntry(TagKey tag) { Set> allItemTags = BuiltInRegistries.ITEM.getTagNames().collect(Collectors.toSet()); for (TagPrefix prefix : TagPrefix.values()) { for (Material material : GTCEuAPI.materialManager.getRegisteredMaterials()) { - Arrays.stream(prefix.getItemTags(material)) + prefix.getItemTags(material).stream() .filter(allItemTags::contains) .forEach(tagKey -> { // remove the tag so that the next iteration is faster. @@ -291,19 +291,19 @@ public static Block getBlock(TagPrefix orePrefix, Material material) { @Nullable public static TagKey getBlockTag(TagPrefix orePrefix, @NotNull Material material) { var tags = orePrefix.getBlockTags(material); - if (tags.length > 0) { - return tags[0]; + if (tags.isEmpty()) { + return null; } - return null; + return tags.get(0); } @Nullable public static TagKey getTag(TagPrefix orePrefix, @NotNull Material material) { var tags = orePrefix.getItemTags(material); - if (tags.length > 0) { - return tags[0]; + if (tags.isEmpty()) { + return null; } - return null; + return tags.get(0); } public static List> getAllItemInfos() { diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/ItemMaterialData.java b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/ItemMaterialData.java index 342641859da..158d73a200c 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/ItemMaterialData.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/ItemMaterialData.java @@ -163,7 +163,7 @@ public static void reinitializeMaterialData() { // Load new data TagsHandler.initExtraUnificationEntries(); for (TagPrefix prefix : TagPrefix.values()) { - prefix.getIgnored().forEach((mat, items) -> registerMaterialEntries(Arrays.asList(items), prefix, mat)); + prefix.getIgnored().forEach((mat, items) -> registerMaterialEntries(items, prefix, mat)); } GTMaterialItems.toUnify .forEach((materialEntry, supplier) -> registerMaterialEntry(supplier, materialEntry)); diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/stack/MaterialEntry.java b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/stack/MaterialEntry.java index 9f909b4784a..fcfe13fa40b 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/stack/MaterialEntry.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/chemical/material/stack/MaterialEntry.java @@ -40,10 +40,10 @@ public String toString() { return material.getResourceLocation().toString(); } var tags = tagPrefix.getItemTags(material); - if (tags.length == 0) { + if (tags.isEmpty()) { return tagPrefix.name + "/" + material.getName(); } - return tags[0].location().toString(); + return tags.get(0).location().toString(); } public static @Nullable MaterialEntry of(Object o) { diff --git a/src/main/java/com/gregtechceu/gtceu/api/data/tag/TagPrefix.java b/src/main/java/com/gregtechceu/gtceu/api/data/tag/TagPrefix.java index 777131be6e6..eab84067316 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/data/tag/TagPrefix.java +++ b/src/main/java/com/gregtechceu/gtceu/api/data/tag/TagPrefix.java @@ -57,6 +57,7 @@ import lombok.experimental.Accessors; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.Unmodifiable; import java.util.*; import java.util.function.*; @@ -1034,7 +1035,7 @@ public record BlockProperties(Supplier> renderType, @Setter private BiConsumer> tooltip; - private final Map[]> ignoredMaterials = new HashMap<>(); + private final Map>> ignoredMaterials = new HashMap<>(); private final Object2FloatMap materialAmounts = new Object2FloatOpenHashMap<>(); @Getter @@ -1173,43 +1174,51 @@ public static TagPrefix getPrefix(String prefixName, @Nullable TagPrefix replace return PREFIXES.getOrDefault(prefixName, replacement); } - @SuppressWarnings("unchecked") - public TagKey[] getItemParentTags() { - return tags.stream().filter(TagType::isParentTag).map(type -> type.getTag(this, GTMaterials.NULL)) - .toArray(TagKey[]::new); + public @Unmodifiable List> getItemParentTags() { + return tags.stream() + .filter(TagType::isParentTag) + .map(type -> type.getTag(this, GTMaterials.NULL)) + .filter(Objects::nonNull) + .toList(); } - @SuppressWarnings("unchecked") - public TagKey[] getItemTags(@NotNull Material mat) { - return tags.stream().filter(type -> !type.isParentTag()).map(type -> type.getTag(this, mat)) + public @Unmodifiable List> getItemTags(@NotNull Material mat) { + return tags.stream() + .filter(type -> !type.isParentTag()) + .map(type -> type.getTag(this, mat)) .filter(Objects::nonNull) - .toArray(TagKey[]::new); + .toList(); } - @SuppressWarnings("unchecked") - public TagKey[] getAllItemTags(@NotNull Material mat) { - return tags.stream().map(type -> type.getTag(this, mat)).filter(Objects::nonNull).toArray(TagKey[]::new); + public @Unmodifiable List> getAllItemTags(@NotNull Material mat) { + return tags.stream() + .map(type -> type.getTag(this, mat)) + .filter(Objects::nonNull) + .toList(); } - @SuppressWarnings("unchecked") - public TagKey[] getBlockTags(@NotNull Material mat) { - return tags.stream().filter(type -> !type.isParentTag()).map(type -> type.getTag(this, mat)) - .map(itemTagKey -> TagKey.create(Registries.BLOCK, itemTagKey.location())).toArray(TagKey[]::new); + public @Unmodifiable List> getBlockTags(@NotNull Material mat) { + return tags.stream() + .filter(type -> !type.isParentTag()) + .map(type -> type.getTag(this, mat)) + .filter(Objects::nonNull) + .map(itemTagKey -> TagKey.create(Registries.BLOCK, itemTagKey.location())) + .toList(); } - @SuppressWarnings("unchecked") - public TagKey[] getAllBlockTags(@NotNull Material mat) { + public @Unmodifiable List> getAllBlockTags(@NotNull Material mat) { return tags.stream().map(type -> type.getTag(this, mat)) - .map(itemTagKey -> TagKey.create(Registries.BLOCK, itemTagKey.location())).toArray(TagKey[]::new); + .filter(Objects::nonNull) + .map(itemTagKey -> TagKey.create(Registries.BLOCK, itemTagKey.location())) + .toList(); } public boolean hasItemTable() { return itemTable != null; } - @SuppressWarnings("unchecked") - public Supplier getItemFromTable(Material material) { - return (Supplier) itemTable.get().get(this, material); + public Supplier getItemFromTable(Material material) { + return itemTable.get().get(this, material); } public boolean doGenerateItem() { @@ -1267,41 +1276,51 @@ public boolean isIgnored(Material material) { @SafeVarargs public final void setIgnored(Material material, Supplier... items) { + setIgnored(material, Arrays.asList(items)); + } + + public final void setIgnored(Material material, Collection> items) { ignoredMaterials.put(material, items); - if (items.length > 0) { - ItemMaterialData.registerMaterialEntries(Arrays.asList(items), this, material); + if (!items.isEmpty()) { + ItemMaterialData.registerMaterialEntries(items, this, material); } } - @SuppressWarnings("unchecked") public void setIgnored(Material material, ItemLike... items) { // go through setIgnoredBlock to wrap if this is a block prefix + Collection> collection = new ArrayList<>(items.length); if (this.doGenerateBlock()) { - this.setIgnoredBlock(material, - Arrays.stream(items).filter(Block.class::isInstance).map(Block.class::cast).toArray(Block[]::new)); + for (var item : items) { + if (item instanceof Block b) { + collection.add(GTMemoizer.memoizeBlockSupplier(() -> b)); + } + } } else { - this.setIgnored(material, - Arrays.stream(items).map(item -> (Supplier) () -> item).toArray(Supplier[]::new)); + for (var item : items) { + collection.add(() -> item); + } } + setIgnored(material, collection); } - @SuppressWarnings("unchecked") - public void setIgnoredBlock(Material material, Block... items) { - this.setIgnored(material, Arrays.stream(items).map(block -> GTMemoizer.memoizeBlockSupplier(() -> block)) - .toArray(Supplier[]::new)); + public void setIgnoredBlock(Material material, Block... blocks) { + Collection> collection = new ArrayList<>(blocks.length); + for (var block : blocks) { + collection.add(GTMemoizer.memoizeBlockSupplier(() -> block)); + } + setIgnored(material, collection); } - @SuppressWarnings("unchecked") public void setIgnored(Material material) { - this.ignoredMaterials.put(material, new Supplier[0]); + this.ignoredMaterials.put(material, List.of()); } public void removeIgnored(Material material) { ignoredMaterials.remove(material); } - public Map[]> getIgnored() { - return new HashMap<>(ignoredMaterials); + public @Unmodifiable Map>> getIgnored() { + return Map.copyOf(ignoredMaterials); } public boolean isAmountModified(Material material) { diff --git a/src/main/java/com/gregtechceu/gtceu/api/recipe/lookup/ingredient/item/IntersectionMapIngredient.java b/src/main/java/com/gregtechceu/gtceu/api/recipe/lookup/ingredient/item/IntersectionMapIngredient.java index ab644883e7c..cb7061f478f 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/recipe/lookup/ingredient/item/IntersectionMapIngredient.java +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/lookup/ingredient/item/IntersectionMapIngredient.java @@ -48,8 +48,8 @@ public static List from(ItemStack stack) { if (!entry.isEmpty() && TagPrefix.ORES.containsKey(entry.tagPrefix())) { List children = new ArrayList<>(); - children.add(new ItemTagMapIngredient(entry.tagPrefix().getItemTags(entry.material())[0])); - children.add(new ItemTagMapIngredient(entry.tagPrefix().getItemParentTags()[0])); + children.add(new ItemTagMapIngredient(entry.tagPrefix().getItemTags(entry.material()).get(0))); + children.add(new ItemTagMapIngredient(entry.tagPrefix().getItemParentTags().get(0))); return Collections.singletonList(new IntersectionMapIngredient(children)); } diff --git a/src/main/java/com/gregtechceu/gtceu/data/recipe/VanillaRecipeHelper.java b/src/main/java/com/gregtechceu/gtceu/data/recipe/VanillaRecipeHelper.java index ee3b7ff2257..ce0db2d32f6 100644 --- a/src/main/java/com/gregtechceu/gtceu/data/recipe/VanillaRecipeHelper.java +++ b/src/main/java/com/gregtechceu/gtceu/data/recipe/VanillaRecipeHelper.java @@ -327,8 +327,9 @@ public static void addShapedRecipe(Consumer provider, boolean se } else if (content instanceof TagKey key) { builder.define(sign, (TagKey) key); } else if (content instanceof TagPrefix prefix) { - if (prefix.getItemParentTags().length > 0) { - builder.define(sign, prefix.getItemParentTags()[0]); + var parentTags = prefix.getItemParentTags(); + if (!parentTags.isEmpty()) { + builder.define(sign, parentTags.get(0)); } } else if (content instanceof ItemLike itemLike) { builder.define(sign, itemLike); @@ -491,8 +492,9 @@ public static void addShapedFluidContainerRecipe(Consumer provid } else if (content instanceof TagKey key) { builder.define(sign, (TagKey) key); } else if (content instanceof TagPrefix prefix) { - if (prefix.getItemParentTags().length > 0) { - builder.define(sign, prefix.getItemParentTags()[0]); + var parentTags = prefix.getItemParentTags(); + if (!parentTags.isEmpty()) { + builder.define(sign, parentTags.get(0)); } } else if (content instanceof ItemLike itemLike) { builder.define(sign, itemLike); From c5c84e98d830cede6c5ef95e16b85c3f56f0de4e Mon Sep 17 00:00:00 2001 From: Gustavo <77560533+gustovafing@users.noreply.github.com> Date: Mon, 9 Feb 2026 00:16:25 +1100 Subject: [PATCH 04/10] remove IMachineLife interface (#4569) --- .../gtceu/api/block/MetaMachineBlock.java | 2 +- .../gtceu/api/capability/IMiner.java | 12 +--- .../gtceu/api/machine/MetaMachine.java | 55 +++++++++---------- .../api/machine/SimpleTieredMachine.java | 4 +- .../api/machine/WorkableTieredMachine.java | 5 +- .../api/machine/feature/IMachineLife.java | 26 --------- .../api/machine/steam/SimpleSteamMachine.java | 3 +- .../machine/steam/SteamWorkableMachine.java | 3 +- .../electric/BatteryBufferMachine.java | 6 +- .../machine/electric/BlockBreakerMachine.java | 6 +- .../machine/electric/ChargerMachine.java | 6 +- .../machine/electric/FisherMachine.java | 6 +- .../electric/ItemCollectorMachine.java | 6 +- .../common/machine/electric/MinerMachine.java | 5 +- .../common/machine/electric/PumpMachine.java | 6 +- .../electric/CentralMonitorMachine.java | 6 +- .../part/DataAccessHatchMachine.java | 6 +- .../part/FluidHatchPartMachine.java | 6 +- .../multiblock/part/ItemBusPartMachine.java | 6 +- .../part/MaintenanceHatchPartMachine.java | 6 +- .../multiblock/part/ObjectHolderMachine.java | 6 +- .../part/RotorHolderPartMachine.java | 6 +- .../primitive/PrimitiveWorkableMachine.java | 6 +- .../machine/steam/SteamMinerMachine.java | 8 ++- .../steam/SteamSolidBoilerMachine.java | 6 +- .../common/machine/storage/BufferMachine.java | 6 +- .../common/machine/storage/CrateMachine.java | 5 +- .../ae2/machine/MEInputBusPartMachine.java | 5 +- .../ae2/machine/MEInputHatchPartMachine.java | 6 +- .../ae2/machine/MEOutputBusPartMachine.java | 5 +- .../ae2/machine/MEOutputHatchPartMachine.java | 6 +- .../machine/MEPatternBufferPartMachine.java | 2 +- .../MEPatternBufferProxyPartMachine.java | 7 +-- 33 files changed, 110 insertions(+), 145 deletions(-) delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/machine/feature/IMachineLife.java diff --git a/src/main/java/com/gregtechceu/gtceu/api/block/MetaMachineBlock.java b/src/main/java/com/gregtechceu/gtceu/api/block/MetaMachineBlock.java index 1bacdd97fa4..23faebb612a 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/block/MetaMachineBlock.java +++ b/src/main/java/com/gregtechceu/gtceu/api/block/MetaMachineBlock.java @@ -248,7 +248,7 @@ public void onRemove(BlockState pState, Level pLevel, BlockPos pPos, BlockState if (!pState.is(pNewState.getBlock())) { // new block MetaMachine machine = MetaMachine.getMachine(pLevel, pPos); if (machine != null) { - machine.onRemoved(); + machine.onMachineDestroyed(); } pLevel.updateNeighbourForOutputSignal(pPos, this); diff --git a/src/main/java/com/gregtechceu/gtceu/api/capability/IMiner.java b/src/main/java/com/gregtechceu/gtceu/api/capability/IMiner.java index 0b08daa6aa0..df87274cbf8 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/capability/IMiner.java +++ b/src/main/java/com/gregtechceu/gtceu/api/capability/IMiner.java @@ -1,18 +1,8 @@ package com.gregtechceu.gtceu.api.capability; -import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.feature.IRecipeLogicMachine; -import com.gregtechceu.gtceu.common.machine.trait.miner.MinerLogic; -public interface IMiner extends IRecipeLogicMachine, IMachineLife { - - @Override - MinerLogic getRecipeLogic(); - - @Override - default void onMachineRemoved() { - getRecipeLogic().onRemove(); - } +public interface IMiner extends IRecipeLogicMachine { boolean drainInput(boolean simulate); diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java index 48cd480efab..b91971fd66a 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java @@ -157,26 +157,6 @@ public MetaMachine(BlockEntityCreationInfo info) { // ***** Machine Lifecycle ******// ////////////////////////////////////// - public void onMachinePlaced(@Nullable LivingEntity player, ItemStack stack) { - if (player instanceof ServerPlayer sPlayer) { - ownerUUID = sPlayer.getUUID(); - } - - if (this instanceof IDropSaveMachine dropSaveMachine) { - CompoundTag tag = stack.getTag(); - if (tag != null) { - dropSaveMachine.loadFromItem(tag); - } - } - } - - public void onRemoved() { - for (Direction direction : GTUtil.DIRECTIONS) { - getCoverContainer().removeCover(direction, null); - } - if (this instanceof IMachineLife l) l.onMachineRemoved(); - } - @Override public void load(CompoundTag tag) { TagCompatibilityFixer.fixMachineAutoOutputTag(tag); @@ -196,14 +176,6 @@ public void onLoad() { } } - public void setRenderState(MachineRenderState renderState) { - this.renderState = renderState; - if (level != null && !level.isClientSide) { - syncDataHolder.markClientSyncFieldDirty("renderState"); - } - scheduleRenderUpdate(); - } - @Override public final void setRemoved() { super.setRemoved(); @@ -220,6 +192,25 @@ public void onUnload() { serverTicks.clear(); } + public void onMachinePlaced(@Nullable LivingEntity player, ItemStack stack) { + if (player instanceof ServerPlayer sPlayer) { + ownerUUID = sPlayer.getUUID(); + } + + if (this instanceof IDropSaveMachine dropSaveMachine) { + CompoundTag tag = stack.getTag(); + if (tag != null) { + dropSaveMachine.loadFromItem(tag); + } + } + } + + public void onMachineDestroyed() { + for (Direction direction : GTUtil.DIRECTIONS) { + getCoverContainer().removeCover(direction, null); + } + } + ////////////////////////////////////// // ***** Tickable Manager ****// ////////////////////////////////////// @@ -440,6 +431,14 @@ public boolean triggerEvent(int id, int para) { return false; } + public void setRenderState(MachineRenderState renderState) { + this.renderState = renderState; + if (level != null && !level.isClientSide) { + syncDataHolder.markClientSyncFieldDirty("renderState"); + } + scheduleRenderUpdate(); + } + public void setPaintingColor(int color) { if (color == this.paintingColor) return; diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleTieredMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleTieredMachine.java index ef966694592..fa1118e2c56 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleTieredMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleTieredMachine.java @@ -133,8 +133,8 @@ protected void chargeBattery() { // ********** MISC ***********// ////////////////////////////////////// @Override - public void onMachineRemoved() { - super.onMachineRemoved(); + public void onMachineDestroyed() { + super.onMachineDestroyed(); clearInventory(chargerInventory); if (!ConfigHolder.INSTANCE.machines.ghostCircuit) { clearInventory(circuitInventory.storage); diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/WorkableTieredMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/WorkableTieredMachine.java index ac5eb261ff0..d00ba7f5959 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/WorkableTieredMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/WorkableTieredMachine.java @@ -27,7 +27,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public abstract class WorkableTieredMachine extends TieredEnergyMachine implements IRecipeLogicMachine, - IMachineLife, IMufflableMachine, IOverclockMachine { + IMufflableMachine, IOverclockMachine { @Getter @SaveField @@ -144,7 +144,8 @@ public void onUnload() { ////////////////////////////////////// @Override - public void onMachineRemoved() { + public void onMachineDestroyed() { + super.onMachineDestroyed(); clearInventory(importItems.storage); clearInventory(exportItems.storage); } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IMachineLife.java b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IMachineLife.java deleted file mode 100644 index b41e7044297..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IMachineLife.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.gregtechceu.gtceu.api.machine.feature; - -import com.gregtechceu.gtceu.api.block.MetaMachineBlock; - -import net.minecraft.core.BlockPos; -import net.minecraft.world.entity.LivingEntity; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.state.BlockState; - -import org.jetbrains.annotations.Nullable; - -public interface IMachineLife extends IMachineFeature { - - /** - * Called when machine removed. {@link MetaMachineBlock#onRemove(BlockState, Level, BlockPos, BlockState, boolean)} - * Only if block has changed will it be called. Ignore State changes. - */ - default void onMachineRemoved() {} - - /** - * Called when machine placed by (if exist) an entity with item. - * it won't be called when machine added by {@link Level#setBlock(BlockPos, BlockState, int, int)} - */ - default void onMachinePlaced(@Nullable LivingEntity player, ItemStack stack) {} -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SimpleSteamMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SimpleSteamMachine.java index 6aa0e01e806..380f5caf236 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SimpleSteamMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SimpleSteamMachine.java @@ -86,7 +86,8 @@ public void onLoad() { } @Override - public void onMachineRemoved() { + public void onMachineDestroyed() { + super.onMachineDestroyed(); clearInventory(importItems.storage); clearInventory(exportItems.storage); } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SteamWorkableMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SteamWorkableMachine.java index aad87a197c9..8434c9c9fc3 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SteamWorkableMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SteamWorkableMachine.java @@ -6,7 +6,6 @@ import com.gregtechceu.gtceu.api.capability.recipe.RecipeCapability; import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.item.tool.GTToolType; -import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.feature.IMufflableMachine; import com.gregtechceu.gtceu.api.machine.feature.IRecipeLogicMachine; import com.gregtechceu.gtceu.api.machine.trait.*; @@ -42,7 +41,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public abstract class SteamWorkableMachine extends SteamMachine - implements IRecipeLogicMachine, IMufflableMachine, IMachineLife { + implements IRecipeLogicMachine, IMufflableMachine { @Getter protected final CleanroomReceiverTrait cleanroomReceiver; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/BatteryBufferMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/BatteryBufferMachine.java index 026bc2e7ce6..05e2ceee157 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/BatteryBufferMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/BatteryBufferMachine.java @@ -11,7 +11,6 @@ import com.gregtechceu.gtceu.api.gui.widget.SlotWidget; import com.gregtechceu.gtceu.api.machine.TieredEnergyMachine; import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine; -import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.trait.NotifiableEnergyContainer; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; @@ -40,7 +39,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class BatteryBufferMachine extends TieredEnergyMachine - implements IControllable, IFancyUIMachine, IMachineLife, IMonitorComponent { + implements IControllable, IFancyUIMachine, IMonitorComponent { public static final long AMPS_PER_BATTERY = 2L; @@ -191,7 +190,8 @@ private List getAllBatteries() { } @Override - public void onMachineRemoved() { + public void onMachineDestroyed() { + super.onMachineDestroyed(); clearInventory(batteryInventory); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/BlockBreakerMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/BlockBreakerMachine.java index 5ae4bb47a6e..1f4410d44fe 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/BlockBreakerMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/BlockBreakerMachine.java @@ -13,7 +13,6 @@ import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.TieredEnergyMachine; import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine; -import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.trait.AutoOutputTrait; import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; @@ -49,7 +48,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class BlockBreakerMachine extends TieredEnergyMachine - implements IFancyUIMachine, IMachineLife, IControllable { + implements IFancyUIMachine, IControllable { @SaveField protected final NotifiableItemStackHandler cache; @@ -138,7 +137,8 @@ public void onUnload() { } @Override - public void onMachineRemoved() { + public void onMachineDestroyed() { + super.onMachineDestroyed(); clearInventory(chargerInventory); clearInventory(cache.storage); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ChargerMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ChargerMachine.java index 3a3fe593102..01228c25808 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ChargerMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ChargerMachine.java @@ -8,7 +8,6 @@ import com.gregtechceu.gtceu.api.gui.widget.SlotWidget; import com.gregtechceu.gtceu.api.machine.TieredEnergyMachine; import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine; -import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; import com.gregtechceu.gtceu.api.machine.trait.NotifiableEnergyContainer; import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; @@ -40,7 +39,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -public class ChargerMachine extends TieredEnergyMachine implements IControllable, IFancyUIMachine, IMachineLife { +public class ChargerMachine extends TieredEnergyMachine implements IControllable, IFancyUIMachine { public static final long AMPS_PER_ITEM = 4L; @@ -111,7 +110,8 @@ public int tintColor(int index) { } @Override - public void onMachineRemoved() { + public void onMachineDestroyed() { + super.onMachineDestroyed(); clearInventory(chargerInventory); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/FisherMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/FisherMachine.java index a4cdfc0dd1f..c1fbad809ea 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/FisherMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/FisherMachine.java @@ -14,7 +14,6 @@ import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.TieredEnergyMachine; import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine; -import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.trait.AutoOutputTrait; import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; @@ -58,7 +57,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class FisherMachine extends TieredEnergyMachine - implements IFancyUIMachine, IMachineLife, IWorkable { + implements IFancyUIMachine, IWorkable { @SaveField protected final NotifiableItemStackHandler cache; @@ -167,7 +166,8 @@ public boolean shouldWeatherOrTerrainExplosion() { } @Override - public void onMachineRemoved() { + public void onMachineDestroyed() { + super.onMachineDestroyed(); clearInventory(chargerInventory); clearInventory(baitHandler.storage); clearInventory(cache.storage); diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ItemCollectorMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ItemCollectorMachine.java index 22821876b65..fe480d2608b 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ItemCollectorMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ItemCollectorMachine.java @@ -15,7 +15,6 @@ import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.TieredEnergyMachine; import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine; -import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; import com.gregtechceu.gtceu.api.machine.trait.AutoOutputTrait; import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; @@ -56,7 +55,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class ItemCollectorMachine extends TieredEnergyMachine - implements IFancyUIMachine, IMachineLife, IWorkable { + implements IFancyUIMachine, IWorkable { @Getter private static final int[] INVENTORY_SIZES = { 4, 9, 16, 25, 25 }; @@ -173,7 +172,8 @@ public boolean shouldWeatherOrTerrainExplosion() { } @Override - public void onMachineRemoved() { + public void onMachineDestroyed() { + super.onMachineDestroyed(); clearInventory(chargerInventory); clearInventory(output.storage); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/MinerMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/MinerMachine.java index a5276ee2fe9..b01e7045895 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/MinerMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/MinerMachine.java @@ -57,7 +57,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class MinerMachine extends WorkableTieredMachine - implements IMiner, IControllable, IFancyUIMachine, IDataInfoProvider { + implements IControllable, IFancyUIMachine, IDataInfoProvider, IMiner { @Getter @SaveField @@ -95,7 +95,8 @@ protected CustomItemStackHandler createChargerItemHandler() { } @Override - public void onMachineRemoved() { + public void onMachineDestroyed() { + super.onMachineDestroyed(); // Remove the miner pipes below this miner getRecipeLogic().onRemove(); clearInventory(exportItems.storage); diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/PumpMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/PumpMachine.java index 6a8668edc29..1c840c8eaf1 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/PumpMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/PumpMachine.java @@ -8,7 +8,6 @@ import com.gregtechceu.gtceu.api.gui.widget.TankWidget; import com.gregtechceu.gtceu.api.gui.widget.ToggleButtonWidget; import com.gregtechceu.gtceu.api.machine.TieredEnergyMachine; -import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.feature.IUIMachine; import com.gregtechceu.gtceu.api.machine.trait.AutoOutputTrait; import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; @@ -54,7 +53,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -public class PumpMachine extends TieredEnergyMachine implements IUIMachine, IMachineLife { +public class PumpMachine extends TieredEnergyMachine implements IUIMachine { public static final int BASE_PUMP_RADIUS = 16; public static final int EXTRA_PUMP_RADIUS = 4; @@ -378,7 +377,8 @@ private boolean canAdvancePumpHead() { } @Override - public void onMachineRemoved() { + public void onMachineDestroyed() { + super.onMachineDestroyed(); if (getLevel() instanceof ServerLevel serverLevel) { var pos = getBlockPos().relative(Direction.DOWN); while (serverLevel.getBlockState(pos).is(GTBlocks.MINER_PIPE.get())) { diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CentralMonitorMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CentralMonitorMachine.java index 13708588fbb..6680049ec2e 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CentralMonitorMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CentralMonitorMachine.java @@ -12,7 +12,6 @@ import com.gregtechceu.gtceu.api.item.component.IItemComponent; import com.gregtechceu.gtceu.api.item.component.IMonitorModuleItem; import com.gregtechceu.gtceu.api.machine.feature.IDataInfoProvider; -import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockDisplayText; import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; @@ -61,7 +60,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class CentralMonitorMachine extends WorkableElectricMultiblockMachine - implements IMonitorComponent, IDataInfoProvider, IMachineLife { + implements IMonitorComponent, IDataInfoProvider { @SaveField @SyncToClient @@ -665,7 +664,8 @@ public IGuiTexture getComponentIcon() { } @Override - public void onMachineRemoved() { + public void onMachineDestroyed() { + super.onMachineDestroyed(); for (MonitorGroup group : monitorGroups) { clearInventory(group.getItemStackHandler()); clearInventory(group.getPlaceholderSlotsHandler()); diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/DataAccessHatchMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/DataAccessHatchMachine.java index 9ba2dd0c71e..9f65119f4b5 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/DataAccessHatchMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/DataAccessHatchMachine.java @@ -10,7 +10,6 @@ import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.gui.widget.SlotWidget; import com.gregtechceu.gtceu.api.machine.feature.IDataInfoProvider; -import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiController; import com.gregtechceu.gtceu.api.machine.multiblock.part.TieredPartMachine; import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; @@ -48,7 +47,7 @@ @MethodsReturnNonnullByDefault @ParametersAreNonnullByDefault public class DataAccessHatchMachine extends TieredPartMachine - implements IMachineLife, IDataAccessHatch, IDataInfoProvider, IMonitorComponent { + implements IDataAccessHatch, IDataInfoProvider, IMonitorComponent { private final Set recipes; @Getter @@ -117,7 +116,8 @@ protected int getInventorySize() { } @Override - public void onMachineRemoved() { + public void onMachineDestroyed() { + super.onMachineDestroyed(); clearInventory(importItems.storage); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/FluidHatchPartMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/FluidHatchPartMachine.java index 496ed12bf64..1c12f7a736f 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/FluidHatchPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/FluidHatchPartMachine.java @@ -12,7 +12,6 @@ import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.fancyconfigurator.CircuitFancyConfigurator; import com.gregtechceu.gtceu.api.machine.feature.IHasCircuitSlot; -import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; 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.NotifiableFluidTank; @@ -53,7 +52,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -public class FluidHatchPartMachine extends TieredIOPartMachine implements IMachineLife, IHasCircuitSlot, IPaintable { +public class FluidHatchPartMachine extends TieredIOPartMachine implements IHasCircuitSlot, IPaintable { public static final int INITIAL_TANK_CAPACITY_1X = 8 * FluidType.BUCKET_VOLUME; public static final int INITIAL_TANK_CAPACITY_4X = 2 * FluidType.BUCKET_VOLUME; @@ -102,7 +101,8 @@ public static int getTankCapacity(int initialCapacity, int tier) { } @Override - public void onMachineRemoved() { + public void onMachineDestroyed() { + super.onMachineDestroyed(); if (!ConfigHolder.INSTANCE.machines.ghostCircuit) { clearInventory(circuitInventory.storage); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/ItemBusPartMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/ItemBusPartMachine.java index e6306d10891..b37471501fa 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/ItemBusPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/ItemBusPartMachine.java @@ -10,7 +10,6 @@ import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.fancyconfigurator.CircuitFancyConfigurator; import com.gregtechceu.gtceu.api.machine.feature.IHasCircuitSlot; -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; @@ -49,7 +48,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class ItemBusPartMachine extends TieredIOPartMachine - implements IDistinctPart, IMachineLife, IHasCircuitSlot, IPaintable { + implements IDistinctPart, IHasCircuitSlot, IPaintable { @Getter @SaveField @@ -104,7 +103,8 @@ protected NotifiableItemStackHandler createCircuitItemHandler(IO io) { } @Override - public void onMachineRemoved() { + public void onMachineDestroyed() { + super.onMachineDestroyed(); clearInventory(getInventory().storage); if (!ConfigHolder.INSTANCE.machines.ghostCircuit) { diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/MaintenanceHatchPartMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/MaintenanceHatchPartMachine.java index 61200cbbe0d..200acfc9dac 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/MaintenanceHatchPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/MaintenanceHatchPartMachine.java @@ -9,7 +9,6 @@ import com.gregtechceu.gtceu.api.item.tool.ToolHelper; import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.feature.IInteractedMachine; -import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMaintenanceMachine; import com.gregtechceu.gtceu.api.machine.multiblock.part.TieredPartMachine; import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; @@ -56,7 +55,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class MaintenanceHatchPartMachine extends TieredPartMachine - implements IMachineLife, IMaintenanceMachine, IInteractedMachine { + implements IMaintenanceMachine, IInteractedMachine { private static final float MAX_DURATION_MULTIPLIER = 1.1f; private static final float MIN_DURATION_MULTIPLIER = 0.9f; @@ -99,7 +98,8 @@ protected NotifiableItemStackHandler createInventory() { } @Override - public void onMachineRemoved() { + public void onMachineDestroyed() { + super.onMachineDestroyed(); clearInventory(itemStackHandler); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/ObjectHolderMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/ObjectHolderMachine.java index f9c3b37191a..405ea3e2d23 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/ObjectHolderMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/ObjectHolderMachine.java @@ -9,7 +9,6 @@ import com.gregtechceu.gtceu.api.item.component.IDataItem; import com.gregtechceu.gtceu.api.item.component.IItemComponent; import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.multiblock.part.MultiblockPartMachine; import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; @@ -32,7 +31,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -public class ObjectHolderMachine extends MultiblockPartMachine implements IObjectHolder, IMachineLife { +public class ObjectHolderMachine extends MultiblockPartMachine implements IObjectHolder { // purposefully not exposed to automation or capabilities @SaveField @@ -87,7 +86,8 @@ private ItemStack getHeldItem(int slot, boolean remove) { } @Override - public void onMachineRemoved() { + public void onMachineDestroyed() { + super.onMachineDestroyed(); clearInventory(this.heldItems.storage); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/RotorHolderPartMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/RotorHolderPartMachine.java index 0002d4648e9..85addeced01 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/RotorHolderPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/RotorHolderPartMachine.java @@ -8,7 +8,6 @@ import com.gregtechceu.gtceu.api.gui.widget.BlockableSlotWidget; import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.feature.IInteractedMachine; -import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.feature.ITieredMachine; import com.gregtechceu.gtceu.api.machine.feature.multiblock.*; import com.gregtechceu.gtceu.api.machine.multiblock.part.TieredPartMachine; @@ -44,7 +43,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class RotorHolderPartMachine extends TieredPartMachine - implements IMachineLife, IRotorHolderMachine, IInteractedMachine { + implements IRotorHolderMachine, IInteractedMachine { @SaveField public final NotifiableItemStackHandler inventory; @@ -74,7 +73,8 @@ public RotorHolderPartMachine(BlockEntityCreationInfo info, int tier) { ////////////////////////////////////// @Override - public void onMachineRemoved() { + public void onMachineDestroyed() { + super.onMachineDestroyed(); clearInventory(inventory.storage); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/primitive/PrimitiveWorkableMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/primitive/PrimitiveWorkableMachine.java index f27bdc427fc..787b5938e09 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/primitive/PrimitiveWorkableMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/primitive/PrimitiveWorkableMachine.java @@ -5,7 +5,6 @@ import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.capability.recipe.ItemRecipeCapability; import com.gregtechceu.gtceu.api.machine.feature.IEnvironmentalHazardEmitter; -import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.multiblock.WorkableMultiblockMachine; import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; @@ -19,7 +18,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class PrimitiveWorkableMachine extends WorkableMultiblockMachine - implements IMachineLife, IEnvironmentalHazardEmitter { + implements IEnvironmentalHazardEmitter { @SaveField public final NotifiableItemStackHandler importItems; @@ -61,7 +60,8 @@ protected NotifiableFluidTank createExportFluidHandler() { } @Override - public void onMachineRemoved() { + public void onMachineDestroyed() { + super.onMachineDestroyed(); clearInventory(importItems.storage); clearInventory(exportItems.storage); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/steam/SteamMinerMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/steam/SteamMinerMachine.java index a4d45488261..c19214ccc33 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/steam/SteamMinerMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/steam/SteamMinerMachine.java @@ -47,8 +47,8 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -public class SteamMinerMachine extends SteamWorkableMachine implements IMiner, IControllable, IExhaustVentMachine, - IUIMachine, IMachineLife, IDataInfoProvider { +public class SteamMinerMachine extends SteamWorkableMachine implements IControllable, IExhaustVentMachine, + IUIMachine, IDataInfoProvider, IMiner { @Getter @SaveField @@ -89,7 +89,8 @@ protected NotifiableItemStackHandler createExportItemHandler() { } @Override - public void onMachineRemoved() { + public void onMachineDestroyed() { + super.onMachineDestroyed(); getRecipeLogic().onRemove(); clearInventory(exportItems.storage); } @@ -211,6 +212,7 @@ void addDisplayText2(List textList) { textList.add(Component.translatable("gtceu.machine.miner.minez", this.getRecipeLogic().getMineZ())); } + @Override public boolean drainInput(boolean simulate) { long resultSteam = steamTank.getFluidInTank(0).getAmount() - energyPerTick; if (!this.isVentingBlocked() && resultSteam >= 0L && resultSteam <= steamTank.getTankCapacity(0)) { diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/steam/SteamSolidBoilerMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/steam/SteamSolidBoilerMachine.java index 667b50e615f..8f240d43a8b 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/steam/SteamSolidBoilerMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/steam/SteamSolidBoilerMachine.java @@ -8,7 +8,6 @@ import com.gregtechceu.gtceu.api.data.tag.TagPrefix; import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.gui.widget.SlotWidget; -import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.steam.SteamBoilerMachine; import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; @@ -36,7 +35,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -public class SteamSolidBoilerMachine extends SteamBoilerMachine implements IMachineLife { +public class SteamSolidBoilerMachine extends SteamBoilerMachine { public static final Object2BooleanMap FUEL_CACHE = new Object2BooleanOpenHashMap<>(); @@ -138,7 +137,8 @@ public ModularUI createUI(Player entityPlayer) { } @Override - public void onMachineRemoved() { + public void onMachineDestroyed() { + super.onMachineDestroyed(); clearInventory(fuelHandler.storage); clearInventory(ashHandler.storage); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/BufferMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/BufferMachine.java index 9fa3d889e57..505feaabcbf 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/BufferMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/BufferMachine.java @@ -7,7 +7,6 @@ import com.gregtechceu.gtceu.api.gui.widget.TankWidget; import com.gregtechceu.gtceu.api.machine.TieredMachine; import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine; -import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.trait.AutoOutputTrait; import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; @@ -27,7 +26,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -public class BufferMachine extends TieredMachine implements IMachineLife, IFancyUIMachine { +public class BufferMachine extends TieredMachine implements IFancyUIMachine { public static final int TANK_SIZE = 64000; @@ -106,7 +105,8 @@ public Widget createUIWidget() { //////////////////////////////// @Override - public void onMachineRemoved() { + public void onMachineDestroyed() { + super.onMachineDestroyed(); clearInventory(inventory.storage); } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CrateMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CrateMachine.java index 6b4bf1104a8..b4099c2b3c3 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CrateMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CrateMachine.java @@ -38,7 +38,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -public class CrateMachine extends MetaMachine implements IUIMachine, IMachineLife, +public class CrateMachine extends MetaMachine implements IUIMachine, IDropSaveMachine, IInteractedMachine { public static final BooleanProperty TAPED_PROPERTY = GTMachineModelProperties.IS_TAPED; @@ -135,7 +135,8 @@ public boolean saveBreak() { } @Override - public void onMachineRemoved() { + public void onMachineDestroyed() { + super.onMachineDestroyed(); if (!isTaped) clearInventory(inventory.storage); } } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEInputBusPartMachine.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEInputBusPartMachine.java index c2a08654ab1..fb72184cb79 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEInputBusPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEInputBusPartMachine.java @@ -4,7 +4,6 @@ import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.machine.feature.IDataStickInteractable; import com.gregtechceu.gtceu.api.machine.feature.IHasCircuitSlot; -import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; import com.gregtechceu.gtceu.common.item.IntCircuitBehaviour; import com.gregtechceu.gtceu.integration.ae2.gui.widget.AEItemConfigWidget; @@ -33,7 +32,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class MEInputBusPartMachine extends MEBusPartMachine - implements IDataStickInteractable, IMachineLife, IHasCircuitSlot { + implements IDataStickInteractable, IHasCircuitSlot { protected final static int CONFIG_SIZE = 16; @@ -48,7 +47,7 @@ public MEInputBusPartMachine(BlockEntityCreationInfo info) { ///////////////////////////////// @Override - public void onMachineRemoved() { + public void onMachineDestroyed() { flushInventory(); } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEInputHatchPartMachine.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEInputHatchPartMachine.java index 747b6e45d3a..1de078d911c 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEInputHatchPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEInputHatchPartMachine.java @@ -4,7 +4,6 @@ import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.machine.feature.IDataStickInteractable; import com.gregtechceu.gtceu.api.machine.feature.IHasCircuitSlot; -import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; import com.gregtechceu.gtceu.common.item.IntCircuitBehaviour; import com.gregtechceu.gtceu.integration.ae2.gui.widget.AEFluidConfigWidget; @@ -34,7 +33,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class MEInputHatchPartMachine extends MEHatchPartMachine - implements IDataStickInteractable, IMachineLife, IHasCircuitSlot { + implements IDataStickInteractable, IHasCircuitSlot { protected ExportOnlyAEFluidList aeFluidHandler; @@ -47,7 +46,8 @@ public MEInputHatchPartMachine(BlockEntityCreationInfo info) { ///////////////////////////////// @Override - public void onMachineRemoved() { + public void onMachineDestroyed() { + super.onMachineDestroyed(); flushInventory(); } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEOutputBusPartMachine.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEOutputBusPartMachine.java index 50632bf3161..fb94580744f 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEOutputBusPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEOutputBusPartMachine.java @@ -4,7 +4,6 @@ import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.feature.IInteractedMachine; -import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; @@ -33,7 +32,7 @@ */ @MethodsReturnNonnullByDefault @ParametersAreNonnullByDefault -public class MEOutputBusPartMachine extends MEBusPartMachine implements IMachineLife, IInteractedMachine { +public class MEOutputBusPartMachine extends MEBusPartMachine implements IInteractedMachine { @SaveField private KeyStorage internalBuffer; // Do not use KeyCounter, use our simple implementation @@ -53,7 +52,7 @@ protected NotifiableItemStackHandler createInventory() { } @Override - public void onMachineRemoved() { + public void onMachineDestroyed() { var grid = getMainNode().getGrid(); if (grid != null && !internalBuffer.isEmpty()) { for (var entry : internalBuffer) { diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEOutputHatchPartMachine.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEOutputHatchPartMachine.java index 28bb3c72746..268dbdf0831 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEOutputHatchPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEOutputHatchPartMachine.java @@ -3,7 +3,6 @@ import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.ingredient.FluidIngredient; @@ -32,7 +31,7 @@ @MethodsReturnNonnullByDefault @ParametersAreNonnullByDefault -public class MEOutputHatchPartMachine extends MEHatchPartMachine implements IMachineLife { +public class MEOutputHatchPartMachine extends MEHatchPartMachine { @SaveField private KeyStorage internalBuffer; // Do not use KeyCounter, use our simple implementation @@ -52,7 +51,8 @@ protected NotifiableFluidTank createTank(int initialCapacity, int slots) { } @Override - public void onMachineRemoved() { + public void onMachineDestroyed() { + super.onMachineDestroyed(); var grid = getMainNode().getGrid(); if (grid != null && !internalBuffer.isEmpty()) { for (var entry : internalBuffer) { diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEPatternBufferPartMachine.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEPatternBufferPartMachine.java index 46c6131fd6d..552b3f7663b 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEPatternBufferPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEPatternBufferPartMachine.java @@ -415,7 +415,7 @@ public PatternContainerGroup getTerminalGroup() { } @Override - public void onMachineRemoved() { + public void onMachineDestroyed() { clearInventory(patternInventory); clearInventory(shareInventory); } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEPatternBufferProxyPartMachine.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEPatternBufferProxyPartMachine.java index ebbc916d1fb..aefb82537cd 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEPatternBufferProxyPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEPatternBufferProxyPartMachine.java @@ -5,7 +5,6 @@ import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.feature.IDataStickInteractable; -import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.multiblock.part.TieredIOPartMachine; import com.gregtechceu.gtceu.api.machine.trait.RecipeHandlerList; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; @@ -32,8 +31,7 @@ @MethodsReturnNonnullByDefault @ParametersAreNonnullByDefault -public class MEPatternBufferProxyPartMachine extends TieredIOPartMachine - implements IMachineLife, IDataStickInteractable { +public class MEPatternBufferProxyPartMachine extends TieredIOPartMachine implements IDataStickInteractable { @Getter private final ProxySlotRecipeHandler proxySlotRecipeHandler; @@ -96,7 +94,8 @@ public ModularUI createUI(Player entityPlayer) { } @Override - public void onMachineRemoved() { + public void onMachineDestroyed() { + super.onMachineDestroyed(); var buf = getBuffer(); if (buf != null) { buf.removeProxy(this); From 98898c1979d27e55671067fc992a833b04e9d8a1 Mon Sep 17 00:00:00 2001 From: YoungOnion <39562198+YoungOnionMC@users.noreply.github.com> Date: Sun, 8 Feb 2026 13:07:36 -0700 Subject: [PATCH 05/10] update mui to the start of traits and clean up some code --- .../gtceu/common/data/mui/GTMuiWidgets.java | 26 +++--- .../data/mui/GTSingleblockMachinePanels.java | 86 +++++++++---------- .../machine/electric/BlockBreakerMachine.java | 32 +------ .../machine/electric/ChargerMachine.java | 1 - .../machine/electric/FisherMachine.java | 9 -- .../electric/ItemCollectorMachine.java | 6 +- .../common/machine/electric/MinerMachine.java | 5 +- .../common/machine/electric/PumpMachine.java | 24 +----- .../electric/CentralMonitorMachine.java | 1 - .../common/machine/storage/BufferMachine.java | 81 +---------------- .../machine/storage/QuantumChestMachine.java | 9 +- .../machine/storage/QuantumTankMachine.java | 31 ++----- 12 files changed, 79 insertions(+), 232 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/mui/GTMuiWidgets.java b/src/main/java/com/gregtechceu/gtceu/common/data/mui/GTMuiWidgets.java index 4a2cce66a74..d79e591b3ca 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/mui/GTMuiWidgets.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/mui/GTMuiWidgets.java @@ -3,10 +3,10 @@ import com.gregtechceu.gtceu.api.GTValues; import com.gregtechceu.gtceu.api.machine.MachineDefinition; import com.gregtechceu.gtceu.api.machine.SimpleTieredMachine; -import com.gregtechceu.gtceu.api.machine.feature.IAutoOutputItem; import com.gregtechceu.gtceu.api.machine.feature.IHasCircuitSlot; import com.gregtechceu.gtceu.api.machine.feature.IRecipeLogicMachine; import com.gregtechceu.gtceu.api.machine.feature.IVoidable; +import com.gregtechceu.gtceu.api.machine.trait.AutoOutputTrait; import com.gregtechceu.gtceu.api.mui.base.IPanelHandler; import com.gregtechceu.gtceu.api.mui.base.drawable.IDrawable; import com.gregtechceu.gtceu.api.mui.base.drawable.IKey; @@ -148,9 +148,9 @@ public static ToggleButton createVoidingButton(IVoidable machine, PanelSyncManag // EnumSyncValue voidMode = new EnumSyncValue(IVoidable.VoidingMode.class, machine.) } - public static ToggleButton createAutoOutputItemButton(IAutoOutputItem machine, PanelSyncManager syncManager) { - BooleanSyncValue itemOutputs = new BooleanSyncValue(machine::isAutoOutputItems, - machine::setAutoOutputItems); + public static ToggleButton createAutoOutputItemButton(AutoOutputTrait autoOutput, PanelSyncManager syncManager) { + BooleanSyncValue itemOutputs = new BooleanSyncValue(autoOutput::isAutoOutputItems, + autoOutput::setAllowAutoOutputItems); syncManager.syncValue("auto_output_items", itemOutputs); return new ToggleButton() .value(new BoolValue.Dynamic(itemOutputs::getBoolValue, itemOutputs::setBoolValue)) @@ -161,9 +161,9 @@ public static ToggleButton createAutoOutputItemButton(IAutoOutputItem machine, P "cover.voiding.label.disabled"))))); } - public static ToggleButton createAutoOutputFluidButton(SimpleTieredMachine machine, PanelSyncManager syncManager) { - BooleanSyncValue fluidOutputs = new BooleanSyncValue(machine::isAutoOutputFluids, - machine::setAutoOutputFluids); + public static ToggleButton createAutoOutputFluidButton(AutoOutputTrait autoOutput, PanelSyncManager syncManager) { + BooleanSyncValue fluidOutputs = new BooleanSyncValue(autoOutput::isAutoOutputFluids, + autoOutput::setAllowAutoOutputFluids); syncManager.syncValue("auto_output_fluids", fluidOutputs); return new ToggleButton() .value(new BoolValue.Dynamic(fluidOutputs::getBoolValue, fluidOutputs::setBoolValue)) @@ -174,9 +174,9 @@ public static ToggleButton createAutoOutputFluidButton(SimpleTieredMachine machi "cover.voiding.label.disabled"))))); } - public static ToggleButton createInputFromOutputItem(SimpleTieredMachine machine, PanelSyncManager syncManager) { - BooleanSyncValue inputFromOutputItem = new BooleanSyncValue(machine::isAllowInputFromOutputSideItems, - machine::setAllowInputFromOutputSideItems); + public static ToggleButton createInputFromOutputItem(AutoOutputTrait autoOutput, PanelSyncManager syncManager) { + BooleanSyncValue inputFromOutputItem = new BooleanSyncValue(autoOutput::allowsItemInputFromOutputSide, + autoOutput::setAllowItemInputFromOutputSide); syncManager.syncValue("input_from_output_item", inputFromOutputItem); return new ToggleButton() .value(new BoolValue.Dynamic(inputFromOutputItem::getBoolValue, inputFromOutputItem::setBoolValue)) @@ -187,9 +187,9 @@ public static ToggleButton createInputFromOutputItem(SimpleTieredMachine machine "cover.voiding.label.disabled"))))); } - public static ToggleButton createInputFromOutputFluid(SimpleTieredMachine machine, PanelSyncManager syncManager) { - BooleanSyncValue inputFromOutputFluid = new BooleanSyncValue(machine::isAllowInputFromOutputSideFluids, - machine::setAllowInputFromOutputSideFluids); + public static ToggleButton createInputFromOutputFluid(AutoOutputTrait autoOutput, PanelSyncManager syncManager) { + BooleanSyncValue inputFromOutputFluid = new BooleanSyncValue(autoOutput::allowsFluidInputFromOutputSide, + autoOutput::setAllowFluidInputFromOutputSide); syncManager.syncValue("input_from_output_fluid", inputFromOutputFluid); return new ToggleButton() .value(new BoolValue.Dynamic(inputFromOutputFluid::getBoolValue, inputFromOutputFluid::setBoolValue)) diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/mui/GTSingleblockMachinePanels.java b/src/main/java/com/gregtechceu/gtceu/common/data/mui/GTSingleblockMachinePanels.java index b19410372bb..29c2159ce88 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/mui/GTSingleblockMachinePanels.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/mui/GTSingleblockMachinePanels.java @@ -5,6 +5,7 @@ import com.gregtechceu.gtceu.api.machine.SimpleTieredMachine; import com.gregtechceu.gtceu.api.machine.WorkableTieredMachine; import com.gregtechceu.gtceu.api.machine.steam.SimpleSteamMachine; +import com.gregtechceu.gtceu.api.machine.trait.AutoOutputTrait; import com.gregtechceu.gtceu.api.mui.drawable.UITexture; import com.gregtechceu.gtceu.api.mui.factory.PanelFactory; import com.gregtechceu.gtceu.api.mui.factory.PosGuiData; @@ -13,6 +14,7 @@ import com.gregtechceu.gtceu.api.mui.value.sync.PanelSyncManager; import com.gregtechceu.gtceu.api.mui.widgets.SlotGroupWidget; import com.gregtechceu.gtceu.api.mui.widgets.layout.Column; +import com.gregtechceu.gtceu.api.mui.widgets.layout.Flow; import com.gregtechceu.gtceu.api.mui.widgets.layout.Row; import com.gregtechceu.gtceu.api.recipe.gui.GTRecipeTypeUIs; import com.gregtechceu.gtceu.client.mui.screen.ModularPanel; @@ -44,9 +46,6 @@ public class GTSingleblockMachinePanels { int slotHeight = Math.max(inputItemGrid.length + inputFluidGrid.length, outputItemGrid.length + outputFluidGrid.length); - boolean autoOutputItem = simpleTieredMachine.hasAutoOutputItem(); - boolean autoOutputFluid = simpleTieredMachine.hasAutoOutputFluid(); - boolean ghostCircuit = simpleTieredMachine.isCircuitSlotEnabled(); panel.size(176, 76 + 21 + 18 + 9 + 18 * Math.max(2, slotHeight)); @@ -59,9 +58,12 @@ public class GTSingleblockMachinePanels { if (backgroundTexture == null) { backgroundTexture = GTGuiTextures.BACKGROUND; } + + var autoOutput = machine.getTraitHolder().getTrait(AutoOutputTrait.TYPE); + panel.child(GTMuiWidgets.createTitleBar(machine.getDefinition(), 176)) - .child(new Row() - .childIf(hasXEI, GTRecipeTypeUIs.recipeTypeUIs.get(workableMachine.getRecipeType()) + .child(Flow.row() + .childIf(hasXEI, () -> GTRecipeTypeUIs.recipeTypeUIs.get(workableMachine.getRecipeType()) .getBackedSlotsRow(syncManager, theme, simpleTieredMachine.importItems, simpleTieredMachine.exportItems, simpleTieredMachine.importFluids, simpleTieredMachine.exportFluids, @@ -72,7 +74,7 @@ public class GTSingleblockMachinePanels { // .left(7) .bottom(76 + 7 + 18 + 9)) .child(SlotGroupWidget.playerInventory(false).left(7).bottom(7)) - .child(new Column() + .child(Flow.col() .coverChildren() .leftRel(1.0f) .reverseLayout(true) @@ -82,15 +84,15 @@ public class GTSingleblockMachinePanels { .background(backgroundTexture.getSubArea(0.25f, 0f, 1.0f, 1.0f)) .child(GTMuiWidgets.createPowerButton(workableMachine, syncManager)) .child(GTMuiWidgets.createBatterySlot(simpleTieredMachine, syncManager)) - .childIf(autoOutputItem, - GTMuiWidgets.createAutoOutputItemButton(simpleTieredMachine, syncManager)) - .childIf(autoOutputFluid, - GTMuiWidgets.createAutoOutputFluidButton(simpleTieredMachine, syncManager)) - .childIf(autoOutputItem, - GTMuiWidgets.createInputFromOutputItem(simpleTieredMachine, syncManager)) - .childIf(autoOutputFluid, - GTMuiWidgets.createInputFromOutputFluid(simpleTieredMachine, syncManager))) - .child(new Column() + .childIf(autoOutput != null, + () -> GTMuiWidgets.createAutoOutputItemButton(autoOutput, syncManager)) + .childIf(autoOutput != null, + () -> GTMuiWidgets.createAutoOutputFluidButton(autoOutput, syncManager)) + .childIf(autoOutput != null, + () -> GTMuiWidgets.createInputFromOutputItem(autoOutput, syncManager)) + .childIf(autoOutput != null, + () -> GTMuiWidgets.createInputFromOutputFluid(autoOutput, syncManager))) + .child(Flow.col() .coverChildren() .rightRel(1.0f) .reverseLayout(true) @@ -98,7 +100,7 @@ public class GTSingleblockMachinePanels { .bottom(16) .background(GTGuiTextures.BACKGROUND.getSubArea(0f, 0f, 0.75f, 1.0f)) .childIf(ghostCircuit, - GTMuiWidgets.createCircuitSlotPanel(simpleTieredMachine, panel, syncManager))) + () -> GTMuiWidgets.createCircuitSlotPanel(simpleTieredMachine, panel, syncManager))) .child(GTMuiWidgets.createGTLogo() .right(7).bottom(7 + 78)); if (hasXEI && false) { @@ -132,9 +134,6 @@ public class GTSingleblockMachinePanels { int slotHeight = Math.max(inputItemGrid.length + inputFluidGrid.length, outputItemGrid.length + outputFluidGrid.length); - boolean autoOutputItem = simpleTieredMachine.hasAutoOutputItem(); - boolean autoOutputFluid = simpleTieredMachine.hasAutoOutputFluid(); - boolean ghostCircuit = simpleTieredMachine.isCircuitSlotEnabled(); panel.size(176, 76 + 21 + 18 + 9 + 18 * slotHeight); @@ -148,9 +147,11 @@ public class GTSingleblockMachinePanels { backgroundTexture = GTGuiTextures.BACKGROUND; } + var autoOutput = machine.getTraitHolder().getTrait(AutoOutputTrait.TYPE); + panel.child(GTMuiWidgets.createTitleBar(machine.getDefinition(), 176)) - .child(new Row() - .childIf(hasXEI, GTRecipeTypeUIs.recipeTypeUIs.get(workableMachine.getRecipeType()) + .child(Flow.row() + .childIf(hasXEI, () -> GTRecipeTypeUIs.recipeTypeUIs.get(workableMachine.getRecipeType()) .getBackedSlotsRow(syncManager, theme, simpleTieredMachine.importItems, simpleTieredMachine.exportItems, simpleTieredMachine.importFluids, simpleTieredMachine.exportFluids, @@ -161,7 +162,7 @@ public class GTSingleblockMachinePanels { // .left(7) .bottom(76 + 7 + 18 + 9)) .child(SlotGroupWidget.playerInventory(false).left(7).bottom(7)) - .child(new Column() + .child(Flow.col() .coverChildren() .leftRel(1.0f) .reverseLayout(true) @@ -171,15 +172,15 @@ public class GTSingleblockMachinePanels { .background(backgroundTexture.getSubArea(0.25f, 0f, 1.0f, 1.0f)) .child(GTMuiWidgets.createPowerButton(workableMachine, syncManager)) .child(GTMuiWidgets.createBatterySlot(simpleTieredMachine, syncManager)) - .childIf(autoOutputItem, - GTMuiWidgets.createAutoOutputItemButton(simpleTieredMachine, syncManager)) - .childIf(autoOutputFluid, - GTMuiWidgets.createAutoOutputFluidButton(simpleTieredMachine, syncManager)) - .childIf(autoOutputItem, - GTMuiWidgets.createInputFromOutputItem(simpleTieredMachine, syncManager)) - .childIf(autoOutputFluid, - GTMuiWidgets.createInputFromOutputFluid(simpleTieredMachine, syncManager))) - .child(new Column() + .childIf(autoOutput != null, + () -> GTMuiWidgets.createAutoOutputItemButton(autoOutput, syncManager)) + .childIf(autoOutput != null, + () -> GTMuiWidgets.createAutoOutputFluidButton(autoOutput, syncManager)) + .childIf(autoOutput != null, + () -> GTMuiWidgets.createInputFromOutputItem(autoOutput, syncManager)) + .childIf(autoOutput != null, + () -> GTMuiWidgets.createInputFromOutputFluid(autoOutput, syncManager))) + .child(Flow.col() .coverChildren() .rightRel(1.0f) .reverseLayout(true) @@ -187,7 +188,7 @@ public class GTSingleblockMachinePanels { .bottom(16) .background(GTGuiTextures.BACKGROUND.getSubArea(0f, 0f, 0.75f, 1.0f)) .childIf(ghostCircuit, - GTMuiWidgets.createCircuitSlotPanel(simpleTieredMachine, panel, syncManager))) + () -> GTMuiWidgets.createCircuitSlotPanel(simpleTieredMachine, panel, syncManager))) .child(GTMuiWidgets.createGTLogo() .right(7).bottom(7 + 78)); if (hasXEI && false) { @@ -221,9 +222,6 @@ public class GTSingleblockMachinePanels { int slotHeight = Math.max(inputItemGrid.length + inputFluidGrid.length, outputItemGrid.length + outputFluidGrid.length); - boolean autoOutputItem = simpleTieredMachine.hasAutoOutputItem(); - boolean autoOutputFluid = simpleTieredMachine.hasAutoOutputFluid(); - boolean ghostCircuit = simpleTieredMachine.isCircuitSlotEnabled(); panel.size(176, 76 + 21 + 18 + 9 + 18 * slotHeight); @@ -237,6 +235,8 @@ public class GTSingleblockMachinePanels { boolean hasXEI = GTRecipeTypeUIs.recipeTypeUIs.containsKey(workableMachine.getRecipeType()); + var autoOutput = machine.getTraitHolder().getTrait(AutoOutputTrait.TYPE); + panel.child(GTMuiWidgets.createTitleBar(machine.getDefinition(), 176)) .child(new Row() .childIf(hasXEI, GTRecipeTypeUIs.recipeTypeUIs.get(workableMachine.getRecipeType()) @@ -260,14 +260,14 @@ public class GTSingleblockMachinePanels { .background(backgroundTexture.getSubArea(0.25f, 0f, 1.0f, 1.0f)) .child(GTMuiWidgets.createPowerButton(workableMachine, syncManager)) .child(GTMuiWidgets.createBatterySlot(simpleTieredMachine, syncManager)) - .childIf(autoOutputItem, - GTMuiWidgets.createAutoOutputItemButton(simpleTieredMachine, syncManager)) - .childIf(autoOutputFluid, - GTMuiWidgets.createAutoOutputFluidButton(simpleTieredMachine, syncManager)) - .childIf(autoOutputItem, - GTMuiWidgets.createInputFromOutputItem(simpleTieredMachine, syncManager)) - .childIf(autoOutputFluid, - GTMuiWidgets.createInputFromOutputFluid(simpleTieredMachine, syncManager))) + .childIf(autoOutput != null, + () -> GTMuiWidgets.createAutoOutputItemButton(autoOutput, syncManager)) + .childIf(autoOutput != null, + () -> GTMuiWidgets.createAutoOutputFluidButton(autoOutput, syncManager)) + .childIf(autoOutput != null, + () -> GTMuiWidgets.createInputFromOutputItem(autoOutput, syncManager)) + .childIf(autoOutput != null, + () -> GTMuiWidgets.createInputFromOutputFluid(autoOutput, syncManager))) .child(new Column() .coverChildren() .rightRel(1.0f) diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/BlockBreakerMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/BlockBreakerMachine.java index f2806e047ac..3afd78f124f 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/BlockBreakerMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/BlockBreakerMachine.java @@ -5,26 +5,19 @@ import com.gregtechceu.gtceu.api.capability.GTCapabilityHelper; import com.gregtechceu.gtceu.api.capability.IControllable; import com.gregtechceu.gtceu.api.capability.recipe.IO; -import com.gregtechceu.gtceu.api.gui.GuiTextures; -import com.gregtechceu.gtceu.api.item.tool.GTToolType; import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.TieredEnergyMachine; -import com.gregtechceu.gtceu.api.machine.trait.AutoOutputTrait; import com.gregtechceu.gtceu.api.machine.feature.IMuiMachine; +import com.gregtechceu.gtceu.api.machine.trait.AutoOutputTrait; import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; -import com.gregtechceu.gtceu.api.mui.base.drawable.IKey; import com.gregtechceu.gtceu.api.mui.factory.PosGuiData; import com.gregtechceu.gtceu.api.mui.utils.Alignment; -import com.gregtechceu.gtceu.api.mui.value.BoolValue; -import com.gregtechceu.gtceu.api.mui.value.sync.BooleanSyncValue; import com.gregtechceu.gtceu.api.mui.value.sync.ItemSlotSyncHandler; import com.gregtechceu.gtceu.api.mui.value.sync.PanelSyncManager; import com.gregtechceu.gtceu.api.mui.widgets.SlotGroupWidget; -import com.gregtechceu.gtceu.api.mui.widgets.ToggleButton; import com.gregtechceu.gtceu.api.mui.widgets.layout.Column; import com.gregtechceu.gtceu.api.mui.widgets.slot.ItemSlot; import com.gregtechceu.gtceu.api.mui.widgets.slot.ModularSlot; -import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; @@ -34,16 +27,10 @@ import com.gregtechceu.gtceu.common.data.mui.GTMuiWidgets; import com.gregtechceu.gtceu.common.mui.GTGuiTextures; import com.gregtechceu.gtceu.config.ConfigHolder; -import com.gregtechceu.gtceu.utils.GTTransferUtils; import com.gregtechceu.gtceu.utils.ISubscription; -import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; - import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; -import net.minecraft.network.chat.MutableComponent; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.network.chat.Component; import net.minecraft.server.TickTask; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.item.ItemStack; @@ -55,8 +42,6 @@ import org.jetbrains.annotations.Nullable; import java.util.List; -import java.util.Set; -import java.util.function.BiFunction; import javax.annotation.ParametersAreNonnullByDefault; @@ -395,24 +380,11 @@ public ModularPanel buildUI(PosGuiData data, PanelSyncManager syncManager, UISet .child(GTMuiWidgets.createPowerButton(this::isWorkingEnabled, this::setWorkingEnabled, syncManager)) .child(createBatterySlot(syncManager)) - .child(createAutoOutputItemButton(syncManager)) + .child(GTMuiWidgets.createAutoOutputItemButton(autoOutput, syncManager)) .excludeAreaInXei()); return panel; } - public ToggleButton createAutoOutputItemButton(PanelSyncManager syncManager) { - BooleanSyncValue itemOutputs = new BooleanSyncValue(this::isAutoOutputItems, - this::setAutoOutputItems); - syncManager.syncValue("auto_output_items", itemOutputs); - return new ToggleButton() - .value(new BoolValue.Dynamic(itemOutputs::getBoolValue, itemOutputs::setBoolValue)) - .overlay(GTGuiTextures.BUTTON_ITEM_OUTPUT) - .tooltipAutoUpdate(true) - .tooltipBuilder((r) -> r.addLine(IKey.lang(Component.translatable("gtceu.gui.item_auto_output", - Component.translatable(itemOutputs.getBoolValue() ? "cover.voiding.label.enabled" : - "cover.voiding.label.disabled"))))); - } - public ItemSlot createBatterySlot(PanelSyncManager syncManager) { ItemSlotSyncHandler battery = new ItemSlotSyncHandler(new ModularSlot(this.chargerInventory, 0)); syncManager.syncValue("battery", battery); diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ChargerMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ChargerMachine.java index 862637e30a6..97146587afa 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ChargerMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ChargerMachine.java @@ -5,7 +5,6 @@ import com.gregtechceu.gtceu.api.capability.*; import com.gregtechceu.gtceu.api.capability.compat.FeCompat; import com.gregtechceu.gtceu.api.machine.TieredEnergyMachine; -import com.gregtechceu.gtceu.api.machine.feature.IMachineLife; import com.gregtechceu.gtceu.api.machine.feature.IMuiMachine; import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; import com.gregtechceu.gtceu.api.machine.trait.NotifiableEnergyContainer; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/FisherMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/FisherMachine.java index da7ae6e7296..99392b09942 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/FisherMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/FisherMachine.java @@ -24,7 +24,6 @@ import com.gregtechceu.gtceu.api.mui.widgets.layout.Row; import com.gregtechceu.gtceu.api.mui.widgets.slot.ItemSlot; import com.gregtechceu.gtceu.api.mui.widgets.slot.ModularSlot; -import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; @@ -40,10 +39,7 @@ import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; import net.minecraft.core.NonNullList; -import net.minecraft.network.chat.MutableComponent; -import net.minecraft.resources.ResourceLocation; import net.minecraft.network.chat.Component; -import net.minecraft.server.TickTask; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.projectile.FishingHook; @@ -61,9 +57,6 @@ import lombok.Setter; import org.jetbrains.annotations.Nullable; -import java.util.Set; -import java.util.function.BiFunction; - import javax.annotation.ParametersAreNonnullByDefault; @ParametersAreNonnullByDefault @@ -353,8 +346,6 @@ public ModularPanel buildUI(PosGuiData data, PanelSyncManager syncManager, UISet default -> 2; }; - boolean autoOutputItem = hasAutoOutputItem(); - BooleanSyncValue power = new BooleanSyncValue(() -> active, (b) -> active = b); syncManager.syncValue("working_enabled", power); diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ItemCollectorMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ItemCollectorMachine.java index a2a37d537e2..59b8bad4c23 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ItemCollectorMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ItemCollectorMachine.java @@ -32,11 +32,8 @@ import com.gregtechceu.gtceu.common.data.mui.GTMuiWidgets; import com.gregtechceu.gtceu.common.mui.GTGuiTextures; import com.gregtechceu.gtceu.config.ConfigHolder; -import com.gregtechceu.gtceu.utils.GTTransferUtils; import com.gregtechceu.gtceu.utils.ISubscription; -import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; - import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; import net.minecraft.server.TickTask; @@ -52,7 +49,6 @@ import org.jetbrains.annotations.Nullable; import java.util.List; -import java.util.Set; import javax.annotation.ParametersAreNonnullByDefault; @@ -360,6 +356,6 @@ public ModularPanel buildUI(PosGuiData data, PanelSyncManager syncManager, UISet .child(GTMuiWidgets.createPowerButton(this::isWorkingEnabled, this::setWorkingEnabled, syncManager)) .child(GTMuiWidgets.createBatterySlot(getChargerInventory(), 0, syncManager)) - .child(GTMuiWidgets.createAutoOutputItemButton(this, syncManager))); + .child(GTMuiWidgets.createAutoOutputItemButton(this.autoOutput, syncManager))); } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/MinerMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/MinerMachine.java index c887afb6308..52a09022110 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/MinerMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/MinerMachine.java @@ -17,7 +17,6 @@ import com.gregtechceu.gtceu.api.mui.widgets.TextWidget; import com.gregtechceu.gtceu.api.mui.widgets.layout.Column; import com.gregtechceu.gtceu.api.mui.widgets.layout.Flow; -import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; @@ -29,11 +28,9 @@ import com.gregtechceu.gtceu.common.machine.trait.miner.MinerLogic; import com.gregtechceu.gtceu.common.mui.GTGuiTextures; import com.gregtechceu.gtceu.config.ConfigHolder; -import com.gregtechceu.gtceu.utils.GTTransferUtils; import com.gregtechceu.gtceu.utils.ISubscription; import net.minecraft.ChatFormatting; -import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Style; @@ -260,6 +257,6 @@ public ModularPanel buildUI(PosGuiData data, PanelSyncManager syncManager, UISet .child(GTMuiWidgets.createPowerButton(this::isWorkingEnabled, this::setWorkingEnabled, syncManager)) .child(GTMuiWidgets.createBatterySlot(getChargerInventory(), 0, syncManager)) - .child(GTMuiWidgets.createAutoOutputItemButton(this, syncManager))); + .child(GTMuiWidgets.createAutoOutputItemButton(this.autoOutput, syncManager))); } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/PumpMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/PumpMachine.java index 7b4197c65f6..5b807997f7f 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/PumpMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/PumpMachine.java @@ -3,8 +3,6 @@ import com.gregtechceu.gtceu.api.GTValues; import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.recipe.IO; -import com.gregtechceu.gtceu.api.gui.GuiTextures; -import com.gregtechceu.gtceu.api.item.tool.GTToolType; import com.gregtechceu.gtceu.api.machine.TieredEnergyMachine; import com.gregtechceu.gtceu.api.machine.feature.IMuiMachine; import com.gregtechceu.gtceu.api.machine.trait.AutoOutputTrait; @@ -13,14 +11,11 @@ import com.gregtechceu.gtceu.api.mui.base.widget.IWidget; import com.gregtechceu.gtceu.api.mui.factory.PosGuiData; import com.gregtechceu.gtceu.api.mui.utils.Alignment; -import com.gregtechceu.gtceu.api.mui.value.BoolValue; import com.gregtechceu.gtceu.api.mui.value.sync.*; import com.gregtechceu.gtceu.api.mui.widget.ParentWidget; import com.gregtechceu.gtceu.api.mui.widgets.SlotGroupWidget; -import com.gregtechceu.gtceu.api.mui.widgets.ToggleButton; import com.gregtechceu.gtceu.api.mui.widgets.layout.Flow; import com.gregtechceu.gtceu.api.mui.widgets.slot.FluidSlot; -import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.client.mui.screen.ModularPanel; @@ -30,8 +25,6 @@ import com.gregtechceu.gtceu.common.mui.GTGuiTextures; import com.gregtechceu.gtceu.utils.FormattingUtil; -import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; - import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.Util; import net.minecraft.core.BlockPos; @@ -40,7 +33,6 @@ import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerLevel; import net.minecraft.util.RandomSource; -import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.LiquidBlock; @@ -575,7 +567,8 @@ public ModularPanel buildUI(PosGuiData data, PanelSyncManager syncManager, UISet .child(Flow.row() .margin(4, 0, 41, 0) .coverChildren() - .child(createAutoOutputFluidButton(syncManager))) + .child(GTMuiWidgets.createAutoOutputFluidButton(autoOutput, + syncManager))) .child(Flow.column() .margin(68, 0, 23, 0) .coverChildren() @@ -584,19 +577,6 @@ public ModularPanel buildUI(PosGuiData data, PanelSyncManager syncManager, UISet .child(SlotGroupWidget.playerInventory(false).left(7).bottom(7)); } - private ToggleButton createAutoOutputFluidButton(PanelSyncManager syncManager) { - BooleanSyncValue fluidOutputs = new BooleanSyncValue(this::isAutoOutputFluids, - this::setAutoOutputFluids); - syncManager.syncValue("auto_output_fluids", fluidOutputs); - return new ToggleButton() - .value(new BoolValue.Dynamic(fluidOutputs::getBoolValue, fluidOutputs::setBoolValue)) - .overlay(GTGuiTextures.BUTTON_FLUID_OUTPUT) - .tooltipAutoUpdate(true) - .tooltipBuilder((r) -> r.addLine(IKey.lang(Component.translatable("gtceu.gui.fluid_auto_output", - Component.translatable(fluidOutputs.getBoolValue() ? "cover.voiding.label.enabled" : - "cover.voiding.label.disabled"))))); - } - private IWidget createFluidSlot(PanelSyncManager syncManager) { syncManager.syncValue("fluid_slot", SyncHandlers.fluidSlot(cache.getStorages()[0]).controlsAmount(false)); diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CentralMonitorMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CentralMonitorMachine.java index de330f2caa3..028f9823792 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CentralMonitorMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CentralMonitorMachine.java @@ -10,7 +10,6 @@ import com.gregtechceu.gtceu.api.item.component.IItemComponent; import com.gregtechceu.gtceu.api.item.component.IMonitorModuleItem; import com.gregtechceu.gtceu.api.machine.feature.IDataInfoProvider; -import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockDisplayText; import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; import com.gregtechceu.gtceu.api.misc.EnergyContainerList; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/BufferMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/BufferMachine.java index a367c50d3b7..f3153d2d665 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/BufferMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/BufferMachine.java @@ -2,56 +2,34 @@ import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.recipe.IO; -import com.gregtechceu.gtceu.api.gui.GuiTextures; -import com.gregtechceu.gtceu.api.item.tool.GTToolType; -import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.TieredMachine; import com.gregtechceu.gtceu.api.machine.feature.IMuiMachine; import com.gregtechceu.gtceu.api.machine.trait.AutoOutputTrait; import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; -import com.gregtechceu.gtceu.api.mui.base.drawable.IKey; import com.gregtechceu.gtceu.api.mui.factory.PosGuiData; import com.gregtechceu.gtceu.api.mui.utils.Alignment; -import com.gregtechceu.gtceu.api.mui.value.BoolValue; -import com.gregtechceu.gtceu.api.mui.value.sync.BooleanSyncValue; import com.gregtechceu.gtceu.api.mui.value.sync.PanelSyncManager; import com.gregtechceu.gtceu.api.mui.value.sync.SyncHandlers; import com.gregtechceu.gtceu.api.mui.widget.ParentWidget; import com.gregtechceu.gtceu.api.mui.widgets.SlotGroupWidget; -import com.gregtechceu.gtceu.api.mui.widgets.ToggleButton; import com.gregtechceu.gtceu.api.mui.widgets.layout.Column; import com.gregtechceu.gtceu.api.mui.widgets.layout.Flow; import com.gregtechceu.gtceu.api.mui.widgets.slot.FluidSlot; import com.gregtechceu.gtceu.api.mui.widgets.slot.ItemSlot; import com.gregtechceu.gtceu.api.mui.widgets.slot.ModularSlot; import com.gregtechceu.gtceu.api.mui.widgets.slot.SlotGroup; -import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.client.mui.screen.ModularPanel; import com.gregtechceu.gtceu.client.mui.screen.UISettings; import com.gregtechceu.gtceu.common.data.mui.GTMuiWidgets; import com.gregtechceu.gtceu.common.mui.GTGuiTextures; -import com.gregtechceu.gtceu.utils.GTTransferUtils; -import com.gregtechceu.gtceu.utils.ISubscription; - -import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; import net.minecraft.MethodsReturnNonnullByDefault; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.network.chat.Component; -import net.minecraft.server.TickTask; -import net.minecraft.server.level.ServerLevel; -import net.minecraft.world.entity.player.Player; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.state.BlockState; import lombok.Getter; -import lombok.Setter; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import java.util.List; @@ -159,63 +137,12 @@ protected NotifiableFluidTank createTank() { .padding(0, 8, 4, 4) .childPadding(2) .background(GTGuiTextures.BACKGROUND.getSubArea(0.25f, 0f, 1.0f, 1.0f)) - .child(createAutoOutputItemButton(syncManager)) - .child(createAutoOutputFluidButton(syncManager)) - .child(createInputFromOutputItem(syncManager)) - .child(createInputFromOutputFluid(syncManager)) + .child(GTMuiWidgets.createAutoOutputItemButton(autoOutput, syncManager)) + .child(GTMuiWidgets.createAutoOutputFluidButton(autoOutput, syncManager)) + .child(GTMuiWidgets.createInputFromOutputItem(autoOutput, syncManager)) + .child(GTMuiWidgets.createInputFromOutputFluid(autoOutput, syncManager)) .excludeAreaInXei()); } - - private ToggleButton createAutoOutputItemButton(PanelSyncManager syncManager) { - BooleanSyncValue itemOutputs = new BooleanSyncValue(this::isAutoOutputItems, - this::setAutoOutputItems); - syncManager.syncValue("auto_output_items", itemOutputs); - return new ToggleButton() - .value(new BoolValue.Dynamic(itemOutputs::getBoolValue, itemOutputs::setBoolValue)) - .overlay(GTGuiTextures.BUTTON_ITEM_OUTPUT) - .tooltipAutoUpdate(true) - .tooltipBuilder((r) -> r.addLine(IKey.lang(Component.translatable("gtceu.gui.item_auto_output", - Component.translatable(itemOutputs.getBoolValue() ? "cover.voiding.label.enabled" : - "cover.voiding.label.disabled"))))); - } - - private ToggleButton createAutoOutputFluidButton(PanelSyncManager syncManager) { - BooleanSyncValue fluidOutputs = new BooleanSyncValue(this::isAutoOutputFluids, - this::setAutoOutputFluids); - syncManager.syncValue("auto_output_fluids", fluidOutputs); - return new ToggleButton() - .value(new BoolValue.Dynamic(fluidOutputs::getBoolValue, fluidOutputs::setBoolValue)) - .overlay(GTGuiTextures.BUTTON_FLUID_OUTPUT) - .tooltipAutoUpdate(true) - .tooltipBuilder((r) -> r.addLine(IKey.lang(Component.translatable("gtceu.gui.fluid_auto_output", - Component.translatable(fluidOutputs.getBoolValue() ? "cover.voiding.label.enabled" : - "cover.voiding.label.disabled"))))); - } - - private ToggleButton createInputFromOutputItem(PanelSyncManager syncManager) { - BooleanSyncValue inputFromOutputItem = new BooleanSyncValue(this::isAllowInputFromOutputSideItems, - this::setAllowInputFromOutputSideItems); - syncManager.syncValue("input_from_output_item", inputFromOutputItem); - return new ToggleButton() - .value(new BoolValue.Dynamic(inputFromOutputItem::getBoolValue, inputFromOutputItem::setBoolValue)) - .overlay(GTGuiTextures.BUTTON_ITEM_OUTPUT) - .tooltipAutoUpdate(true) - .tooltipBuilder((r) -> r.addLine(IKey.lang(Component.translatable("gtceu.gui.item_input_from_output", - Component.translatable(inputFromOutputItem.getBoolValue() ? "cover.voiding.label.enabled" : - "cover.voiding.label.disabled"))))); - } - - private ToggleButton createInputFromOutputFluid(PanelSyncManager syncManager) { - BooleanSyncValue inputFromOutputFluid = new BooleanSyncValue(this::isAllowInputFromOutputSideFluids, - this::setAllowInputFromOutputSideFluids); - syncManager.syncValue("input_from_output_fluid", inputFromOutputFluid); - return new ToggleButton() - .value(new BoolValue.Dynamic(inputFromOutputFluid::getBoolValue, inputFromOutputFluid::setBoolValue)) - .overlay(GTGuiTextures.BUTTON_FLUID_OUTPUT) - .tooltipBuilder((r) -> r.addLine(IKey.lang(Component.translatable("gtceu.gui.fluid_input_from_output", - Component.translatable(inputFromOutputFluid.getBoolValue() ? "cover.voiding.label.enabled" : - "cover.voiding.label.disabled"))))); - } /* * @Override * public Widget createUIWidget() { diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumChestMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumChestMachine.java index 5d4d946b275..cf7f11acdde 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumChestMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumChestMachine.java @@ -3,13 +3,12 @@ import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.IControllable; import com.gregtechceu.gtceu.api.capability.recipe.IO; -import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.item.tool.GTToolType; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.TieredMachine; import com.gregtechceu.gtceu.api.machine.feature.IDropSaveMachine; -import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine; import com.gregtechceu.gtceu.api.machine.feature.IInteractedMachine; +import com.gregtechceu.gtceu.api.machine.feature.IMuiMachine; import com.gregtechceu.gtceu.api.machine.trait.AutoOutputTrait; import com.gregtechceu.gtceu.api.machine.trait.MachineTrait; import com.gregtechceu.gtceu.api.machine.trait.MachineTraitType; @@ -27,7 +26,6 @@ import com.gregtechceu.gtceu.api.mui.widgets.slot.ModularSlot; import com.gregtechceu.gtceu.api.mui.widgets.slot.PhantomItemSlot; import com.gregtechceu.gtceu.api.mui.widgets.slot.SlotGroup; -import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.api.transfer.fluid.IFluidHandlerModifiable; @@ -47,6 +45,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.player.Player; @@ -300,8 +299,8 @@ public ModularPanel buildUI(PosGuiData data, PanelSyncManager syncManager, UISet } private ToggleButton createAutoOutputItemButton(PanelSyncManager syncManager) { - BooleanSyncValue itemOutputs = new BooleanSyncValue(this::isAutoOutputItems, - this::setAutoOutputItems); + BooleanSyncValue itemOutputs = new BooleanSyncValue(this.autoOutput::isAutoOutputItems, + this.autoOutput::setAllowAutoOutputItems); syncManager.syncValue("auto_output_items", itemOutputs); return new ToggleButton() .value(new BoolValue.Dynamic(itemOutputs::getBoolValue, itemOutputs::setBoolValue)) diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumTankMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumTankMachine.java index 965b32846b0..6dec2521043 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumTankMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumTankMachine.java @@ -3,11 +3,12 @@ import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.IControllable; import com.gregtechceu.gtceu.api.capability.recipe.IO; -import com.gregtechceu.gtceu.api.gui.GuiTextures; -import com.gregtechceu.gtceu.api.item.tool.GTToolType; import com.gregtechceu.gtceu.api.machine.*; -import com.gregtechceu.gtceu.api.machine.trait.MachineTrait; +import com.gregtechceu.gtceu.api.machine.feature.IDropSaveMachine; +import com.gregtechceu.gtceu.api.machine.feature.IInteractedMachine; import com.gregtechceu.gtceu.api.machine.feature.IMuiMachine; +import com.gregtechceu.gtceu.api.machine.trait.AutoOutputTrait; +import com.gregtechceu.gtceu.api.machine.trait.MachineTrait; import com.gregtechceu.gtceu.api.machine.trait.MachineTraitType; import com.gregtechceu.gtceu.api.mui.base.drawable.IKey; import com.gregtechceu.gtceu.api.mui.base.widget.IWidget; @@ -24,7 +25,6 @@ import com.gregtechceu.gtceu.api.mui.widgets.ToggleButton; import com.gregtechceu.gtceu.api.mui.widgets.layout.Flow; import com.gregtechceu.gtceu.api.mui.widgets.slot.FluidSlot; -import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.api.transfer.fluid.CustomFluidTank; @@ -37,11 +37,10 @@ import com.gregtechceu.gtceu.utils.GTMath; import com.gregtechceu.gtceu.utils.GTTransferUtils; -import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; - import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.chat.Component; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.player.Player; @@ -64,8 +63,8 @@ import java.util.function.Predicate; @NotNullByDefault -public class QuantumTankMachine extends TieredMachine implements IInteractedMachine, IControllable, - IDropSaveMachine, IMuiMachine { +public class QuantumTankMachine extends TieredMachine implements IInteractedMachine, IDropSaveMachine, IControllable, + IMuiMachine { public static Object2LongMap TANK_CAPACITY = new Object2LongArrayMap<>(); @@ -245,7 +244,8 @@ public ModularPanel buildUI(PosGuiData data, PanelSyncManager syncManager, UISet .child(Flow.row() .margin(4, 0, 41, 0) .coverChildren() - .child(createAutoOutputFluidButton(syncManager)) + .child(GTMuiWidgets.createAutoOutputFluidButton(autoOutput, + syncManager)) .child(createFluidLockButton(syncManager)) .child(createVoidButton(syncManager))) .child(Flow.column() @@ -257,19 +257,6 @@ public ModularPanel buildUI(PosGuiData data, PanelSyncManager syncManager, UISet .child(SlotGroupWidget.playerInventory(false).left(7).bottom(7)); } - private ToggleButton createAutoOutputFluidButton(PanelSyncManager syncManager) { - BooleanSyncValue fluidOutputs = new BooleanSyncValue(this::isAutoOutputFluids, - this::setAutoOutputFluids); - syncManager.syncValue("auto_output_fluids", fluidOutputs); - return new ToggleButton() - .value(new BoolValue.Dynamic(fluidOutputs::getBoolValue, fluidOutputs::setBoolValue)) - .overlay(GTGuiTextures.BUTTON_FLUID_OUTPUT) - .tooltipAutoUpdate(true) - .tooltipBuilder((r) -> r.addLine(IKey.lang(Component.translatable("gtceu.gui.fluid_auto_output", - Component.translatable(fluidOutputs.getBoolValue() ? "cover.voiding.label.enabled" : - "cover.voiding.label.disabled"))))); - } - private ToggleButton createFluidLockButton(PanelSyncManager syncManager) { BooleanSyncValue fluidLocked = new BooleanSyncValue(this::isLocked, this::setLocked); From 963d514ad623077fcc45d287749bc8a0f8385756 Mon Sep 17 00:00:00 2001 From: Gustavo <77560533+gustovafing@users.noreply.github.com> Date: Mon, 9 Feb 2026 17:03:54 +1100 Subject: [PATCH 06/10] Fix child sync objects not being saved (#4585) --- .../com/gregtechceu/gtceu/api/sync_system/ClassSyncData.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/api/sync_system/ClassSyncData.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/ClassSyncData.java index cf648d12ba9..3a0f902bbd3 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/sync_system/ClassSyncData.java +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/ClassSyncData.java @@ -80,8 +80,9 @@ private ClassSyncData(Class clazz) { for (Field field : clazz.getDeclaredFields()) { - boolean hasSaveField = field.isAnnotationPresent(SaveField.class); - boolean hasClientSync = field.isAnnotationPresent(SyncToClient.class); + boolean isSyncManaged = ISyncManaged.class.isAssignableFrom(field.getType()); + boolean hasSaveField = field.isAnnotationPresent(SaveField.class) || isSyncManaged; + boolean hasClientSync = field.isAnnotationPresent(SyncToClient.class) || isSyncManaged; if (!hasSaveField && !hasClientSync) continue; if (Modifier.isStatic(field.getModifiers())) From 013ba88376653da996f59b19d02dd90130595c4b Mon Sep 17 00:00:00 2001 From: Jurre Groenendijk Date: Mon, 9 Feb 2026 07:09:28 +0100 Subject: [PATCH 07/10] Fix pattern buffer test (#4562) Co-authored-by: Gustavo <77560533+gustovafing@users.noreply.github.com> --- .../machine/MEPatternBufferPartMachine.java | 4 +- .../cover/AdvancedDetectorCoverTest.java | 46 ++++++++++++++---- .../ae2/machine/PatternBufferTest.java | 8 +++ .../gtceu/structures/patternbuffertest.nbt | Bin 2029 -> 2092 bytes 4 files changed, 48 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEPatternBufferPartMachine.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEPatternBufferPartMachine.java index 552b3f7663b..11ded940331 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEPatternBufferPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEPatternBufferPartMachine.java @@ -69,6 +69,7 @@ import lombok.Setter; import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.UnmodifiableView; +import org.jetbrains.annotations.VisibleForTesting; import java.util.ArrayList; import java.util.Collections; @@ -249,7 +250,8 @@ private void refundAll(ClickData clickData) { } } - private void onPatternChange(int index) { + @VisibleForTesting + public void onPatternChange(int index) { if (isRemote()) return; // remove old if applicable diff --git a/src/test/java/com/gregtechceu/gtceu/common/cover/AdvancedDetectorCoverTest.java b/src/test/java/com/gregtechceu/gtceu/common/cover/AdvancedDetectorCoverTest.java index cd8c41f40c4..3ea3611e07b 100644 --- a/src/test/java/com/gregtechceu/gtceu/common/cover/AdvancedDetectorCoverTest.java +++ b/src/test/java/com/gregtechceu/gtceu/common/cover/AdvancedDetectorCoverTest.java @@ -2,11 +2,16 @@ import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.capability.IWorkable; +import com.gregtechceu.gtceu.api.capability.recipe.FluidRecipeCapability; +import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.api.machine.SimpleTieredMachine; +import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; import com.gregtechceu.gtceu.common.cover.detector.AdvancedFluidDetectorCover; import com.gregtechceu.gtceu.common.cover.detector.AdvancedItemDetectorCover; import com.gregtechceu.gtceu.common.data.GTItems; import com.gregtechceu.gtceu.gametest.util.TestUtils; +import com.gregtechceu.gtceu.utils.RedstoneUtil; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; @@ -14,6 +19,7 @@ import net.minecraft.gametest.framework.GameTestHelper; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; +import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.gametest.GameTestHolder; import net.minecraftforge.gametest.PrefixGameTestTemplate; @@ -52,13 +58,20 @@ public static void testAdvancedActivityDetectorCoverWithActivity(GameTestHelper @GameTest(template = "electrolyzer", batch = "coverTests") public static void testAdvancedActivityDetectorCoverWithoutActivity(GameTestHelper helper) { helper.pullLever(new BlockPos(2, 2, 2)); - MetaMachine machine = ((MetaMachine) helper.getBlockEntity(new BlockPos(1, 2, 1))); + SimpleTieredMachine machine = ((SimpleTieredMachine) helper.getBlockEntity(new BlockPos(1, 2, 1))); TestUtils.placeCover(helper, machine, GTItems.COVER_ACTIVITY_DETECTOR_ADVANCED.asStack(), Direction.WEST); - helper.runAtTickTime(20 - machine.getOffsetTimer() % 20, () -> helper.pullLever(2, 2, 2)); - helper.runAtTickTime(45 - machine.getOffsetTimer() % 20, () -> { - TestUtils.assertLampOff(helper, new BlockPos(0, 2, 1)); - helper.succeed(); + int offset = (int) (machine.getOffsetTimer() % 20L); + helper.runAtTickTime(20 - offset, () -> { + // Stop the fluid input + helper.pullLever(2, 2, 2); + // Also clear out the tank + NotifiableFluidTank tank = (NotifiableFluidTank) machine + .getCapabilitiesFlat(IO.IN, FluidRecipeCapability.CAP).get(0); + tank.setFluidInTank(0, FluidStack.EMPTY); }); + // 20 ticks for the cover to update, 11 ticks for the recipe to finish, 1 tick for the cover to update + helper.runAtTickTime(52 - offset, + () -> helper.succeedWhen(() -> TestUtils.assertLampOff(helper, new BlockPos(0, 2, 1)))); } @GameTest(template = "electrolyzer", batch = "coverTests") @@ -70,10 +83,25 @@ public static void testAdvancedFluidDetectorCover(GameTestHelper helper) { cover.setMaxValue(100000); cover.setMinValue(1); cover.setLatched(false); - // At t=80, 21k will be inside, giving a redstone value of 2 or 3 - helper.runAtTickTime(81, () -> { - TestUtils.assertRedstone(helper, new BlockPos(0, 2, 1), 2, 3); - TestUtils.assertLampOn(helper, new BlockPos(0, 2, 1)); + MutableInt expected = new MutableInt(); + int offset = (int) (machine.getOffsetTimer() % 20L); + helper.runAtTickTime(80 - offset, () -> { + // Actually pull in the value at the time, since offset might change the amount + var handler = machine.getFluidHandlerCap(null, false); + long storedFluid = 0; + for (int tank = 0; tank < handler.getTanks(); tank++) { + storedFluid += handler.getFluidInTank(tank).getAmount(); + } + expected.setValue(RedstoneUtil.computeRedstoneBetweenValues(storedFluid, + cover.getMaxValue(), cover.getMinValue(), cover.isInverted())); + }); + + helper.runAtTickTime(81 - offset, () -> { + int value = expected.intValue(); + TestUtils.assertRedstoneEither(helper, new BlockPos(0, 2, 1), + value, + Math.max(0, value - 1), + Math.min(15, value + 1)); helper.succeed(); }); } diff --git a/src/test/java/com/gregtechceu/gtceu/integration/ae2/machine/PatternBufferTest.java b/src/test/java/com/gregtechceu/gtceu/integration/ae2/machine/PatternBufferTest.java index 58157ff6a08..0c5e440bec9 100644 --- a/src/test/java/com/gregtechceu/gtceu/integration/ae2/machine/PatternBufferTest.java +++ b/src/test/java/com/gregtechceu/gtceu/integration/ae2/machine/PatternBufferTest.java @@ -83,6 +83,8 @@ private static BusHolder getBussesAndForm(GameTestHelper helper) { @GameTest(template = "patternbuffertest", batch = "PatternBuffer", setupTicks = 40, timeoutTicks = 200) public static void patternBufferNormalInputBusTest(GameTestHelper helper) { BusHolder busHolder = getBussesAndForm(helper); + busHolder.patternBuffer.onPatternChange(0); // Jank forced pattern update, likely needed because of NBT + // placement structure bug busHolder.inputBus1.getInventory().setStackInSlot(0, new ItemStack(Blocks.COBBLESTONE)); helper.succeedWhen(() -> { helper.assertTrue( @@ -97,6 +99,8 @@ public static void patternBufferNormalInputBusTest(GameTestHelper helper) { @GameTest(template = "patternbuffertest", batch = "PatternBuffer", setupTicks = 40, timeoutTicks = 200) public static void patternBufferBasicRequestTest(GameTestHelper helper) { BusHolder busHolder = getBussesAndForm(helper); + busHolder.patternBuffer.onPatternChange(0); // Jank forced pattern update, likely needed because of NBT + // placement structure bug IGrid grid = busHolder.patternBuffer.getGrid(); @@ -139,6 +143,8 @@ public static void patternBufferBasicRequestTest(GameTestHelper helper) { @GameTest(template = "patternbuffertest", batch = "PatternBuffer", setupTicks = 40, timeoutTicks = 200) public static void patternBufferDistinctDoesNothingTest(GameTestHelper helper) { BusHolder busHolder = getBussesAndForm(helper); + busHolder.patternBuffer.onPatternChange(0); // Jank forced pattern update, likely needed because of NBT + // placement structure bug busHolder.patternBuffer.setDistinct(true); IGrid grid = busHolder.patternBuffer.getGrid(); @@ -182,6 +188,8 @@ public static void patternBufferDistinctDoesNothingTest(GameTestHelper helper) { @GameTest(template = "patternbuffertest", batch = "PatternBuffer", setupTicks = 40, timeoutTicks = 200) public static void patternBufferDyeingDoesNothingTest(GameTestHelper helper) { BusHolder busHolder = getBussesAndForm(helper); + busHolder.patternBuffer.onPatternChange(0); // Jank forced pattern update, likely needed because of NBT + // placement structure bug busHolder.patternBuffer.setPaintingColor(0xff); IGrid grid = busHolder.patternBuffer.getGrid(); diff --git a/src/test/resources/data/gtceu/structures/patternbuffertest.nbt b/src/test/resources/data/gtceu/structures/patternbuffertest.nbt index 2727a885a69a2132fcd7c59c6d857d90e901c18a..89f73cf88944d9e888a1e029c4b391c8b1d9b9a8 100644 GIT binary patch literal 2092 zcmV+{2-Ei;iwFP!00000|Ls}LbKAxhUwn`vNJ*BRG)?37lv_@AnmUOusYa4pb!17E z>~wmUdhM<4wU_<_{r5W4Q~TZmAR!1KA<5IRXTljA_i|g@YZD!( z1s%7A%x()_ZVO&Z43+kH4SU=Td#W-w?O8{M6n|Unaa!zI$IEF!$7w;wZ6UMUf|uKZ zm)C-q*MgT<%d1a3F*JSBiRGNCKJgb+8+hu|$o_TH1pe=6nVKm+9?6Bk2SO@%0Lt23 zNOi@;;5G~caUT+Af01FXFA79pX}v=9JePzDnvZ8lSB;CgqR#iF4ceG(IMG z{c-UHwQi;PvRFJX7T*+$uZzXE#p0`C@ylZIqFDUOQcRTm;o2ikk{h-=XF83zL%LFM z5Y$0%QeVd$8i@q z#!?t1Ij5>iK1K{F5%Ggm0o=^FTu`+PfAwON6JqaPVti`FP&6`d_mF~{Pp+-@8aS3? zP4HgEnjFuWr?F*ju@MwRFp;=|-X{l2;SRwop0bhk(MKy!uy_H`F@2hH4$AKC&(NbX z-B)7E0J|qTvV`tM@Iy%1^=fVEnaW<$&%xr59@DQZ?Tyy9a>p#8Cvw7K@XS%F0H{)A zw4Z?cXd0&o-3z-?UUJGiS&x|w>6eOB7m8rf+g#gjsuo*3aLyvTkC?pgA`0(Tidr#0YXGsDE?2*A- zvJo74Ek_Utzdt)Z3{THaj~uc+MC%nr>VvD89{DIUSIE&`VIdP6@mm!Rj}(UKDV?!6 z;voc}7?4dK5K2Ir*XekCtK9a;UKFn&^5#0Bna)aOU4u0B9ef$pgZDB7{#b6^sobg> zbyaTd>S?6t9qt!Y?zhR90eM`c{UsMnNl!`hryc-RoA=`sq?=hikh@v>`G;repJtYx zQ8;2ypJ40pm_8_=R2}n%i@_I*jW@T;iQrz@|Hnfg#-Vp#_61}M3-)3VpM~otK!Y#l z50<{T^0}vl&)KRLpF@CH(fkB!eP9(s4FtF@DBtQ6T_%vg@5^1HPn^$-__MZSeAgcc z*WjTxCa#yKr0*7zK(G-|4*gd05h}HZ!!fyfDp(2I@qhm~kx5ogj4Gi_< zm~jA3Xt0z*NuhGp2@~Z;eJjEC)#jz$8MAmhfYMn|j{4jla)_Jf8UE_Q`WU6M+p0MI zF5mGB3+LQB?Bx*D@D1dSctCdZ3!m9erOl0RLuhU9ykmQ3Ob%H!)v@cFR$UVCAR}iA z&~Nc4XRVIBtkb~Vf55b5HMD$mh^flH!y7;gBr;<|%0z%>c?^?Vmhf_0qNv!5{18r{ zc1n%N$#7(yJAox-9hS?FA=c6;DW{=O#!8Wv*KUQC?bhAzm z9I6X4sF*r8ra_fCR~-O+vNe|+(qNuHTyhfySEuj}+GC$kjgJZq$}ngLgj=C;d+&#>QS zzRpdxRR+4t=gkw=c2{c{xvf16l|Y&-A~k}5RZDc!6sDGT=H)F~t{bNZ3(%e7axy73 zas$pLQxkGJhh*n`yTaa$l-eW+hM88ew{pHnxW%}tTi;8f49~B^YRIfwr0V-n{2fLn W`kpFnN0d8%A^!t9U=Oc=BLDzy#0uH~ literal 2029 zcmVvXviAHi-WgJ~wm;B-7zI!^9devB0D&)2sD8L)cOHluR*A`{$UgQIdlIdMBFBRpI*~92A0_bY}uJ zCLZi1gkjnj(<8}c`ak>(VU$u4)AZa}Z3x4&R3)vM6*jVID@;{@^?oLRIa>jC zCl{SBLMC1cU;eAWm-92?t3kuI8efH1f9Vnrt$~hVDBr!@Xn!R1!6WlMEHnut%6WMI z;e`XeBbf<}hW9j?`bZuXyuZZ`>VjU`zQ{p7??=$Hd~%*|&6%K4N+$YIB**AHWGyJ{ zf=}jJRdDmIv9XorLAkhJEnjhOq;O+@!Bj@L z1AQqt%H|kwqMBQ6Fer@}2&qFlPxKW)L+}NLL!7b&0%4G(Os33GLQ^HKduL}AFfDR7 zow#pKjHJ-175!Pi7wVBcRjK1cKrRUaS^p0U`*-K`a%Ee1U3AI?o| zYnkD#6zMrLxLv1M`tX1~3n)@-`AnV^d7Vc}p0227zx<{dn0rHoiYpU5eTJoK*= zibk2i*E9Qr%1;@@S&FEWB0u?#%2a~t9ZoO`K4*fd8Q55q)08Te6QLM~k>P~O^^KI6 zKYbQ+>chKQYK$FeY?jGPJpf?4x(uQr>_#(N4I>iGXaFwF%IJzN%cXBJNwFT; z`7x|E=DmqQLTRu74Z~TIpxGVR9UIG*4b_c(h`hpywKBpw&9J1uk()B)#+G4KVW`!6 zPEwQhW^~RX!b1$`2r&kg&_wQEW|PUaR?mY260N-R{3@}Ut~Dhs+?%JtDuPC@n~7h$ znW(#D)lBTG8A<64vQ9h?gpbeG~=aUItOKtU(vX&h1i^ci#>y1M2QjNmvO}~##ud1O7V8=An z<)w07UfN)Z@l!ll#?LBF?v`<4yHxWWgL=jDZPSb6Q4#h#h~|=WZH~jPg$cvp@72N0 z2j~5=i`zKFz3LAZ9BeCXR^Kd7#mXHd!2}^>O#dc%Y>YZER~e`H0BwM7tIjwkxfuGL zgj{h+V(WYaOaoCNZ$p8s4pO^Cf%ITBBkCEAOL1M~C}gT<4jia#jKI>FrWQvEo#Rf$ za^^yOEf~EF=O{9GhfkgiFm2-2aD0V%?eNRT2+kD?lk6cgGx4>sb!gW@O(sQdzP(s6QwBa2jM+C2%Gwmw~9TxUia#ffrkY+H-LI!esVV2$jiqLL;Vl5dv2lS zqhoBLz`nd1;ix2XXJbt?0QF<@qnjn*Uz(kTFO8^X3i&#ma-vjdMQwX&P=)qhy&WII zt$gM;gA;}rO?}wSpPXavqQ#u^SuL5qL>u2=^1I91*5ckF?_+Ox;kk)R+l!rQKfK>| zZ-Rjkp$QO9?^qZaKq{Pp;*6VR5!$E!+z6{T^ZS)@d)|Bml@_fjD=jlqMa)}u*LmhP zF0r?9+idS)@}c@Uv-e4!Z-U8K>g4Ge+LD%+g7r55{d_D$K=+l*(ug{1S249qBOi7a zl4E@;61&@>3#{Ex)HpUdul`o$z*c9%sWv?&!0nRdyTzpka?;@(r+r*uoS3j&ww7<_ zG>M*I6*psc@q4W~E$mQlOpDPt$`CbzVQ0a^NHQMU8-pd)-YN?bmR@5$A(1&TFDsj0 zL$qy0-&D44zW(oaeA8fA+nJXL=Uyw1)rD$(YvH@%CKu^#<>{@Pt#&)QeBORt*-f>U zyReO$u@Yy=B}royHZ$FJ1=Gmer^F`oty9k0?$IUMF6DAMT~12)khAGbhnz03*f^i8 zu(wvy+5|DxrBg1g?Jo;nc~{l1UR|veGcw%22 Date: Mon, 9 Feb 2026 18:12:25 +1100 Subject: [PATCH 08/10] Remove IMachineModifyDrops interface (#4582) --- .../gtceu/api/block/MetaMachineBlock.java | 9 ++++----- .../gtceu/api/machine/MetaMachine.java | 9 +++------ .../gtceu/api/machine/SimpleGeneratorMachine.java | 5 ----- .../gtceu/api/machine/SimpleTieredMachine.java | 5 ----- .../gtceu/api/machine/WorkableTieredMachine.java | 5 ----- .../api/machine/feature/IMachineModifyDrops.java | 15 --------------- .../part/hpca/HPCAComponentPartMachine.java | 5 ++--- 7 files changed, 9 insertions(+), 44 deletions(-) delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/machine/feature/IMachineModifyDrops.java diff --git a/src/main/java/com/gregtechceu/gtceu/api/block/MetaMachineBlock.java b/src/main/java/com/gregtechceu/gtceu/api/block/MetaMachineBlock.java index 23faebb612a..eaa75ad63c0 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/block/MetaMachineBlock.java +++ b/src/main/java/com/gregtechceu/gtceu/api/block/MetaMachineBlock.java @@ -223,12 +223,11 @@ public BlockState rotate(BlockState pState, Rotation pRotation) { @Override public List getDrops(BlockState state, LootParams.Builder builder) { - BlockEntity tileEntity = builder.getOptionalParameter(LootContextParams.BLOCK_ENTITY); var drops = super.getDrops(state, builder); - if (tileEntity instanceof MetaMachine machine) { - if (machine instanceof IMachineModifyDrops machineModifyDrops) { - machineModifyDrops.onDrops(drops); - } + + BlockEntity be = builder.getOptionalParameter(LootContextParams.BLOCK_ENTITY); + if (be instanceof MetaMachine machine) { + machine.modifyDrops(drops); if (machine instanceof IDropSaveMachine dropSaveMachine && dropSaveMachine.saveBreak()) { for (ItemStack drop : drops) { if (drop.getItem() instanceof MetaMachineItem item && item.getBlock() == this) { diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java index b91971fd66a..6ccd7c4d28d 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java @@ -51,7 +51,6 @@ import com.lowdragmc.lowdraglib.utils.DummyWorld; import net.minecraft.ChatFormatting; -import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.block.BlockRenderDispatcher; import net.minecraft.client.resources.model.BakedModel; @@ -100,10 +99,6 @@ import java.util.function.Consumer; import java.util.function.Predicate; -import javax.annotation.ParametersAreNonnullByDefault; - -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault public class MetaMachine extends ManagedSyncBlockEntity implements IGregtechBlockEntity, IToolable, IToolGridHighlight, IFancyTooltip, IPaintable, IMachineFeature, ICopyable { @@ -211,6 +206,8 @@ public void onMachineDestroyed() { } } + public void modifyDrops(List drops) {} + ////////////////////////////////////// // ***** Tickable Manager ****// ////////////////////////////////////// @@ -279,7 +276,7 @@ private void executeTick() { ////////////////////////////////////// /** - * Called when a player clicks this meta tile entity with a tool + * Called when a player clicks this machine with a tool * * @return SUCCESS / CONSUME (will damage tool) / FAIL if something happened, so tools will get damaged and * animations will be played diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleGeneratorMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleGeneratorMachine.java index 3118841420b..1e23a3f118b 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleGeneratorMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleGeneratorMachine.java @@ -23,7 +23,6 @@ import net.minecraft.resources.ResourceLocation; import com.google.common.collect.Tables; -import com.mojang.blaze3d.MethodsReturnNonnullByDefault; import it.unimi.dsi.fastutil.ints.Int2IntFunction; import lombok.Getter; import org.jetbrains.annotations.NotNull; @@ -33,10 +32,6 @@ import java.util.LinkedHashMap; import java.util.function.BiFunction; -import javax.annotation.ParametersAreNonnullByDefault; - -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault public class SimpleGeneratorMachine extends WorkableTieredMachine implements IFancyUIMachine, IEnvironmentalHazardEmitter { diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleTieredMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleTieredMachine.java index fa1118e2c56..4813b617777 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleTieredMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleTieredMachine.java @@ -40,7 +40,6 @@ import net.minecraft.resources.ResourceLocation; import com.google.common.collect.Tables; -import com.mojang.blaze3d.MethodsReturnNonnullByDefault; import it.unimi.dsi.fastutil.ints.Int2IntFunction; import lombok.Getter; import org.jetbrains.annotations.Nullable; @@ -48,13 +47,9 @@ import java.util.*; import java.util.function.*; -import javax.annotation.ParametersAreNonnullByDefault; - /** * All simple single machines are implemented here. */ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault public class SimpleTieredMachine extends WorkableTieredMachine implements IFancyUIMachine, IHasCircuitSlot { diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/WorkableTieredMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/WorkableTieredMachine.java index d00ba7f5959..cef70a3cc6a 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/WorkableTieredMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/WorkableTieredMachine.java @@ -11,7 +11,6 @@ import com.gregtechceu.gtceu.utils.GTUtil; import com.gregtechceu.gtceu.utils.ISubscription; -import com.mojang.blaze3d.MethodsReturnNonnullByDefault; import it.unimi.dsi.fastutil.ints.Int2IntFunction; import lombok.Getter; import lombok.Setter; @@ -22,10 +21,6 @@ import java.util.*; import java.util.function.Function; -import javax.annotation.ParametersAreNonnullByDefault; - -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault public abstract class WorkableTieredMachine extends TieredEnergyMachine implements IRecipeLogicMachine, IMufflableMachine, IOverclockMachine { diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IMachineModifyDrops.java b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IMachineModifyDrops.java deleted file mode 100644 index e7b57207514..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IMachineModifyDrops.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.gregtechceu.gtceu.api.machine.feature; - -import net.minecraft.world.item.ItemStack; - -import java.util.List; - -public interface IMachineModifyDrops extends IMachineFeature { - - /** - * Modify or append drops. - * - * @param drops existing drops. - */ - void onDrops(List drops); -} diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/hpca/HPCAComponentPartMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/hpca/HPCAComponentPartMachine.java index 8506fb1d581..84a2b92f994 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/hpca/HPCAComponentPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/hpca/HPCAComponentPartMachine.java @@ -2,7 +2,6 @@ import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.IHPCAComponentHatch; -import com.gregtechceu.gtceu.api.machine.feature.IMachineModifyDrops; import com.gregtechceu.gtceu.api.machine.multiblock.part.MultiblockPartMachine; import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; @@ -24,7 +23,7 @@ @MethodsReturnNonnullByDefault @ParametersAreNonnullByDefault public abstract class HPCAComponentPartMachine extends MultiblockPartMachine - implements IHPCAComponentHatch, IMachineModifyDrops { + implements IHPCAComponentHatch { @SaveField @SyncToClient @@ -89,7 +88,7 @@ public void setActive(boolean active) { } @Override - public void onDrops(List drops) { + public void modifyDrops(List drops) { for (int i = 0; i < drops.size(); ++i) { ItemStack drop = drops.get(i); if (drop.getItem() == this.getDefinition().getItem()) { From 4ba15859d91c16f8550c90c328adf6e884034346 Mon Sep 17 00:00:00 2001 From: Gustavo <77560533+gustovafing@users.noreply.github.com> Date: Tue, 10 Feb 2026 02:52:05 +1100 Subject: [PATCH 09/10] Revert "Fix child sync objects not being saved" (#4589) --- .../com/gregtechceu/gtceu/api/sync_system/ClassSyncData.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/api/sync_system/ClassSyncData.java b/src/main/java/com/gregtechceu/gtceu/api/sync_system/ClassSyncData.java index 3a0f902bbd3..cf648d12ba9 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/sync_system/ClassSyncData.java +++ b/src/main/java/com/gregtechceu/gtceu/api/sync_system/ClassSyncData.java @@ -80,9 +80,8 @@ private ClassSyncData(Class clazz) { for (Field field : clazz.getDeclaredFields()) { - boolean isSyncManaged = ISyncManaged.class.isAssignableFrom(field.getType()); - boolean hasSaveField = field.isAnnotationPresent(SaveField.class) || isSyncManaged; - boolean hasClientSync = field.isAnnotationPresent(SyncToClient.class) || isSyncManaged; + boolean hasSaveField = field.isAnnotationPresent(SaveField.class); + boolean hasClientSync = field.isAnnotationPresent(SyncToClient.class); if (!hasSaveField && !hasClientSync) continue; if (Modifier.isStatic(field.getModifiers())) From 4eccabd22b9600507242ee4e11b72a6aea5213a1 Mon Sep 17 00:00:00 2001 From: YoungOnionMC Date: Mon, 9 Feb 2026 13:55:36 -0700 Subject: [PATCH 10/10] cleanup and spotless and remerge --- .../gtceu/common/data/mui/GTMuiWidgets.java | 6 +-- .../data/mui/GTSingleblockMachinePanels.java | 48 +++++++++---------- 2 files changed, 26 insertions(+), 28 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/mui/GTMuiWidgets.java b/src/main/java/com/gregtechceu/gtceu/common/data/mui/GTMuiWidgets.java index d79e591b3ca..16cd2eb51ab 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/mui/GTMuiWidgets.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/mui/GTMuiWidgets.java @@ -24,7 +24,6 @@ import com.gregtechceu.gtceu.api.mui.widgets.layout.Column; import com.gregtechceu.gtceu.api.mui.widgets.layout.Flow; import com.gregtechceu.gtceu.api.mui.widgets.layout.Grid; -import com.gregtechceu.gtceu.api.mui.widgets.layout.Row; import com.gregtechceu.gtceu.api.mui.widgets.slot.FluidSlot; import com.gregtechceu.gtceu.api.mui.widgets.slot.ItemSlot; import com.gregtechceu.gtceu.api.mui.widgets.slot.ModularSlot; @@ -80,9 +79,10 @@ public static Flow createTitleBar(ItemStack stack, int panelWidth, UITexture bac int rowWidth = Math.min((int) (0.9 * panelWidth), (iconSize + (borderRadius * 4) + textTitleWidth)); - return new Row() + return Flow.row() .coverChildrenHeight() .mainAxisAlignment(Alignment.MainAxis.CENTER) + .crossAxisAlignment(Alignment.CrossAxis.CENTER) .width(rowWidth) .top(-(textHeight + borderRadius)) .rightRel(0.45f) @@ -91,10 +91,8 @@ public static Flow createTitleBar(ItemStack stack, int panelWidth, UITexture bac .asIcon().size(iconSize) .asWidget() .marginLeft(borderRadius)) - .mainAxisAlignment(Alignment.MainAxis.START) .child(IKey.str(machineName) .asWidget() - .paddingTop(3) .margin(borderRadius, borderRadius, borderRadius, 1) .size(Math.min(minPanelWidth, textTitleWidth), textHeight)); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/mui/GTSingleblockMachinePanels.java b/src/main/java/com/gregtechceu/gtceu/common/data/mui/GTSingleblockMachinePanels.java index 29c2159ce88..f91615ed720 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/mui/GTSingleblockMachinePanels.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/mui/GTSingleblockMachinePanels.java @@ -13,9 +13,7 @@ import com.gregtechceu.gtceu.api.mui.utils.Alignment; import com.gregtechceu.gtceu.api.mui.value.sync.PanelSyncManager; import com.gregtechceu.gtceu.api.mui.widgets.SlotGroupWidget; -import com.gregtechceu.gtceu.api.mui.widgets.layout.Column; import com.gregtechceu.gtceu.api.mui.widgets.layout.Flow; -import com.gregtechceu.gtceu.api.mui.widgets.layout.Row; import com.gregtechceu.gtceu.api.recipe.gui.GTRecipeTypeUIs; import com.gregtechceu.gtceu.client.mui.screen.ModularPanel; import com.gregtechceu.gtceu.client.mui.screen.UISettings; @@ -78,26 +76,28 @@ public class GTSingleblockMachinePanels { .coverChildren() .leftRel(1.0f) .reverseLayout(true) + .padding(2, 4, 4, 4) .bottom(16) - .padding(0, 8, 4, 4) + .crossAxisAlignment(Alignment.CrossAxis.CENTER) .childPadding(2) .background(backgroundTexture.getSubArea(0.25f, 0f, 1.0f, 1.0f)) .child(GTMuiWidgets.createPowerButton(workableMachine, syncManager)) .child(GTMuiWidgets.createBatterySlot(simpleTieredMachine, syncManager)) - .childIf(autoOutput != null, + .childIf(autoOutput != null && autoOutput.supportsAutoOutputItems(), () -> GTMuiWidgets.createAutoOutputItemButton(autoOutput, syncManager)) - .childIf(autoOutput != null, + .childIf(autoOutput != null && autoOutput.supportsAutoOutputFluids(), () -> GTMuiWidgets.createAutoOutputFluidButton(autoOutput, syncManager)) - .childIf(autoOutput != null, + .childIf(autoOutput != null && autoOutput.supportsAutoOutputItems(), () -> GTMuiWidgets.createInputFromOutputItem(autoOutput, syncManager)) - .childIf(autoOutput != null, + .childIf(autoOutput != null && autoOutput.supportsAutoOutputFluids(), () -> GTMuiWidgets.createInputFromOutputFluid(autoOutput, syncManager))) .child(Flow.col() .coverChildren() .rightRel(1.0f) .reverseLayout(true) - .padding(0, 8, 4, 4) + .padding(4, 2, 4, 4) .bottom(16) + .crossAxisAlignment(Alignment.CrossAxis.CENTER) .background(GTGuiTextures.BACKGROUND.getSubArea(0f, 0f, 0.75f, 1.0f)) .childIf(ghostCircuit, () -> GTMuiWidgets.createCircuitSlotPanel(simpleTieredMachine, panel, syncManager))) @@ -172,13 +172,13 @@ public class GTSingleblockMachinePanels { .background(backgroundTexture.getSubArea(0.25f, 0f, 1.0f, 1.0f)) .child(GTMuiWidgets.createPowerButton(workableMachine, syncManager)) .child(GTMuiWidgets.createBatterySlot(simpleTieredMachine, syncManager)) - .childIf(autoOutput != null, + .childIf(autoOutput != null && autoOutput.supportsAutoOutputItems(), () -> GTMuiWidgets.createAutoOutputItemButton(autoOutput, syncManager)) - .childIf(autoOutput != null, + .childIf(autoOutput != null && autoOutput.supportsAutoOutputFluids(), () -> GTMuiWidgets.createAutoOutputFluidButton(autoOutput, syncManager)) - .childIf(autoOutput != null, + .childIf(autoOutput != null && autoOutput.supportsAutoOutputItems(), () -> GTMuiWidgets.createInputFromOutputItem(autoOutput, syncManager)) - .childIf(autoOutput != null, + .childIf(autoOutput != null && autoOutput.supportsAutoOutputFluids(), () -> GTMuiWidgets.createInputFromOutputFluid(autoOutput, syncManager))) .child(Flow.col() .coverChildren() @@ -238,8 +238,8 @@ public class GTSingleblockMachinePanels { var autoOutput = machine.getTraitHolder().getTrait(AutoOutputTrait.TYPE); panel.child(GTMuiWidgets.createTitleBar(machine.getDefinition(), 176)) - .child(new Row() - .childIf(hasXEI, GTRecipeTypeUIs.recipeTypeUIs.get(workableMachine.getRecipeType()) + .child(Flow.row() + .childIf(hasXEI, () -> GTRecipeTypeUIs.recipeTypeUIs.get(workableMachine.getRecipeType()) .getBackedSlotsRow(syncManager, theme, simpleTieredMachine.importItems, simpleTieredMachine.exportItems, simpleTieredMachine.importFluids, simpleTieredMachine.exportFluids, @@ -250,7 +250,7 @@ public class GTSingleblockMachinePanels { // .left(7) .bottom(76 + 7 + 18 + 9)) .child(SlotGroupWidget.playerInventory(false).left(7).bottom(7)) - .child(new Column() + .child(Flow.col() .coverChildren() .leftRel(1.0f) .reverseLayout(true) @@ -260,15 +260,15 @@ public class GTSingleblockMachinePanels { .background(backgroundTexture.getSubArea(0.25f, 0f, 1.0f, 1.0f)) .child(GTMuiWidgets.createPowerButton(workableMachine, syncManager)) .child(GTMuiWidgets.createBatterySlot(simpleTieredMachine, syncManager)) - .childIf(autoOutput != null, + .childIf(autoOutput != null && autoOutput.supportsAutoOutputItems(), () -> GTMuiWidgets.createAutoOutputItemButton(autoOutput, syncManager)) - .childIf(autoOutput != null, + .childIf(autoOutput != null && autoOutput.supportsAutoOutputFluids(), () -> GTMuiWidgets.createAutoOutputFluidButton(autoOutput, syncManager)) - .childIf(autoOutput != null, + .childIf(autoOutput != null && autoOutput.supportsAutoOutputItems(), () -> GTMuiWidgets.createInputFromOutputItem(autoOutput, syncManager)) - .childIf(autoOutput != null, + .childIf(autoOutput != null && autoOutput.supportsAutoOutputFluids(), () -> GTMuiWidgets.createInputFromOutputFluid(autoOutput, syncManager))) - .child(new Column() + .child(Flow.col() .coverChildren() .rightRel(1.0f) .reverseLayout(true) @@ -276,7 +276,7 @@ public class GTSingleblockMachinePanels { .bottom(16) .background(GTGuiTextures.BACKGROUND.getSubArea(0f, 0f, 0.75f, 1.0f)) .childIf(ghostCircuit, - GTMuiWidgets.createCircuitSlotPanel(simpleTieredMachine, panel, syncManager))) + () -> GTMuiWidgets.createCircuitSlotPanel(simpleTieredMachine, panel, syncManager))) .child(GTMuiWidgets.createGTLogo() .right(7).bottom(7 + 78)); if (hasXEI && false) { @@ -314,8 +314,8 @@ public class GTSingleblockMachinePanels { } panel.child(GTMuiWidgets.createTitleBar(machine.getDefinition(), 176)) - .child(new Row() - .childIf(hasXEI, GTRecipeTypeUIs.recipeTypeUIs.get(steamMachine.getRecipeType()) + .child(Flow.row() + .childIf(hasXEI, () -> GTRecipeTypeUIs.recipeTypeUIs.get(steamMachine.getRecipeType()) .getBackedSlotsRow(syncManager, theme, steamMachine.importItems, steamMachine.exportItems, null, null, @@ -326,7 +326,7 @@ public class GTSingleblockMachinePanels { // .left(7) .bottom(76 + 7 + 18 + 9)) .child(SlotGroupWidget.playerInventory(false).left(7).bottom(7)) - .child(new Column() + .child(Flow.col() .coverChildren() .leftRel(1.0f) .reverseLayout(true)