From fc880eb37bab26f5cbb6adbeda5f52fb49db3708 Mon Sep 17 00:00:00 2001 From: Gustavo Date: Tue, 14 Apr 2026 21:06:03 +1000 Subject: [PATCH 01/21] add trait priority --- .../gtceu/api/block/MetaMachineBlock.java | 14 ++---- .../gtceu/api/machine/MetaMachine.java | 35 +++++++++++++- .../gtceu/api/machine/trait/MachineTrait.java | 3 ++ .../api/machine/trait/MachineTraitHolder.java | 46 +++++++++++++++---- 4 files changed, 78 insertions(+), 20 deletions(-) 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 fc73ae26fd4..f22a5600a02 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/block/MetaMachineBlock.java +++ b/src/main/java/com/gregtechceu/gtceu/api/block/MetaMachineBlock.java @@ -274,18 +274,12 @@ public InteractionResult use(BlockState state, Level world, BlockPos pos, Player machine.setOwnerUUID(sPlayer.getUUID()); } - InteractionResult machineInteractResult; - if (itemStack.isEmpty()) { - machineInteractResult = machine.onUse(new ExtendedUseOnContext(player, hand, hit)); - } else { - machineInteractResult = machine.onUseWithItem(new ExtendedUseOnContext(player, hand, hit)); - } + InteractionResult machineInteractResult = InteractionResult.PASS; + if (!itemStack.isEmpty()) machineInteractResult = machine.onUseWithItem(new ExtendedUseOnContext(player, hand, hit)); + if (machineInteractResult != InteractionResult.PASS) return machineInteractResult; + machineInteractResult = machine.onUse(new ExtendedUseOnContext(player, hand, hit)); if (machineInteractResult != InteractionResult.PASS) return machineInteractResult; - - if (itemStack.is(GTItems.PORTABLE_SCANNER.get())) { - return itemStack.getItem().use(world, player, hand).getResult(); - } if (itemStack.getItem() instanceof IGTTool gtToolItem) { shouldOpenUi = gtToolItem.definition$shouldOpenUIAfterUse(new UseOnContext(player, hand, hit)); 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 b1a9717cea2..5cbc53b9854 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java @@ -272,14 +272,32 @@ private void executeTick() { // ******* Machine Traits *******// ////////////////////////////////////// - public @UnmodifiableView List getAllTraits() { + /** + * @return An unmodifiable list of all traits attached to this machine. + */ + public @Unmodifiable List getAllTraits() { return traitHolder.getAllTraits(); } + /** + * Attaches a trait to this machine, with the default trait callback priority of 1. + * @param trait The trait to attach + * @return The attached trait + */ public T attachTrait(T trait) { return traitHolder.attachTrait(trait); } + /** + * Attaches a trait to this machine. + * @param trait The trait to attach + * @param callbackPriority The trait's callback priority. Traits with a higher priority will have their events fired first, which may prevent traits with a lower priority from handling some events. + * @return The attached trait + */ + public T attachTrait(T trait, int callbackPriority) { + return traitHolder.attachTrait(trait, callbackPriority); + } + /** * Registers a trait with data to be saved or synced to the client. * Do not register a persistent trait and also store that trait as a syncable machine field, otherwise the trait @@ -293,23 +311,36 @@ public void attachPersistentTrait(String traitName, MachineTrait trait) { traitHolder.registerPersistentTrait(traitName, trait); } + /** + * Gets a trait registered by {@code registerPersistentTrait} + * @param traitName the unique identifier for the trait + * @return the trait, or null if not present + */ public @Nullable T getPersistentTrait(String traitName) { return traitHolder.getPersistentTrait(traitName); } /** - * Gets the first trait with the specified type. + * Gets the first trait (trait with highest priority) of a specified type + * @param type The trait type to get + * @return The trait, or null if no traits of the given type are present. */ public @Nullable T getTrait(MachineTraitType type) { return traitHolder.getTrait(type); } + /** + * Gets the first trait (trait with highest priority) of a specified type + * @param type The trait type to get + * @return An optional result containing the trait if present. + */ public Optional getTraitOptional(MachineTraitType type) { return Optional.ofNullable(getTrait(type)); } /** * Get all traits with the specified type. + * @return An unmodifiable list containing all traits of the specified type. */ public @Unmodifiable List getTraits(MachineTraitType type) { return traitHolder.getTraits(type); diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTrait.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTrait.java index d29c074023d..2cfb3010289 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTrait.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTrait.java @@ -37,6 +37,9 @@ public abstract class MachineTrait implements ISyncManaged { private @Nullable MetaMachine machine; @Setter protected Predicate<@Nullable Direction> capabilityValidator = $ -> true; + @Getter + @Setter + private int traitPriority = 1; public MachineTrait(MetaMachine machine) { this.capabilityValidator = side -> true; diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTraitHolder.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTraitHolder.java index 95a2ea6af90..d840ec3f421 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTraitHolder.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTraitHolder.java @@ -11,13 +11,10 @@ import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; import it.unimi.dsi.fastutil.objects.ObjectArrayList; import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.Unmodifiable; import org.jetbrains.annotations.UnmodifiableView; -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Optional; +import java.util.*; public final class MachineTraitHolder { @@ -34,11 +31,29 @@ public MachineTraitHolder(MetaMachine machine) { this.traitsToSave = new Object2ObjectOpenHashMap<>(); } - public @UnmodifiableView List getAllTraits() { - return traits; + /** + * @return An unmodifiable list of all traits attached to this machine. + */ + public @Unmodifiable List getAllTraits() { + return Collections.unmodifiableList(traits); } + /** + * Attaches a trait to this machine, with the default trait callback priority of 1. + * @param trait The trait to attach + * @return The attached trait + */ public T attachTrait(T trait) { + return attachTrait(trait, 1); + } + + /** + * Attaches a trait to this machine. + * @param trait The trait to attach + * @param callbackPriority The trait's callback priority. Traits with a higher priority will have their events fired first, which may prevent traits with a lower priority from handling some events. + * @return The attached trait + */ + public T attachTrait(T trait, int callbackPriority) { var traitType = trait.getTraitType(); var list = traitsByType.computeIfAbsent(traitType, $ -> new ObjectArrayList<>(1)); @@ -47,7 +62,9 @@ public T attachTrait(T trait) { } list.add(trait); + list.sort(Comparator.comparingInt(MachineTrait::getTraitPriority).reversed()); traits.add(trait); + traits.sort(Comparator.comparingInt(MachineTrait::getTraitPriority).reversed()); trait.setMachine(machine); return trait; @@ -69,6 +86,11 @@ public MachineTraitHolder registerPersistentTrait(String traitName, MachineTrait return this; } + /** + * Gets a trait registered by {@code registerPersistentTrait} + * @param traitName the unique identifier for the trait + * @return the trait, or null if not present + */ @SuppressWarnings("unchecked") public @Nullable T getPersistentTrait(String traitName) { MachineTrait trait = traitsToSave.get(traitName); @@ -76,7 +98,9 @@ public MachineTraitHolder registerPersistentTrait(String traitName, MachineTrait } /** - * Gets the first trait with the specified type. + * Gets the first trait (trait with highest priority) of a specified type + * @param type The trait type to get + * @return The trait, or null if no traits of the given type are present. */ public @Nullable T getTrait(MachineTraitType type) { List traitList = traitsByType.get(type); @@ -84,12 +108,18 @@ public MachineTraitHolder registerPersistentTrait(String traitName, MachineTrait return type.castTrait(traitList.get(0)); } + /** + * Gets the first trait (trait with highest priority) of a specified type + * @param type The trait type to get + * @return An optional result containing the trait if present. + */ public Optional getTraitOptional(MachineTraitType type) { return Optional.ofNullable(getTrait(type)); } /** * Get all traits with the specified type. + * @return An unmodifiable list containing all traits of the specified type. */ @SuppressWarnings("unchecked") public @UnmodifiableView List getTraits(MachineTraitType type) { From 018691304d5c8ecc4624e0dc5d579b4d2a4710ad Mon Sep 17 00:00:00 2001 From: Gustavo Date: Tue, 14 Apr 2026 21:18:03 +1000 Subject: [PATCH 02/21] turn cover container into machine trait --- .../api/machine/MachineCoverContainer.java | 72 ++++++++++++++++++- .../gtceu/api/machine/MetaMachine.java | 29 +------- .../gtceu/api/machine/trait/MachineTrait.java | 4 +- 3 files changed, 77 insertions(+), 28 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/MachineCoverContainer.java b/src/main/java/com/gregtechceu/gtceu/api/machine/MachineCoverContainer.java index 012fa549ad2..e4f7b6eee0f 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/MachineCoverContainer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/MachineCoverContainer.java @@ -4,6 +4,11 @@ import com.gregtechceu.gtceu.api.capability.ICoverable; import com.gregtechceu.gtceu.api.cover.CoverBehavior; import com.gregtechceu.gtceu.api.cover.CoverDefinition; +import com.gregtechceu.gtceu.api.item.tool.GTToolType; +import com.gregtechceu.gtceu.api.machine.trait.MachineTrait; +import com.gregtechceu.gtceu.api.machine.trait.MachineTraitType; +import com.gregtechceu.gtceu.api.machine.trait.feature.IFrontFacingTrait; +import com.gregtechceu.gtceu.api.machine.trait.feature.IRenderingTrait; import com.gregtechceu.gtceu.api.sync_system.ISyncManaged; import com.gregtechceu.gtceu.api.sync_system.SyncDataHolder; import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; @@ -11,7 +16,14 @@ import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.api.transfer.fluid.IFluidHandlerModifiable; +import com.gregtechceu.gtceu.utils.GTUtil; +import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; +import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +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.shapes.VoxelShape; import net.minecraftforge.items.IItemHandlerModifiable; @@ -19,8 +31,11 @@ import org.jetbrains.annotations.Nullable; import java.util.ArrayList; +import java.util.Set; -public class MachineCoverContainer implements ICoverable, ISyncManaged { +public class MachineCoverContainer extends MachineTrait implements IFrontFacingTrait, IRenderingTrait, ICoverable, ISyncManaged { + + public static final MachineTraitType TYPE = new MachineTraitType<>(MachineCoverContainer.class); @Getter private final SyncDataHolder syncDataHolder = new SyncDataHolder(this); @@ -35,11 +50,66 @@ public MachineCoverContainer(MetaMachine machine) { this.machine = machine; } + @Override + public MachineTraitType getTraitType() { + return TYPE; + } + @Override public IGregtechBlockEntity getHolder() { return machine; } + @Override + public void onMachineLoad() { + onLoad(); + } + + @Override + public void onMachineUnload() { + onUnload(); + } + + @Override + public void onMachineDestroyed() { + for (Direction direction : GTUtil.DIRECTIONS) { + removeCover(direction, null); + } + } + + @Override + public boolean shouldRenderGridOverlay(Player player, BlockPos pos, BlockState state, ItemStack held, Set toolTypes) { + for (CoverBehavior cover : getCovers()) { + if (cover.shouldRenderGrid(player, pos, state, held, toolTypes)) return true; + } + return false; + } + + @Override + public @Nullable ResourceTexture getGridOverlayIcon(Player player, BlockPos pos, BlockState state, Set toolTypes, Direction side) { + var cover = getCoverAtSide(side); + if (cover != null) { + return cover.sideTips(player, pos, state, toolTypes, side); + } + return null; + } + + @Override + public boolean isValidFrontFace(Direction direction) { + if (hasCover(direction)) { + // noinspection DataFlowIssue + var coverDefinition = getCoverAtSide(direction).coverDefinition; + var behaviour = coverDefinition.createCoverBehavior(this, getFrontFacing()); + return behaviour.canAttach(); + } + return true; + } + + @Override + public void onMachineNeighborChanged(Block block, BlockPos fromPos, boolean isMoving) { + onNeighborChanged(block, fromPos, isMoving); + } + @Override public boolean canPlaceCoverOnSide(CoverDefinition definition, Direction side) { ArrayList collisionList = new ArrayList<>(); 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 5cbc53b9854..e53ee0686cc 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java @@ -46,7 +46,6 @@ import com.gregtechceu.gtceu.common.machine.owner.PlayerOwner; import com.gregtechceu.gtceu.common.machine.trait.AutoOutputTrait; import com.gregtechceu.gtceu.utils.ExtendedUseOnContext; -import com.gregtechceu.gtceu.utils.GTUtil; import com.gregtechceu.gtceu.utils.data.TagCompatibilityFixer; import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; @@ -139,8 +138,8 @@ public class MetaMachine extends ManagedSyncBlockEntity implements IGregtechBloc public MetaMachine(BlockEntityCreationInfo info) { super(info); this.renderState = getDefinition().defaultRenderState(); - this.coverContainer = new MachineCoverContainer(this); this.traitHolder = new MachineTraitHolder(this); + this.coverContainer = attachTrait(new MachineCoverContainer(this)); this.serverTicks = new ArrayList<>(); this.waitingToAdd = new ArrayList<>(); } @@ -158,7 +157,6 @@ public void load(CompoundTag tag) { @MustBeInvokedByOverriders public void onLoad() { getAllTraits().forEach(MachineTrait::onMachineLoad); - coverContainer.onLoad(); // update the painted model property if the machine is painted MachineRenderState renderState = getRenderState(); @@ -177,7 +175,7 @@ public final void setRemoved() { @MustBeInvokedByOverriders public void onUnload() { getAllTraits().forEach(MachineTrait::onMachineUnload); - coverContainer.onUnload(); + for (TickableSubscription serverTick : serverTicks) { serverTick.unsubscribe(); } @@ -198,9 +196,7 @@ public void onMachinePlaced(@Nullable LivingEntity player, ItemStack stack) { } public void onMachineDestroyed() { - for (Direction direction : GTUtil.DIRECTIONS) { - getCoverContainer().removeCover(direction, null); - } + getAllTraits().forEach(MachineTrait::onMachineDestroyed); } public void modifyDrops(List drops) {} @@ -565,9 +561,6 @@ public void onPaintingColorChanged(int color) {} public boolean shouldRenderGrid(Player player, BlockPos pos, BlockState state, ItemStack held, Set toolTypes) { if (toolTypes.contains(GTToolType.WRENCH)) return true; - for (CoverBehavior cover : coverContainer.getCovers()) { - if (cover.shouldRenderGrid(player, pos, state, held, toolTypes)) return true; - } for (var trait : getAllTraits()) { if (trait instanceof IRenderingTrait renderingTrait) { @@ -582,12 +575,6 @@ public boolean shouldRenderGrid(Player player, BlockPos pos, BlockState state, I @Override public @Nullable ResourceTexture sideTips(Player player, BlockPos pos, BlockState state, Set toolTypes, Direction side) { - var cover = coverContainer.getCoverAtSide(side); - if (cover != null) { - var tips = cover.sideTips(player, pos, state, toolTypes, side); - if (tips != null) return tips; - } - if (toolTypes.contains(GTToolType.WRENCH)) { if (player.isShiftKeyDown()) { if (isFacingValid(side) || (allowExtendedFacing() && hasFrontFacing() && side == getFrontFacing())) { @@ -661,15 +648,6 @@ public final boolean hasFrontFacing() { public boolean isFacingValid(Direction facing) { if (hasFrontFacing() && facing == getFrontFacing()) return false; - var coverContainer = getCoverContainer(); - if (coverContainer.hasCover(facing)) { - // noinspection DataFlowIssue - var coverDefinition = coverContainer.getCoverAtSide(facing).coverDefinition; - var behaviour = coverDefinition.createCoverBehavior(coverContainer, getFrontFacing()); - if (!behaviour.canAttach()) { - return false; - } - } for (var trait : getAllTraits()) { if (trait instanceof IFrontFacingTrait modifyFacingTrait) { @@ -744,7 +722,6 @@ public int tintColor(int index) { } public void onNeighborChanged(Block block, BlockPos fromPos, boolean isMoving) { - coverContainer.onNeighborChanged(block, fromPos, isMoving); getAllTraits().forEach(t -> t.onMachineNeighborChanged(block, fromPos, isMoving)); } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTrait.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTrait.java index 2cfb3010289..aa0caefc9bd 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTrait.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTrait.java @@ -79,7 +79,7 @@ public void setMachine(MetaMachine machine) { return getMachine().subscribeServerTick(last, runnable); } - public void unsubscribe(TickableSubscription current) { + public void unsubscribe(@Nullable TickableSubscription current) { getMachine().unsubscribe(current); } @@ -121,5 +121,7 @@ public void onMachineLoad() {} public void onMachineUnload() {} + public void onMachineDestroyed() {} + public void onMachineNeighborChanged(Block block, BlockPos fromPos, boolean isMoving) {} } From d1325e613b7886139bdcec80ad3dd71da8cdf6d1 Mon Sep 17 00:00:00 2001 From: Gustavo Date: Tue, 14 Apr 2026 21:33:29 +1000 Subject: [PATCH 03/21] update notifiable item handler drop behaviour --- .../gregtechceu/gtceu/api/machine/MetaMachine.java | 13 ++----------- .../gtceu/api/machine/SimpleTieredMachine.java | 5 +---- .../gtceu/api/machine/WorkableTieredMachine.java | 7 ------- .../api/machine/steam/SimpleSteamMachine.java | 7 ------- .../machine/trait/NotifiableItemStackHandler.java | 14 +++++++++----- .../api/machine/trait/feature/IRenderingTrait.java | 2 -- .../machine/electric/BlockBreakerMachine.java | 1 - .../common/machine/electric/FisherMachine.java | 2 -- .../machine/electric/ItemCollectorMachine.java | 1 - .../common/machine/electric/MinerMachine.java | 2 -- .../multiblock/part/DataAccessHatchMachine.java | 6 ------ .../multiblock/part/FluidHatchPartMachine.java | 9 +-------- .../multiblock/part/ItemBusPartMachine.java | 13 ++----------- .../part/MaintenanceHatchPartMachine.java | 6 ------ .../multiblock/part/ObjectHolderMachine.java | 10 ---------- .../multiblock/part/RotorHolderPartMachine.java | 6 ------ .../primitive/PrimitiveWorkableMachine.java | 7 ------- .../common/machine/steam/SteamMinerMachine.java | 7 ------- .../machine/steam/SteamSolidBoilerMachine.java | 7 ------- .../common/machine/storage/BufferMachine.java | 10 ---------- .../gtceu/common/machine/storage/CrateMachine.java | 7 +------ .../common/machine/trait/miner/MinerLogic.java | 10 ++++++++-- 22 files changed, 24 insertions(+), 128 deletions(-) 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 e53ee0686cc..5cc5ab3ce9f 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java @@ -678,9 +678,7 @@ public void setFrontFacing(Direction facing) { @Override public ModelData getModelData() { - ModelData.Builder data = super.getModelData().derive(); - updateModelData(data); - return data.build(); + return super.getModelData().derive().build(); } public Direction getUpwardsFacing() { @@ -728,7 +726,7 @@ public void onNeighborChanged(Block block, BlockPos fromPos, boolean isMoving) { public void animateTick(RandomSource random) {} public BlockState getBlockAppearance(BlockState state, BlockAndTintGetter level, BlockPos pos, Direction side, - BlockState sourceState, BlockPos sourcePos) { + @Nullable BlockState sourceState, @Nullable BlockPos sourcePos) { var appearance = getCoverContainer().getBlockAppearance(state, level, pos, side, sourceState, sourcePos); if (appearance != null) return appearance; if (this instanceof IMultiPart part && part.isFormed()) { @@ -738,13 +736,6 @@ public BlockState getBlockAppearance(BlockState state, BlockAndTintGetter level, return getDefinition().getAppearance().get(); } - @MustBeInvokedByOverriders - public void updateModelData(ModelData.Builder builder) { - for (MachineTrait trait : getAllTraits()) { - if (trait instanceof IRenderingTrait renderingTrait) renderingTrait.updateModelData(builder); - } - } - public final long getOffsetTimer() { if (getLevel() == null) return getOffset(); else if (getLevel().isClientSide()) return GTValues.CLIENT_TIME + getOffset(); 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 4da488d9b07..4702d7507f1 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleTieredMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleTieredMachine.java @@ -82,7 +82,7 @@ public int getSlotLimit(int slot) { (ConfigHolder.INSTANCE.compat.energy.nativeEUToFE && GTCapabilityHelper.getForgeEnergyItem(item) != null)); - this.circuitInventory = attachTrait(new NotifiableItemStackHandler(1, IO.IN, IO.NONE) + this.circuitInventory = attachTrait(new NotifiableItemStackHandler(1, IO.IN, IO.NONE).shouldDropInventoryInWorld(!ConfigHolder.INSTANCE.machines.ghostCircuit) .setFilter(IntCircuitBehaviour::isIntegratedCircuit)); } @@ -131,9 +131,6 @@ protected void chargeBattery() { public void onMachineDestroyed() { super.onMachineDestroyed(); chargerInventory.dropInventoryInWorld(getLevel(), getBlockPos()); - if (!ConfigHolder.INSTANCE.machines.ghostCircuit) { - circuitInventory.dropInventoryInWorld(); - } } /// ////////////////////////////////// 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 e0343db8aeb..63fffde8fa3 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/WorkableTieredMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/WorkableTieredMachine.java @@ -141,13 +141,6 @@ public void onUnload() { // ********** MISC ***********// ////////////////////////////////////// - @Override - public void onMachineDestroyed() { - super.onMachineDestroyed(); - importItems.dropInventoryInWorld(); - exportItems.dropInventoryInWorld(); - } - public void setMuffled(boolean muffled) { isMuffled = muffled; syncDataHolder.markClientSyncFieldDirty("isMuffled"); 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 3b279e520f0..157f5d80b25 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 @@ -80,13 +80,6 @@ public void onLoad() { this.addHandlerList(RecipeHandlerList.of(IO.IN, new SteamEnergyRecipeHandler(steamTank, getConversionRate()))); } - @Override - public void onMachineDestroyed() { - super.onMachineDestroyed(); - importItems.dropInventoryInWorld(); - exportItems.dropInventoryInWorld(); - } - ////////////////////////////////////// // ****** Venting Logic ******// ////////////////////////////////////// diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableItemStackHandler.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableItemStackHandler.java index 16c2ceb6d7e..991ea6b4ed4 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableItemStackHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableItemStackHandler.java @@ -14,7 +14,6 @@ import com.gregtechceu.gtceu.utils.GTTransferUtils; import com.gregtechceu.gtceu.utils.GTUtil; -import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.Direction; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.Ingredient; @@ -31,10 +30,6 @@ import java.util.function.IntFunction; import java.util.function.Predicate; -import javax.annotation.ParametersAreNonnullByDefault; - -@MethodsReturnNonnullByDefault -@ParametersAreNonnullByDefault public class NotifiableItemStackHandler extends NotifiableRecipeHandlerTrait implements ICapabilityTrait, IItemHandlerModifiable { @@ -58,6 +53,10 @@ public MachineTraitType getTraitType() { @Setter private boolean shouldSearchContent = true; private @Nullable Boolean isEmpty; + @Accessors(fluent = true) + @Getter + @Setter + private boolean shouldDropInventoryInWorld = true; public NotifiableItemStackHandler(int slots, IO handlerIO, IO capabilityIO, IntFunction storageFactory) { @@ -329,6 +328,11 @@ public void dropInventoryInWorld() { storage.dropInventoryInWorld(getLevel(), getMachine().getBlockPos()); } + @Override + public void onMachineDestroyed() { + if (shouldDropInventoryInWorld) dropInventoryInWorld(); + } + public static class KJSCallWrapper { public static ItemStack applyIngredientAction(CustomItemStackHandler storage, int index, diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/IRenderingTrait.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/IRenderingTrait.java index bdf175dd2b2..3e8cb3398c8 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/IRenderingTrait.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/IRenderingTrait.java @@ -40,6 +40,4 @@ default boolean shouldRenderGridOverlay(Player player, BlockPos pos, BlockState Direction side) { return null; } - - default void updateModelData(ModelData.Builder builder) {} } 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 01151715cfc..090fe634517 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 @@ -140,7 +140,6 @@ public void onUnload() { public void onMachineDestroyed() { super.onMachineDestroyed(); chargerInventory.dropInventoryInWorld(getLevel(), getBlockPos()); - cache.dropInventoryInWorld(); } @Override 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 2b185639212..f949a63cb72 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 @@ -165,8 +165,6 @@ public void onUnload() { public void onMachineDestroyed() { super.onMachineDestroyed(); chargerInventory.dropInventoryInWorld(getLevel(), getBlockPos()); - baitHandler.dropInventoryInWorld(); - cache.dropInventoryInWorld(); } public static int calcMaxProgress(int tier) { 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 abefd9744bf..1249ebb53f0 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 @@ -171,7 +171,6 @@ public void onUnload() { public void onMachineDestroyed() { super.onMachineDestroyed(); chargerInventory.dropInventoryInWorld(getLevel(), getBlockPos()); - output.dropInventoryInWorld(); } ////////////////////////////////////// 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 153deb8e4a2..d4f8b9ed913 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 @@ -96,8 +96,6 @@ protected CustomItemStackHandler createChargerItemHandler() { public void onMachineDestroyed() { super.onMachineDestroyed(); // Remove the miner pipes below this miner - getRecipeLogic().onRemove(); - exportItems.dropInventoryInWorld(); chargerInventory.dropInventoryInWorld(getLevel(), getBlockPos()); } 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 97e8c28c70e..22bfb2397d8 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 @@ -113,12 +113,6 @@ protected int getInventorySize() { }; } - @Override - public void onMachineDestroyed() { - super.onMachineDestroyed(); - importItems.dropInventoryInWorld(); - } - private void rebuildData(boolean isDataBank) { if (isCreative || getLevel() == null || getLevel().isClientSide) return; recipes.clear(); 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 6be1843eaa1..12c0dc41c77 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 @@ -79,7 +79,7 @@ public FluidHatchPartMachine(BlockEntityCreationInfo info, int tier, IO io, int if (io == IO.IN) { this.circuitSlotEnabled = true; this.circuitInventory = attachTrait(new NotifiableItemStackHandler(1, IO.IN, IO.NONE)) - .setFilter(IntCircuitBehaviour::isIntegratedCircuit).shouldSearchContent(false); + .setFilter(IntCircuitBehaviour::isIntegratedCircuit).shouldSearchContent(false).shouldDropInventoryInWorld(!ConfigHolder.INSTANCE.machines.ghostCircuit); } else { this.circuitSlotEnabled = false; this.circuitInventory = attachTrait(new NotifiableItemStackHandler(0, IO.NONE)).shouldSearchContent(false); @@ -98,13 +98,6 @@ public static int getTankCapacity(int initialCapacity, int tier) { return initialCapacity * (1 << Math.min(9, tier)); } - @Override - public void onMachineDestroyed() { - super.onMachineDestroyed(); - if (!ConfigHolder.INSTANCE.machines.ghostCircuit) { - circuitInventory.dropInventoryInWorld(); - } - } @Override public void onLoad() { 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 3bc3f3d0d70..35d16d598fb 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 @@ -109,7 +109,8 @@ protected boolean matchesFilter(ItemStack stack) { protected NotifiableItemStackHandler createCircuitItemHandler(IO io) { if (io == IO.IN) { return new NotifiableItemStackHandler(1, IO.IN, IO.NONE) - .setFilter(IntCircuitBehaviour::isIntegratedCircuit); + .setFilter(IntCircuitBehaviour::isIntegratedCircuit) + .shouldDropInventoryInWorld(!ConfigHolder.INSTANCE.machines.ghostCircuit); } else { hasCircuitSlot = false; setCircuitSlotEnabled(false); @@ -117,16 +118,6 @@ protected NotifiableItemStackHandler createCircuitItemHandler(IO io) { } } - @Override - public void onMachineDestroyed() { - super.onMachineDestroyed(); - getInventory().dropInventoryInWorld(); - - if (!ConfigHolder.INSTANCE.machines.ghostCircuit) { - circuitInventory.dropInventoryInWorld(); - } - } - @Override public void onLoad() { super.onLoad(); 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 779e200c869..db06ad3a5d4 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 @@ -93,12 +93,6 @@ protected NotifiableItemStackHandler createInventory() { return new NotifiableItemStackHandler(1, IO.BOTH, IO.BOTH); } - @Override - public void onMachineDestroyed() { - super.onMachineDestroyed(); - itemStackHandler.dropInventoryInWorld(); - } - @Override public byte startProblems() { return ALL_PROBLEMS; 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 1b3225f289d..736f33bb546 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 @@ -62,10 +62,6 @@ public void setDataItem(ItemStack dataItem) { heldItems.setStackInSlot(1, dataItem); } - public NotifiableItemStackHandler getAsHandler() { - return heldItems; - } - private ItemStack getHeldItem(int slot, boolean remove) { ItemStack stackInSlot = heldItems.getStackInSlot(slot); if (remove && stackInSlot != ItemStack.EMPTY) { @@ -74,12 +70,6 @@ private ItemStack getHeldItem(int slot, boolean remove) { return stackInSlot; } - @Override - public void onMachineDestroyed() { - super.onMachineDestroyed(); - heldItems.storage.dropInventoryInWorld(getLevel(), getBlockPos()); - } - @Override public Widget createUIWidget() { return new WidgetGroup(new Position(0, 0)) 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 bc893b76df3..da988458a43 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 @@ -75,12 +75,6 @@ public RotorHolderPartMachine(BlockEntityCreationInfo info, int tier) { // ***** Initialization ******// ////////////////////////////////////// - @Override - public void onMachineDestroyed() { - super.onMachineDestroyed(); - inventory.dropInventoryInWorld(); - } - @Override public int tintColor(int index) { if (index >= 2) { 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 91ee0cad5c6..16c6e40d80a 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 @@ -67,13 +67,6 @@ protected NotifiableFluidTank createExportFluidHandler() { 32 * FluidType.BUCKET_VOLUME, IO.OUT); } - @Override - public void onMachineDestroyed() { - super.onMachineDestroyed(); - importItems.dropInventoryInWorld(); - exportItems.dropInventoryInWorld(); - } - @Override public void afterWorking() { super.afterWorking(); 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 2f2995aa5d5..ef6e016237a 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 @@ -90,13 +90,6 @@ protected NotifiableItemStackHandler createExportItemHandler() { return new NotifiableItemStackHandler(inventorySize, IO.OUT); } - @Override - public void onMachineDestroyed() { - super.onMachineDestroyed(); - getRecipeLogic().onRemove(); - exportItems.dropInventoryInWorld(); - } - @Override public void onNeighborChanged(Block block, BlockPos fromPos, boolean isMoving) { super.onNeighborChanged(block, fromPos, isMoving); 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 6e844172a7b..8af41202da5 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 @@ -128,11 +128,4 @@ public ModularUI createUI(Player entityPlayer) { GuiTextures.PROGRESS_BAR_BOILER_FUEL.get(isHighPressure).getSubTexture(0, 0.5, 1, 0.5)) .setFillDirection(ProgressTexture.FillDirection.DOWN_TO_UP)); } - - @Override - public void onMachineDestroyed() { - super.onMachineDestroyed(); - fuelHandler.dropInventoryInWorld(); - ashHandler.dropInventoryInWorld(); - } } 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 00bbf793f44..dde00c951db 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 @@ -91,14 +91,4 @@ public Widget createUIWidget() { group.addWidget(container); return group; } - - //////////////////////////////// - // ********** Misc ***********// - //////////////////////////////// - - @Override - public void onMachineDestroyed() { - super.onMachineDestroyed(); - inventory.dropInventoryInWorld(); - } } 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 f2f17df1eeb..448ccdd1a74 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 @@ -93,6 +93,7 @@ public InteractionResult onUseWithItem(ExtendedUseOnContext context) { stack.shrink(1); } isTaped = true; + inventory.shouldDropInventoryInWorld(false); setRenderState(getRenderState().setValue(GTMachineModelProperties.IS_TAPED, isTaped)); syncDataHolder.markClientSyncFieldDirty("isTaped"); return InteractionResult.sidedSuccess(context.getLevel().isClientSide); @@ -128,10 +129,4 @@ public void loadFromItem(CompoundTag tag) { public boolean saveBreak() { return isTaped; } - - @Override - public void onMachineDestroyed() { - super.onMachineDestroyed(); - if (!isTaped) inventory.dropInventoryInWorld(); - } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/trait/miner/MinerLogic.java b/src/main/java/com/gregtechceu/gtceu/common/machine/trait/miner/MinerLogic.java index 2b95936180f..afb2f6edb14 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/trait/miner/MinerLogic.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/trait/miner/MinerLogic.java @@ -480,7 +480,8 @@ public void initPos(@NotNull BlockPos pos, int currentRadius) { } else { mineY = pos.getY() - 1; } - onRemove(); + + removePipes(); } /** @@ -626,7 +627,12 @@ public BlockPos getMiningPos() { return getMachine().getBlockPos(); } - public void onRemove() { + @Override + public void onMachineDestroyed() { + removePipes(); + } + + public void removePipes() { pipeLength = 0; if (getMachine().getLevel() instanceof ServerLevel serverLevel) { var pos = getMiningPos().relative(dir); From 6240cf061b14932565df85df6629c5e116e114a0 Mon Sep 17 00:00:00 2001 From: Gustavo Date: Tue, 14 Apr 2026 22:12:11 +1000 Subject: [PATCH 04/21] more javadoc --- .../api/blockentity/IGregtechBlockEntity.java | 9 +++- .../gtceu/api/machine/MetaMachine.java | 54 ++++++++++++++----- .../api/machine/TieredEnergyMachine.java | 3 +- .../api/machine/WorkableTieredMachine.java | 1 + .../gtceu/api/machine/trait/MachineTrait.java | 19 +++++-- .../api/machine/trait/MachineTraitType.java | 8 ++- .../trait/feature/IInteractionTrait.java | 2 +- .../trait/feature/IRenderingTrait.java | 2 +- .../machine/trait/feature/ITraitFeature.java | 4 -- .../multiblock/MultiblockMachineTrait.java | 3 ++ 10 files changed, 72 insertions(+), 33 deletions(-) delete mode 100644 src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/ITraitFeature.java diff --git a/src/main/java/com/gregtechceu/gtceu/api/blockentity/IGregtechBlockEntity.java b/src/main/java/com/gregtechceu/gtceu/api/blockentity/IGregtechBlockEntity.java index 946cb3f5657..866c0cfadde 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/blockentity/IGregtechBlockEntity.java +++ b/src/main/java/com/gregtechceu/gtceu/api/blockentity/IGregtechBlockEntity.java @@ -23,7 +23,14 @@ public interface IGregtechBlockEntity extends ISyncManaged, ITickSubscription, I boolean isRemoved(); - void notifyBlockUpdate(); + /** + * Called to notify neighboring blocks that this block has changed. + */ + default void notifyBlockUpdate() { + if (getLevel() != null) { + getLevel().updateNeighborsAt(getBlockPos(), getLevel().getBlockState(getBlockPos()).getBlock()); + } + } default void scheduleNeighborShapeUpdate() { Level level = getLevel(); 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 5cc5ab3ce9f..c75d8356154 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java @@ -98,6 +98,9 @@ import java.util.function.Consumer; import java.util.function.Predicate; +/** + * The base BlockEntity for all GT machines. + */ public class MetaMachine extends ManagedSyncBlockEntity implements IGregtechBlockEntity, IToolGridHighlight, IFancyTooltip, IPaintable, IMachineFeature, ICopyable { @@ -154,6 +157,9 @@ public void load(CompoundTag tag) { super.load(tag); } + /** + * Called when this machine ticks for the first time after loading. + */ @MustBeInvokedByOverriders public void onLoad() { getAllTraits().forEach(MachineTrait::onMachineLoad); @@ -172,6 +178,9 @@ public final void setRemoved() { onUnload(); } + /** + * Called when this machine is about to be unloaded. + */ @MustBeInvokedByOverriders public void onUnload() { getAllTraits().forEach(MachineTrait::onMachineUnload); @@ -182,6 +191,13 @@ public void onUnload() { serverTicks.clear(); } + /** + * Called when this machine is destroyed. + */ + public void onMachineDestroyed() { + getAllTraits().forEach(MachineTrait::onMachineDestroyed); + } + public void onMachinePlaced(@Nullable LivingEntity player, ItemStack stack) { if (player instanceof ServerPlayer sPlayer) { ownerUUID = sPlayer.getUUID(); @@ -195,10 +211,11 @@ public void onMachinePlaced(@Nullable LivingEntity player, ItemStack stack) { } } - public void onMachineDestroyed() { - getAllTraits().forEach(MachineTrait::onMachineDestroyed); - } + /** + * Called to modify the drops returned when this block is destroyed + * @param drops A modifiable list of drops. + */ public void modifyDrops(List drops) {} ////////////////////////////////////// @@ -235,6 +252,9 @@ public final void serverTick() { public boolean isFirstDummyWorldTick = true; + /** + * Called every tick on the client side. + */ @OnlyIn(Dist.CLIENT) public void clientTick() { if (getLevel() instanceof DummyWorld) { @@ -347,10 +367,10 @@ public Optional getTraitOptional(MachineTraitType ////////////////////////////////////// /** - * 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 + * Called when a player clicks this machine with a GT tool + * @param context The context of this interaction. + * @return A pair containing the type of the tool (if the interaction was successful), and the result of the interaction. + * A result of CONSUME will play the tool sound (based on the first element of the pair) and consume durability. */ public final Pair<@Nullable GTToolType, InteractionResult> onToolClick(ExtendedUseOnContext context) { // the side hit from the machine grid @@ -449,6 +469,8 @@ protected InteractionResult onScrewdriverClick(ExtendedUseOnContext context) { /** * Called when a machine is right clicked with an item. + * @param context The context which this interaction is being performed from. + * @return The result of this interaction callback. */ public InteractionResult onUseWithItem(ExtendedUseOnContext context) { var types = context.getToolType(); @@ -469,7 +491,9 @@ public InteractionResult onUseWithItem(ExtendedUseOnContext context) { } /** - * Called when a machine is right clicked without an item. + * Called when a machine is right clicked without an item, or if this machine was clicked with an item but no item-specific interaction was performed. + * @param context The context which this interaction is being performed from. + * @return The result of this interaction callback. */ public InteractionResult onUse(ExtendedUseOnContext context) { if (context.getPlayer().isShiftKeyDown()) { @@ -508,12 +532,6 @@ public static MetaMachine getMachine(BlockGetter level, BlockPos pos) { return null; } - public void notifyBlockUpdate() { - if (getLevel() != null) { - getLevel().updateNeighborsAt(getBlockPos(), getLevel().getBlockState(getBlockPos()).getBlock()); - } - } - public @UnknownNullability Level getLevel() { return super.getLevel(); } @@ -705,6 +723,11 @@ public void setUpwardsFacing(Direction upwardsFacing) { } } + /** + * Called when this machine is rotated + * @param oldFacing The previous facing direction + * @param newFacing The new facing direction + */ public void onRotated(Direction oldFacing, Direction newFacing) {} public boolean allowExtendedFacing() { @@ -719,6 +742,9 @@ public int tintColor(int index) { return -1; } + /** + * Called when a neighboring block is updated + */ public void onNeighborChanged(Block block, BlockPos fromPos, boolean isMoving) { getAllTraits().forEach(t -> t.onMachineNeighborChanged(block, fromPos, isMoving)); } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/TieredEnergyMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/TieredEnergyMachine.java index d56136fdbf6..c34ffb5b386 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/TieredEnergyMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/TieredEnergyMachine.java @@ -23,13 +23,12 @@ import javax.annotation.ParametersAreNonnullByDefault; -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault public class TieredEnergyMachine extends TieredMachine implements ITieredMachine { @SaveField @SyncToClient public final NotifiableEnergyContainer energyContainer; + @Getter protected final EnvironmentalExplosionTrait environmentalExplosionTrait; 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 63fffde8fa3..95df59261ad 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/WorkableTieredMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/WorkableTieredMachine.java @@ -55,6 +55,7 @@ public abstract class WorkableTieredMachine extends TieredEnergyMachine implemen protected boolean isMuffled; protected boolean previouslyMuffled = true; + public WorkableTieredMachine(BlockEntityCreationInfo info, int tier, RecipeLogic recipeLogic, int importSlots, int exportSlots, diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTrait.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTrait.java index aa0caefc9bd..10933332fbd 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTrait.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTrait.java @@ -16,6 +16,7 @@ import lombok.Getter; import lombok.Setter; +import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nullable; import java.util.List; @@ -41,11 +42,6 @@ public abstract class MachineTrait implements ISyncManaged { @Setter private int traitPriority = 1; - public MachineTrait(MetaMachine machine) { - this.capabilityValidator = side -> true; - machine.getTraitHolder().attachTrait(this); - } - public MachineTrait() {} public MetaMachine getMachine() { @@ -63,6 +59,7 @@ protected List> validMachineClasses() { return List.of(); } + @ApiStatus.Internal public void setMachine(MetaMachine machine) { if (this.machine != null) throw new IllegalStateException("Machine trait already attached to a machine."); if (!validMachineClasses().isEmpty() && @@ -117,11 +114,23 @@ public void scheduleRenderUpdate() { getMachine().scheduleRenderUpdate(); } + /** + * Called when the machine ticks for the first time after loading. + */ public void onMachineLoad() {} + /** + * Called when the machine is about to be unloaded. + */ public void onMachineUnload() {} + /** + * Called when the machine is destroyed. + */ public void onMachineDestroyed() {} + /** + * Called when a neighboring block is updated + */ public void onMachineNeighborChanged(Block block, BlockPos fromPos, boolean isMoving) {} } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTraitType.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTraitType.java index aeb337615c7..b3a2fc7795b 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTraitType.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTraitType.java @@ -1,17 +1,15 @@ package com.gregtechceu.gtceu.api.machine.trait; -import org.jetbrains.annotations.NotNull; - public final class MachineTraitType { private final Class clazz; private final boolean allowMultipleInstances; - public MachineTraitType(@NotNull Class clazz) { + public MachineTraitType(Class clazz) { this(clazz, true); } - public MachineTraitType(@NotNull Class clazz, boolean allowMultipleInstances) { + public MachineTraitType(Class clazz, boolean allowMultipleInstances) { this.clazz = clazz; this.allowMultipleInstances = allowMultipleInstances; } @@ -20,7 +18,7 @@ public boolean allowsMultipleInstances() { return allowMultipleInstances; } - public @NotNull T castTrait(@NotNull MachineTrait trait) { + public T castTrait(MachineTrait trait) { return clazz.cast(trait); } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/IInteractionTrait.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/IInteractionTrait.java index aa1b4601f9d..dd0ae98f2ab 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/IInteractionTrait.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/IInteractionTrait.java @@ -13,7 +13,7 @@ * A machine trait that provides special interaction behaviour. */ @ParametersAreNonnullByDefault -public interface IInteractionTrait extends ITraitFeature { +public interface IInteractionTrait { /// Called when a player interacts with a machine without an item. default InteractionResult onUse(ExtendedUseOnContext context) { diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/IRenderingTrait.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/IRenderingTrait.java index 3e8cb3398c8..73087c1174f 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/IRenderingTrait.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/IRenderingTrait.java @@ -21,7 +21,7 @@ * A machine trait that overrides some of the default machine rendering behaviour. */ @ParametersAreNonnullByDefault -public interface IRenderingTrait extends ITraitFeature { +public interface IRenderingTrait { /** * Called when a player is looking at this machine, returns whether the grid overlay should be rendered. diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/ITraitFeature.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/ITraitFeature.java deleted file mode 100644 index 93694f7d2ea..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/ITraitFeature.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.gregtechceu.gtceu.api.machine.trait.feature; - -//// Represents an aspect of MetaMachine behaviour which this trait modifies. -public interface ITraitFeature {} diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/multiblock/MultiblockMachineTrait.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/multiblock/MultiblockMachineTrait.java index 0b745590200..66e57b0112b 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/multiblock/MultiblockMachineTrait.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/multiblock/MultiblockMachineTrait.java @@ -5,6 +5,9 @@ import java.util.List; +/** + * A machine trait that is specific to multiblock controllers. + */ public abstract class MultiblockMachineTrait extends MachineTrait { public MultiblockMachineTrait() { From 8f93203054413479dbfe7ef5c6c5d128222d6431 Mon Sep 17 00:00:00 2001 From: Gustavo Date: Tue, 14 Apr 2026 22:48:40 +1000 Subject: [PATCH 05/21] more docs --- .../gtceu/api/block/MetaMachineBlock.java | 21 ++- .../gtceu/api/machine/MetaMachine.java | 138 +++++++++++++----- .../gtceu/api/machine/trait/MachineTrait.java | 2 +- .../machine/steam/SteamSolarBoiler.java | 4 +- .../common/machine/storage/CrateMachine.java | 19 +-- 5 files changed, 123 insertions(+), 61 deletions(-) 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 f22a5600a02..3610a23a37d 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/block/MetaMachineBlock.java +++ b/src/main/java/com/gregtechceu/gtceu/api/block/MetaMachineBlock.java @@ -18,6 +18,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.locale.Language; +import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerPlayer; import net.minecraft.util.RandomSource; @@ -120,7 +121,16 @@ public void setPlacedBy(Level pLevel, BlockPos pPos, BlockState pState, @Nullabl if (!pLevel.isClientSide) { var machine = MetaMachine.getMachine(pLevel, pPos); if (machine != null) { - machine.onMachinePlaced(player, pStack); + if (player instanceof ServerPlayer sPlayer) { + machine.setOwnerUUID(sPlayer.getUUID()); + } + + if (machine instanceof IDropSaveMachine dropSaveMachine) { + CompoundTag tag = pStack.getTag(); + if (tag != null) { + dropSaveMachine.loadFromItem(tag); + } + } } } } @@ -325,16 +335,13 @@ public int getAnalogOutputSignal(BlockState state, Level level, BlockPos pos) { return machine.getAnalogOutputSignal(); } - ///////// - @Override - public void neighborChanged(BlockState state, Level level, BlockPos pos, Block block, BlockPos fromPos, - boolean isMoving) { + public void neighborChanged(BlockState state, Level level, BlockPos pos, Block neighborBlock, BlockPos neighborPos, boolean movedByPiston) { var machine = MetaMachine.getMachine(level, pos); if (machine != null) { - machine.onNeighborChanged(block, fromPos, isMoving); + machine.onNeighborChanged(neighborBlock, neighborPos, movedByPiston); } - super.neighborChanged(state, level, pos, block, fromPos, isMoving); + super.neighborChanged(state, level, pos, neighborBlock, neighborPos, movedByPiston); } @Override 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 c75d8356154..83dbe9aaa11 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java @@ -81,6 +81,7 @@ import net.minecraftforge.client.model.data.ModelData; import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.capabilities.ForgeCapabilities; +import net.minecraftforge.common.extensions.IForgeBlock; import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.energy.IEnergyStorage; import net.minecraftforge.fluids.FluidStack; @@ -198,20 +199,6 @@ public void onMachineDestroyed() { getAllTraits().forEach(MachineTrait::onMachineDestroyed); } - 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); - } - } - } - - /** * Called to modify the drops returned when this block is destroyed * @param drops A modifiable list of drops. @@ -246,6 +233,7 @@ public void unsubscribe(@Nullable TickableSubscription current) { } } + @ApiStatus.Internal public final void serverTick() { executeTick(); } @@ -536,6 +524,7 @@ public static MetaMachine getMachine(BlockGetter level, BlockPos pos) { return super.getLevel(); } + @ApiStatus.Internal public void setOwnerUUID(UUID uuid) { ownerUUID = uuid; syncDataHolder.markClientSyncFieldDirty("ownerUUID"); @@ -619,6 +608,10 @@ public boolean shouldRenderGrid(Player player, BlockPos pos, BlockState state, I return null; } + /** + * Adds extra information to the F3 debug overlay when looking at this machine. + * @param lines A string consumer which lines are added to. + */ public void addDebugOverlayText(Consumer lines) { lines.accept(ChatFormatting.UNDERLINE + "Targeted Machine: "); lines.accept(this.getDefinition().getId().toString()); @@ -630,6 +623,10 @@ public void addDebugOverlayText(Consumer lines) { } } + /** + * The {@link MachineDefinition} of this machine. + * @return The {@link MachineDefinition} + */ public MachineDefinition getDefinition() { if (getBlockState().getBlock() instanceof MetaMachineBlock machineBlock) { return machineBlock.getDefinition(); @@ -639,10 +636,6 @@ public MachineDefinition getDefinition() { } } - public RotationState getRotationState() { - return getDefinition().getRotationState(); - } - /** * Called to obtain list of AxisAlignedBB used for collision testing, highlight rendering * and ray tracing this meta tile entity's block in world @@ -651,19 +644,28 @@ public void addCollisionBoundingBox(List collisionList) { collisionList.add(Shapes.block()); } - public static Direction getFrontFacing(@Nullable MetaMachine machine) { - return machine == null ? Direction.NORTH : machine.getFrontFacing(); - } - + /** + * Gets the direction which this machine is facing. + * @return The direction the machine is facing, or north if this machine does not have a front face. + */ public Direction getFrontFacing() { return getRotationState() == RotationState.NONE ? Direction.NORTH : getBlockState().getValue(getRotationState().property); } + /** + * Returns whether this machine has a front face. + * @return If this machine has a front face. + */ public final boolean hasFrontFacing() { return getRotationState() != RotationState.NONE; } + /** + * Returns whether this machine can be rotated to face a specific direction + * @param facing The direction to test + * @return If it is possible to rotate this machine to face the given direction. + */ public boolean isFacingValid(Direction facing) { if (hasFrontFacing() && facing == getFrontFacing()) return false; @@ -676,8 +678,21 @@ public boolean isFacingValid(Direction facing) { return getRotationState().test(facing); } + /** + * Returns the {@link RotationState} properties which this machine type supports. + * @return The {@link RotationState} + */ + public RotationState getRotationState() { + return getDefinition().getRotationState(); + } + + /** + * Rotates this machine to face a specific direction, if that direction is a valid facing direction. + * @param facing The new facing direction. + */ public void setFrontFacing(Direction facing) { var oldFacing = getFrontFacing(); + if (oldFacing == facing) return; if (allowExtendedFacing()) { var newUpwardsFacing = RelativeDirection.simulateAxisRotation(facing, oldFacing, getUpwardsFacing()); @@ -694,16 +709,19 @@ public void setFrontFacing(Direction facing) { } } - @Override - public ModelData getModelData() { - return super.getModelData().derive().build(); - } - + /** + * Gets the direction which is this machine's upwards face. + * @return The upwards facing direction, or north if this machine does not allow extended facing. + */ public Direction getUpwardsFacing() { return this.allowExtendedFacing() ? this.getBlockState().getValue(GTBlockStateProperties.UPWARDS_FACING) : Direction.NORTH; } + /** + * Changes this machine's upwards facing direction, if this machine supports extended facing directions. + * @param upwardsFacing The new upwards facing direction. + */ public void setUpwardsFacing(Direction upwardsFacing) { if (!getDefinition().isAllowExtendedFacing()) { return; @@ -723,6 +741,14 @@ public void setUpwardsFacing(Direction upwardsFacing) { } } + /** + * Returns whether this machine supports extended facing directions. + * @return If extended facing directions are supported. + */ + public boolean allowExtendedFacing() { + return getDefinition().isAllowExtendedFacing(); + } + /** * Called when this machine is rotated * @param oldFacing The previous facing direction @@ -730,10 +756,6 @@ public void setUpwardsFacing(Direction upwardsFacing) { */ public void onRotated(Direction oldFacing, Direction newFacing) {} - public boolean allowExtendedFacing() { - return getDefinition().isAllowExtendedFacing(); - } - public int tintColor(int index) { // index < -100 => emission if shimmer is installed. if (index == 1 || index == -111) { @@ -742,15 +764,34 @@ public int tintColor(int index) { return -1; } + @Override + public ModelData getModelData() { + return super.getModelData().derive().build(); + } + /** - * Called when a neighboring block is updated + * Called when a neighboring block is updated. + * @param neighborBlock The neighbor block type. + * @param neighborPos The neighbor position. + * @param isMoving If the neighbor block is moving (e.g. moved by a piston) */ - public void onNeighborChanged(Block block, BlockPos fromPos, boolean isMoving) { - getAllTraits().forEach(t -> t.onMachineNeighborChanged(block, fromPos, isMoving)); + public void onNeighborChanged(Block neighborBlock, BlockPos neighborPos, boolean isMoving) { + getAllTraits().forEach(t -> t.onMachineNeighborChanged(neighborBlock, neighborPos, isMoving)); } public void animateTick(RandomSource random) {} + /** + * Returns the {@link BlockState} that this block reports at a given side. + * + * @param level The level this block is in + * @param pos The block's position in the level + * @param side The side of the block that is being queried + * @param sourceState The state of the block that is querying the appearance, or {@code null} if not applicable + * @param sourcePos The position of the block that is querying the appearance, or {@code null} if not applicable + * @return The appearance of this block from the given side + * @see IForgeBlock#getAppearance(BlockState, BlockAndTintGetter, BlockPos, Direction, BlockState, BlockPos) + */ public BlockState getBlockAppearance(BlockState state, BlockAndTintGetter level, BlockPos pos, Direction side, @Nullable BlockState sourceState, @Nullable BlockPos sourcePos) { var appearance = getCoverContainer().getBlockAppearance(state, level, pos, side, sourceState, sourcePos); @@ -762,6 +803,11 @@ public BlockState getBlockAppearance(BlockState state, BlockAndTintGetter level, return getDefinition().getAppearance().get(); } + /** + * Gets the current tick offset, which can be used to run code after a certain number of ticks. + * For example, {@code getOffsetTimer() % 20 == 0} will be true every 20 ticks (1 second) + * @return The current tick offset. + */ public final long getOffsetTimer() { if (getLevel() == null) return getOffset(); else if (getLevel().isClientSide()) return GTValues.CLIENT_TIME + getOffset(); @@ -873,6 +919,12 @@ public AABB getRenderBoundingBox() { // ******** Capabilities *********// ////////////////////////////////////// + /** + * Gets the item filter for a specific side of this machine. + * @param side Side + * @param io The IO mode this filter should be applicable to. + * @return A {@code Predicate} representing this filter + */ public Predicate getItemCapFilter(@Nullable Direction side, IO io) { if (side != null) { var cover = getCoverContainer().getCoverAtSide(side); @@ -891,6 +943,12 @@ public Predicate getItemCapFilter(@Nullable Direction side, IO io) { return item -> true; } + /** + * Gets the fluid filter for a specific side of this machine. + * @param side Side + * @param io The IO mode this filter should be applicable to. + * @return A {@code Predicate} representing this filter + */ public Predicate getFluidCapFilter(@Nullable Direction side, IO io) { if (side != null) { var cover = getCoverContainer().getCoverAtSide(side); @@ -909,6 +967,12 @@ public Predicate getFluidCapFilter(@Nullable Direction side, IO io) return fluid -> true; } + /** + * Gets the item handler capability for a specific side of this machine + * @param side The side + * @param useCoverCapability Whether to return an item handler provided by an attached cover, if present. + * @return The {@link IItemHandlerModifiable} capability, or null. + */ @Nullable public IItemHandlerModifiable getItemHandlerCap(@Nullable Direction side, boolean useCoverCapability) { var list = getAllTraits().stream() @@ -934,6 +998,12 @@ public IItemHandlerModifiable getItemHandlerCap(@Nullable Direction side, boolea return cover != null ? cover.getItemHandlerCap(handlerList) : handlerList; } + /** + * Gets the fluid handler capability for a specific side of this machine + * @param side The side + * @param useCoverCapability Whether to return a fluid handler provided by an attached cover, if present. + * @return The {@link IFluidHandlerModifiable} capability, or null. + */ @Nullable public IFluidHandlerModifiable getFluidHandlerCap(@Nullable Direction side, boolean useCoverCapability) { var list = getAllTraits().stream() diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTrait.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTrait.java index 10933332fbd..38365425c3d 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTrait.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTrait.java @@ -132,5 +132,5 @@ public void onMachineDestroyed() {} /** * Called when a neighboring block is updated */ - public void onMachineNeighborChanged(Block block, BlockPos fromPos, boolean isMoving) {} + public void onMachineNeighborChanged(Block neighborBlock, BlockPos neighborPos, boolean isMoving) {} } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/steam/SteamSolarBoiler.java b/src/main/java/com/gregtechceu/gtceu/common/machine/steam/SteamSolarBoiler.java index ccd6bb5309e..f721b926bc6 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/steam/SteamSolarBoiler.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/steam/SteamSolarBoiler.java @@ -15,8 +15,6 @@ import net.minecraft.util.RandomSource; import net.minecraft.world.entity.player.Player; -import org.jetbrains.annotations.NotNull; - import java.util.Objects; import javax.annotation.ParametersAreNonnullByDefault; @@ -30,7 +28,7 @@ public SteamSolarBoiler(BlockEntityCreationInfo info, boolean isHighPressure) { } @Override - public @NotNull Direction getFrontFacing() { + public Direction getFrontFacing() { return Direction.UP; } 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 448ccdd1a74..ce407fcb930 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 @@ -36,8 +36,6 @@ @MethodsReturnNonnullByDefault public class CrateMachine extends MetaMachine implements IUIMachine, IDropSaveMachine { - public static final BooleanProperty TAPED_PROPERTY = GTMachineModelProperties.IS_TAPED; - @Getter private final Material material; @Getter @@ -102,19 +100,6 @@ public InteractionResult onUseWithItem(ExtendedUseOnContext context) { return super.onUseWithItem(context); } - @Override - public void onMachinePlaced(@Nullable LivingEntity player, ItemStack stack) { - super.onMachinePlaced(player, stack); - CompoundTag tag = stack.getTag(); - if (tag != null) { - if (tag.contains("taped") && tag.getBoolean("taped")) { - this.inventory.storage.deserializeNBT(tag.getCompound("inventory")); - } - setRenderState(getRenderState().setValue(GTMachineModelProperties.IS_TAPED, isTaped)); - syncDataHolder.markClientSyncFieldDirty("isTaped"); - } - } - @Override public void saveToItem(CompoundTag tag) { if (isTaped) tag.put("inventory", inventory.storage.serializeNBT()); @@ -122,7 +107,9 @@ public void saveToItem(CompoundTag tag) { @Override public void loadFromItem(CompoundTag tag) { - inventory.storage.deserializeNBT(tag.getCompound("inventory")); + if (tag.contains("inventory")) { + this.inventory.storage.deserializeNBT(tag.getCompound("inventory")); + } } @Override From e4f4c13d19d3b8a57b8a032e904dfbd6bee51a84 Mon Sep 17 00:00:00 2001 From: Gustavo Date: Tue, 14 Apr 2026 22:51:13 +1000 Subject: [PATCH 06/21] spotless --- .../gtceu/api/block/MetaMachineBlock.java | 7 ++- .../api/machine/MachineCoverContainer.java | 15 +++-- .../gtceu/api/machine/MetaMachine.java | 60 ++++++++++++++----- .../api/machine/SimpleTieredMachine.java | 3 +- .../api/machine/TieredEnergyMachine.java | 3 - .../api/machine/WorkableTieredMachine.java | 1 - .../api/machine/trait/MachineTraitHolder.java | 11 +++- .../trait/feature/IRenderingTrait.java | 1 - .../part/FluidHatchPartMachine.java | 4 +- .../common/machine/storage/CrateMachine.java | 4 -- 10 files changed, 72 insertions(+), 37 deletions(-) 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 3610a23a37d..93c4037f202 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/block/MetaMachineBlock.java +++ b/src/main/java/com/gregtechceu/gtceu/api/block/MetaMachineBlock.java @@ -9,7 +9,6 @@ import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; import com.gregtechceu.gtceu.api.machine.feature.*; import com.gregtechceu.gtceu.api.sync_system.ManagedSyncBlockEntity; -import com.gregtechceu.gtceu.common.data.GTItems; import com.gregtechceu.gtceu.common.machine.owner.MachineOwner; import com.gregtechceu.gtceu.utils.ExtendedUseOnContext; import com.gregtechceu.gtceu.utils.GTUtil; @@ -286,7 +285,8 @@ public InteractionResult use(BlockState state, Level world, BlockPos pos, Player InteractionResult machineInteractResult = InteractionResult.PASS; - if (!itemStack.isEmpty()) machineInteractResult = machine.onUseWithItem(new ExtendedUseOnContext(player, hand, hit)); + if (!itemStack.isEmpty()) + machineInteractResult = machine.onUseWithItem(new ExtendedUseOnContext(player, hand, hit)); if (machineInteractResult != InteractionResult.PASS) return machineInteractResult; machineInteractResult = machine.onUse(new ExtendedUseOnContext(player, hand, hit)); if (machineInteractResult != InteractionResult.PASS) return machineInteractResult; @@ -336,7 +336,8 @@ public int getAnalogOutputSignal(BlockState state, Level level, BlockPos pos) { } @Override - public void neighborChanged(BlockState state, Level level, BlockPos pos, Block neighborBlock, BlockPos neighborPos, boolean movedByPiston) { + public void neighborChanged(BlockState state, Level level, BlockPos pos, Block neighborBlock, BlockPos neighborPos, + boolean movedByPiston) { var machine = MetaMachine.getMachine(level, pos); if (machine != null) { machine.onNeighborChanged(neighborBlock, neighborPos, movedByPiston); diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/MachineCoverContainer.java b/src/main/java/com/gregtechceu/gtceu/api/machine/MachineCoverContainer.java index e4f7b6eee0f..e0ad3dc7703 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/MachineCoverContainer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/MachineCoverContainer.java @@ -15,9 +15,10 @@ 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; - import com.gregtechceu.gtceu.utils.GTUtil; + import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; + import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.entity.player.Player; @@ -33,9 +34,11 @@ import java.util.ArrayList; import java.util.Set; -public class MachineCoverContainer extends MachineTrait implements IFrontFacingTrait, IRenderingTrait, ICoverable, ISyncManaged { +public class MachineCoverContainer extends MachineTrait + implements IFrontFacingTrait, IRenderingTrait, ICoverable, ISyncManaged { - public static final MachineTraitType TYPE = new MachineTraitType<>(MachineCoverContainer.class); + public static final MachineTraitType TYPE = new MachineTraitType<>( + MachineCoverContainer.class); @Getter private final SyncDataHolder syncDataHolder = new SyncDataHolder(this); @@ -78,7 +81,8 @@ public void onMachineDestroyed() { } @Override - public boolean shouldRenderGridOverlay(Player player, BlockPos pos, BlockState state, ItemStack held, Set toolTypes) { + public boolean shouldRenderGridOverlay(Player player, BlockPos pos, BlockState state, ItemStack held, + Set toolTypes) { for (CoverBehavior cover : getCovers()) { if (cover.shouldRenderGrid(player, pos, state, held, toolTypes)) return true; } @@ -86,7 +90,8 @@ public boolean shouldRenderGridOverlay(Player player, BlockPos pos, BlockState s } @Override - public @Nullable ResourceTexture getGridOverlayIcon(Player player, BlockPos pos, BlockState state, Set toolTypes, Direction side) { + public @Nullable ResourceTexture getGridOverlayIcon(Player player, BlockPos pos, BlockState state, + Set toolTypes, Direction side) { var cover = getCoverAtSide(side); if (cover != null) { return cover.sideTips(player, pos, state, toolTypes, side); 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 83dbe9aaa11..31778daae1c 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java @@ -65,7 +65,6 @@ import net.minecraft.util.RandomSource; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; -import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.BlockAndTintGetter; @@ -201,6 +200,7 @@ public void onMachineDestroyed() { /** * Called to modify the drops returned when this block is destroyed + * * @param drops A modifiable list of drops. */ public void modifyDrops(List drops) {} @@ -285,6 +285,7 @@ private void executeTick() { /** * Attaches a trait to this machine, with the default trait callback priority of 1. + * * @param trait The trait to attach * @return The attached trait */ @@ -294,8 +295,10 @@ public T attachTrait(T trait) { /** * Attaches a trait to this machine. - * @param trait The trait to attach - * @param callbackPriority The trait's callback priority. Traits with a higher priority will have their events fired first, which may prevent traits with a lower priority from handling some events. + * + * @param trait The trait to attach + * @param callbackPriority The trait's callback priority. Traits with a higher priority will have their events fired + * first, which may prevent traits with a lower priority from handling some events. * @return The attached trait */ public T attachTrait(T trait, int callbackPriority) { @@ -317,6 +320,7 @@ public void attachPersistentTrait(String traitName, MachineTrait trait) { /** * Gets a trait registered by {@code registerPersistentTrait} + * * @param traitName the unique identifier for the trait * @return the trait, or null if not present */ @@ -326,6 +330,7 @@ public void attachPersistentTrait(String traitName, MachineTrait trait) { /** * Gets the first trait (trait with highest priority) of a specified type + * * @param type The trait type to get * @return The trait, or null if no traits of the given type are present. */ @@ -335,6 +340,7 @@ public void attachPersistentTrait(String traitName, MachineTrait trait) { /** * Gets the first trait (trait with highest priority) of a specified type + * * @param type The trait type to get * @return An optional result containing the trait if present. */ @@ -344,6 +350,7 @@ public Optional getTraitOptional(MachineTraitType /** * Get all traits with the specified type. + * * @return An unmodifiable list containing all traits of the specified type. */ public @Unmodifiable List getTraits(MachineTraitType type) { @@ -356,9 +363,12 @@ public Optional getTraitOptional(MachineTraitType /** * Called when a player clicks this machine with a GT tool + * * @param context The context of this interaction. - * @return A pair containing the type of the tool (if the interaction was successful), and the result of the interaction. - * A result of CONSUME will play the tool sound (based on the first element of the pair) and consume durability. + * @return A pair containing the type of the tool (if the interaction was successful), and the result of the + * interaction. + * A result of CONSUME will play the tool sound (based on the first element of the pair) and consume + * durability. */ public final Pair<@Nullable GTToolType, InteractionResult> onToolClick(ExtendedUseOnContext context) { // the side hit from the machine grid @@ -457,6 +467,7 @@ protected InteractionResult onScrewdriverClick(ExtendedUseOnContext context) { /** * Called when a machine is right clicked with an item. + * * @param context The context which this interaction is being performed from. * @return The result of this interaction callback. */ @@ -479,7 +490,9 @@ public InteractionResult onUseWithItem(ExtendedUseOnContext context) { } /** - * Called when a machine is right clicked without an item, or if this machine was clicked with an item but no item-specific interaction was performed. + * Called when a machine is right clicked without an item, or if this machine was clicked with an item but no + * item-specific interaction was performed. + * * @param context The context which this interaction is being performed from. * @return The result of this interaction callback. */ @@ -610,6 +623,7 @@ public boolean shouldRenderGrid(Player player, BlockPos pos, BlockState state, I /** * Adds extra information to the F3 debug overlay when looking at this machine. + * * @param lines A string consumer which lines are added to. */ public void addDebugOverlayText(Consumer lines) { @@ -625,6 +639,7 @@ public void addDebugOverlayText(Consumer lines) { /** * The {@link MachineDefinition} of this machine. + * * @return The {@link MachineDefinition} */ public MachineDefinition getDefinition() { @@ -646,6 +661,7 @@ public void addCollisionBoundingBox(List collisionList) { /** * Gets the direction which this machine is facing. + * * @return The direction the machine is facing, or north if this machine does not have a front face. */ public Direction getFrontFacing() { @@ -655,6 +671,7 @@ public Direction getFrontFacing() { /** * Returns whether this machine has a front face. + * * @return If this machine has a front face. */ public final boolean hasFrontFacing() { @@ -663,6 +680,7 @@ public final boolean hasFrontFacing() { /** * Returns whether this machine can be rotated to face a specific direction + * * @param facing The direction to test * @return If it is possible to rotate this machine to face the given direction. */ @@ -680,6 +698,7 @@ public boolean isFacingValid(Direction facing) { /** * Returns the {@link RotationState} properties which this machine type supports. + * * @return The {@link RotationState} */ public RotationState getRotationState() { @@ -688,6 +707,7 @@ public RotationState getRotationState() { /** * Rotates this machine to face a specific direction, if that direction is a valid facing direction. + * * @param facing The new facing direction. */ public void setFrontFacing(Direction facing) { @@ -711,6 +731,7 @@ public void setFrontFacing(Direction facing) { /** * Gets the direction which is this machine's upwards face. + * * @return The upwards facing direction, or north if this machine does not allow extended facing. */ public Direction getUpwardsFacing() { @@ -720,6 +741,7 @@ public Direction getUpwardsFacing() { /** * Changes this machine's upwards facing direction, if this machine supports extended facing directions. + * * @param upwardsFacing The new upwards facing direction. */ public void setUpwardsFacing(Direction upwardsFacing) { @@ -743,6 +765,7 @@ public void setUpwardsFacing(Direction upwardsFacing) { /** * Returns whether this machine supports extended facing directions. + * * @return If extended facing directions are supported. */ public boolean allowExtendedFacing() { @@ -751,6 +774,7 @@ public boolean allowExtendedFacing() { /** * Called when this machine is rotated + * * @param oldFacing The previous facing direction * @param newFacing The new facing direction */ @@ -771,9 +795,10 @@ public ModelData getModelData() { /** * Called when a neighboring block is updated. + * * @param neighborBlock The neighbor block type. - * @param neighborPos The neighbor position. - * @param isMoving If the neighbor block is moving (e.g. moved by a piston) + * @param neighborPos The neighbor position. + * @param isMoving If the neighbor block is moving (e.g. moved by a piston) */ public void onNeighborChanged(Block neighborBlock, BlockPos neighborPos, boolean isMoving) { getAllTraits().forEach(t -> t.onMachineNeighborChanged(neighborBlock, neighborPos, isMoving)); @@ -784,9 +809,9 @@ public void animateTick(RandomSource random) {} /** * Returns the {@link BlockState} that this block reports at a given side. * - * @param level The level this block is in - * @param pos The block's position in the level - * @param side The side of the block that is being queried + * @param level The level this block is in + * @param pos The block's position in the level + * @param side The side of the block that is being queried * @param sourceState The state of the block that is querying the appearance, or {@code null} if not applicable * @param sourcePos The position of the block that is querying the appearance, or {@code null} if not applicable * @return The appearance of this block from the given side @@ -806,6 +831,7 @@ public BlockState getBlockAppearance(BlockState state, BlockAndTintGetter level, /** * Gets the current tick offset, which can be used to run code after a certain number of ticks. * For example, {@code getOffsetTimer() % 20 == 0} will be true every 20 ticks (1 second) + * * @return The current tick offset. */ public final long getOffsetTimer() { @@ -921,8 +947,9 @@ public AABB getRenderBoundingBox() { /** * Gets the item filter for a specific side of this machine. + * * @param side Side - * @param io The IO mode this filter should be applicable to. + * @param io The IO mode this filter should be applicable to. * @return A {@code Predicate} representing this filter */ public Predicate getItemCapFilter(@Nullable Direction side, IO io) { @@ -945,8 +972,9 @@ public Predicate getItemCapFilter(@Nullable Direction side, IO io) { /** * Gets the fluid filter for a specific side of this machine. + * * @param side Side - * @param io The IO mode this filter should be applicable to. + * @param io The IO mode this filter should be applicable to. * @return A {@code Predicate} representing this filter */ public Predicate getFluidCapFilter(@Nullable Direction side, IO io) { @@ -969,7 +997,8 @@ public Predicate getFluidCapFilter(@Nullable Direction side, IO io) /** * Gets the item handler capability for a specific side of this machine - * @param side The side + * + * @param side The side * @param useCoverCapability Whether to return an item handler provided by an attached cover, if present. * @return The {@link IItemHandlerModifiable} capability, or null. */ @@ -1000,7 +1029,8 @@ public IItemHandlerModifiable getItemHandlerCap(@Nullable Direction side, boolea /** * Gets the fluid handler capability for a specific side of this machine - * @param side The side + * + * @param side The side * @param useCoverCapability Whether to return a fluid handler provided by an attached cover, if present. * @return The {@link IFluidHandlerModifiable} capability, or null. */ 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 4702d7507f1..077803826a6 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleTieredMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleTieredMachine.java @@ -82,7 +82,8 @@ public int getSlotLimit(int slot) { (ConfigHolder.INSTANCE.compat.energy.nativeEUToFE && GTCapabilityHelper.getForgeEnergyItem(item) != null)); - this.circuitInventory = attachTrait(new NotifiableItemStackHandler(1, IO.IN, IO.NONE).shouldDropInventoryInWorld(!ConfigHolder.INSTANCE.machines.ghostCircuit) + this.circuitInventory = attachTrait(new NotifiableItemStackHandler(1, IO.IN, IO.NONE) + .shouldDropInventoryInWorld(!ConfigHolder.INSTANCE.machines.ghostCircuit) .setFilter(IntCircuitBehaviour::isIntegratedCircuit)); } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/TieredEnergyMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/TieredEnergyMachine.java index c34ffb5b386..cfc33fa33a4 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/TieredEnergyMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/TieredEnergyMachine.java @@ -14,15 +14,12 @@ import com.lowdragmc.lowdraglib.gui.texture.ProgressTexture; import com.lowdragmc.lowdraglib.gui.widget.ProgressWidget; -import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.util.Mth; import lombok.Getter; import java.util.function.Function; -import javax.annotation.ParametersAreNonnullByDefault; - public class TieredEnergyMachine extends TieredMachine implements ITieredMachine { @SaveField 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 95df59261ad..63fffde8fa3 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/WorkableTieredMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/WorkableTieredMachine.java @@ -55,7 +55,6 @@ public abstract class WorkableTieredMachine extends TieredEnergyMachine implemen protected boolean isMuffled; protected boolean previouslyMuffled = true; - public WorkableTieredMachine(BlockEntityCreationInfo info, int tier, RecipeLogic recipeLogic, int importSlots, int exportSlots, diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTraitHolder.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTraitHolder.java index d840ec3f421..8447500dc54 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTraitHolder.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTraitHolder.java @@ -40,6 +40,7 @@ public MachineTraitHolder(MetaMachine machine) { /** * Attaches a trait to this machine, with the default trait callback priority of 1. + * * @param trait The trait to attach * @return The attached trait */ @@ -49,8 +50,10 @@ public T attachTrait(T trait) { /** * Attaches a trait to this machine. - * @param trait The trait to attach - * @param callbackPriority The trait's callback priority. Traits with a higher priority will have their events fired first, which may prevent traits with a lower priority from handling some events. + * + * @param trait The trait to attach + * @param callbackPriority The trait's callback priority. Traits with a higher priority will have their events fired + * first, which may prevent traits with a lower priority from handling some events. * @return The attached trait */ public T attachTrait(T trait, int callbackPriority) { @@ -88,6 +91,7 @@ public MachineTraitHolder registerPersistentTrait(String traitName, MachineTrait /** * Gets a trait registered by {@code registerPersistentTrait} + * * @param traitName the unique identifier for the trait * @return the trait, or null if not present */ @@ -99,6 +103,7 @@ public MachineTraitHolder registerPersistentTrait(String traitName, MachineTrait /** * Gets the first trait (trait with highest priority) of a specified type + * * @param type The trait type to get * @return The trait, or null if no traits of the given type are present. */ @@ -110,6 +115,7 @@ public MachineTraitHolder registerPersistentTrait(String traitName, MachineTrait /** * Gets the first trait (trait with highest priority) of a specified type + * * @param type The trait type to get * @return An optional result containing the trait if present. */ @@ -119,6 +125,7 @@ public Optional getTraitOptional(MachineTraitType /** * Get all traits with the specified type. + * * @return An unmodifiable list containing all traits of the specified type. */ @SuppressWarnings("unchecked") diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/IRenderingTrait.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/IRenderingTrait.java index 73087c1174f..7683fcb5000 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/IRenderingTrait.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/IRenderingTrait.java @@ -9,7 +9,6 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.state.BlockState; -import net.minecraftforge.client.model.data.ModelData; import org.jetbrains.annotations.Nullable; 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 12c0dc41c77..eeea2f47de8 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 @@ -79,7 +79,8 @@ public FluidHatchPartMachine(BlockEntityCreationInfo info, int tier, IO io, int if (io == IO.IN) { this.circuitSlotEnabled = true; this.circuitInventory = attachTrait(new NotifiableItemStackHandler(1, IO.IN, IO.NONE)) - .setFilter(IntCircuitBehaviour::isIntegratedCircuit).shouldSearchContent(false).shouldDropInventoryInWorld(!ConfigHolder.INSTANCE.machines.ghostCircuit); + .setFilter(IntCircuitBehaviour::isIntegratedCircuit).shouldSearchContent(false) + .shouldDropInventoryInWorld(!ConfigHolder.INSTANCE.machines.ghostCircuit); } else { this.circuitSlotEnabled = false; this.circuitInventory = attachTrait(new NotifiableItemStackHandler(0, IO.NONE)).shouldSearchContent(false); @@ -98,7 +99,6 @@ public static int getTankCapacity(int initialCapacity, int tier) { return initialCapacity * (1 << Math.min(9, tier)); } - @Override public void onLoad() { super.onLoad(); 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 ce407fcb930..fdbe1f565bd 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 @@ -22,13 +22,9 @@ import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.InteractionResult; -import net.minecraft.world.entity.LivingEntity; import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.level.block.state.properties.BooleanProperty; import lombok.Getter; -import org.jetbrains.annotations.Nullable; import javax.annotation.ParametersAreNonnullByDefault; From 0efa0987aa7ddf6f80d78af49dce9b08f0c8d17e Mon Sep 17 00:00:00 2001 From: Gustavo <77560533+gustovafing@users.noreply.github.com> Date: Tue, 14 Apr 2026 23:04:01 +1000 Subject: [PATCH 07/21] Update MetaMachine.java --- .../java/com/gregtechceu/gtceu/api/machine/MetaMachine.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 31778daae1c..52b5de24855 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java @@ -158,7 +158,8 @@ public void load(CompoundTag tag) { } /** - * Called when this machine ticks for the first time after loading. + * Called when this machine is loaded. The entire world is not loaded when this method is called. + * To schedule code to run on the first full world tick, do {@code serverLevel.getServer().tell(new TickTask(0, CALLBACK))} */ @MustBeInvokedByOverriders public void onLoad() { From 4276161f77803e8c4b85b76248665c1c77cf4788 Mon Sep 17 00:00:00 2001 From: Gustavo <77560533+gustovafing@users.noreply.github.com> Date: Tue, 14 Apr 2026 23:04:30 +1000 Subject: [PATCH 08/21] Update MachineTrait.java --- .../com/gregtechceu/gtceu/api/machine/trait/MachineTrait.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTrait.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTrait.java index 38365425c3d..b7e2cac8f27 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTrait.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTrait.java @@ -115,7 +115,8 @@ public void scheduleRenderUpdate() { } /** - * Called when the machine ticks for the first time after loading. + * Called when the machine is loaded. The entire world is not loaded when this method is called. + * To schedule code to run on the first full world tick, do {@code serverLevel.getServer().tell(new TickTask(0, CALLBACK))} */ public void onMachineLoad() {} From d9ce07242bfae4acef2f0a58724d0d7838c2087e Mon Sep 17 00:00:00 2001 From: Gustavo Date: Tue, 14 Apr 2026 23:39:14 +1000 Subject: [PATCH 09/21] spotless --- .../java/com/gregtechceu/gtceu/api/machine/MetaMachine.java | 3 ++- .../com/gregtechceu/gtceu/api/machine/trait/MachineTrait.java | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) 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 52b5de24855..3caca614eed 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java @@ -159,7 +159,8 @@ public void load(CompoundTag tag) { /** * Called when this machine is loaded. The entire world is not loaded when this method is called. - * To schedule code to run on the first full world tick, do {@code serverLevel.getServer().tell(new TickTask(0, CALLBACK))} + * To schedule code to run on the first full world tick, do + * {@code serverLevel.getServer().tell(new TickTask(0, CALLBACK))} */ @MustBeInvokedByOverriders public void onLoad() { diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTrait.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTrait.java index b7e2cac8f27..ac993272b53 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTrait.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTrait.java @@ -116,7 +116,8 @@ public void scheduleRenderUpdate() { /** * Called when the machine is loaded. The entire world is not loaded when this method is called. - * To schedule code to run on the first full world tick, do {@code serverLevel.getServer().tell(new TickTask(0, CALLBACK))} + * To schedule code to run on the first full world tick, do + * {@code serverLevel.getServer().tell(new TickTask(0, CALLBACK))} */ public void onMachineLoad() {} From f4649e3eba25dcdba57e292eac50a00a005daf14 Mon Sep 17 00:00:00 2001 From: Gustavo Date: Wed, 15 Apr 2026 00:18:37 +1000 Subject: [PATCH 10/21] oops --- .../com/gregtechceu/gtceu/api/machine/trait/MachineTrait.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTrait.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTrait.java index d4743f1bd75..2b300ad833b 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTrait.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTrait.java @@ -41,14 +41,11 @@ public abstract class MachineTrait implements ISyncManaged { @Getter @Setter private int traitPriority = 1; -<<<<<<< gus/trait-priority -======= public MachineTrait(MetaMachine machine) { this.capabilityValidator = side -> true; machine.getTraitHolder().attachTrait(this); } ->>>>>>> 1.20.1 public MachineTrait() {} From fd761691406bbd39cf5fbdcf45ca9fb9ec1eabd1 Mon Sep 17 00:00:00 2001 From: Gustavo Date: Wed, 15 Apr 2026 00:51:00 +1000 Subject: [PATCH 11/21] model data function --- .../gtceu/api/machine/MetaMachine.java | 24 +------------------ 1 file changed, 1 insertion(+), 23 deletions(-) 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 fb176993058..601ac8aa209 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java @@ -46,6 +46,7 @@ import com.gregtechceu.gtceu.common.machine.owner.PlayerOwner; import com.gregtechceu.gtceu.common.machine.trait.AutoOutputTrait; import com.gregtechceu.gtceu.utils.ExtendedUseOnContext; +import com.gregtechceu.gtceu.utils.GTUtil; import com.gregtechceu.gtceu.utils.data.TagCompatibilityFixer; import com.lowdragmc.lowdraglib.gui.texture.IGuiTexture; @@ -198,12 +199,9 @@ public void onUnload() { */ public void onMachineDestroyed() { getAllTraits().forEach(MachineTrait::onMachineDestroyed); -<<<<<<< gus/trait-priority -======= for (Direction direction : GTUtil.DIRECTIONS) { getCoverContainer().removeCover(direction, null); } ->>>>>>> 1.20.1 } /** @@ -737,28 +735,11 @@ public void setFrontFacing(Direction facing) { } } -<<<<<<< gus/trait-priority /** * Gets the direction which is this machine's upwards face. * * @return The upwards facing direction, or north if this machine does not allow extended facing. */ -======= - @MustBeInvokedByOverriders - public void updateModelData(ModelData.Builder builder) { - for (MachineTrait trait : getAllTraits()) { - if (trait instanceof IRenderingTrait renderingTrait) renderingTrait.updateModelData(builder); - } - } - - @Override - public ModelData getModelData() { - ModelData.Builder data = super.getModelData().derive(); - updateModelData(data); - return data.build(); - } - ->>>>>>> 1.20.1 public Direction getUpwardsFacing() { return this.allowExtendedFacing() ? this.getBlockState().getValue(GTBlockStateProperties.UPWARDS_FACING) : Direction.NORTH; @@ -853,15 +834,12 @@ public BlockState getBlockAppearance(BlockState state, BlockAndTintGetter level, return getDefinition().getAppearance().get(); } -<<<<<<< gus/trait-priority /** * Gets the current tick offset, which can be used to run code after a certain number of ticks. * For example, {@code getOffsetTimer() % 20 == 0} will be true every 20 ticks (1 second) * * @return The current tick offset. */ -======= ->>>>>>> 1.20.1 public final long getOffsetTimer() { if (getLevel() == null) return getOffset(); else if (getLevel().isClientSide()) return GTValues.CLIENT_TIME + getOffset(); From dbced402f86cb0e586ca07fa5215647ec3c1bd0b Mon Sep 17 00:00:00 2001 From: Gustavo Date: Wed, 15 Apr 2026 01:25:25 +1000 Subject: [PATCH 12/21] merge --- .../java/com/gregtechceu/gtceu/api/machine/MetaMachine.java | 5 ----- 1 file changed, 5 deletions(-) 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 59ff1a0d698..3caca614eed 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java @@ -790,7 +790,6 @@ public int tintColor(int index) { return -1; } -<<<<<<< gus/trait-priority @Override public ModelData getModelData() { return super.getModelData().derive().build(); @@ -805,10 +804,6 @@ public ModelData getModelData() { */ public void onNeighborChanged(Block neighborBlock, BlockPos neighborPos, boolean isMoving) { getAllTraits().forEach(t -> t.onMachineNeighborChanged(neighborBlock, neighborPos, isMoving)); -======= - public void onNeighborChanged(Block block, BlockPos fromPos, boolean isMoving) { - getAllTraits().forEach(t -> t.onMachineNeighborChanged(block, fromPos, isMoving)); ->>>>>>> 1.20.1 } public void animateTick(RandomSource random) {} From 45690e14117ebf85fd52e9d9013cbb6e18c8f679 Mon Sep 17 00:00:00 2001 From: Gustavo Date: Wed, 15 Apr 2026 12:39:14 +1000 Subject: [PATCH 13/21] javadoc --- .../gtceu/api/machine/MetaMachine.java | 25 ++++++++++++- .../api/machine/SimpleGeneratorMachine.java | 3 ++ .../api/machine/WorkableTieredMachine.java | 3 ++ .../MultiblockControllerMachine.java | 37 +++++++------------ .../api/machine/steam/SimpleSteamMachine.java | 3 ++ .../gtceu/api/machine/steam/SteamMachine.java | 8 ++-- .../machine/steam/SteamWorkableMachine.java | 3 ++ .../gtceu/api/machine/trait/MachineTrait.java | 2 - 8 files changed, 52 insertions(+), 32 deletions(-) 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 3caca614eed..417477c248e 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java @@ -854,6 +854,12 @@ public boolean isRemote() { // ***** Redstone Signals ****// //////////////////////////////// + /** + * Gets the redstone output signal at a specific side + * + * @param side Side + * @return Output signal + */ public int getOutputSignal(@Nullable Direction side) { if (side == null) return 0; @@ -864,17 +870,32 @@ public int getOutputSignal(@Nullable Direction side) { return cover.getRedstoneSignalOutput(); } + /** + * Gets the direct output signal at a specific side + * + * @param side Side + * @return Direct output signal + */ public int getOutputDirectSignal(@Nullable Direction side) { - // IDK what this does but MC wants it return 0; } + /** + * Gets the analog (comparator) output signal + * + * @return Analog output signal. + */ public int getAnalogOutputSignal() { return 0; } + /** + * Returns if redstone can be connected to a specific side of this machine + * + * @param side The side to check + * @return If redstone can be connected + */ public boolean canConnectRedstone(Direction side) { - // For some reason, Minecraft requests the output signal from the opposite side... CoverBehavior cover = getCoverContainer().getCoverAtSide(side); if (cover == null) return false; 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 9471d9b130b..a3ff7931ce7 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleGeneratorMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleGeneratorMachine.java @@ -33,6 +33,9 @@ import java.util.LinkedHashMap; import java.util.function.BiFunction; +/** + * All singleblock generators are implemented here. + */ public class SimpleGeneratorMachine extends WorkableTieredMachine implements IFancyUIMachine { 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 63fffde8fa3..f5b2553f098 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/WorkableTieredMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/WorkableTieredMachine.java @@ -20,6 +20,9 @@ import java.util.*; +/** + * A tiered energy machine with recipe logic and item/fluid IO. + */ public abstract class WorkableTieredMachine extends TieredEnergyMachine implements IRecipeLogicMachine, IMufflableMachine, IOverclockMachine { 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 dd31d974ca0..fc2945fb33e 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 @@ -42,7 +42,7 @@ @MethodsReturnNonnullByDefault public class MultiblockControllerMachine extends MetaMachine { - private MultiblockState multiblockState; + private @Nullable MultiblockState multiblockState; private final List parts = new ArrayList<>(); private @Nullable ParallelHatchPartMachine parallelHatch = null; @Getter @@ -50,10 +50,9 @@ public class MultiblockControllerMachine extends MetaMachine { private BlockPos[] partPositions = new BlockPos[0]; /** - * Whether Multiblock Formed. + * If the multiblock is formed. *
- * NOTE: even machine is formed, it doesn't mean to workable! - * Its parts maybe invalid due to chunk unload. + * NOTE: Formed multiblocks may not be completely valid in some cases, e.g. due to parts becoming invalid */ @Getter @SaveField @@ -90,13 +89,8 @@ public void onUnload() { } /** - * Called when structure is formed, have to be called after {@link #checkPattern()}. (server-side / fake scene only) - *
- * Trigger points: - *
- * 1 - Blocks in structure changed but still formed. - *
- * 2 - Literally, structure formed. + * Called when multiblock structure becomes valid/formed. Called when blocks in structure change to form a valid + * multiblock, or when the controller is loaded. */ public void onStructureFormed() { isFormed = true; @@ -130,13 +124,8 @@ public void onStructureFormed() { } /** - * Called when structure is invalid. (server-side / fake scene only) - *
- * Trigger points: - *
- * 1 - Blocks in structure changed. - *
- * 2 - Before controller machine removed. + * Called when multiblock structure becomes invalid. Called when blocks in structure change, or when controller + * machine is about to be unloaded. */ public void onStructureInvalid() { isFormed = false; @@ -159,7 +148,7 @@ public void onStructureInvalid() { } /** - * Called from part, when part is invalid due to chunk unload or broken. + * Called when a multiblock part becomes invalid due to chunk unloading or block destruction. */ public void onPartUnload() { parts.removeIf(part -> part.self().isRemoved()); @@ -180,7 +169,9 @@ public MultiblockMachineDefinition getDefinition() { } /** - * Get MultiblockState. It records all structure-related information. + * Gets {@link MultiblockState}, which holds all structure-related information. + * + * @return The {@link MultiblockState} */ public MultiblockState getMultiblockState() { if (multiblockState == null) { @@ -202,7 +193,7 @@ public Comparator getPartSorter() { } /** - * Get all parts + * @return A list of all multiblock parts */ public List getParts() { // for the client side, when the chunk unloaded @@ -218,7 +209,7 @@ public List getParts() { } /** - * The instance of {@link ParallelHatchPartMachine} attached to this Controller. + * The instance of {@link ParallelHatchPartMachine} attached to this controller. *

* Note that this will return a singular instance, and will not account for multiple attached IParallelHatches * @@ -375,7 +366,7 @@ public void asyncCheckPattern(long periodID) { } /** - * Check MultiBlock Pattern. Just checking pattern without any other logic. + * Check Multiblock Pattern. Just checking pattern without any other logic. * You can override it but it's unsafe for calling. because it will also be called in an async thread. *
* you should always use {@link MultiblockControllerMachine#checkPatternWithLock()} )} and 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 157f5d80b25..e28634e50e4 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 @@ -36,6 +36,9 @@ import java.util.*; +/** + * A singleblock steam machine with recipe logic and item IO. + */ public class SimpleSteamMachine extends SteamWorkableMachine implements IUIMachine { @SaveField diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SteamMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SteamMachine.java index 9db36b37152..5d7943b3bed 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SteamMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SteamMachine.java @@ -9,16 +9,14 @@ import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.common.data.GTMaterials; -import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.world.level.block.state.properties.BooleanProperty; import net.minecraftforge.fluids.FluidType; import lombok.Getter; -import javax.annotation.ParametersAreNonnullByDefault; - -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault +/** + * A singleblock machine with a steam tank. + */ public abstract class SteamMachine extends MetaMachine implements ITieredMachine { public static final BooleanProperty STEEL_PROPERTY = GTMachineModelProperties.IS_STEEL_MACHINE; 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 5c55b48e2e0..68a90d4de2b 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 @@ -33,6 +33,9 @@ import java.util.*; +/** + * A singleblock steam machine with recipe logic. + */ public abstract class SteamWorkableMachine extends SteamMachine implements IRecipeLogicMachine, IMufflableMachine { diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTrait.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTrait.java index 2b300ad833b..c872b994fca 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTrait.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTrait.java @@ -8,7 +8,6 @@ import com.gregtechceu.gtceu.common.machine.trait.AutoOutputTrait; import com.gregtechceu.gtceu.common.machine.trait.CleanroomProviderTrait; -import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.Level; @@ -29,7 +28,6 @@ * Machine traits can also attach additional behaviours to a machine (e.g. {@link AutoOutputTrait}, * {@link CleanroomProviderTrait}) */ -@MethodsReturnNonnullByDefault public abstract class MachineTrait implements ISyncManaged { @Getter From ae587d2161f134ace676632d0f8c307f9a2bc804 Mon Sep 17 00:00:00 2001 From: Gustavo Date: Wed, 15 Apr 2026 12:53:55 +1000 Subject: [PATCH 14/21] get rid of all references to MTEs and TEs --- .../resources/assets/gtceu/lang/en_ud.json | 1 - .../resources/assets/gtceu/lang/en_us.json | 1 - .../gtceu/api/block/MaterialBlock.java | 10 ++++---- .../gtceu/api/block/PipeBlock.java | 4 ++-- .../api/capability/compat/EUToFEProvider.java | 6 ++--- .../gtceu/api/cover/CoverBehavior.java | 5 ++-- .../gtceu/api/cover/CoverDefinition.java | 4 ++-- .../gtceu/api/item/PipeBlockItem.java | 6 ++--- .../api/machine/MachineCoverContainer.java | 2 +- .../gtceu/api/machine/MetaMachine.java | 2 +- .../api/machine/TieredEnergyMachine.java | 10 ++++---- .../trait/NotifiableLaserContainer.java | 4 ++-- .../gtceu/api/pattern/BlockPattern.java | 2 +- .../gtceu/api/pattern/MultiblockState.java | 18 +++++++------- .../gtceu/api/pattern/Predicates.java | 4 ++-- .../pattern/predicates/SimplePredicate.java | 6 ++--- .../api/pipenet/longdistance/ILDEndpoint.java | 4 ++-- .../MultiblockInWorldPreviewRenderer.java | 2 +- .../blockentity/ItemPipeBlockEntity.java | 2 +- .../behavior/PortableScannerBehavior.java | 24 +++++++++---------- .../tool/behavior/BlockRotatingBehavior.java | 6 ++--- .../multiblock/electric/CleanroomMachine.java | 2 +- .../part/OpticalDataHatchMachine.java | 8 +++---- .../gtceu/data/lang/LangHandler.java | 2 -- .../resources/assets/gtceu/lang/ja_jp.json | 1 - .../resources/assets/gtceu/lang/pt_br.json | 1 - .../resources/assets/gtceu/lang/ru_ru.json | 1 - .../resources/assets/gtceu/lang/uk_ua.json | 1 - .../resources/assets/gtceu/lang/zh_cn.json | 1 - .../resources/assets/gtceu/lang/zh_tw.json | 1 - 30 files changed, 66 insertions(+), 75 deletions(-) diff --git a/src/generated/resources/assets/gtceu/lang/en_ud.json b/src/generated/resources/assets/gtceu/lang/en_ud.json index 23ce21657c2..53efcdcd9bf 100644 --- a/src/generated/resources/assets/gtceu/lang/en_ud.json +++ b/src/generated/resources/assets/gtceu/lang/en_ud.json @@ -14,7 +14,6 @@ "behavior.portable_scanner.debug_lag_count": "˙ɹǝʌɹǝS ǝɥʇ uo )sɯ%s uɐɥʇ ɹǝbuoן buıʞɐʇ buıɥʇʎuɐ( sbuıuɹɐM ǝʞıdS bɐꞀ %s pǝsnɐƆ", "behavior.portable_scanner.debug_machine": "%s :ᗡI-ɐʇǝW", "behavior.portable_scanner.debug_machine_invalid": "¡pıןɐʌuı ", - "behavior.portable_scanner.debug_machine_invalid_null=invalid! MetaTileEntity =": "¡ןןnu ", "behavior.portable_scanner.debug_machine_valid": "pıןɐʌ ", "behavior.portable_scanner.divider": "=========================", "behavior.portable_scanner.energy_container_in": "Ɐ %s ʇɐ ∩Ǝ )%s( %s :NI xɐW", diff --git a/src/generated/resources/assets/gtceu/lang/en_us.json b/src/generated/resources/assets/gtceu/lang/en_us.json index 6eca15057a9..c9d6d18f758 100644 --- a/src/generated/resources/assets/gtceu/lang/en_us.json +++ b/src/generated/resources/assets/gtceu/lang/en_us.json @@ -14,7 +14,6 @@ "behavior.portable_scanner.debug_lag_count": "Caused %s Lag Spike Warnings (anything taking longer than %sms) on the Server.", "behavior.portable_scanner.debug_machine": "Meta-ID: %s", "behavior.portable_scanner.debug_machine_invalid": " invalid!", - "behavior.portable_scanner.debug_machine_invalid_null=invalid! MetaTileEntity =": " null!", "behavior.portable_scanner.debug_machine_valid": " valid", "behavior.portable_scanner.divider": "=========================", "behavior.portable_scanner.energy_container_in": "Max IN: %s (%s) EU at %s A", diff --git a/src/main/java/com/gregtechceu/gtceu/api/block/MaterialBlock.java b/src/main/java/com/gregtechceu/gtceu/api/block/MaterialBlock.java index aa4626ea197..13f344e019b 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/block/MaterialBlock.java +++ b/src/main/java/com/gregtechceu/gtceu/api/block/MaterialBlock.java @@ -187,8 +187,8 @@ public InteractionResult use(BlockState state, Level level, BlockPos pos, Player blockPos.move(Direction.UP); continue; } - BlockEntity te = level.getBlockEntity(blockPos); - if (te instanceof PipeBlockEntity pbe && !pbe.getFrameMaterial().isNull()) { + BlockEntity be = level.getBlockEntity(blockPos); + if (be instanceof PipeBlockEntity pbe && !pbe.getFrameMaterial().isNull()) { blockPos.move(Direction.UP); continue; } @@ -197,7 +197,7 @@ public InteractionResult use(BlockState state, Level level, BlockPos pos, Player if (!player.isCreative()) stack.shrink(1); return InteractionResult.SUCCESS; - } else if (te instanceof PipeBlockEntity pbe && pbe.getFrameMaterial().isNull()) { + } else if (be instanceof PipeBlockEntity pbe && pbe.getFrameMaterial().isNull()) { pbe.setFrameMaterial(frameBlock.material); if (!player.isCreative()) @@ -223,8 +223,8 @@ public static MaterialBlock getFrameboxFromItem(ItemStack stack) { } public boolean removeFrame(Level level, BlockPos pos, Player player, ItemStack stack) { - BlockEntity te = level.getBlockEntity(pos); - if (te instanceof PipeBlockEntity pipeTile) { + BlockEntity be = level.getBlockEntity(pos); + if (be instanceof PipeBlockEntity pipeTile) { Material mat = pipeTile.getFrameMaterial(); if (!mat.isNull()) { pipeTile.setFrameMaterial(GTMaterials.NULL); diff --git a/src/main/java/com/gregtechceu/gtceu/api/block/PipeBlock.java b/src/main/java/com/gregtechceu/gtceu/api/block/PipeBlock.java index 0c81186ff92..d71b2bebf34 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/block/PipeBlock.java +++ b/src/main/java/com/gregtechceu/gtceu/api/block/PipeBlock.java @@ -471,9 +471,9 @@ public BlockState getAppearance(BlockState state, BlockAndTintGetter level, Bloc @Override public List getDrops(BlockState state, LootParams.Builder builder) { var context = builder.withParameter(LootContextParams.BLOCK_STATE, state).create(LootContextParamSets.BLOCK); - BlockEntity tileEntity = context.getParamOrNull(LootContextParams.BLOCK_ENTITY); + BlockEntity blockEntity = context.getParamOrNull(LootContextParams.BLOCK_ENTITY); List drops = new ArrayList<>(super.getDrops(state, builder)); - if (tileEntity instanceof IPipeNode pipeTile) { + if (blockEntity instanceof IPipeNode pipeTile) { if (!pipeTile.getFrameMaterial().isNull()) { drops.addAll(GTMaterialBlocks.MATERIAL_BLOCKS.get(TagPrefix.frameGt, pipeTile.getFrameMaterial()) .getDefaultState().getDrops(builder)); diff --git a/src/main/java/com/gregtechceu/gtceu/api/capability/compat/EUToFEProvider.java b/src/main/java/com/gregtechceu/gtceu/api/capability/compat/EUToFEProvider.java index b3b025c8f1a..43c4506fba4 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/capability/compat/EUToFEProvider.java +++ b/src/main/java/com/gregtechceu/gtceu/api/capability/compat/EUToFEProvider.java @@ -25,8 +25,8 @@ public class EUToFEProvider extends CapabilityCompatProvider { */ private long feBuffer; - public EUToFEProvider(BlockEntity tileEntity) { - super(tileEntity); + public EUToFEProvider(BlockEntity blockEntity) { + super(blockEntity); } @Override @@ -156,7 +156,7 @@ public long getEnergyStored() { * IEnergyStorage should handle it. * This simulates that behavior in most places by allowing our "is there space" checks to pass and letting the * cable attempt to insert energy. - * If the wrapped TE actually cannot accept any more energy, the energy transfer will return 0 before any + * If the wrapped BE actually cannot accept any more energy, the energy transfer will return 0 before any * changes to our internal rf buffer. */ @Override diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/CoverBehavior.java b/src/main/java/com/gregtechceu/gtceu/api/cover/CoverBehavior.java index 276b38b7575..24ce428669d 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/CoverBehavior.java +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/CoverBehavior.java @@ -44,8 +44,7 @@ import javax.annotation.ParametersAreNonnullByDefault; /** - * Represents cover instance attached on the specific side of meta tile entity - * Cover filters out interaction and logic of meta tile entity + * Represents a cover instance attached on a specific side of a machine */ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault @@ -100,7 +99,7 @@ public boolean canAttach() { } /** - * Will be called on server side after the cover attachment to the meta tile entity + * Will be called on server side after the cover attachment to the machine * Cover can change it's internal state here and return initial data as nbt. * * @param itemStack the item cover was attached from diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/CoverDefinition.java b/src/main/java/com/gregtechceu/gtceu/api/cover/CoverDefinition.java index 5a11aac76b3..4e7a847ddd2 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/CoverDefinition.java +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/CoverDefinition.java @@ -41,8 +41,8 @@ public CoverDefinition(ResourceLocation id, CoverBehaviourProvider behaviorCreat } } - public CoverBehavior createCoverBehavior(ICoverable metaTileEntity, Direction side) { - return behaviorCreator.create(this, metaTileEntity, side); + public CoverBehavior createCoverBehavior(ICoverable coverable, Direction side) { + return behaviorCreator.create(this, coverable, side); } private static class ClientHelper { diff --git a/src/main/java/com/gregtechceu/gtceu/api/item/PipeBlockItem.java b/src/main/java/com/gregtechceu/gtceu/api/item/PipeBlockItem.java index ebf99a4590a..1679a40cc2d 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/item/PipeBlockItem.java +++ b/src/main/java/com/gregtechceu/gtceu/api/item/PipeBlockItem.java @@ -78,8 +78,8 @@ public boolean placeBlock(BlockPlaceContext context, BlockState state) { selfTile.setConnection(side.getOpposite(), true, false); } for (Direction facing : GTUtil.DIRECTIONS) { - BlockEntity te = selfTile.getNeighbor(facing); - if (te instanceof IPipeNode otherPipe) { + BlockEntity be = selfTile.getNeighbor(facing); + if (be instanceof IPipeNode otherPipe) { if (otherPipe.isConnected(facing.getOpposite())) { if (otherPipe.getPipeBlock().canPipesConnect(otherPipe, facing.getOpposite(), selfTile)) { selfTile.setConnection(facing, true, true); @@ -88,7 +88,7 @@ public boolean placeBlock(BlockPlaceContext context, BlockState state) { } } } else if (!ConfigHolder.INSTANCE.machines.gt6StylePipesCables && - selfTile.getPipeBlock().canPipeConnectToBlock(selfTile, facing, te)) { + selfTile.getPipeBlock().canPipeConnectToBlock(selfTile, facing, be)) { selfTile.setConnection(facing, true, false); } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/MachineCoverContainer.java b/src/main/java/com/gregtechceu/gtceu/api/machine/MachineCoverContainer.java index e0ad3dc7703..270aad6f1fb 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/MachineCoverContainer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/MachineCoverContainer.java @@ -121,7 +121,7 @@ public boolean canPlaceCoverOnSide(CoverDefinition definition, Direction side) { machine.addCollisionBoundingBox(collisionList); // noinspection RedundantIfStatement if (ICoverable.doesCoverCollide(side, collisionList, getCoverPlateThickness())) { - // cover collision box overlaps with meta tile entity collision box + // cover collision box overlaps with machine collision box return false; } 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 417477c248e..8d5be497967 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java @@ -655,7 +655,7 @@ public MachineDefinition getDefinition() { /** * Called to obtain list of AxisAlignedBB used for collision testing, highlight rendering - * and ray tracing this meta tile entity's block in world + * and ray tracing this machine's block in world */ public void addCollisionBoundingBox(List collisionList) { collisionList.add(Shapes.block()); diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/TieredEnergyMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/TieredEnergyMachine.java index cfc33fa33a4..c6236776f7c 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/TieredEnergyMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/TieredEnergyMachine.java @@ -4,7 +4,6 @@ import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.gui.GuiTextures; import com.gregtechceu.gtceu.api.gui.editor.EditableUI; -import com.gregtechceu.gtceu.api.machine.feature.ITieredMachine; import com.gregtechceu.gtceu.api.machine.trait.NotifiableEnergyContainer; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; @@ -20,7 +19,10 @@ import java.util.function.Function; -public class TieredEnergyMachine extends TieredMachine implements ITieredMachine { +/** + * A singleblock tiered machine with an energy container. + */ +public class TieredEnergyMachine extends TieredMachine { @SaveField @SyncToClient @@ -72,7 +74,7 @@ public int getAnalogOutputSignal() { } /** - * Determines max input or output amperage used by this meta tile entity + * Determines max input or output amperage used by this machine * if emitter, it determines size of energy packets it will emit at once * if receiver, it determines max input energy per request * @@ -83,7 +85,7 @@ protected long getMaxInputOutputAmperage() { } /** - * Determines if this meta tile entity is in energy receiver or emitter mode + * Determines if this machine is in energy receiver or emitter mode * * @return true if machine emits energy to network, false it it accepts energy from network */ diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableLaserContainer.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableLaserContainer.java index 34d456bc761..0e3d5c0299a 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableLaserContainer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableLaserContainer.java @@ -50,11 +50,11 @@ public void serverTick() { long amperesUsed = 0; for (Direction side : GTUtil.DIRECTIONS) { if (!outputsEnergy(side)) continue; - BlockEntity tileEntity = getMachine().getLevel().getBlockEntity(getMachine().getBlockPos().relative(side)); + BlockEntity be = getMachine().getLevel().getBlockEntity(getMachine().getBlockPos().relative(side)); Direction oppositeSide = side.getOpposite(); ILaserContainer laserContainer = GTCapabilityHelper.getLaser(getMachine().getLevel(), getMachine().getBlockPos().relative(side), oppositeSide); - if (tileEntity != null && laserContainer != null) { + if (be != null && laserContainer != null) { if (!laserContainer.inputsEnergy(oppositeSide)) continue; amperesUsed += laserContainer.acceptEnergyFromNetwork(oppositeSide, outputVoltage, outputAmperes - amperesUsed); diff --git a/src/main/java/com/gregtechceu/gtceu/api/pattern/BlockPattern.java b/src/main/java/com/gregtechceu/gtceu/api/pattern/BlockPattern.java index afe594b39f5..22664ab9ad8 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/pattern/BlockPattern.java +++ b/src/main/java/com/gregtechceu/gtceu/api/pattern/BlockPattern.java @@ -148,7 +148,7 @@ public boolean checkPatternAt(MultiblockState worldState, BlockPos centerPos, Di } } boolean canPartShared = true; - if (worldState.getTileEntity() instanceof IMultiPart part) { // add detected parts + if (worldState.getBlockEntity() instanceof IMultiPart part) { // add detected parts if (!predicate.isAny()) { if (part.isFormed() && !part.canShared() && !part.hasController(worldState.controllerPos)) { // check part can be shared diff --git a/src/main/java/com/gregtechceu/gtceu/api/pattern/MultiblockState.java b/src/main/java/com/gregtechceu/gtceu/api/pattern/MultiblockState.java index 1cb071051bf..126686748a1 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/pattern/MultiblockState.java +++ b/src/main/java/com/gregtechceu/gtceu/api/pattern/MultiblockState.java @@ -34,8 +34,8 @@ public class MultiblockState { private BlockPos pos; private BlockState blockState; - private BlockEntity tileEntity; - private boolean tileEntityInitialized; + private BlockEntity blockEntity; + private boolean blockEntityInitialized; @Getter private final PatternMatchContext matchContext; @Getter @@ -72,8 +72,8 @@ public void clean() { public boolean update(BlockPos posIn, TraceabilityPredicate predicate) { this.pos = posIn; this.blockState = null; - this.tileEntity = null; - this.tileEntityInitialized = false; + this.blockEntity = null; + this.blockEntityInitialized = false; this.predicate = predicate; this.error = null; if (!world.isLoaded(posIn)) { @@ -116,16 +116,16 @@ public BlockState getBlockState() { } @Nullable - public BlockEntity getTileEntity() { + public BlockEntity getBlockEntity() { if (!getBlockState().hasBlockEntity()) { return null; } - if (this.tileEntity == null && !this.tileEntityInitialized) { - this.tileEntity = this.world.getBlockEntity(this.pos); - this.tileEntityInitialized = true; + if (this.blockEntity == null && !this.blockEntityInitialized) { + this.blockEntity = this.world.getBlockEntity(this.pos); + this.blockEntityInitialized = true; } - return this.tileEntity; + return this.blockEntity; } public BlockPos getPos() { diff --git a/src/main/java/com/gregtechceu/gtceu/api/pattern/Predicates.java b/src/main/java/com/gregtechceu/gtceu/api/pattern/Predicates.java index fcbab48ad80..e81b9250100 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/pattern/Predicates.java +++ b/src/main/java/com/gregtechceu/gtceu/api/pattern/Predicates.java @@ -314,8 +314,8 @@ public static TraceabilityPredicate frames(Material... frameMaterials) { .toArray(Block[]::new); return blocks(frameBlocks) .or(new TraceabilityPredicate(blockWorldState -> { - BlockEntity tileEntity = blockWorldState.getTileEntity(); - if (!(tileEntity instanceof IPipeNode pipeNode)) { + BlockEntity blockEntity = blockWorldState.getBlockEntity(); + if (!(blockEntity instanceof IPipeNode pipeNode)) { return false; } return ArrayUtils.contains(frameMaterials, pipeNode.getFrameMaterial()); diff --git a/src/main/java/com/gregtechceu/gtceu/api/pattern/predicates/SimplePredicate.java b/src/main/java/com/gregtechceu/gtceu/api/pattern/predicates/SimplePredicate.java index 552d450fed2..ab60fec77fc 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/pattern/predicates/SimplePredicate.java +++ b/src/main/java/com/gregtechceu/gtceu/api/pattern/predicates/SimplePredicate.java @@ -132,9 +132,9 @@ private boolean checkInnerConditions(MultiblockState blockWorldState) { } } if (nbtParser != null && !blockWorldState.world.isClientSide) { - BlockEntity te = blockWorldState.getTileEntity(); - if (te != null) { - CompoundTag nbt = te.saveWithFullMetadata(); + BlockEntity be = blockWorldState.getBlockEntity(); + if (be != null) { + CompoundTag nbt = be.saveWithFullMetadata(); if (Pattern.compile(nbtParser).matcher(nbt.toString()).find()) { return true; } diff --git a/src/main/java/com/gregtechceu/gtceu/api/pipenet/longdistance/ILDEndpoint.java b/src/main/java/com/gregtechceu/gtceu/api/pipenet/longdistance/ILDEndpoint.java index 17cea8f68f7..4ac73a8aeba 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/pipenet/longdistance/ILDEndpoint.java +++ b/src/main/java/com/gregtechceu/gtceu/api/pipenet/longdistance/ILDEndpoint.java @@ -79,8 +79,8 @@ default boolean isOutput() { @Nullable static ILDEndpoint tryGet(LevelAccessor world, BlockPos pos) { - BlockEntity te = world.getBlockEntity(pos); - if (te instanceof ILDEndpoint endpoint) { + BlockEntity be = world.getBlockEntity(pos); + if (be instanceof ILDEndpoint endpoint) { return endpoint; } return null; diff --git a/src/main/java/com/gregtechceu/gtceu/client/renderer/MultiblockInWorldPreviewRenderer.java b/src/main/java/com/gregtechceu/gtceu/client/renderer/MultiblockInWorldPreviewRenderer.java index c4bdbffa385..f690a0a418b 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/MultiblockInWorldPreviewRenderer.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/MultiblockInWorldPreviewRenderer.java @@ -432,7 +432,7 @@ private static void renderBlocks(TrackedDummyWorld level, PoseStack poseStack, B BlockState state = level.getBlockState(pos); FluidState fluidState = state.getFluidState(); Block block = state.getBlock(); - BlockEntity te = level.getBlockEntity(pos); + BlockEntity be = level.getBlockEntity(pos); if (block == Blocks.AIR) continue; diff --git a/src/main/java/com/gregtechceu/gtceu/common/blockentity/ItemPipeBlockEntity.java b/src/main/java/com/gregtechceu/gtceu/common/blockentity/ItemPipeBlockEntity.java index c756537a1a8..2faca820792 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/blockentity/ItemPipeBlockEntity.java +++ b/src/main/java/com/gregtechceu/gtceu/common/blockentity/ItemPipeBlockEntity.java @@ -139,7 +139,7 @@ public void resetTransferred() { * } * } *

- * if it was in a ticking TileEntity + * if it was in a ticking BlockEntity */ private void updateTransferredState() { long currentTime = getLevelTime(); diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/behavior/PortableScannerBehavior.java b/src/main/java/com/gregtechceu/gtceu/common/item/behavior/PortableScannerBehavior.java index cd7e83e856c..54db194be9a 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/behavior/PortableScannerBehavior.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/behavior/PortableScannerBehavior.java @@ -156,7 +156,7 @@ protected DisplayMode getMode(ItemStack stack) { } public int addScannerInfo(Player player, Level level, BlockPos pos, DisplayMode mode, List list) { - BlockEntity tileEntity = level.getBlockEntity(pos); + BlockEntity blockEntity = level.getBlockEntity(pos); int energyCost = 0; BlockState state = level.getBlockState(pos); @@ -195,7 +195,7 @@ public int addScannerInfo(Player player, Level level, BlockPos pos, DisplayMode } } - if (tileEntity instanceof MetaMachine machine) { + if (blockEntity instanceof MetaMachine machine) { list.add(Component.translatable(state.getBlock().getDescriptionId()).withStyle(ChatFormatting.BLUE)); @@ -216,7 +216,7 @@ public int addScannerInfo(Player player, Level level, BlockPos pos, DisplayMode } // Fluid tanks - Optional fluidCap = tileEntity.getCapability(ForgeCapabilities.FLUID_HANDLER).resolve(); + Optional fluidCap = blockEntity.getCapability(ForgeCapabilities.FLUID_HANDLER).resolve(); if (fluidCap.isPresent()) { list.add(Component.translatable("behavior.portable_scanner.divider")); IFluidHandler fluidHandler = fluidCap.get(); @@ -260,7 +260,7 @@ public int addScannerInfo(Player player, Level level, BlockPos pos, DisplayMode if (mode == DisplayMode.SHOW_ALL || mode == DisplayMode.SHOW_ELECTRICAL_INFO) { // Energy container - Optional energyCap = tileEntity + Optional energyCap = blockEntity .getCapability(GTCapability.CAPABILITY_ENERGY_CONTAINER).resolve(); if (energyCap.isPresent()) { IEnergyContainer energyContainer = energyCap.get(); @@ -343,8 +343,8 @@ public int addScannerInfo(Player player, Level level, BlockPos pos, DisplayMode // machine-specific info IDataInfoProvider provider = null; - if (tileEntity instanceof IDataInfoProvider) - provider = (IDataInfoProvider) tileEntity; + if (blockEntity instanceof IDataInfoProvider) + provider = (IDataInfoProvider) blockEntity; else if (machine instanceof IDataInfoProvider) provider = (IDataInfoProvider) machine; @@ -353,22 +353,22 @@ else if (machine instanceof IDataInfoProvider) list.addAll(provider.getDataInfo(mode)); } - } else if (tileEntity instanceof PipeBlockEntity pipe) { + } else if (blockEntity instanceof PipeBlockEntity pipe) { // Pipes need special name handling list.add(pipe.getPipeBlock().getName().withStyle(ChatFormatting.BLUE)); // Pipe-specific info - if (tileEntity instanceof IDataInfoProvider dataInfoProvider) { + if (blockEntity instanceof IDataInfoProvider dataInfoProvider) { list.add(Component.translatable("behavior.portable_scanner.divider")); list.addAll(dataInfoProvider.getDataInfo(mode)); } - if (tileEntity instanceof FluidPipeBlockEntity) { + if (blockEntity instanceof FluidPipeBlockEntity) { // Getting fluid info always costs 500 energyCost += 500; } - } else if (tileEntity instanceof IDataInfoProvider dataInfoProvider) { + } else if (blockEntity instanceof IDataInfoProvider dataInfoProvider) { list.add(Component.translatable("behavior.portable_scanner.divider")); list.addAll(dataInfoProvider.getDataInfo(mode)); } else { @@ -438,7 +438,7 @@ else if (machine instanceof IDataInfoProvider) } // Add optional debug info - if (tileEntity instanceof IDataInfoProvider dataInfoProvider) { + if (blockEntity instanceof IDataInfoProvider dataInfoProvider) { List debugInfo = dataInfoProvider.getDebugInfo(player, debugLevel, mode); if (debugInfo != null) { list.addAll(debugInfo); @@ -446,7 +446,7 @@ else if (machine instanceof IDataInfoProvider) } if (mode == DisplayMode.SHOW_INTERNAL_JAVA_INFO && - tileEntity instanceof ManagedSyncBlockEntity syncBlockEntity) { + blockEntity instanceof ManagedSyncBlockEntity syncBlockEntity) { MetaMachine machine = (syncBlockEntity instanceof MetaMachine m) ? m : null; PipeBlockEntity pipe = (syncBlockEntity instanceof PipeBlockEntity p) ? p : null; diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/BlockRotatingBehavior.java b/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/BlockRotatingBehavior.java index 9c50b46bfb0..1753106e602 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/BlockRotatingBehavior.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/tool/behavior/BlockRotatingBehavior.java @@ -49,9 +49,9 @@ public boolean canPerformAction(ItemStack stack, ToolAction action) { public InteractionResult onItemUseFirst(ItemStack stack, UseOnContext context) { Level level = context.getLevel(); BlockPos pos = context.getClickedPos(); - BlockEntity te = level.getBlockEntity(pos); - // MTEs have special handling on rotation - if (te instanceof MetaMachine) { + BlockEntity be = level.getBlockEntity(pos); + // Machines have special handling on rotation + if (be instanceof MetaMachine) { return InteractionResult.PASS; } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CleanroomMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CleanroomMachine.java index 82966b9e9f7..b674b5520e0 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CleanroomMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CleanroomMachine.java @@ -409,7 +409,7 @@ protected TraceabilityPredicate innerPredicate() { Set receivers = blockWorldState.getMatchContext().getOrCreate("cleanroomReceiver", Sets::newHashSet); // all non-GTMachines are allowed inside by default - BlockEntity blockEntity = blockWorldState.getTileEntity(); + BlockEntity blockEntity = blockWorldState.getBlockEntity(); if (blockEntity instanceof MetaMachine machine) { if (isMachineBanned(machine)) { return false; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/OpticalDataHatchMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/OpticalDataHatchMachine.java index be745807be5..9b6f0253233 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/OpticalDataHatchMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/OpticalDataHatchMachine.java @@ -67,12 +67,12 @@ public boolean isRecipeAvailable(@NotNull GTRecipe recipe, @NotNull Collection Date: Thu, 16 Apr 2026 13:49:15 +1000 Subject: [PATCH 15/21] bugfix --- .../machine/trait/BedrockOreMinerLogic.java | 2 +- .../machine/trait/miner/MinerLogic.java | 41 +++++++++---------- 2 files changed, 21 insertions(+), 22 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/trait/BedrockOreMinerLogic.java b/src/main/java/com/gregtechceu/gtceu/common/machine/trait/BedrockOreMinerLogic.java index c6c0d31ed3b..963ac93d9cf 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/trait/BedrockOreMinerLogic.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/trait/BedrockOreMinerLogic.java @@ -44,7 +44,7 @@ public BedrockOreMinerMachine getMachine() { @Override protected List> validMachineClasses() { - return List.of(BedrockOreMinerLogic.class); + return List.of(BedrockOreMinerMachine.class); } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/trait/miner/MinerLogic.java b/src/main/java/com/gregtechceu/gtceu/common/machine/trait/miner/MinerLogic.java index afb2f6edb14..c120e7e322c 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/trait/miner/MinerLogic.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/trait/miner/MinerLogic.java @@ -40,7 +40,6 @@ import com.mojang.brigadier.exceptions.CommandSyntaxException; import lombok.Getter; import lombok.Setter; -import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.*; @@ -113,8 +112,7 @@ public class MinerLogic extends RecipeLogic implements IRecipeCapabilityHolder { private final Map> capabilitiesProxy; @Getter protected final Map, List>>> capabilitiesFlat; - private final ItemRecipeHandler inputItemHandler, outputItemHandler; - private final IgnoreEnergyRecipeHandler inputEnergyHandler; + private @Nullable ItemRecipeHandler inputItemHandler, outputItemHandler; @Setter @Getter private Direction dir = Direction.DOWN; @@ -136,17 +134,6 @@ public MinerLogic(int fortune, int speed, int maximumRadius) { this.pickaxeTool = GTMaterialItems.TOOL_ITEMS.get(GTMaterials.Neutronium, GTToolType.PICKAXE).get().get(); this.capabilitiesProxy = new EnumMap<>(IO.class); this.capabilitiesFlat = new EnumMap<>(IO.class); - this.inputItemHandler = new ItemRecipeHandler(IO.IN, - getRLMachine().getRecipeType().getMaxInputs(ItemRecipeCapability.CAP)); - this.outputItemHandler = new ItemRecipeHandler(IO.OUT, - getRLMachine().getRecipeType().getMaxOutputs(ItemRecipeCapability.CAP)); - this.inputEnergyHandler = new IgnoreEnergyRecipeHandler(); - - RecipeHandlerList inHandlers = RecipeHandlerList.of(IO.IN, inputItemHandler, inputEnergyHandler); - RecipeHandlerList outHandlers = RecipeHandlerList.of(IO.OUT, outputItemHandler); - - addHandlerList(inHandlers); - addHandlerList(outHandlers); } @Override @@ -159,6 +146,20 @@ protected List> validMachineClasses() { return List.of(IMiner.class); } + @Override + public void onMachineLoad() { + this.inputItemHandler = new ItemRecipeHandler(IO.IN, + getRLMachine().getRecipeType().getMaxInputs(ItemRecipeCapability.CAP)); + this.outputItemHandler = new ItemRecipeHandler(IO.OUT, + getRLMachine().getRecipeType().getMaxOutputs(ItemRecipeCapability.CAP)); + + RecipeHandlerList inHandlers = RecipeHandlerList.of(IO.IN, inputItemHandler, new IgnoreEnergyRecipeHandler()); + RecipeHandlerList outHandlers = RecipeHandlerList.of(IO.OUT, outputItemHandler); + + addHandlerList(inHandlers); + addHandlerList(outHandlers); + } + @Override public void resetRecipeLogic() { super.resetRecipeLogic(); @@ -360,8 +361,8 @@ protected boolean doPostProcessing(NonNullList blockDrops, BlockState if (oreDrop.isEmpty()) return false; // create dummy recipe handler - inputItemHandler.storage.setStackInSlot(0, oreDrop); - outputItemHandler.storage.clear(); + Objects.requireNonNull(inputItemHandler).storage.setStackInSlot(0, oreDrop); + Objects.requireNonNull(outputItemHandler).storage.clear(); var matches = getRLMachine().getRecipeType().searchRecipe(this, r -> RecipeHelper.matchContents(this, r).isSuccess()); @@ -431,7 +432,6 @@ private void mineAndInsertItems(NonNullList blockDrops, ServerLevel w // replace the ore block with cobblestone instead of breaking it to prevent mob spawning // remove the ore block's position from the mining queue var handler = getCachedItemHandler(); - if (handler != null) { if (GTTransferUtils.addItemsToItemHandler(handler, true, blockDrops)) { GTTransferUtils.addItemsToItemHandler(handler, false, blockDrops); var pos = blocksToMine.getFirst(); @@ -448,7 +448,6 @@ private void mineAndInsertItems(NonNullList blockDrops, ServerLevel w // the ore block was not able to fit, so the inventory is considered full isInventoryFull = true; } - } } /** @@ -457,7 +456,7 @@ private void mineAndInsertItems(NonNullList blockDrops, ServerLevel w * @param pos the {@link BlockPos} of the miner itself * @param currentRadius the currently set mining radius */ - public void initPos(@NotNull BlockPos pos, int currentRadius) { + public void initPos(BlockPos pos, int currentRadius) { x = pos.getX() - currentRadius; z = pos.getZ() - currentRadius; if (dir == Direction.UP) { @@ -581,7 +580,7 @@ private LinkedList getBlocksToMine() { * @param values to find the mean of * @return the mean value */ - private static long mean(@NotNull long[] values) { + private static long mean(long[] values) { if (values.length == 0L) return 0L; @@ -595,7 +594,7 @@ private static long mean(@NotNull long[] values) { * @param world the {@link Level} to get the average tick time of * @return the mean tick time */ - private static double getMeanTickTime(@NotNull Level world) { + private static double getMeanTickTime(Level world) { return mean(Objects.requireNonNull(world.getServer()).tickTimes) * 1.0E-6D; } From 41275e106bb843ee9a06ec2a6ab8854dee7e5fd3 Mon Sep 17 00:00:00 2001 From: Gustavo Date: Fri, 17 Apr 2026 18:09:42 +1000 Subject: [PATCH 16/21] spotless --- .../machine/trait/miner/MinerLogic.java | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/trait/miner/MinerLogic.java b/src/main/java/com/gregtechceu/gtceu/common/machine/trait/miner/MinerLogic.java index c120e7e322c..b1af429b9ef 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/trait/miner/MinerLogic.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/trait/miner/MinerLogic.java @@ -432,22 +432,22 @@ private void mineAndInsertItems(NonNullList blockDrops, ServerLevel w // replace the ore block with cobblestone instead of breaking it to prevent mob spawning // remove the ore block's position from the mining queue var handler = getCachedItemHandler(); - if (GTTransferUtils.addItemsToItemHandler(handler, true, blockDrops)) { - GTTransferUtils.addItemsToItemHandler(handler, false, blockDrops); - var pos = blocksToMine.getFirst(); - world.setBlock(pos, findMiningReplacementBlock(world, pos), 3); - mineX = pos.getX(); - mineZ = pos.getZ(); - mineY = pos.getY(); - blocksToMine.removeFirst(); - onMineOperation(); - - // if the inventory was previously considered full, mark it as not since an item was able to fit - isInventoryFull = false; - } else { - // the ore block was not able to fit, so the inventory is considered full - isInventoryFull = true; - } + if (GTTransferUtils.addItemsToItemHandler(handler, true, blockDrops)) { + GTTransferUtils.addItemsToItemHandler(handler, false, blockDrops); + var pos = blocksToMine.getFirst(); + world.setBlock(pos, findMiningReplacementBlock(world, pos), 3); + mineX = pos.getX(); + mineZ = pos.getZ(); + mineY = pos.getY(); + blocksToMine.removeFirst(); + onMineOperation(); + + // if the inventory was previously considered full, mark it as not since an item was able to fit + isInventoryFull = false; + } else { + // the ore block was not able to fit, so the inventory is considered full + isInventoryFull = true; + } } /** From 2a05c90734fb9222c30166283600dbff869a1b6a Mon Sep 17 00:00:00 2001 From: Gustavo Date: Fri, 17 Apr 2026 18:37:11 +1000 Subject: [PATCH 17/21] some more docs --- .../gtceu/api/capability/ICoverable.java | 2 + .../gtceu/api/cover/CoverBehavior.java | 3 +- .../api/item/tool/IToolGridHighlight.java | 19 ++++++++++ .../gtceu/api/machine/MetaMachine.java | 21 ++++++++++- .../gtceu/api/machine/trait/MachineTrait.java | 16 +++++--- .../api/machine/trait/MachineTraitHolder.java | 2 + .../trait/feature/IFrontFacingTrait.java | 2 + .../trait/feature/IInteractionTrait.java | 37 +++++++++++++++++-- .../trait/feature/IRenderingTrait.java | 15 +++++++- .../machine/trait/feature/package-info.java | 4 ++ .../cover/voiding/FluidVoidingCover.java | 7 ---- .../cover/voiding/ItemVoidingCover.java | 7 ---- .../common/machine/trait/AutoOutputTrait.java | 2 +- 13 files changed, 107 insertions(+), 30 deletions(-) create mode 100644 src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/package-info.java diff --git a/src/main/java/com/gregtechceu/gtceu/api/capability/ICoverable.java b/src/main/java/com/gregtechceu/gtceu/api/capability/ICoverable.java index 16852d2a582..d06645b7fc5 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/capability/ICoverable.java +++ b/src/main/java/com/gregtechceu/gtceu/api/capability/ICoverable.java @@ -31,6 +31,7 @@ import net.minecraft.world.phys.shapes.VoxelShape; import net.minecraftforge.items.IItemHandlerModifiable; +import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.Nullable; import java.util.*; @@ -108,6 +109,7 @@ default void unsubscribe(@Nullable TickableSubscription current) { * @param coverBehavior * @param side */ + @ApiStatus.Internal void setCoverAtSide(@Nullable CoverBehavior coverBehavior, Direction side); @Nullable diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/CoverBehavior.java b/src/main/java/com/gregtechceu/gtceu/api/cover/CoverBehavior.java index 24ce428669d..cb89f52f10a 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/CoverBehavior.java +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/CoverBehavior.java @@ -199,8 +199,7 @@ public boolean shouldRenderPlate() { @Override public boolean shouldRenderGrid(Player player, BlockPos pos, BlockState state, ItemStack held, Set toolTypes) { - return toolTypes.contains(GTToolType.CROWBAR) || - ((toolTypes.isEmpty() || toolTypes.contains(GTToolType.SCREWDRIVER)) && this instanceof IUICover); + return toolTypes.contains(GTToolType.CROWBAR) || ((toolTypes.isEmpty() || toolTypes.contains(GTToolType.SCREWDRIVER)) && this instanceof IUICover); } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/api/item/tool/IToolGridHighlight.java b/src/main/java/com/gregtechceu/gtceu/api/item/tool/IToolGridHighlight.java index a79ccf07b39..53f760fb231 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/item/tool/IToolGridHighlight.java +++ b/src/main/java/com/gregtechceu/gtceu/api/item/tool/IToolGridHighlight.java @@ -14,11 +14,30 @@ public interface IToolGridHighlight { + /** + * Called to determine if the grid overlay should be rendered on this machine. + * @param player Player looking at this machine + * @param pos Block pos + * @param state Block state + * @param held Item that player is holding + * @param toolTypes The GT tool types of the held item, if any + * @return If the grid overlay should be drawn on the machine. + */ default boolean shouldRenderGrid(Player player, BlockPos pos, BlockState state, ItemStack held, Set toolTypes) { return true; } + /** + * Called when the machine grid overlay is being rendered to determine the icon to be rendered within the grid + * segment on a specifc side. + * @param player Player looking at this machine + * @param pos Block pos + * @param state Block state + * @param toolTypes The GT tool types of the held item, if any + * @param side The machine side which this grid segment correspond to + * @return The icon to be rendered, or null + */ default @Nullable ResourceTexture sideTips(Player player, BlockPos pos, BlockState state, Set toolTypes, Direction side) { return 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 8d5be497967..1031d00a995 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java @@ -369,7 +369,7 @@ public Optional getTraitOptional(MachineTraitType * @param context The context of this interaction. * @return A pair containing the type of the tool (if the interaction was successful), and the result of the * interaction. - * A result of CONSUME will play the tool sound (based on the first element of the pair) and consume + * {@link InteractionResult#sidedSuccess(boolean)} will play the tool sound (based on the first element of the pair) and consume * durability. */ public final Pair<@Nullable GTToolType, InteractionResult> onToolClick(ExtendedUseOnContext context) { @@ -516,10 +516,18 @@ public InteractionResult onUse(ExtendedUseOnContext context) { /** * Called when a machine is left clicked. - * + * + * @param player Player that clicked + * @param hand Player hand + * @param face Clicked face * @return true to cancel the click event, false to continue processing */ public boolean onLeftClick(Player player, InteractionHand hand, @Nullable Direction face) { + for (var trait : getAllTraits()) { + if (trait instanceof IInteractionTrait interactionTrait) { + if (interactionTrait.onLeftClick(player, hand, face)) return true; + } + } return false; } @@ -782,6 +790,11 @@ public boolean allowExtendedFacing() { */ public void onRotated(Direction oldFacing, Direction newFacing) {} + /** + * Called by the block colour handler to get tint colour for a specific layer index + * @param index colour layer index + * @return Integer colour, or -1 to not apply a colour tint. + */ public int tintColor(int index) { // index < -100 => emission if shimmer is installed. if (index == 1 || index == -111) { @@ -790,6 +803,10 @@ public int tintColor(int index) { return -1; } + /** + * @see ModelData + * @return ModelData to be passed to the {@link BakedModel} + */ @Override public ModelData getModelData() { return super.getModelData().derive().build(); diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTrait.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTrait.java index c872b994fca..af4a27a1810 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTrait.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTrait.java @@ -36,15 +36,15 @@ public abstract class MachineTrait implements ISyncManaged { private @Nullable MetaMachine machine; @Setter protected Predicate<@Nullable Direction> capabilityValidator = $ -> true; + + /** + * The trait's callback priority. Traits with a higher priority will have their events fired + * first, which may prevent traits with a lower priority from handling some events. + */ @Getter @Setter private int traitPriority = 1; - public MachineTrait(MetaMachine machine) { - this.capabilityValidator = side -> true; - machine.getTraitHolder().attachTrait(this); - } - public MachineTrait() {} public MetaMachine getMachine() { @@ -135,7 +135,11 @@ public void onMachineUnload() {} public void onMachineDestroyed() {} /** - * Called when a neighboring block is updated + * Called when a neighboring block is updated. + * + * @param neighborBlock The neighbor block type. + * @param neighborPos The neighbor position. + * @param isMoving If the neighbor block is moving (e.g. moved by a piston) */ public void onMachineNeighborChanged(Block neighborBlock, BlockPos neighborPos, boolean isMoving) {} } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTraitHolder.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTraitHolder.java index 8447500dc54..decb4702f2e 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTraitHolder.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTraitHolder.java @@ -57,6 +57,8 @@ public T attachTrait(T trait) { * @return The attached trait */ public T attachTrait(T trait, int callbackPriority) { + trait.setTraitPriority(callbackPriority); + var traitType = trait.getTraitType(); var list = traitsByType.computeIfAbsent(traitType, $ -> new ObjectArrayList<>(1)); diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/IFrontFacingTrait.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/IFrontFacingTrait.java index cff3a98b3fb..077c5322130 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/IFrontFacingTrait.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/IFrontFacingTrait.java @@ -9,6 +9,8 @@ public interface IFrontFacingTrait { /** * Returns if a machine can be rotated to be facing the given direction. + * @param direction The direction to check + * @return If the provided direction is a valid facing direction */ default boolean isValidFrontFace(Direction direction) { return true; diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/IInteractionTrait.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/IInteractionTrait.java index dd0ae98f2ab..819fd16f753 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/IInteractionTrait.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/IInteractionTrait.java @@ -3,9 +3,13 @@ import com.gregtechceu.gtceu.api.item.tool.GTToolType; import com.gregtechceu.gtceu.utils.ExtendedUseOnContext; +import net.minecraft.core.Direction; +import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import com.mojang.datafixers.util.Pair; +import net.minecraft.world.entity.player.Player; +import org.jetbrains.annotations.Nullable; import javax.annotation.ParametersAreNonnullByDefault; @@ -15,13 +19,40 @@ @ParametersAreNonnullByDefault public interface IInteractionTrait { - /// Called when a player interacts with a machine without an item. + /** + * Called when a machine is right clicked without an item, or if this machine was clicked with an item but no + * item-specific interaction was performed. + * + * @param context The context which this interaction is being performed from. + * @return The result of this interaction callback. + */ default InteractionResult onUse(ExtendedUseOnContext context) { return InteractionResult.PASS; } - /// Called when a player interacts with a machine with a tool. - default Pair onToolClick(ExtendedUseOnContext context) { + /** + * Called when a player clicks this machine with a GT tool + * + * @param context The context of this interaction. + * @return A pair containing the type of the tool (if the interaction was successful), and the result of the + * interaction. + * {@link InteractionResult#sidedSuccess(boolean)} will play the tool sound (based on the first element of the pair) and consume + * durability. + */ + default Pair<@Nullable GTToolType, InteractionResult> onToolClick(ExtendedUseOnContext context) { return Pair.of(null, InteractionResult.PASS); } + + /** + * Called when a machine is left clicked. + * + * @param player Player that clicked + * @param hand Player hand + * @param face Clicked face + * @return true to cancel the click event, false to continue processing + */ + default boolean onLeftClick(Player player, InteractionHand hand, @Nullable Direction face) { + return false; + } + } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/IRenderingTrait.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/IRenderingTrait.java index 7683fcb5000..7cf4dc8f09a 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/IRenderingTrait.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/IRenderingTrait.java @@ -19,11 +19,16 @@ /** * A machine trait that overrides some of the default machine rendering behaviour. */ -@ParametersAreNonnullByDefault public interface IRenderingTrait { /** - * Called when a player is looking at this machine, returns whether the grid overlay should be rendered. + * Called to determine if the grid overlay should be rendered on this machine. + * @param player Player looking at this machine + * @param pos Block pos + * @param state Block state + * @param held Item that player is holding + * @param toolTypes The GT tool types of the held item, if any + * @return If the grid overlay should be drawn on the machine. */ default boolean shouldRenderGridOverlay(Player player, BlockPos pos, BlockState state, ItemStack held, Set toolTypes) { @@ -33,6 +38,12 @@ default boolean shouldRenderGridOverlay(Player player, BlockPos pos, BlockState /** * Called when the machine grid overlay is being rendered to determine the icon to be rendered within the grid * segment on a specifc side. + * @param player Player looking at this machine + * @param pos Block pos + * @param state Block state + * @param toolTypes The GT tool types of the held item, if any + * @param side The machine side which this grid segment correspond to + * @return The icon to be rendered, or null */ default @Nullable ResourceTexture getGridOverlayIcon(Player player, BlockPos pos, BlockState state, Set toolTypes, diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/package-info.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/package-info.java new file mode 100644 index 00000000000..6be50283636 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/package-info.java @@ -0,0 +1,4 @@ +@NotNullByDefault +package com.gregtechceu.gtceu.api.machine.trait.feature; + +import org.jetbrains.annotations.NotNullByDefault; \ No newline at end of file diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/voiding/FluidVoidingCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/voiding/FluidVoidingCover.java index e940e453965..df5cadf3a74 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/voiding/FluidVoidingCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/voiding/FluidVoidingCover.java @@ -120,13 +120,6 @@ public InteractionResult onSoftMalletClick(ExtendedUseOnContext context) { return InteractionResult.sidedSuccess(isRemote()); } - // TODO: Decide grid behavior - @Override - public boolean shouldRenderGrid(Player player, BlockPos pos, BlockState state, ItemStack held, - Set toolTypes) { - return super.shouldRenderGrid(player, pos, state, held, toolTypes); - } - @Override public @Nullable ResourceTexture sideTips(Player player, BlockPos pos, BlockState state, Set toolTypes, Direction side) { diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/voiding/ItemVoidingCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/voiding/ItemVoidingCover.java index 1a7740d401a..2c2a672d5ca 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/voiding/ItemVoidingCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/voiding/ItemVoidingCover.java @@ -116,13 +116,6 @@ public InteractionResult onSoftMalletClick(ExtendedUseOnContext context) { return InteractionResult.sidedSuccess(isRemote()); } - // TODO: Decide grid behavior - @Override - public boolean shouldRenderGrid(Player player, BlockPos pos, BlockState state, ItemStack held, - Set toolTypes) { - return super.shouldRenderGrid(player, pos, state, held, toolTypes); - } - @Override public @Nullable ResourceTexture sideTips(Player player, BlockPos pos, BlockState state, Set toolTypes, Direction side) { diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/trait/AutoOutputTrait.java b/src/main/java/com/gregtechceu/gtceu/common/machine/trait/AutoOutputTrait.java index 7297248f7b6..693d0539ea5 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/trait/AutoOutputTrait.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/trait/AutoOutputTrait.java @@ -325,7 +325,7 @@ public boolean shouldRenderGridOverlay(Player player, BlockPos pos, BlockState s } @Override - public Pair onToolClick(ExtendedUseOnContext context) { + public Pair<@Nullable GTToolType, InteractionResult> onToolClick(ExtendedUseOnContext context) { var toolType = context.getToolType(); if (useDefaultToolHandlers) { if (toolType.contains(GTToolType.WRENCH)) { From 807f923010a2cdb3deb7a8c572ce32676ec07e51 Mon Sep 17 00:00:00 2001 From: Gustavo Date: Fri, 17 Apr 2026 19:34:39 +1000 Subject: [PATCH 18/21] some more docs changes --- .../gtceu/api/cover/CoverBehavior.java | 3 +- .../api/item/tool/IToolGridHighlight.java | 18 +++++++----- .../gtceu/api/machine/MetaMachine.java | 13 ++++----- .../api/machine/SimpleGeneratorMachine.java | 3 +- .../feature/multiblock/IMultiPart.java | 29 +++++++++++++------ .../MultiblockControllerMachine.java | 16 ++++++---- .../part/MultiblockPartMachine.java | 22 ++++++++++---- .../machine/multiblock/part/package-info.java | 4 +++ .../gtceu/api/machine/trait/MachineTrait.java | 4 +-- .../trait/feature/IFrontFacingTrait.java | 1 + .../trait/feature/IInteractionTrait.java | 10 +++---- .../trait/feature/IRenderingTrait.java | 20 ++++++------- .../machine/trait/feature/package-info.java | 2 +- .../cover/voiding/FluidVoidingCover.java | 1 - 14 files changed, 87 insertions(+), 59 deletions(-) create mode 100644 src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/part/package-info.java diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/CoverBehavior.java b/src/main/java/com/gregtechceu/gtceu/api/cover/CoverBehavior.java index cb89f52f10a..24ce428669d 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/CoverBehavior.java +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/CoverBehavior.java @@ -199,7 +199,8 @@ public boolean shouldRenderPlate() { @Override public boolean shouldRenderGrid(Player player, BlockPos pos, BlockState state, ItemStack held, Set toolTypes) { - return toolTypes.contains(GTToolType.CROWBAR) || ((toolTypes.isEmpty() || toolTypes.contains(GTToolType.SCREWDRIVER)) && this instanceof IUICover); + return toolTypes.contains(GTToolType.CROWBAR) || + ((toolTypes.isEmpty() || toolTypes.contains(GTToolType.SCREWDRIVER)) && this instanceof IUICover); } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/api/item/tool/IToolGridHighlight.java b/src/main/java/com/gregtechceu/gtceu/api/item/tool/IToolGridHighlight.java index 53f760fb231..9621d355051 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/item/tool/IToolGridHighlight.java +++ b/src/main/java/com/gregtechceu/gtceu/api/item/tool/IToolGridHighlight.java @@ -16,10 +16,11 @@ public interface IToolGridHighlight { /** * Called to determine if the grid overlay should be rendered on this machine. - * @param player Player looking at this machine - * @param pos Block pos - * @param state Block state - * @param held Item that player is holding + * + * @param player Player looking at this machine + * @param pos Block pos + * @param state Block state + * @param held Item that player is holding * @param toolTypes The GT tool types of the held item, if any * @return If the grid overlay should be drawn on the machine. */ @@ -31,11 +32,12 @@ default boolean shouldRenderGrid(Player player, BlockPos pos, BlockState state, /** * Called when the machine grid overlay is being rendered to determine the icon to be rendered within the grid * segment on a specifc side. - * @param player Player looking at this machine - * @param pos Block pos - * @param state Block state + * + * @param player Player looking at this machine + * @param pos Block pos + * @param state Block state * @param toolTypes The GT tool types of the held item, if any - * @param side The machine side which this grid segment correspond to + * @param side The machine side which this grid segment correspond to * @return The icon to be rendered, or null */ default @Nullable ResourceTexture sideTips(Player player, BlockPos pos, BlockState state, Set toolTypes, 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 1031d00a995..378bb3ab1ec 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java @@ -20,7 +20,6 @@ import com.gregtechceu.gtceu.api.item.tool.ToolHelper; import com.gregtechceu.gtceu.api.machine.feature.*; 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.MachineTrait; import com.gregtechceu.gtceu.api.machine.trait.MachineTraitHolder; @@ -369,7 +368,8 @@ public Optional getTraitOptional(MachineTraitType * @param context The context of this interaction. * @return A pair containing the type of the tool (if the interaction was successful), and the result of the * interaction. - * {@link InteractionResult#sidedSuccess(boolean)} will play the tool sound (based on the first element of the pair) and consume + * {@link InteractionResult#sidedSuccess(boolean)} will play the tool sound (based on the first element of + * the pair) and consume * durability. */ public final Pair<@Nullable GTToolType, InteractionResult> onToolClick(ExtendedUseOnContext context) { @@ -518,8 +518,8 @@ public InteractionResult onUse(ExtendedUseOnContext context) { * Called when a machine is left clicked. * * @param player Player that clicked - * @param hand Player hand - * @param face Clicked face + * @param hand Player hand + * @param face Clicked face * @return true to cancel the click event, false to continue processing */ public boolean onLeftClick(Player player, InteractionHand hand, @Nullable Direction face) { @@ -792,6 +792,7 @@ public void onRotated(Direction oldFacing, Direction newFacing) {} /** * Called by the block colour handler to get tint colour for a specific layer index + * * @param index colour layer index * @return Integer colour, or -1 to not apply a colour tint. */ @@ -840,10 +841,6 @@ public BlockState getBlockAppearance(BlockState state, BlockAndTintGetter level, @Nullable BlockState sourceState, @Nullable BlockPos sourcePos) { var appearance = getCoverContainer().getBlockAppearance(state, level, pos, side, sourceState, sourcePos); if (appearance != null) return appearance; - if (this instanceof IMultiPart part && part.isFormed()) { - appearance = part.getFormedAppearance(sourceState, sourcePos, side); - if (appearance != null) return appearance; - } return getDefinition().getAppearance().get(); } 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 a3ff7931ce7..28afe1e2bfe 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleGeneratorMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleGeneratorMachine.java @@ -26,7 +26,6 @@ import com.google.common.collect.Tables; import it.unimi.dsi.fastutil.ints.Int2IntFunction; import lombok.Getter; -import org.jetbrains.annotations.NotNull; import java.util.Collections; import java.util.EnumMap; @@ -87,7 +86,7 @@ public int tintColor(int index) { * @param recipe recipe * @return A {@link ModifierFunction} for the given Simple Generator */ - public static ModifierFunction recipeModifier(@NotNull MetaMachine machine, @NotNull GTRecipe recipe) { + public static ModifierFunction recipeModifier(MetaMachine machine, GTRecipe recipe) { if (!(machine instanceof SimpleGeneratorMachine generator)) { return RecipeModifier.nullWrongType(SimpleGeneratorMachine.class, machine); } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/multiblock/IMultiPart.java b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/multiblock/IMultiPart.java index b3f03725c90..ec75796b409 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/multiblock/IMultiPart.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/multiblock/IMultiPart.java @@ -1,6 +1,7 @@ package com.gregtechceu.gtceu.api.machine.feature.multiblock; import com.gregtechceu.gtceu.api.gui.fancy.TooltipsPanel; +import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine; import com.gregtechceu.gtceu.api.machine.feature.IMachineFeature; import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; @@ -12,6 +13,7 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.network.chat.Component; +import net.minecraft.world.level.BlockAndTintGetter; import net.minecraft.world.level.block.state.BlockState; import org.jetbrains.annotations.Nullable; @@ -23,37 +25,44 @@ public interface IMultiPart extends IMachineFeature, IFancyUIMachine { /** - * Can it be shared among multi multiblock. + * @return If this multi part can be shared between multiple multiblocks. */ default boolean canShared() { return true; } /** - * Whether it belongs to... + * If this multi part belongs to a controller at the given position + * + * @param controllerPos Controller position + * @return If this multi part belongs to a controller at the given position */ boolean hasController(BlockPos controllerPos); /** - * Whether it belongs to a formed Multiblock. + * @return If this multi part belongs to a formed multiblock. */ boolean isFormed(); /** - * Get this MultiPart's controllers + * Gets all controllers this multi part belongs to * - * @return An Unmodifiable View of the part's controllers + * @return An unmodifiable set containing the controllers. */ @UnmodifiableView SortedSet getControllers(); /** - * Called when it was removed from a multiblock. + * Called when this part is removed from a multiblock. + * + * @param controller The controller which this part has been removed from. */ void removedFromController(MultiblockControllerMachine controller); /** - * Called when it was added to a multiblock. + * Called when this part is added to a multiblock. + * + * @param controller The controller which this part has been added to */ void addedToController(MultiblockControllerMachine controller); @@ -63,14 +72,16 @@ default boolean canShared() { List getRecipeHandlers(); /** - * whether its base model can be replaced by controller when it is formed. + * If this part's base model can be replaced by controller when it is formed. */ default boolean replacePartModelWhenFormed() { return true; } /** - * get part's Appearance. same as IForgeBlock.getAppearance() / IFabricBlock.getAppearance() + * Called to get block appearance when this multi part is in a formed multiblock. + * + * @see MetaMachine#getBlockAppearance(BlockState, BlockAndTintGetter, BlockPos, Direction, BlockState, BlockPos) */ @Nullable default BlockState getFormedAppearance(BlockState sourceState, BlockPos sourcePos, Direction side) { 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 fc2945fb33e..8e1ad857077 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,7 +22,6 @@ import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.utils.ExtendedUseOnContext; -import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; @@ -36,10 +35,9 @@ import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; -import javax.annotation.ParametersAreNonnullByDefault; - -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault +/** + * The base class for all multiblock controllers + */ public class MultiblockControllerMachine extends MetaMachine { private @Nullable MultiblockState multiblockState; @@ -52,7 +50,8 @@ public class MultiblockControllerMachine extends MetaMachine { /** * If the multiblock is formed. *
- * NOTE: Formed multiblocks may not be completely valid in some cases, e.g. due to parts becoming invalid + * NOTE: Formed multiblocks may not be completely valid in some edge cases, e.g. when called on the same tick as a + * part becoming invalid */ @Getter @SaveField @@ -163,6 +162,11 @@ public void onPartUnload() { // ***** Getters ******// /// /////////////////////////////////// + /** + * The {@link MultiblockMachineDefinition} of this multiblock. + * + * @return The {@link MultiblockMachineDefinition} + */ @Override public MultiblockMachineDefinition getDefinition() { return (MultiblockMachineDefinition) super.getDefinition(); diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/part/MultiblockPartMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/part/MultiblockPartMachine.java index c3cccb81f8a..fd9279b8834 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/part/MultiblockPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/part/MultiblockPartMachine.java @@ -13,10 +13,10 @@ import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.client.model.machine.MachineRenderState; -import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.BlockAndTintGetter; import net.minecraft.world.level.block.state.BlockState; import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; @@ -27,10 +27,9 @@ import java.util.*; -import javax.annotation.ParametersAreNonnullByDefault; - -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault +/** + * The base class for all multiblock parts + */ public class MultiblockPartMachine extends MetaMachine implements IMultiPart { @SyncToClient @@ -161,8 +160,19 @@ public boolean replacePartModelWhenFormed() { @Override @Nullable - public BlockState getFormedAppearance(BlockState sourceState, BlockPos sourcePos, Direction side) { + public BlockState getFormedAppearance(@Nullable BlockState sourceState, @Nullable BlockPos sourcePos, + Direction side) { if (!replacePartModelWhenFormed()) return null; return IMultiPart.super.getFormedAppearance(sourceState, sourcePos, side); } + + @Override + public BlockState getBlockAppearance(BlockState state, BlockAndTintGetter level, BlockPos pos, Direction side, + @Nullable BlockState sourceState, @Nullable BlockPos sourcePos) { + if (isFormed()) { + var appearance = getFormedAppearance(sourceState, sourcePos, side); + if (appearance != null) return appearance; + } + return super.getBlockAppearance(state, level, pos, side, sourceState, sourcePos); + } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/part/package-info.java b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/part/package-info.java new file mode 100644 index 00000000000..64751bacff2 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/part/package-info.java @@ -0,0 +1,4 @@ +@NotNullByDefault +package com.gregtechceu.gtceu.api.machine.multiblock.part; + +import org.jetbrains.annotations.NotNullByDefault; diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTrait.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTrait.java index af4a27a1810..7722ed34794 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTrait.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTrait.java @@ -22,9 +22,9 @@ import java.util.function.Predicate; /** - * A machine trait represents a generic capability or behaviour that is attached to a machine. + * A machine trait represents a generic capability or behaviour that is attached to a machine.
* For example, machine traits may provide a recipe handler that can handle specific inputs/outputs of a recipe (e.g. - * {@link NotifiableItemStackHandler for items}). + * {@link NotifiableItemStackHandler} for items).
* Machine traits can also attach additional behaviours to a machine (e.g. {@link AutoOutputTrait}, * {@link CleanroomProviderTrait}) */ diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/IFrontFacingTrait.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/IFrontFacingTrait.java index 077c5322130..d3830476bb5 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/IFrontFacingTrait.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/IFrontFacingTrait.java @@ -9,6 +9,7 @@ public interface IFrontFacingTrait { /** * Returns if a machine can be rotated to be facing the given direction. + * * @param direction The direction to check * @return If the provided direction is a valid facing direction */ diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/IInteractionTrait.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/IInteractionTrait.java index 819fd16f753..d5ae3ed82b8 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/IInteractionTrait.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/IInteractionTrait.java @@ -6,9 +6,9 @@ import net.minecraft.core.Direction; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; import com.mojang.datafixers.util.Pair; -import net.minecraft.world.entity.player.Player; import org.jetbrains.annotations.Nullable; import javax.annotation.ParametersAreNonnullByDefault; @@ -36,7 +36,8 @@ default InteractionResult onUse(ExtendedUseOnContext context) { * @param context The context of this interaction. * @return A pair containing the type of the tool (if the interaction was successful), and the result of the * interaction. - * {@link InteractionResult#sidedSuccess(boolean)} will play the tool sound (based on the first element of the pair) and consume + * {@link InteractionResult#sidedSuccess(boolean)} will play the tool sound (based on the first element of + * the pair) and consume * durability. */ default Pair<@Nullable GTToolType, InteractionResult> onToolClick(ExtendedUseOnContext context) { @@ -47,12 +48,11 @@ default InteractionResult onUse(ExtendedUseOnContext context) { * Called when a machine is left clicked. * * @param player Player that clicked - * @param hand Player hand - * @param face Clicked face + * @param hand Player hand + * @param face Clicked face * @return true to cancel the click event, false to continue processing */ default boolean onLeftClick(Player player, InteractionHand hand, @Nullable Direction face) { return false; } - } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/IRenderingTrait.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/IRenderingTrait.java index 7cf4dc8f09a..6a2dc1a9296 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/IRenderingTrait.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/IRenderingTrait.java @@ -14,8 +14,6 @@ import java.util.Set; -import javax.annotation.ParametersAreNonnullByDefault; - /** * A machine trait that overrides some of the default machine rendering behaviour. */ @@ -23,10 +21,11 @@ public interface IRenderingTrait { /** * Called to determine if the grid overlay should be rendered on this machine. - * @param player Player looking at this machine - * @param pos Block pos - * @param state Block state - * @param held Item that player is holding + * + * @param player Player looking at this machine + * @param pos Block pos + * @param state Block state + * @param held Item that player is holding * @param toolTypes The GT tool types of the held item, if any * @return If the grid overlay should be drawn on the machine. */ @@ -38,11 +37,12 @@ default boolean shouldRenderGridOverlay(Player player, BlockPos pos, BlockState /** * Called when the machine grid overlay is being rendered to determine the icon to be rendered within the grid * segment on a specifc side. - * @param player Player looking at this machine - * @param pos Block pos - * @param state Block state + * + * @param player Player looking at this machine + * @param pos Block pos + * @param state Block state * @param toolTypes The GT tool types of the held item, if any - * @param side The machine side which this grid segment correspond to + * @param side The machine side which this grid segment correspond to * @return The icon to be rendered, or null */ default @Nullable ResourceTexture getGridOverlayIcon(Player player, BlockPos pos, BlockState state, diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/package-info.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/package-info.java index 6be50283636..678ae8f66f5 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/package-info.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/package-info.java @@ -1,4 +1,4 @@ @NotNullByDefault package com.gregtechceu.gtceu.api.machine.trait.feature; -import org.jetbrains.annotations.NotNullByDefault; \ No newline at end of file +import org.jetbrains.annotations.NotNullByDefault; diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/voiding/FluidVoidingCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/voiding/FluidVoidingCover.java index df5cadf3a74..4eec280e777 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/voiding/FluidVoidingCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/voiding/FluidVoidingCover.java @@ -21,7 +21,6 @@ import net.minecraft.network.chat.Component; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.state.BlockState; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.capability.IFluidHandler; From 7eca98b11b9eee5a34e4154d0b320681a9d23504 Mon Sep 17 00:00:00 2001 From: Gustavo Date: Sat, 18 Apr 2026 23:07:22 +1000 Subject: [PATCH 19/21] more docs --- .../content/Development/External-Resources.md | 8 -- .../Energy-Fluid-Item-Storage.md | 62 +--------- .../Development/General-Topics/Global-Data.md | 30 ----- .../General-Topics/Machine-Trait-System.md | 107 ++++++++++++++++++ docs/content/Development/index.md | 6 - docs/content/Modpacks/Changes/v8.0.0.md | 42 +------ .../gtceu/api/machine/MetaMachine.java | 59 ++++++++-- .../trait/feature/IRedstoneSignalTrait.java | 48 ++++++++ 8 files changed, 210 insertions(+), 152 deletions(-) create mode 100644 docs/content/Development/General-Topics/Machine-Trait-System.md create mode 100644 src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/IRedstoneSignalTrait.java diff --git a/docs/content/Development/External-Resources.md b/docs/content/Development/External-Resources.md index 46907c07632..208d15c04f0 100644 --- a/docs/content/Development/External-Resources.md +++ b/docs/content/Development/External-Resources.md @@ -21,14 +21,6 @@ as other resources you might find helpful. - [MCJty's Modding Wiki](https://www.mcjty.eu/docs/intro) -## LDLib - -LDLib is the main library we're using for GTCEu-Modern. - -!!! link "LDLib Docs" - [:material-github: LDLib-Architectury :material-arrow-right: Wiki](https://github.com/Low-Drag-MC/LDLib-Architectury/wiki) - - ## Mixins !!! link "Overview on using Mixins" diff --git a/docs/content/Development/General-Topics/Energy-Fluid-Item-Storage.md b/docs/content/Development/General-Topics/Energy-Fluid-Item-Storage.md index b478d3a3f19..e870f1ef51a 100644 --- a/docs/content/Development/General-Topics/Energy-Fluid-Item-Storage.md +++ b/docs/content/Development/General-Topics/Energy-Fluid-Item-Storage.md @@ -7,8 +7,7 @@ title: Item/Fluid/Energy Storage !!! note - In general, these containers should be created as `final` fields (that's what we need for the - [SyncData](../SyncData/index.md) system). + In general, these containers should be created as `final` fields. Set their base arguments in the constructor (you can pass args for subclasses to modify). @@ -47,7 +46,6 @@ To do so, use either of the following interfaces: - `IFluidTransfer` - `IEnergyContainer` - ## Specialized proxy implementations In case you have special requirements to your containers, you may be able to use one of these implementations in @@ -61,67 +59,9 @@ They generally act as a proxy to the underlying container(s), while also handlin - `FluidTransferList` - `EnergyContainerList` - ### IO-specific container proxies For proxying multiple containers, limited to a specific IO direction. - `IOItemTransferList` - `IOFluidTransferList` - - -### Rate-Limited proxies - -!!! warning inline end "Not merged yet
_Branch: `mi-ender-link`_" - -If you need to proxy any item or fluid container that needs to be rate limited for insertion and extraction, you can -use either of the following classes: - -- `LimitingItemTransferProxy` -- `LimitingFluidTransferProxy` - -The transfer limit passed as a constructor parameter will not renew automatically. Your container will therefore stop -transferring anything once this limit is reached. - -If you want to make this a rate limit instead, you will have to schedule a task that regularly resets the transfer -limit to the maximum value for your task's interval: - -??? example "Example Usage" - - ```java - public class MyCover extends CoverBehavior { - private LimitingFluidTransferProxy transferProxy; - private ConditionalSubscriptionHandler rateLimitSubscription; - - public MyCover(IFluidTransfer myFluidTransfer) { - super(/* ... */); - - transferProxy = new LimitingFluidTransferProxy( - myFluidTransfer, - 0L // Initial limit of 0, will be updated regularly in isRateLimitRefreshActive() - ); - rateLimitSubscription = new ConditionalSubscriptionHandler( - this, - this::resetTransferRateLimit, - this::isRateLimitRefreshActive - ); - } - - @Override - public void onLoad() { - super.onLoad(); - rateLimitSubscription.initialize(coverHolder.getLevel()); - } - - private void resetTransferRateLimit() { - if (transferProxy == null) - return; - - transferProxy.setRemainingTransfer(transferRate.getMilliBuckets() * 20); - } - - private boolean isRateLimitRefreshActive() { - // ... - } - } - ``` \ No newline at end of file diff --git a/docs/content/Development/General-Topics/Global-Data.md b/docs/content/Development/General-Topics/Global-Data.md index 0d40830191f..a8793d29465 100644 --- a/docs/content/Development/General-Topics/Global-Data.md +++ b/docs/content/Development/General-Topics/Global-Data.md @@ -9,33 +9,3 @@ In certain cases (e.g. in a cache that holds all currently loaded instances of a in a global (static and mutable) variable. When doing so, you need to ensure that remote and serverside instances don't get mixed up. - - -## Using `SideLocal` - -!!! warning inline end "Not yet merged
_Branch: `mi-ender-link`_" - -To make working with this requirement easier, You can use `SideLocal` to store your global data. -It is similar to Java's `ThreadLocal`, but operates on the game's sides instead. - -If you are currently on the remote side (`GTCEuAPI.isClientThread()` / on the client's `main` thread), it will return the -remote side's instance of your data. Otherwise, you will get the server side's instance. - -??? example "Example Usage" - - ```java - public class MyCache { - private static SideLocal> cache = new SideLocal<>(HashMap::new); - - public static void cacheData(UUID id, MyData data) { - cache.get().put(id, data); - } - - public static MyData getData(UUID id) { - return cache.get().get(id); - } - } - ``` - - Alternatively to passing an initializer for both instances to `SideLocal`'s constructor, you can also supply - separate instances for the remote and server side. \ No newline at end of file diff --git a/docs/content/Development/General-Topics/Machine-Trait-System.md b/docs/content/Development/General-Topics/Machine-Trait-System.md new file mode 100644 index 00000000000..fd92ff70963 --- /dev/null +++ b/docs/content/Development/General-Topics/Machine-Trait-System.md @@ -0,0 +1,107 @@ +--- +title: Machine Trait System +--- + +# Machine Trait System + +The machine trait system allows for attaching extra capabilities and behaviours to a machine by attaching traits to machine instances. Traits can listen for specific machine events, interactions, and provide capabilities, allowing for machine functionality to be implemented via a composition-based design. + +## Attaching and using machine traits + +Attaching traits must be done before machine instances are fully initialised, and are typically attached in the constructor. + +### Attaching and using traits: + +Attaching a machine trait to a machine is done with the `MetaMachine::attachTrait` and `MetaMachine::attachPersistentTrait` methods. + +When attaching traits, a `callbackPriority` value can be given. Traits with a higher priority will have their events and interactions called +first, which may prevent traits with a lower priority from handling some events. + +!!! warning + Traits must be attached to a machine instance via either `attachTrait` or `attachPersistentTrait`. + If a trait is created without either of these methods being called, the trait will not be valid. + +```java +public class CustomMachine extends MetaMachine { + + @SaveField + protected final NotifiableFluidTank tank; + + public CustomMachine(BlockEntityCreationInfo info, int capacity) { + super(info); + + // Because the tank field is annotated with `@SaveField`, the fluid tank will be saved into the machines data. + this.tank = attachTrait(new NotifiableFluidTank(1, capacity, IO.BOTH)); + + // Registers an auto output trait that provides fluid output behaviour for the given fluid tank. + // Instead of using an annotated field to save traits, they can also be registered to be saved. + // The trait save name should remain the same, otherwise the trait save data won't be loaded. + AutoOutputTrait autoOutput = attachPersistentTrait("autoOutput", AutoOutputTrait.ofFluids(tank)); + + autoOutput.setFluidOutputDirection(Direction.DOWN); + autoOutput.setFluidOutputDirectionValidator(d -> d == Direction.DOWN); + } + + public void usingTraits() { + MetaMachine machine = getMachine(); + + // Most trait objects have a `TYPE` static field, it can be used to get traits with a specific type. + AutoOutputTrait autoOutputTrait = machine.getTrait(AutoOutputTrait.TYPE); + Optional recipeLogicOptional = machine.getTrait(RecipeLogic.TYPE); + + // Gets all traits with the specified type. + List allItemStackHandlers = machine.getTraits(NotifiableItemStackHandler.TYPE); + + List allTraits = machine.getAllTraits(); + } +} +``` + +### Creating custom traits + +Custom machine traits are created by extending `MachineTrait` or `MultiblockMachineTrait` + +Machine traits have access to a number of machine events and callbacks, but some extra behaviours can be added by having a trait implement a trait feature interface. For example, `IInteractionTrait` to add custom interaction behaviour. The full list of trait features is in `api/machine/trait/feature`. + +```java +public class CustomMachineTrait extends MachineTrait implements IInteractionTrait { + + // Machine traits should have a type object defined, unless a parent class of this machine trait already defines a type + public static final MachineTraitType TYPE = new MachineTraitType<>(CustomMachineTrait.class); + + public CustomMachineTrait() { + + } + + // Machine traits must also define a getter for the trait type + @Override + public MachineTraitType getType() { + return TYPE; + } + + // A list of classes or interfaces which a machine must be in order for this trait to be attached. + // A machine trait must be at least one of these interfaces/classes. + // By default, traits can be attached to any machine. + @Override + protected List> validMachineClasses() { + return List.of(CustomMachine.class); + } + + // An example of a machine trait event callback. + // Traits with a higher trait priority will have their events called first, + // which may block lower priority traits from receiving events. + // All traits default to a priority of 1. + @Override + public Pair<@Nullable GTToolType, InteractionResult> onToolClick(ExtendedUseOnContext context) { + var toolType = context.getToolType(); + if (toolType.contains(GTToolType.WRENCH)) { + return Pair.of(GTToolType.WRENCH, onWrenchClick(context)); + } + return IInteractionTrait.super.onToolClick(context); + } + + private InteractionResult onWrenchClick(ExtendedUseOnContext context) { + return InteractionResult.PASS; + } +} +``` \ No newline at end of file diff --git a/docs/content/Development/index.md b/docs/content/Development/index.md index 796b0d5f656..6b81b32039e 100644 --- a/docs/content/Development/index.md +++ b/docs/content/Development/index.md @@ -10,12 +10,6 @@ pull request with your changes. The following pages describe a few important concepts that you will likely run into when working with our codebase. -!!! link "LDLib Docs" - [:material-github: LDLib-Architectury :material-arrow-right: Wiki](https://github.com/Low-Drag-MC/LDLib-Architectury/wiki) - - This mod is based on the LDLib library for a lot of comminly used functionalities. - Please refer to its documentation as well. - !!! link "Architectury Gradle Plugin" [Architectury-Wiki :material-arrow-right: Gradle Plugin](https://docs.architectury.dev/plugin/introduction) diff --git a/docs/content/Modpacks/Changes/v8.0.0.md b/docs/content/Modpacks/Changes/v8.0.0.md index b97deff01e5..fc7c33f8651 100644 --- a/docs/content/Modpacks/Changes/v8.0.0.md +++ b/docs/content/Modpacks/Changes/v8.0.0.md @@ -66,6 +66,8 @@ Machine interactions have been split into two methods: `MetaMachine::onUse` and A new system for attaching traits and custom behaviour to machines has been added, and many machine interfaces and traits now use this new system. +See [this page](../../Development/General-Topics/Machine-Trait-System.md) for an overview of the new system. + ### Machine constructor and trait initialisation changes The constructors for a large number of machines have changed in order to simply machine instance creation. Additionally, methods for trait creation have also been removed and now form part of the machine constructor. @@ -90,8 +92,6 @@ The constructors for a large number of machines have changed in order to simply - Removed `createRecipeLogic` method - Constructor now has an optional `Supplier` argument, defaults to the standard `RecipeLogic` class -### New System Example - #### IMPORTANT MIGRATION NOTE: Traits must be attached to a machine directly by calling `attachTrait(MachineTrait trait)` on the trait being attached. @@ -105,44 +105,6 @@ this.itemHandler = attachTrait(new NotifiableItemStackHandler(0, IO.BOTH)) ``` When migrating, remove the `this` argument from the machine trait constructor and instead attach the trait. -Example of the new `AutoOutputTrait` - -```java -public class CustomDrumMachine extends MetaMachine { - - protected final NotifiableFluidTank tank; - public final AutoOutputTrait autoOutput; - - public DrumMachine(BlockEntityCreationInfo info, int capacity) { - super(info); - - // Traits must be attached in the constructor. - - this.tank = attachTrait(new NotifiableFluidTank(1, capacity, IO.BOTH)); - - // Registers an auto output trait that provides fluid output behaviour for the given fluid tank. - this.autoOutput = attachTrait(AutoOutputTrait.ofFluids(tank)); - - autoOutput.setFluidOutputDirection(Direction.DOWN); - autoOutput.setFluidOutputDirectionValidator(d -> d == Direction.DOWN); - } - - // Any code can query traits from a machine - public static void queryTraits(MetaMachine machine) { - - // Returns a trait with the given type, or null. - AutoOutputTrait autoOutputTrait = machine.getTraitHolder().getTrait(AutoOutputTrait.TYPE); - - Optional recipeLogicOptional = machine.getTraitHolder().getTrait(RecipeLogic.TYPE); - - // Gets all traits with the specified type. - List allItemStackHandlers = machine.getTraitHolder().getTraits(NotifiableItemStackHandler.TYPE); - - } -} -``` - - ### Removed interfaces A large number of machine feature interfaces have been removed, and have had their functionality merged into the standard MetaMachine class, or now use the new machine trait system: 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 378bb3ab1ec..7a011bb3c71 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java @@ -26,6 +26,7 @@ import com.gregtechceu.gtceu.api.machine.trait.MachineTraitType; 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.IRedstoneSignalTrait; import com.gregtechceu.gtceu.api.machine.trait.feature.IRenderingTrait; import com.gregtechceu.gtceu.api.misc.*; import com.gregtechceu.gtceu.api.pattern.util.RelativeDirection; @@ -314,9 +315,26 @@ public T attachTrait(T trait, int callbackPriority) { * @param traitName Unique identifier for this trait. * @param trait The trait to register */ - public void attachPersistentTrait(String traitName, MachineTrait trait) { + public T attachPersistentTrait(String traitName, T trait) { traitHolder.attachTrait(trait); traitHolder.registerPersistentTrait(traitName, trait); + return trait; + } + + /** + * Registers a trait with data to be saved or synced to the client. + * Do not register a persistent trait and also store that trait as a syncable machine field, otherwise the trait + * data will be duplicated. Use only one sync method. + * + * @param traitName Unique identifier for this trait. + * @param callbackPriority The trait's callback priority. Traits with a higher priority will have their events fired + * first, which may prevent traits with a lower priority from handling some events. + * @param trait The trait to register + */ + public T attachPersistentTrait(String traitName, T trait, int callbackPriority) { + traitHolder.attachTrait(trait, callbackPriority); + traitHolder.registerPersistentTrait(traitName, trait); + return trait; } /** @@ -879,9 +897,17 @@ public int getOutputSignal(@Nullable Direction side) { // For some reason, Minecraft requests the output signal from the opposite side... CoverBehavior cover = getCoverContainer().getCoverAtSide(side.getOpposite()); - if (cover == null) return 0; - return cover.getRedstoneSignalOutput(); + if (cover != null) return cover.getRedstoneSignalOutput(); + + var signal = 0; + for (var trait : getAllTraits()) { + if (trait instanceof IRedstoneSignalTrait redstoneSignalTrait) { + signal = Math.max(signal, redstoneSignalTrait.getOutputSignal(side)); + } + } + + return signal; } /** @@ -891,7 +917,14 @@ public int getOutputSignal(@Nullable Direction side) { * @return Direct output signal */ public int getOutputDirectSignal(@Nullable Direction side) { - return 0; + var signal = 0; + for (var trait : getAllTraits()) { + if (trait instanceof IRedstoneSignalTrait redstoneSignalTrait) { + signal = Math.max(signal, redstoneSignalTrait.getOutputDirectSignal(side)); + } + } + + return signal; } /** @@ -900,7 +933,14 @@ public int getOutputDirectSignal(@Nullable Direction side) { * @return Analog output signal. */ public int getAnalogOutputSignal() { - return 0; + var signal = 0; + for (var trait : getAllTraits()) { + if (trait instanceof IRedstoneSignalTrait redstoneSignalTrait) { + signal = Math.max(signal, redstoneSignalTrait.getAnalogOutputSignal()); + } + } + + return signal; } /** @@ -911,9 +951,14 @@ public int getAnalogOutputSignal() { */ public boolean canConnectRedstone(Direction side) { CoverBehavior cover = getCoverContainer().getCoverAtSide(side); - if (cover == null) return false; + if (cover != null) return cover.canConnectRedstone(); - return cover.canConnectRedstone(); + for (var trait : getAllTraits()) { + if (trait instanceof IRedstoneSignalTrait redstoneSignalTrait) { + if (redstoneSignalTrait.canConnectRedstone(side)) return true; + } + } + return false; } ////////////////////////////////////// diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/IRedstoneSignalTrait.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/IRedstoneSignalTrait.java new file mode 100644 index 00000000000..0a6698c59ce --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/IRedstoneSignalTrait.java @@ -0,0 +1,48 @@ +package com.gregtechceu.gtceu.api.machine.trait.feature; + +import net.minecraft.core.Direction; + +import org.jetbrains.annotations.Nullable; + +// Trait for adding custom redstone signal outputs +public interface IRedstoneSignalTrait { + + /** + * Gets the redstone output signal at a specific side + * + * @param side Side + * @return Output signal + */ + default int getOutputSignal(@Nullable Direction side) { + return 0; + } + + /** + * Gets the direct output signal at a specific side + * + * @param side Side + * @return Direct output signal + */ + default int getOutputDirectSignal(@Nullable Direction side) { + return 0; + } + + /** + * Gets the analog (comparator) output signal + * + * @return Analog output signal. + */ + default int getAnalogOutputSignal() { + return 0; + } + + /** + * Returns if redstone can be connected to a specific side of this machine + * + * @param side The side to check + * @return If redstone can be connected + */ + default boolean canConnectRedstone(Direction side) { + return false; + } +} From 8a44f4b651434f0b2aacd93e456f9964da28a997 Mon Sep 17 00:00:00 2001 From: Gustavo Date: Sun, 19 Apr 2026 12:24:48 +1000 Subject: [PATCH 20/21] small docs changes --- .../gregtechceu/gtceu/api/machine/trait/MachineTrait.java | 5 +++-- .../machine/trait/multiblock/MultiblockMachineTrait.java | 8 ++++++++ 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTrait.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTrait.java index 7722ed34794..f88f678ca0e 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTrait.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTrait.java @@ -22,11 +22,12 @@ import java.util.function.Predicate; /** - * A machine trait represents a generic capability or behaviour that is attached to a machine.
+ * A machine trait represents a generic capability or behaviour that is attached to a machine.

* For example, machine traits may provide a recipe handler that can handle specific inputs/outputs of a recipe (e.g. * {@link NotifiableItemStackHandler} for items).
* Machine traits can also attach additional behaviours to a machine (e.g. {@link AutoOutputTrait}, - * {@link CleanroomProviderTrait}) + * {@link CleanroomProviderTrait})

+ * If a machine trait implements a capability interface, the trait will be returned by {@link MetaMachine#getCapability} if the machine trait's capability validator prediate is true for that side. */ public abstract class MachineTrait implements ISyncManaged { diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/multiblock/MultiblockMachineTrait.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/multiblock/MultiblockMachineTrait.java index 66e57b0112b..b1b26443923 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/multiblock/MultiblockMachineTrait.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/multiblock/MultiblockMachineTrait.java @@ -24,7 +24,15 @@ protected List> validMachineClasses() { return List.of(MultiblockControllerMachine.class); } + /** + * Called when the multiblock structure is formed + * @see MultiblockControllerMachine#onStructureFormed() + */ public void onStructureFormed() {} + /** + * Called when the multiblock structure becomes invalid + * @see MultiblockControllerMachine#onStructureInvalid() + */ public void onStructureInvalid() {} } From 209fb9d074dd8f369b412231173a435cbf49c742 Mon Sep 17 00:00:00 2001 From: Gustavo Date: Sun, 19 Apr 2026 18:04:18 +1000 Subject: [PATCH 21/21] spotless --- .../gtceu/api/machine/trait/MachineTrait.java | 9 ++++++--- .../machine/trait/multiblock/MultiblockMachineTrait.java | 2 ++ 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTrait.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTrait.java index f88f678ca0e..c6d8669b9b4 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTrait.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTrait.java @@ -22,12 +22,15 @@ import java.util.function.Predicate; /** - * A machine trait represents a generic capability or behaviour that is attached to a machine.

+ * A machine trait represents a generic capability or behaviour that is attached to a machine.
+ *
* For example, machine traits may provide a recipe handler that can handle specific inputs/outputs of a recipe (e.g. * {@link NotifiableItemStackHandler} for items).
* Machine traits can also attach additional behaviours to a machine (e.g. {@link AutoOutputTrait}, - * {@link CleanroomProviderTrait})

- * If a machine trait implements a capability interface, the trait will be returned by {@link MetaMachine#getCapability} if the machine trait's capability validator prediate is true for that side. + * {@link CleanroomProviderTrait})
+ *
+ * If a machine trait implements a capability interface, the trait will be returned by {@link MetaMachine#getCapability} + * if the machine trait's capability validator prediate is true for that side. */ public abstract class MachineTrait implements ISyncManaged { diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/multiblock/MultiblockMachineTrait.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/multiblock/MultiblockMachineTrait.java index b1b26443923..ebf65460b7a 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/multiblock/MultiblockMachineTrait.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/multiblock/MultiblockMachineTrait.java @@ -26,12 +26,14 @@ protected List> validMachineClasses() { /** * Called when the multiblock structure is formed + * * @see MultiblockControllerMachine#onStructureFormed() */ public void onStructureFormed() {} /** * Called when the multiblock structure becomes invalid + * * @see MultiblockControllerMachine#onStructureInvalid() */ public void onStructureInvalid() {}