From 2ae6445bfe0abc5796fe1abb96e84cc6f2fa0180 Mon Sep 17 00:00:00 2001 From: Gustavo Date: Tue, 6 Jan 2026 16:00:44 +1300 Subject: [PATCH 01/27] add trait type logic --- .../gtceu/api/machine/MetaMachine.java | 78 +++++++++++++------ .../api/machine/WorkableTieredMachine.java | 2 +- .../api/machine/feature/IFancyUIMachine.java | 2 +- .../multiblock/WorkableMultiblockMachine.java | 2 +- .../part/MultiblockPartMachine.java | 2 +- .../machine/steam/SteamWorkableMachine.java | 2 +- .../machine/trait/FluidTankProxyTrait.java | 7 ++ .../machine/trait/ItemHandlerProxyTrait.java | 7 ++ .../gtceu/api/machine/trait/MachineTrait.java | 22 ++++-- .../trait/NotifiableComputationContainer.java | 13 +++- .../trait/NotifiableEnergyContainer.java | 7 ++ .../machine/trait/NotifiableFluidTank.java | 7 ++ .../trait/NotifiableItemStackHandler.java | 7 ++ .../trait/NotifiableLaserContainer.java | 7 ++ .../gtceu/api/machine/trait/RecipeLogic.java | 7 ++ .../machine/storage/QuantumChestMachine.java | 8 ++ .../machine/storage/QuantumTankMachine.java | 7 ++ .../common/machine/trait/ConverterTrait.java | 7 ++ .../recipe/condition/EUToStartCondition.java | 2 +- .../ae2/machine/trait/GridNodeHolder.java | 7 ++ .../ae2/machine/trait/GridNodeHostTrait.java | 7 ++ .../machine/trait/ProxySlotRecipeHandler.java | 19 ++++- 22 files changed, 186 insertions(+), 43 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 2c649eadd96..205f8e01637 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java @@ -45,6 +45,8 @@ import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; import com.lowdragmc.lowdraglib.utils.DummyWorld; +import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; +import it.unimi.dsi.fastutil.objects.ObjectArrayList; import net.minecraft.ChatFormatting; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.client.Minecraft; @@ -131,8 +133,6 @@ public class MetaMachine extends ManagedSyncBlockEntity implements IGregtechBloc @RerenderOnChanged private int paintingColor = -1; - @Getter - protected final List traits; @Getter @SaveField @@ -149,7 +149,8 @@ public MetaMachine(BlockEntityCreationInfo info) { super(info); this.renderState = getDefinition().defaultRenderState(); this.coverContainer = new MachineCoverContainer(this); - this.traits = new ArrayList<>(); + this.traits = new ObjectArrayList<>(); + this.traitsByType = new Object2ObjectOpenHashMap<>(); this.serverTicks = new ArrayList<>(); this.waitingToAdd = new ArrayList<>(); } @@ -215,6 +216,40 @@ public void onUnload() { serverTicks.clear(); } + ////////////////////////////////////// + // ***** Traits ****// + ////////////////////////////////////// + + private final List traits; + private final Map, List> traitsByType; + + public List getAllTraits() { + return Collections.unmodifiableList(traits); + } + + public void attachTrait(MachineTrait trait) { + traitsByType.computeIfAbsent(trait.getTraitType(), $ -> new ObjectArrayList<>()); + if (!trait.getTraitType().allowMultiplePerMachine && traitsByType.get(trait.getTraitType()).size() == 1) { + throw new IllegalArgumentException("Attempted to add multiple traits of type: " + trait.getClass()); + } + traits.add(trait); + traitsByType.get(trait.getTraitType()).add(trait); + } + + // Gets the first trait with the specified type. + public @Nullable T getTrait(MachineTrait.TraitType type) { + traitsByType.computeIfAbsent(type, $ -> new ObjectArrayList<>()); + List traitList = traitsByType.get(type); + if (traitList.isEmpty()) return null; + return type.traitCls.cast(traitList.get(0)); + } + + @SuppressWarnings("unchecked") + public List getTraits(MachineTrait.TraitType type) { + return (List) traitsByType.computeIfAbsent(type, $ -> new ObjectArrayList<>()); + } + + ////////////////////////////////////// // ***** Tickable Manager ****// ////////////////////////////////////// @@ -500,13 +535,6 @@ public void setPaintingColor(int color) { public void onPaintingColorChanged(int color) {} - /** - * All traits should be initialized while MetaMachine is creating. you cannot add them on the fly. - */ - public void attachTraits(MachineTrait trait) { - traits.add(trait); - } - public void clearInventory(IItemHandlerModifiable inventory) { for (int i = 0; i < inventory.getSlots(); i++) { ItemStack stackInSlot = inventory.getStackInSlot(i); @@ -703,7 +731,7 @@ public BlockState getBlockAppearance(BlockState state, BlockAndTintGetter level, @MustBeInvokedByOverriders public void updateModelData(ModelData.Builder builder) { - for (MachineTrait trait : this.getTraits()) { + for (MachineTrait trait : this.getAllTraits()) { trait.updateModelData(builder); } } @@ -852,7 +880,7 @@ public Predicate getFluidCapFilter(@Nullable Direction side, IO io) @Nullable public IItemHandlerModifiable getItemHandlerCap(@Nullable Direction side, boolean useCoverCapability) { - var list = getTraits().stream() + var list = getAllTraits().stream() .filter(IItemHandlerModifiable.class::isInstance) .filter(t -> t.hasCapability(side)) .map(IItemHandlerModifiable.class::cast) @@ -876,7 +904,7 @@ public IItemHandlerModifiable getItemHandlerCap(@Nullable Direction side, boolea @Nullable public IFluidHandlerModifiable getFluidHandlerCap(@Nullable Direction side, boolean useCoverCapability) { - var list = getTraits().stream() + var list = getAllTraits().stream() .filter(IFluidHandler.class::isInstance) .filter(t -> t.hasCapability(side)) .map(IFluidHandler.class::cast) @@ -926,7 +954,7 @@ private static List getCapabilitiesFromTraits(List traits, if (machine instanceof IWorkable workable) { return GTCapability.CAPABILITY_WORKABLE.orEmpty(cap, LazyOptional.of(() -> workable)); } - for (MachineTrait trait : machine.getTraits()) { + for (MachineTrait trait : machine.getAllTraits()) { if (trait instanceof IWorkable workable) { return GTCapability.CAPABILITY_WORKABLE.orEmpty(cap, LazyOptional.of(() -> workable)); } @@ -935,13 +963,13 @@ private static List getCapabilitiesFromTraits(List traits, if (machine instanceof IControllable controllable) { return GTCapability.CAPABILITY_CONTROLLABLE.orEmpty(cap, LazyOptional.of(() -> controllable)); } - for (MachineTrait trait : machine.getTraits()) { + for (MachineTrait trait : machine.getAllTraits()) { if (trait instanceof IControllable controllable) { return GTCapability.CAPABILITY_CONTROLLABLE.orEmpty(cap, LazyOptional.of(() -> controllable)); } } } else if (cap == GTCapability.CAPABILITY_RECIPE_LOGIC) { - for (MachineTrait trait : machine.getTraits()) { + for (MachineTrait trait : machine.getAllTraits()) { if (trait instanceof RecipeLogic recipeLogic) { return GTCapability.CAPABILITY_RECIPE_LOGIC.orEmpty(cap, LazyOptional.of(() -> recipeLogic)); } @@ -950,7 +978,7 @@ private static List getCapabilitiesFromTraits(List traits, if (machine instanceof IEnergyContainer energyContainer) { return GTCapability.CAPABILITY_ENERGY_CONTAINER.orEmpty(cap, LazyOptional.of(() -> energyContainer)); } - var list = getCapabilitiesFromTraits(machine.getTraits(), side, IEnergyContainer.class); + var list = getCapabilitiesFromTraits(machine.getAllTraits(), side, IEnergyContainer.class); if (!list.isEmpty()) { return GTCapability.CAPABILITY_ENERGY_CONTAINER.orEmpty(cap, LazyOptional.of(() -> list.size() == 1 ? list.get(0) : new EnergyContainerList(list))); @@ -960,7 +988,7 @@ private static List getCapabilitiesFromTraits(List traits, return GTCapability.CAPABILITY_ENERGY_INFO_PROVIDER.orEmpty(cap, LazyOptional.of(() -> energyInfoProvider)); } - var list = getCapabilitiesFromTraits(machine.getTraits(), side, IEnergyInfoProvider.class); + var list = getCapabilitiesFromTraits(machine.getAllTraits(), side, IEnergyInfoProvider.class); if (!list.isEmpty()) { return GTCapability.CAPABILITY_ENERGY_INFO_PROVIDER.orEmpty(cap, LazyOptional.of(() -> list.size() == 1 ? list.get(0) : new EnergyInfoProviderList(list))); @@ -994,7 +1022,7 @@ private static List getCapabilitiesFromTraits(List traits, if (machine instanceof IEnergyStorage energyStorage) { return ForgeCapabilities.ENERGY.orEmpty(cap, LazyOptional.of(() -> energyStorage)); } - var list = getCapabilitiesFromTraits(machine.getTraits(), side, IEnergyStorage.class); + var list = getCapabilitiesFromTraits(machine.getAllTraits(), side, IEnergyStorage.class); if (!list.isEmpty()) { // TODO wrap list in the future return ForgeCapabilities.ENERGY.orEmpty(cap, LazyOptional.of(() -> list.get(0))); @@ -1003,7 +1031,7 @@ private static List getCapabilitiesFromTraits(List traits, if (machine instanceof ILaserContainer energyContainer) { return GTCapability.CAPABILITY_LASER.orEmpty(cap, LazyOptional.of(() -> energyContainer)); } - var list = getCapabilitiesFromTraits(machine.getTraits(), side, ILaserContainer.class); + var list = getCapabilitiesFromTraits(machine.getAllTraits(), side, ILaserContainer.class); if (!list.isEmpty()) { return GTCapability.CAPABILITY_LASER.orEmpty(cap, LazyOptional.of(() -> list.size() == 1 ? list.get(0) : new LaserContainerList(list))); @@ -1013,7 +1041,7 @@ private static List getCapabilitiesFromTraits(List traits, return GTCapability.CAPABILITY_COMPUTATION_PROVIDER.orEmpty(cap, LazyOptional.of(() -> computationProvider)); } - var list = getCapabilitiesFromTraits(machine.getTraits(), side, IOpticalComputationProvider.class); + var list = getCapabilitiesFromTraits(machine.getAllTraits(), side, IOpticalComputationProvider.class); if (!list.isEmpty()) { return GTCapability.CAPABILITY_COMPUTATION_PROVIDER.orEmpty(cap, LazyOptional.of(() -> list.get(0))); } @@ -1021,7 +1049,7 @@ private static List getCapabilitiesFromTraits(List traits, if (machine instanceof IDataAccessHatch computationProvider) { return GTCapability.CAPABILITY_DATA_ACCESS.orEmpty(cap, LazyOptional.of(() -> computationProvider)); } - var list = getCapabilitiesFromTraits(machine.getTraits(), side, IDataAccessHatch.class); + var list = getCapabilitiesFromTraits(machine.getAllTraits(), side, IDataAccessHatch.class); if (!list.isEmpty()) { return GTCapability.CAPABILITY_DATA_ACCESS.orEmpty(cap, LazyOptional.of(() -> list.get(0))); } @@ -1029,7 +1057,7 @@ private static List getCapabilitiesFromTraits(List traits, if (machine instanceof IMonitorComponent monitorComponent) { return GTCapability.CAPABILITY_MONITOR_COMPONENT.orEmpty(cap, LazyOptional.of(() -> monitorComponent)); } - var list = getCapabilitiesFromTraits(machine.getTraits(), side, IMonitorComponent.class); + var list = getCapabilitiesFromTraits(machine.getAllTraits(), side, IMonitorComponent.class); if (!list.isEmpty()) { return GTCapability.CAPABILITY_MONITOR_COMPONENT.orEmpty(cap, LazyOptional.of(() -> list.get(0))); } @@ -1037,7 +1065,7 @@ private static List getCapabilitiesFromTraits(List traits, if (machine instanceof ICentralMonitor centralMonitor) { return GTCapability.CAPABILITY_CENTRAL_MONITOR.orEmpty(cap, LazyOptional.of(() -> centralMonitor)); } - var list = getCapabilitiesFromTraits(machine.getTraits(), side, ICentralMonitor.class); + var list = getCapabilitiesFromTraits(machine.getAllTraits(), side, ICentralMonitor.class); if (!list.isEmpty()) { return GTCapability.CAPABILITY_CENTRAL_MONITOR.orEmpty(cap, LazyOptional.of(() -> list.get(0))); } @@ -1060,7 +1088,7 @@ public static LazyOptional getGridNodeHostCapability(Capability cap, MetaM if (machine instanceof IInWorldGridNodeHost nodeHost) { return Capabilities.IN_WORLD_GRID_NODE_HOST.orEmpty(cap, LazyOptional.of(() -> nodeHost)); } - var list = getCapabilitiesFromTraits(machine.getTraits(), side, IInWorldGridNodeHost.class); + var list = getCapabilitiesFromTraits(machine.getAllTraits(), side, IInWorldGridNodeHost.class); if (!list.isEmpty()) { // TODO wrap list in the future (or not.) return Capabilities.IN_WORLD_GRID_NODE_HOST.orEmpty(cap, LazyOptional.of(() -> list.get(0))); 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 5e7d723a943..63cdda8eed4 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/WorkableTieredMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/WorkableTieredMachine.java @@ -117,7 +117,7 @@ public void onLoad() { // attach self traits Map>> ioTraits = new EnumMap<>(IO.class); - for (MachineTrait trait : getTraits()) { + for (MachineTrait trait : getAllTraits()) { if (trait instanceof IRecipeHandlerTrait handlerTrait) { ioTraits.computeIfAbsent(handlerTrait.getHandlerIO(), i -> new ArrayList<>()).add(handlerTrait); } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IFancyUIMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IFancyUIMachine.java index 99d38a97cc2..56d1b2a7b18 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IFancyUIMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IFancyUIMachine.java @@ -133,7 +133,7 @@ default void attachConfigurators(ConfiguratorPanel configuratorPanel) { @Override default void attachTooltips(TooltipsPanel tooltipsPanel) { tooltipsPanel.attachTooltips(self()); - self().getTraits().stream().filter(IFancyTooltip.class::isInstance).map(IFancyTooltip.class::cast) + self().getAllTraits().stream().filter(IFancyTooltip.class::isInstance).map(IFancyTooltip.class::cast) .forEach(tooltipsPanel::attachTooltips); } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/WorkableMultiblockMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/WorkableMultiblockMachine.java index 43a14b50c53..eb06b1f5448 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/WorkableMultiblockMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/WorkableMultiblockMachine.java @@ -139,7 +139,7 @@ public void onStructureFormed() { // attach self traits Map>> ioTraits = new EnumMap<>(IO.class); - for (MachineTrait trait : getTraits()) { + for (MachineTrait trait : getAllTraits()) { if (trait instanceof IRecipeHandlerTrait handlerTrait) { ioTraits.computeIfAbsent(handlerTrait.getHandlerIO(), i -> new ArrayList<>()).add(handlerTrait); } 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 f4e4630d4da..ad8b38c19b0 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 @@ -87,7 +87,7 @@ protected RecipeHandlerList getHandlerList() { if (handlerList == null) { List> handlers = new ArrayList<>(); IO handlerIO = null; - for (var trait : traits) { + for (var trait : getAllTraits()) { if (trait instanceof IRecipeHandlerTrait rht) { if (handlerIO == null) handlerIO = rht.getHandlerIO(); handlers.add(rht); 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 144e8218a84..a035e534057 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 @@ -107,7 +107,7 @@ public void onLoad() { // attach self traits Map>> ioTraits = new Object2ObjectOpenHashMap<>(); - for (MachineTrait trait : getTraits()) { + for (MachineTrait trait : getAllTraits()) { if (trait instanceof IRecipeHandlerTrait handlerTrait) { ioTraits.computeIfAbsent(handlerTrait.getHandlerIO(), i -> new ArrayList<>()).add(handlerTrait); } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/FluidTankProxyTrait.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/FluidTankProxyTrait.java index b9fc462b299..4c0847b8180 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/FluidTankProxyTrait.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/FluidTankProxyTrait.java @@ -16,6 +16,8 @@ @Accessors(chain = true) public class FluidTankProxyTrait extends MachineTrait implements IFluidHandlerModifiable, ICapabilityTrait { + public static TraitType TYPE = new TraitType<>(FluidTankProxyTrait.class); + @Getter public final IO capabilityIO; @Setter @@ -27,6 +29,11 @@ public FluidTankProxyTrait(MetaMachine machine, IO capabilityIO) { this.capabilityIO = capabilityIO; } + @Override + public TraitType getTraitType() { + return TYPE; + } + ////////////////////////////////////// // ******* Capability ********// ////////////////////////////////////// diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/ItemHandlerProxyTrait.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/ItemHandlerProxyTrait.java index 6aab403d666..63508f93e5a 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/ItemHandlerProxyTrait.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/ItemHandlerProxyTrait.java @@ -17,6 +17,8 @@ @Accessors(chain = true) public class ItemHandlerProxyTrait extends MachineTrait implements IItemHandlerModifiable, ICapabilityTrait { + public static TraitType TYPE = new TraitType<>(ItemHandlerProxyTrait.class); + @Getter public final IO capabilityIO; @Setter @@ -29,6 +31,11 @@ public ItemHandlerProxyTrait(MetaMachine machine, IO capabilityIO) { this.capabilityIO = capabilityIO; } + @Override + public TraitType getTraitType() { + return TYPE; + } + ////////////////////////////////////// // ******* Capability ********// ////////////////////////////////////// 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 a72c7a58c62..b8a19fab787 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 @@ -14,12 +14,22 @@ import java.util.function.Predicate; -/** - * represents an abstract capability held by machine. Such as item, fluid, energy, etc. - * All trait should be added while MetaMachine is creating. you cannot modify it on the fly。 - */ public abstract class MachineTrait implements ISyncManaged { + public static class TraitType { + public final Class traitCls; + public final boolean allowMultiplePerMachine; + public TraitType(Class cls) { + traitCls = cls; + allowMultiplePerMachine = true; + } + + public TraitType(Class cls, boolean allowMultiplePerMachine) { + traitCls = cls; + this.allowMultiplePerMachine = allowMultiplePerMachine; + } + + } @Getter protected final SyncDataHolder syncDataHolder = new SyncDataHolder(this); @@ -33,9 +43,11 @@ public MachineTrait(MetaMachine machine) { this.capabilityValidator = side -> true; /// Machine should never be null, unless this trait is a recipe handler instantiated outside a machine for /// recipe search. - if (machine != null) machine.attachTraits(this); + if (machine != null) machine.attachTrait(this); } + public abstract TraitType getTraitType(); + public final boolean hasCapability(@Nullable Direction side) { return capabilityValidator.test(side); } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableComputationContainer.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableComputationContainer.java index 2ce4bbd3241..351546cc038 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableComputationContainer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableComputationContainer.java @@ -28,6 +28,8 @@ public class NotifiableComputationContainer extends NotifiableRecipeHandlerTrait implements IOpticalComputationHatch, IOpticalComputationReceiver { + public static TraitType TYPE = new TraitType<>(NotifiableComputationContainer.class); + @Getter protected IO handlerIO; @Getter @@ -44,6 +46,11 @@ public NotifiableComputationContainer(MetaMachine machine, IO handlerIO, boolean this.lastTimeStamp = Long.MIN_VALUE; } + @Override + public TraitType getTraitType() { + return TYPE; + } + @Override public int requestCWUt(int cwut, boolean simulate, @NotNull Collection seen) { var latestTimeStamp = getMachine().getOffsetTimer(); @@ -67,7 +74,7 @@ public int requestCWUt(int cwut, boolean simulate, @NotNull Collection seen) { if (controller instanceof IOpticalComputationProvider provider) { return provider.getMaxCWUt(seen); } - for (MachineTrait trait : controller.self().getTraits()) { + for (MachineTrait trait : controller.self().getAllTraits()) { if (trait instanceof IOpticalComputationProvider provider) { return provider.getMaxCWUt(seen); } @@ -154,7 +161,7 @@ public boolean canBridge(@NotNull Collection seen) if (controller instanceof IOpticalComputationProvider provider) { return provider.canBridge(seen); } - for (MachineTrait trait : controller.self().getTraits()) { + for (MachineTrait trait : controller.self().getAllTraits()) { if (trait instanceof IOpticalComputationProvider provider) { return provider.canBridge(seen); } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableEnergyContainer.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableEnergyContainer.java index d8ab29624ed..bb8bda65f74 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableEnergyContainer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableEnergyContainer.java @@ -34,6 +34,8 @@ public class NotifiableEnergyContainer extends NotifiableRecipeHandlerTrait implements IEnergyContainer { + public static TraitType TYPE = new TraitType<>(NotifiableEnergyContainer.class); + @Getter protected IO handlerIO; @Getter @@ -70,6 +72,11 @@ public NotifiableEnergyContainer(MetaMachine machine, long maxCapacity, long max this.handlerIO = (isIn && isOut) ? IO.BOTH : isIn ? IO.IN : isOut ? IO.OUT : IO.NONE; } + @Override + public TraitType getTraitType() { + return TYPE; + } + public static NotifiableEnergyContainer emitterContainer(MetaMachine machine, long maxCapacity, long maxOutputVoltage, long maxOutputAmperage) { return new NotifiableEnergyContainer(machine, maxCapacity, 0L, 0L, maxOutputVoltage, maxOutputAmperage); diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableFluidTank.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableFluidTank.java index 15b16f284d2..0dcc56bbf7f 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableFluidTank.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableFluidTank.java @@ -26,6 +26,8 @@ public class NotifiableFluidTank extends NotifiableRecipeHandlerTrait implements ICapabilityTrait, IFluidHandlerModifiable { + public static TraitType TYPE = new TraitType<>(NotifiableFluidTank.class); + @Getter public final IO handlerIO; @Getter @@ -77,6 +79,11 @@ public NotifiableFluidTank(MetaMachine machine, List storages, this(machine, storages, io, io); } + @Override + public TraitType getTraitType() { + return TYPE; + } + public void onContentsChanged() { isEmpty = null; syncDataHolder.markClientSyncFieldDirty("storages"); 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 84e4074d1eb..28063ea0d94 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 @@ -35,6 +35,8 @@ public class NotifiableItemStackHandler extends NotifiableRecipeHandlerTrait implements ICapabilityTrait, IItemHandlerModifiable { + public static TraitType TYPE = new TraitType<>(NotifiableItemStackHandler.class); + @Getter public final IO handlerIO; @Getter @@ -70,6 +72,11 @@ public NotifiableItemStackHandler setFilter(Predicate filter) { return this; } + @Override + public TraitType getTraitType() { + return TYPE; + } + public void onContentsChanged() { isEmpty = null; syncDataHolder.markClientSyncFieldDirty("storage"); 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 acba206d27e..08f258001ba 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 @@ -10,6 +10,8 @@ public class NotifiableLaserContainer extends NotifiableEnergyContainer implements ILaserContainer { + public static TraitType TYPE = new TraitType<>(NotifiableLaserContainer.class); + public NotifiableLaserContainer(MetaMachine machine, long maxCapacity, long maxInputVoltage, long maxInputAmperage, long maxOutputVoltage, long maxOutputAmperage) { super(machine, maxCapacity, maxInputVoltage, maxInputAmperage, maxOutputVoltage, maxOutputAmperage); @@ -25,6 +27,11 @@ public static NotifiableLaserContainer receiverContainer(MetaMachine machine, lo return new NotifiableLaserContainer(machine, maxCapacity, maxInputVoltage, maxInputAmperage, 0L, 0L); } + @Override + public TraitType getTraitType() { + return TYPE; + } + @Override public void serverTick() { amps = 0; diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeLogic.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeLogic.java index bd16dbfd7f3..bc2ceeb3bef 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeLogic.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeLogic.java @@ -45,6 +45,8 @@ public class RecipeLogic extends MachineTrait implements IWorkable, IFancyTooltip { + public static TraitType TYPE = new TraitType<>(RecipeLogic.class, false); + public enum Status implements StringRepresentable { IDLE("idle"), @@ -60,6 +62,11 @@ public enum Status implements StringRepresentable { } } + @Override + public final TraitType getTraitType() { + return TYPE; + } + public static final EnumProperty STATUS_PROPERTY = GTMachineModelProperties.RECIPE_LOGIC_STATUS; public final IRecipeLogicMachine machine; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumChestMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumChestMachine.java index 6c8169ce664..db16da4c7b0 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumChestMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumChestMachine.java @@ -16,6 +16,7 @@ import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine; import com.gregtechceu.gtceu.api.machine.feature.IInteractedMachine; import com.gregtechceu.gtceu.api.machine.trait.MachineTrait; +import com.gregtechceu.gtceu.api.machine.trait.MachineTraitType; import com.gregtechceu.gtceu.api.transfer.fluid.IFluidHandlerModifiable; import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; @@ -441,6 +442,8 @@ public Widget createUIWidget() { protected class ItemCache extends MachineTrait implements IItemHandlerModifiable { + public static TraitType TYPE = new TraitType<>(ItemCache.class); + private final Predicate filter = i -> !isLocked() || GTUtil.isSameItemSameTags(i, getLockedItem()); @@ -448,6 +451,11 @@ public ItemCache(MetaMachine holder) { super(holder); } + @Override + public TraitType getTraitType() { + return TYPE; + } + @Override public void setStackInSlot(int index, ItemStack stack) { stored = stack.copyWithCount(1); diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumTankMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumTankMachine.java index db4825061ec..a433080f1ce 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumTankMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumTankMachine.java @@ -375,6 +375,13 @@ public Widget createUIWidget() { protected class FluidCache extends MachineTrait implements IFluidHandler { + public static MachineTrait.TraitType TYPE = new TraitType<>(FluidCache.class); + + @Override + public TraitType getTraitType() { + return TYPE; + } + private final Predicate filter = f -> !isLocked() || getLockedFluid().isFluidEqual(f); public FluidCache(MetaMachine holder) { diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/trait/ConverterTrait.java b/src/main/java/com/gregtechceu/gtceu/common/machine/trait/ConverterTrait.java index 31bda70a7d8..792c18f7a8e 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/trait/ConverterTrait.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/trait/ConverterTrait.java @@ -87,10 +87,17 @@ public void serverTick() { private class FEContainer extends MachineTrait implements IEnergyStorage { + public static TraitType TYPE = new TraitType<>(FEContainer.class); + public FEContainer(MetaMachine machine) { super(machine); } + @Override + public TraitType getTraitType() { + return TYPE; + } + @Override public int receiveEnergy(int maxReceive, boolean simulate) { if (!feToEu || maxReceive <= 0) return 0; diff --git a/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/EUToStartCondition.java b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/EUToStartCondition.java index 27d05a53645..80e809f0c50 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/EUToStartCondition.java +++ b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/EUToStartCondition.java @@ -46,7 +46,7 @@ public Component getTooltips() { @Override public boolean testCondition(@NotNull GTRecipe recipe, @NotNull RecipeLogic recipeLogic) { - return recipeLogic.getMachine().getTraits().stream().filter(IEnergyContainer.class::isInstance) + return recipeLogic.getMachine().getAllTraits().stream().filter(IEnergyContainer.class::isInstance) .anyMatch(energyContainer -> ((IEnergyContainer) energyContainer).getEnergyCapacity() > euToStart); } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/GridNodeHolder.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/GridNodeHolder.java index dba156b9d10..33a07814502 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/GridNodeHolder.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/GridNodeHolder.java @@ -23,6 +23,8 @@ */ public class GridNodeHolder extends MachineTrait { + public static TraitType TYPE = new TraitType<>(GridNodeHolder.class); + @Getter @SaveField protected final SerializableManagedGridNode mainNode; @@ -32,6 +34,11 @@ public GridNodeHolder(IGridConnectedMachine machine) { this.mainNode = createManagedNode(); } + @Override + public TraitType getTraitType() { + return TYPE; + } + protected SerializableManagedGridNode createManagedNode() { var node = (SerializableManagedGridNode) new SerializableManagedGridNode((IGridConnectedBlockEntity) machine, BlockEntityNodeListener.INSTANCE) diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/GridNodeHostTrait.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/GridNodeHostTrait.java index 7d643bbf81d..5006a1c2bec 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/GridNodeHostTrait.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/GridNodeHostTrait.java @@ -13,6 +13,8 @@ public class GridNodeHostTrait extends MachineTrait implements IGridConnectedBlockEntity { + public static TraitType TYPE = new TraitType<>(GridNodeHostTrait.class); + private final IManagedGridNode proxy; public GridNodeHostTrait(MetaMachine machine) { @@ -22,6 +24,11 @@ public GridNodeHostTrait(MetaMachine machine) { .setVisualRepresentation(machine.getDefinition().getItem()); } + @Override + public TraitType getTraitType() { + return TYPE; + } + public void init() { this.proxy.create(machine.getLevel(), machine.getBlockPos()); } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/ProxySlotRecipeHandler.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/ProxySlotRecipeHandler.java index 5696a5c16b4..934a386390b 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/ProxySlotRecipeHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/ProxySlotRecipeHandler.java @@ -2,10 +2,7 @@ import com.gregtechceu.gtceu.api.capability.recipe.*; import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.api.machine.trait.IRecipeHandlerTrait; -import com.gregtechceu.gtceu.api.machine.trait.NotifiableRecipeHandlerTrait; -import com.gregtechceu.gtceu.api.machine.trait.RecipeHandlerGroupDistinctness; -import com.gregtechceu.gtceu.api.machine.trait.RecipeHandlerList; +import com.gregtechceu.gtceu.api.machine.trait.*; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.ingredient.FluidIngredient; import com.gregtechceu.gtceu.integration.ae2.machine.MEPatternBufferPartMachine; @@ -96,6 +93,13 @@ public void setDistinct(boolean ignored, boolean notify) {} @Getter private static class ProxyItemRecipeHandler extends NotifiableRecipeHandlerTrait { + public static TraitType TYPE = new TraitType<>(ProxyItemRecipeHandler.class); + + @Override + public TraitType getTraitType() { + return TYPE; + } + private IRecipeHandlerTrait proxy = null; private ISubscription proxySub = null; @@ -151,6 +155,13 @@ public int getPriority() { @Getter private static class ProxyFluidRecipeHandler extends NotifiableRecipeHandlerTrait { + public static TraitType TYPE = new TraitType<>(ProxyFluidRecipeHandler.class); + + @Override + public TraitType getTraitType() { + return TYPE; + } + private IRecipeHandlerTrait proxy = null; private ISubscription proxySub = null; From 12d52f49f2200d200a969fa2f4c343f9f5b778bf Mon Sep 17 00:00:00 2001 From: Gustavo Date: Tue, 6 Jan 2026 16:03:37 +1300 Subject: [PATCH 02/27] add missing type param --- .../java/com/gregtechceu/gtceu/api/machine/MetaMachine.java | 2 +- .../com/gregtechceu/gtceu/api/machine/trait/RecipeLogic.java | 2 +- 2 files changed, 2 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 205f8e01637..48ca71a0c83 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java @@ -246,7 +246,7 @@ public void attachTrait(MachineTrait trait) { @SuppressWarnings("unchecked") public List getTraits(MachineTrait.TraitType type) { - return (List) traitsByType.computeIfAbsent(type, $ -> new ObjectArrayList<>()); + return (List)Collections.unmodifiableList(traitsByType.computeIfAbsent(type, $ -> new ObjectArrayList<>())); } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeLogic.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeLogic.java index bc2ceeb3bef..eca68c94f37 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeLogic.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeLogic.java @@ -63,7 +63,7 @@ public enum Status implements StringRepresentable { } @Override - public final TraitType getTraitType() { + public final TraitType getTraitType() { return TYPE; } From 68bc6799ed439909b5a20d9af727310f0da2afcb Mon Sep 17 00:00:00 2001 From: Gustavo Date: Wed, 7 Jan 2026 13:06:12 +1300 Subject: [PATCH 03/27] rename trait onMachineUnload --- .../java/com/gregtechceu/gtceu/api/machine/MetaMachine.java | 3 +-- .../com/gregtechceu/gtceu/api/machine/trait/MachineTrait.java | 2 +- .../gtceu/api/machine/trait/NotifiableEnergyContainer.java | 4 ++-- .../gtceu/integration/ae2/machine/trait/GridNodeHolder.java | 4 ++-- 4 files changed, 6 insertions(+), 7 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 48ca71a0c83..0889f4f9c56 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java @@ -21,7 +21,6 @@ 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.RecipeLogic; import com.gregtechceu.gtceu.api.misc.*; import com.gregtechceu.gtceu.api.pattern.util.RelativeDirection; import com.gregtechceu.gtceu.api.transfer.fluid.IFluidHandlerModifiable; @@ -208,7 +207,7 @@ public final void setRemoved() { @OverridingMethodsMustInvokeSuper public void onUnload() { - traits.forEach(MachineTrait::onMachineUnLoad); + traits.forEach(MachineTrait::onMachineUnload); coverContainer.onUnload(); for (TickableSubscription serverTick : serverTicks) { serverTick.unsubscribe(); 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 b8a19fab787..58b0c4c65dc 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 @@ -59,7 +59,7 @@ public void markAsChanged() { public void onMachineLoad() {} - public void onMachineUnLoad() {} + public void onMachineUnload() {} public void updateModelData(ModelData.Builder builder) {} diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableEnergyContainer.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableEnergyContainer.java index bb8bda65f74..4c8d416029a 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableEnergyContainer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableEnergyContainer.java @@ -108,8 +108,8 @@ public void onMachineLoad() { } @Override - public void onMachineUnLoad() { - super.onMachineUnLoad(); + public void onMachineUnload() { + super.onMachineUnload(); if (updateSubs != null) { updateSubs.unsubscribe(); updateSubs = null; diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/GridNodeHolder.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/GridNodeHolder.java index 33a07814502..63c031d28de 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/GridNodeHolder.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/GridNodeHolder.java @@ -66,8 +66,8 @@ public void onMachineLoad() { } @Override - public void onMachineUnLoad() { - super.onMachineUnLoad(); + public void onMachineUnload() { + super.onMachineUnload(); mainNode.destroy(); } } From 346c193f92bc32e61b3e156dee0b07cdfdfa24e5 Mon Sep 17 00:00:00 2001 From: Gustavo Date: Wed, 7 Jan 2026 15:40:17 +1300 Subject: [PATCH 04/27] change the way trait types work --- .../gtceu/api/machine/MetaMachine.java | 23 +++++++++----- .../machine/trait/FluidTankProxyTrait.java | 7 +---- .../machine/trait/ItemHandlerProxyTrait.java | 7 +---- .../gtceu/api/machine/trait/MachineTrait.java | 16 ---------- .../api/machine/trait/MachineTraitType.java | 30 +++++++++++++++++++ .../trait/NotifiableComputationContainer.java | 7 +---- .../trait/NotifiableEnergyContainer.java | 7 +---- .../machine/trait/NotifiableFluidTank.java | 7 +---- .../trait/NotifiableItemStackHandler.java | 7 +---- .../trait/NotifiableLaserContainer.java | 7 +---- .../gtceu/api/machine/trait/RecipeLogic.java | 7 +---- .../electric/PowerSubstationMachine.java | 3 ++ .../machine/storage/QuantumChestMachine.java | 7 +---- .../machine/storage/QuantumTankMachine.java | 8 ++--- .../common/machine/trait/ConverterTrait.java | 8 ++--- .../ae2/machine/trait/GridNodeHolder.java | 8 ++--- .../ae2/machine/trait/GridNodeHostTrait.java | 8 ++--- .../trait/InternalSlotRecipeHandler.java | 6 ++++ .../machine/trait/ProxySlotRecipeHandler.java | 14 ++------- 19 files changed, 73 insertions(+), 114 deletions(-) create mode 100644 src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTraitType.java 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 0889f4f9c56..efe54c8d0e5 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java @@ -21,6 +21,7 @@ import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; import com.gregtechceu.gtceu.api.machine.trait.MachineTrait; +import com.gregtechceu.gtceu.api.machine.trait.MachineTraitType; import com.gregtechceu.gtceu.api.misc.*; import com.gregtechceu.gtceu.api.pattern.util.RelativeDirection; import com.gregtechceu.gtceu.api.transfer.fluid.IFluidHandlerModifiable; @@ -220,31 +221,32 @@ public void onUnload() { ////////////////////////////////////// private final List traits; - private final Map, List> traitsByType; + private final Map, List> traitsByType; public List getAllTraits() { return Collections.unmodifiableList(traits); } public void attachTrait(MachineTrait trait) { - traitsByType.computeIfAbsent(trait.getTraitType(), $ -> new ObjectArrayList<>()); - if (!trait.getTraitType().allowMultiplePerMachine && traitsByType.get(trait.getTraitType()).size() == 1) { + var traitType = MachineTraitType.getTraitType(trait.getClass()); + traitsByType.computeIfAbsent(traitType, $ -> new ObjectArrayList<>()); + if (!traitType.allowMultiplePerMachine && traitsByType.get(traitType).size() == 1) { throw new IllegalArgumentException("Attempted to add multiple traits of type: " + trait.getClass()); } traits.add(trait); - traitsByType.get(trait.getTraitType()).add(trait); + traitsByType.get(traitType).add(trait); } // Gets the first trait with the specified type. - public @Nullable T getTrait(MachineTrait.TraitType type) { + public Optional getTrait(MachineTraitType type) { traitsByType.computeIfAbsent(type, $ -> new ObjectArrayList<>()); List traitList = traitsByType.get(type); - if (traitList.isEmpty()) return null; - return type.traitCls.cast(traitList.get(0)); + if (traitList.isEmpty()) return Optional.empty(); + return Optional.ofNullable(type.traitCls.cast(traitList.get(0))); } @SuppressWarnings("unchecked") - public List getTraits(MachineTrait.TraitType type) { + public List getTraits(MachineTraitType type) { return (List)Collections.unmodifiableList(traitsByType.computeIfAbsent(type, $ -> new ObjectArrayList<>())); } @@ -763,6 +765,11 @@ public int getOutputSignal(@Nullable Direction side) { return cover.getRedstoneSignalOutput(); } + public int getOutputDirectSignal(@Nullable Direction side) { + // IDK what this does but MC wants it + return 0; + } + public int getAnalogOutputSignal() { return 0; } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/FluidTankProxyTrait.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/FluidTankProxyTrait.java index 4c0847b8180..d45dca0d7d7 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/FluidTankProxyTrait.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/FluidTankProxyTrait.java @@ -16,7 +16,7 @@ @Accessors(chain = true) public class FluidTankProxyTrait extends MachineTrait implements IFluidHandlerModifiable, ICapabilityTrait { - public static TraitType TYPE = new TraitType<>(FluidTankProxyTrait.class); + public static MachineTraitType TYPE = new MachineTraitType<>(FluidTankProxyTrait.class); @Getter public final IO capabilityIO; @@ -29,11 +29,6 @@ public FluidTankProxyTrait(MetaMachine machine, IO capabilityIO) { this.capabilityIO = capabilityIO; } - @Override - public TraitType getTraitType() { - return TYPE; - } - ////////////////////////////////////// // ******* Capability ********// ////////////////////////////////////// diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/ItemHandlerProxyTrait.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/ItemHandlerProxyTrait.java index 63508f93e5a..3a819065a6e 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/ItemHandlerProxyTrait.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/ItemHandlerProxyTrait.java @@ -17,7 +17,7 @@ @Accessors(chain = true) public class ItemHandlerProxyTrait extends MachineTrait implements IItemHandlerModifiable, ICapabilityTrait { - public static TraitType TYPE = new TraitType<>(ItemHandlerProxyTrait.class); + public static MachineTraitType TYPE = new MachineTraitType<>(ItemHandlerProxyTrait.class); @Getter public final IO capabilityIO; @@ -31,11 +31,6 @@ public ItemHandlerProxyTrait(MetaMachine machine, IO capabilityIO) { this.capabilityIO = capabilityIO; } - @Override - public TraitType getTraitType() { - return TYPE; - } - ////////////////////////////////////// // ******* Capability ********// ////////////////////////////////////// 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 58b0c4c65dc..95f6fa04e27 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,20 +16,6 @@ public abstract class MachineTrait implements ISyncManaged { - public static class TraitType { - public final Class traitCls; - public final boolean allowMultiplePerMachine; - public TraitType(Class cls) { - traitCls = cls; - allowMultiplePerMachine = true; - } - - public TraitType(Class cls, boolean allowMultiplePerMachine) { - traitCls = cls; - this.allowMultiplePerMachine = allowMultiplePerMachine; - } - - } @Getter protected final SyncDataHolder syncDataHolder = new SyncDataHolder(this); @@ -46,8 +32,6 @@ public MachineTrait(MetaMachine machine) { if (machine != null) machine.attachTrait(this); } - public abstract TraitType getTraitType(); - public final boolean hasCapability(@Nullable Direction side) { return capabilityValidator.test(side); } 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 new file mode 100644 index 00000000000..516facf91e3 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTraitType.java @@ -0,0 +1,30 @@ +package com.gregtechceu.gtceu.api.machine.trait; + +import org.jetbrains.annotations.NotNull; + +import java.util.HashMap; +import java.util.Map; + +public class MachineTraitType { + + public final Class traitCls; + public final boolean allowMultiplePerMachine; + + public MachineTraitType(Class cls) { + this(cls, true); + } + + public MachineTraitType(Class cls, boolean allowMultiplePerMachine) { + traitCls = cls; + this.allowMultiplePerMachine = allowMultiplePerMachine; + + MACHINE_TRAIT_TYPES.put(this, cls); + } + + private static final Map, Class> MACHINE_TRAIT_TYPES = new HashMap<>(); + + public static MachineTraitType getTraitType(Class cls) { + var type = MACHINE_TRAIT_TYPES.entrySet().stream().filter(e -> e.getValue() == cls).findFirst(); + return type.orElseThrow().getKey(); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableComputationContainer.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableComputationContainer.java index 351546cc038..c959aa023d8 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableComputationContainer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableComputationContainer.java @@ -28,7 +28,7 @@ public class NotifiableComputationContainer extends NotifiableRecipeHandlerTrait implements IOpticalComputationHatch, IOpticalComputationReceiver { - public static TraitType TYPE = new TraitType<>(NotifiableComputationContainer.class); + public static MachineTraitType TYPE = new MachineTraitType<>(NotifiableComputationContainer.class); @Getter protected IO handlerIO; @@ -46,11 +46,6 @@ public NotifiableComputationContainer(MetaMachine machine, IO handlerIO, boolean this.lastTimeStamp = Long.MIN_VALUE; } - @Override - public TraitType getTraitType() { - return TYPE; - } - @Override public int requestCWUt(int cwut, boolean simulate, @NotNull Collection seen) { var latestTimeStamp = getMachine().getOffsetTimer(); diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableEnergyContainer.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableEnergyContainer.java index 4c8d416029a..001af995751 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableEnergyContainer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableEnergyContainer.java @@ -34,7 +34,7 @@ public class NotifiableEnergyContainer extends NotifiableRecipeHandlerTrait implements IEnergyContainer { - public static TraitType TYPE = new TraitType<>(NotifiableEnergyContainer.class); + public static MachineTraitType TYPE = new MachineTraitType<>(NotifiableEnergyContainer.class); @Getter protected IO handlerIO; @@ -72,11 +72,6 @@ public NotifiableEnergyContainer(MetaMachine machine, long maxCapacity, long max this.handlerIO = (isIn && isOut) ? IO.BOTH : isIn ? IO.IN : isOut ? IO.OUT : IO.NONE; } - @Override - public TraitType getTraitType() { - return TYPE; - } - public static NotifiableEnergyContainer emitterContainer(MetaMachine machine, long maxCapacity, long maxOutputVoltage, long maxOutputAmperage) { return new NotifiableEnergyContainer(machine, maxCapacity, 0L, 0L, maxOutputVoltage, maxOutputAmperage); diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableFluidTank.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableFluidTank.java index 0dcc56bbf7f..8d6c2c6687a 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableFluidTank.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableFluidTank.java @@ -26,7 +26,7 @@ public class NotifiableFluidTank extends NotifiableRecipeHandlerTrait implements ICapabilityTrait, IFluidHandlerModifiable { - public static TraitType TYPE = new TraitType<>(NotifiableFluidTank.class); + public static MachineTraitType TYPE = new MachineTraitType<>(NotifiableFluidTank.class); @Getter public final IO handlerIO; @@ -79,11 +79,6 @@ public NotifiableFluidTank(MetaMachine machine, List storages, this(machine, storages, io, io); } - @Override - public TraitType getTraitType() { - return TYPE; - } - public void onContentsChanged() { isEmpty = null; syncDataHolder.markClientSyncFieldDirty("storages"); 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 28063ea0d94..806a233bd58 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 @@ -35,7 +35,7 @@ public class NotifiableItemStackHandler extends NotifiableRecipeHandlerTrait implements ICapabilityTrait, IItemHandlerModifiable { - public static TraitType TYPE = new TraitType<>(NotifiableItemStackHandler.class); + public static MachineTraitType TYPE = new MachineTraitType<>(NotifiableItemStackHandler.class); @Getter public final IO handlerIO; @@ -72,11 +72,6 @@ public NotifiableItemStackHandler setFilter(Predicate filter) { return this; } - @Override - public TraitType getTraitType() { - return TYPE; - } - public void onContentsChanged() { isEmpty = null; syncDataHolder.markClientSyncFieldDirty("storage"); 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 08f258001ba..07c7b2f3a5f 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 @@ -10,7 +10,7 @@ public class NotifiableLaserContainer extends NotifiableEnergyContainer implements ILaserContainer { - public static TraitType TYPE = new TraitType<>(NotifiableLaserContainer.class); + public static MachineTraitType TYPE = new MachineTraitType<>(NotifiableLaserContainer.class); public NotifiableLaserContainer(MetaMachine machine, long maxCapacity, long maxInputVoltage, long maxInputAmperage, long maxOutputVoltage, long maxOutputAmperage) { @@ -27,11 +27,6 @@ public static NotifiableLaserContainer receiverContainer(MetaMachine machine, lo return new NotifiableLaserContainer(machine, maxCapacity, maxInputVoltage, maxInputAmperage, 0L, 0L); } - @Override - public TraitType getTraitType() { - return TYPE; - } - @Override public void serverTick() { amps = 0; diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeLogic.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeLogic.java index eca68c94f37..ec13bba6e48 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeLogic.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeLogic.java @@ -45,7 +45,7 @@ public class RecipeLogic extends MachineTrait implements IWorkable, IFancyTooltip { - public static TraitType TYPE = new TraitType<>(RecipeLogic.class, false); + public static MachineTraitType TYPE = new MachineTraitType<>(RecipeLogic.class, false); public enum Status implements StringRepresentable { @@ -62,11 +62,6 @@ public enum Status implements StringRepresentable { } } - @Override - public final TraitType getTraitType() { - return TYPE; - } - public static final EnumProperty STATUS_PROPERTY = GTMachineModelProperties.RECIPE_LOGIC_STATUS; public final IRecipeLogicMachine machine; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/PowerSubstationMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/PowerSubstationMachine.java index 7f52589b610..5ef3073965b 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/PowerSubstationMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/PowerSubstationMachine.java @@ -18,6 +18,7 @@ import com.gregtechceu.gtceu.api.machine.multiblock.IBatteryData; import com.gregtechceu.gtceu.api.machine.multiblock.WorkableMultiblockMachine; import com.gregtechceu.gtceu.api.machine.trait.MachineTrait; +import com.gregtechceu.gtceu.api.machine.trait.MachineTraitType; import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; import com.gregtechceu.gtceu.api.misc.EnergyContainerList; import com.gregtechceu.gtceu.config.ConfigHolder; @@ -374,6 +375,8 @@ public void attachTooltips(TooltipsPanel tooltipsPanel) { public static class PowerStationEnergyBank extends MachineTrait implements INBTSerializable { + public static MachineTraitType TYPE = new MachineTraitType<>(PowerStationEnergyBank.class); + private static final String NBT_SIZE = "Size"; private static final String NBT_STORED = "Stored"; private static final String NBT_MAX = "Max"; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumChestMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumChestMachine.java index db16da4c7b0..eae15680363 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumChestMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumChestMachine.java @@ -442,7 +442,7 @@ public Widget createUIWidget() { protected class ItemCache extends MachineTrait implements IItemHandlerModifiable { - public static TraitType TYPE = new TraitType<>(ItemCache.class); + public static MachineTraitType TYPE = new MachineTraitType<>(ItemCache.class); private final Predicate filter = i -> !isLocked() || GTUtil.isSameItemSameTags(i, getLockedItem()); @@ -451,11 +451,6 @@ public ItemCache(MetaMachine holder) { super(holder); } - @Override - public TraitType getTraitType() { - return TYPE; - } - @Override public void setStackInSlot(int index, ItemStack stack) { stored = stack.copyWithCount(1); diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumTankMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumTankMachine.java index a433080f1ce..705b4483c80 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumTankMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumTankMachine.java @@ -14,6 +14,7 @@ import com.gregtechceu.gtceu.api.machine.feature.IFancyUIMachine; import com.gregtechceu.gtceu.api.machine.feature.IInteractedMachine; import com.gregtechceu.gtceu.api.machine.trait.MachineTrait; +import com.gregtechceu.gtceu.api.machine.trait.MachineTraitType; import com.gregtechceu.gtceu.api.transfer.fluid.CustomFluidTank; import com.gregtechceu.gtceu.api.transfer.fluid.IFluidHandlerModifiable; import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; @@ -375,12 +376,7 @@ public Widget createUIWidget() { protected class FluidCache extends MachineTrait implements IFluidHandler { - public static MachineTrait.TraitType TYPE = new TraitType<>(FluidCache.class); - - @Override - public TraitType getTraitType() { - return TYPE; - } + public static MachineTraitType TYPE = new MachineTraitType<>(FluidCache.class); private final Predicate filter = f -> !isLocked() || getLockedFluid().isFluidEqual(f); diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/trait/ConverterTrait.java b/src/main/java/com/gregtechceu/gtceu/common/machine/trait/ConverterTrait.java index 792c18f7a8e..7292b5c5654 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/trait/ConverterTrait.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/trait/ConverterTrait.java @@ -6,6 +6,7 @@ import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; import com.gregtechceu.gtceu.api.machine.trait.MachineTrait; +import com.gregtechceu.gtceu.api.machine.trait.MachineTraitType; import com.gregtechceu.gtceu.api.machine.trait.NotifiableEnergyContainer; import com.gregtechceu.gtceu.common.machine.electric.ConverterMachine; import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; @@ -87,17 +88,12 @@ public void serverTick() { private class FEContainer extends MachineTrait implements IEnergyStorage { - public static TraitType TYPE = new TraitType<>(FEContainer.class); + public static MachineTraitType TYPE = new MachineTraitType<>(FEContainer.class); public FEContainer(MetaMachine machine) { super(machine); } - @Override - public TraitType getTraitType() { - return TYPE; - } - @Override public int receiveEnergy(int maxReceive, boolean simulate) { if (!feToEu || maxReceive <= 0) return 0; diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/GridNodeHolder.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/GridNodeHolder.java index 63c031d28de..3fae108a6b8 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/GridNodeHolder.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/GridNodeHolder.java @@ -1,6 +1,7 @@ package com.gregtechceu.gtceu.integration.ae2.machine.trait; import com.gregtechceu.gtceu.api.machine.trait.MachineTrait; +import com.gregtechceu.gtceu.api.machine.trait.MachineTraitType; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.integration.ae2.machine.feature.IGridConnectedMachine; import com.gregtechceu.gtceu.integration.ae2.utils.SerializableManagedGridNode; @@ -23,7 +24,7 @@ */ public class GridNodeHolder extends MachineTrait { - public static TraitType TYPE = new TraitType<>(GridNodeHolder.class); + public static MachineTraitType TYPE = new MachineTraitType<>(GridNodeHolder.class); @Getter @SaveField @@ -34,11 +35,6 @@ public GridNodeHolder(IGridConnectedMachine machine) { this.mainNode = createManagedNode(); } - @Override - public TraitType getTraitType() { - return TYPE; - } - protected SerializableManagedGridNode createManagedNode() { var node = (SerializableManagedGridNode) new SerializableManagedGridNode((IGridConnectedBlockEntity) machine, BlockEntityNodeListener.INSTANCE) diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/GridNodeHostTrait.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/GridNodeHostTrait.java index 5006a1c2bec..91932f7addc 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/GridNodeHostTrait.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/GridNodeHostTrait.java @@ -3,6 +3,7 @@ import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.trait.MachineTrait; +import com.gregtechceu.gtceu.api.machine.trait.MachineTraitType; import net.minecraft.core.Direction; import appeng.api.networking.GridHelper; @@ -13,7 +14,7 @@ public class GridNodeHostTrait extends MachineTrait implements IGridConnectedBlockEntity { - public static TraitType TYPE = new TraitType<>(GridNodeHostTrait.class); + public static MachineTraitType TYPE = new MachineTraitType<>(GridNodeHostTrait.class); private final IManagedGridNode proxy; @@ -24,11 +25,6 @@ public GridNodeHostTrait(MetaMachine machine) { .setVisualRepresentation(machine.getDefinition().getItem()); } - @Override - public TraitType getTraitType() { - return TYPE; - } - public void init() { this.proxy.create(machine.getLevel(), machine.getBlockPos()); } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/InternalSlotRecipeHandler.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/InternalSlotRecipeHandler.java index 4a2e4e49431..e7855d7b3bc 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/InternalSlotRecipeHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/InternalSlotRecipeHandler.java @@ -1,6 +1,7 @@ package com.gregtechceu.gtceu.integration.ae2.machine.trait; import com.gregtechceu.gtceu.api.capability.recipe.*; +import com.gregtechceu.gtceu.api.machine.trait.MachineTraitType; import com.gregtechceu.gtceu.api.machine.trait.NotifiableRecipeHandlerTrait; import com.gregtechceu.gtceu.api.machine.trait.RecipeHandlerGroupDistinctness; import com.gregtechceu.gtceu.api.machine.trait.RecipeHandlerList; @@ -59,6 +60,8 @@ public void setDistinct(boolean ignored, boolean notify) {} @Getter private static class SlotItemRecipeHandler extends NotifiableRecipeHandlerTrait { + public static MachineTraitType TYPE = new MachineTraitType<>(SlotItemRecipeHandler.class); + private final InternalSlot slot; private final int priority; @@ -94,6 +97,9 @@ public double getTotalContentAmount() { @Getter private static class SlotFluidRecipeHandler extends NotifiableRecipeHandlerTrait { + public static MachineTraitType TYPE = new MachineTraitType<>(SlotFluidRecipeHandler.class); + + private final InternalSlot slot; private final int priority; diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/ProxySlotRecipeHandler.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/ProxySlotRecipeHandler.java index 934a386390b..98aeb3c0463 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/ProxySlotRecipeHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/ProxySlotRecipeHandler.java @@ -93,12 +93,7 @@ public void setDistinct(boolean ignored, boolean notify) {} @Getter private static class ProxyItemRecipeHandler extends NotifiableRecipeHandlerTrait { - public static TraitType TYPE = new TraitType<>(ProxyItemRecipeHandler.class); - - @Override - public TraitType getTraitType() { - return TYPE; - } + public static MachineTraitType TYPE = new MachineTraitType<>(ProxyItemRecipeHandler.class); private IRecipeHandlerTrait proxy = null; private ISubscription proxySub = null; @@ -155,12 +150,7 @@ public int getPriority() { @Getter private static class ProxyFluidRecipeHandler extends NotifiableRecipeHandlerTrait { - public static TraitType TYPE = new TraitType<>(ProxyFluidRecipeHandler.class); - - @Override - public TraitType getTraitType() { - return TYPE; - } + public static MachineTraitType TYPE = new MachineTraitType<>(ProxyFluidRecipeHandler.class); private IRecipeHandlerTrait proxy = null; private ISubscription proxySub = null; From 0cbb6d9e9dae05dc57aa3d3dbb5ed9b996a6a1f1 Mon Sep 17 00:00:00 2001 From: Gustavo Date: Fri, 16 Jan 2026 11:16:29 +1100 Subject: [PATCH 05/27] machine trait probe providers --- .../jade/MachineTraitProvider.java | 51 +++++++++++++++++++ .../provider/MachineTraitInfoProvider.java | 36 +++++++++++++ 2 files changed, 87 insertions(+) create mode 100644 src/main/java/com/gregtechceu/gtceu/integration/jade/MachineTraitProvider.java create mode 100644 src/main/java/com/gregtechceu/gtceu/integration/top/provider/MachineTraitInfoProvider.java diff --git a/src/main/java/com/gregtechceu/gtceu/integration/jade/MachineTraitProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/jade/MachineTraitProvider.java new file mode 100644 index 00000000000..dd88a293e7a --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/integration/jade/MachineTraitProvider.java @@ -0,0 +1,51 @@ +package com.gregtechceu.gtceu.integration.jade.provider; + +import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.api.machine.trait.MachineTrait; +import com.gregtechceu.gtceu.api.machine.trait.MachineTraitType; +import lombok.Getter; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.block.entity.BlockEntity; +import snownee.jade.api.BlockAccessor; +import snownee.jade.api.IBlockComponentProvider; +import snownee.jade.api.IServerDataProvider; +import snownee.jade.api.ITooltip; +import snownee.jade.api.config.IPluginConfig; + +public abstract class MachineTraitProvider implements IBlockComponentProvider, IServerDataProvider { + + @Getter + public final ResourceLocation uid; + public final MachineTraitType traitType; + + protected MachineTraitProvider(ResourceLocation uid, MachineTraitType type) { + this.uid = uid; + this.traitType = type; + } + + @Override + public void appendTooltip(ITooltip iTooltip, BlockAccessor block, IPluginConfig iPluginConfig) { + var be = block.getBlockEntity(); + if (be == null || !block.getServerData().contains(uid.toString(), CompoundTag.TAG_COMPOUND)) return; + + var serverData = block.getServerData().getCompound(uid.toString()); + addTooltip(serverData, iTooltip, block.getPlayer(), block, be, iPluginConfig); + } + + @Override + public void appendServerData(CompoundTag compoundTag, BlockAccessor blockAccessor) { + var be = blockAccessor.getBlockEntity(); + if (be instanceof MetaMachine machine) { + var t = machine.getTrait(traitType); + t.ifPresent(value -> write(compoundTag.getCompound(uid.toString()), value)); + } + } + + protected abstract void write(CompoundTag data, T trait); + + protected abstract void addTooltip(CompoundTag data, ITooltip tooltip, Player player, BlockAccessor block, + BlockEntity blockEntity, IPluginConfig config); + +} \ No newline at end of file diff --git a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/MachineTraitInfoProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/top/provider/MachineTraitInfoProvider.java new file mode 100644 index 00000000000..7f3f2b22a70 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/integration/top/provider/MachineTraitInfoProvider.java @@ -0,0 +1,36 @@ +package com.gregtechceu.gtceu.integration.top.provider; + +import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.api.machine.trait.MachineTrait; +import com.gregtechceu.gtceu.api.machine.trait.MachineTraitType; +import mcjty.theoneprobe.api.IProbeHitData; +import mcjty.theoneprobe.api.IProbeInfo; +import mcjty.theoneprobe.api.IProbeInfoProvider; +import mcjty.theoneprobe.api.ProbeMode; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.entity.BlockEntity; +import net.minecraft.world.level.block.state.BlockState; + +public abstract class MachineTraitInfoProvider implements IProbeInfoProvider { + protected abstract void addProbeInfo(T trait, IProbeInfo probeInfo, Player player, BlockEntity blockEntity, + IProbeHitData data); + + protected boolean allowDisplaying(T trait) { + return true; + } + + protected abstract MachineTraitType getTraitType(); + + @Override + public void addProbeInfo(ProbeMode mode, IProbeInfo probeInfo, Player player, Level world, BlockState blockState, + IProbeHitData data) { + if (blockState.hasBlockEntity()) { + BlockEntity blockEntity = world.getBlockEntity(data.getPos()); + if (blockEntity instanceof MetaMachine machine) { + var t = machine.getTrait(getTraitType()); + t.ifPresent(v -> addProbeInfo(v, probeInfo, player, blockEntity, data)); + } + } + } +} \ No newline at end of file From b7177deb4c774ac9fef24f1be41db142917d7dbe Mon Sep 17 00:00:00 2001 From: Gustavo Date: Fri, 16 Jan 2026 11:30:12 +1100 Subject: [PATCH 06/27] impl trait ifaces --- .../gtceu/api/block/MetaMachineBlock.java | 7 +-- .../gtceu/api/machine/MetaMachine.java | 61 +++++++++++++++---- .../gtceu/api/machine/trait/MachineTrait.java | 25 ++++++-- .../trait/feature/IInteractionTrait.java | 22 +++++++ .../trait/feature/IModifyFacingTrait.java | 11 ++++ .../trait/feature/IRenderingTrait.java | 25 ++++++++ .../machine/trait/feature/ITraitFeature.java | 5 ++ .../{ => provider}/MachineTraitProvider.java | 0 .../syncsystem/ManagedSyncBlockEntity.java | 4 +- 9 files changed, 136 insertions(+), 24 deletions(-) create mode 100644 src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/IInteractionTrait.java create mode 100644 src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/IModifyFacingTrait.java create mode 100644 src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/IRenderingTrait.java create mode 100644 src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/ITraitFeature.java rename src/main/java/com/gregtechceu/gtceu/integration/jade/{ => provider}/MachineTraitProvider.java (100%) 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 f06f8e0b0f9..d95edf61a33 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/block/MetaMachineBlock.java +++ b/src/main/java/com/gregtechceu/gtceu/api/block/MetaMachineBlock.java @@ -246,13 +246,8 @@ public void onRemove(BlockState pState, Level pLevel, BlockPos pPos, BlockState if (pState.hasBlockEntity()) { if (!pState.is(pNewState.getBlock())) { // new block MetaMachine machine = MetaMachine.getMachine(pLevel, pPos); - if (machine instanceof IMachineLife machineLife) { - machineLife.onMachineRemoved(); - } if (machine != null) { - for (Direction direction : GTUtil.DIRECTIONS) { - machine.getCoverContainer().removeCover(direction, null); - } + machine.onRemoved(); } pLevel.updateNeighbourForOutputSignal(pPos, this); diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java index efe54c8d0e5..71735a7b015 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java @@ -22,6 +22,10 @@ import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; import com.gregtechceu.gtceu.api.machine.trait.MachineTrait; import com.gregtechceu.gtceu.api.machine.trait.MachineTraitType; +import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.machine.trait.feature.IInteractionTrait; +import com.gregtechceu.gtceu.api.machine.trait.feature.IModifyFacingTrait; +import com.gregtechceu.gtceu.api.machine.trait.feature.IRenderingTrait; import com.gregtechceu.gtceu.api.misc.*; import com.gregtechceu.gtceu.api.pattern.util.RelativeDirection; import com.gregtechceu.gtceu.api.transfer.fluid.IFluidHandlerModifiable; @@ -338,35 +342,46 @@ public final Pair onToolClick(Set too CoverBehavior coverBehavior = gridSide == null ? null : coverContainer.getCoverAtSide(gridSide); if (gridSide == null) gridSide = hitResult.getDirection(); + Pair result = Pair.of(null, InteractionResult.PASS); + // Prioritize covers where they apply (Screwdriver, Soft Mallet) if (toolType.isEmpty() && playerIn.isShiftKeyDown()) { if (coverBehavior != null) { - return Pair.of(null, coverBehavior.onScrewdriverClick(playerIn, hand, hitResult)); + result = Pair.of(null, coverBehavior.onScrewdriverClick(playerIn, hand, hitResult)); } } if (toolType.contains(GTToolType.SCREWDRIVER)) { if (coverBehavior != null) { - return Pair.of(GTToolType.SCREWDRIVER, coverBehavior.onScrewdriverClick(playerIn, hand, hitResult)); - } else return Pair.of(GTToolType.SCREWDRIVER, onScrewdriverClick(playerIn, hand, gridSide, hitResult)); + result = Pair.of(GTToolType.SCREWDRIVER, coverBehavior.onScrewdriverClick(playerIn, hand, hitResult)); + } else result = Pair.of(GTToolType.SCREWDRIVER, onScrewdriverClick(playerIn, hand, gridSide, hitResult)); } else if (toolType.contains(GTToolType.SOFT_MALLET)) { if (coverBehavior != null) { - return Pair.of(GTToolType.SOFT_MALLET, coverBehavior.onSoftMalletClick(playerIn, hand, hitResult)); - } else return Pair.of(GTToolType.SOFT_MALLET, onSoftMalletClick(playerIn, hand, gridSide, hitResult)); + result = Pair.of(GTToolType.SOFT_MALLET, coverBehavior.onSoftMalletClick(playerIn, hand, hitResult)); + } else result = Pair.of(GTToolType.SOFT_MALLET, onSoftMalletClick(playerIn, hand, gridSide, hitResult)); } else if (toolType.contains(GTToolType.WRENCH)) { - return Pair.of(GTToolType.WRENCH, onWrenchClick(playerIn, hand, gridSide, hitResult)); + result = Pair.of(GTToolType.WRENCH, onWrenchClick(playerIn, hand, gridSide, hitResult)); } else if (toolType.contains(GTToolType.CROWBAR)) { if (coverBehavior != null) { if (!isRemote()) { getCoverContainer().removeCover(gridSide, playerIn); } - return Pair.of(GTToolType.CROWBAR, InteractionResult.CONSUME); + } - return Pair.of(GTToolType.CROWBAR, onCrowbarClick(playerIn, hand, gridSide, hitResult)); + result = Pair.of(GTToolType.CROWBAR, onCrowbarClick(playerIn, hand, gridSide, hitResult)); } else if (toolType.contains(GTToolType.HARD_HAMMER)) { - return Pair.of(GTToolType.HARD_HAMMER, onHardHammerClick(playerIn, hand, gridSide, hitResult)); + result = Pair.of(GTToolType.HARD_HAMMER, onHardHammerClick(playerIn, hand, gridSide, hitResult)); } - return Pair.of(null, InteractionResult.PASS); - } + + if (result.getSecond() != InteractionResult.PASS) return result; + + for (var trait: traits) { + if (trait instanceof IInteractionTrait interactionTrait) { + var r = interactionTrait.onToolClick(toolType, playerIn, hand, gridSide, hitResult); + if (r.getSecond() != InteractionResult.PASS) return r; + } + } + + return result; } protected InteractionResult onHardHammerClick(Player playerIn, InteractionHand hand, Direction gridSide, BlockHitResult hitResult) { @@ -556,6 +571,14 @@ public boolean shouldRenderGrid(Player player, BlockPos pos, BlockState state, I for (CoverBehavior cover : coverContainer.getCovers()) { if (cover.shouldRenderGrid(player, pos, state, held, toolTypes)) return true; } + + for (var trait: traits) { + if (trait instanceof IRenderingTrait renderingTrait) { + var result = renderingTrait.shouldRenderGrid(player, pos, state, held, toolTypes); + if (result) return result; + } + } + return false; } @@ -583,6 +606,14 @@ public boolean shouldRenderGrid(Player player, BlockPos pos, BlockState state, I return mufflableMachine.isMuffled() ? GuiTextures.TOOL_SOUND : GuiTextures.TOOL_MUTE; } } + + for (var trait: traits) { + if (trait instanceof IRenderingTrait renderingTrait) { + var result = renderingTrait.sideTips(player, pos, state, toolTypes, side); + if (result != null) return result; + } + } + return null; } @@ -646,6 +677,13 @@ public boolean isFacingValid(Direction facing) { return false; } } + + for (var trait: traits) { + if (trait instanceof IModifyFacingTrait modifyFacingTrait) { + if (!modifyFacingTrait.isFacingValid(facing)) return false; + } + } + return getRotationState().test(facing); } @@ -714,6 +752,7 @@ public int tintColor(int index) { public void onNeighborChanged(Block block, BlockPos fromPos, boolean isMoving) { coverContainer.onNeighborChanged(block, fromPos, isMoving); + traits.forEach(t -> t.onMachineNeighborChange(block, fromPos, isMoving)); } public void animateTick(RandomSource random) {} 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 95f6fa04e27..61a420572eb 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 @@ -5,7 +5,12 @@ import com.gregtechceu.gtceu.syncsystem.ISyncManaged; import com.gregtechceu.gtceu.syncsystem.SyncDataHolder; +import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; +import dev.architectury.event.events.common.TickEvent; +import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.Block; import net.minecraftforge.client.model.data.ModelData; import lombok.Getter; @@ -32,6 +37,10 @@ public MachineTrait(MetaMachine machine) { if (machine != null) machine.attachTrait(this); } + public Level getLevel() { + return machine.getLevel(); + } + public final boolean hasCapability(@Nullable Direction side) { return capabilityValidator.test(side); } @@ -41,12 +50,6 @@ public void markAsChanged() { machine.markAsChanged(); } - public void onMachineLoad() {} - - public void onMachineUnload() {} - - public void updateModelData(ModelData.Builder builder) {} - public MachineRenderState getRenderState() { return getMachine().getRenderState(); } @@ -58,4 +61,14 @@ public void setRenderState(MachineRenderState state) { public void scheduleRenderUpdate() { machine.scheduleRenderUpdate(); } + + ////// MetaMachine methods which traits can hook into + + public void onMachineLoad() {} + + public void onMachineUnload() {} + + public void onMachineNeighborChange(Block block, BlockPos fromPos, boolean isMoving) {} + + public void updateModelData(ModelData.Builder builder) {} } 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 new file mode 100644 index 00000000000..c63202606a1 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/IInteractionTrait.java @@ -0,0 +1,22 @@ +package com.gregtechceu.gtceu.api.machine.trait.feature; + +import com.gregtechceu.gtceu.api.item.tool.GTToolType; +import com.mojang.datafixers.util.Pair; +import net.minecraft.core.Direction; +import net.minecraft.world.InteractionHand; +import net.minecraft.world.InteractionResult; +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.item.context.UseOnContext; +import net.minecraft.world.phys.BlockHitResult; + +import java.util.Set; + +/// A machine trait that provides special interaction behaviour. +public interface IInteractionTrait extends ITraitFeature { + default Pair onToolClick(Set toolType, + Player player, InteractionHand hand, Direction gridSide, + BlockHitResult hitResult) { + return Pair.of(null, InteractionResult.PASS); + } +} \ No newline at end of file diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/IModifyFacingTrait.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/IModifyFacingTrait.java new file mode 100644 index 00000000000..e7a3611a9fb --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/IModifyFacingTrait.java @@ -0,0 +1,11 @@ +package com.gregtechceu.gtceu.api.machine.trait.feature; + +import net.minecraft.core.Direction; + +/// A machine trait that modifies the rotation behaviour of a machine. +public interface IModifyFacingTrait { + + default boolean isFacingValid(Direction direction) { + return true; + } +} \ No newline at end of file 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 new file mode 100644 index 00000000000..1db35c41e7e --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/IRenderingTrait.java @@ -0,0 +1,25 @@ +package com.gregtechceu.gtceu.api.machine.trait.feature; + +import com.gregtechceu.gtceu.api.item.tool.GTToolType; +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.state.BlockState; +import org.jetbrains.annotations.Nullable; + +import java.util.Set; + +/// A machine trait that overrides some of the default machine rendering behaviour +public interface IRenderingTrait extends ITraitFeature { + default boolean shouldRenderGrid(Player player, BlockPos pos, BlockState state, ItemStack held, + Set toolTypes) { + return false; + } + + default @Nullable ResourceTexture sideTips(Player player, BlockPos pos, BlockState state, Set toolTypes, + Direction side) { + return null; + } +} \ No newline at end of file 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 new file mode 100644 index 00000000000..bff6ac5927a --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/ITraitFeature.java @@ -0,0 +1,5 @@ +package com.gregtechceu.gtceu.api.machine.trait.feature; + +//// Represents an aspect of MetaMachine behaviour which this trait modifies. +public interface ITraitFeature { +} \ No newline at end of file diff --git a/src/main/java/com/gregtechceu/gtceu/integration/jade/MachineTraitProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/MachineTraitProvider.java similarity index 100% rename from src/main/java/com/gregtechceu/gtceu/integration/jade/MachineTraitProvider.java rename to src/main/java/com/gregtechceu/gtceu/integration/jade/provider/MachineTraitProvider.java diff --git a/src/main/java/com/gregtechceu/gtceu/syncsystem/ManagedSyncBlockEntity.java b/src/main/java/com/gregtechceu/gtceu/syncsystem/ManagedSyncBlockEntity.java index fb696360635..c87b7ba833f 100644 --- a/src/main/java/com/gregtechceu/gtceu/syncsystem/ManagedSyncBlockEntity.java +++ b/src/main/java/com/gregtechceu/gtceu/syncsystem/ManagedSyncBlockEntity.java @@ -15,6 +15,7 @@ import lombok.Getter; import lombok.Setter; +import javax.annotation.OverridingMethodsMustInvokeSuper; import javax.annotation.ParametersAreNonnullByDefault; /** @@ -49,7 +50,8 @@ protected final void saveAdditional(CompoundTag tag) { } @Override - public final void load(CompoundTag tag) { + @OverridingMethodsMustInvokeSuper + public void load(CompoundTag tag) { super.load(tag); getSyncDataHolder().deserializeNBT(tag, (getLevel() == null ? GTCEu.isClientThread() : getLevel().isClientSide)); From 4845469dffc24929e43dd5e33bb812c2d09dc397 Mon Sep 17 00:00:00 2001 From: Gustavo Date: Sun, 18 Jan 2026 10:03:45 +1100 Subject: [PATCH 07/27] spotless, minor changes --- .../gtceu/api/machine/MetaMachine.java | 23 +++++++-------- .../gtceu/api/machine/trait/MachineTrait.java | 2 -- .../api/machine/trait/MachineTraitType.java | 29 ++++++++++++------- .../trait/NotifiableComputationContainer.java | 3 +- .../trait/NotifiableEnergyContainer.java | 3 +- .../trait/NotifiableItemStackHandler.java | 3 +- .../trait/NotifiableLaserContainer.java | 3 +- .../trait/feature/IInteractionTrait.java | 9 +++--- .../trait/feature/IModifyFacingTrait.java | 2 +- .../trait/feature/IRenderingTrait.java | 6 +++- .../machine/trait/feature/ITraitFeature.java | 3 +- .../electric/PowerSubstationMachine.java | 3 +- .../ae2/machine/trait/GridNodeHostTrait.java | 2 +- .../trait/InternalSlotRecipeHandler.java | 7 +++-- .../machine/trait/ProxySlotRecipeHandler.java | 6 ++-- .../jade/provider/MachineTraitProvider.java | 15 ++++++---- .../provider/MachineTraitInfoProvider.java | 20 +++++++------ 17 files changed, 81 insertions(+), 58 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 71735a7b015..391633479e3 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java @@ -49,8 +49,6 @@ import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; import com.lowdragmc.lowdraglib.utils.DummyWorld; -import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; -import it.unimi.dsi.fastutil.objects.ObjectArrayList; import net.minecraft.ChatFormatting; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.client.Minecraft; @@ -93,6 +91,8 @@ import appeng.api.networking.IInWorldGridNodeHost; import appeng.capabilities.Capabilities; import com.mojang.datafixers.util.Pair; +import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; +import it.unimi.dsi.fastutil.objects.ObjectArrayList; import lombok.AccessLevel; import lombok.Getter; import org.jetbrains.annotations.MustBeInvokedByOverriders; @@ -137,7 +137,6 @@ public class MetaMachine extends ManagedSyncBlockEntity implements IGregtechBloc @RerenderOnChanged private int paintingColor = -1; - @Getter @SaveField @SyncToClient @@ -234,7 +233,7 @@ public List getAllTraits() { public void attachTrait(MachineTrait trait) { var traitType = MachineTraitType.getTraitType(trait.getClass()); traitsByType.computeIfAbsent(traitType, $ -> new ObjectArrayList<>()); - if (!traitType.allowMultiplePerMachine && traitsByType.get(traitType).size() == 1) { + if (!traitType.allowsMultipleInstances() && traitsByType.get(traitType).size() == 1) { throw new IllegalArgumentException("Attempted to add multiple traits of type: " + trait.getClass()); } traits.add(trait); @@ -246,15 +245,14 @@ public Optional getTrait(MachineTraitType type) { traitsByType.computeIfAbsent(type, $ -> new ObjectArrayList<>()); List traitList = traitsByType.get(type); if (traitList.isEmpty()) return Optional.empty(); - return Optional.ofNullable(type.traitCls.cast(traitList.get(0))); + return Optional.ofNullable(type.castTrait(traitList.get(0))); } @SuppressWarnings("unchecked") public List getTraits(MachineTraitType type) { - return (List)Collections.unmodifiableList(traitsByType.computeIfAbsent(type, $ -> new ObjectArrayList<>())); + return (List) Collections.unmodifiableList(traitsByType.computeIfAbsent(type, $ -> new ObjectArrayList<>())); } - ////////////////////////////////////// // ***** Tickable Manager ****// ////////////////////////////////////// @@ -374,14 +372,15 @@ public final Pair onToolClick(Set too if (result.getSecond() != InteractionResult.PASS) return result; - for (var trait: traits) { + for (var trait : traits) { if (trait instanceof IInteractionTrait interactionTrait) { var r = interactionTrait.onToolClick(toolType, playerIn, hand, gridSide, hitResult); if (r.getSecond() != InteractionResult.PASS) return r; } } - return result; } + return result; + } protected InteractionResult onHardHammerClick(Player playerIn, InteractionHand hand, Direction gridSide, BlockHitResult hitResult) { @@ -572,7 +571,7 @@ public boolean shouldRenderGrid(Player player, BlockPos pos, BlockState state, I if (cover.shouldRenderGrid(player, pos, state, held, toolTypes)) return true; } - for (var trait: traits) { + for (var trait : traits) { if (trait instanceof IRenderingTrait renderingTrait) { var result = renderingTrait.shouldRenderGrid(player, pos, state, held, toolTypes); if (result) return result; @@ -607,7 +606,7 @@ public boolean shouldRenderGrid(Player player, BlockPos pos, BlockState state, I } } - for (var trait: traits) { + for (var trait : traits) { if (trait instanceof IRenderingTrait renderingTrait) { var result = renderingTrait.sideTips(player, pos, state, toolTypes, side); if (result != null) return result; @@ -678,7 +677,7 @@ public boolean isFacingValid(Direction facing) { } } - for (var trait: traits) { + for (var trait : traits) { if (trait instanceof IModifyFacingTrait modifyFacingTrait) { if (!modifyFacingTrait.isFacingValid(facing)) return false; } 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 61a420572eb..934b5342559 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 @@ -5,8 +5,6 @@ import com.gregtechceu.gtceu.syncsystem.ISyncManaged; import com.gregtechceu.gtceu.syncsystem.SyncDataHolder; -import com.lowdragmc.lowdraglib.gui.texture.ResourceTexture; -import dev.architectury.event.events.common.TickEvent; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.Level; 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 516facf91e3..c277eeaa1e6 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 @@ -7,24 +7,31 @@ public class MachineTraitType { - public final Class traitCls; - public final boolean allowMultiplePerMachine; + private static final Map, MachineTraitType> MACHINE_TRAIT_TYPES = new HashMap<>(); - public MachineTraitType(Class cls) { - this(cls, true); + private final Class clazz; + private final boolean allowMultipleInstances; + + public MachineTraitType(@NotNull Class clazz) { + this(clazz, true); } - public MachineTraitType(Class cls, boolean allowMultiplePerMachine) { - traitCls = cls; - this.allowMultiplePerMachine = allowMultiplePerMachine; + public MachineTraitType(@NotNull Class clazz, boolean allowMultipleInstances) { + this.clazz = clazz; + this.allowMultipleInstances = allowMultipleInstances; + + MACHINE_TRAIT_TYPES.put(clazz, this); + } - MACHINE_TRAIT_TYPES.put(this, cls); + public boolean allowsMultipleInstances() { + return allowMultipleInstances; } - private static final Map, Class> MACHINE_TRAIT_TYPES = new HashMap<>(); + public T castTrait(MachineTrait trait) { + return clazz.cast(trait); + } public static MachineTraitType getTraitType(Class cls) { - var type = MACHINE_TRAIT_TYPES.entrySet().stream().filter(e -> e.getValue() == cls).findFirst(); - return type.orElseThrow().getKey(); + return MACHINE_TRAIT_TYPES.get(cls); } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableComputationContainer.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableComputationContainer.java index c959aa023d8..5e2ff4084d9 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableComputationContainer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableComputationContainer.java @@ -28,7 +28,8 @@ public class NotifiableComputationContainer extends NotifiableRecipeHandlerTrait implements IOpticalComputationHatch, IOpticalComputationReceiver { - public static MachineTraitType TYPE = new MachineTraitType<>(NotifiableComputationContainer.class); + public static MachineTraitType TYPE = new MachineTraitType<>( + NotifiableComputationContainer.class); @Getter protected IO handlerIO; diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableEnergyContainer.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableEnergyContainer.java index 001af995751..17eee061949 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableEnergyContainer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableEnergyContainer.java @@ -34,7 +34,8 @@ public class NotifiableEnergyContainer extends NotifiableRecipeHandlerTrait implements IEnergyContainer { - public static MachineTraitType TYPE = new MachineTraitType<>(NotifiableEnergyContainer.class); + public static MachineTraitType TYPE = new MachineTraitType<>( + NotifiableEnergyContainer.class); @Getter protected IO handlerIO; 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 806a233bd58..2776e1d89a9 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 @@ -35,7 +35,8 @@ public class NotifiableItemStackHandler extends NotifiableRecipeHandlerTrait implements ICapabilityTrait, IItemHandlerModifiable { - public static MachineTraitType TYPE = new MachineTraitType<>(NotifiableItemStackHandler.class); + public static MachineTraitType TYPE = new MachineTraitType<>( + NotifiableItemStackHandler.class); @Getter public final IO handlerIO; 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 07c7b2f3a5f..9fc1940b2cd 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 @@ -10,7 +10,8 @@ public class NotifiableLaserContainer extends NotifiableEnergyContainer implements ILaserContainer { - public static MachineTraitType TYPE = new MachineTraitType<>(NotifiableLaserContainer.class); + public static MachineTraitType TYPE = new MachineTraitType<>( + NotifiableLaserContainer.class); public NotifiableLaserContainer(MetaMachine machine, long maxCapacity, long maxInputVoltage, long maxInputAmperage, long maxOutputVoltage, long maxOutputAmperage) { 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 c63202606a1..c99f47c3b64 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 @@ -1,22 +1,23 @@ package com.gregtechceu.gtceu.api.machine.trait.feature; import com.gregtechceu.gtceu.api.item.tool.GTToolType; -import com.mojang.datafixers.util.Pair; + import net.minecraft.core.Direction; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.player.Player; -import net.minecraft.world.item.ItemStack; -import net.minecraft.world.item.context.UseOnContext; import net.minecraft.world.phys.BlockHitResult; +import com.mojang.datafixers.util.Pair; + import java.util.Set; /// A machine trait that provides special interaction behaviour. public interface IInteractionTrait extends ITraitFeature { + default Pair onToolClick(Set toolType, Player player, InteractionHand hand, Direction gridSide, BlockHitResult hitResult) { return Pair.of(null, InteractionResult.PASS); } -} \ No newline at end of file +} diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/IModifyFacingTrait.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/IModifyFacingTrait.java index e7a3611a9fb..9dbfef44d59 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/IModifyFacingTrait.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/IModifyFacingTrait.java @@ -8,4 +8,4 @@ public interface IModifyFacingTrait { default boolean isFacingValid(Direction direction) { return true; } -} \ No newline at end of file +} 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 1db35c41e7e..e3a27e1e52e 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 @@ -1,18 +1,22 @@ package com.gregtechceu.gtceu.api.machine.trait.feature; import com.gregtechceu.gtceu.api.item.tool.GTToolType; + 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.state.BlockState; + import org.jetbrains.annotations.Nullable; import java.util.Set; /// A machine trait that overrides some of the default machine rendering behaviour public interface IRenderingTrait extends ITraitFeature { + default boolean shouldRenderGrid(Player player, BlockPos pos, BlockState state, ItemStack held, Set toolTypes) { return false; @@ -22,4 +26,4 @@ default boolean shouldRenderGrid(Player player, BlockPos pos, BlockState state, Direction side) { return null; } -} \ No newline at end of file +} 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 index bff6ac5927a..93694f7d2ea 100644 --- 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 @@ -1,5 +1,4 @@ package com.gregtechceu.gtceu.api.machine.trait.feature; //// Represents an aspect of MetaMachine behaviour which this trait modifies. -public interface ITraitFeature { -} \ No newline at end of file +public interface ITraitFeature {} diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/PowerSubstationMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/PowerSubstationMachine.java index 5ef3073965b..0dcdfd2d520 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/PowerSubstationMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/PowerSubstationMachine.java @@ -375,7 +375,8 @@ public void attachTooltips(TooltipsPanel tooltipsPanel) { public static class PowerStationEnergyBank extends MachineTrait implements INBTSerializable { - public static MachineTraitType TYPE = new MachineTraitType<>(PowerStationEnergyBank.class); + public static MachineTraitType TYPE = new MachineTraitType<>( + PowerStationEnergyBank.class); private static final String NBT_SIZE = "Size"; private static final String NBT_STORED = "Stored"; diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/GridNodeHostTrait.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/GridNodeHostTrait.java index 91932f7addc..4c97aeec9dc 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/GridNodeHostTrait.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/GridNodeHostTrait.java @@ -2,8 +2,8 @@ import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.trait.MachineTrait; - import com.gregtechceu.gtceu.api.machine.trait.MachineTraitType; + import net.minecraft.core.Direction; import appeng.api.networking.GridHelper; diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/InternalSlotRecipeHandler.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/InternalSlotRecipeHandler.java index e7855d7b3bc..664e487e55e 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/InternalSlotRecipeHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/InternalSlotRecipeHandler.java @@ -60,7 +60,8 @@ public void setDistinct(boolean ignored, boolean notify) {} @Getter private static class SlotItemRecipeHandler extends NotifiableRecipeHandlerTrait { - public static MachineTraitType TYPE = new MachineTraitType<>(SlotItemRecipeHandler.class); + public static MachineTraitType TYPE = new MachineTraitType<>( + SlotItemRecipeHandler.class); private final InternalSlot slot; private final int priority; @@ -97,8 +98,8 @@ public double getTotalContentAmount() { @Getter private static class SlotFluidRecipeHandler extends NotifiableRecipeHandlerTrait { - public static MachineTraitType TYPE = new MachineTraitType<>(SlotFluidRecipeHandler.class); - + public static MachineTraitType TYPE = new MachineTraitType<>( + SlotFluidRecipeHandler.class); private final InternalSlot slot; private final int priority; diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/ProxySlotRecipeHandler.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/ProxySlotRecipeHandler.java index 98aeb3c0463..de9bf55c748 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/ProxySlotRecipeHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/ProxySlotRecipeHandler.java @@ -93,7 +93,8 @@ public void setDistinct(boolean ignored, boolean notify) {} @Getter private static class ProxyItemRecipeHandler extends NotifiableRecipeHandlerTrait { - public static MachineTraitType TYPE = new MachineTraitType<>(ProxyItemRecipeHandler.class); + public static MachineTraitType TYPE = new MachineTraitType<>( + ProxyItemRecipeHandler.class); private IRecipeHandlerTrait proxy = null; private ISubscription proxySub = null; @@ -150,7 +151,8 @@ public int getPriority() { @Getter private static class ProxyFluidRecipeHandler extends NotifiableRecipeHandlerTrait { - public static MachineTraitType TYPE = new MachineTraitType<>(ProxyFluidRecipeHandler.class); + public static MachineTraitType TYPE = new MachineTraitType<>( + ProxyFluidRecipeHandler.class); private IRecipeHandlerTrait proxy = null; private ISubscription proxySub = null; diff --git a/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/MachineTraitProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/MachineTraitProvider.java index dd88a293e7a..0bb901a758b 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/MachineTraitProvider.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/MachineTraitProvider.java @@ -3,21 +3,27 @@ import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.trait.MachineTrait; import com.gregtechceu.gtceu.api.machine.trait.MachineTraitType; -import lombok.Getter; + import net.minecraft.nbt.CompoundTag; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.block.entity.BlockEntity; + +import lombok.Getter; import snownee.jade.api.BlockAccessor; import snownee.jade.api.IBlockComponentProvider; import snownee.jade.api.IServerDataProvider; import snownee.jade.api.ITooltip; import snownee.jade.api.config.IPluginConfig; -public abstract class MachineTraitProvider implements IBlockComponentProvider, IServerDataProvider { +import javax.annotation.ParametersAreNonnullByDefault; + +@ParametersAreNonnullByDefault +public abstract class MachineTraitProvider + implements IBlockComponentProvider, IServerDataProvider { @Getter - public final ResourceLocation uid; + private final ResourceLocation uid; public final MachineTraitType traitType; protected MachineTraitProvider(ResourceLocation uid, MachineTraitType type) { @@ -47,5 +53,4 @@ public void appendServerData(CompoundTag compoundTag, BlockAccessor blockAccesso protected abstract void addTooltip(CompoundTag data, ITooltip tooltip, Player player, BlockAccessor block, BlockEntity blockEntity, IPluginConfig config); - -} \ No newline at end of file +} diff --git a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/MachineTraitInfoProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/top/provider/MachineTraitInfoProvider.java index 7f3f2b22a70..061d1c54b5d 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/MachineTraitInfoProvider.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/top/provider/MachineTraitInfoProvider.java @@ -3,23 +3,25 @@ import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.trait.MachineTrait; import com.gregtechceu.gtceu.api.machine.trait.MachineTraitType; -import mcjty.theoneprobe.api.IProbeHitData; -import mcjty.theoneprobe.api.IProbeInfo; -import mcjty.theoneprobe.api.IProbeInfoProvider; -import mcjty.theoneprobe.api.ProbeMode; + import net.minecraft.world.entity.player.Player; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; +import mcjty.theoneprobe.api.IProbeHitData; +import mcjty.theoneprobe.api.IProbeInfo; +import mcjty.theoneprobe.api.IProbeInfoProvider; +import mcjty.theoneprobe.api.ProbeMode; + +import javax.annotation.ParametersAreNonnullByDefault; + +@ParametersAreNonnullByDefault public abstract class MachineTraitInfoProvider implements IProbeInfoProvider { + protected abstract void addProbeInfo(T trait, IProbeInfo probeInfo, Player player, BlockEntity blockEntity, IProbeHitData data); - protected boolean allowDisplaying(T trait) { - return true; - } - protected abstract MachineTraitType getTraitType(); @Override @@ -33,4 +35,4 @@ public void addProbeInfo(ProbeMode mode, IProbeInfo probeInfo, Player player, Le } } } -} \ No newline at end of file +} From f7a1272ac679ef2ad21a41aabc33db7ca97dc496 Mon Sep 17 00:00:00 2001 From: Gustavo Date: Sun, 18 Jan 2026 10:13:05 +1100 Subject: [PATCH 08/27] annotation changes --- .../com/gregtechceu/gtceu/api/machine/MetaMachine.java | 7 ++----- .../gtceu/api/machine/trait/MachineTraitType.java | 2 +- .../top/provider/MachineTraitInfoProvider.java | 10 +++++++--- 3 files changed, 10 insertions(+), 9 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 391633479e3..1f006f29daf 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java @@ -95,10 +95,7 @@ import it.unimi.dsi.fastutil.objects.ObjectArrayList; import lombok.AccessLevel; import lombok.Getter; -import org.jetbrains.annotations.MustBeInvokedByOverriders; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import org.jetbrains.annotations.UnknownNullability; +import org.jetbrains.annotations.*; import java.util.*; import java.util.function.Consumer; @@ -226,7 +223,7 @@ public void onUnload() { private final List traits; private final Map, List> traitsByType; - public List getAllTraits() { + public @Unmodifiable List getAllTraits() { return Collections.unmodifiableList(traits); } 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 c277eeaa1e6..6c183d028eb 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 @@ -27,7 +27,7 @@ public boolean allowsMultipleInstances() { return allowMultipleInstances; } - public T castTrait(MachineTrait trait) { + public @NotNull T castTrait(@NotNull MachineTrait trait) { return clazz.cast(trait); } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/MachineTraitInfoProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/top/provider/MachineTraitInfoProvider.java index 061d1c54b5d..dcb970fc60d 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/MachineTraitInfoProvider.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/top/provider/MachineTraitInfoProvider.java @@ -19,18 +19,22 @@ @ParametersAreNonnullByDefault public abstract class MachineTraitInfoProvider implements IProbeInfoProvider { + private final MachineTraitType traitType; + + public MachineTraitInfoProvider(MachineTraitType traitType) { + this.traitType = traitType; + } + protected abstract void addProbeInfo(T trait, IProbeInfo probeInfo, Player player, BlockEntity blockEntity, IProbeHitData data); - protected abstract MachineTraitType getTraitType(); - @Override public void addProbeInfo(ProbeMode mode, IProbeInfo probeInfo, Player player, Level world, BlockState blockState, IProbeHitData data) { if (blockState.hasBlockEntity()) { BlockEntity blockEntity = world.getBlockEntity(data.getPos()); if (blockEntity instanceof MetaMachine machine) { - var t = machine.getTrait(getTraitType()); + var t = machine.getTrait(traitType); t.ifPresent(v -> addProbeInfo(v, probeInfo, player, blockEntity, data)); } } From a8afcefcaa73ceb37746587b9aa315c2b0660397 Mon Sep 17 00:00:00 2001 From: Gustavo Date: Sun, 18 Jan 2026 10:14:27 +1100 Subject: [PATCH 09/27] remove Optional --- .../java/com/gregtechceu/gtceu/api/machine/MetaMachine.java | 6 +++--- .../integration/jade/provider/MachineTraitProvider.java | 2 +- .../integration/top/provider/MachineTraitInfoProvider.java | 2 +- 3 files changed, 5 insertions(+), 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 1f006f29daf..c2f27277e46 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java @@ -238,11 +238,11 @@ public void attachTrait(MachineTrait trait) { } // Gets the first trait with the specified type. - public Optional getTrait(MachineTraitType type) { + public @Nullable T getTrait(MachineTraitType type) { traitsByType.computeIfAbsent(type, $ -> new ObjectArrayList<>()); List traitList = traitsByType.get(type); - if (traitList.isEmpty()) return Optional.empty(); - return Optional.ofNullable(type.castTrait(traitList.get(0))); + if (traitList.isEmpty()) return null; + return type.castTrait(traitList.get(0)); } @SuppressWarnings("unchecked") diff --git a/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/MachineTraitProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/MachineTraitProvider.java index 0bb901a758b..fe76d6badb5 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/MachineTraitProvider.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/MachineTraitProvider.java @@ -45,7 +45,7 @@ public void appendServerData(CompoundTag compoundTag, BlockAccessor blockAccesso var be = blockAccessor.getBlockEntity(); if (be instanceof MetaMachine machine) { var t = machine.getTrait(traitType); - t.ifPresent(value -> write(compoundTag.getCompound(uid.toString()), value)); + if (t != null) write(compoundTag.getCompound(uid.toString()), t); } } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/MachineTraitInfoProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/top/provider/MachineTraitInfoProvider.java index dcb970fc60d..d32d521c252 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/MachineTraitInfoProvider.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/top/provider/MachineTraitInfoProvider.java @@ -35,7 +35,7 @@ public void addProbeInfo(ProbeMode mode, IProbeInfo probeInfo, Player player, Le BlockEntity blockEntity = world.getBlockEntity(data.getPos()); if (blockEntity instanceof MetaMachine machine) { var t = machine.getTrait(traitType); - t.ifPresent(v -> addProbeInfo(v, probeInfo, player, blockEntity, data)); + if (t != null) addProbeInfo(t, probeInfo, player, blockEntity, data); } } } From 951dc3854191e3eb13f0212af69c559cb37a0713 Mon Sep 17 00:00:00 2001 From: Gustavo Date: Mon, 19 Jan 2026 09:32:53 +1100 Subject: [PATCH 10/27] add trait type method to all traits --- .../gregtechceu/gtceu/api/machine/MetaMachine.java | 2 +- .../gtceu/api/machine/trait/FluidTankProxyTrait.java | 5 +++++ .../api/machine/trait/ItemHandlerProxyTrait.java | 9 +++++++++ .../gtceu/api/machine/trait/MachineTrait.java | 2 ++ .../gtceu/api/machine/trait/MachineTraitHolder.java | 4 ++++ .../gtceu/api/machine/trait/MachineTraitType.java | 9 --------- .../machine/trait/NotifiableComputationContainer.java | 5 +++++ .../api/machine/trait/NotifiableEnergyContainer.java | 5 +++++ .../gtceu/api/machine/trait/NotifiableFluidTank.java | 5 +++++ .../api/machine/trait/NotifiableItemStackHandler.java | 6 ++++++ .../gtceu/api/machine/trait/RecipeLogic.java | 5 +++++ .../multiblock/electric/PowerSubstationMachine.java | 5 +++++ .../common/machine/storage/QuantumChestMachine.java | 5 +++++ .../common/machine/storage/QuantumTankMachine.java | 6 ++++++ .../gtceu/common/machine/trait/ConverterTrait.java | 7 +++++++ .../integration/ae2/machine/trait/GridNodeHolder.java | 6 ++++++ .../ae2/machine/trait/GridNodeHostTrait.java | 6 ++++++ .../ae2/machine/trait/InternalSlotRecipeHandler.java | 10 ++++++++++ .../ae2/machine/trait/ProxySlotRecipeHandler.java | 11 +++++++++++ 19 files changed, 103 insertions(+), 10 deletions(-) create mode 100644 src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTraitHolder.java 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 c2f27277e46..bba202a46ab 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java @@ -228,7 +228,7 @@ public void onUnload() { } public void attachTrait(MachineTrait trait) { - var traitType = MachineTraitType.getTraitType(trait.getClass()); + var traitType = trait.getTraitType(); traitsByType.computeIfAbsent(traitType, $ -> new ObjectArrayList<>()); if (!traitType.allowsMultipleInstances() && traitsByType.get(traitType).size() == 1) { throw new IllegalArgumentException("Attempted to add multiple traits of type: " + trait.getClass()); diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/FluidTankProxyTrait.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/FluidTankProxyTrait.java index d45dca0d7d7..d6e9208f616 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/FluidTankProxyTrait.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/FluidTankProxyTrait.java @@ -18,6 +18,11 @@ public class FluidTankProxyTrait extends MachineTrait implements IFluidHandlerMo public static MachineTraitType TYPE = new MachineTraitType<>(FluidTankProxyTrait.class); + @Override + public MachineTraitType getTraitType() { + return TYPE; + } + @Getter public final IO capabilityIO; @Setter diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/ItemHandlerProxyTrait.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/ItemHandlerProxyTrait.java index 3a819065a6e..255bdcf1f45 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/ItemHandlerProxyTrait.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/ItemHandlerProxyTrait.java @@ -19,6 +19,15 @@ public class ItemHandlerProxyTrait extends MachineTrait implements IItemHandlerM public static MachineTraitType TYPE = new MachineTraitType<>(ItemHandlerProxyTrait.class); + @Override + public MachineTraitType getTraitType() { + return TYPE; + } + + public MachineTraitType getType() { + return TYPE; + } + @Getter public final IO capabilityIO; @Setter 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 934b5342559..1a5dce7d3ef 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,6 +22,8 @@ public abstract class MachineTrait implements ISyncManaged { @Getter protected final SyncDataHolder syncDataHolder = new SyncDataHolder(this); + public abstract MachineTraitType getTraitType(); + @Getter protected final MetaMachine machine; @Setter 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 new file mode 100644 index 00000000000..3a4aacf147c --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTraitHolder.java @@ -0,0 +1,4 @@ +package com.gregtechceu.gtceu.api.machine.trait; + +public class MachineTraitHolder { +} 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 6c183d028eb..0d7fa732383 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 @@ -6,9 +6,6 @@ import java.util.Map; public class MachineTraitType { - - private static final Map, MachineTraitType> MACHINE_TRAIT_TYPES = new HashMap<>(); - private final Class clazz; private final boolean allowMultipleInstances; @@ -19,8 +16,6 @@ public MachineTraitType(@NotNull Class clazz) { public MachineTraitType(@NotNull Class clazz, boolean allowMultipleInstances) { this.clazz = clazz; this.allowMultipleInstances = allowMultipleInstances; - - MACHINE_TRAIT_TYPES.put(clazz, this); } public boolean allowsMultipleInstances() { @@ -30,8 +25,4 @@ public boolean allowsMultipleInstances() { public @NotNull T castTrait(@NotNull MachineTrait trait) { return clazz.cast(trait); } - - public static MachineTraitType getTraitType(Class cls) { - return MACHINE_TRAIT_TYPES.get(cls); - } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableComputationContainer.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableComputationContainer.java index 5e2ff4084d9..4b11103ec5a 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableComputationContainer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableComputationContainer.java @@ -31,6 +31,11 @@ public class NotifiableComputationContainer extends NotifiableRecipeHandlerTrait public static MachineTraitType TYPE = new MachineTraitType<>( NotifiableComputationContainer.class); + @Override + public MachineTraitType getTraitType() { + return TYPE; + } + @Getter protected IO handlerIO; @Getter diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableEnergyContainer.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableEnergyContainer.java index 17eee061949..628b0c0c380 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableEnergyContainer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableEnergyContainer.java @@ -37,6 +37,11 @@ public class NotifiableEnergyContainer extends NotifiableRecipeHandlerTrait TYPE = new MachineTraitType<>( NotifiableEnergyContainer.class); + @Override + public MachineTraitType getTraitType() { + return TYPE; + } + @Getter protected IO handlerIO; @Getter diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableFluidTank.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableFluidTank.java index 8d6c2c6687a..5c7c77dfb72 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableFluidTank.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableFluidTank.java @@ -28,6 +28,11 @@ public class NotifiableFluidTank extends NotifiableRecipeHandlerTrait TYPE = new MachineTraitType<>(NotifiableFluidTank.class); + @Override + public MachineTraitType getTraitType() { + return TYPE; + } + @Getter public final IO handlerIO; @Getter 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 2776e1d89a9..0ce87745b03 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 @@ -10,6 +10,7 @@ import com.gregtechceu.gtceu.api.recipe.ingredient.IntProviderIngredient; import com.gregtechceu.gtceu.api.recipe.ingredient.SizedIngredient; import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; +import com.gregtechceu.gtceu.common.machine.storage.QuantumChestMachine; import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.GTTransferUtils; @@ -38,6 +39,11 @@ public class NotifiableItemStackHandler extends NotifiableRecipeHandlerTrait TYPE = new MachineTraitType<>( NotifiableItemStackHandler.class); + @Override + public MachineTraitType getTraitType() { + return TYPE; + } + @Getter public final IO handlerIO; @Getter diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeLogic.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeLogic.java index ec13bba6e48..d59f5e9c045 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeLogic.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeLogic.java @@ -47,6 +47,11 @@ public class RecipeLogic extends MachineTrait implements IWorkable, IFancyToolti public static MachineTraitType TYPE = new MachineTraitType<>(RecipeLogic.class, false); + @Override + public MachineTraitType getTraitType() { + return TYPE; + } + public enum Status implements StringRepresentable { IDLE("idle"), diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/PowerSubstationMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/PowerSubstationMachine.java index 0dcdfd2d520..81027021e5f 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/PowerSubstationMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/PowerSubstationMachine.java @@ -378,6 +378,11 @@ public static class PowerStationEnergyBank extends MachineTrait implements INBTS public static MachineTraitType TYPE = new MachineTraitType<>( PowerStationEnergyBank.class); + @Override + public MachineTraitType getTraitType() { + return TYPE; + } + private static final String NBT_SIZE = "Size"; private static final String NBT_STORED = "Stored"; private static final String NBT_MAX = "Max"; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumChestMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumChestMachine.java index eae15680363..a0f78562a0a 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumChestMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumChestMachine.java @@ -444,6 +444,11 @@ protected class ItemCache extends MachineTrait implements IItemHandlerModifiable public static MachineTraitType TYPE = new MachineTraitType<>(ItemCache.class); + @Override + public MachineTraitType getTraitType() { + return TYPE; + } + private final Predicate filter = i -> !isLocked() || GTUtil.isSameItemSameTags(i, getLockedItem()); diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumTankMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumTankMachine.java index 705b4483c80..d28f3ab76ca 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumTankMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumTankMachine.java @@ -378,6 +378,12 @@ protected class FluidCache extends MachineTrait implements IFluidHandler { public static MachineTraitType TYPE = new MachineTraitType<>(FluidCache.class); + @Override + public MachineTraitType getTraitType() { + return TYPE; + } + + private final Predicate filter = f -> !isLocked() || getLockedFluid().isFluidEqual(f); public FluidCache(MetaMachine holder) { diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/trait/ConverterTrait.java b/src/main/java/com/gregtechceu/gtceu/common/machine/trait/ConverterTrait.java index 7292b5c5654..6e7cd543343 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/trait/ConverterTrait.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/trait/ConverterTrait.java @@ -9,6 +9,7 @@ import com.gregtechceu.gtceu.api.machine.trait.MachineTraitType; import com.gregtechceu.gtceu.api.machine.trait.NotifiableEnergyContainer; import com.gregtechceu.gtceu.common.machine.electric.ConverterMachine; +import com.gregtechceu.gtceu.common.machine.storage.QuantumChestMachine; import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; @@ -90,6 +91,12 @@ private class FEContainer extends MachineTrait implements IEnergyStorage { public static MachineTraitType TYPE = new MachineTraitType<>(FEContainer.class); + @Override + public MachineTraitType getTraitType() { + return TYPE; + } + + public FEContainer(MetaMachine machine) { super(machine); } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/GridNodeHolder.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/GridNodeHolder.java index 3fae108a6b8..8ac43963081 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/GridNodeHolder.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/GridNodeHolder.java @@ -2,6 +2,7 @@ import com.gregtechceu.gtceu.api.machine.trait.MachineTrait; import com.gregtechceu.gtceu.api.machine.trait.MachineTraitType; +import com.gregtechceu.gtceu.common.machine.storage.QuantumChestMachine; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.integration.ae2.machine.feature.IGridConnectedMachine; import com.gregtechceu.gtceu.integration.ae2.utils.SerializableManagedGridNode; @@ -26,6 +27,11 @@ public class GridNodeHolder extends MachineTrait { public static MachineTraitType TYPE = new MachineTraitType<>(GridNodeHolder.class); + @Override + public MachineTraitType getTraitType() { + return TYPE; + } + @Getter @SaveField protected final SerializableManagedGridNode mainNode; diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/GridNodeHostTrait.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/GridNodeHostTrait.java index 4c97aeec9dc..0b8b5f7992c 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/GridNodeHostTrait.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/GridNodeHostTrait.java @@ -4,6 +4,7 @@ import com.gregtechceu.gtceu.api.machine.trait.MachineTrait; import com.gregtechceu.gtceu.api.machine.trait.MachineTraitType; +import com.gregtechceu.gtceu.common.machine.storage.QuantumChestMachine; import net.minecraft.core.Direction; import appeng.api.networking.GridHelper; @@ -16,6 +17,11 @@ public class GridNodeHostTrait extends MachineTrait implements IGridConnectedBlo public static MachineTraitType TYPE = new MachineTraitType<>(GridNodeHostTrait.class); + @Override + public MachineTraitType getTraitType() { + return TYPE; + } + private final IManagedGridNode proxy; public GridNodeHostTrait(MetaMachine machine) { diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/InternalSlotRecipeHandler.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/InternalSlotRecipeHandler.java index 664e487e55e..4418b1faf20 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/InternalSlotRecipeHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/InternalSlotRecipeHandler.java @@ -63,6 +63,11 @@ private static class SlotItemRecipeHandler extends NotifiableRecipeHandlerTrait< public static MachineTraitType TYPE = new MachineTraitType<>( SlotItemRecipeHandler.class); + @Override + public MachineTraitType getTraitType() { + return TYPE; + } + private final InternalSlot slot; private final int priority; @@ -101,6 +106,11 @@ private static class SlotFluidRecipeHandler extends NotifiableRecipeHandlerTrait public static MachineTraitType TYPE = new MachineTraitType<>( SlotFluidRecipeHandler.class); + @Override + public MachineTraitType getTraitType() { + return TYPE; + } + private final InternalSlot slot; private final int priority; diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/ProxySlotRecipeHandler.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/ProxySlotRecipeHandler.java index de9bf55c748..3618b07ff83 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/ProxySlotRecipeHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/ProxySlotRecipeHandler.java @@ -96,6 +96,12 @@ private static class ProxyItemRecipeHandler extends NotifiableRecipeHandlerTrait public static MachineTraitType TYPE = new MachineTraitType<>( ProxyItemRecipeHandler.class); + @Override + public MachineTraitType getTraitType() { + return TYPE; + } + + private IRecipeHandlerTrait proxy = null; private ISubscription proxySub = null; @@ -154,6 +160,11 @@ private static class ProxyFluidRecipeHandler extends NotifiableRecipeHandlerTrai public static MachineTraitType TYPE = new MachineTraitType<>( ProxyFluidRecipeHandler.class); + @Override + public MachineTraitType getTraitType() { + return TYPE; + } + private IRecipeHandlerTrait proxy = null; private ISubscription proxySub = null; From c65a06a94c8189539fca5915ea560f7051bb6639 Mon Sep 17 00:00:00 2001 From: Gustavo Date: Mon, 19 Jan 2026 09:36:41 +1100 Subject: [PATCH 11/27] change comments to jdoc --- .../com/gregtechceu/gtceu/api/block/AppearanceBlock.java | 5 +++-- .../gregtechceu/gtceu/api/machine/trait/MachineTrait.java | 4 ++-- .../gtceu/api/machine/trait/feature/IInteractionTrait.java | 4 +++- .../gtceu/api/machine/trait/feature/IModifyFacingTrait.java | 4 +++- .../gtceu/api/machine/trait/feature/IRenderingTrait.java | 4 +++- 5 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/api/block/AppearanceBlock.java b/src/main/java/com/gregtechceu/gtceu/api/block/AppearanceBlock.java index 95ee548a54d..21f456b6a96 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/block/AppearanceBlock.java +++ b/src/main/java/com/gregtechceu/gtceu/api/block/AppearanceBlock.java @@ -8,8 +8,9 @@ import org.jetbrains.annotations.Nullable; -/// @deprecated Use normal Block class instead - replace `AppearanceBlock::getBlockAppearance` with -/// `Block::getAppearance` +/** + * @deprecated Use normal Block class instead - replace {@code AppearanceBlock::getBlockAppearance} with {@code Block::getAppearance} + */ @Deprecated(forRemoval = true) public class AppearanceBlock extends Block implements IAppearance { 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 1a5dce7d3ef..e38370f69ba 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 @@ -32,8 +32,8 @@ public abstract class MachineTrait implements ISyncManaged { public MachineTrait(MetaMachine machine) { this.machine = machine; this.capabilityValidator = side -> true; - /// Machine should never be null, unless this trait is a recipe handler instantiated outside a machine for - /// recipe search. + // Machine should never be null, unless this trait is a recipe handler instantiated outside a machine for + // recipe search. if (machine != null) machine.attachTrait(this); } 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 c99f47c3b64..aa7ceee4593 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 @@ -12,7 +12,9 @@ import java.util.Set; -/// A machine trait that provides special interaction behaviour. +/** + * A machine trait that provides special interaction behaviour. + */ public interface IInteractionTrait extends ITraitFeature { default Pair onToolClick(Set toolType, diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/IModifyFacingTrait.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/IModifyFacingTrait.java index 9dbfef44d59..dbf6928b867 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/IModifyFacingTrait.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/IModifyFacingTrait.java @@ -2,7 +2,9 @@ import net.minecraft.core.Direction; -/// A machine trait that modifies the rotation behaviour of a machine. +/** + * A machine trait that modifies the rotation behaviour of a machine. + */ public interface IModifyFacingTrait { default boolean isFacingValid(Direction direction) { 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 e3a27e1e52e..37671a06ebc 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,7 +14,9 @@ import java.util.Set; -/// A machine trait that overrides some of the default machine rendering behaviour +/** + * A machine trait that overrides some of the default machine rendering behaviour. + */ public interface IRenderingTrait extends ITraitFeature { default boolean shouldRenderGrid(Player player, BlockPos pos, BlockState state, ItemStack held, From a7444e33051a004f0f28d037d0e26749dc338f22 Mon Sep 17 00:00:00 2001 From: Gustavo Date: Mon, 19 Jan 2026 09:53:33 +1100 Subject: [PATCH 12/27] move trait logic to seperate class --- .../gtceu/api/machine/MetaMachine.java | 88 ++++++------------- .../api/machine/WorkableTieredMachine.java | 2 +- .../api/machine/feature/IFancyUIMachine.java | 2 +- .../multiblock/WorkableMultiblockMachine.java | 2 +- .../part/MultiblockPartMachine.java | 2 +- .../machine/steam/SteamWorkableMachine.java | 2 +- .../gtceu/api/machine/trait/MachineTrait.java | 2 +- .../api/machine/trait/MachineTraitHolder.java | 53 ++++++++++- .../trait/NotifiableComputationContainer.java | 6 +- .../recipe/condition/EUToStartCondition.java | 2 +- .../jade/provider/MachineTraitProvider.java | 2 +- .../provider/MachineTraitInfoProvider.java | 2 +- 12 files changed, 91 insertions(+), 74 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 bba202a46ab..47dad62d2d4 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java @@ -21,7 +21,7 @@ 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.MachineTraitType; +import com.gregtechceu.gtceu.api.machine.trait.MachineTraitHolder; import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; import com.gregtechceu.gtceu.api.machine.trait.feature.IInteractionTrait; import com.gregtechceu.gtceu.api.machine.trait.feature.IModifyFacingTrait; @@ -91,8 +91,6 @@ import appeng.api.networking.IInWorldGridNodeHost; import appeng.capabilities.Capabilities; import com.mojang.datafixers.util.Pair; -import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; -import it.unimi.dsi.fastutil.objects.ObjectArrayList; import lombok.AccessLevel; import lombok.Getter; import org.jetbrains.annotations.*; @@ -142,6 +140,9 @@ public class MetaMachine extends ManagedSyncBlockEntity implements IGregtechBloc @Getter(value = AccessLevel.PROTECTED) private final long offset = GTValues.RNG.nextInt(20); + @Getter + protected final MachineTraitHolder traitHolder; + private final List serverTicks; private final List waitingToAdd; @@ -149,8 +150,7 @@ public MetaMachine(BlockEntityCreationInfo info) { super(info); this.renderState = getDefinition().defaultRenderState(); this.coverContainer = new MachineCoverContainer(this); - this.traits = new ObjectArrayList<>(); - this.traitsByType = new Object2ObjectOpenHashMap<>(); + this.traitHolder = new MachineTraitHolder(this); this.serverTicks = new ArrayList<>(); this.waitingToAdd = new ArrayList<>(); } @@ -181,7 +181,7 @@ public void onRemoved() { @OverridingMethodsMustInvokeSuper public void onLoad() { - traits.forEach(MachineTrait::onMachineLoad); + getTraitHolder().getAllTraits().forEach(MachineTrait::onMachineLoad); coverContainer.onLoad(); // update the painted model property if the machine is painted @@ -208,7 +208,7 @@ public final void setRemoved() { @OverridingMethodsMustInvokeSuper public void onUnload() { - traits.forEach(MachineTrait::onMachineUnload); + getTraitHolder().getAllTraits().forEach(MachineTrait::onMachineUnload); coverContainer.onUnload(); for (TickableSubscription serverTick : serverTicks) { serverTick.unsubscribe(); @@ -216,40 +216,6 @@ public void onUnload() { serverTicks.clear(); } - ////////////////////////////////////// - // ***** Traits ****// - ////////////////////////////////////// - - private final List traits; - private final Map, List> traitsByType; - - public @Unmodifiable List getAllTraits() { - return Collections.unmodifiableList(traits); - } - - public void attachTrait(MachineTrait trait) { - var traitType = trait.getTraitType(); - traitsByType.computeIfAbsent(traitType, $ -> new ObjectArrayList<>()); - if (!traitType.allowsMultipleInstances() && traitsByType.get(traitType).size() == 1) { - throw new IllegalArgumentException("Attempted to add multiple traits of type: " + trait.getClass()); - } - traits.add(trait); - traitsByType.get(traitType).add(trait); - } - - // Gets the first trait with the specified type. - public @Nullable T getTrait(MachineTraitType type) { - traitsByType.computeIfAbsent(type, $ -> new ObjectArrayList<>()); - List traitList = traitsByType.get(type); - if (traitList.isEmpty()) return null; - return type.castTrait(traitList.get(0)); - } - - @SuppressWarnings("unchecked") - public List getTraits(MachineTraitType type) { - return (List) Collections.unmodifiableList(traitsByType.computeIfAbsent(type, $ -> new ObjectArrayList<>())); - } - ////////////////////////////////////// // ***** Tickable Manager ****// ////////////////////////////////////// @@ -369,7 +335,7 @@ public final Pair onToolClick(Set too if (result.getSecond() != InteractionResult.PASS) return result; - for (var trait : traits) { + for (var trait : getTraitHolder().getAllTraits()) { if (trait instanceof IInteractionTrait interactionTrait) { var r = interactionTrait.onToolClick(toolType, playerIn, hand, gridSide, hitResult); if (r.getSecond() != InteractionResult.PASS) return r; @@ -568,7 +534,7 @@ public boolean shouldRenderGrid(Player player, BlockPos pos, BlockState state, I if (cover.shouldRenderGrid(player, pos, state, held, toolTypes)) return true; } - for (var trait : traits) { + for (var trait : getTraitHolder().getAllTraits()) { if (trait instanceof IRenderingTrait renderingTrait) { var result = renderingTrait.shouldRenderGrid(player, pos, state, held, toolTypes); if (result) return result; @@ -603,7 +569,7 @@ public boolean shouldRenderGrid(Player player, BlockPos pos, BlockState state, I } } - for (var trait : traits) { + for (var trait : getTraitHolder().getAllTraits()) { if (trait instanceof IRenderingTrait renderingTrait) { var result = renderingTrait.sideTips(player, pos, state, toolTypes, side); if (result != null) return result; @@ -674,7 +640,7 @@ public boolean isFacingValid(Direction facing) { } } - for (var trait : traits) { + for (var trait : getTraitHolder().getAllTraits()) { if (trait instanceof IModifyFacingTrait modifyFacingTrait) { if (!modifyFacingTrait.isFacingValid(facing)) return false; } @@ -748,7 +714,7 @@ public int tintColor(int index) { public void onNeighborChanged(Block block, BlockPos fromPos, boolean isMoving) { coverContainer.onNeighborChanged(block, fromPos, isMoving); - traits.forEach(t -> t.onMachineNeighborChange(block, fromPos, isMoving)); + getTraitHolder().getAllTraits().forEach(t -> t.onMachineNeighborChange(block, fromPos, isMoving)); } public void animateTick(RandomSource random) {} @@ -767,7 +733,7 @@ public BlockState getBlockAppearance(BlockState state, BlockAndTintGetter level, @MustBeInvokedByOverriders public void updateModelData(ModelData.Builder builder) { - for (MachineTrait trait : this.getAllTraits()) { + for (MachineTrait trait : traitHolder.getAllTraits()) { trait.updateModelData(builder); } } @@ -921,7 +887,7 @@ public Predicate getFluidCapFilter(@Nullable Direction side, IO io) @Nullable public IItemHandlerModifiable getItemHandlerCap(@Nullable Direction side, boolean useCoverCapability) { - var list = getAllTraits().stream() + var list = traitHolder.getAllTraits().stream() .filter(IItemHandlerModifiable.class::isInstance) .filter(t -> t.hasCapability(side)) .map(IItemHandlerModifiable.class::cast) @@ -945,7 +911,7 @@ public IItemHandlerModifiable getItemHandlerCap(@Nullable Direction side, boolea @Nullable public IFluidHandlerModifiable getFluidHandlerCap(@Nullable Direction side, boolean useCoverCapability) { - var list = getAllTraits().stream() + var list = traitHolder.getAllTraits().stream() .filter(IFluidHandler.class::isInstance) .filter(t -> t.hasCapability(side)) .map(IFluidHandler.class::cast) @@ -995,7 +961,7 @@ private static List getCapabilitiesFromTraits(List traits, if (machine instanceof IWorkable workable) { return GTCapability.CAPABILITY_WORKABLE.orEmpty(cap, LazyOptional.of(() -> workable)); } - for (MachineTrait trait : machine.getAllTraits()) { + for (MachineTrait trait : machine.traitHolder.getAllTraits()) { if (trait instanceof IWorkable workable) { return GTCapability.CAPABILITY_WORKABLE.orEmpty(cap, LazyOptional.of(() -> workable)); } @@ -1004,13 +970,13 @@ private static List getCapabilitiesFromTraits(List traits, if (machine instanceof IControllable controllable) { return GTCapability.CAPABILITY_CONTROLLABLE.orEmpty(cap, LazyOptional.of(() -> controllable)); } - for (MachineTrait trait : machine.getAllTraits()) { + for (MachineTrait trait : machine.traitHolder.getAllTraits()) { if (trait instanceof IControllable controllable) { return GTCapability.CAPABILITY_CONTROLLABLE.orEmpty(cap, LazyOptional.of(() -> controllable)); } } } else if (cap == GTCapability.CAPABILITY_RECIPE_LOGIC) { - for (MachineTrait trait : machine.getAllTraits()) { + for (MachineTrait trait : machine.traitHolder.getAllTraits()) { if (trait instanceof RecipeLogic recipeLogic) { return GTCapability.CAPABILITY_RECIPE_LOGIC.orEmpty(cap, LazyOptional.of(() -> recipeLogic)); } @@ -1019,7 +985,7 @@ private static List getCapabilitiesFromTraits(List traits, if (machine instanceof IEnergyContainer energyContainer) { return GTCapability.CAPABILITY_ENERGY_CONTAINER.orEmpty(cap, LazyOptional.of(() -> energyContainer)); } - var list = getCapabilitiesFromTraits(machine.getAllTraits(), side, IEnergyContainer.class); + var list = getCapabilitiesFromTraits(machine.traitHolder.getAllTraits(), side, IEnergyContainer.class); if (!list.isEmpty()) { return GTCapability.CAPABILITY_ENERGY_CONTAINER.orEmpty(cap, LazyOptional.of(() -> list.size() == 1 ? list.get(0) : new EnergyContainerList(list))); @@ -1029,7 +995,7 @@ private static List getCapabilitiesFromTraits(List traits, return GTCapability.CAPABILITY_ENERGY_INFO_PROVIDER.orEmpty(cap, LazyOptional.of(() -> energyInfoProvider)); } - var list = getCapabilitiesFromTraits(machine.getAllTraits(), side, IEnergyInfoProvider.class); + var list = getCapabilitiesFromTraits(machine.traitHolder.getAllTraits(), side, IEnergyInfoProvider.class); if (!list.isEmpty()) { return GTCapability.CAPABILITY_ENERGY_INFO_PROVIDER.orEmpty(cap, LazyOptional.of(() -> list.size() == 1 ? list.get(0) : new EnergyInfoProviderList(list))); @@ -1063,7 +1029,7 @@ private static List getCapabilitiesFromTraits(List traits, if (machine instanceof IEnergyStorage energyStorage) { return ForgeCapabilities.ENERGY.orEmpty(cap, LazyOptional.of(() -> energyStorage)); } - var list = getCapabilitiesFromTraits(machine.getAllTraits(), side, IEnergyStorage.class); + var list = getCapabilitiesFromTraits(machine.traitHolder.getAllTraits(), side, IEnergyStorage.class); if (!list.isEmpty()) { // TODO wrap list in the future return ForgeCapabilities.ENERGY.orEmpty(cap, LazyOptional.of(() -> list.get(0))); @@ -1072,7 +1038,7 @@ private static List getCapabilitiesFromTraits(List traits, if (machine instanceof ILaserContainer energyContainer) { return GTCapability.CAPABILITY_LASER.orEmpty(cap, LazyOptional.of(() -> energyContainer)); } - var list = getCapabilitiesFromTraits(machine.getAllTraits(), side, ILaserContainer.class); + var list = getCapabilitiesFromTraits(machine.traitHolder.getAllTraits(), side, ILaserContainer.class); if (!list.isEmpty()) { return GTCapability.CAPABILITY_LASER.orEmpty(cap, LazyOptional.of(() -> list.size() == 1 ? list.get(0) : new LaserContainerList(list))); @@ -1082,7 +1048,7 @@ private static List getCapabilitiesFromTraits(List traits, return GTCapability.CAPABILITY_COMPUTATION_PROVIDER.orEmpty(cap, LazyOptional.of(() -> computationProvider)); } - var list = getCapabilitiesFromTraits(machine.getAllTraits(), side, IOpticalComputationProvider.class); + var list = getCapabilitiesFromTraits(machine.traitHolder.getAllTraits(), side, IOpticalComputationProvider.class); if (!list.isEmpty()) { return GTCapability.CAPABILITY_COMPUTATION_PROVIDER.orEmpty(cap, LazyOptional.of(() -> list.get(0))); } @@ -1090,7 +1056,7 @@ private static List getCapabilitiesFromTraits(List traits, if (machine instanceof IDataAccessHatch computationProvider) { return GTCapability.CAPABILITY_DATA_ACCESS.orEmpty(cap, LazyOptional.of(() -> computationProvider)); } - var list = getCapabilitiesFromTraits(machine.getAllTraits(), side, IDataAccessHatch.class); + var list = getCapabilitiesFromTraits(machine.traitHolder.getAllTraits(), side, IDataAccessHatch.class); if (!list.isEmpty()) { return GTCapability.CAPABILITY_DATA_ACCESS.orEmpty(cap, LazyOptional.of(() -> list.get(0))); } @@ -1098,7 +1064,7 @@ private static List getCapabilitiesFromTraits(List traits, if (machine instanceof IMonitorComponent monitorComponent) { return GTCapability.CAPABILITY_MONITOR_COMPONENT.orEmpty(cap, LazyOptional.of(() -> monitorComponent)); } - var list = getCapabilitiesFromTraits(machine.getAllTraits(), side, IMonitorComponent.class); + var list = getCapabilitiesFromTraits(machine.traitHolder.getAllTraits(), side, IMonitorComponent.class); if (!list.isEmpty()) { return GTCapability.CAPABILITY_MONITOR_COMPONENT.orEmpty(cap, LazyOptional.of(() -> list.get(0))); } @@ -1106,7 +1072,7 @@ private static List getCapabilitiesFromTraits(List traits, if (machine instanceof ICentralMonitor centralMonitor) { return GTCapability.CAPABILITY_CENTRAL_MONITOR.orEmpty(cap, LazyOptional.of(() -> centralMonitor)); } - var list = getCapabilitiesFromTraits(machine.getAllTraits(), side, ICentralMonitor.class); + var list = getCapabilitiesFromTraits(machine.traitHolder.getAllTraits(), side, ICentralMonitor.class); if (!list.isEmpty()) { return GTCapability.CAPABILITY_CENTRAL_MONITOR.orEmpty(cap, LazyOptional.of(() -> list.get(0))); } @@ -1129,7 +1095,7 @@ public static LazyOptional getGridNodeHostCapability(Capability cap, MetaM if (machine instanceof IInWorldGridNodeHost nodeHost) { return Capabilities.IN_WORLD_GRID_NODE_HOST.orEmpty(cap, LazyOptional.of(() -> nodeHost)); } - var list = getCapabilitiesFromTraits(machine.getAllTraits(), side, IInWorldGridNodeHost.class); + var list = getCapabilitiesFromTraits(machine.traitHolder.getAllTraits(), side, IInWorldGridNodeHost.class); if (!list.isEmpty()) { // TODO wrap list in the future (or not.) return Capabilities.IN_WORLD_GRID_NODE_HOST.orEmpty(cap, LazyOptional.of(() -> list.get(0))); 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 63cdda8eed4..524ed816642 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/WorkableTieredMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/WorkableTieredMachine.java @@ -117,7 +117,7 @@ public void onLoad() { // attach self traits Map>> ioTraits = new EnumMap<>(IO.class); - for (MachineTrait trait : getAllTraits()) { + for (MachineTrait trait : traitHolder.getAllTraits()) { if (trait instanceof IRecipeHandlerTrait handlerTrait) { ioTraits.computeIfAbsent(handlerTrait.getHandlerIO(), i -> new ArrayList<>()).add(handlerTrait); } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IFancyUIMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IFancyUIMachine.java index 56d1b2a7b18..715af3a835d 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IFancyUIMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IFancyUIMachine.java @@ -133,7 +133,7 @@ default void attachConfigurators(ConfiguratorPanel configuratorPanel) { @Override default void attachTooltips(TooltipsPanel tooltipsPanel) { tooltipsPanel.attachTooltips(self()); - self().getAllTraits().stream().filter(IFancyTooltip.class::isInstance).map(IFancyTooltip.class::cast) + self().getTraitHolder().getAllTraits().stream().filter(IFancyTooltip.class::isInstance).map(IFancyTooltip.class::cast) .forEach(tooltipsPanel::attachTooltips); } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/WorkableMultiblockMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/WorkableMultiblockMachine.java index eb06b1f5448..ec503aa84d6 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/WorkableMultiblockMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/WorkableMultiblockMachine.java @@ -139,7 +139,7 @@ public void onStructureFormed() { // attach self traits Map>> ioTraits = new EnumMap<>(IO.class); - for (MachineTrait trait : getAllTraits()) { + for (MachineTrait trait : traitHolder.getAllTraits()) { if (trait instanceof IRecipeHandlerTrait handlerTrait) { ioTraits.computeIfAbsent(handlerTrait.getHandlerIO(), i -> new ArrayList<>()).add(handlerTrait); } 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 ad8b38c19b0..c1c3640d981 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 @@ -87,7 +87,7 @@ protected RecipeHandlerList getHandlerList() { if (handlerList == null) { List> handlers = new ArrayList<>(); IO handlerIO = null; - for (var trait : getAllTraits()) { + for (var trait : traitHolder.getAllTraits()) { if (trait instanceof IRecipeHandlerTrait rht) { if (handlerIO == null) handlerIO = rht.getHandlerIO(); handlers.add(rht); 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 a035e534057..5f7f827cbc6 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 @@ -107,7 +107,7 @@ public void onLoad() { // attach self traits Map>> ioTraits = new Object2ObjectOpenHashMap<>(); - for (MachineTrait trait : getAllTraits()) { + for (MachineTrait trait : traitHolder.getAllTraits()) { if (trait instanceof IRecipeHandlerTrait handlerTrait) { ioTraits.computeIfAbsent(handlerTrait.getHandlerIO(), i -> new ArrayList<>()).add(handlerTrait); } 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 e38370f69ba..fdbc320a581 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 @@ -34,7 +34,7 @@ public MachineTrait(MetaMachine machine) { this.capabilityValidator = side -> true; // Machine should never be null, unless this trait is a recipe handler instantiated outside a machine for // recipe search. - if (machine != null) machine.attachTrait(this); + if (machine != null) machine.getTraitHolder().attachTrait(this); } public Level getLevel() { 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 3a4aacf147c..08084cdf6eb 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 @@ -1,4 +1,55 @@ package com.gregtechceu.gtceu.api.machine.trait; -public class MachineTraitHolder { +import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.syncsystem.ISyncManaged; +import com.gregtechceu.gtceu.syncsystem.SyncDataHolder; +import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; +import it.unimi.dsi.fastutil.objects.ObjectArrayList; +import lombok.Getter; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.Unmodifiable; + +import java.util.Collections; +import java.util.List; +import java.util.Map; + +public final class MachineTraitHolder { + + private final MetaMachine machine; + private final List traits; + private final Map, List> traitsByType; + + public MachineTraitHolder(MetaMachine machine) { + this.machine = machine; + this.traits = new ObjectArrayList<>(); + this.traitsByType = new Object2ObjectOpenHashMap<>(); + } + + public @Unmodifiable List getAllTraits() { + return Collections.unmodifiableList(traits); + } + + public void attachTrait(MachineTrait trait) { + var traitType = trait.getTraitType(); + traitsByType.computeIfAbsent(traitType, $ -> new ObjectArrayList<>()); + if (!traitType.allowsMultipleInstances() && traitsByType.get(traitType).size() == 1) { + throw new IllegalArgumentException("Attempted to add multiple traits of type: " + trait.getClass()); + } + traits.add(trait); + traitsByType.get(traitType).add(trait); + } + + // Gets the first trait with the specified type. + public @Nullable T getTrait(MachineTraitType type) { + List traitList = traitsByType.get(type); + if (traitList == null || traitList.isEmpty()) return null; + return type.castTrait(traitList.get(0)); + } + + @SuppressWarnings("unchecked") + public List getTraitsWithType(MachineTraitType type) { + List traitList = (List)traitsByType.get(type); + if (traitList == null) return List.of(); + return Collections.unmodifiableList(traitList); + } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableComputationContainer.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableComputationContainer.java index 4b11103ec5a..ebfe540dd43 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableComputationContainer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableComputationContainer.java @@ -75,7 +75,7 @@ public int requestCWUt(int cwut, boolean simulate, @NotNull Collection seen) { if (controller instanceof IOpticalComputationProvider provider) { return provider.getMaxCWUt(seen); } - for (MachineTrait trait : controller.self().getAllTraits()) { + for (MachineTrait trait : controller.self().getTraitHolder().getAllTraits()) { if (trait instanceof IOpticalComputationProvider provider) { return provider.getMaxCWUt(seen); } @@ -162,7 +162,7 @@ public boolean canBridge(@NotNull Collection seen) if (controller instanceof IOpticalComputationProvider provider) { return provider.canBridge(seen); } - for (MachineTrait trait : controller.self().getAllTraits()) { + for (MachineTrait trait : controller.self().getTraitHolder().getAllTraits()) { if (trait instanceof IOpticalComputationProvider provider) { return provider.canBridge(seen); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/EUToStartCondition.java b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/EUToStartCondition.java index 80e809f0c50..391d2300b7c 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/EUToStartCondition.java +++ b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/EUToStartCondition.java @@ -46,7 +46,7 @@ public Component getTooltips() { @Override public boolean testCondition(@NotNull GTRecipe recipe, @NotNull RecipeLogic recipeLogic) { - return recipeLogic.getMachine().getAllTraits().stream().filter(IEnergyContainer.class::isInstance) + return recipeLogic.getMachine().getTraitHolder().getAllTraits().stream().filter(IEnergyContainer.class::isInstance) .anyMatch(energyContainer -> ((IEnergyContainer) energyContainer).getEnergyCapacity() > euToStart); } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/MachineTraitProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/MachineTraitProvider.java index fe76d6badb5..209f0803135 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/MachineTraitProvider.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/MachineTraitProvider.java @@ -44,7 +44,7 @@ public void appendTooltip(ITooltip iTooltip, BlockAccessor block, IPluginConfig public void appendServerData(CompoundTag compoundTag, BlockAccessor blockAccessor) { var be = blockAccessor.getBlockEntity(); if (be instanceof MetaMachine machine) { - var t = machine.getTrait(traitType); + var t = machine.getTraitHolder().getTrait(traitType); if (t != null) write(compoundTag.getCompound(uid.toString()), t); } } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/MachineTraitInfoProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/top/provider/MachineTraitInfoProvider.java index d32d521c252..33977534b5f 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/top/provider/MachineTraitInfoProvider.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/top/provider/MachineTraitInfoProvider.java @@ -34,7 +34,7 @@ public void addProbeInfo(ProbeMode mode, IProbeInfo probeInfo, Player player, Le if (blockState.hasBlockEntity()) { BlockEntity blockEntity = world.getBlockEntity(data.getPos()); if (blockEntity instanceof MetaMachine machine) { - var t = machine.getTrait(traitType); + var t = machine.getTraitHolder().getTrait(traitType); if (t != null) addProbeInfo(t, probeInfo, player, blockEntity, data); } } From bf4cd0e43bc51fe5ad6a3fcd64ad64bd4c260c10 Mon Sep 17 00:00:00 2001 From: Gustavo Date: Mon, 19 Jan 2026 10:11:31 +1100 Subject: [PATCH 13/27] rename some methods and add comments --- .../gtceu/api/block/MetaMachineBlock.java | 11 ++++++++--- .../gregtechceu/gtceu/api/machine/MetaMachine.java | 14 +++++--------- .../gtceu/api/machine/trait/MachineTrait.java | 1 - ...difyFacingTrait.java => IFrontFacingTrait.java} | 5 +++-- .../machine/trait/feature/IInteractionTrait.java | 13 +++++++++++++ .../api/machine/trait/feature/IRenderingTrait.java | 9 +++++++-- 6 files changed, 36 insertions(+), 17 deletions(-) rename src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/{IModifyFacingTrait.java => IFrontFacingTrait.java} (53%) 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 d95edf61a33..89a5c7692b1 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/block/MetaMachineBlock.java +++ b/src/main/java/com/gregtechceu/gtceu/api/block/MetaMachineBlock.java @@ -10,6 +10,7 @@ import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; import com.gregtechceu.gtceu.api.machine.feature.*; +import com.gregtechceu.gtceu.api.machine.trait.feature.IInteractionTrait; import com.gregtechceu.gtceu.common.data.GTItems; import com.gregtechceu.gtceu.common.machine.owner.MachineOwner; import com.gregtechceu.gtceu.syncsystem.ManagedSyncBlockEntity; @@ -269,16 +270,16 @@ public void onRemove(BlockState pState, Level pLevel, BlockPos pPos, BlockState public InteractionResult use(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, BlockHitResult hit) { var machine = MetaMachine.getMachine(world, pos); + if (machine == null) return InteractionResult.FAIL; ItemStack itemStack = player.getItemInHand(hand); boolean shouldOpenUi = true; - if (machine != null && machine.getOwnerUUID() == null && player instanceof ServerPlayer sPlayer) { + if (machine.getOwnerUUID() == null && player instanceof ServerPlayer sPlayer) { machine.setOwnerUUID(sPlayer.getUUID()); } Set types = ToolHelper.getToolTypes(itemStack); - if (machine != null && - (!types.isEmpty() && ToolHelper.canUse(itemStack) || types.isEmpty() && player.isShiftKeyDown())) { + if (!types.isEmpty() && ToolHelper.canUse(itemStack) || types.isEmpty() && player.isShiftKeyDown()) { var result = machine.onToolClick(types, itemStack, new UseOnContext(player, hand, hit)); if (result.getSecond() == InteractionResult.CONSUME && player instanceof ServerPlayer serverPlayer) { ToolHelper.playToolSound(result.getFirst(), serverPlayer); @@ -298,6 +299,10 @@ public InteractionResult use(BlockState state, Level world, BlockPos pos, Player shouldOpenUi = gtToolItem.definition$shouldOpenUIAfterUse(new UseOnContext(player, hand, hit)); } + machine.getTraitHolder().getAllTraits().forEach(t -> { + if (t instanceof IInteractionTrait interactionTrait) interactionTrait.onUse(state, world, pos, player, hand, hit); + }); + if (machine instanceof IInteractedMachine interactedMachine) { var result = interactedMachine.onUse(state, world, pos, player, hand, hit); if (result != InteractionResult.PASS) return result; 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 47dad62d2d4..21092addc79 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java @@ -24,7 +24,7 @@ import com.gregtechceu.gtceu.api.machine.trait.MachineTraitHolder; import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; import com.gregtechceu.gtceu.api.machine.trait.feature.IInteractionTrait; -import com.gregtechceu.gtceu.api.machine.trait.feature.IModifyFacingTrait; +import com.gregtechceu.gtceu.api.machine.trait.feature.IFrontFacingTrait; import com.gregtechceu.gtceu.api.machine.trait.feature.IRenderingTrait; import com.gregtechceu.gtceu.api.misc.*; import com.gregtechceu.gtceu.api.pattern.util.RelativeDirection; @@ -536,7 +536,7 @@ public boolean shouldRenderGrid(Player player, BlockPos pos, BlockState state, I for (var trait : getTraitHolder().getAllTraits()) { if (trait instanceof IRenderingTrait renderingTrait) { - var result = renderingTrait.shouldRenderGrid(player, pos, state, held, toolTypes); + var result = renderingTrait.shouldRenderGridOverlay(player, pos, state, held, toolTypes); if (result) return result; } } @@ -611,10 +611,6 @@ public void addCollisionBoundingBox(List collisionList) { collisionList.add(Shapes.block()); } - public boolean canSetIoOnSide(@Nullable Direction direction) { - return !hasFrontFacing() || getFrontFacing() != direction; - } - public static Direction getFrontFacing(@Nullable MetaMachine machine) { return machine == null ? Direction.NORTH : machine.getFrontFacing(); } @@ -641,8 +637,8 @@ public boolean isFacingValid(Direction facing) { } for (var trait : getTraitHolder().getAllTraits()) { - if (trait instanceof IModifyFacingTrait modifyFacingTrait) { - if (!modifyFacingTrait.isFacingValid(facing)) return false; + if (trait instanceof IFrontFacingTrait modifyFacingTrait) { + if (!modifyFacingTrait.isValidFrontFace(facing)) return false; } } @@ -734,7 +730,7 @@ public BlockState getBlockAppearance(BlockState state, BlockAndTintGetter level, @MustBeInvokedByOverriders public void updateModelData(ModelData.Builder builder) { for (MachineTrait trait : traitHolder.getAllTraits()) { - trait.updateModelData(builder); + if (trait instanceof IRenderingTrait renderingTrait) renderingTrait.updateModelData(builder); } } 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 fdbc320a581..83d4c2d2e44 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 @@ -70,5 +70,4 @@ public void onMachineUnload() {} public void onMachineNeighborChange(Block block, BlockPos fromPos, boolean isMoving) {} - public void updateModelData(ModelData.Builder builder) {} } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/IModifyFacingTrait.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/IFrontFacingTrait.java similarity index 53% rename from src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/IModifyFacingTrait.java rename to src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/IFrontFacingTrait.java index dbf6928b867..05fcc34bf70 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/IModifyFacingTrait.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/IFrontFacingTrait.java @@ -5,9 +5,10 @@ /** * A machine trait that modifies the rotation behaviour of a machine. */ -public interface IModifyFacingTrait { +public interface IFrontFacingTrait { - default boolean isFacingValid(Direction direction) { + /// Returns if a machine can be rotated to be facing the given 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 aa7ceee4593..1f98d04533e 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 @@ -2,21 +2,34 @@ import com.gregtechceu.gtceu.api.item.tool.GTToolType; +import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.InteractionHand; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.phys.BlockHitResult; import com.mojang.datafixers.util.Pair; +import javax.annotation.Nullable; +import javax.annotation.ParametersAreNonnullByDefault; import java.util.Set; /** * A machine trait that provides special interaction behaviour. */ +@ParametersAreNonnullByDefault public interface IInteractionTrait extends ITraitFeature { + /// Called when a player interacts with a machine without a tool. + default InteractionResult onUse(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, + BlockHitResult hit) { + return InteractionResult.PASS; + } + + /// Called when a player interacts with a machine with a tool. default Pair onToolClick(Set toolType, Player player, InteractionHand hand, Direction gridSide, BlockHitResult hitResult) { 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 37671a06ebc..a3892a91992 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 @@ -10,17 +10,20 @@ 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; +import javax.annotation.ParametersAreNonnullByDefault; import java.util.Set; /** * A machine trait that overrides some of the default machine rendering behaviour. */ +@ParametersAreNonnullByDefault public interface IRenderingTrait extends ITraitFeature { - default boolean shouldRenderGrid(Player player, BlockPos pos, BlockState state, ItemStack held, - Set toolTypes) { + default boolean shouldRenderGridOverlay(Player player, BlockPos pos, BlockState state, ItemStack held, + Set toolTypes) { return false; } @@ -28,4 +31,6 @@ default boolean shouldRenderGrid(Player player, BlockPos pos, BlockState state, Direction side) { return null; } + + default void updateModelData(ModelData.Builder builder) {} } From b71bd0391549db43fa5f60948860490e245d8cae Mon Sep 17 00:00:00 2001 From: Gustavo Date: Mon, 19 Jan 2026 10:23:58 +1100 Subject: [PATCH 14/27] jdoc --- .../com/gregtechceu/gtceu/api/machine/MetaMachine.java | 10 +++++----- .../gtceu/api/machine/trait/MachineTrait.java | 3 --- .../api/machine/trait/feature/IRenderingTrait.java | 10 ++++++++-- 3 files changed, 13 insertions(+), 10 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 21092addc79..a247c811064 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java @@ -303,7 +303,7 @@ public final Pair onToolClick(Set too CoverBehavior coverBehavior = gridSide == null ? null : coverContainer.getCoverAtSide(gridSide); if (gridSide == null) gridSide = hitResult.getDirection(); - Pair result = Pair.of(null, InteractionResult.PASS); + Pair result = null; // Prioritize covers where they apply (Screwdriver, Soft Mallet) if (toolType.isEmpty() && playerIn.isShiftKeyDown()) { @@ -333,7 +333,7 @@ public final Pair onToolClick(Set too result = Pair.of(GTToolType.HARD_HAMMER, onHardHammerClick(playerIn, hand, gridSide, hitResult)); } - if (result.getSecond() != InteractionResult.PASS) return result; + if (result != null && result.getSecond() != InteractionResult.PASS) return result; for (var trait : getTraitHolder().getAllTraits()) { if (trait instanceof IInteractionTrait interactionTrait) { @@ -342,7 +342,7 @@ public final Pair onToolClick(Set too } } - return result; + return result != null ? result : Pair.of(null, InteractionResult.PASS); } protected InteractionResult onHardHammerClick(Player playerIn, InteractionHand hand, Direction gridSide, @@ -571,7 +571,7 @@ public boolean shouldRenderGrid(Player player, BlockPos pos, BlockState state, I for (var trait : getTraitHolder().getAllTraits()) { if (trait instanceof IRenderingTrait renderingTrait) { - var result = renderingTrait.sideTips(player, pos, state, toolTypes, side); + var result = renderingTrait.getGridOverlayIcon(player, pos, state, toolTypes, side); if (result != null) return result; } } @@ -1074,7 +1074,7 @@ private static List getCapabilitiesFromTraits(List traits, } } if (GTCEu.Mods.isAE2Loaded()) { - LazyOptional opt = MetaMachine.AE2CallWrapper.getGridNodeHostCapability(cap, machine, side); + LazyOptional opt = AE2CallWrapper.getGridNodeHostCapability(cap, machine, side); if (opt.isPresent()) { // noinspection unchecked return (LazyOptional) opt; 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 83d4c2d2e44..29ad6051cfa 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 @@ -62,12 +62,9 @@ public void scheduleRenderUpdate() { machine.scheduleRenderUpdate(); } - ////// MetaMachine methods which traits can hook into - public void onMachineLoad() {} public void onMachineUnload() {} public void onMachineNeighborChange(Block block, BlockPos fromPos, boolean isMoving) {} - } 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 a3892a91992..dc0ed60e98d 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 @@ -22,13 +22,19 @@ @ParametersAreNonnullByDefault public interface IRenderingTrait extends ITraitFeature { + /** + * Called when a player is looking at this machine, returns whether the grid overlay should be rendered. + */ default boolean shouldRenderGridOverlay(Player player, BlockPos pos, BlockState state, ItemStack held, Set toolTypes) { return false; } - default @Nullable ResourceTexture sideTips(Player player, BlockPos pos, BlockState state, Set toolTypes, - Direction side) { + /** + * Called when the machine grid overlay is being rendered to determine the icon to be rendered within the grid segment on a specifc side. + */ + default @Nullable ResourceTexture getGridOverlayIcon(Player player, BlockPos pos, BlockState state, Set toolTypes, + Direction side) { return null; } From 2db65daae010ba13eabd1874b7b3dcde11d6705e Mon Sep 17 00:00:00 2001 From: Gustavo Date: Mon, 19 Jan 2026 10:31:24 +1100 Subject: [PATCH 15/27] spotless --- .../gregtechceu/gtceu/api/block/AppearanceBlock.java | 3 ++- .../gregtechceu/gtceu/api/block/MetaMachineBlock.java | 3 ++- .../gregtechceu/gtceu/api/machine/MetaMachine.java | 8 +++++--- .../gtceu/api/machine/feature/IFancyUIMachine.java | 3 ++- .../gtceu/api/machine/trait/MachineTrait.java | 1 - .../gtceu/api/machine/trait/MachineTraitHolder.java | 6 ++---- .../gtceu/api/machine/trait/MachineTraitType.java | 4 +--- .../api/machine/trait/NotifiableItemStackHandler.java | 1 - .../api/machine/trait/feature/IInteractionTrait.java | 4 ++-- .../api/machine/trait/feature/IRenderingTrait.java | 11 +++++++---- .../common/machine/storage/QuantumTankMachine.java | 1 - .../gtceu/common/machine/trait/ConverterTrait.java | 2 -- .../common/recipe/condition/EUToStartCondition.java | 3 ++- .../integration/ae2/machine/trait/GridNodeHolder.java | 1 - .../ae2/machine/trait/GridNodeHostTrait.java | 1 - .../ae2/machine/trait/ProxySlotRecipeHandler.java | 1 - 16 files changed, 25 insertions(+), 28 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/api/block/AppearanceBlock.java b/src/main/java/com/gregtechceu/gtceu/api/block/AppearanceBlock.java index 21f456b6a96..a112471202c 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/block/AppearanceBlock.java +++ b/src/main/java/com/gregtechceu/gtceu/api/block/AppearanceBlock.java @@ -9,7 +9,8 @@ import org.jetbrains.annotations.Nullable; /** - * @deprecated Use normal Block class instead - replace {@code AppearanceBlock::getBlockAppearance} with {@code Block::getAppearance} + * @deprecated Use normal Block class instead - replace {@code AppearanceBlock::getBlockAppearance} with + * {@code Block::getAppearance} */ @Deprecated(forRemoval = true) public class AppearanceBlock extends Block implements IAppearance { 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 89a5c7692b1..2a5dc5c7480 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/block/MetaMachineBlock.java +++ b/src/main/java/com/gregtechceu/gtceu/api/block/MetaMachineBlock.java @@ -300,7 +300,8 @@ public InteractionResult use(BlockState state, Level world, BlockPos pos, Player } machine.getTraitHolder().getAllTraits().forEach(t -> { - if (t instanceof IInteractionTrait interactionTrait) interactionTrait.onUse(state, world, pos, player, hand, hit); + if (t instanceof IInteractionTrait interactionTrait) + interactionTrait.onUse(state, world, pos, player, hand, hit); }); if (machine instanceof IInteractedMachine interactedMachine) { 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 a247c811064..d27b034010c 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java @@ -23,8 +23,8 @@ import com.gregtechceu.gtceu.api.machine.trait.MachineTrait; import com.gregtechceu.gtceu.api.machine.trait.MachineTraitHolder; import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; -import com.gregtechceu.gtceu.api.machine.trait.feature.IInteractionTrait; import com.gregtechceu.gtceu.api.machine.trait.feature.IFrontFacingTrait; +import com.gregtechceu.gtceu.api.machine.trait.feature.IInteractionTrait; import com.gregtechceu.gtceu.api.machine.trait.feature.IRenderingTrait; import com.gregtechceu.gtceu.api.misc.*; import com.gregtechceu.gtceu.api.pattern.util.RelativeDirection; @@ -1044,7 +1044,8 @@ private static List getCapabilitiesFromTraits(List traits, return GTCapability.CAPABILITY_COMPUTATION_PROVIDER.orEmpty(cap, LazyOptional.of(() -> computationProvider)); } - var list = getCapabilitiesFromTraits(machine.traitHolder.getAllTraits(), side, IOpticalComputationProvider.class); + var list = getCapabilitiesFromTraits(machine.traitHolder.getAllTraits(), side, + IOpticalComputationProvider.class); if (!list.isEmpty()) { return GTCapability.CAPABILITY_COMPUTATION_PROVIDER.orEmpty(cap, LazyOptional.of(() -> list.get(0))); } @@ -1091,7 +1092,8 @@ public static LazyOptional getGridNodeHostCapability(Capability cap, MetaM if (machine instanceof IInWorldGridNodeHost nodeHost) { return Capabilities.IN_WORLD_GRID_NODE_HOST.orEmpty(cap, LazyOptional.of(() -> nodeHost)); } - var list = getCapabilitiesFromTraits(machine.traitHolder.getAllTraits(), side, IInWorldGridNodeHost.class); + var list = getCapabilitiesFromTraits(machine.traitHolder.getAllTraits(), side, + IInWorldGridNodeHost.class); if (!list.isEmpty()) { // TODO wrap list in the future (or not.) return Capabilities.IN_WORLD_GRID_NODE_HOST.orEmpty(cap, LazyOptional.of(() -> list.get(0))); diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IFancyUIMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IFancyUIMachine.java index 715af3a835d..d7dc3b46867 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IFancyUIMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IFancyUIMachine.java @@ -133,7 +133,8 @@ default void attachConfigurators(ConfiguratorPanel configuratorPanel) { @Override default void attachTooltips(TooltipsPanel tooltipsPanel) { tooltipsPanel.attachTooltips(self()); - self().getTraitHolder().getAllTraits().stream().filter(IFancyTooltip.class::isInstance).map(IFancyTooltip.class::cast) + self().getTraitHolder().getAllTraits().stream().filter(IFancyTooltip.class::isInstance) + .map(IFancyTooltip.class::cast) .forEach(tooltipsPanel::attachTooltips); } 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 29ad6051cfa..d3c0995c996 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 @@ -9,7 +9,6 @@ import net.minecraft.core.Direction; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; -import net.minecraftforge.client.model.data.ModelData; import lombok.Getter; import lombok.Setter; 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 08084cdf6eb..0c9418995d7 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 @@ -1,11 +1,9 @@ package com.gregtechceu.gtceu.api.machine.trait; import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.syncsystem.ISyncManaged; -import com.gregtechceu.gtceu.syncsystem.SyncDataHolder; + import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; import it.unimi.dsi.fastutil.objects.ObjectArrayList; -import lombok.Getter; import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Unmodifiable; @@ -48,7 +46,7 @@ public void attachTrait(MachineTrait trait) { @SuppressWarnings("unchecked") public List getTraitsWithType(MachineTraitType type) { - List traitList = (List)traitsByType.get(type); + List traitList = (List) traitsByType.get(type); if (traitList == null) return List.of(); return Collections.unmodifiableList(traitList); } 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 0d7fa732383..dd2a404842a 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 @@ -2,10 +2,8 @@ import org.jetbrains.annotations.NotNull; -import java.util.HashMap; -import java.util.Map; - public class MachineTraitType { + private final Class clazz; private final boolean allowMultipleInstances; 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 0ce87745b03..5b1c3e1b010 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 @@ -10,7 +10,6 @@ import com.gregtechceu.gtceu.api.recipe.ingredient.IntProviderIngredient; import com.gregtechceu.gtceu.api.recipe.ingredient.SizedIngredient; import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; -import com.gregtechceu.gtceu.common.machine.storage.QuantumChestMachine; import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.GTTransferUtils; 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 1f98d04533e..1f8d0e23ea7 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,10 +13,10 @@ import com.mojang.datafixers.util.Pair; -import javax.annotation.Nullable; -import javax.annotation.ParametersAreNonnullByDefault; import java.util.Set; +import javax.annotation.ParametersAreNonnullByDefault; + /** * A machine trait that provides special interaction behaviour. */ 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 dc0ed60e98d..bdf175dd2b2 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,13 +9,14 @@ 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; -import javax.annotation.ParametersAreNonnullByDefault; import java.util.Set; +import javax.annotation.ParametersAreNonnullByDefault; + /** * A machine trait that overrides some of the default machine rendering behaviour. */ @@ -31,9 +32,11 @@ 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. + * Called when the machine grid overlay is being rendered to determine the icon to be rendered within the grid + * segment on a specifc side. */ - default @Nullable ResourceTexture getGridOverlayIcon(Player player, BlockPos pos, BlockState state, Set toolTypes, + default @Nullable ResourceTexture getGridOverlayIcon(Player player, BlockPos pos, BlockState state, + Set toolTypes, Direction side) { return null; } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumTankMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumTankMachine.java index d28f3ab76ca..e469eab607a 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumTankMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumTankMachine.java @@ -383,7 +383,6 @@ public MachineTraitType getTraitType() { return TYPE; } - private final Predicate filter = f -> !isLocked() || getLockedFluid().isFluidEqual(f); public FluidCache(MetaMachine holder) { diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/trait/ConverterTrait.java b/src/main/java/com/gregtechceu/gtceu/common/machine/trait/ConverterTrait.java index 6e7cd543343..97da2cba431 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/trait/ConverterTrait.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/trait/ConverterTrait.java @@ -9,7 +9,6 @@ import com.gregtechceu.gtceu.api.machine.trait.MachineTraitType; import com.gregtechceu.gtceu.api.machine.trait.NotifiableEnergyContainer; import com.gregtechceu.gtceu.common.machine.electric.ConverterMachine; -import com.gregtechceu.gtceu.common.machine.storage.QuantumChestMachine; import com.gregtechceu.gtceu.syncsystem.annotations.RerenderOnChanged; import com.gregtechceu.gtceu.syncsystem.annotations.SaveField; import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; @@ -96,7 +95,6 @@ public MachineTraitType getTraitType() { return TYPE; } - public FEContainer(MetaMachine machine) { super(machine); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/EUToStartCondition.java b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/EUToStartCondition.java index 391d2300b7c..2c618d34cb5 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/EUToStartCondition.java +++ b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/EUToStartCondition.java @@ -46,7 +46,8 @@ public Component getTooltips() { @Override public boolean testCondition(@NotNull GTRecipe recipe, @NotNull RecipeLogic recipeLogic) { - return recipeLogic.getMachine().getTraitHolder().getAllTraits().stream().filter(IEnergyContainer.class::isInstance) + return recipeLogic.getMachine().getTraitHolder().getAllTraits().stream() + .filter(IEnergyContainer.class::isInstance) .anyMatch(energyContainer -> ((IEnergyContainer) energyContainer).getEnergyCapacity() > euToStart); } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/GridNodeHolder.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/GridNodeHolder.java index 8ac43963081..08cc2941e2e 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/GridNodeHolder.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/GridNodeHolder.java @@ -2,7 +2,6 @@ import com.gregtechceu.gtceu.api.machine.trait.MachineTrait; import com.gregtechceu.gtceu.api.machine.trait.MachineTraitType; -import com.gregtechceu.gtceu.common.machine.storage.QuantumChestMachine; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.integration.ae2.machine.feature.IGridConnectedMachine; import com.gregtechceu.gtceu.integration.ae2.utils.SerializableManagedGridNode; diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/GridNodeHostTrait.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/GridNodeHostTrait.java index 0b8b5f7992c..432ea613e63 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/GridNodeHostTrait.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/GridNodeHostTrait.java @@ -4,7 +4,6 @@ import com.gregtechceu.gtceu.api.machine.trait.MachineTrait; import com.gregtechceu.gtceu.api.machine.trait.MachineTraitType; -import com.gregtechceu.gtceu.common.machine.storage.QuantumChestMachine; import net.minecraft.core.Direction; import appeng.api.networking.GridHelper; diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/ProxySlotRecipeHandler.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/ProxySlotRecipeHandler.java index 3618b07ff83..f169a5370cf 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/ProxySlotRecipeHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/ProxySlotRecipeHandler.java @@ -101,7 +101,6 @@ public MachineTraitType getTraitType() { return TYPE; } - private IRecipeHandlerTrait proxy = null; private ISubscription proxySub = null; From 493c8ea187ae8e20fef8f646fbea0736891acc34 Mon Sep 17 00:00:00 2001 From: Gustavo Date: Tue, 20 Jan 2026 14:46:04 +1100 Subject: [PATCH 16/27] small code order change --- .../gtceu/api/machine/trait/MachineTraitHolder.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) 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 0c9418995d7..20b78258335 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 @@ -29,12 +29,14 @@ public MachineTraitHolder(MetaMachine machine) { public void attachTrait(MachineTrait trait) { var traitType = trait.getTraitType(); + traitsByType.computeIfAbsent(traitType, $ -> new ObjectArrayList<>()); if (!traitType.allowsMultipleInstances() && traitsByType.get(traitType).size() == 1) { throw new IllegalArgumentException("Attempted to add multiple traits of type: " + trait.getClass()); } - traits.add(trait); + traitsByType.get(traitType).add(trait); + traits.add(trait); } // Gets the first trait with the specified type. From cf806d5c7dc0d4c5f50895e5b9d62978fe0d9772 Mon Sep 17 00:00:00 2001 From: Gustavo Date: Fri, 23 Jan 2026 04:22:12 +1100 Subject: [PATCH 17/27] apply review changes --- .../com/gregtechceu/gtceu/api/machine/MetaMachine.java | 8 +++----- .../gtceu/api/machine/feature/IDropSaveMachine.java | 6 +++--- .../gtceu/api/machine/trait/FluidTankProxyTrait.java | 2 +- .../gtceu/api/machine/trait/ItemHandlerProxyTrait.java | 9 ++++----- .../gtceu/api/machine/trait/MachineTrait.java | 2 ++ .../gtceu/api/machine/trait/MachineTraitHolder.java | 8 ++++---- .../gtceu/api/machine/trait/MachineTraitType.java | 2 +- .../machine/trait/NotifiableComputationContainer.java | 2 +- .../api/machine/trait/NotifiableEnergyContainer.java | 2 +- .../gtceu/api/machine/trait/NotifiableFluidTank.java | 2 +- .../api/machine/trait/NotifiableItemStackHandler.java | 7 ++++++- .../api/machine/trait/NotifiableLaserContainer.java | 2 +- .../gregtechceu/gtceu/api/machine/trait/RecipeLogic.java | 2 +- .../api/machine/trait/feature/IFrontFacingTrait.java | 4 +++- .../multiblock/electric/PowerSubstationMachine.java | 2 +- .../common/machine/storage/QuantumChestMachine.java | 2 +- .../gtceu/common/machine/storage/QuantumTankMachine.java | 2 +- .../gtceu/common/machine/trait/ConverterTrait.java | 2 +- .../integration/ae2/machine/trait/GridNodeHolder.java | 2 +- .../integration/ae2/machine/trait/GridNodeHostTrait.java | 2 +- .../ae2/machine/trait/InternalSlotRecipeHandler.java | 4 ++-- .../ae2/machine/trait/ProxySlotRecipeHandler.java | 4 ++-- .../gtceu/syncsystem/ManagedSyncBlockEntity.java | 4 ++-- 23 files changed, 44 insertions(+), 38 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 d27b034010c..183d20345a2 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java @@ -99,7 +99,6 @@ import java.util.function.Consumer; import java.util.function.Predicate; -import javax.annotation.OverridingMethodsMustInvokeSuper; import javax.annotation.ParametersAreNonnullByDefault; import static com.gregtechceu.gtceu.api.item.tool.ToolHelper.getBehaviorsTag; @@ -179,7 +178,7 @@ public void onRemoved() { if (this instanceof IMachineLife l) l.onMachineRemoved(); } - @OverridingMethodsMustInvokeSuper + @MustBeInvokedByOverriders public void onLoad() { getTraitHolder().getAllTraits().forEach(MachineTrait::onMachineLoad); coverContainer.onLoad(); @@ -206,7 +205,7 @@ public final void setRemoved() { onUnload(); } - @OverridingMethodsMustInvokeSuper + @MustBeInvokedByOverriders public void onUnload() { getTraitHolder().getAllTraits().forEach(MachineTrait::onMachineUnload); coverContainer.onUnload(); @@ -310,8 +309,7 @@ public final Pair onToolClick(Set too if (coverBehavior != null) { result = Pair.of(null, coverBehavior.onScrewdriverClick(playerIn, hand, hitResult)); } - } - if (toolType.contains(GTToolType.SCREWDRIVER)) { + } else if (toolType.contains(GTToolType.SCREWDRIVER)) { if (coverBehavior != null) { result = Pair.of(GTToolType.SCREWDRIVER, coverBehavior.onScrewdriverClick(playerIn, hand, hitResult)); } else result = Pair.of(GTToolType.SCREWDRIVER, onScrewdriverClick(playerIn, hand, gridSide, hitResult)); diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IDropSaveMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IDropSaveMachine.java index 69169a80ab5..1f55ee1dfcc 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IDropSaveMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IDropSaveMachine.java @@ -2,7 +2,7 @@ import net.minecraft.nbt.CompoundTag; -import javax.annotation.OverridingMethodsMustInvokeSuper; +import org.jetbrains.annotations.MustBeInvokedByOverriders; /** * A machine that can save its contents when dropped. @@ -28,12 +28,12 @@ default boolean savePickClone() { * * @param tag The tag to save to. */ - @OverridingMethodsMustInvokeSuper + @MustBeInvokedByOverriders void saveToItem(CompoundTag tag); /** * Loads the contents of the block entity from a compound tag. */ - @OverridingMethodsMustInvokeSuper + @MustBeInvokedByOverriders void loadFromItem(CompoundTag tag); } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/FluidTankProxyTrait.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/FluidTankProxyTrait.java index d6e9208f616..22d54ff1ef4 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/FluidTankProxyTrait.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/FluidTankProxyTrait.java @@ -16,7 +16,7 @@ @Accessors(chain = true) public class FluidTankProxyTrait extends MachineTrait implements IFluidHandlerModifiable, ICapabilityTrait { - public static MachineTraitType TYPE = new MachineTraitType<>(FluidTankProxyTrait.class); + public static final MachineTraitType TYPE = new MachineTraitType<>(FluidTankProxyTrait.class); @Override public MachineTraitType getTraitType() { diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/ItemHandlerProxyTrait.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/ItemHandlerProxyTrait.java index 255bdcf1f45..ae16dbd9058 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/ItemHandlerProxyTrait.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/ItemHandlerProxyTrait.java @@ -4,6 +4,7 @@ import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.utils.GTTransferUtils; +import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.Direction; import net.minecraft.world.item.ItemStack; import net.minecraftforge.items.IItemHandlerModifiable; @@ -15,19 +16,17 @@ import org.jetbrains.annotations.Nullable; @Accessors(chain = true) +@MethodsReturnNonnullByDefault public class ItemHandlerProxyTrait extends MachineTrait implements IItemHandlerModifiable, ICapabilityTrait { - public static MachineTraitType TYPE = new MachineTraitType<>(ItemHandlerProxyTrait.class); + public static final MachineTraitType TYPE = new MachineTraitType<>( + ItemHandlerProxyTrait.class); @Override public MachineTraitType getTraitType() { return TYPE; } - public MachineTraitType getType() { - return TYPE; - } - @Getter public final IO capabilityIO; @Setter 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 d3c0995c996..77eb20d7f86 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 @@ -5,6 +5,7 @@ import com.gregtechceu.gtceu.syncsystem.ISyncManaged; import com.gregtechceu.gtceu.syncsystem.SyncDataHolder; +import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.level.Level; @@ -16,6 +17,7 @@ import java.util.function.Predicate; +@MethodsReturnNonnullByDefault public abstract class MachineTrait implements ISyncManaged { @Getter 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 20b78258335..4acb72831c7 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 @@ -5,7 +5,7 @@ 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; @@ -23,8 +23,8 @@ public MachineTraitHolder(MetaMachine machine) { this.traitsByType = new Object2ObjectOpenHashMap<>(); } - public @Unmodifiable List getAllTraits() { - return Collections.unmodifiableList(traits); + public @UnmodifiableView List getAllTraits() { + return traits; } public void attachTrait(MachineTrait trait) { @@ -47,7 +47,7 @@ public void attachTrait(MachineTrait trait) { } @SuppressWarnings("unchecked") - public List getTraitsWithType(MachineTraitType type) { + public @UnmodifiableView List getTraits(MachineTraitType type) { List traitList = (List) traitsByType.get(type); if (traitList == null) return List.of(); return Collections.unmodifiableList(traitList); 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 dd2a404842a..aeb337615c7 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 @@ -2,7 +2,7 @@ import org.jetbrains.annotations.NotNull; -public class MachineTraitType { +public final class MachineTraitType { private final Class clazz; private final boolean allowMultipleInstances; diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableComputationContainer.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableComputationContainer.java index ebfe540dd43..db277ba1a54 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableComputationContainer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableComputationContainer.java @@ -28,7 +28,7 @@ public class NotifiableComputationContainer extends NotifiableRecipeHandlerTrait implements IOpticalComputationHatch, IOpticalComputationReceiver { - public static MachineTraitType TYPE = new MachineTraitType<>( + public static final MachineTraitType TYPE = new MachineTraitType<>( NotifiableComputationContainer.class); @Override diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableEnergyContainer.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableEnergyContainer.java index 628b0c0c380..c280c1b6326 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableEnergyContainer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableEnergyContainer.java @@ -34,7 +34,7 @@ public class NotifiableEnergyContainer extends NotifiableRecipeHandlerTrait implements IEnergyContainer { - public static MachineTraitType TYPE = new MachineTraitType<>( + public static final MachineTraitType TYPE = new MachineTraitType<>( NotifiableEnergyContainer.class); @Override diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableFluidTank.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableFluidTank.java index 5c7c77dfb72..b4eedaf3e97 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableFluidTank.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableFluidTank.java @@ -26,7 +26,7 @@ public class NotifiableFluidTank extends NotifiableRecipeHandlerTrait implements ICapabilityTrait, IFluidHandlerModifiable { - public static MachineTraitType TYPE = new MachineTraitType<>(NotifiableFluidTank.class); + public static final MachineTraitType TYPE = new MachineTraitType<>(NotifiableFluidTank.class); @Override public MachineTraitType getTraitType() { 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 5b1c3e1b010..68ac24f5f24 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 @@ -15,6 +15,7 @@ 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; @@ -32,10 +33,14 @@ import java.util.function.IntFunction; import java.util.function.Predicate; +import javax.annotation.ParametersAreNonnullByDefault; + +@MethodsReturnNonnullByDefault +@ParametersAreNonnullByDefault public class NotifiableItemStackHandler extends NotifiableRecipeHandlerTrait implements ICapabilityTrait, IItemHandlerModifiable { - public static MachineTraitType TYPE = new MachineTraitType<>( + public static final MachineTraitType TYPE = new MachineTraitType<>( NotifiableItemStackHandler.class); @Override 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 9fc1940b2cd..f6cbafed5cf 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 @@ -10,7 +10,7 @@ public class NotifiableLaserContainer extends NotifiableEnergyContainer implements ILaserContainer { - public static MachineTraitType TYPE = new MachineTraitType<>( + public static final MachineTraitType TYPE = new MachineTraitType<>( NotifiableLaserContainer.class); public NotifiableLaserContainer(MetaMachine machine, long maxCapacity, long maxInputVoltage, long maxInputAmperage, diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeLogic.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeLogic.java index d59f5e9c045..97c2f479e73 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeLogic.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeLogic.java @@ -45,7 +45,7 @@ public class RecipeLogic extends MachineTrait implements IWorkable, IFancyTooltip { - public static MachineTraitType TYPE = new MachineTraitType<>(RecipeLogic.class, false); + public static final MachineTraitType TYPE = new MachineTraitType<>(RecipeLogic.class, false); @Override public MachineTraitType getTraitType() { 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 05fcc34bf70..cff3a98b3fb 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 @@ -7,7 +7,9 @@ */ public interface IFrontFacingTrait { - /// Returns if a machine can be rotated to be facing the given direction. + /** + * Returns if a machine can be rotated to be facing the given direction. + */ default boolean isValidFrontFace(Direction direction) { return true; } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/PowerSubstationMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/PowerSubstationMachine.java index 81027021e5f..413eb181e78 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/PowerSubstationMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/PowerSubstationMachine.java @@ -375,7 +375,7 @@ public void attachTooltips(TooltipsPanel tooltipsPanel) { public static class PowerStationEnergyBank extends MachineTrait implements INBTSerializable { - public static MachineTraitType TYPE = new MachineTraitType<>( + public static final MachineTraitType TYPE = new MachineTraitType<>( PowerStationEnergyBank.class); @Override diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumChestMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumChestMachine.java index a0f78562a0a..29096b7ff37 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumChestMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumChestMachine.java @@ -442,7 +442,7 @@ public Widget createUIWidget() { protected class ItemCache extends MachineTrait implements IItemHandlerModifiable { - public static MachineTraitType TYPE = new MachineTraitType<>(ItemCache.class); + public static final MachineTraitType TYPE = new MachineTraitType<>(ItemCache.class); @Override public MachineTraitType getTraitType() { diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumTankMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumTankMachine.java index e469eab607a..c675f5f3107 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumTankMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumTankMachine.java @@ -376,7 +376,7 @@ public Widget createUIWidget() { protected class FluidCache extends MachineTrait implements IFluidHandler { - public static MachineTraitType TYPE = new MachineTraitType<>(FluidCache.class); + public static final MachineTraitType TYPE = new MachineTraitType<>(FluidCache.class); @Override public MachineTraitType getTraitType() { diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/trait/ConverterTrait.java b/src/main/java/com/gregtechceu/gtceu/common/machine/trait/ConverterTrait.java index 97da2cba431..f70d6b98229 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/trait/ConverterTrait.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/trait/ConverterTrait.java @@ -88,7 +88,7 @@ public void serverTick() { private class FEContainer extends MachineTrait implements IEnergyStorage { - public static MachineTraitType TYPE = new MachineTraitType<>(FEContainer.class); + public static final MachineTraitType TYPE = new MachineTraitType<>(FEContainer.class); @Override public MachineTraitType getTraitType() { diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/GridNodeHolder.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/GridNodeHolder.java index 08cc2941e2e..eb5b2dce6db 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/GridNodeHolder.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/GridNodeHolder.java @@ -24,7 +24,7 @@ */ public class GridNodeHolder extends MachineTrait { - public static MachineTraitType TYPE = new MachineTraitType<>(GridNodeHolder.class); + public static final MachineTraitType TYPE = new MachineTraitType<>(GridNodeHolder.class); @Override public MachineTraitType getTraitType() { diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/GridNodeHostTrait.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/GridNodeHostTrait.java index 432ea613e63..17df1ca7a00 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/GridNodeHostTrait.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/GridNodeHostTrait.java @@ -14,7 +14,7 @@ public class GridNodeHostTrait extends MachineTrait implements IGridConnectedBlockEntity { - public static MachineTraitType TYPE = new MachineTraitType<>(GridNodeHostTrait.class); + public static final MachineTraitType TYPE = new MachineTraitType<>(GridNodeHostTrait.class); @Override public MachineTraitType getTraitType() { diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/InternalSlotRecipeHandler.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/InternalSlotRecipeHandler.java index 4418b1faf20..b2c675ba41f 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/InternalSlotRecipeHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/InternalSlotRecipeHandler.java @@ -60,7 +60,7 @@ public void setDistinct(boolean ignored, boolean notify) {} @Getter private static class SlotItemRecipeHandler extends NotifiableRecipeHandlerTrait { - public static MachineTraitType TYPE = new MachineTraitType<>( + public static final MachineTraitType TYPE = new MachineTraitType<>( SlotItemRecipeHandler.class); @Override @@ -103,7 +103,7 @@ public double getTotalContentAmount() { @Getter private static class SlotFluidRecipeHandler extends NotifiableRecipeHandlerTrait { - public static MachineTraitType TYPE = new MachineTraitType<>( + public static final MachineTraitType TYPE = new MachineTraitType<>( SlotFluidRecipeHandler.class); @Override diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/ProxySlotRecipeHandler.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/ProxySlotRecipeHandler.java index f169a5370cf..80ebceee189 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/ProxySlotRecipeHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/trait/ProxySlotRecipeHandler.java @@ -93,7 +93,7 @@ public void setDistinct(boolean ignored, boolean notify) {} @Getter private static class ProxyItemRecipeHandler extends NotifiableRecipeHandlerTrait { - public static MachineTraitType TYPE = new MachineTraitType<>( + public static final MachineTraitType TYPE = new MachineTraitType<>( ProxyItemRecipeHandler.class); @Override @@ -156,7 +156,7 @@ public int getPriority() { @Getter private static class ProxyFluidRecipeHandler extends NotifiableRecipeHandlerTrait { - public static MachineTraitType TYPE = new MachineTraitType<>( + public static final MachineTraitType TYPE = new MachineTraitType<>( ProxyFluidRecipeHandler.class); @Override diff --git a/src/main/java/com/gregtechceu/gtceu/syncsystem/ManagedSyncBlockEntity.java b/src/main/java/com/gregtechceu/gtceu/syncsystem/ManagedSyncBlockEntity.java index c87b7ba833f..04de631b808 100644 --- a/src/main/java/com/gregtechceu/gtceu/syncsystem/ManagedSyncBlockEntity.java +++ b/src/main/java/com/gregtechceu/gtceu/syncsystem/ManagedSyncBlockEntity.java @@ -14,8 +14,8 @@ import lombok.Getter; import lombok.Setter; +import org.jetbrains.annotations.MustBeInvokedByOverriders; -import javax.annotation.OverridingMethodsMustInvokeSuper; import javax.annotation.ParametersAreNonnullByDefault; /** @@ -50,7 +50,7 @@ protected final void saveAdditional(CompoundTag tag) { } @Override - @OverridingMethodsMustInvokeSuper + @MustBeInvokedByOverriders public void load(CompoundTag tag) { super.load(tag); getSyncDataHolder().deserializeNBT(tag, From b051d63905a12cd2983e5e0c7076353f7de0d800 Mon Sep 17 00:00:00 2001 From: Gustavo <77560533+gustovafing@users.noreply.github.com> Date: Fri, 23 Jan 2026 08:14:58 +1100 Subject: [PATCH 18/27] Update MachineTraitHolder.java Co-authored-by: TechLord22 <37029404+TechLord22@users.noreply.github.com> --- .../gtceu/api/machine/trait/MachineTraitHolder.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) 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 4acb72831c7..4b00725feb8 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 @@ -30,12 +30,12 @@ public MachineTraitHolder(MetaMachine machine) { public void attachTrait(MachineTrait trait) { var traitType = trait.getTraitType(); - traitsByType.computeIfAbsent(traitType, $ -> new ObjectArrayList<>()); - if (!traitType.allowsMultipleInstances() && traitsByType.get(traitType).size() == 1) { + var list = traitsByType.computeIfAbsent(traitType, $ -> new ObjectArrayList<>(1)); + if (!traitType.allowsMultipleInstances() && !list.isEmpty()) { throw new IllegalArgumentException("Attempted to add multiple traits of type: " + trait.getClass()); } - traitsByType.get(traitType).add(trait); + list.add(trait); traits.add(trait); } From 5be7a030375f18d620aff4d0ade08dbf7ef8f64f Mon Sep 17 00:00:00 2001 From: Gustavo Date: Fri, 23 Jan 2026 08:25:45 +1100 Subject: [PATCH 19/27] small organisation changes --- .../com/gregtechceu/gtceu/api/machine/MetaMachine.java | 2 +- .../gregtechceu/gtceu/api/machine/trait/MachineTrait.java | 5 +++-- .../gtceu/api/machine/trait/MachineTraitHolder.java | 7 ++++++- .../gtceu/api/machine/trait/NotifiableEnergyContainer.java | 4 ++++ .../gtceu/api/machine/trait/NotifiableLaserContainer.java | 5 +++++ 5 files changed, 19 insertions(+), 4 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 183d20345a2..c329b9db818 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java @@ -708,7 +708,7 @@ public int tintColor(int index) { public void onNeighborChanged(Block block, BlockPos fromPos, boolean isMoving) { coverContainer.onNeighborChanged(block, fromPos, isMoving); - getTraitHolder().getAllTraits().forEach(t -> t.onMachineNeighborChange(block, fromPos, isMoving)); + getTraitHolder().getAllTraits().forEach(t -> t.onMachineNeighborChanged(block, fromPos, isMoving)); } public void animateTick(RandomSource random) {} 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 77eb20d7f86..d0ee6a4a2a5 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 @@ -23,7 +23,6 @@ public abstract class MachineTrait implements ISyncManaged { @Getter protected final SyncDataHolder syncDataHolder = new SyncDataHolder(this); - public abstract MachineTraitType getTraitType(); @Getter protected final MetaMachine machine; @@ -38,6 +37,8 @@ public MachineTrait(MetaMachine machine) { if (machine != null) machine.getTraitHolder().attachTrait(this); } + public abstract MachineTraitType getTraitType(); + public Level getLevel() { return machine.getLevel(); } @@ -67,5 +68,5 @@ public void onMachineLoad() {} public void onMachineUnload() {} - public void onMachineNeighborChange(Block block, BlockPos fromPos, boolean isMoving) {} + public void onMachineNeighborChanged(Block block, BlockPos fromPos, 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 4acb72831c7..2e91a058c5d 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 @@ -39,13 +39,18 @@ public void attachTrait(MachineTrait trait) { traits.add(trait); } - // Gets the first trait with the specified type. + /** + * Gets the first trait with the specified type. + */ public @Nullable T getTrait(MachineTraitType type) { List traitList = traitsByType.get(type); if (traitList == null || traitList.isEmpty()) return null; return type.castTrait(traitList.get(0)); } + /** + * Get all traits with the specified type. + */ @SuppressWarnings("unchecked") public @UnmodifiableView List getTraits(MachineTraitType type) { List traitList = (List) traitsByType.get(type); diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableEnergyContainer.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableEnergyContainer.java index c280c1b6326..b000e54808d 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableEnergyContainer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableEnergyContainer.java @@ -19,6 +19,7 @@ import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.GTUtil; +import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.Direction; import net.minecraftforge.energy.IEnergyStorage; import net.minecraftforge.items.IItemHandlerModifiable; @@ -28,10 +29,13 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import javax.annotation.ParametersAreNonnullByDefault; import java.util.Collections; import java.util.List; import java.util.function.Predicate; +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault public class NotifiableEnergyContainer extends NotifiableRecipeHandlerTrait implements IEnergyContainer { public static final MachineTraitType TYPE = new MachineTraitType<>( 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 f6cbafed5cf..0d4c0011532 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 @@ -5,9 +5,14 @@ import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.utils.GTUtil; +import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.Direction; import net.minecraft.world.level.block.entity.BlockEntity; +import javax.annotation.ParametersAreNonnullByDefault; + +@ParametersAreNonnullByDefault +@MethodsReturnNonnullByDefault public class NotifiableLaserContainer extends NotifiableEnergyContainer implements ILaserContainer { public static final MachineTraitType TYPE = new MachineTraitType<>( From ce2fc607dc71845a912a355847db8ce6cbb04d5a Mon Sep 17 00:00:00 2001 From: Gustavo Date: Fri, 23 Jan 2026 08:43:53 +1100 Subject: [PATCH 20/27] fix type bound --- .../gtceu/api/machine/trait/NotifiableEnergyContainer.java | 2 +- .../gtceu/api/machine/trait/NotifiableLaserContainer.java | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableEnergyContainer.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableEnergyContainer.java index b000e54808d..226e1671d4c 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableEnergyContainer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableEnergyContainer.java @@ -42,7 +42,7 @@ public class NotifiableEnergyContainer extends NotifiableRecipeHandlerTrait getTraitType() { + public MachineTraitType getTraitType() { return TYPE; } 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 0d4c0011532..6f2642e1142 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 @@ -33,6 +33,11 @@ public static NotifiableLaserContainer receiverContainer(MetaMachine machine, lo return new NotifiableLaserContainer(machine, maxCapacity, maxInputVoltage, maxInputAmperage, 0L, 0L); } + @Override + public MachineTraitType getTraitType() { + return TYPE; + } + @Override public void serverTick() { amps = 0; From b1d4180dcbe9c9f4d07209b011bfd119ccfd9b63 Mon Sep 17 00:00:00 2001 From: Gustavo Date: Fri, 23 Jan 2026 08:45:28 +1100 Subject: [PATCH 21/27] spotless --- .../com/gregtechceu/gtceu/api/machine/trait/MachineTrait.java | 1 - .../gtceu/api/machine/trait/NotifiableEnergyContainer.java | 3 ++- 2 files changed, 2 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 d0ee6a4a2a5..0ff43b5c041 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 @@ -23,7 +23,6 @@ public abstract class MachineTrait implements ISyncManaged { @Getter protected final SyncDataHolder syncDataHolder = new SyncDataHolder(this); - @Getter protected final MetaMachine machine; @Setter diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableEnergyContainer.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableEnergyContainer.java index 226e1671d4c..5868a1fffe9 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableEnergyContainer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableEnergyContainer.java @@ -29,11 +29,12 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import javax.annotation.ParametersAreNonnullByDefault; import java.util.Collections; import java.util.List; import java.util.function.Predicate; +import javax.annotation.ParametersAreNonnullByDefault; + @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class NotifiableEnergyContainer extends NotifiableRecipeHandlerTrait implements IEnergyContainer { From c18b3b235d683f628d32ce75ccf049be5b72e3b1 Mon Sep 17 00:00:00 2001 From: Gustavo Date: Mon, 26 Jan 2026 09:50:47 +1100 Subject: [PATCH 22/27] fix trait onUse handling --- .../gtceu/api/block/MetaMachineBlock.java | 12 ++++++++---- .../gtceu/api/machine/trait/MachineTrait.java | 5 +++++ 2 files changed, 13 insertions(+), 4 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 2a5dc5c7480..61b111c9676 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/block/MetaMachineBlock.java +++ b/src/main/java/com/gregtechceu/gtceu/api/block/MetaMachineBlock.java @@ -299,10 +299,14 @@ public InteractionResult use(BlockState state, Level world, BlockPos pos, Player shouldOpenUi = gtToolItem.definition$shouldOpenUIAfterUse(new UseOnContext(player, hand, hit)); } - machine.getTraitHolder().getAllTraits().forEach(t -> { - if (t instanceof IInteractionTrait interactionTrait) - interactionTrait.onUse(state, world, pos, player, hand, hit); - }); + + for (var trait: machine.getTraitHolder().getAllTraits()) { + if (trait instanceof IInteractionTrait interactionTrait) { + InteractionResult result = interactionTrait.onUse(state, world, pos, player, hand, hit); + if (result.consumesAction()) break; + + } + } if (machine instanceof IInteractedMachine interactedMachine) { var result = interactedMachine.onUse(state, world, pos, player, hand, hit); 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 0ff43b5c041..28c3466a1fa 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 @@ -17,6 +17,11 @@ import java.util.function.Predicate; +/** + * 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}) + */ @MethodsReturnNonnullByDefault public abstract class MachineTrait implements ISyncManaged { From a4c4e418245e4d8885b71603a1f4abd63b69b5af Mon Sep 17 00:00:00 2001 From: Gustavo Date: Mon, 26 Jan 2026 10:22:24 +1100 Subject: [PATCH 23/27] add some package files --- .../gtceu/api/machine/MachineCoverContainer.java | 8 ++++---- .../gregtechceu/gtceu/api/machine/package-info.java | 4 ++++ .../gtceu/api/machine/trait/package-info.java | 4 ++++ .../gtceu/utils/AllTypesNonNullByDefault.java | 13 +++++++++++++ 4 files changed, 25 insertions(+), 4 deletions(-) create mode 100644 src/main/java/com/gregtechceu/gtceu/api/machine/package-info.java create mode 100644 src/main/java/com/gregtechceu/gtceu/api/machine/trait/package-info.java create mode 100644 src/main/java/com/gregtechceu/gtceu/utils/AllTypesNonNullByDefault.java 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 1e7981d0672..9605acf4fc0 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/MachineCoverContainer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/MachineCoverContainer.java @@ -27,7 +27,7 @@ public class MachineCoverContainer implements ICoverable, ISyncManaged { @SyncToClient @SaveField @RerenderOnChanged - private CoverBehavior up, down, north, south, west, east; + private @Nullable CoverBehavior up, down, north, south, west, east; public MachineCoverContainer(MetaMachine machine) { this.machine = machine; @@ -67,7 +67,7 @@ public boolean shouldRenderBackSide() { } @Override - public CoverBehavior getCoverAtSide(Direction side) { + public @Nullable CoverBehavior getCoverAtSide(Direction side) { return switch (side) { case UP -> up; case SOUTH -> south; @@ -92,12 +92,12 @@ public void setCoverAtSide(@Nullable CoverBehavior coverBehavior, Direction side } @Override - public IItemHandlerModifiable getItemHandlerCap(@Nullable Direction side, boolean useCoverCapability) { + public @Nullable IItemHandlerModifiable getItemHandlerCap(@Nullable Direction side, boolean useCoverCapability) { return machine.getItemHandlerCap(side, useCoverCapability); } @Override - public IFluidHandlerModifiable getFluidHandlerCap(@Nullable Direction side, boolean useCoverCapability) { + public @Nullable IFluidHandlerModifiable getFluidHandlerCap(@Nullable Direction side, boolean useCoverCapability) { return machine.getFluidHandlerCap(side, useCoverCapability); } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/package-info.java b/src/main/java/com/gregtechceu/gtceu/api/machine/package-info.java new file mode 100644 index 00000000000..4b88a050802 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/package-info.java @@ -0,0 +1,4 @@ +@AllTypesNonNullByDefault +package com.gregtechceu.gtceu.api.machine; + +import com.gregtechceu.gtceu.utils.AllTypesNonNullByDefault; \ No newline at end of file diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/package-info.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/package-info.java new file mode 100644 index 00000000000..79ba04de163 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/package-info.java @@ -0,0 +1,4 @@ +@AllTypesNonNullByDefault +package com.gregtechceu.gtceu.api.machine.trait; + +import com.gregtechceu.gtceu.utils.AllTypesNonNullByDefault; \ No newline at end of file diff --git a/src/main/java/com/gregtechceu/gtceu/utils/AllTypesNonNullByDefault.java b/src/main/java/com/gregtechceu/gtceu/utils/AllTypesNonNullByDefault.java new file mode 100644 index 00000000000..b451d07ef85 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/utils/AllTypesNonNullByDefault.java @@ -0,0 +1,13 @@ +package com.gregtechceu.gtceu.utils; + + +import javax.annotation.Nonnull; +import javax.annotation.meta.TypeQualifierDefault; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +@Nonnull +@TypeQualifierDefault({ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD}) +@Retention(RetentionPolicy.RUNTIME) +public @interface AllTypesNonNullByDefault {} From 64f71d2b1a369553569055bbc0923d1ab26d39d3 Mon Sep 17 00:00:00 2001 From: Gustavo Date: Mon, 26 Jan 2026 10:26:13 +1100 Subject: [PATCH 24/27] source retention --- .../com/gregtechceu/gtceu/utils/AllTypesNonNullByDefault.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/gregtechceu/gtceu/utils/AllTypesNonNullByDefault.java b/src/main/java/com/gregtechceu/gtceu/utils/AllTypesNonNullByDefault.java index b451d07ef85..9d017b416ce 100644 --- a/src/main/java/com/gregtechceu/gtceu/utils/AllTypesNonNullByDefault.java +++ b/src/main/java/com/gregtechceu/gtceu/utils/AllTypesNonNullByDefault.java @@ -9,5 +9,5 @@ @Nonnull @TypeQualifierDefault({ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD}) -@Retention(RetentionPolicy.RUNTIME) +@Retention(RetentionPolicy.SOURCE) public @interface AllTypesNonNullByDefault {} From a799f81d9b56bd3f744907e24bfe39dfcda2989b Mon Sep 17 00:00:00 2001 From: Gustavo Date: Mon, 26 Jan 2026 10:32:30 +1100 Subject: [PATCH 25/27] documented --- .../com/gregtechceu/gtceu/utils/AllTypesNonNullByDefault.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/gregtechceu/gtceu/utils/AllTypesNonNullByDefault.java b/src/main/java/com/gregtechceu/gtceu/utils/AllTypesNonNullByDefault.java index 9d017b416ce..578fef49652 100644 --- a/src/main/java/com/gregtechceu/gtceu/utils/AllTypesNonNullByDefault.java +++ b/src/main/java/com/gregtechceu/gtceu/utils/AllTypesNonNullByDefault.java @@ -1,13 +1,13 @@ package com.gregtechceu.gtceu.utils; -import javax.annotation.Nonnull; import javax.annotation.meta.TypeQualifierDefault; +import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; -@Nonnull +@Documented @TypeQualifierDefault({ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD}) @Retention(RetentionPolicy.SOURCE) public @interface AllTypesNonNullByDefault {} From d819bec64e8a226a55e412c716a70332d0273e2f Mon Sep 17 00:00:00 2001 From: Gustavo Date: Mon, 26 Jan 2026 12:57:16 +1100 Subject: [PATCH 26/27] switch to the jetbrains annotation --- .../gregtechceu/gtceu/api/machine/package-info.java | 4 ++-- .../gtceu/api/machine/trait/package-info.java | 4 ++-- .../gtceu/utils/AllTypesNonNullByDefault.java | 13 ------------- 3 files changed, 4 insertions(+), 17 deletions(-) delete mode 100644 src/main/java/com/gregtechceu/gtceu/utils/AllTypesNonNullByDefault.java diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/package-info.java b/src/main/java/com/gregtechceu/gtceu/api/machine/package-info.java index 4b88a050802..020aba29177 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/package-info.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/package-info.java @@ -1,4 +1,4 @@ -@AllTypesNonNullByDefault +@NotNullByDefault package com.gregtechceu.gtceu.api.machine; -import com.gregtechceu.gtceu.utils.AllTypesNonNullByDefault; \ No newline at end of file +import org.jetbrains.annotations.NotNullByDefault; \ No newline at end of file diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/package-info.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/package-info.java index 79ba04de163..08946926db6 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/package-info.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/package-info.java @@ -1,4 +1,4 @@ -@AllTypesNonNullByDefault +@NotNullByDefault package com.gregtechceu.gtceu.api.machine.trait; -import com.gregtechceu.gtceu.utils.AllTypesNonNullByDefault; \ No newline at end of file +import org.jetbrains.annotations.NotNullByDefault; \ No newline at end of file diff --git a/src/main/java/com/gregtechceu/gtceu/utils/AllTypesNonNullByDefault.java b/src/main/java/com/gregtechceu/gtceu/utils/AllTypesNonNullByDefault.java deleted file mode 100644 index 578fef49652..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/utils/AllTypesNonNullByDefault.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.gregtechceu.gtceu.utils; - - -import javax.annotation.meta.TypeQualifierDefault; -import java.lang.annotation.Documented; -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; - -@Documented -@TypeQualifierDefault({ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD}) -@Retention(RetentionPolicy.SOURCE) -public @interface AllTypesNonNullByDefault {} From bf7ab19f511cc8836262c5d8fa27e061989ebcf8 Mon Sep 17 00:00:00 2001 From: Gustavo Date: Mon, 26 Jan 2026 17:27:31 +1100 Subject: [PATCH 27/27] spotless --- .../com/gregtechceu/gtceu/api/block/MetaMachineBlock.java | 6 ++---- .../com/gregtechceu/gtceu/api/machine/package-info.java | 2 +- .../gregtechceu/gtceu/api/machine/trait/MachineTrait.java | 6 ++++-- .../gregtechceu/gtceu/api/machine/trait/package-info.java | 2 +- 4 files changed, 8 insertions(+), 8 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 61b111c9676..f2f4ee4248c 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/block/MetaMachineBlock.java +++ b/src/main/java/com/gregtechceu/gtceu/api/block/MetaMachineBlock.java @@ -299,12 +299,10 @@ public InteractionResult use(BlockState state, Level world, BlockPos pos, Player shouldOpenUi = gtToolItem.definition$shouldOpenUIAfterUse(new UseOnContext(player, hand, hit)); } - - for (var trait: machine.getTraitHolder().getAllTraits()) { + for (var trait : machine.getTraitHolder().getAllTraits()) { if (trait instanceof IInteractionTrait interactionTrait) { InteractionResult result = interactionTrait.onUse(state, world, pos, player, hand, hit); - if (result.consumesAction()) break; - + if (result != InteractionResult.PASS) return result; } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/package-info.java b/src/main/java/com/gregtechceu/gtceu/api/machine/package-info.java index 020aba29177..5b9e6e8e866 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/package-info.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/package-info.java @@ -1,4 +1,4 @@ @NotNullByDefault package com.gregtechceu.gtceu.api.machine; -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/api/machine/trait/MachineTrait.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/MachineTrait.java index 28c3466a1fa..9edf100f733 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 @@ -19,8 +19,10 @@ /** * 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}) + * 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}) */ @MethodsReturnNonnullByDefault public abstract class MachineTrait implements ISyncManaged { diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/package-info.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/package-info.java index 08946926db6..e50ed2813e2 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/package-info.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/package-info.java @@ -1,4 +1,4 @@ @NotNullByDefault package com.gregtechceu.gtceu.api.machine.trait; -import org.jetbrains.annotations.NotNullByDefault; \ No newline at end of file +import org.jetbrains.annotations.NotNullByDefault;