diff --git a/docs/content/Modpacks/Changes/v8.0.0.md b/docs/content/Modpacks/Changes/v8.0.0.md index 7d12c75e1b8..c41f965edeb 100644 --- a/docs/content/Modpacks/Changes/v8.0.0.md +++ b/docs/content/Modpacks/Changes/v8.0.0.md @@ -74,24 +74,8 @@ The constructors for a large number of machines have changed in order to simply #### **All Machines** - Replace the first constructor argument `IMachineBlockEntity holder` with `BlockEntityCreationInfo info` -#### `TieredEnergyMachine` -- Removed `createEnergyContainer` method -- Constructor now has an optional `NotifiableEnergyContainer` argument -#### `WorkableTieredMachine` -- Removed `createRecipeLogic`, `createImportItemHandler`, `createExportItemHandler`, `createImportFluidHandler`, `createExportFluidHandler` methods -- Added a new constructor: - - `BlockEntityCreationInfo info` - - `int tier` - - `RecipeLogic recipeLogic` Recipe logic, defaults to the standard `RecipeLogic` class. - - `int importSlots` Item import slots, defaults to the amount of slots in the machine's default recipe type. - - `int exportSlots` Same as above, but for item export slots. - - `int fluidImportSlots` As above, but for fluid import slots. - - `int fluidExportSlots` As above, but for fluid export slots. - - `boolean isEnergyEmitter` If this machine should emit/receiver energy. - - `Int2IntFunction tankScalingFunction` Fluid tank capacity scaling function. -#### `WorkableMultiblockMachine`, `WorkableElectricMultiblockMachine` and `SteamWorkableMachine` -- Removed `createRecipeLogic` method -- Constructor now has an optional `Supplier` argument, defaults to the standard `RecipeLogic` class +#### Machines with `createX` functions (e.g. `createEnergyContainer`, `createRecipeLogic`) +- Creation functions have been removed in favor of arguments being passed into the constructor. #### IMPORTANT MIGRATION NOTE: @@ -110,6 +94,8 @@ When migrating, remove the `this` argument from the machine trait constructor an A large number of machine feature interfaces have been removed, and have had their functionality merged into the standard MetaMachine class, or now use the new machine trait system: +- `IMultiPart` Use the `MultiblockPartMachine` class directly. +- `IWorkableMultiController` Use the `WorkableMultiblockMachine` class directly. - `ITurbineMachine` Use the `LargeTurbineMachine` class directly. - `IRotorHolderMachine` Use the `RotorHolderMachine` class directly. - `IMultiController` Use the `MultiblockControllerMachine` class directly. @@ -124,7 +110,7 @@ A large number of machine feature interfaces have been removed, and have had the - `IHPCAComputationProvider` - Use `HPCAComputationProviderTrait` - `IHPCACoolantProvider` - Use `HPCACoolantProviderTrait` - `IFluidRendererMulti` - Use `MultiblockFluidRendererTrait` - +- `IMaintenanceMachine` Use `MaintenanceHatchPartMachine` ## Connected texture reimplementation The mod's connected texture logic has been reimplemented in GTM proper. diff --git a/docs/content/Modpacks/Examples/Multiblocks/Greenhouse.md b/docs/content/Modpacks/Examples/Multiblocks/Greenhouse.md index 76bbe0754b2..77074d524f7 100644 --- a/docs/content/Modpacks/Examples/Multiblocks/Greenhouse.md +++ b/docs/content/Modpacks/Examples/Multiblocks/Greenhouse.md @@ -32,7 +32,7 @@ title: "Greenhouse" ## Multiblock === "JavaScript" ```js title="greenhouse_multiblock.js" - const $RecipeLogic = Java.loadClass('com.gregtechceu.gtceu.api.machine.trait.RecipeLogic') + const $RecipeLogic = Java.loadClass('com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeLogic') const $List = Java.loadClass('java.util.List') GTCEuStartupEvents.registry('gtceu:machine', event => { diff --git a/docs/content/Modpacks/Examples/Parallel-Hatch-Part.md b/docs/content/Modpacks/Examples/Parallel-Hatch-Part.md index 0b4fab16341..2d10349200e 100644 --- a/docs/content/Modpacks/Examples/Parallel-Hatch-Part.md +++ b/docs/content/Modpacks/Examples/Parallel-Hatch-Part.md @@ -37,7 +37,7 @@ GTCEuStartupEvents.registry("gtceu:machine", (event) => { } const $RecipeLogic = Java.loadClass( - "com.gregtechceu.gtceu.api.machine.trait.RecipeLogic" + "com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeLogic" ); builder .langValue(name + " Parallel Control Hatch") diff --git a/gradle/forge.versions.toml b/gradle/forge.versions.toml index 8cc8154749d..8682399d7ea 100644 --- a/gradle/forge.versions.toml +++ b/gradle/forge.versions.toml @@ -7,7 +7,7 @@ jei = "15.20.0.115" rei = "12.1.785" emi = "1.1.22+1.20.1" ae2 = "15.0.18" -mui = "3.3.0-SNAPSHOT" +mui = "3.3.1-SNAPSHOT" kubejs = "2001.6.5-build.16" rhino = "2001.2.3-build.10" architectury = "9.2.14" 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 34cc8448933..18b3708b685 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/block/MetaMachineBlock.java +++ b/src/main/java/com/gregtechceu/gtceu/api/block/MetaMachineBlock.java @@ -120,12 +120,8 @@ public void setPlacedBy(Level pLevel, BlockPos pPos, BlockState pState, @Nullabl machine.setOwnerUUID(sPlayer.getUUID()); } - if (machine instanceof IDropSaveMachine dropSaveMachine) { - CompoundTag tag = pStack.getTag(); - if (tag != null) { - dropSaveMachine.loadFromItem(tag); - } - } + CompoundTag tag = pStack.getTag(); + if (tag != null) machine.loadFromItem(tag); } } } @@ -187,10 +183,8 @@ public BlockState getStateForPlacement(BlockPlaceContext context) { @Override public ItemStack getCloneItemStack(BlockGetter level, BlockPos pos, BlockState state) { ItemStack itemStack = super.getCloneItemStack(level, pos, state); - if (MetaMachine.getMachine(level, pos) instanceof IDropSaveMachine dropSaveMachine && - dropSaveMachine.savePickClone()) { - dropSaveMachine.saveToItem(itemStack.getOrCreateTag()); - } + var machine = MetaMachine.getMachine(level, pos); + if (machine != null) machine.saveToItem(itemStack.getOrCreateTag(), true); return itemStack; } @@ -243,13 +237,11 @@ public List getDrops(BlockState state, LootParams.Builder builder) { BlockEntity be = builder.getOptionalParameter(LootContextParams.BLOCK_ENTITY); if (be instanceof MetaMachine machine) { machine.modifyDrops(drops); - if (machine instanceof IDropSaveMachine dropSaveMachine && dropSaveMachine.saveBreak()) { - for (ItemStack drop : drops) { - if (drop.getItem() instanceof MetaMachineItem item && item.getBlock() == this) { - dropSaveMachine.saveToItem(drop.getOrCreateTag()); - // break here to not dupe contents if a machine drops multiple of itself for whatever reason. - break; - } + for (ItemStack drop : drops) { + if (drop.getItem() instanceof MetaMachineItem item && item.getBlock() == this) { + machine.saveToItem(drop.getOrCreateTag(), false); + // break here to not dupe contents if a machine drops multiple of itself for whatever reason. + break; } } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/blockentity/PipeBlockEntity.java b/src/main/java/com/gregtechceu/gtceu/api/blockentity/PipeBlockEntity.java index ee4cbe86a61..6b1e1c399e9 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/blockentity/PipeBlockEntity.java +++ b/src/main/java/com/gregtechceu/gtceu/api/blockentity/PipeBlockEntity.java @@ -40,6 +40,7 @@ import lombok.Getter; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.UnknownNullability; import java.util.ArrayList; import java.util.List; @@ -101,6 +102,11 @@ public long getOffsetTimer() { return level == null ? offset : (level.getServer().getTickCount() + offset); } + @Override + public @UnknownNullability Level getLevel() { + return super.getLevel(); + } + @Override public void setRemoved() { super.setRemoved(); @@ -327,7 +333,7 @@ public UITexture getPipeTexture(boolean isBlock) { @Override public @Nullable UITexture sideTips(Player player, BlockPos pos, BlockState state, Set toolTypes, - Direction side) { + ItemStack held, Direction side) { if (toolTypes.contains(getPipeTuneTool())) { if (player.isShiftKeyDown() && this.canHaveBlockedFaces()) { return getPipeTexture(isBlocked(side)); @@ -337,7 +343,7 @@ public UITexture getPipeTexture(boolean isBlock) { } var cover = coverContainer.getCoverAtSide(side); if (cover != null) { - return cover.sideTips(player, pos, state, toolTypes, side); + return cover.sideTips(player, pos, state, toolTypes, held, side); } return null; } diff --git a/src/main/java/com/gregtechceu/gtceu/api/capability/GTCapability.java b/src/main/java/com/gregtechceu/gtceu/api/capability/GTCapability.java index fc3b3a420d2..f44b9961765 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/capability/GTCapability.java +++ b/src/main/java/com/gregtechceu/gtceu/api/capability/GTCapability.java @@ -1,6 +1,5 @@ package com.gregtechceu.gtceu.api.capability; -import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMaintenanceMachine; import com.gregtechceu.gtceu.common.capability.MedicalConditionTracker; import net.minecraftforge.common.capabilities.Capability; @@ -20,8 +19,6 @@ public class GTCapability { .get(new CapabilityToken<>() {}); public static final Capability CAPABILITY_ELECTRIC_ITEM = CapabilityManager .get(new CapabilityToken<>() {}); - public static final Capability CAPABILITY_MAINTENANCE_MACHINE = CapabilityManager - .get(new CapabilityToken<>() {}); public static final Capability CAPABILITY_LASER = CapabilityManager .get(new CapabilityToken<>() {}); public static final Capability CAPABILITY_COMPUTATION_PROVIDER = CapabilityManager @@ -43,7 +40,6 @@ public static void register(RegisterCapabilitiesEvent event) { event.register(IWorkable.class); event.register(IControllable.class); event.register(IElectricItem.class); - event.register(IMaintenanceMachine.class); event.register(ILaserContainer.class); event.register(IOpticalComputationProvider.class); event.register(IDataAccessHatch.class); diff --git a/src/main/java/com/gregtechceu/gtceu/api/capability/GTCapabilityHelper.java b/src/main/java/com/gregtechceu/gtceu/api/capability/GTCapabilityHelper.java index b8b78742232..55bf8be59de 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/capability/GTCapabilityHelper.java +++ b/src/main/java/com/gregtechceu/gtceu/api/capability/GTCapabilityHelper.java @@ -1,6 +1,5 @@ package com.gregtechceu.gtceu.api.capability; -import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMaintenanceMachine; import com.gregtechceu.gtceu.common.capability.MedicalConditionTracker; import net.minecraft.core.BlockPos; @@ -75,11 +74,6 @@ public static IEnergyStorage getForgeEnergy(Level level, BlockPos pos, @Nullable return null; } - @Nullable - public static IMaintenanceMachine getMaintenanceMachine(Level level, BlockPos pos, @Nullable Direction side) { - return getBlockEntityCapability(GTCapability.CAPABILITY_MAINTENANCE_MACHINE, level, pos, side); - } - @Nullable public static ILaserContainer getLaser(Level level, BlockPos pos, @Nullable Direction side) { return getBlockEntityCapability(GTCapability.CAPABILITY_LASER, level, pos, side); diff --git a/src/main/java/com/gregtechceu/gtceu/api/capability/IOpticalComputationReceiver.java b/src/main/java/com/gregtechceu/gtceu/api/capability/IOpticalComputationReceiver.java index 204a6c311ad..40259d0d91f 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/capability/IOpticalComputationReceiver.java +++ b/src/main/java/com/gregtechceu/gtceu/api/capability/IOpticalComputationReceiver.java @@ -1,6 +1,6 @@ package com.gregtechceu.gtceu.api.capability; -import com.gregtechceu.gtceu.api.machine.trait.NotifiableComputationContainer; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableComputationContainer; /** * Used in conjunction with {@link NotifiableComputationContainer}. diff --git a/src/main/java/com/gregtechceu/gtceu/api/capability/recipe/CWURecipeCapability.java b/src/main/java/com/gregtechceu/gtceu/api/capability/recipe/CWURecipeCapability.java index cc7fbc16e07..fb99a7d0188 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/capability/recipe/CWURecipeCapability.java +++ b/src/main/java/com/gregtechceu/gtceu/api/capability/recipe/CWURecipeCapability.java @@ -2,7 +2,7 @@ import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.api.machine.trait.NotifiableComputationContainer; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableComputationContainer; import com.gregtechceu.gtceu.api.recipe.content.ContentModifier; import com.gregtechceu.gtceu.api.recipe.content.SerializerInteger; diff --git a/src/main/java/com/gregtechceu/gtceu/api/capability/recipe/EURecipeCapability.java b/src/main/java/com/gregtechceu/gtceu/api/capability/recipe/EURecipeCapability.java index 12a51b8c59e..4738c35b86e 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/capability/recipe/EURecipeCapability.java +++ b/src/main/java/com/gregtechceu/gtceu/api/capability/recipe/EURecipeCapability.java @@ -4,7 +4,7 @@ import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.feature.IOverclockMachine; import com.gregtechceu.gtceu.api.machine.feature.ITieredMachine; -import com.gregtechceu.gtceu.api.machine.trait.NotifiableEnergyContainer; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableEnergyContainer; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.chance.logic.ChanceLogic; import com.gregtechceu.gtceu.api.recipe.content.Content; diff --git a/src/main/java/com/gregtechceu/gtceu/api/capability/recipe/FluidRecipeCapability.java b/src/main/java/com/gregtechceu/gtceu/api/capability/recipe/FluidRecipeCapability.java index 1db210ce895..84ff1b51b05 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/capability/recipe/FluidRecipeCapability.java +++ b/src/main/java/com/gregtechceu/gtceu/api/capability/recipe/FluidRecipeCapability.java @@ -2,7 +2,10 @@ import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.api.machine.trait.*; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableFluidTank; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeHandlerGroup; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeHandlerGroupDistinctness; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeHandlerList; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.content.Content; import com.gregtechceu.gtceu.api.recipe.content.ContentModifier; diff --git a/src/main/java/com/gregtechceu/gtceu/api/capability/recipe/IRecipeCapabilityHolder.java b/src/main/java/com/gregtechceu/gtceu/api/capability/recipe/IRecipeCapabilityHolder.java index 9b63ef2c806..dc456ce8069 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/capability/recipe/IRecipeCapabilityHolder.java +++ b/src/main/java/com/gregtechceu/gtceu/api/capability/recipe/IRecipeCapabilityHolder.java @@ -1,6 +1,6 @@ package com.gregtechceu.gtceu.api.capability.recipe; -import com.gregtechceu.gtceu.api.machine.trait.RecipeHandlerList; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeHandlerList; import it.unimi.dsi.fastutil.objects.Reference2ObjectOpenHashMap; import org.jetbrains.annotations.NotNull; diff --git a/src/main/java/com/gregtechceu/gtceu/api/capability/recipe/ItemRecipeCapability.java b/src/main/java/com/gregtechceu/gtceu/api/capability/recipe/ItemRecipeCapability.java index 41e6c0ca736..3627dc87c22 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/capability/recipe/ItemRecipeCapability.java +++ b/src/main/java/com/gregtechceu/gtceu/api/capability/recipe/ItemRecipeCapability.java @@ -2,10 +2,10 @@ import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.api.machine.trait.*; -import com.gregtechceu.gtceu.api.machine.trait.RecipeHandlerGroup; -import com.gregtechceu.gtceu.api.machine.trait.RecipeHandlerGroupDistinctness; -import com.gregtechceu.gtceu.api.machine.trait.RecipeHandlerList; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableItemStackHandler; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeHandlerGroup; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeHandlerGroupDistinctness; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeHandlerList; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.content.Content; import com.gregtechceu.gtceu.api.recipe.content.ContentModifier; diff --git a/src/main/java/com/gregtechceu/gtceu/api/capability/recipe/RecipeCapability.java b/src/main/java/com/gregtechceu/gtceu/api/capability/recipe/RecipeCapability.java index 847aa27650e..4aa511e536c 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/capability/recipe/RecipeCapability.java +++ b/src/main/java/com/gregtechceu/gtceu/api/capability/recipe/RecipeCapability.java @@ -2,7 +2,7 @@ import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.api.machine.trait.NotifiableRecipeHandlerTrait; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableRecipeHandlerTrait; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.content.Content; import com.gregtechceu.gtceu.api.recipe.content.ContentModifier; diff --git a/src/main/java/com/gregtechceu/gtceu/api/cover/CoverBehavior.java b/src/main/java/com/gregtechceu/gtceu/api/cover/CoverBehavior.java index 9cbdf8e3cd0..2ab8efef8fb 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/cover/CoverBehavior.java +++ b/src/main/java/com/gregtechceu/gtceu/api/cover/CoverBehavior.java @@ -190,7 +190,7 @@ public boolean shouldRenderGrid(Player player, BlockPos pos, BlockState state, I @Override public @Nullable UITexture sideTips(Player player, BlockPos pos, BlockState state, Set toolTypes, - Direction side) { + ItemStack held, Direction side) { if (toolTypes.contains(GTToolType.CROWBAR)) { return GTGuiTextures.TOOL_REMOVE_COVER; } diff --git a/src/main/java/com/gregtechceu/gtceu/api/item/tool/IToolGridHighlight.java b/src/main/java/com/gregtechceu/gtceu/api/item/tool/IToolGridHighlight.java index d91f04b3940..9066f456808 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/item/tool/IToolGridHighlight.java +++ b/src/main/java/com/gregtechceu/gtceu/api/item/tool/IToolGridHighlight.java @@ -36,11 +36,12 @@ default boolean shouldRenderGrid(Player player, BlockPos pos, BlockState state, * @param pos Block pos * @param state Block state * @param toolTypes The GT tool types of the held item, if any + * @param held * @param side The machine side which this grid segment correspond to * @return The icon to be rendered, or null */ default @Nullable UITexture sideTips(Player player, BlockPos pos, BlockState state, Set toolTypes, - Direction side) { + ItemStack held, Direction side) { return null; } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/item/tool/ToolHelper.java b/src/main/java/com/gregtechceu/gtceu/api/item/tool/ToolHelper.java index 1fd8a17c0c2..a6093fe5aa1 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/item/tool/ToolHelper.java +++ b/src/main/java/com/gregtechceu/gtceu/api/item/tool/ToolHelper.java @@ -12,7 +12,7 @@ import com.gregtechceu.gtceu.api.data.tag.TagPrefix; import com.gregtechceu.gtceu.api.item.IGTTool; import com.gregtechceu.gtceu.api.item.tool.aoe.AoESymmetrical; -import com.gregtechceu.gtceu.api.machine.trait.RecipeHandlerList; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeHandlerList; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.RecipeHelper; import com.gregtechceu.gtceu.api.recipe.content.Content; 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 445e2013874..ba66115ecce 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/MachineCoverContainer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/MachineCoverContainer.java @@ -53,7 +53,7 @@ public MachineCoverContainer(MetaMachine machine) { } @Override - public MachineTraitType getTraitType() { + public MachineTraitType getTraitType() { return TYPE; } @@ -90,10 +90,10 @@ public boolean shouldRenderGridOverlay(Player player, BlockPos pos, BlockState s @Override public @Nullable UITexture getGridOverlayIcon(Player player, BlockPos pos, BlockState state, - Set toolTypes, Direction side) { + Set toolTypes, ItemStack held, Direction side) { var cover = getCoverAtSide(side); if (cover != null) { - return cover.sideTips(player, pos, state, toolTypes, side); + return cover.sideTips(player, pos, state, toolTypes, held, side); } return null; } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/MachineDefinition.java b/src/main/java/com/gregtechceu/gtceu/api/machine/MachineDefinition.java index ff57306e85e..8ffedca5b37 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/MachineDefinition.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/MachineDefinition.java @@ -32,7 +32,6 @@ import lombok.Setter; import lombok.experimental.Accessors; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.EnumMap; @@ -61,10 +60,10 @@ public class MachineDefinition implements Supplier { private Supplier> blockEntityTypeSupplier; @Getter @Setter - private @NotNull GTRecipeType @NotNull [] recipeTypes; + private GTRecipeType[] recipeTypes; @Getter @Setter - private int tier; + private int tier = -1; @Getter @Setter private int defaultPaintingColor; @@ -74,19 +73,15 @@ public class MachineDefinition implements Supplier { @Getter @Setter private boolean alwaysTryModifyRecipe; - @NotNull @Getter @Setter - private BiPredicate beforeWorking = (machine, recipe) -> true; - @NotNull + private BiPredicate beforeWorking = (machine, recipe) -> true; @Getter @Setter private Predicate onWorking = (machine) -> true; - @NotNull @Getter @Setter private Consumer onWaiting = (machine) -> {}; - @NotNull @Getter @Setter private Consumer afterWorking = (machine) -> {}; @@ -141,6 +136,10 @@ public MachineDefinition(ResourceLocation id) { this.id = id; } + public boolean isTiered() { + return tier != -1; + } + public final void registerDefaultState(MachineRenderState state) { this.defaultRenderState = state; } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/MachineInstanceFactory.java b/src/main/java/com/gregtechceu/gtceu/api/machine/MachineInstanceFactory.java new file mode 100644 index 00000000000..7adb795bd99 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/MachineInstanceFactory.java @@ -0,0 +1,39 @@ +package com.gregtechceu.gtceu.api.machine; + +import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; + +import java.util.function.Consumer; + +@FunctionalInterface +public interface MachineInstanceFactory { + + T buildMachine(BlockEntityCreationInfo info); + + default MachineInstanceFactory andThen(Consumer modifier) { + return (info) -> { + T machine = this.buildMachine(info); + modifier.accept(machine); + return machine; + }; + } + + @FunctionalInterface + interface Tiered { + + T buildMachine(BlockEntityCreationInfo info, int tier); + + default Tiered andThen(Consumer modifier) { + return (info, tier) -> { + T machine = buildMachine(info, tier); + modifier.accept(machine); + return machine; + }; + } + } + + @FunctionalInterface + interface Steam { + + T buildMachine(BlockEntityCreationInfo info, boolean isHighPressure); + } +} 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 6650440a7aa..8bcd5fd5249 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/MetaMachine.java @@ -17,7 +17,6 @@ import com.gregtechceu.gtceu.api.item.tool.IToolGridHighlight; import com.gregtechceu.gtceu.api.item.tool.ToolHelper; import com.gregtechceu.gtceu.api.machine.feature.*; -import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMaintenanceMachine; import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; import com.gregtechceu.gtceu.api.machine.trait.MachineTrait; import com.gregtechceu.gtceu.api.machine.trait.MachineTraitHolder; @@ -40,11 +39,11 @@ import com.gregtechceu.gtceu.common.cover.FluidFilterCover; import com.gregtechceu.gtceu.common.cover.ItemFilterCover; import com.gregtechceu.gtceu.common.cover.data.ManualIOMode; -import com.gregtechceu.gtceu.common.item.behavior.IntCircuitBehaviour; import com.gregtechceu.gtceu.common.item.behavior.MachineConfigCopyBehaviour; import com.gregtechceu.gtceu.common.machine.owner.MachineOwner; import com.gregtechceu.gtceu.common.machine.owner.PlayerOwner; import com.gregtechceu.gtceu.common.machine.trait.AutoOutputTrait; +import com.gregtechceu.gtceu.common.machine.trait.ProgrammableCircuitSlotTrait; import com.gregtechceu.gtceu.common.mui.GTGuiTextures; import com.gregtechceu.gtceu.utils.ExtendedUseOnContext; import com.gregtechceu.gtceu.utils.GTStringUtils; @@ -163,7 +162,7 @@ public MetaMachine(BlockEntityCreationInfo info) { @Override public void load(CompoundTag tag) { isOldMachineData = !tag.contains("traitHolder"); - TagCompatibilityFixer.fixMachineAutoOutputTag(tag); + if (isOldMachineData) TagCompatibilityFixer.fixTraitTags(this, tag); super.load(tag); } @@ -176,6 +175,7 @@ public void load(CompoundTag tag) { */ @MustBeInvokedByOverriders public void onLoad() { + getTraitHolder().machineLoaded(); getAllTraits().forEach(MachineTrait::onMachineLoad); if (isOldMachineData) { @@ -246,6 +246,19 @@ public void onMachineDestroyed() { */ public void modifyDrops(List drops) {} + /** + * Saves machine data to an item stack tag. + * + * @param tag The tag to save to. + * @param clone If this data is being save to an item stack created by cloning the block (pick block) + */ + public void saveToItem(CompoundTag tag, boolean clone) {} + + /** + * Loads machine data from an item stack tag. + */ + public void loadFromItem(CompoundTag tag) {} + ////////////////////////////////////// // ***** Tickable Manager ****// ////////////////////////////////////// @@ -336,21 +349,22 @@ public T attachTrait(T trait, int callbackPriority) { /** * Registers a trait with data to be saved or synced to the client. * Do not register a persistent trait and also store that trait as a syncable machine field, otherwise the trait - * data will be duplicated. Use only one sync method. + * data will be duplicated. Use only one sync method.
+ * Note: Persistent traits must be attached before data load, or they will not be loaded correctly. * * @param traitName Unique identifier for this trait. * @param trait The trait to register */ - public T attachPersistentTrait(String traitName, T trait) { - traitHolder.attachTrait(trait); - traitHolder.registerPersistentTrait(traitName, trait); - return trait; + public MetaMachine attachPersistentTrait(String traitName, MachineTrait trait) { + traitHolder.attachPersistentTrait(traitName, trait); + return this; } /** * Registers a trait with data to be saved or synced to the client. * Do not register a persistent trait and also store that trait as a syncable machine field, otherwise the trait - * data will be duplicated. Use only one sync method. + * data will be duplicated. Use only one sync method.
+ * Note: Persistent traits must be attached before data load, or they will not be loaded correctly. * * @param traitName Unique identifier for this trait. * @param callbackPriority The trait's callback priority. Traits with a higher priority will have their events fired @@ -358,25 +372,23 @@ public T attachPersistentTrait(String traitName, T trai * @param trait The trait to register */ public T attachPersistentTrait(String traitName, T trait, int callbackPriority) { - traitHolder.attachTrait(trait, callbackPriority); - traitHolder.registerPersistentTrait(traitName, trait); - return trait; + return traitHolder.attachPersistentTrait(traitName, trait, callbackPriority); } /** - * Gets a trait registered by {@code registerPersistentTrait} + * Gets a trait registered by {@code registerPersistentTrait}. * - * @param traitName the unique identifier for the trait - * @return the trait, or null if not present + * @param traitName The unique identifier for the trait. + * @return The trait, or null if not present. */ public @Nullable T getPersistentTrait(String traitName) { return traitHolder.getPersistentTrait(traitName); } /** - * Gets the first trait (trait with highest priority) of a specified type + * Gets the first trait (trait with highest priority) of a specified type. * - * @param type The trait type to get + * @param type The trait type to get. * @return The trait, or null if no traits of the given type are present. */ public @Nullable T getTrait(MachineTraitType type) { @@ -393,9 +405,23 @@ public Optional getTraitOptional(MachineTraitType return Optional.ofNullable(getTrait(type)); } + /** + * Gets the first trait (trait with the highest priority) of a specified type.
+ * Throws if no trait is present. + * + * @param type The trait type to get + * @return The trait + */ + public T getTraitOrThrow(MachineTraitType type) { + T trait = getTrait(type); + if (trait == null) throw new NoSuchElementException("No trait present"); + return trait; + } + /** * Get all traits with the specified type. * + * @param type The trait type to get * @return An unmodifiable list containing all traits of the specified type. */ public @Unmodifiable List getTraits(MachineTraitType type) { @@ -473,6 +499,7 @@ protected InteractionResult onHardHammerClick(ExtendedUseOnContext context) { return InteractionResult.PASS; } + @SuppressWarnings("unused") protected InteractionResult onCrowbarClick(ExtendedUseOnContext context) { return InteractionResult.PASS; } @@ -656,7 +683,7 @@ public boolean shouldRenderGrid(Player player, BlockPos pos, BlockState state, I @Override public @Nullable UITexture sideTips(Player player, BlockPos pos, BlockState state, Set toolTypes, - Direction side) { + ItemStack held, Direction side) { if (toolTypes.contains(GTToolType.WRENCH)) { if (player.isShiftKeyDown()) { if (isFacingValid(side) || (allowExtendedFacing() && hasFrontFacing() && side == getFrontFacing())) { @@ -675,7 +702,7 @@ public boolean shouldRenderGrid(Player player, BlockPos pos, BlockState state, I for (var trait : getAllTraits()) { if (trait instanceof IRenderingTrait renderingTrait) { - var result = renderingTrait.getGridOverlayIcon(player, pos, state, toolTypes, side); + var result = renderingTrait.getGridOverlayIcon(player, pos, state, toolTypes, held, side); if (result != null) return result; } } @@ -1196,11 +1223,6 @@ public static LazyOptional getCapability(MetaMachine machine, Capability< return GTCapability.CAPABILITY_ENERGY_INFO_PROVIDER.orEmpty(cap, LazyOptional.of(() -> list.size() == 1 ? list.get(0) : new EnergyInfoProviderList(list))); } - } else if (cap == GTCapability.CAPABILITY_MAINTENANCE_MACHINE) { - if (machine instanceof IMaintenanceMachine maintenanceMachine) { - return GTCapability.CAPABILITY_MAINTENANCE_MACHINE.orEmpty(cap, - LazyOptional.of(() -> maintenanceMachine)); - } } else if (cap == ForgeCapabilities.ITEM_HANDLER) { var handler = machine.getItemHandlerCap(side, true); if (handler != null) { @@ -1325,12 +1347,10 @@ public void copyConfig(CompoundTag tag) { tag.putBoolean(MUFFLED, mufflableMachine.isMuffled()); } - if (this instanceof IHasCircuitSlot circuitMachine) { - var circuit = IntCircuitBehaviour - .getCircuitConfiguration(circuitMachine.getCircuitInventory().getStackInSlot(0)); - if (circuitMachine.isCircuitSlotEnabled() && circuit != 0) { - tag.putInt(CIRCUIT, circuit); - } + var circuit = getTrait(ProgrammableCircuitSlotTrait.TYPE); + + if (circuit != null && circuit.isEnabled() && circuit.getCurrentCircuit() != 0) { + tag.putInt(CIRCUIT, circuit.getCurrentCircuit()); } var coverTag = new CompoundTag(); @@ -1364,9 +1384,9 @@ public void pasteConfig(ServerPlayer player, CompoundTag tag) { if (tag.contains(MUFFLED)) mufflableMachine.setMuffled(tag.getBoolean(MUFFLED)); } - if (this instanceof IHasCircuitSlot circuitMachine) { - if (tag.contains(CIRCUIT)) - circuitMachine.getCircuitInventory().setStackInSlot(0, IntCircuitBehaviour.stack(tag.getInt(CIRCUIT))); + if (tag.contains(CIRCUIT)) { + getTraitOptional(ProgrammableCircuitSlotTrait.TYPE) + .ifPresent(t -> t.setCurrentCircuit(tag.getInt(CIRCUIT))); } getCoverContainer().pasteConfig(player, tag.getCompound(COVER)); diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/MultiblockMachineDefinition.java b/src/main/java/com/gregtechceu/gtceu/api/machine/MultiblockMachineDefinition.java index 26a705f2e0f..ec29eb1926b 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/MultiblockMachineDefinition.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/MultiblockMachineDefinition.java @@ -1,7 +1,7 @@ package com.gregtechceu.gtceu.api.machine; -import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; +import com.gregtechceu.gtceu.api.machine.multiblock.part.MultiblockPartMachine; import com.gregtechceu.gtceu.api.multiblock.pattern.IBlockPattern; import net.minecraft.core.Direction; @@ -41,10 +41,10 @@ public class MultiblockMachineDefinition extends MachineDefinition { private Supplier recoveryItems; @Setter @Getter - private Function> partSorter; + private Function> partSorter; @Getter @Setter - private TriFunction partAppearance; + private TriFunction partAppearance; @Getter @Setter private BiConsumer> additionalDisplay; diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleGeneratorMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleGeneratorMachine.java index 87c16b47a55..0e16587832d 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleGeneratorMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleGeneratorMachine.java @@ -24,8 +24,9 @@ public class SimpleGeneratorMachine extends WorkableTieredMachine { public SimpleGeneratorMachine(BlockEntityCreationInfo info, int tier, float hazardStrengthPerOperation, Int2IntFunction tankScalingFunction) { - super(info, tier, tankScalingFunction); + super(info, tier, true, tankScalingFunction); + recipeLogic.setRegressWhenWaiting(false); energyContainer.setSideOutputCondition(side -> !hasFrontFacing() || side == getFrontFacing()); this.hazardEmitter = attachTrait( new EnvironmentalHazardEmitterTrait(GTMedicalConditions.CARBON_MONOXIDE_POISONING, @@ -38,12 +39,6 @@ public SimpleGeneratorMachine(BlockEntityCreationInfo info, int tier, Int2IntFun ////////////////////////////////////// // ***** Initialization ******// - ////////////////////////////////////// - - @Override - protected boolean isEnergyEmitter() { - return true; - } @Override public int tintColor(int index) { @@ -85,22 +80,11 @@ public static ModifierFunction recipeModifier(MetaMachine machine, GTRecipe reci .build(); } - @Override - public boolean regressWhenWaiting() { - return false; - } - @Override public boolean canVoidRecipeOutputs(RecipeCapability capability) { return capability != EURecipeCapability.CAP; } - @Override - public void afterWorking() { - super.afterWorking(); - hazardEmitter.emitHazard(); - } - @Override public long getDisplayRecipeVoltage() { return GTValues.V[this.tier]; diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleTieredMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleTieredMachine.java index a6e94605482..a27c2174595 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleTieredMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/SimpleTieredMachine.java @@ -2,117 +2,32 @@ import com.gregtechceu.gtceu.api.GTValues; import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; -import com.gregtechceu.gtceu.api.capability.GTCapabilityHelper; -import com.gregtechceu.gtceu.api.capability.recipe.*; -import com.gregtechceu.gtceu.api.machine.feature.IHasBatterySlot; -import com.gregtechceu.gtceu.api.machine.feature.IHasCircuitSlot; -import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; -import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; -import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; -import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; -import com.gregtechceu.gtceu.common.item.behavior.IntCircuitBehaviour; +import com.gregtechceu.gtceu.common.data.machines.GTMachineUtils; import com.gregtechceu.gtceu.common.machine.trait.AutoOutputTrait; -import com.gregtechceu.gtceu.config.ConfigHolder; -import com.gregtechceu.gtceu.utils.ISubscription; +import com.gregtechceu.gtceu.common.machine.trait.BatterySlotTrait; +import com.gregtechceu.gtceu.common.machine.trait.ProgrammableCircuitSlotTrait; import it.unimi.dsi.fastutil.ints.Int2IntFunction; -import lombok.Getter; -import org.jetbrains.annotations.Nullable; import java.util.*; -import java.util.function.*; /** * All simple single machines are implemented here. */ -public class SimpleTieredMachine extends WorkableTieredMachine - implements IHasCircuitSlot, IHasBatterySlot { - - @Getter - @SaveField - protected final CustomItemStackHandler chargerInventory; - @Getter - @SaveField - protected final NotifiableItemStackHandler circuitInventory; - @Nullable - protected TickableSubscription batterySubs; - @Nullable - protected ISubscription energySubs; - @SaveField - @SyncToClient - public final AutoOutputTrait autoOutput; +public class SimpleTieredMachine extends WorkableTieredMachine { public SimpleTieredMachine(BlockEntityCreationInfo info, int tier, Int2IntFunction tankScalingFunction) { - super(info, tier, tankScalingFunction); - - this.autoOutput = attachTrait(new AutoOutputTrait(List.of(exportItems), List.of(exportFluids))); - - this.chargerInventory = new CustomItemStackHandler() { + super(info, tier, false, tankScalingFunction); - public int getSlotLimit(int slot) { - return 1; - } - }; - chargerInventory.setFilter(item -> GTCapabilityHelper.getElectricItem(item) != null || - (ConfigHolder.INSTANCE.compat.energy.nativeEUToFE && - GTCapabilityHelper.getForgeEnergyItem(item) != null)); - - this.circuitInventory = attachTrait(new NotifiableItemStackHandler(1, IO.IN, IO.NONE) - .shouldDropInventoryInWorld(!ConfigHolder.INSTANCE.machines.ghostCircuit) - .setFilter(IntCircuitBehaviour::isIntegratedCircuit)); + attachPersistentTrait("autoOutput", new AutoOutputTrait(List.of(exportItems), List.of(exportFluids))); + attachPersistentTrait("circuit", new ProgrammableCircuitSlotTrait()); + attachPersistentTrait("batterySlot", new BatterySlotTrait(energyContainer)); } - ////////////////////////////////////// - // ***** Initialization ******// - ////////////////////////////////////// - - @Override - public void onLoad() { - super.onLoad(); - if (!isRemote()) { - updateBatterySubscription(); - energySubs = energyContainer.addChangedListener(this::updateBatterySubscription); - chargerInventory.setOnContentsChanged(this::updateBatterySubscription); - } - } - - @Override - public void onUnload() { - super.onUnload(); - if (energySubs != null) { - energySubs.unsubscribe(); - energySubs = null; - } + public SimpleTieredMachine(BlockEntityCreationInfo info, int tier) { + this(info, tier, GTMachineUtils.defaultTankSizeFunction); } - protected void updateBatterySubscription() { - if (energyContainer.dischargeOrRechargeEnergyContainers(chargerInventory, 0, true)) { - batterySubs = subscribeServerTick(batterySubs, this::chargeBattery); - } else if (batterySubs != null) { - batterySubs.unsubscribe(); - batterySubs = null; - } - } - - protected void chargeBattery() { - if (!energyContainer.dischargeOrRechargeEnergyContainers(chargerInventory, 0, false)) { - updateBatterySubscription(); - } - } - - ////////////////////////////////////// - // ********** MISC ***********// - ////////////////////////////////////// - @Override - public void onMachineDestroyed() { - super.onMachineDestroyed(); - chargerInventory.dropInventoryInWorld(getLevel(), getBlockPos()); - } - - ///////////////////////////////////// - // ****** RECIPE LOGIC *******// - ///////////////////////////////////// - @Override public long getDisplayRecipeVoltage() { return GTValues.V[this.tier]; diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/TieredEnergyMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/TieredEnergyMachine.java index bdcdeb674fc..dd8fef8ced0 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/TieredEnergyMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/TieredEnergyMachine.java @@ -2,7 +2,7 @@ import com.gregtechceu.gtceu.api.GTValues; import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; -import com.gregtechceu.gtceu.api.machine.trait.NotifiableEnergyContainer; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableEnergyContainer; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.common.machine.trait.EnvironmentalExplosionTrait; @@ -11,8 +11,6 @@ import lombok.Getter; -import java.util.function.Function; - /** * A singleblock tiered machine with an energy container. */ @@ -25,6 +23,15 @@ public class TieredEnergyMachine extends TieredMachine { @Getter protected final EnvironmentalExplosionTrait environmentalExplosionTrait; + /** + * Creates a {@link TieredEnergyMachine} using the given energy container.
+ * + * + * @param info {@link BlockEntityCreationInfo} + * @param tier Machine/voltage tier + * @param energyContainer The enegery container to attach + * @see NotifiableEnergyContainer + */ public TieredEnergyMachine(BlockEntityCreationInfo info, int tier, NotifiableEnergyContainer energyContainer) { super(info, tier); @@ -33,32 +40,24 @@ public TieredEnergyMachine(BlockEntityCreationInfo info, int tier, () -> energyContainer.getEnergyStored() > 0)); } - public TieredEnergyMachine(BlockEntityCreationInfo info, int tier, - Function energyContainer) { - super(info, tier); - this.energyContainer = attachTrait(energyContainer.apply(this)); - environmentalExplosionTrait = attachTrait(new EnvironmentalExplosionTrait(tier, tier * 10, - () -> this.energyContainer.getEnergyStored() > 0)); - } - - public TieredEnergyMachine(BlockEntityCreationInfo info, int tier) { - super(info, tier); - - long tierVoltage = GTValues.V[tier]; - if (isEnergyEmitter()) { - energyContainer = attachTrait(NotifiableEnergyContainer.emitterContainer(tierVoltage * 64L, tierVoltage, - getMaxInputOutputAmperage())); - } else { - energyContainer = attachTrait(NotifiableEnergyContainer.receiverContainer(tierVoltage * 64L, tierVoltage, - getMaxInputOutputAmperage())); - } - environmentalExplosionTrait = attachTrait(new EnvironmentalExplosionTrait(tier, tier * 10, - () -> energyContainer.getEnergyStored() > 0)); + /** + * Creates a {@link TieredEnergyMachine} with a default energy container.
+ * Defaults to a container with a capacity of 64A @ the given voltage tier, and a max input/output amperage of 1A @ + * the given voltage tier. + * + * @param info {@link BlockEntityCreationInfo} + * @param tier Machine/voltage tier + * @param emitsEnergy If the energy container should receive or emit energy. + * @see NotifiableEnergyContainer + */ + public TieredEnergyMachine(BlockEntityCreationInfo info, int tier, boolean emitsEnergy) { + this(info, tier, + emitsEnergy ? NotifiableEnergyContainer.emitterContainer(GTValues.V[tier] * 64L, GTValues.V[tier], + 1) : + NotifiableEnergyContainer.receiverContainer(GTValues.V[tier] * 64L, GTValues.V[tier], + 1)); } - ////////////////////////////////////// - // ********** MISC ***********// - ////////////////////////////////////// @Override public int getAnalogOutputSignal() { long energyStored = energyContainer.getEnergyStored(); @@ -66,24 +65,4 @@ public int getAnalogOutputSignal() { float f = energyCapacity == 0L ? 0.0f : energyStored / (energyCapacity * 1.0f); return Mth.floor(f * 14.0f) + (energyStored > 0 ? 1 : 0); } - - /** - * Determines max input or output amperage used by this machine - * if emitter, it determines size of energy packets it will emit at once - * if receiver, it determines max input energy per request - * - * @return max amperage received or emitted by this machine - */ - protected long getMaxInputOutputAmperage() { - return 1L; - } - - /** - * Determines if this machine is in energy receiver or emitter mode - * - * @return true if machine emits energy to network, false it it accepts energy from network - */ - protected boolean isEnergyEmitter() { - return false; - } } 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 22f553a5da4..a5ef0af659f 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/WorkableTieredMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/WorkableTieredMachine.java @@ -5,6 +5,11 @@ import com.gregtechceu.gtceu.api.capability.recipe.*; import com.gregtechceu.gtceu.api.machine.feature.*; import com.gregtechceu.gtceu.api.machine.trait.*; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableComputationContainer; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableFluidTank; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableItemStackHandler; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeHandlerList; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeLogic; import com.gregtechceu.gtceu.api.recipe.GTRecipeType; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; @@ -58,11 +63,25 @@ public abstract class WorkableTieredMachine extends TieredEnergyMachine implemen protected boolean isMuffled; protected boolean previouslyMuffled = true; + /** + * Creates a {@link WorkableTieredMachine}. + * + * @param info {@link BlockEntityCreationInfo} + * @param tier Machine tier. + * @param recipeLogic The recipe logic to use. + * @param importSlots The amount of item input slots this machine should have (can be 0). + * @param exportSlots The amount of item output slots this machine should have (can be 0). + * @param fluidImportSlots The amount of fluid input slots this machine should have (can be 0). + * @param fluidExportSlots The amount of fluid output slots this machine should have (can be 0). + * @param energyEmitter If this machine should input or output energy. + * @param tankScalingFunction The tank scaling function which determines the capaacity of fluid slots. + */ public WorkableTieredMachine(BlockEntityCreationInfo info, int tier, RecipeLogic recipeLogic, int importSlots, int exportSlots, - int fluidImportSlots, int fluidExportSlots, Int2IntFunction tankScalingFunction) { - super(info, tier); + int fluidImportSlots, int fluidExportSlots, boolean energyEmitter, + Int2IntFunction tankScalingFunction) { + super(info, tier, energyEmitter); this.overclockTier = getMaxOverclockTier(); this.recipeTypes = getDefinition().getRecipeTypes(); this.activeRecipeType = 0; @@ -71,6 +90,7 @@ public WorkableTieredMachine(BlockEntityCreationInfo info, int tier, this.traitSubscriptions = new ArrayList<>(); this.cleanroomReceiver = attachTrait(new CleanroomReceiverTrait()); this.recipeLogic = attachTrait(recipeLogic); + this.recipeLogic.setKeepSubscribing(false); this.importItems = attachTrait(new NotifiableItemStackHandler(importSlots, IO.IN, IO.BOTH)); this.exportItems = attachTrait(new NotifiableItemStackHandler(exportSlots, IO.OUT)); this.importFluids = attachTrait( @@ -83,8 +103,18 @@ public WorkableTieredMachine(BlockEntityCreationInfo info, int tier, this.exportComputation = attachTrait(new NotifiableComputationContainer(IO.OUT, false)); } - public WorkableTieredMachine(BlockEntityCreationInfo info, int tier, Int2IntFunction tankScalingFunction) { - super(info, tier); + /** + * Creates a {@link WorkableTieredMachine} with default settings.
+ * The amount of item and fluid input and output slots is determined by the machine's recipe type. + * + * @param info {@link BlockEntityCreationInfo} + * @param tier Machine tier. + * @param energyEmitter If this machine should input or output energy. + * @param tankScalingFunction The tank scaling function which determines the capaacity of fluid slots. + */ + public WorkableTieredMachine(BlockEntityCreationInfo info, int tier, boolean energyEmitter, + Int2IntFunction tankScalingFunction) { + super(info, tier, energyEmitter); this.overclockTier = getMaxOverclockTier(); this.recipeTypes = getDefinition().getRecipeTypes(); this.activeRecipeType = 0; @@ -93,6 +123,7 @@ public WorkableTieredMachine(BlockEntityCreationInfo info, int tier, Int2IntFunc this.traitSubscriptions = new ArrayList<>(); this.cleanroomReceiver = attachTrait(new CleanroomReceiverTrait()); this.recipeLogic = attachTrait(new RecipeLogic()); + this.recipeLogic.setKeepSubscribing(false); this.importItems = attachTrait( new NotifiableItemStackHandler(getRecipeType().getMaxInputs(ItemRecipeCapability.CAP), IO.IN, IO.BOTH)); @@ -191,11 +222,6 @@ public void clientTick() { } } - @Override - public boolean keepSubscribing() { - return false; - } - public GTRecipeType getRecipeType() { int index = activeRecipeType >= 0 && activeRecipeType < recipeTypes.length ? activeRecipeType : 0; return recipeTypes[index]; 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 deleted file mode 100644 index 1f55ee1dfcc..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IDropSaveMachine.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.gregtechceu.gtceu.api.machine.feature; - -import net.minecraft.nbt.CompoundTag; - -import org.jetbrains.annotations.MustBeInvokedByOverriders; - -/** - * A machine that can save its contents when dropped. - */ -public interface IDropSaveMachine extends IMachineFeature { - - /** - * Whether save for breaking. - */ - default boolean saveBreak() { - return true; - } - - /** - * Whether save for cloning. - */ - default boolean savePickClone() { - return true; - } - - /** - * Saves the contents of the block entity to a compound tag. - * - * @param tag The tag to save to. - */ - @MustBeInvokedByOverriders - void saveToItem(CompoundTag tag); - - /** - * Loads the contents of the block entity from a compound tag. - */ - @MustBeInvokedByOverriders - void loadFromItem(CompoundTag tag); -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IHasBatterySlot.java b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IHasBatterySlot.java deleted file mode 100644 index 9ff7e106831..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IHasBatterySlot.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.gregtechceu.gtceu.api.machine.feature; - -import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; - -public interface IHasBatterySlot extends IMachineFeature { - - CustomItemStackHandler getChargerInventory(); -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IHasCircuitSlot.java b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IHasCircuitSlot.java deleted file mode 100644 index e77804a9a98..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IHasCircuitSlot.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.gregtechceu.gtceu.api.machine.feature; - -import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; - -public interface IHasCircuitSlot { - - default boolean isCircuitSlotEnabled() { - return true; - } - - NotifiableItemStackHandler getCircuitInventory(); -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IRecipeLogicMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IRecipeLogicMachine.java index ab104be1881..f8710ec9331 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IRecipeLogicMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/IRecipeLogicMachine.java @@ -2,7 +2,8 @@ import com.gregtechceu.gtceu.api.capability.IWorkable; import com.gregtechceu.gtceu.api.capability.recipe.IRecipeCapabilityHolder; -import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.machine.trait.feature.IRecipeLogicModifierTrait; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeLogic; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.GTRecipeType; import com.gregtechceu.gtceu.api.recipe.RecipeHelper; @@ -30,11 +31,6 @@ public interface IRecipeLogicMachine extends IRecipeCapabilityHolder, IMachineFe void setActiveRecipeType(int type); - /** - * Called when recipe logic status changed - */ - default void notifyStatusChanged(RecipeLogic.Status oldStatus, RecipeLogic.Status newStatus) {} - /** * Recipe logic */ @@ -54,16 +50,16 @@ default GTRecipe fullModifyRecipe(GTRecipe recipe) { */ @Nullable default GTRecipe doModifyRecipe(GTRecipe recipe) { - return self().getDefinition().getRecipeModifier().applyModifier(self(), recipe); - } + recipe = self().getDefinition().getRecipeModifier().applyModifier(self(), recipe); + if (recipe == null) return null; - /** - * Whether the recipe logic should keep subscribing tick logic when no recipe is available after one cycle. - * if false. you should call {@link RecipeLogic#updateTickSubscription()} manually later to active recipe logic - * again. - */ - default boolean keepSubscribing() { - return true; + for (var trait : self().getAllTraits()) { + if (trait instanceof IRecipeLogicModifierTrait rlTrait) { + recipe = rlTrait.modifyRecipe(recipe); + if (recipe == null) return null; + } + } + return recipe; } /** @@ -74,50 +70,60 @@ default boolean isRecipeLogicAvailable() { } /** - * Called in {@link RecipeLogic#setupRecipe(GTRecipe)} ()} + * Called when the recipe logic status changes + * + * @param oldStatus Old recipe logic status + * @param newStatus New recipe logic status */ - default boolean beforeWorking(@Nullable GTRecipe recipe) { - return self().getDefinition().getBeforeWorking().test(this, recipe); + default void recipeLogicStatusChanged(RecipeLogic.Status oldStatus, RecipeLogic.Status newStatus) { + for (var trait : self().getAllTraits()) { + if (trait instanceof IRecipeLogicModifierTrait rlTrait) + rlTrait.recipeLogicStatusChanged(oldStatus, newStatus); + } } /** - * Called per tick in {@link RecipeLogic#handleRecipeWorking()} + * Called when a recipe is about to be run, just before inputs are consumed. + * + * @return true to cancel the recipe, false to continue + * + * @see RecipeLogic#setupRecipe(GTRecipe) */ - default boolean onWorking() { - return self().getDefinition().getOnWorking().test(this); - } + default boolean beforeWorking(@Nullable GTRecipe recipe) { + if (!self().getDefinition().getBeforeWorking().test(this, recipe)) return false; - /** - * Called per tick in {@link RecipeLogic#handleRecipeWorking()} - */ - default void onWaiting() { - self().getDefinition().getOnWaiting().accept(this); + for (var trait : self().getAllTraits()) { + if (trait instanceof IRecipeLogicModifierTrait rlTrait && !rlTrait.beforeWorking(recipe)) return false; + } + return true; } /** - * Called in {@link RecipeLogic#onRecipeFinish()} before outputs are produced + * Called every tick while the recipe is working. + * + * @return true to interrupt and suspend the recipe, false to continue working + * + * @see RecipeLogic#handleRecipeWorking() */ - default void afterWorking() { - self().getDefinition().getAfterWorking().accept(this); - } + default boolean onWorking() { + if (!self().getDefinition().getOnWorking().test(this)) return false; - /** - * Whether progress decrease when machine is waiting for pertick ingredients. (e.g. lack of EU) - */ - default boolean regressWhenWaiting() { - return self().getDefinition().isRegressWhenWaiting(); + for (var trait : self().getAllTraits()) { + if (trait instanceof IRecipeLogicModifierTrait rlTrait && !rlTrait.onWorking()) return false; + } + return true; } /** - * Always try {@link IRecipeLogicMachine#fullModifyRecipe(GTRecipe)} before setting up recipe. - * - * @return true - will map {@link RecipeLogic#lastOriginRecipe} to the latest recipe for next round when finishing. - * false - keep using the {@link RecipeLogic#lastRecipe}, which is already modified. + * Called when the recipe finishes, before outputs are produced. + * + * @see RecipeLogic#onRecipeFinish() */ - default boolean alwaysTryModifyRecipe() { - // make it *always* do overclock and parallel so that the machine doesn't get stuck running a lower-tier recipe - // in any possible scenario. - return true; + default void afterWorking() { + self().getDefinition().getAfterWorking().accept(this); + for (var trait : self().getAllTraits()) { + if (trait instanceof IRecipeLogicModifierTrait rlTrait) rlTrait.afterWorking(); + } } default boolean shouldWorkingPlaySound() { diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/multiblock/IDistinctPart.java b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/multiblock/IDistinctPart.java index 06e4d1d7566..3b413343203 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/multiblock/IDistinctPart.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/multiblock/IDistinctPart.java @@ -1,6 +1,6 @@ package com.gregtechceu.gtceu.api.machine.feature.multiblock; -public interface IDistinctPart extends IMultiPart { +public interface IDistinctPart { boolean isDistinct(); diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/multiblock/IMaintenanceMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/multiblock/IMaintenanceMachine.java deleted file mode 100644 index 99029fab32b..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/multiblock/IMaintenanceMachine.java +++ /dev/null @@ -1,187 +0,0 @@ -package com.gregtechceu.gtceu.api.machine.feature.multiblock; - -import com.gregtechceu.gtceu.api.GTValues; -import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; -import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; -import com.gregtechceu.gtceu.api.recipe.GTRecipe; -import com.gregtechceu.gtceu.config.ConfigHolder; - -import net.minecraft.world.level.block.state.properties.BooleanProperty; - -public interface IMaintenanceMachine extends IMultiPart { - - BooleanProperty MAINTENANCE_TAPED_PROPERTY = GTMachineModelProperties.IS_TAPED; - byte ALL_PROBLEMS = 0; - byte NO_PROBLEMS = 0b111111; - - /** - * @return true if this is a Full-Auto Maintenance Hatch, false otherwise. - */ - boolean isFullAuto(); - - /** - * Sets this Maintenance Hatch as being duct taped - * - * @param isTaped is the state of the hatch being taped or not - */ - void setTaped(boolean isTaped); - - boolean isTaped(); - - /** - * Initial problems of the maintenance. - */ - byte startProblems(); - - /** - * This value stores whether each of the 5 maintenance problems have been fixed. - * A value of 0 means the problem is not fixed, else it is fixed - * Value positions correspond to the following from left to right: 0=Wrench, 1=Screwdriver, 2=Soft Mallet, 3=Hard - * Hammer, 4=Wire Cutter, 5=Crowbar - */ - byte getMaintenanceProblems(); - - void setMaintenanceProblems(byte problems); - - /** - * Time is how long it is active and is used to determine how often problems occur. - * See {@link IMaintenanceMachine#calculateTime(int)} for the trigger point. - */ - int getTimeActive(); - - void setTimeActive(int time); - - /** - * Duration modifier for recipe. {@link IMaintenanceMachine#modifyRecipe(GTRecipe)} - * It's configurable in the Configurable Maintenance Part. - */ - default float getDurationMultiplier() { - return 1; - } - - /** - * Higher {@link IMaintenanceMachine#getDurationMultiplier()} refers to a lower time multiplier. - * The lower time multiplier means more likely causing problems. - */ - default float getTimeMultiplier() { - return 1; - } - - @Override - default boolean canShared(MultiblockControllerMachine controller, String substructureName) { - return false; - } - - /** - * Used to calculate whether a maintenance problem should happen based on machine time active - * - * @param duration in ticks to add to the counter of active time - */ - default void calculateMaintenance(IMaintenanceMachine maintenanceMachine, int duration) { - if (!ConfigHolder.INSTANCE.machines.enableMaintenance || maintenanceMachine.isFullAuto()) { - return; - } - - setTimeActive(getTimeActive() + duration); - float rate = ConfigHolder.INSTANCE.machines.maintenanceCheckRate / maintenanceMachine.getTimeMultiplier(); - if (getTimeActive() >= rate) { - setTimeActive(0); - if (GTValues.RNG.nextInt(6000) == 0) { - causeRandomMaintenanceProblems(); - maintenanceMachine.setTaped(false); - } - } - } - - /** - * Used to calculate whether a maintenance problem should happen based on machine time active - */ - default void calculateMaintenance(IMaintenanceMachine maintenanceMachine) { - calculateMaintenance(maintenanceMachine, 1); - } - - default int getNumMaintenanceProblems() { - return ConfigHolder.INSTANCE.machines.enableMaintenance ? 6 - Integer.bitCount(getMaintenanceProblems()) : 0; - } - - default boolean hasMaintenanceProblems() { - return ConfigHolder.INSTANCE.machines.enableMaintenance && this.getMaintenanceProblems() < 63; - } - - default void setMaintenanceFixed(int index) { - setMaintenanceProblems((byte) (getMaintenanceProblems() | (byte) (1 << index))); - } - - default void causeRandomMaintenanceProblems() { - setMaintenanceProblems( - (byte) (getMaintenanceProblems() & (byte) ~(1 << GTValues.RNG.nextInt(6)))); - } - - @Override - default boolean onWorking(IWorkableMultiController controller) { - calculateMaintenance(this); - if (hasMaintenanceProblems()) { - controller.getRecipeLogic().markLastRecipeDirty(); - } - return true; - } - - @Override - default GTRecipe modifyRecipe(GTRecipe recipe) { - if (ConfigHolder.INSTANCE.machines.enableMaintenance) { - if (hasMaintenanceProblems()) { - return null; - } - var durationMultiplier = getDurationMultiplier(); - if (durationMultiplier != 1) { - recipe = recipe.copy(); - recipe.duration = Math.max(1, Math.round(recipe.duration * durationMultiplier)); - } - } - return recipe; - } - - ////////////////////////////////////// - // ******* FANCY GUI ********// - ////////////////////////////////////// - - /* - * @Override - * default void attachFancyTooltipsToController(IMultiController controller, TooltipsPanel tooltipsPanel) { - * attachTooltips(tooltipsPanel); - * } - */ - - /* - * @Override - * default void attachTooltips(TooltipsPanel tooltipsPanel) { - * if (ConfigHolder.INSTANCE.machines.enableMaintenance) { - * tooltipsPanel.attachTooltips(new IFancyTooltip.Basic(() -> GuiTextures.MAINTENANCE_ICON, () -> { - * var tooltips = new ArrayList(); - * tooltips.add(Component.translatable("gtceu.multiblock.universal.has_problems_header") - * .setStyle(Style.EMPTY.withColor(ChatFormatting.RED))); - * - * if ((getMaintenanceProblems() & 1) == 0) - * tooltips.add(Component.translatable("gtceu.multiblock.universal.problem.wrench")); - * - * if (((getMaintenanceProblems() >> 1) & 1) == 0) - * tooltips.add(Component.translatable("gtceu.multiblock.universal.problem.screwdriver")); - * - * if (((getMaintenanceProblems() >> 2) & 1) == 0) - * tooltips.add(Component.translatable("gtceu.multiblock.universal.problem.soft_mallet")); - * - * if (((getMaintenanceProblems() >> 3) & 1) == 0) - * tooltips.add(Component.translatable("gtceu.multiblock.universal.problem.hard_hammer")); - * - * if (((getMaintenanceProblems() >> 4) & 1) == 0) - * tooltips.add(Component.translatable("gtceu.multiblock.universal.problem.wire_cutter")); - * - * if (((getMaintenanceProblems() >> 5) & 1) == 0) - * tooltips.add(Component.translatable("gtceu.multiblock.universal.problem.crowbar")); - * - * return tooltips; - * }, this::hasMaintenanceProblems, () -> null)); - * } - * } - */ -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/multiblock/IMultiController.java b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/multiblock/IMultiController.java deleted file mode 100644 index 4f1acd0ba52..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/multiblock/IMultiController.java +++ /dev/null @@ -1,249 +0,0 @@ -// package com.gregtechceu.gtceu.api.machine.feature.multiblock; -// -// import com.gregtechceu.gtceu.api.capability.IParallelHatch; -// import com.gregtechceu.gtceu.api.machine.feature.IInteractedMachine; -// import com.gregtechceu.gtceu.api.machine.feature.IMachineFeature; -// import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; -// import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; -// import com.gregtechceu.gtceu.api.multiblock.pattern.IBlockPattern; -// import com.gregtechceu.gtceu.api.multiblock.pattern.PatternState; -// import com.gregtechceu.gtceu.client.renderer.MultiblockInWorldPreviewRenderer; -// import com.gregtechceu.gtceu.config.ConfigHolder; -// -// 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.level.block.state.properties.BooleanProperty; -// import net.minecraft.world.phys.BlockHitResult; -// -// import it.unimi.dsi.fastutil.objects.Reference2ObjectMap; -// import org.jetbrains.annotations.NotNull; -// import org.jetbrains.annotations.Nullable; -// -// import java.util.Comparator; -// import java.util.List; -// import java.util.Optional; -// import java.util.Set; -// import java.util.concurrent.locks.Lock; -// -// public interface IMultiController extends IMachineFeature { -// -// BooleanProperty IS_FORMED_PROPERTY = GTMachineModelProperties.IS_FORMED; -// -// @Override -// default MultiblockControllerMachine self() { -// return (MultiblockControllerMachine) this; -// } -// -// void createStructurePatterns(); -// -// Reference2ObjectMap getStructurePatterns(); -// -// /** -// * Check MultiBlock Pattern. Just checking pattern without any other logic. -// * You can override it, but it's unsafe for calling. because it will also be called in an async thread. -// *
-// * you should always use {@link IMultiController#checkPatternWithLock()} and -// * {@link IMultiController#checkPatternWithTryLock()} instead. -// * -// * @return whether it can be formed. -// */ -// void checkAndFormStructurePatterns(); -// -// Set getStructureNames(); -// -// /** -// * This method will check if a multiblock aisles predicates are valid and WILL update the patternState each time it -// * is called. -// * -// * @return the new state -// */ -// PatternState checkStructurePattern(); -// -// PatternState checkStructurePattern(String structureName); -// -// PatternState getDefaultPatternState(); -// -// PatternState getPatternState(String name); -// -// /** -// * Check pattern with a lock. -// */ -// default boolean checkPatternWithLock(String name) { -// var lock = getPatternLock(); -// lock.lock(); -// try { -// var patternCheckState = getPatternState(name).getState(); -// if (patternCheckState == null || !patternCheckState.isValid()) { -// checkStructurePattern(name); -// } -// return getPatternState(name).getState().isValid(); -// } finally { -// lock.unlock(); -// } -// } -// -// /** -// * Check pattern with a try lock -// * -// * @return false - checking failed or cant get the lock. -// */ -// default boolean checkPatternWithTryLock(String name) { -// var lock = getPatternLock(); -// if (lock.tryLock()) { -// try { -// var patternCheckState = getPatternState(name).getState(); -// if (patternCheckState == null || !patternCheckState.isValid()) { -// checkStructurePattern(name); -// } -// return getPatternState(name).getState() != PatternState.CheckState.UNINITIALIZED; -// } finally { -// lock.unlock(); -// } -// } else { -// return false; -// } -// } -// -// /** -// * Get structure pattern. -// * You can override it to create dynamic patterns. -// */ -// default IBlockPattern createStructurePattern() { -// return self().getDefinition().getPatternFactory().get(); -// } -// -// /** -// * Call to form a multiblock -// * -// * @param name the structure with which to form -// */ -// void formStructure(@NotNull String name); -// -// void invalidateStructure(String name); -// -// // /** -// // * Called when structure is formed, have to be called after {@link #formStructure(String)}. (server-side / fake -// // scene only) -// // *
-// // * Trigger points: -// // *
-// // * 1 - Blocks in structure changed but still formed. -// // *
-// // * 2 - Literally, structure formed. -// // */ -// // void onStructureFormed(String name); -// // -// // /** -// // * Called when structure is invalid. (server-side / fake scene only) -// // *
-// // * Trigger points: -// // *
-// // * 1 - Blocks in structure changed. -// // *
-// // * 2 - Before controller machine removed. -// // */ -// // void onStructureInvalid(String name); -// -// /** -// * Whether multiblock is formed. -// *
-// * NOTE: even if machine is formed, it doesn't mean the machine will be workable -// * Its parts maybe invalid due to unloaded chunks. -// */ -// boolean isFormed(); -// -// /** -// * Called in an async thread. It's unsafe, Don't modify anything of world but checking information. -// * It will be called per 5 tick. -// * -// * @param periodID period Tick -// */ -// void asyncCheckPattern(long periodID); -// -// /** -// * Whether it has front face. -// * false means structure of all sides are available. -// */ -// boolean hasFrontFacing(); -// -// /** -// * Get all parts -// */ -// List getParts(); -// -// /** -// * The instance of {@link IParallelHatch} attached to this Controller. -// *

-// * Note that this will return a singular instance, and will not account for multiple attached IParallelHatches -// * -// * @return an {@link Optional} of the attached IParallelHatch, empty if one is not attached -// */ -// Optional getParallelHatch(); -// -// /** -// * -// * @return Whether batching is enabled on this multiblock -// */ -// default boolean isBatchEnabled() { -// return false; -// } -// -// default void setBatchEnabled(boolean batch) {} -// -// /** -// * Called from part, when part is invalid due to chunk unload or broken. -// */ -// void onPartUnload(); -// -// /** -// * Get lock for pattern checking. -// */ -// Lock getPatternLock(); -// -// /** -// * should add part to the part list. -// */ -// default boolean shouldAddPartToController(IMultiPart part) { -// return true; -// } -// -// /** -// * get parts' Appearance. same as IForgeBlock.getAppearance() / IFabricBlock.getAppearance() -// */ -// @Nullable -// default BlockState getPartAppearance(IMultiPart part, Direction side, BlockState sourceState, BlockPos sourcePos) { -// if (isFormed()) { -// return self().getDefinition().getPartAppearance().apply(this, part, side); -// } -// return null; -// } -// -// default Comparator getPartSorter() { -// return self().getDefinition().getPartSorter().apply(self()); -// } -// -// /** -// * Show the preview of structure. -// */ -// @Override -// default InteractionResult onUse(BlockState state, Level world, BlockPos pos, Player player, InteractionHand hand, -// BlockHitResult hit) { -// if (!self().isFormed() && player.isShiftKeyDown() && player.getItemInHand(hand).isEmpty()) { -// if (world.isClientSide()) { -// MultiblockInWorldPreviewRenderer.showPreview(pos, self(), -// ConfigHolder.INSTANCE.client.inWorldPreviewDuration * 20); -// } -// return InteractionResult.SUCCESS; -// } -// return IInteractedMachine.super.onUse(state, world, pos, player, hand, hit); -// } -// -// default boolean allowCircuitSlots() { -// return true; -// } -// } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/multiblock/IMultiPart.java b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/multiblock/IMultiPart.java deleted file mode 100644 index 2a0c97858f1..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/multiblock/IMultiPart.java +++ /dev/null @@ -1,145 +0,0 @@ -package com.gregtechceu.gtceu.api.machine.feature.multiblock; - -import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.api.machine.feature.IMachineFeature; -import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; -import com.gregtechceu.gtceu.api.machine.multiblock.WorkableMultiblockMachine; -import com.gregtechceu.gtceu.api.machine.trait.RecipeHandlerList; -import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; -import com.gregtechceu.gtceu.api.recipe.GTRecipe; - -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.world.level.BlockAndTintGetter; -import net.minecraft.world.level.block.state.BlockState; - -import org.jetbrains.annotations.Nullable; -import org.jetbrains.annotations.UnmodifiableView; - -import java.util.List; -import java.util.SortedSet; - -public interface IMultiPart extends IMachineFeature { - - /** - * @return If this multiblock part can be shared between multiple multiblocks. - */ - default boolean canShared(MultiblockControllerMachine controller, String substructureName) { - return true; - } - - /** - * If this multiblock part belongs to a controller at the given position - * - * @param controllerPos Controller position - * @return If this multiblock part belongs to a controller at the given position - */ - boolean hasController(BlockPos controllerPos); - - /** - * @return If this multiblock part belongs to a formed multiblock. - */ - boolean isFormed(); - - /** - * Gets all controllers this multiblock part belongs to - * - * @return An unmodifiable set containing the controllers. - */ - @UnmodifiableView - SortedSet getControllers(); - - /** - * Gets the name of the main substructure this multiblock part is attached to. - * - * @return - */ - String getSubstructureName(); - - /** - * Called when this part is removed from a multiblock. - * - * @param controller The controller which this part has been removed from. - */ - void removedFromController(MultiblockControllerMachine controller); - - /** - * Called when this part is added to a multiblock. - * - * @param controller The controller which this part has been added to - */ - void addedToController(MultiblockControllerMachine controller, String substructureName); - - /** - * Get all available traits for recipe logic. - */ - List getRecipeHandlers(); - - /** - * If this part's base model can be replaced by controller when it is formed. - */ - default boolean replacePartModelWhenFormed() { - return true; - } - - /** - * Called to get block appearance when this multi part is in a formed multiblock. - * - * @see MetaMachine#getBlockAppearance(BlockState, BlockAndTintGetter, BlockPos, Direction, BlockState, BlockPos) - */ - @Nullable - default BlockState getFormedAppearance(BlockState sourceState, BlockPos sourcePos, Direction side) { - for (MultiblockControllerMachine controller : getControllers()) { - if (controller == null) continue; - var appearance = controller.getPartAppearance(this, side, sourceState, sourcePos); - if (appearance != null) return appearance; - } - return null; - } - - /** - * Called per tick in {@link RecipeLogic#handleRecipeWorking()} - */ - default boolean onWorking(IWorkableMultiController controller) { - return true; - } - - /** - * Called per tick in {@link RecipeLogic#handleRecipeWorking()} - */ - default boolean onWaiting(IWorkableMultiController controller) { - return true; - } - - /** - * Called in {@link WorkableMultiblockMachine#setWorkingEnabled(boolean)} - */ - default boolean onPaused(IWorkableMultiController controller) { - return true; - } - - /** - * Called in {@link RecipeLogic#onRecipeFinish()} before outputs are produced - */ - default boolean afterWorking(IWorkableMultiController controller) { - return true; - } - - /** - * Called in {@link RecipeLogic#setupRecipe(GTRecipe)} - */ - default boolean beforeWorking(IWorkableMultiController controller) { - return true; - } - - /** - * Override it to modify recipe on the fly e.g. applying overclock, change chance, etc - * - * @param recipe recipe from detected from GTRecipeType - * @return modified recipe. - * null -- this recipe is unavailable - */ - default GTRecipe modifyRecipe(GTRecipe recipe) { - return recipe; - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/multiblock/IRotorHolderMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/multiblock/IRotorHolderMachine.java deleted file mode 100644 index 8b137891791..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/multiblock/IRotorHolderMachine.java +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/multiblock/IWorkableMultiController.java b/src/main/java/com/gregtechceu/gtceu/api/machine/feature/multiblock/IWorkableMultiController.java deleted file mode 100644 index d2fa20e8ba0..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/feature/multiblock/IWorkableMultiController.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.gregtechceu.gtceu.api.machine.feature.multiblock; - -import com.gregtechceu.gtceu.api.machine.feature.IRecipeLogicMachine; -import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; - -public interface IWorkableMultiController extends IRecipeLogicMachine { - - MultiblockControllerMachine self(); -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/mui/MachineUIPanelBuilder.java b/src/main/java/com/gregtechceu/gtceu/api/machine/mui/MachineUIPanelBuilder.java index 04a827ff619..7049c52147a 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/mui/MachineUIPanelBuilder.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/mui/MachineUIPanelBuilder.java @@ -2,8 +2,6 @@ import com.gregtechceu.gtceu.api.capability.IControllable; import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.api.machine.feature.IHasBatterySlot; -import com.gregtechceu.gtceu.api.machine.feature.IHasCircuitSlot; import com.gregtechceu.gtceu.api.machine.feature.IVoidable; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IDistinctPart; import com.gregtechceu.gtceu.api.machine.multiblock.WorkableMultiblockMachine; @@ -78,16 +76,9 @@ public MachineUIPanel build(PanelSyncManager syncManager, UISettings settings) { var attachMain = panel.getMainContents(); if (addDefaultConfigurators) { - if (machine instanceof IHasCircuitSlot circuitSlot && circuitSlot.isCircuitSlotEnabled()) { - attachLeft.child(GTMuiWidgets.createCircuitSlotPanel(circuitSlot, panel, syncManager)); - } - if (machine instanceof IControllable controllable) { attachRight.child(GTMuiWidgets.createPowerButton(controllable)); } - if (machine instanceof IHasBatterySlot batterySlot) { - attachRight.child(GTMuiWidgets.createBatterySlot(batterySlot, syncManager)); - } if (machine instanceof IVoidable voidable && machine instanceof WorkableMultiblockMachine) { attachRight.child(GTMuiWidgets.createVoidingButton(voidable)); } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/MultiblockControllerMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/MultiblockControllerMachine.java index 490c3aaae7f..7395644c36c 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/MultiblockControllerMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/MultiblockControllerMachine.java @@ -5,8 +5,10 @@ import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; -import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; +import com.gregtechceu.gtceu.api.machine.multiblock.part.MultiblockPartMachine; 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.multiblock.MultiblockMachineTrait; import com.gregtechceu.gtceu.api.multiblock.MultiblockWorldSavedData; import com.gregtechceu.gtceu.api.multiblock.pattern.*; @@ -40,20 +42,23 @@ import it.unimi.dsi.fastutil.longs.Long2ReferenceOpenHashMap; import it.unimi.dsi.fastutil.objects.Object2ObjectMap; import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; +import it.unimi.dsi.fastutil.objects.ObjectArrayList; import lombok.Getter; -import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.*; import java.util.function.BiConsumer; import java.util.function.Predicate; +/** + * The base class for all multiblock controllers. + */ +@SuppressWarnings({ "UnusedReturnValue" }) public class MultiblockControllerMachine extends MetaMachine { public static final String DEFAULT_STRUCTURE = "main"; - private @Nullable CurrentBlockInfo controllerBlockInfo = null; - private final List parts = new ArrayList<>(); + private final List parts = new ArrayList<>(); private @Nullable ParallelHatchPartMachine parallelHatch = null; @Getter @SyncToClient @@ -68,7 +73,7 @@ public class MultiblockControllerMachine extends MetaMachine { @SyncToClient protected boolean isFlipped; - protected static final Table<@NotNull MultiblockMachineDefinition, @NotNull String, @NotNull IBlockPattern> structurePatterns = HashBasedTable + protected static final Table structurePatterns = HashBasedTable .create(); protected final Object2ObjectMap patternStates = new Object2ObjectOpenHashMap<>(); @@ -111,24 +116,54 @@ public void setFlipped(boolean flipped) { protected void onPartsUpdated() { parts.clear(); for (var pos : partPositions) { - if (getMachine(getLevel(), pos) instanceof IMultiPart part) { + if (getMachine(getLevel(), pos) instanceof MultiblockPartMachine part) { parts.add(part); } } } + /** + * Gets the first trait (trait with highest priority) of a specified type from this multiblock's parts. + * + * @param type The trait type to get. + * @return The trait, or null if no traits of the given type are present. + */ + public @Nullable T getTraitFromParts(MachineTraitType type) { + T trait = null; + for (var part : getParts()) { + T partTrait = part.getTrait(type); + if (partTrait != null && (trait == null || partTrait.getTraitPriority() > trait.getTraitPriority())) + trait = partTrait; + } + return trait; + } + + /** + * Get all traits with the specified type. + * + * @param type The trait type to get + * @return An unmodifiable list containing all traits of the specified type. + */ + public List getTraitsFromParts(MachineTraitType type) { + List traits = new ObjectArrayList<>(); + for (var part : getParts()) { + traits.addAll(part.getTraits(type)); + } + return Collections.unmodifiableList(traits); + } + protected void updatePartPositions() { this.partPositions = this.parts.isEmpty() ? new BlockPos[0] : this.parts.stream().map(part -> part.self().getBlockPos()).toArray(BlockPos[]::new); syncDataHolder.markClientSyncFieldDirty("partPositions"); } - public List getParts() { + public List getParts() { // for the client side, when the chunk unloaded if (this.parts.size() != this.partPositions.length) { this.parts.clear(); for (BlockPos pos : this.partPositions) { - if (getMachine(getLevel(), pos) instanceof IMultiPart part) { + if (getMachine(getLevel(), pos) instanceof MultiblockPartMachine part) { this.parts.add(part); } } @@ -175,13 +210,13 @@ public void checkAndFormStructure() { /** * Whether the specific part should be added to the part list */ - public boolean shouldAddPartToController(IMultiPart part) { + public boolean shouldAddPartToController(MultiblockPartMachine part) { return true; } /** * Returns a list of all substructures this multiblock has. - * + * * @return set of substructures used by controller */ public Set getStructureNames() { @@ -234,18 +269,14 @@ public PatternState checkStructurePattern(String structureName) { PatternState state = getPatternState(structureName); if (pattern == null || !state.shouldUpdate() || getLevel() == null) return state; - long time = System.nanoTime(); state.setController(this, getBlockPos()); pattern.checkPatternFastAt(getLevel(), state, getBlockPos(), getFrontFacing(), getUpwardsFacing(), allowFlip()); - // GTCEu.LOGGER.info("Structure check for {} took {} ns", self().getDefinition().getName(), - // (System.nanoTime() - time)); - return state; } - public void formStructure(@NotNull String substructureName) { + public void formStructure(String substructureName) { var patternState = getPatternState(substructureName); patternState.setFormed(true); if (substructureName.equals(DEFAULT_STRUCTURE)) { @@ -299,12 +330,8 @@ public void formStructure(@NotNull String substructureName) { return; } - boolean valid = forEachMultiPart(substructureName, part -> { - if (part.hasController(getBlockPos()) && !part.canShared(this, substructureName)) { - return false; - } - return true; - }); + boolean valid = forEachMultiPart(substructureName, + part -> !part.hasController(getBlockPos()) || part.canShared(this, substructureName)); if (!valid) return; @@ -387,10 +414,10 @@ public IBlockPattern getSubstructurePattern(String name) { return structurePatterns.get(this.getDefinition(), name); } - protected final boolean forEachMultiPart(String name, Predicate action) { + protected final boolean forEachMultiPart(String name, Predicate action) { var cache = patternStates.get(name).getCache(); for (BlockInfo info : cache.values()) { - if (info.getBlockEntity() instanceof IMultiPart part) { + if (info.getBlockEntity() instanceof MultiblockPartMachine part) { if (!action.test(part)) return false; } } @@ -409,8 +436,8 @@ protected void forEachFormed(String name, BiConsumer part.self().isRemoved()); @@ -434,20 +461,17 @@ public boolean allowFlip() { return getDefinition().isAllowFlip(); } - public @Nullable BlockState getPartAppearance(IMultiPart part, Direction side, BlockState sourceState, - BlockPos sourcePos) { + public @Nullable BlockState getPartAppearance(MultiblockPartMachine part, Direction side, + @Nullable BlockState sourceState, + @Nullable BlockPos sourcePos) { if (isFormed()) { return getDefinition().getPartAppearance().apply(this, part, side); } return null; } - public Comparator getPartSorter() { - return getDefinition().getPartSorter().apply(this); - } - @Override - public void setUpwardsFacing(@NotNull Direction upwardsFacing) { + public void setUpwardsFacing(Direction upwardsFacing) { if (getLevel() == null) return; if (!getDefinition().isAllowExtendedFacing()) return; BlockState blockState = getBlockState(); diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/MultiblockDisplayText.java b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/MultiblockDisplayText.java index b06248da824..56fccedae43 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/MultiblockDisplayText.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/MultiblockDisplayText.java @@ -4,7 +4,7 @@ import com.gregtechceu.gtceu.api.capability.IEnergyContainer; import com.gregtechceu.gtceu.api.capability.recipe.FluidRecipeCapability; import com.gregtechceu.gtceu.api.capability.recipe.ItemRecipeCapability; -import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeLogic; import com.gregtechceu.gtceu.api.multiblock.pattern.PatternState; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.GTRecipeType; diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/WorkableElectricMultiblockMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/WorkableElectricMultiblockMachine.java index 2aac3ec86f6..7b525e8b87b 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/WorkableElectricMultiblockMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/multiblock/WorkableElectricMultiblockMachine.java @@ -10,7 +10,7 @@ import com.gregtechceu.gtceu.api.machine.feature.IOverclockMachine; import com.gregtechceu.gtceu.api.machine.feature.ITieredMachine; import com.gregtechceu.gtceu.api.machine.feature.IVoidable; -import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeLogic; import com.gregtechceu.gtceu.api.misc.EnergyContainerList; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.common.mui.GTMultiblockTextUtil; 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 9a43fcfd2df..2ed8b6eb401 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 @@ -7,10 +7,12 @@ import com.gregtechceu.gtceu.api.capability.recipe.IRecipeHandler; import com.gregtechceu.gtceu.api.capability.recipe.RecipeCapability; import com.gregtechceu.gtceu.api.machine.feature.IMufflableMachine; -import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; -import com.gregtechceu.gtceu.api.machine.feature.multiblock.IWorkableMultiController; +import com.gregtechceu.gtceu.api.machine.feature.IRecipeLogicMachine; +import com.gregtechceu.gtceu.api.machine.multiblock.part.MultiblockPartMachine; import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; import com.gregtechceu.gtceu.api.machine.trait.*; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeHandlerList; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeLogic; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.GTRecipeType; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; @@ -30,14 +32,17 @@ import lombok.Getter; import lombok.Setter; import org.jetbrains.annotations.ApiStatus; -import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.MustBeInvokedByOverriders; import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.VisibleForTesting; import java.util.*; +/** + * The base class for multiblocks with recipe logic. + */ public abstract class WorkableMultiblockMachine extends MultiblockControllerMachine - implements IWorkableMultiController, IMufflableMachine { + implements IRecipeLogicMachine, IMufflableMachine { @Getter protected final CleanroomReceiverTrait cleanroomReceiver; @@ -77,6 +82,7 @@ public WorkableMultiblockMachine(BlockEntityCreationInfo info, this.activeRecipeType = 0; this.cleanroomReceiver = attachTrait(new CleanroomReceiverTrait()); this.recipeLogic = attachTrait(recipeLogic); + this.recipeLogic.setKeepSubscribing(false); this.capabilitiesProxy = new EnumMap<>(IO.class); this.capabilitiesFlat = new EnumMap<>(IO.class); this.traitSubscriptions = new ArrayList<>(); @@ -111,7 +117,8 @@ public void onUnload() { // *** Multiblock LifeCycle ***// ////////////////////////////////////// @Override - public void formStructure(@NotNull String substructureName) { + @MustBeInvokedByOverriders + public void formStructure(String substructureName) { super.formStructure(substructureName); // attach parts' traits var cache = patternStates.get(substructureName).getCache(); @@ -126,7 +133,7 @@ public void formStructure(@NotNull String substructureName) { capabilitiesFlat.clear(); traitSubscriptions.forEach(ISubscription::unsubscribe); traitSubscriptions.clear(); - for (IMultiPart part : getParts()) { + for (MultiblockPartMachine part : getParts()) { var handlerLists = part.getRecipeHandlers(); for (var handlerList : handlerLists) { @@ -153,6 +160,7 @@ public void formStructure(@NotNull String substructureName) { } @Override + @MustBeInvokedByOverriders public void invalidateStructure(String name) { super.invalidateStructure(name); updateActiveBlocks(false); @@ -197,7 +205,7 @@ public void clientTick() { @Nullable @Override public final GTRecipe doModifyRecipe(GTRecipe recipe) { - for (IMultiPart part : getParts()) { + for (MultiblockPartMachine part : getParts()) { recipe = part.modifyRecipe(recipe); if (recipe == null) return null; } @@ -225,17 +233,13 @@ public void updateActiveBlocks(boolean active) { } @Override - public boolean keepSubscribing() { - return false; - } - - @Override - public void notifyStatusChanged(RecipeLogic.Status oldStatus, RecipeLogic.Status newStatus) { - IWorkableMultiController.super.notifyStatusChanged(oldStatus, newStatus); + public void recipeLogicStatusChanged(RecipeLogic.Status oldStatus, RecipeLogic.Status newStatus) { + IRecipeLogicMachine.super.recipeLogicStatusChanged(oldStatus, newStatus); if (shouldUpdateActiveBlocks()) { updateActiveBlocks(newStatus == RecipeLogic.Status.WORKING); } - for (IMultiPart part : getParts()) { + for (MultiblockPartMachine part : getParts()) { + part.recipeLogicStatusChanged(oldStatus, newStatus); MachineRenderState state = part.self().getRenderState(); if (state.hasProperty(GTMachineModelProperties.RECIPE_LOGIC_STATUS)) { part.self().setRenderState(state.setValue(GTMachineModelProperties.RECIPE_LOGIC_STATUS, newStatus)); @@ -257,48 +261,30 @@ public boolean isRecipeLogicAvailable() { @Override public void afterWorking() { - for (IMultiPart part : getParts()) { + for (MultiblockPartMachine part : getParts()) { part.afterWorking(this); } - IWorkableMultiController.super.afterWorking(); + IRecipeLogicMachine.super.afterWorking(); } @Override public boolean beforeWorking(@Nullable GTRecipe recipe) { - for (IMultiPart part : getParts()) { + for (MultiblockPartMachine part : getParts()) { if (!part.beforeWorking(this)) { return false; } } - return IWorkableMultiController.super.beforeWorking(recipe); + return IRecipeLogicMachine.super.beforeWorking(recipe); } @Override public boolean onWorking() { - for (IMultiPart part : getParts()) { + for (MultiblockPartMachine part : getParts()) { if (!part.onWorking(this)) { return false; } } - return IWorkableMultiController.super.onWorking(); - } - - @Override - public void onWaiting() { - for (IMultiPart part : getParts()) { - part.onWaiting(this); - } - IWorkableMultiController.super.onWaiting(); - } - - @Override - public void setWorkingEnabled(boolean isWorkingAllowed) { - if (!isWorkingAllowed) { - for (IMultiPart part : getParts()) { - part.onPaused(this); - } - } - IWorkableMultiController.super.setWorkingEnabled(isWorkingAllowed); + return IRecipeLogicMachine.super.onWorking(); } public GTRecipeType getRecipeType() { 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 b55706391b0..b375509bf52 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 @@ -4,11 +4,13 @@ import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.capability.recipe.IRecipeHandler; import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableMultiblockMachine; import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; import com.gregtechceu.gtceu.api.machine.trait.IRecipeHandlerTrait; -import com.gregtechceu.gtceu.api.machine.trait.RecipeHandlerList; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeHandlerList; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeLogic; +import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.sync_system.annotations.ClientFieldChangeListener; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.client.model.machine.MachineRenderState; @@ -21,7 +23,6 @@ import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; import it.unimi.dsi.fastutil.objects.ReferenceLinkedOpenHashSet; -import lombok.Getter; import org.jetbrains.annotations.MustBeInvokedByOverriders; import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.UnmodifiableView; @@ -31,12 +32,11 @@ /** * The base class for all multiblock parts */ -public class MultiblockPartMachine extends MetaMachine implements IMultiPart { +public class MultiblockPartMachine extends MetaMachine { @SyncToClient protected final Set controllerPositions = new ObjectOpenHashSet<>(8); protected final SortedSet controllers = new ReferenceLinkedOpenHashSet<>(8); - @Getter protected @Nullable String substructureName; private @Nullable RecipeHandlerList handlerList; @@ -49,16 +49,48 @@ public MultiblockPartMachine(BlockEntityCreationInfo info) { // ***** Initialization ******// ////////////////////////////////////// - @Override + /** + * Gets all controllers this multiblock part belongs to. + * + * @return An unmodifiable set containing the controllers. + */ + @UnmodifiableView + public SortedSet getControllers() { + synchronized (controllers) { + // Necessary to rebuild the set of controllers on client-side + if (controllers.size() != controllerPositions.size()) { + onControllersUpdated(); + } + return Collections.unmodifiableSortedSet(new ReferenceLinkedOpenHashSet<>(controllers)); + } + } + + /** + * If this multiblock part belongs to a controller at the given position + * + * @param controllerPos Controller position + * @return If this multiblock part belongs to a controller at the given position + */ public boolean hasController(BlockPos controllerPos) { return controllerPositions.contains(controllerPos); } - @Override + /** + * @return If this multiblock part belongs to a formed multiblock. + */ public boolean isFormed() { return !controllerPositions.isEmpty(); } + /** + * Gets the name of the main substructure this multiblock part is attached to. + * + * @return The substructure name, or null. + */ + public @Nullable String getSubstructureName() { + return substructureName; + } + // Not sure if necessary, but added to match the Controller class @ClientFieldChangeListener(fieldName = "controllerPositions") public void onControllersUpdated() { @@ -72,18 +104,9 @@ public void onControllersUpdated() { } } - @Override - @UnmodifiableView - public SortedSet getControllers() { - synchronized (controllers) { - // Necessary to rebuild the set of controllers on client-side - if (controllers.size() != controllerPositions.size()) { - onControllersUpdated(); - } - return Collections.unmodifiableSortedSet(new ReferenceLinkedOpenHashSet<>(controllers)); - } - } - + /** + * Get all available recipe handlers for recipe logic. + */ public List getRecipeHandlers() { return List.of(getHandlerList()); } @@ -131,12 +154,71 @@ public void onUnload() { substructureName = null; } + /** + * @return If this multiblock part can be shared between multiple multiblocks. + */ + public boolean canShared(MultiblockControllerMachine controller, String substructureName) { + return true; + } + + /** + * Called when the controller's recipe logic status changes + * + * @param oldStatus Old recipe logic status + * @param newStatus New recipe logic status + */ + public void recipeLogicStatusChanged(RecipeLogic.Status oldStatus, RecipeLogic.Status newStatus) {} + + /** + * Called when a recipe is about to be run by the controller, just before inputs are consumed. + * + * @return true to cancel the recipe, false to continue + * + * @see RecipeLogic#setupRecipe(GTRecipe) + */ + public boolean beforeWorking(WorkableMultiblockMachine controller) { + return true; + } + + /** + * Called every tick while the controller's recipe logic is working. + * + * @return true to interrupt and suspend the recipe, false to continue working + * + * @see RecipeLogic#handleRecipeWorking() + */ + public boolean onWorking(WorkableMultiblockMachine controller) { + return true; + } + + /** + * Called when the controller finishes a recipe, before outputs are produced. + * + * @see RecipeLogic#onRecipeFinish() + */ + public void afterWorking(WorkableMultiblockMachine controller) {} + + /** + * Override it to modify recipe on the fly e.g. applying overclock, change chance, etc + * + * @param recipe recipe from detected from GTRecipeType + * @return modified recipe. + * null -- this recipe is unavailable + */ + public @Nullable GTRecipe modifyRecipe(GTRecipe recipe) { + return recipe; + } + ////////////////////////////////////// // *** Multiblock LifeCycle ***// ////////////////////////////////////// + /** + * Called when this part is removed from a multiblock. + * + * @param controller The controller which this part has been removed from. + */ @MustBeInvokedByOverriders - @Override public void removedFromController(MultiblockControllerMachine controller) { controllerPositions.remove(controller.getBlockPos()); boolean empty; @@ -152,11 +234,18 @@ public void removedFromController(MultiblockControllerMachine controller) { setRenderState(renderState.setValue(GTMachineModelProperties.IS_FORMED, false)); } } + + getAllTraits().forEach(t -> t.removedFromController(controller)); + syncDataHolder.markClientSyncFieldDirty("controllerPositions"); } + /** + * Called when this part is added to a multiblock. + * + * @param controller The controller which this part has been added to + */ @MustBeInvokedByOverriders - @Override public void addedToController(MultiblockControllerMachine controller, String substructureName) { controllerPositions.add(controller.getBlockPos()); synchronized (controllers) { @@ -169,21 +258,33 @@ public void addedToController(MultiblockControllerMachine controller, String sub if (renderState.hasProperty(GTMachineModelProperties.IS_FORMED)) { setRenderState(renderState.setValue(GTMachineModelProperties.IS_FORMED, true)); } + + getAllTraits().forEach(t -> t.addedToController(controller)); } - @Override + /** + * If this part's base model can be replaced by controller when it is formed. + */ public boolean replacePartModelWhenFormed() { var renderState = getRenderState(); return renderState.hasProperty(GTMachineModelProperties.IS_FORMED) && renderState.getValue(GTMachineModelProperties.IS_FORMED); } - @Override + /** + * Called to get block appearance when this multi part is in a formed multiblock. + * + * @see MetaMachine#getBlockAppearance(BlockState, BlockAndTintGetter, BlockPos, Direction, BlockState, BlockPos) + */ @Nullable public BlockState getFormedAppearance(@Nullable BlockState sourceState, @Nullable BlockPos sourcePos, Direction side) { if (!replacePartModelWhenFormed()) return null; - return IMultiPart.super.getFormedAppearance(sourceState, sourcePos, side); + for (MultiblockControllerMachine controller : getControllers()) { + var appearance = controller.getPartAppearance(this, side, sourceState, sourcePos); + if (appearance != null) return appearance; + } + return null; } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/property/GTMachineModelProperties.java b/src/main/java/com/gregtechceu/gtceu/api/machine/property/GTMachineModelProperties.java index 3455ad36818..870e4c5402e 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/property/GTMachineModelProperties.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/property/GTMachineModelProperties.java @@ -1,6 +1,6 @@ package com.gregtechceu.gtceu.api.machine.property; -import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeLogic; import com.gregtechceu.gtceu.api.multiblock.util.RelativeDirection; import com.gregtechceu.gtceu.common.machine.electric.BatteryBufferMachine; import com.gregtechceu.gtceu.common.machine.multiblock.part.DiodePartMachine; diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SimpleSteamMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SimpleSteamMachine.java index 56a4836013a..d9a6a5067ae 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SimpleSteamMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SimpleSteamMachine.java @@ -6,8 +6,9 @@ import com.gregtechceu.gtceu.api.capability.recipe.ItemRecipeCapability; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; -import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; -import com.gregtechceu.gtceu.api.machine.trait.RecipeHandlerList; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableItemStackHandler; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeHandlerList; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeLogic; import com.gregtechceu.gtceu.api.multiblock.util.RelativeDirection; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.RecipeHelper; @@ -37,10 +38,28 @@ public class SimpleSteamMachine extends SteamWorkableMachine { @Getter private final ExhaustVentMachineTrait exhaustVentTrait; + /** + * Creates a {@link SimpleSteamMachine}. + * + * @param info {@link BlockEntityCreationInfo} + * @param recipeLogic The recipe logic to use. + * @param importSlots The amount of item input slots this machine should have (can be 0). + * @param exportSlots The amount of item output slots this machine should have (can be 0). + */ + public SimpleSteamMachine(BlockEntityCreationInfo info, RecipeLogic recipeLogic, boolean isHighPressure, + int importSlots, int exportSlots) { + super(info, isHighPressure, recipeLogic); + this.importItems = attachTrait(new NotifiableItemStackHandler(importSlots, IO.IN, IO.BOTH)); + this.exportItems = attachTrait(new NotifiableItemStackHandler(exportSlots, IO.OUT)); + this.exhaustVentTrait = attachTrait(new ExhaustVentMachineTrait()); + } + public SimpleSteamMachine(BlockEntityCreationInfo info, boolean isHighPressure) { super(info, isHighPressure); - this.importItems = attachTrait(createImportItemHandler()); - this.exportItems = attachTrait(createExportItemHandler()); + this.importItems = attachTrait( + new NotifiableItemStackHandler(getRecipeType().getMaxInputs(ItemRecipeCapability.CAP), IO.IN, IO.BOTH)); + this.exportItems = attachTrait( + new NotifiableItemStackHandler(getRecipeType().getMaxOutputs(ItemRecipeCapability.CAP), IO.OUT)); this.exhaustVentTrait = attachTrait(new ExhaustVentMachineTrait()); exhaustVentTrait.setVentingDamageAmount(isHighPressure() ? 12F : 6F); @@ -51,18 +70,6 @@ public SimpleSteamMachine(BlockEntityCreationInfo info, boolean isHighPressure) } } - ////////////////////////////////////// - // ***** Initialization *****// - ////////////////////////////////////// - - protected NotifiableItemStackHandler createImportItemHandler() { - return new NotifiableItemStackHandler(getRecipeType().getMaxInputs(ItemRecipeCapability.CAP), IO.IN, IO.BOTH); - } - - protected NotifiableItemStackHandler createExportItemHandler() { - return new NotifiableItemStackHandler(getRecipeType().getMaxOutputs(ItemRecipeCapability.CAP), IO.OUT); - } - @Override public void onLoad() { super.onLoad(); @@ -148,11 +155,4 @@ public static ModifierFunction recipeModifier(MetaMachine machine, GTRecipe reci if (!steamMachine.isHighPressure) builder.durationMultiplier(2); return builder.build(); } - - @Override - public void afterWorking() { - super.afterWorking(); - exhaustVentTrait.setNeedsVenting(true); - exhaustVentTrait.checkVenting(); - } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SteamBoilerMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SteamBoilerMachine.java index 74ba824d2c3..c34bf8aacdd 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SteamBoilerMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SteamBoilerMachine.java @@ -7,8 +7,8 @@ import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.feature.*; import com.gregtechceu.gtceu.api.machine.mui.MachineUIPanelBuilder; -import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; -import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableFluidTank; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeLogic; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.modifier.ModifierFunction; import com.gregtechceu.gtceu.api.recipe.modifier.RecipeModifier; @@ -53,6 +53,9 @@ import java.util.Collections; import java.util.List; +/** + * The base class for steam boilers + */ public abstract class SteamBoilerMachine extends SteamWorkableMachine implements IMuiMachine, IDataInfoProvider { diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SteamEnergyRecipeHandler.java b/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SteamEnergyRecipeHandler.java index 253b05f8c63..d3df9ced0b2 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SteamEnergyRecipeHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SteamEnergyRecipeHandler.java @@ -4,7 +4,7 @@ import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.capability.recipe.IRecipeHandler; import com.gregtechceu.gtceu.api.capability.recipe.RecipeCapability; -import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableFluidTank; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.ingredient.EnergyStack; import com.gregtechceu.gtceu.api.recipe.ingredient.FluidIngredient; @@ -14,7 +14,6 @@ import net.minecraftforge.fluids.FluidStack; import lombok.Getter; -import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.List; @@ -31,8 +30,8 @@ public SteamEnergyRecipeHandler(NotifiableFluidTank steamTank, double conversion } @Override - public @NotNull List handleRecipeInner(IO io, GTRecipe recipe, List left, - boolean simulate) { + public List handleRecipeInner(IO io, GTRecipe recipe, List left, + boolean simulate) { for (var it = left.listIterator(); it.hasNext();) { EnergyStack stack = it.next(); if (stack.isEmpty()) { @@ -60,7 +59,7 @@ public SteamEnergyRecipeHandler(NotifiableFluidTank steamTank, double conversion } @Override - public @NotNull List getContents() { + public List getContents() { List tankContents = new ArrayList<>(); for (int i = 0; i < steamTank.getTanks(); ++i) { FluidStack stack = steamTank.getFluidInTank(i); diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SteamMachine.java b/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SteamMachine.java index 5d7943b3bed..04bf3daef0f 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SteamMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/steam/SteamMachine.java @@ -4,12 +4,10 @@ import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.feature.ITieredMachine; -import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; -import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableFluidTank; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.common.data.GTMaterials; -import net.minecraft.world.level.block.state.properties.BooleanProperty; import net.minecraftforge.fluids.FluidType; import lombok.Getter; @@ -19,8 +17,6 @@ */ public abstract class SteamMachine extends MetaMachine implements ITieredMachine { - public static final BooleanProperty STEEL_PROPERTY = GTMachineModelProperties.IS_STEEL_MACHINE; - @Getter public final boolean isHighPressure; @SaveField 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 2f90f65552b..a7e60d80c3b 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 @@ -8,6 +8,9 @@ import com.gregtechceu.gtceu.api.machine.feature.IMufflableMachine; import com.gregtechceu.gtceu.api.machine.feature.IRecipeLogicMachine; import com.gregtechceu.gtceu.api.machine.trait.*; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableFluidTank; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeHandlerList; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeLogic; import com.gregtechceu.gtceu.api.recipe.GTRecipeType; import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; @@ -21,6 +24,7 @@ import net.minecraft.core.Direction; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.state.BlockState; import net.minecraftforge.fluids.FluidType; @@ -73,6 +77,7 @@ public SteamWorkableMachine(BlockEntityCreationInfo info, boolean isHighPressure this.activeRecipeType = 0; this.cleanroomReceiver = attachTrait(new CleanroomReceiverTrait()); this.recipeLogic = attachTrait(recipeLogic); + this.recipeLogic.setKeepSubscribing(false); this.capabilitiesProxy = new EnumMap<>(IO.class); this.capabilitiesFlat = new EnumMap<>(IO.class); this.traitSubscriptions = new ArrayList<>(); @@ -161,11 +166,6 @@ protected InteractionResult onWrenchClick(ExtendedUseOnContext context) { return super.onWrenchClick(context); } - @Override - public boolean keepSubscribing() { - return false; - } - @Override public GTRecipeType getRecipeType() { return recipeTypes[activeRecipeType]; @@ -186,7 +186,7 @@ public void clientTick() { ////////////////////////////////////// @Override public @Nullable UITexture sideTips(Player player, BlockPos pos, BlockState state, Set toolTypes, - Direction side) { + ItemStack held, Direction side) { if (toolTypes.contains(GTToolType.WRENCH)) { if (!player.isShiftKeyDown()) { if (!hasFrontFacing() || side != getFrontFacing()) { @@ -194,6 +194,6 @@ public void clientTick() { } } } - return super.sideTips(player, pos, state, toolTypes, side); + return super.sideTips(player, pos, state, toolTypes, held, side); } } 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 96b80b42bf0..4802681e63d 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 @@ -1,6 +1,7 @@ package com.gregtechceu.gtceu.api.machine.trait; import com.gregtechceu.gtceu.api.capability.recipe.IO; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableFluidTank; import com.gregtechceu.gtceu.api.transfer.fluid.IFluidHandlerModifiable; import com.gregtechceu.gtceu.utils.GTTransferUtils; @@ -10,7 +11,6 @@ import lombok.Getter; import lombok.Setter; import lombok.experimental.Accessors; -import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @Accessors(chain = true) @@ -43,14 +43,13 @@ public int getTanks() { return proxy == null ? 0 : proxy.getTanks(); } - @NotNull @Override public FluidStack getFluidInTank(int tank) { return proxy == null ? FluidStack.EMPTY : proxy.getFluidInTank(tank); } @Override - public void setFluidInTank(int tank, @NotNull FluidStack fluidStack) { + public void setFluidInTank(int tank, FluidStack fluidStack) { if (proxy != null) { proxy.setFluidInTank(tank, fluidStack); } @@ -62,7 +61,7 @@ public int getTankCapacity(int tank) { } @Override - public boolean isFluidValid(int tank, @NotNull FluidStack stack) { + public boolean isFluidValid(int tank, FluidStack stack) { return proxy != null && proxy.isFluidValid(tank, stack); } @@ -88,7 +87,6 @@ public FluidStack drainInternal(FluidStack resource, FluidAction action) { return FluidStack.EMPTY; } - @NotNull @Override public FluidStack drain(int maxDrain, FluidAction action) { if (proxy != null && canCapOutput()) { @@ -97,7 +95,6 @@ public FluidStack drain(int maxDrain, FluidAction action) { return FluidStack.EMPTY; } - @NotNull @Override public FluidStack drain(FluidStack resource, FluidAction action) { if (proxy != null && canCapOutput()) { 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 c476ecb5052..4483fc307a2 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 @@ -1,6 +1,7 @@ package com.gregtechceu.gtceu.api.machine.trait; import com.gregtechceu.gtceu.api.capability.recipe.IO; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableItemStackHandler; import com.gregtechceu.gtceu.utils.GTTransferUtils; import net.minecraft.MethodsReturnNonnullByDefault; 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 19942004bfb..11ef526af0f 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 @@ -2,6 +2,8 @@ import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.TickableSubscription; +import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableItemStackHandler; import com.gregtechceu.gtceu.api.sync_system.SyncDataHolder; import com.gregtechceu.gtceu.api.sync_system.managed.ISyncManaged; import com.gregtechceu.gtceu.client.model.machine.MachineRenderState; @@ -41,6 +43,9 @@ public abstract class MachineTrait implements ISyncManaged { @Setter protected Predicate<@Nullable Direction> capabilityValidator = $ -> true; + @Getter + @Setter(onMethod_ = @ApiStatus.Internal) + private @Nullable String traitName; /** * The trait's callback priority. Traits with a higher priority will have their events fired * first, which may prevent traits with a lower priority from handling some events. @@ -52,7 +57,8 @@ public abstract class MachineTrait implements ISyncManaged { public MachineTrait() {} public MetaMachine getMachine() { - if (machine == null) throw new IllegalStateException("Machine trait not attached to machine."); + if (machine == null) throw new IllegalStateException( + "Machine trait not attached to machine. Trait initialisation that depends on machine instance should run in onMachineLoad."); return machine; } @@ -82,7 +88,13 @@ public void setMachine(MetaMachine machine) { this.machine = machine; } - public abstract MachineTraitType getTraitType(); + /** + * Gets the trait type of this the machine. + * Overriders should return {@code MachineTraitType} instead of {@code MachineTrait}. + * + * @return The trait type. + */ + public abstract MachineTraitType getTraitType(); public @Nullable TickableSubscription subscribeServerTick(@Nullable TickableSubscription last, Runnable runnable) { return getMachine().subscribeServerTick(last, runnable); @@ -139,6 +151,22 @@ public void onMachineUnload() {} */ public void onMachineDestroyed() {} + /** + * Called when the machine is attached to a controller
+ * Only called if this trait is attached to a multiblock part machine. + * + * @param controller The multiblock controller + */ + public void addedToController(MultiblockControllerMachine controller) {} + + /** + * Called when the machine is removed from a controller
+ * Only called if this trait is attached to a multiblock part machine. + * + * @param controller The multiblock controller + */ + public void removedFromController(MultiblockControllerMachine controller) {} + /** * Called when a neighboring block is updated. * 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 decb4702f2e..61d21f4124a 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 @@ -19,6 +19,9 @@ public final class MachineTraitHolder { private final MetaMachine machine; + + private boolean allowTraitAttachment = true; + private final List traits; private final Map, List> traitsByType; @@ -57,6 +60,9 @@ public T attachTrait(T trait) { * @return The attached trait */ public T attachTrait(T trait, int callbackPriority) { + if (!allowTraitAttachment) + throw new IllegalStateException("Cannot add traits to machine after machine has been loaded."); + trait.setTraitPriority(callbackPriority); var traitType = trait.getTraitType(); @@ -75,6 +81,37 @@ public T attachTrait(T trait, int callbackPriority) { return trait; } + /** + * Registers a trait with data to be saved or synced to the client. + * Do not register a persistent trait and also store that trait as a syncable machine field, otherwise the trait + * data will be duplicated. Use only one sync method.
+ * Note: Persistent traits must be attached before data load, or they will not be loaded correctly. + * + * @param traitName Unique identifier for this trait. + * @param trait The trait to register + */ + public void attachPersistentTrait(String traitName, MachineTrait trait) { + attachTrait(trait); + registerPersistentTrait(traitName, trait); + } + + /** + * Registers a trait with data to be saved or synced to the client. + * Do not register a persistent trait and also store that trait as a syncable machine field, otherwise the trait + * data will be duplicated. Use only one sync method.
+ * Note: Persistent traits must be attached before data load, or they will not be loaded correctly. + * + * @param traitName Unique identifier for this trait. + * @param callbackPriority The trait's callback priority. Traits with a higher priority will have their events fired + * first, which may prevent traits with a lower priority from handling some events. + * @param trait The trait to register + */ + public T attachPersistentTrait(String traitName, T trait, int callbackPriority) { + attachTrait(trait, callbackPriority); + registerPersistentTrait(traitName, trait); + return trait; + } + /** * Registers a trait with data to be saved or synced to the client. * Do not register a persistent trait and also store that trait as a syncable machine field, otherwise the trait @@ -87,6 +124,7 @@ public MachineTraitHolder registerPersistentTrait(String traitName, MachineTrait if (trait.getMachine() != machine) throw new IllegalArgumentException("Trait does not belong to this machine."); if (traitsToSave.containsKey(traitName)) throw new IllegalArgumentException("Attempted to register duplicate trait save key \"" + traitName + "\""); + trait.setTraitName(traitName); traitsToSave.put(traitName, trait); return this; } @@ -137,6 +175,10 @@ public Optional getTraitOptional(MachineTraitType return Collections.unmodifiableList(traitList); } + public void machineLoaded() { + allowTraitAttachment = false; + } + private static class MachineTraitHolderTransformer implements ValueTransformer { @Override @@ -164,7 +206,7 @@ public Tag serializeNBT(MachineTraitHolder value, TransformerContext> validMachineClasses() { - return List.of(IRecipeLogicMachine.class); - } - - @Override - public long getInputAmperage() { - var recipeLogic = getMachine().getTrait(RecipeLogic.TYPE); - if (recipeLogic == null) return 0; - var lastRecipe = recipeLogic.getLastRecipe(); - long amperage; - if (lastRecipe != null) { - amperage = lastRecipe.getInputEUt().amperage(); - } else { - amperage = super.getInputAmperage(); - } - if (getEnergyCapacity() / 2 > getEnergyStored() && recipeLogic.isActive()) { - return amperage + 1; - } else { - return amperage; - } - } - - @Override - public long getOutputAmperage() { - var recipeLogic = getMachine().getTrait(RecipeLogic.TYPE); - if (recipeLogic == null) return 0; - var lastRecipe = recipeLogic.getLastRecipe(); - if (lastRecipe != null) { - return lastRecipe.getOutputEUt().amperage(); - } else { - return super.getOutputAmperage(); - } - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/IRecipeLogicModifierTrait.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/IRecipeLogicModifierTrait.java new file mode 100644 index 00000000000..5c7e84a687f --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/feature/IRecipeLogicModifierTrait.java @@ -0,0 +1,62 @@ +package com.gregtechceu.gtceu.api.machine.trait.feature; + +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeLogic; +import com.gregtechceu.gtceu.api.recipe.GTRecipe; + +import org.jetbrains.annotations.Nullable; + +/** + * A machine trait that modifies the behaviour of the recipe logic instance attached to a machine + */ +@SuppressWarnings("unused") +public interface IRecipeLogicModifierTrait { + + /** + * Called when the recipe logic status changes + * + * @param oldStatus Old recipe logic status + * @param newStatus New recipe logic status + */ + default void recipeLogicStatusChanged(RecipeLogic.Status oldStatus, RecipeLogic.Status newStatus) {} + + /** + * Override to modify recipe on the fly e.g. applying overclock, change chance, etc + * + * @param recipe The current recipe + * @return modified recipe. + * null -- this recipe is unavailable + */ + @Nullable + default GTRecipe modifyRecipe(GTRecipe recipe) { + return recipe; + } + + /** + * Called when a recipe is about to be run, just before inputs are consumed. + * + * @return true to cancel the recipe, false to continue + * + * @see RecipeLogic#setupRecipe(GTRecipe) + */ + default boolean beforeWorking(@Nullable GTRecipe recipe) { + return true; + } + + /** + * Called every tick while the recipe is working. + * + * @return true to interrupt and suspend the recipe, false to continue working + * + * @see RecipeLogic#handleRecipeWorking() + */ + default boolean onWorking() { + return true; + } + + /** + * Called when the recipe finishes, before outputs are produced. + * + * @see RecipeLogic#onRecipeFinish() + */ + default void afterWorking() {} +} 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 a5d708c3d34..946f21206c7 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 @@ -41,12 +41,13 @@ default boolean shouldRenderGridOverlay(Player player, BlockPos pos, BlockState * @param pos Block pos * @param state Block state * @param toolTypes The GT tool types of the held item, if any + * @param held * @param side The machine side which this grid segment correspond to * @return The icon to be rendered, or null */ default @Nullable UITexture getGridOverlayIcon(Player player, BlockPos pos, BlockState state, Set toolTypes, - Direction side) { + ItemStack held, Direction side) { return null; } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/multiblock/MultiblockMachineTrait.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/multiblock/MultiblockMachineTrait.java index 239f4a8a12e..3377e15cc05 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/multiblock/MultiblockMachineTrait.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/multiblock/MultiblockMachineTrait.java @@ -29,7 +29,7 @@ protected List> validMachineClasses() { * * @param substructureName - the name of the substructure * - * @see MultiblockControllerMachine#formStructure(String) () + * @see MultiblockControllerMachine#formStructure(String) */ public void onStructureFormed(String substructureName) {} diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableComputationContainer.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/notifiable/NotifiableComputationContainer.java similarity index 92% rename from src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableComputationContainer.java rename to src/main/java/com/gregtechceu/gtceu/api/machine/trait/notifiable/NotifiableComputationContainer.java index 0aebbae9017..2c108fac1a4 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableComputationContainer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/notifiable/NotifiableComputationContainer.java @@ -1,4 +1,4 @@ -package com.gregtechceu.gtceu.api.machine.trait; +package com.gregtechceu.gtceu.api.machine.trait.notifiable; import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.capability.GTCapability; @@ -7,8 +7,10 @@ import com.gregtechceu.gtceu.api.capability.IOpticalComputationReceiver; import com.gregtechceu.gtceu.api.capability.recipe.*; import com.gregtechceu.gtceu.api.machine.feature.IRecipeLogicMachine; -import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; +import com.gregtechceu.gtceu.api.machine.multiblock.part.MultiblockPartMachine; +import com.gregtechceu.gtceu.api.machine.trait.MachineTrait; +import com.gregtechceu.gtceu.api.machine.trait.MachineTraitType; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.common.blockentity.OpticalPipeBlockEntity; import com.gregtechceu.gtceu.utils.GTUtil; @@ -67,7 +69,7 @@ public int requestCWUt(int cwut, boolean simulate, Collection seen) { // Ask the Multiblock controller, which *should* be an IOpticalComputationProvider if (machine instanceof IOpticalComputationProvider provider) { return provider.getMaxCWUt(seen); - } else if (machine instanceof IMultiPart part) { + } else if (machine instanceof MultiblockPartMachine part) { if (!part.isFormed()) { return 0; } @@ -153,7 +155,7 @@ public boolean canBridge(Collection seen) { // Ask the Multiblock controller, which *should* be an IOpticalComputationProvider if (machine instanceof IOpticalComputationProvider provider) { return provider.canBridge(seen); - } else if (machine instanceof IMultiPart part) { + } else if (machine instanceof MultiblockPartMachine part) { if (!part.isFormed()) { return false; } @@ -204,13 +206,13 @@ public boolean canBridge(Collection seen) { var machine = getMachine(); if (machine instanceof IRecipeLogicMachine rlm) { // first, remove the progress the recipe logic adds. - rlm.getRecipeLogic().progress -= 1; - rlm.getRecipeLogic().progress += drawn; - } else if (machine instanceof IMultiPart multiPart) { + rlm.getRecipeLogic().setProgress(rlm.getProgress() - 1); + rlm.getRecipeLogic().setProgress(rlm.getProgress() + drawn); + } else if (machine instanceof MultiblockPartMachine multiPart) { for (MultiblockControllerMachine controller : multiPart.getControllers()) { if (controller instanceof IRecipeLogicMachine rlm) { - rlm.getRecipeLogic().progress -= 1; - rlm.getRecipeLogic().progress += drawn; + rlm.getRecipeLogic().setProgress(rlm.getProgress() - 1); + rlm.getRecipeLogic().setProgress(rlm.getProgress() + drawn); } } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableEnergyContainer.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/notifiable/NotifiableEnergyContainer.java similarity index 98% rename from src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableEnergyContainer.java rename to src/main/java/com/gregtechceu/gtceu/api/machine/trait/notifiable/NotifiableEnergyContainer.java index d8b1216d490..1c0f1b7a997 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableEnergyContainer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/notifiable/NotifiableEnergyContainer.java @@ -1,4 +1,4 @@ -package com.gregtechceu.gtceu.api.machine.trait; +package com.gregtechceu.gtceu.api.machine.trait.notifiable; import com.gregtechceu.gtceu.api.GTValues; import com.gregtechceu.gtceu.api.capability.GTCapabilityHelper; @@ -9,6 +9,7 @@ import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.capability.recipe.RecipeCapability; import com.gregtechceu.gtceu.api.machine.TickableSubscription; +import com.gregtechceu.gtceu.api.machine.trait.MachineTraitType; import com.gregtechceu.gtceu.api.misc.EnergyContainerList; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.ingredient.EnergyStack; @@ -42,7 +43,7 @@ public class NotifiableEnergyContainer extends NotifiableRecipeHandlerTrait getTraitType() { + public MachineTraitType getTraitType() { return TYPE; } diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableFluidTank.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/notifiable/NotifiableFluidTank.java similarity index 97% rename from src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableFluidTank.java rename to src/main/java/com/gregtechceu/gtceu/api/machine/trait/notifiable/NotifiableFluidTank.java index ea748777afe..9e9c6789f62 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableFluidTank.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/notifiable/NotifiableFluidTank.java @@ -1,8 +1,11 @@ -package com.gregtechceu.gtceu.api.machine.trait; +package com.gregtechceu.gtceu.api.machine.trait.notifiable; import com.gregtechceu.gtceu.api.capability.recipe.FluidRecipeCapability; +import com.gregtechceu.gtceu.api.capability.recipe.IFilteredHandler; import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.capability.recipe.RecipeCapability; +import com.gregtechceu.gtceu.api.machine.trait.ICapabilityTrait; +import com.gregtechceu.gtceu.api.machine.trait.MachineTraitType; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.ingredient.FluidIngredient; import com.gregtechceu.gtceu.api.recipe.ingredient.IntProviderFluidIngredient; @@ -228,7 +231,8 @@ public boolean test(FluidIngredient ingredient) { @Override public int getPriority() { - return !isLocked() || lockedFluid.getFluid().isEmpty() ? super.getPriority() : HIGH - getTanks(); + return !isLocked() || lockedFluid.getFluid().isEmpty() ? super.getPriority() : + IFilteredHandler.HIGH - getTanks(); } public boolean isLocked() { diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableItemStackHandler.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/notifiable/NotifiableItemStackHandler.java similarity index 98% rename from src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableItemStackHandler.java rename to src/main/java/com/gregtechceu/gtceu/api/machine/trait/notifiable/NotifiableItemStackHandler.java index 45dcd6279df..b949dd1873e 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableItemStackHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/notifiable/NotifiableItemStackHandler.java @@ -1,9 +1,11 @@ -package com.gregtechceu.gtceu.api.machine.trait; +package com.gregtechceu.gtceu.api.machine.trait.notifiable; import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.capability.recipe.ItemRecipeCapability; import com.gregtechceu.gtceu.api.capability.recipe.RecipeCapability; +import com.gregtechceu.gtceu.api.machine.trait.ICapabilityTrait; +import com.gregtechceu.gtceu.api.machine.trait.MachineTraitType; import com.gregtechceu.gtceu.api.recipe.DummyCraftingContainer; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.ingredient.IntProviderIngredient; diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableLaserContainer.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/notifiable/NotifiableLaserContainer.java similarity index 96% rename from src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableLaserContainer.java rename to src/main/java/com/gregtechceu/gtceu/api/machine/trait/notifiable/NotifiableLaserContainer.java index 0e3d5c0299a..31e7a246a0e 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableLaserContainer.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/notifiable/NotifiableLaserContainer.java @@ -1,7 +1,8 @@ -package com.gregtechceu.gtceu.api.machine.trait; +package com.gregtechceu.gtceu.api.machine.trait.notifiable; import com.gregtechceu.gtceu.api.capability.GTCapabilityHelper; import com.gregtechceu.gtceu.api.capability.ILaserContainer; +import com.gregtechceu.gtceu.api.machine.trait.MachineTraitType; import com.gregtechceu.gtceu.utils.GTUtil; import net.minecraft.MethodsReturnNonnullByDefault; diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableRecipeHandlerTrait.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/notifiable/NotifiableRecipeHandlerTrait.java similarity index 83% rename from src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableRecipeHandlerTrait.java rename to src/main/java/com/gregtechceu/gtceu/api/machine/trait/notifiable/NotifiableRecipeHandlerTrait.java index 558a57ee379..40a8625a2b1 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/NotifiableRecipeHandlerTrait.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/notifiable/NotifiableRecipeHandlerTrait.java @@ -1,5 +1,7 @@ -package com.gregtechceu.gtceu.api.machine.trait; +package com.gregtechceu.gtceu.api.machine.trait.notifiable; +import com.gregtechceu.gtceu.api.machine.trait.IRecipeHandlerTrait; +import com.gregtechceu.gtceu.api.machine.trait.MachineTrait; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.utils.ISubscription; diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeHandlerGroup.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/recipe/RecipeHandlerGroup.java similarity index 68% rename from src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeHandlerGroup.java rename to src/main/java/com/gregtechceu/gtceu/api/machine/trait/recipe/RecipeHandlerGroup.java index 256246aa8ea..136a9851ef2 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeHandlerGroup.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/recipe/RecipeHandlerGroup.java @@ -1,4 +1,4 @@ -package com.gregtechceu.gtceu.api.machine.trait; +package com.gregtechceu.gtceu.api.machine.trait.recipe; public interface RecipeHandlerGroup { diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeHandlerGroupColor.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/recipe/RecipeHandlerGroupColor.java similarity index 80% rename from src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeHandlerGroupColor.java rename to src/main/java/com/gregtechceu/gtceu/api/machine/trait/recipe/RecipeHandlerGroupColor.java index 99314feb0c8..ebcc20bed38 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeHandlerGroupColor.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/recipe/RecipeHandlerGroupColor.java @@ -1,4 +1,4 @@ -package com.gregtechceu.gtceu.api.machine.trait; +package com.gregtechceu.gtceu.api.machine.trait.recipe; public record RecipeHandlerGroupColor(int color) implements RecipeHandlerGroup { diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeHandlerGroupDistinctness.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/recipe/RecipeHandlerGroupDistinctness.java similarity index 67% rename from src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeHandlerGroupDistinctness.java rename to src/main/java/com/gregtechceu/gtceu/api/machine/trait/recipe/RecipeHandlerGroupDistinctness.java index d853244ba7b..529035b2ee7 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeHandlerGroupDistinctness.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/recipe/RecipeHandlerGroupDistinctness.java @@ -1,4 +1,4 @@ -package com.gregtechceu.gtceu.api.machine.trait; +package com.gregtechceu.gtceu.api.machine.trait.recipe; public enum RecipeHandlerGroupDistinctness implements RecipeHandlerGroup { BUS_DISTINCT, diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeHandlerList.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/recipe/RecipeHandlerList.java similarity index 97% rename from src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeHandlerList.java rename to src/main/java/com/gregtechceu/gtceu/api/machine/trait/recipe/RecipeHandlerList.java index 0ea141df2c4..7a492a850e9 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeHandlerList.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/recipe/RecipeHandlerList.java @@ -1,8 +1,10 @@ -package com.gregtechceu.gtceu.api.machine.trait; +package com.gregtechceu.gtceu.api.machine.trait.recipe; import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.capability.recipe.IRecipeHandler; import com.gregtechceu.gtceu.api.capability.recipe.RecipeCapability; +import com.gregtechceu.gtceu.api.machine.trait.IRecipeHandlerTrait; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableRecipeHandlerTrait; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.utils.ISubscription; diff --git a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeLogic.java b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/recipe/RecipeLogic.java similarity index 94% rename from src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeLogic.java rename to src/main/java/com/gregtechceu/gtceu/api/machine/trait/recipe/RecipeLogic.java index 500fdc6f2af..63ee0a2b825 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/machine/trait/RecipeLogic.java +++ b/src/main/java/com/gregtechceu/gtceu/api/machine/trait/recipe/RecipeLogic.java @@ -1,4 +1,4 @@ -package com.gregtechceu.gtceu.api.machine.trait; +package com.gregtechceu.gtceu.api.machine.trait.recipe; import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.capability.IWorkable; @@ -10,6 +10,8 @@ import com.gregtechceu.gtceu.api.machine.feature.IRecipeLogicMachine; import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; 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.recipe.ActionResult; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.RecipeHelper; @@ -139,6 +141,30 @@ public enum Status implements StringRepresentable { protected @Nullable TickableSubscription subscription; protected @Nullable Object workingSound; + /** + * If recipe progress should decrease when machine is waiting for pertick ingredients. (e.g. lack of EU) + */ + @Getter + @Setter + protected boolean regressWhenWaiting; + + /** + * Whether the recipe logic should keep subscribing tick logic when no recipe is available after one cycle. + * if false. you should call {@link RecipeLogic#updateTickSubscription()} manually later to active recipe logic + * again. + */ + @Getter + @Setter + protected boolean keepSubscribing = true; + + /** + * If recipe modifiers should always been applied before setting up a recipe.
+ * If true, recipe modifiers will always be applied, even if the previous recipe can be run again.
+ * If false, the previous recipe will be run again without reapplying modifiers.
+ * Defaults to true, so that recipes will always attempt to update OC, parallels, etc. + */ + protected boolean alwaysTryModifyRecipe = true; + public RecipeLogic() { super(); } @@ -183,6 +209,7 @@ public void resetRecipeLogic() { @Override public void onMachineLoad() { super.onMachineLoad(); + regressWhenWaiting = getMachine().getDefinition().isRegressWhenWaiting(); updateTickSubscription(); } @@ -228,7 +255,7 @@ public void serverTick() { } } else if (lastRecipe != null) { findAndHandleRecipe(); - } else if (!getRLMachine().keepSubscribing() || getMachine().getOffsetTimer() % 5 == 0) { + } else if (!keepSubscribing || getMachine().getOffsetTimer() % 5 == 0) { findAndHandleRecipe(); if (lastFailedMatches != null) { for (GTRecipe match : lastFailedMatches) { @@ -241,7 +268,7 @@ public void serverTick() { if (isSuspend()) { // Machine is paused and can unsubscribe unsubscribe = true; - } else if (lastRecipe == null && isIdle() && !getRLMachine().keepSubscribing() && !recipeDirty && + } else if (lastRecipe == null && isIdle() && !keepSubscribing && !recipeDirty && lastFailedMatches == null) { // No recipes available and the machine wants to unsubscribe until notified unsubscribe = true; @@ -337,7 +364,7 @@ public void handleRecipeWorking() { } protected void regressRecipe() { - if (progress > 0 && getRLMachine().regressWhenWaiting()) { + if (progress > 0 && regressWhenWaiting) { this.progress = 1; syncDataHolder.markClientSyncFieldDirty("progress"); } @@ -436,7 +463,7 @@ public void setStatus(Status status) { status = Status.SUSPEND; suspendAfterFinish = false; } - getRLMachine().notifyStatusChanged(this.status, status); + getRLMachine().recipeLogicStatusChanged(this.status, status); this.status = status; syncDataHolder.markClientSyncFieldDirty("status"); setRenderState(getRenderState().setValue(GTMachineModelProperties.RECIPE_LOGIC_STATUS, status)); @@ -452,7 +479,6 @@ public void setWaiting(@Nullable Component reason) { setStatus(Status.WAITING); waitingReason = reason; syncDataHolder.markClientSyncFieldDirty("waitingReason"); - getRLMachine().onWaiting(); } /** @@ -544,7 +570,7 @@ public void onRecipeFinish() { syncDataHolder.resyncAllFields(); return; } - if (getRLMachine().alwaysTryModifyRecipe()) { + if (alwaysTryModifyRecipe) { if (lastOriginRecipe != null) { var modified = getRLMachine().fullModifyRecipe(lastOriginRecipe.copy()); if (modified == null) { diff --git a/src/main/java/com/gregtechceu/gtceu/api/misc/ItemRecipeHandler.java b/src/main/java/com/gregtechceu/gtceu/api/misc/ItemRecipeHandler.java index ef83d056abc..0f752a5605c 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/misc/ItemRecipeHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/api/misc/ItemRecipeHandler.java @@ -4,7 +4,7 @@ import com.gregtechceu.gtceu.api.capability.recipe.IRecipeHandler; import com.gregtechceu.gtceu.api.capability.recipe.ItemRecipeCapability; import com.gregtechceu.gtceu.api.capability.recipe.RecipeCapability; -import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableItemStackHandler; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; diff --git a/src/main/java/com/gregtechceu/gtceu/api/multiblock/util/RelativeDirection.java b/src/main/java/com/gregtechceu/gtceu/api/multiblock/util/RelativeDirection.java index a81bed3acda..0ee74099c28 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/multiblock/util/RelativeDirection.java +++ b/src/main/java/com/gregtechceu/gtceu/api/multiblock/util/RelativeDirection.java @@ -1,6 +1,6 @@ package com.gregtechceu.gtceu.api.multiblock.util; -import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; +import com.gregtechceu.gtceu.api.machine.multiblock.part.MultiblockPartMachine; import com.gregtechceu.gtceu.utils.GTUtil; import net.minecraft.core.BlockPos; @@ -81,7 +81,8 @@ public ToIntFunction getPosSorter(Direction frontFacing, Direction upw }; } - public ToIntFunction getMultiSorter(Direction frontFacing, Direction upwardsFacing, boolean isFlipped) { + public ToIntFunction getMultiSorter(Direction frontFacing, Direction upwardsFacing, + boolean isFlipped) { // get the direction to go in for the part sorter Direction sorterDirection = getRelativeFacing(frontFacing, upwardsFacing, isFlipped); diff --git a/src/main/java/com/gregtechceu/gtceu/api/recipe/RecipeCondition.java b/src/main/java/com/gregtechceu/gtceu/api/recipe/RecipeCondition.java index 415faf761de..57f48fe8bc9 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/recipe/RecipeCondition.java +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/RecipeCondition.java @@ -1,7 +1,7 @@ package com.gregtechceu.gtceu.api.recipe; import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeLogic; import com.gregtechceu.gtceu.api.recipe.condition.RecipeConditionType; import com.gregtechceu.gtceu.api.recipe.gui.RecipeUIModifier; import com.gregtechceu.gtceu.api.registry.GTRegistries; diff --git a/src/main/java/com/gregtechceu/gtceu/api/recipe/RecipeHelper.java b/src/main/java/com/gregtechceu/gtceu/api/recipe/RecipeHelper.java index b8ebc067ba1..65df522eed8 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/recipe/RecipeHelper.java +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/RecipeHelper.java @@ -2,11 +2,11 @@ import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.capability.recipe.*; -import com.gregtechceu.gtceu.api.machine.trait.RecipeHandlerGroup; -import com.gregtechceu.gtceu.api.machine.trait.RecipeHandlerGroupColor; -import com.gregtechceu.gtceu.api.machine.trait.RecipeHandlerGroupDistinctness; -import com.gregtechceu.gtceu.api.machine.trait.RecipeHandlerList; -import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeHandlerGroup; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeHandlerGroupColor; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeHandlerGroupDistinctness; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeHandlerList; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeLogic; import com.gregtechceu.gtceu.api.recipe.condition.RecipeConditionType; import com.gregtechceu.gtceu.api.recipe.content.Content; import com.gregtechceu.gtceu.api.recipe.ingredient.EnergyStack; diff --git a/src/main/java/com/gregtechceu/gtceu/api/recipe/RecipeRunner.java b/src/main/java/com/gregtechceu/gtceu/api/recipe/RecipeRunner.java index 53dae26ab7b..587b0f24777 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/recipe/RecipeRunner.java +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/RecipeRunner.java @@ -4,9 +4,9 @@ import com.gregtechceu.gtceu.api.capability.recipe.IRecipeCapabilityHolder; import com.gregtechceu.gtceu.api.capability.recipe.RecipeCapability; import com.gregtechceu.gtceu.api.machine.feature.IVoidable; -import com.gregtechceu.gtceu.api.machine.trait.RecipeHandlerGroup; -import com.gregtechceu.gtceu.api.machine.trait.RecipeHandlerGroupColor; -import com.gregtechceu.gtceu.api.machine.trait.RecipeHandlerList; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeHandlerGroup; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeHandlerGroupColor; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeHandlerList; import com.gregtechceu.gtceu.api.recipe.chance.logic.ChanceLogic; import com.gregtechceu.gtceu.api.recipe.content.Content; @@ -24,8 +24,8 @@ import java.util.Map; import java.util.function.Predicate; -import static com.gregtechceu.gtceu.api.machine.trait.RecipeHandlerGroupDistinctness.BUS_DISTINCT; -import static com.gregtechceu.gtceu.api.machine.trait.RecipeHandlerGroupDistinctness.BYPASS_DISTINCT; +import static com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeHandlerGroupDistinctness.BUS_DISTINCT; +import static com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeHandlerGroupDistinctness.BYPASS_DISTINCT; import static com.gregtechceu.gtceu.api.recipe.RecipeHelper.addToRecipeHandlerMap; public class RecipeRunner { diff --git a/src/main/java/com/gregtechceu/gtceu/api/recipe/gui/MachineCapabilityLayoutBuilder.java b/src/main/java/com/gregtechceu/gtceu/api/recipe/gui/MachineCapabilityLayoutBuilder.java index 094d160662e..f16700bcfce 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/recipe/gui/MachineCapabilityLayoutBuilder.java +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/gui/MachineCapabilityLayoutBuilder.java @@ -6,8 +6,8 @@ import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.SimpleTieredMachine; import com.gregtechceu.gtceu.api.machine.steam.SimpleSteamMachine; -import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; -import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableFluidTank; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableItemStackHandler; import brachy.modularui.value.sync.FluidSlotSyncHandler; import brachy.modularui.widgets.SlotGroupWidget; diff --git a/src/main/java/com/gregtechceu/gtceu/api/recipe/modifier/ParallelLogic.java b/src/main/java/com/gregtechceu/gtceu/api/recipe/modifier/ParallelLogic.java index afdad07a749..755276d617f 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/recipe/modifier/ParallelLogic.java +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/modifier/ParallelLogic.java @@ -3,7 +3,7 @@ import com.gregtechceu.gtceu.api.capability.recipe.*; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.feature.IRecipeLogicMachine; -import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeLogic; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.RecipeHelper; import com.gregtechceu.gtceu.api.recipe.content.ContentModifier; diff --git a/src/main/java/com/gregtechceu/gtceu/api/recipe/modifier/RecipeModifierList.java b/src/main/java/com/gregtechceu/gtceu/api/recipe/modifier/RecipeModifierList.java index 533b131e481..0203af474e3 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/recipe/modifier/RecipeModifierList.java +++ b/src/main/java/com/gregtechceu/gtceu/api/recipe/modifier/RecipeModifierList.java @@ -1,7 +1,7 @@ package com.gregtechceu.gtceu.api.recipe.modifier; import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeLogic; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import lombok.Getter; diff --git a/src/main/java/com/gregtechceu/gtceu/api/registry/registrate/GTRegistrate.java b/src/main/java/com/gregtechceu/gtceu/api/registry/registrate/GTRegistrate.java index 13461e0b085..cb897b38d2d 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/registry/registrate/GTRegistrate.java +++ b/src/main/java/com/gregtechceu/gtceu/api/registry/registrate/GTRegistrate.java @@ -2,12 +2,13 @@ import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.block.MetaMachineBlock; -import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.data.chemical.material.Material; import com.gregtechceu.gtceu.api.item.MetaMachineItem; import com.gregtechceu.gtceu.api.machine.MachineDefinition; +import com.gregtechceu.gtceu.api.machine.MachineInstanceFactory; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; +import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; import com.gregtechceu.gtceu.api.registry.registrate.forge.GTFluidBuilder; import com.gregtechceu.gtceu.core.mixins.registrate.AbstractRegistrateAccessor; @@ -182,31 +183,32 @@ public IGTFluidBuilder createFluid(String name, String langKey, Material materia .setData(ProviderType.LANG, NonNullBiConsumer.noop())); } - public MachineBuilder machine(String name, + public MachineBuilder machine(String name, Function definitionFactory, BiFunction blockFactory, BiFunction itemFactory, - Function blockEntityFactory) { + MachineInstanceFactory blockEntityFactory) { return new MachineBuilder<>(this, name, definitionFactory, blockFactory, itemFactory, blockEntityFactory); } - public MachineBuilder machine(String name, - Function blockEntityFactory) { + public MachineBuilder machine(String name, + MachineInstanceFactory blockEntityFactory) { return new MachineBuilder<>(this, name, MachineDefinition::new, MetaMachineBlock::new, MetaMachineItem::new, blockEntityFactory); } - public MultiblockMachineBuilder multiblock(String name, - BiFunction blockFactory, - BiFunction itemFactory, - Function blockEntityFactory) { + public MultiblockMachineBuilder multiblock(String name, + BiFunction blockFactory, + BiFunction itemFactory, + MachineInstanceFactory blockEntityFactory) { return new MultiblockMachineBuilder<>(this, name, blockFactory, itemFactory, blockEntityFactory); } - public MultiblockMachineBuilder multiblock(String name, - Function blockEntityFactory) { + public MultiblockMachineBuilder multiblock(String name, + MachineInstanceFactory blockEntityFactory) { return new MultiblockMachineBuilder<>(this, name, MetaMachineBlock::new, MetaMachineItem::new, blockEntityFactory); } @@ -244,10 +246,10 @@ public GTBlockBuilder block(P parent, String name, callback -> GTBlockBuilder.create(this, parent, name, callback, factory)); } - private RegistryEntry currentTab; - private static final Map, RegistryEntry> TAB_LOOKUP = new IdentityHashMap<>(); + private @Nullable RegistryEntry currentTab; + private static final Map, @Nullable RegistryEntry> TAB_LOOKUP = new IdentityHashMap<>(); - public RegistryEntry creativeModeTab() { + public @Nullable RegistryEntry creativeModeTab() { return this.currentTab; } diff --git a/src/main/java/com/gregtechceu/gtceu/api/registry/registrate/MachineBuilder.java b/src/main/java/com/gregtechceu/gtceu/api/registry/registrate/MachineBuilder.java index 38c0b42c421..396a4d71e50 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/registry/registrate/MachineBuilder.java +++ b/src/main/java/com/gregtechceu/gtceu/api/registry/registrate/MachineBuilder.java @@ -8,11 +8,12 @@ import com.gregtechceu.gtceu.api.data.RotationState; import com.gregtechceu.gtceu.api.item.MetaMachineItem; import com.gregtechceu.gtceu.api.machine.MachineDefinition; +import com.gregtechceu.gtceu.api.machine.MachineInstanceFactory; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.feature.IRecipeLogicMachine; import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; -import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeLogic; import com.gregtechceu.gtceu.api.mui.factory.PanelFactory; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.GTRecipeType; @@ -77,19 +78,20 @@ import static com.gregtechceu.gtceu.common.data.models.GTMachineModels.*; -@SuppressWarnings("unused") @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault @RemapPrefixForJS("kjs$") @Accessors(chain = true, fluent = true) -public class MachineBuilder> +public class MachineBuilder> extends BuilderBase { protected final GTRegistrate registrate; protected final String name; + protected final BiFunction blockFactory; protected final BiFunction itemFactory; - protected final Function blockEntityFactory; + protected final MachineInstanceFactory instanceFactory; protected final Function definition; @Nullable @@ -102,6 +104,7 @@ public class MachineBuilder, @Nullable Comparable> modelProperties = new IdentityHashMap<>(); private VoxelShape shape = Shapes.block(); private RotationState rotationState = RotationState.NON_Y_AXIS; + /** * Whether this machine can be rotated or face upwards. */ @@ -119,7 +122,7 @@ public class MachineBuilder> recipeOutputLimits = new Reference2IntOpenHashMap<>(); private int paintingColor = ConfigHolder.INSTANCE.client.getDefaultPaintingColor(); private BiFunction itemColor = ((itemStack, tintIndex) -> tintIndex == 2 ? @@ -159,157 +162,157 @@ public MachineBuilder(GTRegistrate registrate, String name, Function definition, BiFunction blockFactory, BiFunction itemFactory, - Function blockEntityFactory) { + MachineInstanceFactory instanceFactory) { super(new ResourceLocation(registrate.getModid(), name)); this.registrate = registrate; this.name = name; this.blockFactory = blockFactory; this.itemFactory = itemFactory; - this.blockEntityFactory = blockEntityFactory; + this.instanceFactory = instanceFactory; this.definition = definition; } @SuppressWarnings("unchecked") - public TYPE getThis() { - return (TYPE) this; + public SELF getThis() { + return (SELF) this; } - public TYPE blockModel(NonNullBiConsumer, GTBlockstateProvider> blockModel) { + public SELF blockModel(NonNullBiConsumer, GTBlockstateProvider> blockModel) { this.blockModel = blockModel; return getThis(); } - public TYPE shape(VoxelShape shape) { + public SELF shape(VoxelShape shape) { this.shape = shape; return getThis(); } - public TYPE rotationState(RotationState rotationState) { + public SELF rotationState(RotationState rotationState) { this.rotationState = rotationState; return getThis(); } - public TYPE allowExtendedFacing(boolean allowExtendedFacing) { + public SELF allowExtendedFacing(boolean allowExtendedFacing) { this.allowExtendedFacing = allowExtendedFacing; return getThis(); } - public TYPE hasBER(boolean hasBER) { + public SELF hasBER(boolean hasBER) { this.hasBER = hasBER; return getThis(); } - public TYPE renderMultiblockWorldPreview(boolean renderMultiblockWorldPreview) { + public SELF renderMultiblockWorldPreview(boolean renderMultiblockWorldPreview) { this.renderMultiblockWorldPreview = renderMultiblockWorldPreview; return getThis(); } - public TYPE renderMultiblockXEIPreview(boolean renderMultiblockXEIPreview) { + public SELF renderMultiblockXEIPreview(boolean renderMultiblockXEIPreview) { this.renderMultiblockXEIPreview = renderMultiblockXEIPreview; return getThis(); } - public TYPE blockProp(NonNullUnaryOperator blockProp) { + public SELF blockProp(NonNullUnaryOperator blockProp) { this.blockProp = blockProp; return getThis(); } - public TYPE itemProp(NonNullUnaryOperator itemProp) { + public SELF itemProp(NonNullUnaryOperator itemProp) { this.itemProp = itemProp; return getThis(); } - public TYPE blockBuilder(Consumer> blockBuilder) { + public SELF blockBuilder(Consumer> blockBuilder) { this.blockBuilder = blockBuilder; return getThis(); } - public TYPE itemBuilder(Consumer> itemBuilder) { + public SELF itemBuilder(Consumer> itemBuilder) { this.itemBuilder = itemBuilder; return getThis(); } - public TYPE onBlockEntityRegister(NonNullConsumer> onBlockEntityRegister) { + public SELF onBlockEntityRegister(NonNullConsumer> onBlockEntityRegister) { this.onBlockEntityRegister = onBlockEntityRegister; return getThis(); } - public TYPE tier(int tier) { + public SELF tier(int tier) { this.tier = tier; return getThis(); } - public TYPE recipeOutputLimits(Reference2IntMap> recipeOutputLimits) { + public SELF recipeOutputLimits(Reference2IntMap> recipeOutputLimits) { this.recipeOutputLimits = recipeOutputLimits; return getThis(); } - public TYPE paintingColor(int paintingColor) { + public SELF paintingColor(int paintingColor) { this.paintingColor = paintingColor; return getThis(); } - public TYPE itemColor(BiFunction itemColor) { + public SELF itemColor(BiFunction itemColor) { this.itemColor = itemColor; return getThis(); } - public TYPE tooltipBuilder(BiConsumer> tooltipBuilder) { + public SELF tooltipBuilder(BiConsumer> tooltipBuilder) { this.tooltipBuilder = tooltipBuilder; return getThis(); } - public TYPE alwaysTryModifyRecipe(boolean alwaysTryModifyRecipe) { + public SELF alwaysTryModifyRecipe(boolean alwaysTryModifyRecipe) { this.alwaysTryModifyRecipe = alwaysTryModifyRecipe; return getThis(); } - public TYPE beforeWorking(BiPredicate beforeWorking) { + public SELF beforeWorking(BiPredicate beforeWorking) { this.beforeWorking = beforeWorking; return getThis(); } - public TYPE onWorking(Predicate onWorking) { + public SELF onWorking(Predicate onWorking) { this.onWorking = onWorking; return getThis(); } - public TYPE onWaiting(Consumer onWaiting) { + public SELF onWaiting(Consumer onWaiting) { this.onWaiting = onWaiting; return getThis(); } - public TYPE afterWorking(Consumer afterWorking) { + public SELF afterWorking(Consumer afterWorking) { this.afterWorking = afterWorking; return getThis(); } - public TYPE regressWhenWaiting(boolean regressWhenWaiting) { + public SELF regressWhenWaiting(boolean regressWhenWaiting) { this.regressWhenWaiting = regressWhenWaiting; return getThis(); } - public TYPE allowCoverOnFront(boolean allowCoverOnFront) { + public SELF allowCoverOnFront(boolean allowCoverOnFront) { this.allowCoverOnFront = allowCoverOnFront; return getThis(); } - public TYPE appearance(Supplier appearance) { + public SELF appearance(Supplier appearance) { this.appearance = appearance; return getThis(); } - public TYPE ui(PanelFactory ui) { + public SELF ui(PanelFactory ui) { this.ui = ui; return getThis(); } - public TYPE langValue(String langValue) { + public SELF langValue(String langValue) { this.langValue = langValue; return getThis(); } - public TYPE recipeType(GTRecipeType type) { + public SELF recipeType(GTRecipeType type) { // noinspection ConstantValue if (type == null) { GTCEu.LOGGER.error( @@ -323,7 +326,7 @@ public TYPE recipeType(GTRecipeType type) { } @Tolerate - public TYPE recipeTypes(GTRecipeType... types) { + public SELF recipeTypes(GTRecipeType... types) { List typeList = new ArrayList<>(); Collections.addAll(typeList, this.recipeTypes); @@ -351,37 +354,37 @@ protected void initRecipeMachineModelProperties(GTRecipeType type) { } } - public TYPE model(MachineBuilder.ModelInitializer model) { + public SELF model(MachineBuilder.ModelInitializer model) { this.model = model; return getThis(); } - public TYPE simpleModel(ResourceLocation modelName) { + public SELF simpleModel(ResourceLocation modelName) { return model(createBasicMachineModel(modelName)); } - public TYPE defaultModel() { + public SELF defaultModel() { return simpleModel(new ResourceLocation(registrate.getModid(), "block/machine/template/" + name)); } - public TYPE tieredHullModel(ResourceLocation model) { + public SELF tieredHullModel(ResourceLocation model) { return model(createTieredHullMachineModel(model)); } - public TYPE overlayTieredHullModel(String name) { + public SELF overlayTieredHullModel(String name) { modelProperty(GTMachineModelProperties.IS_FORMED, false); return overlayTieredHullModel(new ResourceLocation(registrate.getModid(), "block/machine/part/" + name)); } - public TYPE overlayTieredHullModel(ResourceLocation overlayModel) { + public SELF overlayTieredHullModel(ResourceLocation overlayModel) { return model(createOverlayTieredHullMachineModel(overlayModel)); } - public TYPE colorOverlayTieredHullModel(String overlay) { + public SELF colorOverlayTieredHullModel(String overlay) { return colorOverlayTieredHullModel(overlay, null, null); } - public TYPE colorOverlayTieredHullModel(String overlay, + public SELF colorOverlayTieredHullModel(String overlay, @Nullable String pipeOverlay, @Nullable String emissiveOverlay) { modelProperty(GTMachineModelProperties.IS_FORMED, false); @@ -393,33 +396,33 @@ public TYPE colorOverlayTieredHullModel(String overlay, return colorOverlayTieredHullModel(overlayTex, pipeOverlayTex, emissiveOverlayTex); } - public TYPE colorOverlayTieredHullModel(ResourceLocation overlay) { + public SELF colorOverlayTieredHullModel(ResourceLocation overlay) { modelProperty(GTMachineModelProperties.IS_FORMED, false); return colorOverlayTieredHullModel(overlay, null, null); } - public TYPE colorOverlayTieredHullModel(ResourceLocation overlay, + public SELF colorOverlayTieredHullModel(ResourceLocation overlay, @Nullable ResourceLocation pipeOverlay, @Nullable ResourceLocation emissiveOverlay) { modelProperty(GTMachineModelProperties.IS_PAINTED, false); return model(createColorOverlayTieredHullMachineModel(overlay, pipeOverlay, emissiveOverlay)); } - public TYPE overlaySteamHullModel(String name) { + public SELF overlaySteamHullModel(String name) { modelProperty(GTMachineModelProperties.IS_FORMED, false); return overlaySteamHullModel(new ResourceLocation(registrate.getModid(), "block/machine/part/" + name)); } - public TYPE overlaySteamHullModel(ResourceLocation overlayModel) { + public SELF overlaySteamHullModel(ResourceLocation overlayModel) { modelProperty(GTMachineModelProperties.IS_STEEL_MACHINE, ConfigHolder.INSTANCE.machines.steelSteamMultiblocks); return model(createOverlaySteamHullMachineModel(overlayModel)); } - public TYPE colorOverlaySteamHullModel(String overlay) { + public SELF colorOverlaySteamHullModel(String overlay) { return colorOverlaySteamHullModel(overlay, (String) null, null); } - public TYPE colorOverlaySteamHullModel(String overlay, + public SELF colorOverlaySteamHullModel(String overlay, @Nullable String pipeOverlay, @Nullable String emissiveOverlay) { modelProperty(GTMachineModelProperties.IS_FORMED, false); @@ -431,7 +434,7 @@ public TYPE colorOverlaySteamHullModel(String overlay, return colorOverlaySteamHullModel(overlayTex, pipeOverlayTex, emissiveOverlayTex); } - public TYPE colorOverlaySteamHullModel(String overlay, + public SELF colorOverlaySteamHullModel(String overlay, @Nullable ResourceLocation pipeOverlay, @Nullable String emissiveOverlay) { modelProperty(GTMachineModelProperties.IS_FORMED, false); @@ -443,92 +446,92 @@ public TYPE colorOverlaySteamHullModel(String overlay, return colorOverlaySteamHullModel(overlayTex, pipeOverlayTex, emissiveOverlayTex); } - public TYPE colorOverlaySteamHullModel(ResourceLocation overlay) { + public SELF colorOverlaySteamHullModel(ResourceLocation overlay) { return colorOverlaySteamHullModel(overlay, null, null); } - public TYPE colorOverlaySteamHullModel(ResourceLocation overlay, + public SELF colorOverlaySteamHullModel(ResourceLocation overlay, @Nullable ResourceLocation pipeOverlay, @Nullable ResourceLocation emissiveOverlay) { modelProperty(GTMachineModelProperties.IS_PAINTED, false); return model(createColorOverlaySteamHullMachineModel(overlay, pipeOverlay, emissiveOverlay)); } - public TYPE workableTieredHullModel(ResourceLocation workableModel) { + public SELF workableTieredHullModel(ResourceLocation workableModel) { modelProperty(GTMachineModelProperties.RECIPE_LOGIC_STATUS, RecipeLogic.Status.IDLE); return model(createWorkableTieredHullMachineModel(workableModel)); } - public TYPE simpleGeneratorModel(ResourceLocation workableModel) { + public SELF simpleGeneratorModel(ResourceLocation workableModel) { modelProperty(GTMachineModelProperties.RECIPE_LOGIC_STATUS, RecipeLogic.Status.IDLE); return model(createSimpleGeneratorModel(workableModel)); } - public TYPE workableSteamHullModel(boolean isHighPressure, ResourceLocation workableModel) { + public SELF workableSteamHullModel(boolean isHighPressure, ResourceLocation workableModel) { modelProperty(GTMachineModelProperties.RECIPE_LOGIC_STATUS, RecipeLogic.Status.IDLE); return model(createWorkableSteamHullMachineModel(isHighPressure, workableModel)); } - public TYPE workableCasingModel(ResourceLocation baseCasing, ResourceLocation workableModel) { + public SELF workableCasingModel(ResourceLocation baseCasing, ResourceLocation workableModel) { modelProperty(GTMachineModelProperties.RECIPE_LOGIC_STATUS, RecipeLogic.Status.IDLE); return model(createWorkableCasingMachineModel(baseCasing, workableModel)); } - public TYPE sidedOverlayCasingModel(ResourceLocation baseCasing, + public SELF sidedOverlayCasingModel(ResourceLocation baseCasing, ResourceLocation workableModel) { return model(createSidedOverlayCasingMachineModel(baseCasing, workableModel)); } - public TYPE sidedWorkableCasingModel(ResourceLocation baseCasing, + public SELF sidedWorkableCasingModel(ResourceLocation baseCasing, ResourceLocation workableModel) { modelProperty(GTMachineModelProperties.RECIPE_LOGIC_STATUS, RecipeLogic.Status.IDLE); return model(createSidedWorkableCasingMachineModel(baseCasing, workableModel)); } - public TYPE appearanceBlock(Supplier block) { + public SELF appearanceBlock(Supplier block) { appearance = () -> block.get().defaultBlockState(); return getThis(); } - public TYPE tooltips(@Nullable Component... components) { + public SELF tooltips(@Nullable Component... components) { return tooltips(Arrays.asList(components)); } - public TYPE tooltips(List components) { + public SELF tooltips(List components) { tooltips.addAll(components.stream().filter(Objects::nonNull).toList()); return getThis(); } - public TYPE conditionalTooltip(Component component, BooleanSupplier condition) { + public SELF conditionalTooltip(Component component, BooleanSupplier condition) { return conditionalTooltip(component, condition.getAsBoolean()); } - public TYPE conditionalTooltip(Component component, boolean condition) { + public SELF conditionalTooltip(Component component, boolean condition) { if (condition) tooltips.add(component); return getThis(); } - public TYPE abilities(PartAbility... abilities) { + public SELF abilities(PartAbility... abilities) { this.abilities = abilities; return getThis(); } - public TYPE themeId(String themeId) { + public SELF themeId(String themeId) { this.themeId = themeId; return getThis(); } - public TYPE themeId(Function themeId) { + public SELF themeId(Function themeId) { this.themeId = themeId.apply(tier); return getThis(); } - public TYPE modelProperty(Property property) { + public SELF modelProperty(Property property) { return modelProperty(property, null); } - public > TYPE modelProperty(Property property, + public > SELF modelProperty(Property property, @Nullable T defaultValue) { this.modelProperties.put(property, defaultValue); return getThis(); @@ -537,26 +540,26 @@ public > TYPE modelProperty(Property property, // KJS helpers for model property defaults // These don't need to be copied to the multiblock builder because KJS doesn't care about the return type downgrade - public TYPE kjs$modelPropertyBool(Property property, boolean defaultValue) { + public SELF kjs$modelPropertyBool(Property property, boolean defaultValue) { return modelProperty(property, defaultValue); } - public TYPE kjs$modelPropertyInt(Property property, int defaultValue) { + public SELF kjs$modelPropertyInt(Property property, int defaultValue) { return modelProperty(property, defaultValue); } - public & Comparable> TYPE kjs$modelPropertyEnum(Property property, + public & Comparable> SELF kjs$modelPropertyEnum(Property property, T defaultValue) { return modelProperty(property, defaultValue); } @Tolerate - public TYPE modelProperties(Property... properties) { + public SELF modelProperties(Property... properties) { return this.modelProperties(List.of(properties)); } @Tolerate - public TYPE modelProperties(Collection> properties) { + public SELF modelProperties(Collection> properties) { for (Property prop : properties) { this.modelProperties.put(prop, null); } @@ -564,54 +567,54 @@ public TYPE modelProperties(Collection> properties) { } @Tolerate - public TYPE modelProperties(Map, ? extends Comparable> properties) { + public SELF modelProperties(Map, ? extends Comparable> properties) { this.modelProperties.putAll(properties); return getThis(); } - public TYPE removeModelProperty(Property property) { + public SELF removeModelProperty(Property property) { this.modelProperties.remove(property); return getThis(); } - public TYPE clearModelProperties() { + public SELF clearModelProperties() { this.modelProperties.clear(); return getThis(); } - public TYPE recipeModifier(RecipeModifier recipeModifier) { + public SELF recipeModifier(RecipeModifier recipeModifier) { this.recipeModifier = recipeModifier instanceof RecipeModifierList list ? list : new RecipeModifierList(recipeModifier); return getThis(); } - public TYPE recipeModifier(RecipeModifier recipeModifier, boolean alwaysTryModifyRecipe) { + public SELF recipeModifier(RecipeModifier recipeModifier, boolean alwaysTryModifyRecipe) { this.alwaysTryModifyRecipe = alwaysTryModifyRecipe; return this.recipeModifier(recipeModifier); } - public TYPE recipeModifiers(RecipeModifier... recipeModifiers) { + public SELF recipeModifiers(RecipeModifier... recipeModifiers) { this.recipeModifier = new RecipeModifierList(recipeModifiers); return getThis(); } - public TYPE recipeModifiers(boolean alwaysTryModifyRecipe, + public SELF recipeModifiers(boolean alwaysTryModifyRecipe, RecipeModifier... recipeModifiers) { return this.recipeModifier(new RecipeModifierList(recipeModifiers), alwaysTryModifyRecipe); } - public TYPE noRecipeModifier() { + public SELF noRecipeModifier() { this.recipeModifier = new RecipeModifierList(RecipeModifier.NO_MODIFIER); this.alwaysTryModifyRecipe = false; return getThis(); } - public TYPE addOutputLimit(RecipeCapability capability, int limit) { + public SELF addOutputLimit(RecipeCapability capability, int limit) { this.recipeOutputLimits.put(capability, limit); return getThis(); } - public TYPE multiblockPreviewRenderer(boolean multiBlockWorldPreview, + public SELF multiblockPreviewRenderer(boolean multiBlockWorldPreview, boolean multiBlockXEIPreview) { this.renderMultiblockWorldPreview = multiBlockWorldPreview; this.renderMultiblockXEIPreview = multiBlockXEIPreview; @@ -680,7 +683,8 @@ public DEFINITION register() { var blockEntityBuilder = registrate .blockEntity( - (type, pos, state) -> blockEntityFactory.apply(new BlockEntityCreationInfo(type, pos, state))) + (type, pos, state) -> instanceFactory + .buildMachine(new BlockEntityCreationInfo(type, pos, state))) .onRegister(onBlockEntityRegister) .validBlock(block); if (hasBER) { @@ -733,7 +737,8 @@ public DEFINITION register() { @FunctionalInterface public interface ModelInitializer { - void configureModel(DataGenContext context, GTBlockstateProvider provider, + void configureModel(DataGenContext context, + GTBlockstateProvider provider, MachineModelBuilder builder); default ModelInitializer andThen(ModelInitializer after) { @@ -769,7 +774,7 @@ default ModelInitializer compose(UnaryOperator BlockBuilder> makeBlockBuilder(MachineBuilder builder, + public static BlockBuilder> makeBlockBuilder(MachineBuilder builder, DEFINITION definition) { return builder.registrate.block(properties -> makeBlock(builder, definition, properties)) .color(() -> () -> MetaMachineBlock::colorTinted) @@ -781,7 +786,7 @@ protected static class BlockBuilderWrapper { .onRegister(b -> Arrays.stream(builder.abilities).forEach(a -> a.register(builder.tier, b))); } - private static Block makeBlock(MachineBuilder builder, DEFINITION definition, + private static Block makeBlock(MachineBuilder builder, DEFINITION definition, BlockBehaviour.Properties properties) { MachineDefinition.setBuilt(definition); var b = builder.blockFactory.apply(properties, definition); @@ -792,7 +797,7 @@ private static Block makeBlock(MachineBui protected static class ItemBuilderWrapper { - public static ItemBuilder> makeItemBuilder(MachineBuilder builder, + public static ItemBuilder> makeItemBuilder(MachineBuilder builder, BlockEntry block) { return builder.registrate .item(properties -> builder.itemFactory.apply((MetaMachineBlock) block.get(), properties)) @@ -809,7 +814,7 @@ protected static class ItemBuilderWrapper { protected static final class KJSCallWrapper { public static void generateAssetJsons(@Nullable AssetJsonGenerator generator, - MachineBuilder builder, + MachineBuilder builder, D definition) { if (builder.model() == null && builder.blockModel() == null) return; diff --git a/src/main/java/com/gregtechceu/gtceu/api/registry/registrate/MultiblockMachineBuilder.java b/src/main/java/com/gregtechceu/gtceu/api/registry/registrate/MultiblockMachineBuilder.java index 7f7c3f287f1..ea50dc8100b 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/registry/registrate/MultiblockMachineBuilder.java +++ b/src/main/java/com/gregtechceu/gtceu/api/registry/registrate/MultiblockMachineBuilder.java @@ -1,12 +1,11 @@ package com.gregtechceu.gtceu.api.registry.registrate; import com.gregtechceu.gtceu.api.block.MetaMachineBlock; -import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.item.MetaMachineItem; -import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.api.machine.MachineInstanceFactory; import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; -import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; +import com.gregtechceu.gtceu.api.machine.multiblock.part.MultiblockPartMachine; import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; import com.gregtechceu.gtceu.api.multiblock.pattern.IBlockPattern; import com.gregtechceu.gtceu.utils.memoization.GTMemoizer; @@ -36,21 +35,24 @@ @MethodsReturnNonnullByDefault @Accessors(chain = true, fluent = true) public class MultiblockMachineBuilder> extends MachineBuilder { + MACHINE extends MultiblockControllerMachine, + SELF extends MultiblockMachineBuilder> + extends MachineBuilder { private boolean generator; private Map> patterns; private boolean allowFlip = true; private final List> recoveryItems = new ArrayList<>(); - private Function> partSorter = (c) -> (a, b) -> 0; - private TriFunction partAppearance; + private Function> partSorter = (c) -> (a, b) -> 0; + private TriFunction partAppearance; + @Getter private BiConsumer> additionalDisplay = (m, l) -> {}; public MultiblockMachineBuilder(GTRegistrate registrate, String name, BiFunction blockFactory, BiFunction itemFactory, - Function blockEntityFactory) { + MachineInstanceFactory blockEntityFactory) { super(registrate, name, (loc -> (DEFINITION) new MultiblockMachineDefinition(loc)), blockFactory, itemFactory, blockEntityFactory); @@ -61,54 +63,54 @@ public MultiblockMachineBuilder(GTRegistrate registrate, String name, modelProperty(GTMachineModelProperties.IS_FORMED, false); } - public TYPE generator(boolean generator) { + public SELF generator(boolean generator) { this.generator = generator; return getThis(); } - public TYPE pattern(Function pattern) { + public SELF pattern(Function pattern) { this.patterns.put(MultiblockControllerMachine.DEFAULT_STRUCTURE, pattern); return getThis(); } - public TYPE pattern(String structureName, Function pattern) { + public SELF pattern(String structureName, Function pattern) { this.patterns.put(structureName, pattern); return getThis(); } - public TYPE allowFlip(boolean allowFlip) { + public SELF allowFlip(boolean allowFlip) { this.allowFlip = allowFlip; return getThis(); } - public TYPE partSorter(Function> partSorter) { + public SELF partSorter(Function> partSorter) { this.partSorter = partSorter; return getThis(); } - public TYPE partAppearance(TriFunction partAppearance) { + public SELF partAppearance(TriFunction partAppearance) { this.partAppearance = partAppearance; return getThis(); } - public TYPE additionalDisplay(BiConsumer> additionalDisplay) { + public SELF additionalDisplay(BiConsumer> additionalDisplay) { this.additionalDisplay = additionalDisplay; return getThis(); } - public TYPE recoveryItems(Supplier items) { + public SELF recoveryItems(Supplier items) { this.recoveryItems.add(() -> Arrays.stream(items.get()).map(ItemLike::asItem).map(Item::getDefaultInstance) .toArray(ItemStack[]::new)); return getThis(); } - public TYPE recoveryStacks(Supplier stacks) { + public SELF recoveryStacks(Supplier stacks) { this.recoveryItems.add(stacks); return getThis(); } @Tolerate - public TYPE partSorter(Comparator sorter) { + public SELF partSorter(Comparator sorter) { this.partSorter = $ -> sorter; return getThis(); } diff --git a/src/main/java/com/gregtechceu/gtceu/api/registry/registrate/package-info.java b/src/main/java/com/gregtechceu/gtceu/api/registry/registrate/package-info.java index fc849e250f0..0b906876819 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/registry/registrate/package-info.java +++ b/src/main/java/com/gregtechceu/gtceu/api/registry/registrate/package-info.java @@ -1,7 +1,4 @@ -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault +@NotNullByDefault package com.gregtechceu.gtceu.api.registry.registrate; -import net.minecraft.MethodsReturnNonnullByDefault; - -import javax.annotation.ParametersAreNonnullByDefault; +import org.jetbrains.annotations.NotNullByDefault; diff --git a/src/main/java/com/gregtechceu/gtceu/api/transfer/item/CustomItemStackHandler.java b/src/main/java/com/gregtechceu/gtceu/api/transfer/item/CustomItemStackHandler.java index a9f86bdc9b6..706de1cc2a6 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/transfer/item/CustomItemStackHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/api/transfer/item/CustomItemStackHandler.java @@ -68,4 +68,10 @@ public void dropInventoryInWorld(Level world, BlockPos pos) { } clear(); } + + @Override + public void deserializeNBT(CompoundTag nbt) { + if (nbt.getInt("Size") != stacks.size()) nbt.putInt("Size", stacks.size()); + super.deserializeNBT(nbt); + } } diff --git a/src/main/java/com/gregtechceu/gtceu/api/transfer/item/NotifiableAccountedInvWrapper.java b/src/main/java/com/gregtechceu/gtceu/api/transfer/item/NotifiableAccountedInvWrapper.java index 07ff454a3df..9dca858dd3b 100644 --- a/src/main/java/com/gregtechceu/gtceu/api/transfer/item/NotifiableAccountedInvWrapper.java +++ b/src/main/java/com/gregtechceu/gtceu/api/transfer/item/NotifiableAccountedInvWrapper.java @@ -1,6 +1,6 @@ package com.gregtechceu.gtceu.api.transfer.item; -import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableItemStackHandler; import net.minecraft.world.item.ItemStack; import net.minecraftforge.items.IItemHandlerModifiable; diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/machine/IControllerModelRenderer.java b/src/main/java/com/gregtechceu/gtceu/client/model/machine/IControllerModelRenderer.java index d6676b464d7..48c9431d248 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/machine/IControllerModelRenderer.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/machine/IControllerModelRenderer.java @@ -1,7 +1,7 @@ package com.gregtechceu.gtceu.client.model.machine; -import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; +import com.gregtechceu.gtceu.api.machine.multiblock.part.MultiblockPartMachine; import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.block.model.BakedQuad; @@ -22,7 +22,7 @@ public interface IControllerModelRenderer { * Render a specific model for given part. */ @OnlyIn(Dist.CLIENT) - void renderPartModel(List quads, MultiblockControllerMachine machine, IMultiPart part, + void renderPartModel(List quads, MultiblockControllerMachine machine, MultiblockPartMachine part, Direction frontFacing, @Nullable Direction side, RandomSource rand, @NotNull ModelData modelData, @Nullable RenderType renderType); } diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/machine/MachineModel.java b/src/main/java/com/gregtechceu/gtceu/client/model/machine/MachineModel.java index d3b2e6fcfba..41d4687dc66 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/machine/MachineModel.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/machine/MachineModel.java @@ -4,8 +4,8 @@ import com.gregtechceu.gtceu.api.cover.CoverBehavior; import com.gregtechceu.gtceu.api.machine.MachineDefinition; import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; +import com.gregtechceu.gtceu.api.machine.multiblock.part.MultiblockPartMachine; import com.gregtechceu.gtceu.client.model.BaseBakedModel; import com.gregtechceu.gtceu.client.model.GTModelProperties; import com.gregtechceu.gtceu.client.model.IBlockEntityRendererBakedModel; @@ -313,7 +313,7 @@ public List renderMachine(@Nullable MetaMachine machine, @Nullable Bl quads.addAll(render.getRenderQuads(machine, level, pos, blockState, side, rand, modelData, renderType)); } // the instanceof check also ensures it's not null - if (machine instanceof IMultiPart part && part.replacePartModelWhenFormed()) { + if (machine instanceof MultiblockPartMachine part && part.replacePartModelWhenFormed()) { quads = replacePartBaseModel(quads, part, machine.getFrontFacing(), side, rand, modelData, renderType); } @@ -337,7 +337,8 @@ public void renderBaseModel(List quads, MachineRenderState renderStat } } - public List replacePartBaseModel(List originalQuads, IMultiPart part, Direction frontFacing, + public List replacePartBaseModel(List originalQuads, MultiblockPartMachine part, + Direction frontFacing, @Nullable Direction side, RandomSource rand, ModelData modelData, @Nullable RenderType renderType) { var controllers = part.getControllers(); @@ -374,7 +375,8 @@ public List remapReplaceableTextures(String key) { } private List renderPartOverrides(MachineModel controllerModel, MultiblockControllerMachine controller, - List quads, IMultiPart part, Direction frontFacing, + List quads, MultiblockPartMachine part, + Direction frontFacing, @Nullable Direction side, RandomSource rand, ModelData modelData, @Nullable RenderType renderType) { var overrides = controllerModel.textureOverrides; diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/machine/overlays/HPCAOverlay.java b/src/main/java/com/gregtechceu/gtceu/client/model/machine/overlays/HPCAOverlay.java index ed8de15bb92..929ca558a3c 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/machine/overlays/HPCAOverlay.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/machine/overlays/HPCAOverlay.java @@ -1,6 +1,6 @@ package com.gregtechceu.gtceu.client.model.machine.overlays; -import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic.Status; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeLogic.Status; import com.gregtechceu.gtceu.api.registry.registrate.provider.GTBlockstateProvider; import com.gregtechceu.gtceu.common.data.models.GTModels; import com.gregtechceu.gtceu.utils.data.RuntimeExistingFileHelper; diff --git a/src/main/java/com/gregtechceu/gtceu/client/model/machine/overlays/WorkableOverlays.java b/src/main/java/com/gregtechceu/gtceu/client/model/machine/overlays/WorkableOverlays.java index 373ab7b33c6..2c57b753d9c 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/model/machine/overlays/WorkableOverlays.java +++ b/src/main/java/com/gregtechceu/gtceu/client/model/machine/overlays/WorkableOverlays.java @@ -1,6 +1,6 @@ package com.gregtechceu.gtceu.client.model.machine.overlays; -import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic.Status; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeLogic.Status; import com.gregtechceu.gtceu.api.registry.registrate.provider.GTBlockstateProvider; import com.gregtechceu.gtceu.common.data.models.GTMachineModels; import com.gregtechceu.gtceu.common.data.models.GTModels; diff --git a/src/main/java/com/gregtechceu/gtceu/client/mui/schema/MutableSchema.java b/src/main/java/com/gregtechceu/gtceu/client/mui/schema/MutableSchema.java index 370fc1ea215..f61f16a82ef 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/mui/schema/MutableSchema.java +++ b/src/main/java/com/gregtechceu/gtceu/client/mui/schema/MutableSchema.java @@ -1,7 +1,7 @@ package com.gregtechceu.gtceu.client.mui.schema; -import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; +import com.gregtechceu.gtceu.api.machine.multiblock.part.MultiblockPartMachine; import com.gregtechceu.gtceu.api.multiblock.pattern.PatternState; import net.minecraft.core.BlockPos; @@ -56,7 +56,7 @@ public MutableSchema setBlocks(Long2ReferenceMap blocks) { BlockPos.MutableBlockPos min = BlockPosUtil.MAX.mutable(); BlockPos.MutableBlockPos max = BlockPosUtil.MIN.mutable(); MultiblockControllerMachine controller = null; - List parts = new ArrayList<>(); + List parts = new ArrayList<>(); for (long packed : blocks.keySet()) { BlockState block = blocks.get(packed); @@ -72,7 +72,7 @@ public MutableSchema setBlocks(Long2ReferenceMap blocks) { if (blockEntity instanceof MultiblockControllerMachine mcm && controller == null) { controller = mcm; controllerPos = pos; - } else if (blockEntity instanceof IMultiPart part) { + } else if (blockEntity instanceof MultiblockPartMachine part) { parts.add(part); } } diff --git a/src/main/java/com/gregtechceu/gtceu/client/renderer/BlockHighlightRenderer.java b/src/main/java/com/gregtechceu/gtceu/client/renderer/BlockHighlightRenderer.java index a0d16707aaa..7938f62dc6e 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/BlockHighlightRenderer.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/BlockHighlightRenderer.java @@ -78,7 +78,7 @@ public static void renderBlockHighlight(PoseStack poseStack, Camera camera, Bloc public @Nullable UITexture sideTips(@NotNull Player player, @NotNull BlockPos pos, @NotNull BlockState state, @NotNull Set toolTypes, - @NotNull Direction side) { + ItemStack held, @NotNull Direction side) { return behavior.showSideTip(state, side) ? GTGuiTextures.TOOL_FRONT_FACING_ROTATION : null; } @@ -93,10 +93,10 @@ public static void renderBlockHighlight(PoseStack poseStack, Camera camera, Bloc if (gridHighlight.shouldRenderGrid(player, blockPos, state, held, toolType)) { final IToolGridHighlight finalGridHighlight = gridHighlight; drawGridOverlays(poseStack, multiBufferSource, cameraPos, target, - side -> finalGridHighlight.sideTips(player, blockPos, state, toolType, side)); + side -> finalGridHighlight.sideTips(player, blockPos, state, toolType, held, side)); } else { Direction facing = target.getDirection(); - var texture = gridHighlight.sideTips(player, blockPos, state, toolType, facing); + var texture = gridHighlight.sideTips(player, blockPos, state, toolType, held, facing); if (texture != null) { RenderSystem.disableDepthTest(); RenderSystem.enableBlend(); diff --git a/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/BoilerMultiPartRender.java b/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/BoilerMultiPartRender.java index 2e9bf19a20c..f83168db13b 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/BoilerMultiPartRender.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/BoilerMultiPartRender.java @@ -1,9 +1,9 @@ package com.gregtechceu.gtceu.client.renderer.machine.impl; import com.gregtechceu.gtceu.api.block.property.GTBlockStateProperties; -import com.gregtechceu.gtceu.api.machine.feature.IRecipeLogicMachine; -import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; +import com.gregtechceu.gtceu.api.machine.multiblock.part.MultiblockPartMachine; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeLogic; import com.gregtechceu.gtceu.api.multiblock.util.RelativeDirection; import com.gregtechceu.gtceu.client.model.machine.IControllerModelRenderer; import com.gregtechceu.gtceu.client.renderer.machine.DynamicRender; @@ -92,7 +92,8 @@ public boolean isBlockEntityRenderer() { @SuppressWarnings("DataFlowIssue") @Override @OnlyIn(Dist.CLIENT) - public void renderPartModel(List quads, MultiblockControllerMachine controller, IMultiPart part, + public void renderPartModel(List quads, MultiblockControllerMachine controller, + MultiblockPartMachine part, Direction frontFacing, @Nullable Direction side, RandomSource rand, @NotNull ModelData modelData, @Nullable RenderType renderType) { if (this.fireboxIdleModel == null) { @@ -117,7 +118,10 @@ public void renderPartModel(List quads, MultiblockControllerMachine c int partY = partPos.get(relativeDown.getAxis()); if (belowControllerY == partY) { // firebox - if (controller instanceof IRecipeLogicMachine rlm && rlm.getRecipeLogic().isWorking()) { + + var recipeLogic = controller.getTrait(RecipeLogic.TYPE); + + if (recipeLogic != null && recipeLogic.isWorking()) { emitQuads(quads, fireboxActiveModel, controller.getLevel(), partPos, fireboxActive, side, rand, modelData, renderType); } else { diff --git a/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/GrowingPlantRender.java b/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/GrowingPlantRender.java index ef13449fab6..b0b7b642d16 100644 --- a/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/GrowingPlantRender.java +++ b/src/main/java/com/gregtechceu/gtceu/client/renderer/machine/impl/GrowingPlantRender.java @@ -3,7 +3,7 @@ import com.gregtechceu.gtceu.api.capability.recipe.ItemRecipeCapability; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.feature.IRecipeLogicMachine; -import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeLogic; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.content.Content; import com.gregtechceu.gtceu.client.renderer.machine.DynamicRender; diff --git a/src/main/java/com/gregtechceu/gtceu/common/blockentity/CableBlockEntity.java b/src/main/java/com/gregtechceu/gtceu/common/blockentity/CableBlockEntity.java index 9fa3b840200..9af36a6bc77 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/blockentity/CableBlockEntity.java +++ b/src/main/java/com/gregtechceu/gtceu/common/blockentity/CableBlockEntity.java @@ -318,7 +318,7 @@ private void uninsulate() { public void setTemperature(int temperature) { this.temperature = temperature; syncDataHolder.markClientSyncFieldDirty("temperature"); - level.getLightEngine().checkBlock(worldPosition); + getLevel().getLightEngine().checkBlock(worldPosition); } @ClientFieldChangeListener(fieldName = "temperature") @@ -339,7 +339,7 @@ public void onTemperatureUpdated() { float yPos = Direction.UP.getStepY() * 0.76f + getBlockPos().getY() + 0.25f; float zPos = Direction.UP.getStepZ() * 0.76f + getBlockPos().getZ() + 0.25f; - float horizontalDirection = level.random.nextFloat() * 2 * Mth.PI; + float horizontalDirection = getLevel().random.nextFloat() * 2 * Mth.PI; float xSpd = Mth.sin(horizontalDirection) * 0.1f; float ySpd = Direction.UP.getStepY() * 0.1f + 0.2f + 0.1f * level.random.nextFloat(); float zSpd = Mth.cos(horizontalDirection) * 0.1f; diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/detector/MaintenanceDetectorCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/detector/MaintenanceDetectorCover.java index 01335f2ac3f..0a029830b29 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/detector/MaintenanceDetectorCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/detector/MaintenanceDetectorCover.java @@ -1,9 +1,8 @@ package com.gregtechceu.gtceu.common.cover.detector; -import com.gregtechceu.gtceu.api.capability.GTCapabilityHelper; import com.gregtechceu.gtceu.api.capability.ICoverable; import com.gregtechceu.gtceu.api.cover.CoverDefinition; -import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMaintenanceMachine; +import com.gregtechceu.gtceu.common.machine.multiblock.part.MaintenanceHatchPartMachine; import com.gregtechceu.gtceu.config.ConfigHolder; import net.minecraft.core.Direction; @@ -20,10 +19,7 @@ public boolean canAttach() { return false; } - return super.canAttach() && - GTCapabilityHelper.getMaintenanceMachine(coverHolder.getLevel(), coverHolder.getBlockPos(), - attachedSide) != - null; + return super.canAttach() && coverHolder instanceof MaintenanceHatchPartMachine; } @Override @@ -32,8 +28,7 @@ protected void update() { return; } - IMaintenanceMachine maintenance = GTCapabilityHelper.getMaintenanceMachine(coverHolder.getLevel(), - coverHolder.getBlockPos(), attachedSide); + MaintenanceHatchPartMachine maintenance = (MaintenanceHatchPartMachine) coverHolder; int signal = getRedstoneSignalOutput(); boolean shouldSignal = isInverted() != maintenance.hasMaintenanceProblems(); diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/ender/AbstractEnderLinkCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/ender/AbstractEnderLinkCover.java index f477122a704..da3429fa81c 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/ender/AbstractEnderLinkCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/ender/AbstractEnderLinkCover.java @@ -344,7 +344,7 @@ protected ModularPanel createChannelManagerPanel(GuiData data, PanelSyncManag .disablePanelsBelow(false) .draggable(true) .closeOnOutOfBoundsClick(true) - .child(GTMuiWidgets.createTitleBar(() -> getAttachItem(), 176, GTGuiTextures.BACKGROUND)); + .child(GTMuiWidgets.createTitleBar(this::getAttachItem, 176, GTGuiTextures.BACKGROUND)); var entries = new GenericListSyncHandler.Builder() .getter(this::getVirtualEntries) diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/voiding/FluidVoidingCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/voiding/FluidVoidingCover.java index 19dd9756999..902a8a90d53 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/voiding/FluidVoidingCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/voiding/FluidVoidingCover.java @@ -16,6 +16,7 @@ import net.minecraft.network.chat.Component; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.state.BlockState; import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.capability.IFluidHandler; @@ -104,10 +105,10 @@ public InteractionResult onSoftMalletClick(ExtendedUseOnContext context) { @Override public @Nullable UITexture sideTips(Player player, BlockPos pos, BlockState state, Set toolTypes, - Direction side) { + ItemStack held, Direction side) { if (toolTypes.contains(GTToolType.SOFT_MALLET)) { return isWorkingEnabled() ? GTGuiTextures.TOOL_START : GTGuiTextures.TOOL_PAUSE; } - return super.sideTips(player, pos, state, toolTypes, side); + return super.sideTips(player, pos, state, toolTypes, held, side); } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/cover/voiding/ItemVoidingCover.java b/src/main/java/com/gregtechceu/gtceu/common/cover/voiding/ItemVoidingCover.java index ec4ff903959..2045a1bd742 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/cover/voiding/ItemVoidingCover.java +++ b/src/main/java/com/gregtechceu/gtceu/common/cover/voiding/ItemVoidingCover.java @@ -104,8 +104,8 @@ public InteractionResult onSoftMalletClick(ExtendedUseOnContext context) { @Override public @Nullable UITexture sideTips(Player player, BlockPos pos, BlockState state, Set toolTypes, - Direction side) { - var superTips = super.sideTips(player, pos, state, toolTypes, side); + ItemStack held, Direction side) { + var superTips = super.sideTips(player, pos, state, toolTypes, held, side); if (superTips != null) return superTips; if (toolTypes.contains(GTToolType.SOFT_MALLET)) { return isWorkingEnabled() ? GTGuiTextures.TOOL_START : GTGuiTextures.TOOL_PAUSE; diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/GTMachines.java b/src/main/java/com/gregtechceu/gtceu/common/data/GTMachines.java index 55b6c5be64d..0ab7644be9e 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTMachines.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTMachines.java @@ -21,6 +21,7 @@ import com.gregtechceu.gtceu.client.util.TooltipHelper; import com.gregtechceu.gtceu.common.data.machines.*; import com.gregtechceu.gtceu.common.data.models.GTModels; +import com.gregtechceu.gtceu.common.machine.GTMachineInstanceFactories; import com.gregtechceu.gtceu.common.machine.electric.*; import com.gregtechceu.gtceu.common.machine.mui.TestMuiMachine; import com.gregtechceu.gtceu.common.machine.multiblock.part.*; @@ -185,7 +186,7 @@ public class GTMachines { GTRecipeTypes.ALLOY_SMELTER_RECIPES).register(); public static final MachineDefinition[] ARC_FURNACE = registerTieredMachines("arc_furnace", - (holder, tier) -> new SimpleTieredMachine(holder, tier, defaultTankSizeFunction), (tier, builder) -> builder + SimpleTieredMachine::new, (tier, builder) -> builder .langValue("%s Arc Furnace %s".formatted(VLVH[tier], VLVT[tier])) .rotationState(RotationState.NON_Y_AXIS) .recipeType(GTRecipeTypes.ARC_FURNACE_RECIPES) @@ -296,7 +297,7 @@ public class GTMachines { .hasPollutionDebuff(true) .register(); public static final MachineDefinition[] MACERATOR = registerTieredMachines("macerator", - (holder, tier) -> new SimpleTieredMachine(holder, tier, defaultTankSizeFunction), (tier, builder) -> builder + SimpleTieredMachine::new, (tier, builder) -> builder .langValue("%s Macerator %s".formatted(VLVH[tier], VLVT[tier])) .rotationState(RotationState.NON_Y_AXIS) .recipeType(GTRecipeTypes.MACERATOR_RECIPES) @@ -319,7 +320,7 @@ public class GTMachines { .register(); public static final MachineDefinition[] ROCK_CRUSHER = registerTieredMachines("rock_crusher", - RockCrusherMachine::new, (tier, builder) -> builder + GTMachineInstanceFactories.ROCK_CRUSHER, (tier, builder) -> builder .langValue("%s Rock Crusher %s".formatted(VLVH[tier], VLVT[tier])) .ui(GTSingleblockMachinePanels.GENERAL_MACHINE) .rotationState(RotationState.NON_Y_AXIS) diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/GTPlaceholders.java b/src/main/java/com/gregtechceu/gtceu/common/data/GTPlaceholders.java index 57527842a4f..1e54f048f1a 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/GTPlaceholders.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/GTPlaceholders.java @@ -11,7 +11,6 @@ import com.gregtechceu.gtceu.api.item.component.IItemComponent; import com.gregtechceu.gtceu.api.item.component.IMonitorModuleItem; import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMaintenanceMachine; import com.gregtechceu.gtceu.api.misc.virtualregistry.EntryTypes; import com.gregtechceu.gtceu.api.misc.virtualregistry.VirtualEnderRegistry; import com.gregtechceu.gtceu.api.placeholder.*; @@ -22,6 +21,7 @@ import com.gregtechceu.gtceu.client.renderer.placeholder.RectPlaceholderRenderer; import com.gregtechceu.gtceu.common.blockentity.CableBlockEntity; import com.gregtechceu.gtceu.common.item.modules.ImageModuleBehaviour; +import com.gregtechceu.gtceu.common.machine.multiblock.part.MaintenanceHatchPartMachine; import com.gregtechceu.gtceu.common.machine.multiblock.part.monitor.AdvancedMonitorPartMachine; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.integration.ae2.GTAEPlaceholders; @@ -434,10 +434,10 @@ public MultiLineComponent apply(PlaceholderContext ctx, List args) throws PlaceholderException { PlaceholderUtils.checkArgs(args, 0); if (ctx.pos() == null) throw new NoTargetException(); - IMaintenanceMachine maintenance = GTCapabilityHelper.getMaintenanceMachine(ctx.level(), - ctx.pos(), ctx.side()); - if (maintenance == null) throw new NotSupportedException(); - return MultiLineComponent.literal(maintenance.hasMaintenanceProblems() ? 1 : 0); + MetaMachine machine = MetaMachine.getMachine(ctx.level(), ctx.pos()); + if (machine instanceof MaintenanceHatchPartMachine maint) + return MultiLineComponent.literal(maint.hasMaintenanceProblems() ? 1 : 0); + throw new NotSupportedException(); } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/machines/GCYMMachines.java b/src/main/java/com/gregtechceu/gtceu/common/data/machines/GCYMMachines.java index 9d2f4faccb0..e47eeef7e26 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/machines/GCYMMachines.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/machines/GCYMMachines.java @@ -9,7 +9,7 @@ import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; -import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeLogic; import com.gregtechceu.gtceu.api.multiblock.PatternPredicate; import com.gregtechceu.gtceu.api.multiblock.Predicates; import com.gregtechceu.gtceu.api.multiblock.pattern.MultiblockPatternBuilder; @@ -17,6 +17,7 @@ import com.gregtechceu.gtceu.common.data.GTMaterials; import com.gregtechceu.gtceu.common.data.GTRecipeModifiers; import com.gregtechceu.gtceu.common.data.GTRecipeTypes; +import com.gregtechceu.gtceu.common.machine.GTMachineInstanceFactories; import com.gregtechceu.gtceu.common.machine.multiblock.electric.DistillationTowerMachine; import com.gregtechceu.gtceu.common.machine.multiblock.electric.gcym.*; import com.gregtechceu.gtceu.common.machine.multiblock.part.ParallelHatchPartMachine; @@ -37,7 +38,6 @@ import static com.gregtechceu.gtceu.common.data.GCYMBlocks.*; import static com.gregtechceu.gtceu.common.data.GCYMRecipeTypes.ALLOY_BLAST_RECIPES; import static com.gregtechceu.gtceu.common.data.GTBlocks.*; -import static com.gregtechceu.gtceu.common.data.GTMachines.*; import static com.gregtechceu.gtceu.common.data.GTMaterials.NaquadahAlloy; import static com.gregtechceu.gtceu.common.data.GTRecipeModifiers.*; import static com.gregtechceu.gtceu.common.data.GTRecipeTypes.*; @@ -101,7 +101,7 @@ public static void init() {} .register(); public final static MultiblockMachineDefinition LARGE_CHEMICAL_BATH = REGISTRATE - .multiblock("large_chemical_bath", LargeChemicalBathMachine::new) + .multiblock("large_chemical_bath", GTMachineInstanceFactories.LARGE_CHEM_BATH) .langValue("Large Chemical Bath") .tooltips(Component.translatable("gtceu.multiblock.parallelizable.tooltip")) .tooltips(Component.translatable("gtceu.machine.available_recipe_map_2.tooltip", @@ -161,7 +161,7 @@ public static void init() {} .register(); public final static MultiblockMachineDefinition LARGE_MIXER = REGISTRATE - .multiblock("large_mixer", LargeMixerMachine::new) + .multiblock("large_mixer", GTMachineInstanceFactories.LARGE_MIXER) .langValue("Large Mixing Vessel") .tooltips(Component.translatable("gtceu.multiblock.parallelizable.tooltip")) .tooltips(Component.translatable("gtceu.machine.available_recipe_map_1.tooltip", diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/machines/GTMachineUtils.java b/src/main/java/com/gregtechceu/gtceu/common/data/machines/GTMachineUtils.java index d2d449d7c3b..649fd5a717a 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/machines/GTMachineUtils.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/machines/GTMachineUtils.java @@ -4,7 +4,6 @@ import com.gregtechceu.gtceu.api.GTCEuAPI; import com.gregtechceu.gtceu.api.GTValues; import com.gregtechceu.gtceu.api.block.MetaMachineBlock; -import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.compat.FeCompat; import com.gregtechceu.gtceu.api.capability.recipe.FluidRecipeCapability; import com.gregtechceu.gtceu.api.capability.recipe.IO; @@ -21,7 +20,7 @@ import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; import com.gregtechceu.gtceu.api.machine.steam.SimpleSteamMachine; -import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeLogic; import com.gregtechceu.gtceu.api.mui.factory.PanelFactory; import com.gregtechceu.gtceu.api.multiblock.PatternPredicate; import com.gregtechceu.gtceu.api.multiblock.Predicates; @@ -220,44 +219,47 @@ public static MachineDefinition[] registerSimpleMachines(GTRegistrate registrate .register(); } - public static MachineDefinition[] registerTieredMachines(String name, - BiFunction factory, - BiFunction, MachineDefinition> builder, - int... tiers) { + public static MachineDefinition[] registerTieredMachines(String name, + MachineInstanceFactory.Tiered factory, + BiFunction, MachineDefinition> builder, + int... tiers) { return registerTieredMachines(REGISTRATE, name, factory, builder, tiers); } - public static MachineDefinition[] registerTieredMachines(GTRegistrate registrate, - String name, - BiFunction factory, - BiFunction, MachineDefinition> builder, - int... tiers) { + public static MachineDefinition[] registerTieredMachines(GTRegistrate registrate, + String name, + MachineInstanceFactory.Tiered factory, + BiFunction, MachineDefinition> builder, + int... tiers) { MachineDefinition[] definitions = new MachineDefinition[GTValues.TIER_COUNT]; for (int tier : tiers) { var register = registrate .machine(GTValues.VN[tier].toLowerCase(Locale.ROOT) + "_" + name, - info -> factory.apply(info, tier)) + info -> factory.buildMachine(info, tier)) .tier(tier); definitions[tier] = builder.apply(tier, register); } return definitions; } - public static Pair registerSteamMachines(String name, - BiFunction factory, - BiFunction, MachineDefinition> builder) { + public static < + MACHINE extends MetaMachine> Pair registerSteamMachines(String name, + MachineInstanceFactory.Steam factory, + BiFunction, MachineDefinition> builder) { return registerSteamMachines(REGISTRATE, name, factory, builder); } - public static Pair registerSteamMachines(GTRegistrate registrate, String name, - BiFunction factory, - BiFunction, MachineDefinition> builder) { + public static < + MACHINE extends MetaMachine> Pair registerSteamMachines(GTRegistrate registrate, + String name, + MachineInstanceFactory.Steam factory, + BiFunction, MachineDefinition> builder) { MachineDefinition lowTier = builder.apply(false, - registrate.machine("lp_%s".formatted(name), holder -> factory.apply(holder, false)) + registrate.machine("lp_%s".formatted(name), holder -> factory.buildMachine(holder, false)) .langValue("Low Pressure " + FormattingUtil.toEnglishName(name)) .tier(0)); MachineDefinition highTier = builder.apply(true, - registrate.machine("hp_%s".formatted(name), holder -> factory.apply(holder, true)) + registrate.machine("hp_%s".formatted(name), holder -> factory.buildMachine(holder, true)) .langValue("High Pressure " + FormattingUtil.toEnglishName(name)) .tier(1)); return Pair.of(lowTier, highTier); @@ -635,7 +637,7 @@ public static MultiblockMachineDefinition registerMultiblockTank(String name, St Supplier casing, Supplier valve, @Nullable PropertyFluidFilter filter, - BiConsumer, ResourceLocation> rendererSetup) { + BiConsumer, ResourceLocation> rendererSetup) { return registerMultiblockTank(REGISTRATE, name, displayName, capacity, casing, valve, filter, rendererSetup); } @@ -644,8 +646,8 @@ public static MultiblockMachineDefinition registerMultiblockTank(GTRegistrate re Supplier casing, Supplier valve, @Nullable PropertyFluidFilter filter, - BiConsumer, ResourceLocation> rendererSetup) { - MultiblockMachineBuilder builder = registrate + BiConsumer, ResourceLocation> rendererSetup) { + MultiblockMachineBuilder builder = registrate .multiblock(name, holder -> new MultiblockTankMachine(holder, capacity, filter)) .langValue(displayName) .tooltips( @@ -670,14 +672,14 @@ public static MultiblockMachineDefinition registerMultiblockTank(GTRegistrate re } public static MachineDefinition registerTankValve(String name, String displayName, boolean isMetal, - BiConsumer, ResourceLocation> rendererSetup) { + BiConsumer, ResourceLocation> rendererSetup) { return registerTankValve(REGISTRATE, name, displayName, isMetal, rendererSetup); } public static MachineDefinition registerTankValve(GTRegistrate registrate, String name, String displayName, boolean isMetal, - BiConsumer, ResourceLocation> rendererSetup) { - MachineBuilder builder = registrate + BiConsumer, ResourceLocation> rendererSetup) { + MachineBuilder builder = registrate .machine(name, holder -> new TankValvePartMachine(holder, isMetal)) .langValue(displayName) .tooltips(Component.translatable("gtceu.machine.tank_valve.tooltip"), @@ -687,22 +689,25 @@ public static MachineDefinition registerTankValve(GTRegistrate registrate, Strin return builder.register(); } - public static MultiblockMachineDefinition[] registerTieredMultis(String name, - BiFunction factory, - BiFunction, MultiblockMachineDefinition> builder, - int... tiers) { + public static < + MACHINE extends MultiblockControllerMachine> MultiblockMachineDefinition[] registerTieredMultis(String name, + MachineInstanceFactory.Tiered factory, + BiFunction, MultiblockMachineDefinition> builder, + int... tiers) { return registerTieredMultis(REGISTRATE, name, factory, builder, tiers); } - public static MultiblockMachineDefinition[] registerTieredMultis(GTRegistrate registrate, String name, - BiFunction factory, - BiFunction, MultiblockMachineDefinition> builder, - int... tiers) { + public static < + MACHINE extends MultiblockControllerMachine> MultiblockMachineDefinition[] registerTieredMultis(GTRegistrate registrate, + String name, + MachineInstanceFactory.Tiered factory, + BiFunction, MultiblockMachineDefinition> builder, + int... tiers) { MultiblockMachineDefinition[] definitions = new MultiblockMachineDefinition[GTValues.TIER_COUNT]; for (int tier : tiers) { var register = registrate .multiblock(GTValues.VN[tier].toLowerCase(Locale.ROOT) + "_" + name, - holder -> factory.apply(holder, tier)) + holder -> factory.buildMachine(holder, tier)) .tier(tier); definitions[tier] = builder.apply(tier, register); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/machines/GTMultiMachines.java b/src/main/java/com/gregtechceu/gtceu/common/data/machines/GTMultiMachines.java index f5831827e11..b3974701780 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/machines/GTMultiMachines.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/machines/GTMultiMachines.java @@ -12,7 +12,7 @@ import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; -import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeLogic; import com.gregtechceu.gtceu.api.multiblock.PatternPredicate; import com.gregtechceu.gtceu.api.multiblock.Predicates; import com.gregtechceu.gtceu.api.multiblock.pattern.MultiblockPatternBuilder; diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/machines/GTResearchMachines.java b/src/main/java/com/gregtechceu/gtceu/common/data/machines/GTResearchMachines.java index 9bd9bc84608..290189c641e 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/machines/GTResearchMachines.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/machines/GTResearchMachines.java @@ -2,19 +2,20 @@ import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.GTValues; -import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.data.RotationState; import com.gregtechceu.gtceu.api.machine.MachineDefinition; +import com.gregtechceu.gtceu.api.machine.MachineInstanceFactory; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; -import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeLogic; import com.gregtechceu.gtceu.api.multiblock.pattern.MultiblockPatternBuilder; import com.gregtechceu.gtceu.api.registry.registrate.MachineBuilder; import com.gregtechceu.gtceu.client.util.TooltipHelper; import com.gregtechceu.gtceu.common.data.GTMaterials; import com.gregtechceu.gtceu.common.data.GTRecipeTypes; +import com.gregtechceu.gtceu.common.machine.GTMachineInstanceFactories; import com.gregtechceu.gtceu.common.machine.multiblock.electric.research.DataBankMachine; import com.gregtechceu.gtceu.common.machine.multiblock.electric.research.HPCAMachine; import com.gregtechceu.gtceu.common.machine.multiblock.electric.research.NetworkSwitchMachine; @@ -23,7 +24,6 @@ import com.gregtechceu.gtceu.common.machine.multiblock.part.ObjectHolderMachine; import com.gregtechceu.gtceu.common.machine.multiblock.part.OpticalComputationHatchMachine; import com.gregtechceu.gtceu.common.machine.multiblock.part.OpticalDataHatchMachine; -import com.gregtechceu.gtceu.common.machine.multiblock.part.hpca.*; import com.gregtechceu.gtceu.data.lang.LangHandler; import com.gregtechceu.gtceu.utils.FormattingUtil; @@ -31,11 +31,8 @@ import net.minecraft.network.chat.Component; import net.minecraft.world.item.ItemStack; -import org.jetbrains.annotations.NotNull; - import java.util.List; import java.util.function.BiConsumer; -import java.util.function.Function; import javax.annotation.ParametersAreNonnullByDefault; @@ -91,9 +88,7 @@ public class GTResearchMachines { .modelProperty(IS_FORMED, false) .modelProperty(GTMachineModelProperties.RECIPE_LOGIC_STATUS, RecipeLogic.Status.IDLE) .model(createWorkableTieredHullMachineModel(GTCEu.id("block/machines/object_holder")) - .andThen((ctx, prov, model) -> { - model.addReplaceableTextures("bottom", "top", "side"); - })) + .andThen((ctx, prov, model) -> model.addReplaceableTextures("bottom", "top", "side"))) .register(); public static final MultiblockMachineDefinition DATA_BANK = REGISTRATE.multiblock("data_bank", DataBankMachine::new) @@ -276,12 +271,13 @@ public class GTResearchMachines { public static final MachineDefinition HPCA_EMPTY_COMPONENT = registerHPCAPart( "hpca_empty_component", "Empty HPCA Component", - HPCAEmptyPartMachine::new, "empty", false) + GTMachineInstanceFactories.HPCA_EMPTY, "empty", false) .tooltips(Component.translatable("gtceu.part_sharing.disabled")) .register(); + public static final MachineDefinition HPCA_COMPUTATION_COMPONENT = registerHPCAPart( "hpca_computation_component", "HPCA Computation Component", - holder -> new HPCAComputationPartMachine(holder, false), "computation", false) + GTMachineInstanceFactories.HPCA_COMPUTATION, "computation", false) .tooltips( Component.translatable("gtceu.machine.hpca.component_general.upkeep_eut", GTValues.VA[GTValues.EV]), Component.translatable("gtceu.machine.hpca.component_general.max_eut", GTValues.VA[GTValues.LuV]), @@ -292,7 +288,7 @@ public class GTResearchMachines { .register(); public static final MachineDefinition HPCA_ADVANCED_COMPUTATION_COMPONENT = registerHPCAPart( "hpca_advanced_computation_component", "HPCA Advanced Computation Component", - holder -> new HPCAComputationPartMachine(holder, true), "advanced_computation", true) + GTMachineInstanceFactories.HPCA_COMPUTATION_ADVANCED, "advanced_computation", true) .tooltips( Component.translatable("gtceu.machine.hpca.component_general.upkeep_eut", GTValues.VA[GTValues.IV]), Component.translatable("gtceu.machine.hpca.component_general.max_eut", GTValues.VA[GTValues.ZPM]), @@ -303,14 +299,14 @@ public class GTResearchMachines { .register(); public static final MachineDefinition HPCA_HEAT_SINK_COMPONENT = registerHPCAPart( "hpca_heat_sink_component", "HPCA Heat Sink Component", - holder -> new HPCACoolerPartMachine(holder, false), "heat_sink", false) + GTMachineInstanceFactories.HPCA_COOLER, "heat_sink", false) .tooltips(Component.translatable("gtceu.machine.hpca.component_type.cooler_passive"), Component.translatable("gtceu.machine.hpca.component_type.cooler_cooling", 1), Component.translatable("gtceu.part_sharing.disabled")) .register(); public static final MachineDefinition HPCA_ACTIVE_COOLER_COMPONENT = registerHPCAPart( "hpca_active_cooler_component", "HPCA Active Cooling Component", - holder -> new HPCACoolerPartMachine(holder, true), "active_cooler", true) + GTMachineInstanceFactories.HPCA_COOLER_ADVANCED, "active_cooler", true) .tooltips(Component.translatable("gtceu.machine.hpca.component_general.max_eut", GTValues.VA[GTValues.IV]), Component.translatable("gtceu.machine.hpca.component_type.cooler_active"), Component.translatable("gtceu.machine.hpca.component_type.cooler_active_coolant", @@ -320,16 +316,19 @@ public class GTResearchMachines { .register(); public static final MachineDefinition HPCA_BRIDGE_COMPONENT = registerHPCAPart( "hpca_bridge_component", "HPCA Bridge Component", - HPCABridgePartMachine::new, "bridge", false) + GTMachineInstanceFactories.HPCA_BRIDGE, "bridge", false) .tooltips(Component.translatable("gtceu.machine.hpca.component_type.bridge"), Component.translatable("gtceu.machine.hpca.component_general.max_eut", GTValues.VA[GTValues.IV]), Component.translatable("gtceu.part_sharing.disabled")) .register(); - @NotNull - private static MachineBuilder registerDataHatch(String name, String displayName, int tier, - Function constructor, - String model, PartAbility... abilities) { + private static < + MACHINE extends MetaMachine> MachineBuilder registerDataHatch(String name, + String displayName, + int tier, + MachineInstanceFactory constructor, + String model, + PartAbility... abilities) { return REGISTRATE.machine(name, constructor) .langValue(displayName) .tier(tier) @@ -338,9 +337,12 @@ public class GTResearchMachines { .overlayTieredHullModel(model); } - private static MachineBuilder registerHPCAPart(String name, String displayName, - Function constructor, - String texture, boolean isAdvanced) { + private static < + MACHINE extends MetaMachine> MachineBuilder registerHPCAPart(String name, + String displayName, + MachineInstanceFactory constructor, + String texture, + boolean isAdvanced) { return REGISTRATE.machine(name, constructor) .langValue(displayName) .rotationState(RotationState.ALL) diff --git a/src/main/java/com/gregtechceu/gtceu/common/data/models/GTMachineModels.java b/src/main/java/com/gregtechceu/gtceu/common/data/models/GTMachineModels.java index 3541a3b531e..350dd7fac93 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/data/models/GTMachineModels.java +++ b/src/main/java/com/gregtechceu/gtceu/common/data/models/GTMachineModels.java @@ -5,7 +5,7 @@ import com.gregtechceu.gtceu.api.block.MetaMachineBlock; import com.gregtechceu.gtceu.api.data.chemical.material.Material; import com.gregtechceu.gtceu.api.machine.MachineDefinition; -import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeLogic; import com.gregtechceu.gtceu.api.multiblock.util.RelativeDirection; import com.gregtechceu.gtceu.api.registry.registrate.MachineBuilder; import com.gregtechceu.gtceu.api.registry.registrate.provider.GTBlockstateProvider; diff --git a/src/main/java/com/gregtechceu/gtceu/common/datafixers/TagFixer.java b/src/main/java/com/gregtechceu/gtceu/common/datafixers/TagFixer.java deleted file mode 100644 index 7bf24e1a6a8..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/common/datafixers/TagFixer.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.gregtechceu.gtceu.common.datafixers; - -import com.gregtechceu.gtceu.utils.GTMath; - -import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.Tag; - -import java.util.Locale; - -public class TagFixer { - - public static final String[] FLUID_TAGS = { - "currentMilliBucketsPerTick", - "globalTransferSizeMillibuckets", - "minValue", - "maxValue", - }; - - // This is necessary for updating from old versions due to FluidStack long -> int changes - // Any fluid-related long tags need to be turned into int tags - public static void fixFluidTags(CompoundTag tag) { - if (tag.contains("cover", Tag.TAG_COMPOUND)) { - CompoundTag t = tag.getCompound("cover"); - for (String key : t.getAllKeys()) { - var cover = t.getCompound(key); - var id = cover.getCompound("uid").getString("id"); - if ((id.toLowerCase(Locale.ROOT).contains("fluid") || id.toLowerCase(Locale.ROOT).contains("pump"))) { - var data = cover.getCompound("payload").getCompound("d"); - for (String fix_key : FLUID_TAGS) { - if (data.contains(fix_key, Tag.TAG_LONG)) { - var l = data.getLong(fix_key); - data.putInt(fix_key, GTMath.saturatedCast(l)); - } - } - } - } - } - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/behavior/IntCircuitBehaviour.java b/src/main/java/com/gregtechceu/gtceu/common/item/behavior/IntCircuitBehaviour.java index 6597e21223e..03a696754a4 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/behavior/IntCircuitBehaviour.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/behavior/IntCircuitBehaviour.java @@ -2,11 +2,10 @@ import com.gregtechceu.gtceu.api.item.component.IAddInformation; import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.api.machine.feature.IHasCircuitSlot; import com.gregtechceu.gtceu.api.mui.IItemUIHolder; import com.gregtechceu.gtceu.common.data.GTItems; +import com.gregtechceu.gtceu.common.machine.trait.ProgrammableCircuitSlotTrait; import com.gregtechceu.gtceu.common.mui.GTMuiWidgets; -import com.gregtechceu.gtceu.config.ConfigHolder; import net.minecraft.nbt.CompoundTag; import net.minecraft.network.chat.Component; @@ -79,12 +78,8 @@ public InteractionResult useOn(UseOnContext context) { int circuitSetting = getCircuitConfiguration(stack); BlockEntity entity = context.getLevel().getBlockEntity(context.getClickedPos()); if (entity instanceof MetaMachine machine && context.isSecondaryUseActive()) { - if (machine instanceof IHasCircuitSlot circuitMachine && - circuitMachine.getCircuitInventory().getSlots() > 0) { - setCircuitConfiguration(circuitMachine.getCircuitInventory().getStackInSlot(0), circuitSetting); - } - if (!ConfigHolder.INSTANCE.machines.ghostCircuit) - stack.shrink(1); + machine.getTraitOptional(ProgrammableCircuitSlotTrait.TYPE) + .ifPresent(t -> t.setCurrentCircuit(circuitSetting)); return InteractionResult.SUCCESS; } return IItemUIHolder.super.useOn(context); diff --git a/src/main/java/com/gregtechceu/gtceu/common/item/behavior/PortableScannerBehavior.java b/src/main/java/com/gregtechceu/gtceu/common/item/behavior/PortableScannerBehavior.java index 4eb6b6066e7..096f38fa992 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/item/behavior/PortableScannerBehavior.java +++ b/src/main/java/com/gregtechceu/gtceu/common/item/behavior/PortableScannerBehavior.java @@ -12,7 +12,7 @@ import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.feature.IDataInfoProvider; import com.gregtechceu.gtceu.api.machine.feature.IMufflableMachine; -import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeLogic; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.RecipeHelper; import com.gregtechceu.gtceu.api.sync_system.managed.ManagedSyncBlockEntity; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/GTMachineInstanceFactories.java b/src/main/java/com/gregtechceu/gtceu/common/machine/GTMachineInstanceFactories.java new file mode 100644 index 00000000000..b5806671d49 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/GTMachineInstanceFactories.java @@ -0,0 +1,129 @@ +package com.gregtechceu.gtceu.common.machine; + +import com.gregtechceu.gtceu.api.GTValues; +import com.gregtechceu.gtceu.api.machine.MachineInstanceFactory; +import com.gregtechceu.gtceu.api.machine.SimpleTieredMachine; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.api.multiblock.util.RelativeDirection; +import com.gregtechceu.gtceu.common.machine.multiblock.part.hpca.HPCAComponentPartMachine; +import com.gregtechceu.gtceu.common.machine.trait.hpca.HPCAComponentTrait; +import com.gregtechceu.gtceu.common.machine.trait.multiblock.MultiblockFluidRendererTrait; +import com.gregtechceu.gtceu.common.mui.GTGuiTextures; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Direction; + +import org.jetbrains.annotations.ApiStatus; + +import java.util.HashSet; +import java.util.Set; + +@ApiStatus.NonExtendable +public interface GTMachineInstanceFactories { + + MachineInstanceFactory LARGE_CHEM_BATH = (info) -> { + var machine = new WorkableElectricMultiblockMachine(info); + + // Attach fluid render behaviour + machine.attachPersistentTrait("fluidRendererTrait", new MultiblockFluidRendererTrait(() -> { + var frontFace = machine.getFrontFacing(); + var upwardFace = machine.getUpwardsFacing(); + Direction up = RelativeDirection.UP.getRelativeFacing(frontFace, upwardFace, machine.isFlipped()); + Direction back = frontFace.getOpposite(); + Direction clockWise = RelativeDirection.RIGHT.getRelativeFacing(frontFace, upwardFace, machine.isFlipped()); + Direction counterClockWise = RelativeDirection.LEFT.getRelativeFacing(frontFace, upwardFace, + machine.isFlipped()); + + BlockPos pos = machine.getBlockPos(); + BlockPos center = pos.relative(up); + + Set offsets = new HashSet<>(); + + for (int i = 0; i < 5; i++) { + center = center.relative(back); + offsets.add(center.subtract(pos)); + offsets.add(center.relative(clockWise).subtract(pos)); + offsets.add(center.relative(counterClockWise).subtract(pos)); + } + return offsets; + })); + + return machine; + }; + + MachineInstanceFactory LARGE_MIXER = (info) -> { + var machine = new WorkableElectricMultiblockMachine(info); + + // Attach fluid render behaviour + machine.attachPersistentTrait("fluidRendererTrait", new MultiblockFluidRendererTrait(() -> { + var frontFace = machine.getFrontFacing(); + var upwardFace = machine.getUpwardsFacing(); + var flipped = machine.isFlipped(); + Direction up = RelativeDirection.UP.getRelativeFacing(frontFace, upwardFace, flipped); + Direction back = frontFace.getOpposite(); + Direction clockWise = RelativeDirection.RIGHT.getRelativeFacing(frontFace, upwardFace, flipped); + Direction counterClockWise = RelativeDirection.LEFT.getRelativeFacing(frontFace, upwardFace, flipped); + + BlockPos pos = machine.getBlockPos(); + BlockPos center = pos.relative(up, 3); + + Set offsets = new HashSet<>(); + + for (int i = 0; i < 3; i++) { + center = center.relative(back); + if (i % 2 == 0) { + offsets.add(center.subtract(pos)); + } + offsets.add(center.relative(clockWise).subtract(pos)); + offsets.add(center.relative(counterClockWise).subtract(pos)); + } + return offsets; + })); + + return machine; + }; + + MachineInstanceFactory.Tiered ROCK_CRUSHER = (info, tier) -> { + var machine = new SimpleTieredMachine(info, tier); + machine.getEnvironmentalExplosionTrait().setEnableEnvironmentalExplosions(false); + return machine; + }; + + ///// HPCA stuff + + MachineInstanceFactory HPCA_EMPTY = (info) -> { + var hpcaTrait = new HPCAComponentTrait(0, 0, false, false); + return new HPCAComponentPartMachine(info, false, GTGuiTextures.HPCA_EMPTY_COMPONENT, + GTGuiTextures.HPCA_EMPTY_COMPONENT, hpcaTrait); + }; + + MachineInstanceFactory HPCA_BRIDGE = (info) -> { + var hpcaTrait = new HPCAComponentTrait(GTValues.VA[GTValues.IV], GTValues.VA[GTValues.IV], false, true); + return new HPCAComponentPartMachine(info, true, GTGuiTextures.HPCA_BRIDGE_COMPONENT, + GTGuiTextures.HPCA_BRIDGE_COMPONENT, hpcaTrait); + }; + + MachineInstanceFactory HPCA_COMPUTATION = (info) -> { + var hpcaTrait = HPCAComponentPartMachine.createHPCAComputationTrait(false); + return new HPCAComponentPartMachine(info, false, GTGuiTextures.HPCA_COMPUTATION_COMPONENT, + GTGuiTextures.HPCA_DAMAGED_COMPUTATION_COMPONENT, hpcaTrait); + }; + + MachineInstanceFactory HPCA_COMPUTATION_ADVANCED = (info) -> { + var hpcaTrait = HPCAComponentPartMachine.createHPCAComputationTrait(true); + return new HPCAComponentPartMachine(info, true, GTGuiTextures.HPCA_ADVANCED_COMPUTATION_COMPONENT, + GTGuiTextures.HPCA_DAMAGED_ADVANCED_COMPUTATION_COMPONENT, hpcaTrait); + }; + + MachineInstanceFactory HPCA_COOLER = (info) -> { + var hpcaTrait = HPCAComponentPartMachine.createHPCACoolerTrait(false); + return new HPCAComponentPartMachine(info, false, GTGuiTextures.HPCA_HEAT_SINK_COMPONENT, + GTGuiTextures.HPCA_HEAT_SINK_COMPONENT, hpcaTrait); + }; + + MachineInstanceFactory HPCA_COOLER_ADVANCED = (info) -> { + var hpcaTrait = HPCAComponentPartMachine.createHPCACoolerTrait(true); + return new HPCAComponentPartMachine(info, true, GTGuiTextures.HPCA_ACTIVE_COOLER_COMPONENT, + GTGuiTextures.HPCA_ACTIVE_COOLER_COMPONENT, hpcaTrait); + }; +} diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/AirScrubberMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/AirScrubberMachine.java index 58672ef99d1..99a9fc871b7 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/AirScrubberMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/AirScrubberMachine.java @@ -20,7 +20,7 @@ public class AirScrubberMachine extends SimpleTieredMachine { public static final float MIN_CLEANING_PER_OPERATION = 10; - private MedicalCondition currentRecipeMedicalCondition; + private @Nullable MedicalCondition currentRecipeMedicalCondition; @Getter private float removedLastSecond; @@ -31,11 +31,7 @@ public class AirScrubberMachine extends SimpleTieredMachine { public AirScrubberMachine(BlockEntityCreationInfo info, int tier) { super(info, tier, GTMachineUtils.largeTankSizeFunction); this.cleanerTrait = attachTrait(new EnvironmentalHazardCleanerTrait(tier / 2, this::validateCleaningOperation)); - } - - @Override - public boolean regressWhenWaiting() { - return false; + recipeLogic.setRegressWhenWaiting(false); } public boolean validateCleaningOperation(MedicalCondition condition, float amount) { @@ -59,25 +55,11 @@ public boolean isRecipeLogicAvailable() { @Override public boolean beforeWorking(@Nullable GTRecipe recipe) { - if (super.beforeWorking(recipe) && recipe != null) { + if (super.beforeWorking(recipe) && recipe != null && currentRecipeMedicalCondition != null) { // Sets the amount of hazard to clean based on the recipe tier, not the machine tier return cleanerTrait.beginCleaningOperation(currentRecipeMedicalCondition, MIN_CLEANING_PER_OPERATION * (recipe.ocLevel + 1)); } return false; } - - @Override - public boolean onWorking() { - if (!super.onWorking() || !ConfigHolder.INSTANCE.gameplay.environmentalHazards) { - return false; - } - cleanerTrait.cleanHazard(); - return true; - } - - @Override - public void afterWorking() { - cleanerTrait.endCleaningOperation(); - } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/BatteryBufferMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/BatteryBufferMachine.java index 5c5f0c3f651..4456e4bdad2 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/BatteryBufferMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/BatteryBufferMachine.java @@ -11,7 +11,7 @@ import com.gregtechceu.gtceu.api.machine.feature.IMuiMachine; import com.gregtechceu.gtceu.api.machine.mui.MachineUIPanel; import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; -import com.gregtechceu.gtceu.api.machine.trait.NotifiableEnergyContainer; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableEnergyContainer; import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/BlockBreakerMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/BlockBreakerMachine.java index fc3003968ca..4302f0ad34f 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/BlockBreakerMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/BlockBreakerMachine.java @@ -2,21 +2,18 @@ import com.gregtechceu.gtceu.api.GTValues; import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; -import com.gregtechceu.gtceu.api.capability.GTCapabilityHelper; import com.gregtechceu.gtceu.api.capability.IControllable; import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.TieredEnergyMachine; -import com.gregtechceu.gtceu.api.machine.feature.IHasBatterySlot; import com.gregtechceu.gtceu.api.machine.feature.IMuiMachine; -import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableItemStackHandler; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; -import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; import com.gregtechceu.gtceu.common.machine.trait.AutoOutputTrait; +import com.gregtechceu.gtceu.common.machine.trait.BatterySlotTrait; import com.gregtechceu.gtceu.common.mui.GTMuiMachineUtil; import com.gregtechceu.gtceu.common.mui.GTMuiWidgets; -import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.utils.ISubscription; import net.minecraft.MethodsReturnNonnullByDefault; @@ -42,15 +39,12 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class BlockBreakerMachine extends TieredEnergyMachine - implements IMuiMachine, IControllable, IHasBatterySlot { + implements IMuiMachine, IControllable { @SaveField protected final NotifiableItemStackHandler cache; - @Getter - @SaveField - protected final CustomItemStackHandler chargerInventory; @Nullable - protected TickableSubscription batterySubs, breakerSubs; + protected TickableSubscription breakerSubs; @Nullable protected ISubscription energySubs; private final int inventorySize; @@ -63,16 +57,20 @@ public class BlockBreakerMachine extends TieredEnergyMachine @SyncToClient public final AutoOutputTrait autoOutput; + @Getter + @SaveField + protected final BatterySlotTrait batterySlot; + @Getter @SaveField @SyncToClient private boolean isWorkingEnabled = true; public BlockBreakerMachine(BlockEntityCreationInfo info, int tier) { - super(info, tier); + super(info, tier, false); this.inventorySize = (tier + 1) * (tier + 1); - this.cache = attachTrait(createCacheItemHandler()); - this.chargerInventory = createChargerItemHandler(); + this.cache = attachTrait(new NotifiableItemStackHandler(inventorySize, IO.BOTH, IO.OUT)); + this.batterySlot = attachTrait(new BatterySlotTrait(energyContainer)); this.energyPerTick = GTValues.V[tier - 1]; this.efficiencyMultiplier = 1.0f - getEfficiencyMultiplier(tier); this.autoOutput = attachTrait(AutoOutputTrait.ofItems(cache)); @@ -90,32 +88,12 @@ else if (efficiencyMultiplier < .1f) return efficiencyMultiplier; } - ////////////////////////////////////// - // ***** Initialization *****// - ////////////////////////////////////// - - protected CustomItemStackHandler createChargerItemHandler() { - var handler = new CustomItemStackHandler(); - handler.setFilter(item -> GTCapabilityHelper.getElectricItem(item) != null || - (ConfigHolder.INSTANCE.compat.energy.nativeEUToFE && - GTCapabilityHelper.getForgeEnergyItem(item) != null)); - return handler; - } - - protected NotifiableItemStackHandler createCacheItemHandler() { - return new NotifiableItemStackHandler(inventorySize, IO.BOTH, IO.OUT); - } - @Override public void onLoad() { super.onLoad(); if (!isRemote()) { scheduleForNextServerTick(this::updateBreakerSubscription); - energySubs = energyContainer.addChangedListener(() -> { - this.updateBatterySubscription(); - this.updateBreakerSubscription(); - }); - chargerInventory.setOnContentsChanged(this::updateBatterySubscription); + energySubs = energyContainer.addChangedListener(this::updateBreakerSubscription); } } @@ -128,12 +106,6 @@ public void onUnload() { } } - @Override - public void onMachineDestroyed() { - super.onMachineDestroyed(); - chargerInventory.dropInventoryInWorld(getLevel(), getBlockPos()); - } - @Override public void onNeighborChanged(Block block, BlockPos fromPos, boolean isMoving) { super.onNeighborChanged(block, fromPos, isMoving); @@ -241,20 +213,6 @@ public boolean drainEnergy(boolean simulate) { // ******* Auto Output *******// ////////////////////////////////////// - protected void updateBatterySubscription() { - if (energyContainer.dischargeOrRechargeEnergyContainers(chargerInventory, 0, true)) - batterySubs = subscribeServerTick(batterySubs, this::chargeBattery); - else if (batterySubs != null) { - batterySubs.unsubscribe(); - batterySubs = null; - } - } - - protected void chargeBattery() { - if (!energyContainer.dischargeOrRechargeEnergyContainers(chargerInventory, 0, false)) - updateBatterySubscription(); - } - public void setWorkingEnabled(boolean workingEnabled) { isWorkingEnabled = workingEnabled; syncDataHolder.markClientSyncFieldDirty("isWorkingEnabled"); diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ConverterMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ConverterMachine.java index e50d7a9157d..3f76031bcf8 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ConverterMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ConverterMachine.java @@ -4,9 +4,12 @@ import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.compat.FeCompat; import com.gregtechceu.gtceu.api.item.tool.GTToolType; -import com.gregtechceu.gtceu.api.machine.TieredEnergyMachine; -import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; +import com.gregtechceu.gtceu.api.machine.TieredMachine; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableEnergyContainer; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.common.machine.trait.ConverterTrait; +import com.gregtechceu.gtceu.common.machine.trait.EnvironmentalExplosionTrait; import com.gregtechceu.gtceu.common.mui.GTGuiTextures; import com.gregtechceu.gtceu.utils.ExtendedUseOnContext; @@ -16,10 +19,11 @@ import net.minecraft.network.chat.Component; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.block.state.properties.BooleanProperty; import brachy.modularui.drawable.UITexture; +import lombok.Getter; import org.jetbrains.annotations.Nullable; import java.util.Set; @@ -28,12 +32,21 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -public class ConverterMachine extends TieredEnergyMachine { +public class ConverterMachine extends TieredMachine { - public static final BooleanProperty FE_TO_EU_PROPERTY = GTMachineModelProperties.IS_FE_TO_EU; + @SaveField + @SyncToClient + public final NotifiableEnergyContainer energyContainer; + + @Getter + protected final EnvironmentalExplosionTrait environmentalExplosionTrait; public ConverterMachine(BlockEntityCreationInfo info, int tier, int amps) { - super(info, tier, t -> new ConverterTrait((ConverterMachine) t, tier, amps)); + super(info, tier); + + energyContainer = attachTrait(new ConverterTrait(this, tier, amps)); + environmentalExplosionTrait = attachTrait(new EnvironmentalExplosionTrait(tier, tier * 10, + () -> energyContainer.getEnergyStored() > 0)); } ////////////////////////////////////// @@ -94,21 +107,11 @@ public boolean isFacingValid(Direction facing) { @Override public @Nullable UITexture sideTips(Player player, BlockPos pos, BlockState state, Set toolTypes, - Direction side) { + ItemStack held, Direction side) { if (toolTypes.contains(GTToolType.SOFT_MALLET)) { return this.isFeToEu() ? GTGuiTextures.TOOL_SWITCH_CONVERTER_NATIVE : GTGuiTextures.TOOL_SWITCH_CONVERTER_EU; } - return super.sideTips(player, pos, state, toolTypes, side); - } - - @Override - protected long getMaxInputOutputAmperage() { - return getConverterTrait().getAmps(); - } - - @Override - protected boolean isEnergyEmitter() { - return getConverterTrait().isFeToEu(); + return super.sideTips(player, pos, state, toolTypes, held, side); } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/FisherMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/FisherMachine.java index 636d1f973e3..be8e1aa4c17 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/FisherMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/FisherMachine.java @@ -2,22 +2,20 @@ import com.gregtechceu.gtceu.api.GTValues; import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; -import com.gregtechceu.gtceu.api.capability.GTCapabilityHelper; import com.gregtechceu.gtceu.api.capability.IWorkable; import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.TieredEnergyMachine; import com.gregtechceu.gtceu.api.machine.feature.IMuiMachine; import com.gregtechceu.gtceu.api.machine.mui.MachineUIPanelBuilder; -import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableItemStackHandler; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; -import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; import com.gregtechceu.gtceu.common.machine.trait.AutoOutputTrait; +import com.gregtechceu.gtceu.common.machine.trait.BatterySlotTrait; import com.gregtechceu.gtceu.common.mui.GTGuiTextures; import com.gregtechceu.gtceu.common.mui.GTMuiMachineUtil; import com.gregtechceu.gtceu.common.mui.GTMuiWidgets; -import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.data.lang.LangHandler; import com.gregtechceu.gtceu.utils.ISubscription; @@ -69,10 +67,6 @@ public class FisherMachine extends TieredEnergyMachine protected boolean allowInputFromOutputSideItems; @SaveField protected final NotifiableItemStackHandler baitHandler; - - @Getter - @SaveField - protected final CustomItemStackHandler chargerInventory; @Nullable protected TickableSubscription batterySubs, fishingSubs; @Nullable @@ -109,7 +103,7 @@ public class FisherMachine extends TieredEnergyMachine public final AutoOutputTrait autoOutput; public FisherMachine(BlockEntityCreationInfo info, int tier) { - super(info, tier); + super(info, tier, false); this.inventorySize = (tier + 1) * (tier + 1); this.maxProgress = calcMaxProgress(tier); this.energyPerTick = GTValues.V[tier - 1]; @@ -118,13 +112,10 @@ public FisherMachine(BlockEntityCreationInfo info, int tier) { this.baitHandler = attachTrait(new NotifiableItemStackHandler(1, IO.IN, IO.BOTH)); baitHandler.setFilter(item -> item.is(Items.STRING)); - this.chargerInventory = new CustomItemStackHandler(); - chargerInventory.setFilter(item -> GTCapabilityHelper.getElectricItem(item) != null || - (ConfigHolder.INSTANCE.compat.energy.nativeEUToFE && - GTCapabilityHelper.getForgeEnergyItem(item) != null)); - autoOutput = attachTrait(AutoOutputTrait.ofItems(cache)); environmentalExplosionTrait.setEnableEnvironmentalExplosions(false); + + attachPersistentTrait("batterySlot", new BatterySlotTrait(energyContainer)); } public void setWorkingEnabled(boolean enabled) { @@ -141,12 +132,8 @@ public void setJunkEnabled(boolean enabled) { public void onLoad() { super.onLoad(); if (isRemote()) return; - energySubs = energyContainer.addChangedListener(() -> { - this.updateBatterySubscription(); - this.updateFishingUpdateSubscription(); - }); + energySubs = energyContainer.addChangedListener(this::updateFishingUpdateSubscription); baitSubs = baitHandler.addChangedListener(this::updateFishingUpdateSubscription); - chargerInventory.setOnContentsChanged(this::updateBatterySubscription); this.updateFishingUpdateSubscription(); } @@ -163,12 +150,6 @@ public void onUnload() { } } - @Override - public void onMachineDestroyed() { - super.onMachineDestroyed(); - chargerInventory.dropInventoryInWorld(getLevel(), getBlockPos()); - } - public static int calcMaxProgress(int tier) { return (int) (800.0 - 170 * ((double) tier - 1.0) + (((double) Math.max(0, tier - 4) / 0.012))); } @@ -266,20 +247,6 @@ public boolean drainEnergy(boolean simulate) { return false; } - protected void updateBatterySubscription() { - if (energyContainer.dischargeOrRechargeEnergyContainers(chargerInventory, 0, true)) - batterySubs = subscribeServerTick(batterySubs, this::chargeBattery); - else if (batterySubs != null) { - batterySubs.unsubscribe(); - batterySubs = null; - } - } - - protected void chargeBattery() { - if (!energyContainer.dischargeOrRechargeEnergyContainers(chargerInventory, 0, false)) - updateBatterySubscription(); - } - ////////////////////////////////////// // ********** GUI ***********// ////////////////////////////////////// diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/HullMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/HullMachine.java index 0259e85ab80..033edfa7d06 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/HullMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/HullMachine.java @@ -5,7 +5,7 @@ import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.IMonitorComponent; import com.gregtechceu.gtceu.api.machine.multiblock.part.TieredPartMachine; -import com.gregtechceu.gtceu.api.machine.trait.NotifiableEnergyContainer; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableEnergyContainer; import com.gregtechceu.gtceu.api.sync_system.ClassSyncData; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.data_transformers.ValueTransformer; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ItemCollectorMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ItemCollectorMachine.java index c1c8c3e429f..198e4b3edf1 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ItemCollectorMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/ItemCollectorMachine.java @@ -1,7 +1,6 @@ package com.gregtechceu.gtceu.common.machine.electric; import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; -import com.gregtechceu.gtceu.api.capability.GTCapabilityHelper; import com.gregtechceu.gtceu.api.capability.IWorkable; import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.cover.filter.ItemFilter; @@ -9,17 +8,17 @@ import com.gregtechceu.gtceu.api.machine.TieredEnergyMachine; import com.gregtechceu.gtceu.api.machine.feature.IMuiMachine; import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; -import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableItemStackHandler; import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; import com.gregtechceu.gtceu.common.data.GTItems; import com.gregtechceu.gtceu.common.machine.trait.AutoOutputTrait; +import com.gregtechceu.gtceu.common.machine.trait.BatterySlotTrait; import com.gregtechceu.gtceu.common.mui.GTGuiTextures; import com.gregtechceu.gtceu.common.mui.GTMuiMachineUtil; import com.gregtechceu.gtceu.common.mui.GTMuiWidgets; -import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.utils.ISubscription; import net.minecraft.MethodsReturnNonnullByDefault; @@ -45,6 +44,7 @@ import org.jetbrains.annotations.Nullable; import java.util.List; +import java.util.Objects; import javax.annotation.ParametersAreNonnullByDefault; @@ -61,14 +61,11 @@ public class ItemCollectorMachine extends TieredEnergyMachine @SaveField protected final NotifiableItemStackHandler output; - @Getter - @SaveField - protected final CustomItemStackHandler chargerInventory; @SaveField protected final CustomItemStackHandler filterInventory; @Nullable - protected TickableSubscription batterySubs, collectionSubs; + protected TickableSubscription collectionSubs; @Nullable protected ISubscription energySubs; private final long energyPerTick; @@ -102,28 +99,17 @@ public class ItemCollectorMachine extends TieredEnergyMachine public final AutoOutputTrait autoOutput; public ItemCollectorMachine(BlockEntityCreationInfo info, int tier) { - super(info, tier); + super(info, tier, false); this.inventorySize = INVENTORY_SIZES[Mth.clamp(getTier(), 0, INVENTORY_SIZES.length - 1)]; this.energyPerTick = (long) BASE_EU_CONSUMPTION * (1L << (tier - 1)); - this.output = attachTrait(createOutputItemHandler()); - this.chargerInventory = createChargerItemHandler(); + this.output = attachTrait(new NotifiableItemStackHandler(inventorySize, IO.BOTH, IO.OUT)); this.filterInventory = createFilterItemHandler(); environmentalExplosionTrait.setEnableEnvironmentalExplosions(false); this.autoOutput = attachTrait(AutoOutputTrait.ofItems(output)); maxRange = (int) Math.pow(2, tier + 2); range = maxRange; - } - - ////////////////////////////////////// - // ***** Initialization *****// - ////////////////////////////////////// - protected CustomItemStackHandler createChargerItemHandler() { - var handler = new CustomItemStackHandler(); - handler.setFilter(item -> GTCapabilityHelper.getElectricItem(item) != null || - (ConfigHolder.INSTANCE.compat.energy.nativeEUToFE && - GTCapabilityHelper.getForgeEnergyItem(item) != null)); - return handler; + attachPersistentTrait("batterySlot", new BatterySlotTrait(energyContainer)); } protected CustomItemStackHandler createFilterItemHandler() { @@ -133,10 +119,6 @@ protected CustomItemStackHandler createFilterItemHandler() { return handler; } - protected NotifiableItemStackHandler createOutputItemHandler() { - return new NotifiableItemStackHandler(inventorySize, IO.BOTH, IO.OUT); - } - @Override public void onLoad() { super.onLoad(); @@ -144,11 +126,7 @@ public void onLoad() { scheduleForNextServerTick(this::updateCollectionSubscription); - energySubs = energyContainer.addChangedListener(() -> { - this.updateBatterySubscription(); - this.updateCollectionSubscription(); - }); - chargerInventory.setOnContentsChanged(this::updateBatterySubscription); + energySubs = energyContainer.addChangedListener(this::updateCollectionSubscription); } @Override @@ -160,12 +138,6 @@ public void onUnload() { } } - @Override - public void onMachineDestroyed() { - super.onMachineDestroyed(); - chargerInventory.dropInventoryInWorld(getLevel(), getBlockPos()); - } - ////////////////////////////////////// // ********* Logic **********// ////////////////////////////////////// @@ -206,7 +178,7 @@ public void moveItemsInRange() { filter = ItemFilter.loadFilter(filterInventory.getStackInSlot(0)); BlockPos centerPos = self().getBlockPos().above(); - List itemEntities = getLevel().getEntitiesOfClass(ItemEntity.class, aabb); + List itemEntities = getLevel().getEntitiesOfClass(ItemEntity.class, Objects.requireNonNull(aabb)); for (ItemEntity itemEntity : itemEntities) { if (!itemEntity.isAlive()) continue; if (filter != null && !filter.test(itemEntity.getItem())) continue; @@ -261,21 +233,6 @@ public boolean drainEnergy(boolean simulate) { return false; } - protected void updateBatterySubscription() { - if (energyContainer.dischargeOrRechargeEnergyContainers(chargerInventory, 0, true)) - batterySubs = subscribeServerTick(batterySubs, this::chargeBattery); - else if (batterySubs != null) { - batterySubs.unsubscribe(); - batterySubs = null; - } - } - - protected void chargeBattery() { - if (!energyContainer.dischargeOrRechargeEnergyContainers(chargerInventory, 0, false)) { - updateBatterySubscription(); - } - } - @Override public int getProgress() { return 0; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/MinerMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/MinerMachine.java index b5ece18f4ae..d52974e7e18 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/MinerMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/MinerMachine.java @@ -2,23 +2,19 @@ import com.gregtechceu.gtceu.api.GTValues; import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; -import com.gregtechceu.gtceu.api.capability.GTCapabilityHelper; import com.gregtechceu.gtceu.api.capability.IControllable; import com.gregtechceu.gtceu.api.capability.IMiner; -import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.WorkableTieredMachine; import com.gregtechceu.gtceu.api.machine.feature.IDataInfoProvider; import com.gregtechceu.gtceu.api.machine.feature.IMuiMachine; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; -import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; import com.gregtechceu.gtceu.common.item.behavior.PortableScannerBehavior; import com.gregtechceu.gtceu.common.machine.trait.AutoOutputTrait; +import com.gregtechceu.gtceu.common.machine.trait.BatterySlotTrait; import com.gregtechceu.gtceu.common.machine.trait.miner.MinerLogic; import com.gregtechceu.gtceu.common.mui.GTMuiMachineUtil; -import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.utils.ExtendedUseOnContext; -import com.gregtechceu.gtceu.utils.ISubscription; import net.minecraft.ChatFormatting; import net.minecraft.core.Direction; @@ -38,9 +34,7 @@ import brachy.modularui.widgets.ListWidget; import brachy.modularui.widgets.layout.Flow; import com.mojang.blaze3d.MethodsReturnNonnullByDefault; -import lombok.Getter; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.Collections; @@ -54,91 +48,31 @@ public class MinerMachine extends WorkableTieredMachine implements IControllable, IMuiMachine, IDataInfoProvider, IMiner { - @Getter - @SaveField - protected final CustomItemStackHandler chargerInventory; private final long energyPerTick; - @Nullable - protected TickableSubscription batterySubs; - @Nullable - protected ISubscription energySubs; @SaveField @SyncToClient public final AutoOutputTrait autoOutput; public MinerMachine(BlockEntityCreationInfo info, int tier, int speed, int maximumRadius, int fortune) { - super(info, tier, - new MinerLogic(fortune, speed, maximumRadius), - 0, (tier + 1) * (tier + 1), 0, 0, ($) -> 0); + super(info, tier, new MinerLogic(fortune, speed, maximumRadius), + 0, (tier + 1) * (tier + 1), 0, + 0, false, ($) -> 0); + this.energyPerTick = GTValues.V[tier - 1]; - this.chargerInventory = createChargerItemHandler(); + + attachPersistentTrait("batterySlot", new BatterySlotTrait(energyContainer)); + this.autoOutput = attachTrait(AutoOutputTrait.ofItems(exportItems)); autoOutput.setItemOutputDirectionValidator(d -> d != Direction.DOWN); getRecipeLogic().resetRecipeLogic(); } - ////////////////////////////////////// - // ***** Initialization ******// - ////////////////////////////////////// - - protected CustomItemStackHandler createChargerItemHandler() { - var handler = new CustomItemStackHandler(); - handler.setFilter(item -> GTCapabilityHelper.getElectricItem(item) != null || - (ConfigHolder.INSTANCE.compat.energy.nativeEUToFE && - GTCapabilityHelper.getForgeEnergyItem(item) != null)); - return handler; - } - - @Override - public void onMachineDestroyed() { - super.onMachineDestroyed(); - // Remove the miner pipes below this miner - chargerInventory.dropInventoryInWorld(getLevel(), getBlockPos()); - } - @Override public MinerLogic getRecipeLogic() { return (MinerLogic) super.getRecipeLogic(); } - @Override - public void onLoad() { - super.onLoad(); - if (!isRemote()) { - updateBatterySubscription(); - energySubs = energyContainer.addChangedListener(this::updateBatterySubscription); - chargerInventory.setOnContentsChanged(this::updateBatterySubscription); - } - } - - @Override - public void onUnload() { - super.onUnload(); - if (energySubs != null) { - energySubs.unsubscribe(); - energySubs = null; - } - } - - ////////////////////////////////////// - // ********** LOGIC **********// - ////////////////////////////////////// - protected void updateBatterySubscription() { - if (energyContainer.dischargeOrRechargeEnergyContainers(chargerInventory, 0, true)) { - batterySubs = subscribeServerTick(batterySubs, this::chargeBattery); - } else if (batterySubs != null) { - batterySubs.unsubscribe(); - batterySubs = null; - } - } - - protected void chargeBattery() { - if (!energyContainer.dischargeOrRechargeEnergyContainers(chargerInventory, 0, false)) { - updateBatterySubscription(); - } - } - @Override public boolean drainInput(boolean simulate) { long resultEnergy = energyContainer.getEnergyStored() - energyPerTick; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/PumpMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/PumpMachine.java index e4f97298aef..6b05acda4e2 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/PumpMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/PumpMachine.java @@ -5,7 +5,7 @@ import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.machine.TieredEnergyMachine; import com.gregtechceu.gtceu.api.machine.feature.IMuiMachine; -import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableFluidTank; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.common.data.GTBlocks; @@ -75,7 +75,7 @@ public class PumpMachine extends TieredEnergyMachine implements IMuiMachine { public final AutoOutputTrait autoOutput; public PumpMachine(BlockEntityCreationInfo info, int tier) { - super(info, tier); + super(info, tier, false); this.cache = attachTrait( new NotifiableFluidTank(1, 16 * FluidType.BUCKET_VOLUME * Math.max(1, getTier()), IO.NONE, IO.OUT)); diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/RockCrusherMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/RockCrusherMachine.java deleted file mode 100644 index 24824e61c92..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/RockCrusherMachine.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.gregtechceu.gtceu.common.machine.electric; - -import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; -import com.gregtechceu.gtceu.api.machine.SimpleTieredMachine; -import com.gregtechceu.gtceu.common.data.machines.GTMachineUtils; - -public class RockCrusherMachine extends SimpleTieredMachine { - - public RockCrusherMachine(BlockEntityCreationInfo info, int tier) { - super(info, tier, GTMachineUtils.defaultTankSizeFunction); - environmentalExplosionTrait.setEnableEnvironmentalExplosions(false); - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/TransformerMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/TransformerMachine.java index 1601196aba1..d490db207e9 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/TransformerMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/TransformerMachine.java @@ -5,7 +5,7 @@ import com.gregtechceu.gtceu.api.capability.IControllable; import com.gregtechceu.gtceu.api.machine.TieredEnergyMachine; import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; -import com.gregtechceu.gtceu.api.machine.trait.NotifiableEnergyContainer; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableEnergyContainer; import com.gregtechceu.gtceu.api.sync_system.annotations.ClientFieldChangeListener; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/WorldAcceleratorMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/WorldAcceleratorMachine.java index b1293bd1c90..3b46e26c19a 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/electric/WorldAcceleratorMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/electric/WorldAcceleratorMachine.java @@ -10,7 +10,7 @@ import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.TieredEnergyMachine; import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; -import com.gregtechceu.gtceu.api.machine.trait.NotifiableEnergyContainer; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableEnergyContainer; import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; @@ -26,6 +26,7 @@ import net.minecraft.server.level.ServerLevel; import net.minecraft.world.InteractionResult; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntityTicker; import net.minecraft.world.level.block.entity.BlockEntityType; @@ -218,11 +219,11 @@ public void setWorkingEnabled(boolean workingEnabled) { @Override public @Nullable UITexture sideTips(Player player, BlockPos pos, BlockState state, Set toolTypes, - Direction side) { + ItemStack held, Direction side) { if (toolTypes.contains(GTToolType.SOFT_MALLET)) { return isWorkingEnabled ? GTGuiTextures.TOOL_PAUSE : GTGuiTextures.TOOL_START; } - return super.sideTips(player, pos, state, toolTypes, side); + return super.sideTips(player, pos, state, toolTypes, held, side); } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/ActiveTransformerMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/ActiveTransformerMachine.java index 24fe27e38be..aab66a214c7 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/ActiveTransformerMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/ActiveTransformerMachine.java @@ -6,11 +6,10 @@ import com.gregtechceu.gtceu.api.capability.recipe.EURecipeCapability; import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.machine.ConditionalSubscriptionHandler; -import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; -import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.machine.multiblock.part.MultiblockPartMachine; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeLogic; import com.gregtechceu.gtceu.api.misc.EnergyContainerList; import com.gregtechceu.gtceu.api.multiblock.PatternPredicate; import com.gregtechceu.gtceu.api.multiblock.error.PatternStringError; @@ -90,7 +89,7 @@ public void formStructure(@NotNull String substructureName) { // Long2ObjectMap ioMap = getMultiblockState().getMatchContext().getOrCreate("ioMap", // Long2ObjectMaps::emptyMap); - for (IMultiPart part : getPrioritySortedParts()) { + for (MultiblockPartMachine part : getPrioritySortedParts()) { // IO io = ioMap.getOrDefault(part.self().getPos().asLong(), IO.BOTH); // if (io == IO.NONE) continue; var handlerLists = part.getRecipeHandlers(); @@ -128,20 +127,18 @@ public void formStructure(@NotNull String substructureName) { } @NotNull - private List getPrioritySortedParts() { + private List getPrioritySortedParts() { return getParts().stream().sorted(Comparator.comparingInt(part -> { - if (part instanceof MetaMachine partMachine) { - Block partBlock = partMachine.getBlockState().getBlock(); + Block partBlock = part.getBlockState().getBlock(); - if (PartAbility.OUTPUT_ENERGY.isApplicable(partBlock)) - return 1; + if (PartAbility.OUTPUT_ENERGY.isApplicable(partBlock)) + return 1; - if (PartAbility.SUBSTATION_OUTPUT_ENERGY.isApplicable(partBlock)) - return 2; + if (PartAbility.SUBSTATION_OUTPUT_ENERGY.isApplicable(partBlock)) + return 2; - if (PartAbility.OUTPUT_LASER.isApplicable(partBlock)) - return 3; - } + if (PartAbility.OUTPUT_LASER.isApplicable(partBlock)) + return 3; return 4; })).toList(); diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/AssemblyLineMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/AssemblyLineMachine.java index 23748c9bec8..29ba3f0e378 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/AssemblyLineMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/AssemblyLineMachine.java @@ -7,12 +7,12 @@ import com.gregtechceu.gtceu.api.capability.recipe.IRecipeHandler; import com.gregtechceu.gtceu.api.capability.recipe.ItemRecipeCapability; import com.gregtechceu.gtceu.api.capability.recipe.RecipeCapability; -import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; -import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; -import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; -import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.machine.multiblock.part.MultiblockPartMachine; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableFluidTank; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableItemStackHandler; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeLogic; import com.gregtechceu.gtceu.api.multiblock.util.RelativeDirection; import com.gregtechceu.gtceu.api.recipe.ActionResult; import com.gregtechceu.gtceu.api.recipe.GTRecipe; @@ -53,7 +53,7 @@ public AssemblyLineMachine(BlockEntityCreationInfo info) { this(info, false); } - public static Comparator partSorter(MultiblockControllerMachine mc) { + public static Comparator partSorter(MultiblockControllerMachine mc) { return Comparator.comparingInt( RelativeDirection.RIGHT.getMultiSorter(mc.getFrontFacing(), mc.getUpwardsFacing(), mc.isFlipped())); } @@ -68,6 +68,7 @@ private boolean checkItemInputs(GTRecipe recipe, boolean isTick) { var itemInventory = itemHandlers.stream() .filter(IRecipeHandler::shouldSearchContent) + .filter(f -> f instanceof NotifiableItemStackHandler) .map(container -> container.getContents().stream() .filter(ItemStack.class::isInstance) .map(ItemStack.class::cast) @@ -99,7 +100,9 @@ private ActionResult consumeItemContents(GTRecipe recipe, boolean isTick) { if (itemHandlers.size() < inputsSize) return ActionResult.FAIL_NO_REASON; var itemInventory = itemHandlers.stream() - .filter(IRecipeHandler::shouldSearchContent).toList(); + .filter(IRecipeHandler::shouldSearchContent) + .filter(f -> f instanceof NotifiableItemStackHandler) + .toList(); if (itemInventory.size() < inputsSize) return ActionResult.FAIL_NO_REASON; @@ -297,6 +300,7 @@ protected ActionResult matchRecipe(GTRecipe recipe) { if (!normalMatch.isSuccess()) return normalMatch; var config = ConfigHolder.INSTANCE.machines; + if (!config.orderedAssemblyLineItems && !config.orderedAssemblyLineFluids) return ActionResult.SUCCESS; if (!getMachine().checkItemInputs(recipe, false)) return ActionResult.FAIL_NO_REASON; if (!getMachine().checkItemInputs(recipe, true)) return ActionResult.FAIL_NO_REASON; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CleanroomMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CleanroomMachine.java index bb84e52914b..a991ef0ad3f 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CleanroomMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/CleanroomMachine.java @@ -10,11 +10,10 @@ import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; import com.gregtechceu.gtceu.api.machine.SimpleGeneratorMachine; import com.gregtechceu.gtceu.api.machine.feature.IDataInfoProvider; -import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMaintenanceMachine; -import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; import com.gregtechceu.gtceu.api.machine.multiblock.CleanroomType; import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.api.machine.multiblock.part.MultiblockPartMachine; import com.gregtechceu.gtceu.api.misc.EnergyContainerList; import com.gregtechceu.gtceu.api.multiblock.PatternPredicate; import com.gregtechceu.gtceu.api.multiblock.Predicates; @@ -32,6 +31,7 @@ import com.gregtechceu.gtceu.common.machine.multiblock.generator.LargeCombustionEngineMachine; import com.gregtechceu.gtceu.common.machine.multiblock.generator.LargeTurbineMachine; import com.gregtechceu.gtceu.common.machine.multiblock.part.DiodePartMachine; +import com.gregtechceu.gtceu.common.machine.multiblock.part.MaintenanceHatchPartMachine; import com.gregtechceu.gtceu.common.machine.multiblock.part.MufflerPartMachine; import com.gregtechceu.gtceu.common.machine.multiblock.primitive.CokeOvenMachine; import com.gregtechceu.gtceu.common.machine.multiblock.primitive.PrimitiveBlastFurnaceMachine; @@ -207,7 +207,7 @@ public void invalidateStructure(String name) { this.cleanroomReceivers.clear(); } - public boolean shouldAddPartToController(IMultiPart part) { + public boolean shouldAddPartToController(MultiblockPartMachine part) { var posCache = patternStates.get(DEFAULT_STRUCTURE).getCache().keySet(); for (Direction side : GTUtil.DIRECTIONS) { if (!posCache.contains(part.self().getBlockPos().relative(side).asLong())) { // part is on a wall or edge @@ -224,7 +224,7 @@ public boolean shouldUpdateActiveBlocks() { protected void initializeAbilities() { List energyContainers = new ArrayList<>(); - for (IMultiPart part : getParts()) { + for (MultiblockPartMachine part : getParts()) { if (isPartIgnored(part)) continue; var handlerLists = part.getRecipeHandlers(); for (var handlerList : handlerLists) { @@ -234,7 +234,7 @@ protected void initializeAbilities() { .forEach(energyContainers::add); } - if (part instanceof IMaintenanceMachine maintenanceMachine) { + if (part instanceof MaintenanceHatchPartMachine maintenanceMachine) { getRecipeLogic().setMaintenanceMachine(maintenanceMachine); } } @@ -244,7 +244,7 @@ protected void initializeAbilities() { } @SuppressWarnings("RedundantIfStatement") // `return false` being a separate statement is better for readability - private static boolean isPartIgnored(IMultiPart part) { + private static boolean isPartIgnored(MultiblockPartMachine part) { if (part instanceof DiodePartMachine) return true; if (part instanceof HullMachine) return true; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/DistillationTowerMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/DistillationTowerMachine.java index 355f0084e1a..19e830a8f0a 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/DistillationTowerMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/DistillationTowerMachine.java @@ -2,11 +2,11 @@ import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.recipe.*; -import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; -import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; -import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.machine.multiblock.part.MultiblockPartMachine; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableFluidTank; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeLogic; import com.gregtechceu.gtceu.api.multiblock.error.PatternStringError; import com.gregtechceu.gtceu.api.recipe.ActionResult; import com.gregtechceu.gtceu.api.recipe.GTRecipe; @@ -71,7 +71,7 @@ public void formStructure(@NotNull String substructureName) { super.formStructure(substructureName); var pState = patternStates.get(substructureName); final int startY = getBlockPos().getY() + yOffset; - List parts = getParts().stream() + List parts = getParts().stream() .filter(part -> PartAbility.EXPORT_FLUIDS.isApplicable(part.self().getBlockState().getBlock())) .filter(part -> part.self().getBlockPos().getY() >= startY) .toList(); diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/FusionReactorMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/FusionReactorMachine.java index 31517e494e4..505fd65d52a 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/FusionReactorMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/FusionReactorMachine.java @@ -9,9 +9,10 @@ import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.feature.ITieredMachine; -import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; -import com.gregtechceu.gtceu.api.machine.trait.NotifiableEnergyContainer; +import com.gregtechceu.gtceu.api.machine.multiblock.part.MultiblockPartMachine; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableEnergyContainer; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeLogic; import com.gregtechceu.gtceu.api.misc.EnergyContainerList; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.OverclockingLogic; @@ -112,7 +113,7 @@ public void formStructure(@NotNull String substructureName) { List energyContainers = new ArrayList<>(); // Long2ObjectMap ioMap = getMultiblockState().getMatchContext().getOrCreate("ioMap", // Long2ObjectMaps::emptyMap); - for (IMultiPart part : getParts()) { + for (MultiblockPartMachine part : getParts()) { // IO io = ioMap.getOrDefault(part.self().getPos().asLong(), IO.BOTH); // if (io == IO.NONE || io == IO.OUT) continue; var handlerLists = part.getRecipeHandlers(); @@ -252,10 +253,12 @@ public void updateHeat() { } @Override - public void onWaiting() { - super.onWaiting(); - color = -1; - syncDataHolder.markClientSyncFieldDirty("color"); + public void recipeLogicStatusChanged(RecipeLogic.Status oldStatus, RecipeLogic.Status newStatus) { + super.recipeLogicStatusChanged(oldStatus, newStatus); + if (newStatus == RecipeLogic.Status.WAITING) { + color = -1; + syncDataHolder.markClientSyncFieldDirty("color"); + } } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/LargeMinerMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/LargeMinerMachine.java index 83834ad9f08..a3bd80299bc 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/LargeMinerMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/LargeMinerMachine.java @@ -9,8 +9,8 @@ import com.gregtechceu.gtceu.api.capability.recipe.FluidRecipeCapability; import com.gregtechceu.gtceu.api.data.chemical.material.Material; import com.gregtechceu.gtceu.api.machine.feature.IDataInfoProvider; -import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.api.machine.multiblock.part.MultiblockPartMachine; import com.gregtechceu.gtceu.api.misc.EnergyContainerList; import com.gregtechceu.gtceu.api.multiblock.Predicates; import com.gregtechceu.gtceu.api.multiblock.pattern.PatternState; @@ -109,7 +109,7 @@ private void initializeAbilities() { List fluidTanks = new ArrayList<>(); // Long2ObjectMap ioMap = getMultiblockState().getMatchContext().getOrCreate("ioMap", // Long2ObjectMaps::emptyMap); - for (IMultiPart part : getParts()) { + for (MultiblockPartMachine part : getParts()) { // IO io = ioMap.getOrDefault(part.self().getPos().asLong(), IO.BOTH); // if (io == IO.NONE) continue; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/MultiblockTankMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/MultiblockTankMachine.java index 281d240bf32..df1cf996c7f 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/MultiblockTankMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/MultiblockTankMachine.java @@ -5,7 +5,7 @@ import com.gregtechceu.gtceu.api.fluids.PropertyFluidFilter; import com.gregtechceu.gtceu.api.machine.feature.IMuiMachine; import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; -import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableFluidTank; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.transfer.fluid.IFluidHandlerModifiable; import com.gregtechceu.gtceu.common.mui.GTGuiTextures; 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 e0e87305fd8..412825fb517 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 @@ -8,17 +8,17 @@ import com.gregtechceu.gtceu.api.machine.ConditionalSubscriptionHandler; import com.gregtechceu.gtceu.api.machine.feature.IMuiMachine; import com.gregtechceu.gtceu.api.machine.feature.IVoidable; -import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMaintenanceMachine; -import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; import com.gregtechceu.gtceu.api.machine.multiblock.IBatteryData; import com.gregtechceu.gtceu.api.machine.multiblock.WorkableMultiblockMachine; +import com.gregtechceu.gtceu.api.machine.multiblock.part.MultiblockPartMachine; 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.recipe.RecipeLogic; import com.gregtechceu.gtceu.api.misc.EnergyContainerList; import com.gregtechceu.gtceu.api.multiblock.error.PatternStringError; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.common.block.BatteryBlock; +import com.gregtechceu.gtceu.common.machine.multiblock.part.MaintenanceHatchPartMachine; import com.gregtechceu.gtceu.common.mui.GTMultiblockTextUtil; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.utils.FormattingUtil; @@ -72,7 +72,7 @@ public class PowerSubstationMachine extends WorkableMultiblockMachine private static final BigInteger BIG_INTEGER_MAX_LONG = BigInteger.valueOf(Long.MAX_VALUE); - private @Nullable IMaintenanceMachine maintenance; + private @Nullable MaintenanceHatchPartMachine maintenance; @SaveField private final PowerStationEnergyBank energyBank; @@ -105,10 +105,10 @@ public void formStructure(@NotNull String substructureName) { List outputs = new ArrayList<>(); // Long2ObjectMap ioMap = getMultiblockState().getMatchContext().getOrCreate("ioMap", // Long2ObjectMaps::emptyMap); - for (IMultiPart part : getParts()) { + for (MultiblockPartMachine part : getParts()) { // IO io = ioMap.getOrDefault(part.self().getPos().asLong(), IO.BOTH); // if (io == IO.NONE) continue; - if (part instanceof IMaintenanceMachine maintenanceMachine) { + if (part instanceof MaintenanceHatchPartMachine maintenanceMachine) { this.maintenance = maintenanceMachine; } var handlerLists = part.getRecipeHandlers(); @@ -246,8 +246,8 @@ private static MutableComponent getTimeToFillDrainText(BigInteger timeToFillSeco public long getPassiveDrain() { if (ConfigHolder.INSTANCE.machines.enableMaintenance) { if (maintenance == null) { - for (IMultiPart part : getParts()) { - if (part instanceof IMaintenanceMachine maintenanceMachine) { + for (MultiblockPartMachine part : getParts()) { + if (part instanceof MaintenanceHatchPartMachine maintenanceMachine) { this.maintenance = maintenanceMachine; break; } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/gcym/LargeChemicalBathMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/gcym/LargeChemicalBathMachine.java deleted file mode 100644 index 56214510d28..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/gcym/LargeChemicalBathMachine.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.gregtechceu.gtceu.common.machine.multiblock.electric.gcym; - -import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; -import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; -import com.gregtechceu.gtceu.api.multiblock.util.RelativeDirection; -import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; -import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; -import com.gregtechceu.gtceu.common.machine.trait.multiblock.MultiblockFluidRendererTrait; - -import net.minecraft.MethodsReturnNonnullByDefault; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; - -import lombok.Getter; - -import java.util.HashSet; -import java.util.Set; - -import javax.annotation.ParametersAreNonnullByDefault; - -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -public class LargeChemicalBathMachine extends WorkableElectricMultiblockMachine { - - @Getter - @SyncToClient - @RerenderOnChanged - private final MultiblockFluidRendererTrait fluidRendererTrait; - - public LargeChemicalBathMachine(BlockEntityCreationInfo info) { - super(info); - fluidRendererTrait = attachTrait(new MultiblockFluidRendererTrait(this::saveOffsets)); - } - - public Set saveOffsets() { - Direction up = RelativeDirection.UP.getRelativeFacing(getFrontFacing(), getUpwardsFacing(), isFlipped()); - Direction back = getFrontFacing().getOpposite(); - Direction clockWise = RelativeDirection.RIGHT.getRelativeFacing(getFrontFacing(), getUpwardsFacing(), - isFlipped()); - Direction counterClockWise = RelativeDirection.LEFT.getRelativeFacing(getFrontFacing(), getUpwardsFacing(), - isFlipped()); - - BlockPos pos = getBlockPos(); - BlockPos center = pos.relative(up); - - Set offsets = new HashSet<>(); - - for (int i = 0; i < 5; i++) { - center = center.relative(back); - offsets.add(center.subtract(pos)); - offsets.add(center.relative(clockWise).subtract(pos)); - offsets.add(center.relative(counterClockWise).subtract(pos)); - } - return offsets; - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/gcym/LargeMacerationTowerMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/gcym/LargeMacerationTowerMachine.java index d74ff20ed4e..2c02d2157db 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/gcym/LargeMacerationTowerMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/gcym/LargeMacerationTowerMachine.java @@ -45,7 +45,7 @@ public void formStructure(@NotNull String substructureName) { } @Override - public void invalidateStructure(String name) { + public void invalidateStructure(@NotNull String name) { super.invalidateStructure(name); unsubscribe(hurtSub); hurtSub = null; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/gcym/LargeMixerMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/gcym/LargeMixerMachine.java deleted file mode 100644 index ce1a8913d03..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/gcym/LargeMixerMachine.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.gregtechceu.gtceu.common.machine.multiblock.electric.gcym; - -import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; -import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; -import com.gregtechceu.gtceu.api.multiblock.util.RelativeDirection; -import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; -import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; -import com.gregtechceu.gtceu.common.machine.trait.multiblock.MultiblockFluidRendererTrait; - -import net.minecraft.MethodsReturnNonnullByDefault; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; - -import lombok.Getter; - -import java.util.HashSet; -import java.util.Set; - -import javax.annotation.ParametersAreNonnullByDefault; - -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault -public class LargeMixerMachine extends WorkableElectricMultiblockMachine { - - @Getter - @SyncToClient - @RerenderOnChanged - private final MultiblockFluidRendererTrait fluidRendererTrait; - - public LargeMixerMachine(BlockEntityCreationInfo info) { - super(info); - fluidRendererTrait = attachTrait(new MultiblockFluidRendererTrait(this::saveOffsets)); - } - - public Set saveOffsets() { - Direction up = RelativeDirection.UP.getRelativeFacing(getFrontFacing(), getUpwardsFacing(), isFlipped()); - Direction back = getFrontFacing().getOpposite(); - Direction clockWise = RelativeDirection.RIGHT.getRelativeFacing(getFrontFacing(), getUpwardsFacing(), - isFlipped()); - Direction counterClockWise = RelativeDirection.LEFT.getRelativeFacing(getFrontFacing(), getUpwardsFacing(), - isFlipped()); - - BlockPos pos = getBlockPos(); - BlockPos center = pos.relative(up, 3); - - Set offsets = new HashSet<>(); - - for (int i = 0; i < 3; i++) { - center = center.relative(back); - if (i % 2 == 0) { - offsets.add(center.subtract(pos)); - } - offsets.add(center.relative(clockWise).subtract(pos)); - offsets.add(center.relative(counterClockWise).subtract(pos)); - } - return offsets; - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/research/DataBankMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/research/DataBankMachine.java index f0f5364f47c..f2d066dfccf 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/research/DataBankMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/research/DataBankMachine.java @@ -6,13 +6,13 @@ import com.gregtechceu.gtceu.api.capability.IEnergyContainer; import com.gregtechceu.gtceu.api.capability.recipe.EURecipeCapability; import com.gregtechceu.gtceu.api.machine.TickableSubscription; -import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMaintenanceMachine; -import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; -import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.machine.multiblock.part.MultiblockPartMachine; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeLogic; import com.gregtechceu.gtceu.api.misc.EnergyContainerList; import com.gregtechceu.gtceu.api.multiblock.error.PatternStringError; +import com.gregtechceu.gtceu.common.machine.multiblock.part.MaintenanceHatchPartMachine; import com.gregtechceu.gtceu.common.mui.GTMultiblockTextUtil; import com.gregtechceu.gtceu.config.ConfigHolder; @@ -41,7 +41,7 @@ public class DataBankMachine extends WorkableElectricMultiblockMachine public static final int EUT_PER_HATCH = GTValues.VA[GTValues.EV]; public static final int EUT_PER_HATCH_CHAINED = GTValues.VA[GTValues.LuV]; - private IMaintenanceMachine maintenance; + private MaintenanceHatchPartMachine maintenance; private IEnergyContainer energyContainer; @Getter @@ -62,9 +62,9 @@ public void formStructure(@NotNull String substructureName) { List energyContainers = new ArrayList<>(); // Long2ObjectMap ioMap = getMultiblockState().getMatchContext().getOrCreate("ioMap", // Long2ObjectMaps::emptyMap); - for (IMultiPart part : getParts()) { + for (MultiblockPartMachine part : getParts()) { // IO io = ioMap.getOrDefault(part.self().getPos().asLong(), IO.BOTH); - if (part instanceof IMaintenanceMachine maintenanceMachine) { + if (part instanceof MaintenanceHatchPartMachine maintenanceMachine) { this.maintenance = maintenanceMachine; } // if (io == IO.NONE || io == IO.OUT) continue; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/research/HPCAMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/research/HPCAMachine.java index 81c3c5fd00c..90d1386fc64 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/research/HPCAMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/research/HPCAMachine.java @@ -7,10 +7,9 @@ import com.gregtechceu.gtceu.api.capability.recipe.FluidRecipeCapability; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.TickableSubscription; -import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMaintenanceMachine; -import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; -import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.machine.multiblock.part.MultiblockPartMachine; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeLogic; import com.gregtechceu.gtceu.api.misc.EnergyContainerList; import com.gregtechceu.gtceu.api.multiblock.util.RelativeDirection; import com.gregtechceu.gtceu.api.sync_system.SyncDataHolder; @@ -18,6 +17,7 @@ import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.api.sync_system.managed.ISyncManaged; import com.gregtechceu.gtceu.api.transfer.fluid.FluidHandlerList; +import com.gregtechceu.gtceu.common.machine.multiblock.part.MaintenanceHatchPartMachine; import com.gregtechceu.gtceu.common.machine.multiblock.part.hpca.HPCAComponentPartMachine; import com.gregtechceu.gtceu.common.machine.trait.hpca.HPCAComponentTrait; import com.gregtechceu.gtceu.common.machine.trait.hpca.HPCAComputationProviderTrait; @@ -71,7 +71,7 @@ public class HPCAMachine extends WorkableElectricMultiblockMachine private static final double IDLE_TEMPERATURE = 200; private static final double DAMAGE_TEMPERATURE = 1000; - private IMaintenanceMachine maintenance; + private MaintenanceHatchPartMachine maintenance; private IEnergyContainer energyContainer; private IFluidHandler coolantHandler; @SaveField @@ -101,10 +101,10 @@ public void formStructure(@NotNull String substructureName) { List componentTraits = new ArrayList<>(); // Long2ObjectMap ioMap = getMultiblockState().getMatchContext().getOrCreate("ioMap", // Long2ObjectMaps::emptyMap); - for (IMultiPart part : getParts()) { + for (MultiblockPartMachine part : getParts()) { // IO io = ioMap.getOrDefault(part.self().getBlockPos().asLong(), IO.BOTH); componentTraits.addAll(part.self().getTraits(HPCAComponentTrait.TYPE)); - if (part instanceof IMaintenanceMachine maintenanceMachine) { + if (part instanceof MaintenanceHatchPartMachine maintenanceMachine) { this.maintenance = maintenanceMachine; } // if (io == IO.NONE || io == IO.OUT) continue; @@ -420,8 +420,6 @@ public static class HPCAGridHandler implements ISyncManaged { // cached gui info // holding these values past the computation clear because GUI is too "late" to read the state in time @SyncToClient - private long cachedEUt; - @SyncToClient private int cachedCWUt; public HPCAGridHandler(@Nullable HPCAMachine controller) { @@ -470,8 +468,6 @@ public void tick() { cachedCWUt = allocatedCWUt; syncDataHolder.markClientSyncFieldDirty("cachedCWUt"); } - cachedEUt = getCurrentEUt(); - syncDataHolder.markClientSyncFieldDirty("cachedEUt"); if (allocatedCWUt != 0) { allocatedCWUt = 0; } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/research/NetworkSwitchMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/research/NetworkSwitchMachine.java index 895e140333e..38f408e190b 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/research/NetworkSwitchMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/research/NetworkSwitchMachine.java @@ -7,7 +7,7 @@ import com.gregtechceu.gtceu.api.capability.recipe.CWURecipeCapability; import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; -import com.gregtechceu.gtceu.api.machine.trait.NotifiableComputationContainer; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableComputationContainer; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.world.level.block.Block; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/research/ResearchStationMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/research/ResearchStationMachine.java index 2828cb85569..764dba75e97 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/research/ResearchStationMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/electric/research/ResearchStationMachine.java @@ -7,9 +7,9 @@ import com.gregtechceu.gtceu.api.capability.recipe.CWURecipeCapability; import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.capability.recipe.ItemRecipeCapability; -import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; -import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.machine.multiblock.part.MultiblockPartMachine; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeLogic; import com.gregtechceu.gtceu.api.multiblock.error.PatternStringError; import com.gregtechceu.gtceu.api.multiblock.pattern.PatternState; import com.gregtechceu.gtceu.api.recipe.ActionResult; @@ -46,6 +46,7 @@ public class ResearchStationMachine extends WorkableElectricMultiblockMachine public ResearchStationMachine(BlockEntityCreationInfo info) { super(info, new ResearchStationRecipeLogic()); + recipeLogic.setRegressWhenWaiting(false); } @Override @@ -57,7 +58,7 @@ public ResearchStationRecipeLogic getRecipeLogic() { public void formStructure(@NotNull String substructureName) { var pState = patternStates.get(substructureName); super.formStructure(substructureName); - for (IMultiPart part : getParts()) { + for (MultiblockPartMachine part : getParts()) { if (part instanceof ObjectHolderMachine holder) { if (holder.getFrontFacing() != getFrontFacing().getOpposite()) { pState.setError(new PatternStringError( @@ -110,7 +111,7 @@ public PatternState checkStructurePattern(String name) { public void invalidateStructure(String name) { computationProvider = null; // recheck the ability to make sure it wasn't the one broken - for (IMultiPart part : getParts()) { + for (MultiblockPartMachine part : getParts()) { if (part instanceof ObjectHolderMachine holder) { if (holder == objectHolder) { objectHolder.setLocked(false); @@ -121,11 +122,6 @@ public void invalidateStructure(String name) { super.invalidateStructure(name); } - @Override - public boolean regressWhenWaiting() { - return false; - } - @Override public List getWidgetsForDisplay(PanelSyncManager syncManager) { List widgets = new ArrayList<>(); diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/generator/LargeCombustionEngineMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/generator/LargeCombustionEngineMachine.java index 8a66b859aaf..2a5ec4ed464 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/generator/LargeCombustionEngineMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/generator/LargeCombustionEngineMachine.java @@ -26,7 +26,6 @@ import net.minecraftforge.fluids.FluidStack; import lombok.Getter; -import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.Iterator; @@ -51,6 +50,7 @@ public class LargeCombustionEngineMachine extends WorkableElectricMultiblockMach public LargeCombustionEngineMachine(BlockEntityCreationInfo info, int tier) { super(info); this.tier = tier; + recipeLogic.setRegressWhenWaiting(false); } private boolean isIntakesObstructed() { @@ -114,7 +114,7 @@ protected double getProductionBoost() { * @param recipe recipe * @return A {@link ModifierFunction} for the given Combustion Engine */ - public static ModifierFunction recipeModifier(@NotNull MetaMachine machine, @NotNull GTRecipe recipe) { + public static ModifierFunction recipeModifier(MetaMachine machine, GTRecipe recipe) { if (!(machine instanceof LargeCombustionEngineMachine engineMachine)) { return RecipeModifier.nullWrongType(LargeCombustionEngineMachine.class, machine); } @@ -164,43 +164,6 @@ public boolean onWorking() { return value; } - @Override - public boolean regressWhenWaiting() { - return false; - } - - ////////////////////////////////////// - // ******* GUI ********// - ////////////////////////////////////// - - // @Override - // public void addDisplayText(List textList) { - // MultiblockDisplayText.Builder builder = MultiblockDisplayText.builder(textList, getDefaultPatternState()) - // .setWorkingStatus(recipeLogic.isWorkingEnabled(), recipeLogic.isActive()); - // - // long lastEUt = recipeLogic.getLastRecipe() != null ? - // recipeLogic.getLastRecipe().getOutputEUt().getTotalEU() : 0; - // if (isExtreme()) { - // builder.addEnergyProductionLine(GTValues.V[tier + 1], lastEUt); - // } else { - // builder.addEnergyProductionAmpsLine(GTValues.V[tier] * 3, 3); - // } - // - // if (isActive() && isWorkingEnabled()) { - // builder.addCurrentEnergyProductionLine(lastEUt); - // } - // - // builder.addFuelNeededLine(getRecipeFluidInputInfo(), recipeLogic.getDuration()); - // - // if (isFormed && isOxygenBoosted) { - // final var key = isExtreme() ? "gtceu.multiblock.large_combustion_engine.liquid_oxygen_boosted" : - // "gtceu.multiblock.large_combustion_engine.oxygen_boosted"; - // builder.addCustom(tl -> tl.add(Component.translatable(key).withStyle(ChatFormatting.AQUA))); - // } - // - // builder.addWorkingStatusLine(); - // } - @Nullable public String getRecipeFluidInputInfo() { // Previous Recipe is always null on first world load, so try to acquire a new recipe @@ -216,15 +179,4 @@ public String getRecipeFluidInputInfo() { int neededAmount = GTMath.saturatedCast(ocAmount * requiredFluidInput.getAmount()); return ChatFormatting.RED + FormattingUtil.formatNumbers(neededAmount) + "mB"; } - - // @Override - // public void attachTooltips(TooltipsPanel tooltipsPanel) { - // super.attachTooltips(tooltipsPanel); - // tooltipsPanel.attachTooltips(new IFancyTooltip.Basic( - // () -> GuiTextures.INDICATOR_NO_STEAM.get(false), - // () -> List.of(Component.translatable("gtceu.multiblock.large_combustion_engine.obstructed") - // .setStyle(Style.EMPTY.withColor(ChatFormatting.RED))), - // this::isIntakesObstructed, - // () -> null)); - // } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/generator/LargeTurbineMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/generator/LargeTurbineMachine.java index 8ebc5901ea6..6d500b23270 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/generator/LargeTurbineMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/generator/LargeTurbineMachine.java @@ -5,8 +5,8 @@ import com.gregtechceu.gtceu.api.capability.recipe.RecipeCapability; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.feature.ITieredMachine; -import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; +import com.gregtechceu.gtceu.api.machine.multiblock.part.MultiblockPartMachine; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.content.ContentModifier; import com.gregtechceu.gtceu.api.recipe.ingredient.EnergyStack; @@ -18,7 +18,6 @@ import net.minecraft.MethodsReturnNonnullByDefault; import lombok.Getter; -import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.annotation.ParametersAreNonnullByDefault; @@ -37,11 +36,12 @@ public LargeTurbineMachine(BlockEntityCreationInfo info, int tier) { super(info); this.tier = tier; this.BASE_EU_OUTPUT = GTValues.V[tier] * 2; + recipeLogic.setRegressWhenWaiting(false); } @Nullable private RotorHolderPartMachine getRotorHolder() { - for (IMultiPart part : getParts()) { + for (MultiblockPartMachine part : getParts()) { if (part instanceof RotorHolderPartMachine rotorHolder) { return rotorHolder; } @@ -127,7 +127,7 @@ public int getRotorDurabilityPercent() { * @param recipe recipe * @return A {@link ModifierFunction} for the given Turbine Multiblock and recipe */ - public static ModifierFunction recipeModifier(@NotNull MetaMachine machine, @NotNull GTRecipe recipe) { + public static ModifierFunction recipeModifier(MetaMachine machine, GTRecipe recipe) { if (!(machine instanceof LargeTurbineMachine turbineMachine)) { return RecipeModifier.nullWrongType(LargeTurbineMachine.class, machine); } @@ -161,51 +161,9 @@ public static ModifierFunction recipeModifier(@NotNull MetaMachine machine, @Not .build(); } - @Override - public boolean regressWhenWaiting() { - return false; - } - @Override public boolean canVoidRecipeOutputs(RecipeCapability capability) { // void both eu and fluid tick outputs return true; } - - ////////////////////////////////////// - // ******* GUI ********// - ////////////////////////////////////// - - // @Override - // public void addDisplayText(List textList) { - // super.addDisplayText(textList); - // if (isFormed()) { - // var rotorHolder = getRotorHolder(); - // - // if (rotorHolder != null && rotorHolder.getRotorEfficiency() > 0) { - // textList.add(Component.translatable("gtceu.multiblock.turbine.rotor_speed", - // FormattingUtil.formatNumbers(rotorHolder.getRotorSpeed()), - // FormattingUtil.formatNumbers(rotorHolder.getMaxRotorHolderSpeed()))); - // textList.add(Component.translatable("gtceu.multiblock.turbine.efficiency", - // rotorHolder.getTotalEfficiency())); - // - // long maxProduction = getOverclockVoltage(); - // long currentProduction = getCurrentProduction(); - // - // if (isActive()) { - // textList.add(3, Component.translatable("gtceu.multiblock.turbine.energy_per_tick", - // FormattingUtil.formatNumbers(currentProduction), - // FormattingUtil.formatNumbers(maxProduction))); - // } - // - // int rotorDurability = rotorHolder.getRotorDurabilityPercent(); - // if (rotorDurability > MIN_DURABILITY_TO_WARN) { - // textList.add(Component.translatable("gtceu.multiblock.turbine.rotor_durability", rotorDurability)); - // } else { - // textList.add(Component.translatable("gtceu.multiblock.turbine.rotor_durability", rotorDurability) - // .setStyle(Style.EMPTY.withColor(ChatFormatting.RED))); - // } - // } - // } - // } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/AutoMaintenanceHatchPartMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/AutoMaintenanceHatchPartMachine.java index 2d5d529437b..aa2d578a96e 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/AutoMaintenanceHatchPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/AutoMaintenanceHatchPartMachine.java @@ -2,13 +2,23 @@ import com.gregtechceu.gtceu.api.GTValues; import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; -import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMaintenanceMachine; -import com.gregtechceu.gtceu.api.machine.multiblock.part.TieredPartMachine; +import com.gregtechceu.gtceu.api.capability.recipe.IO; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableItemStackHandler; -public class AutoMaintenanceHatchPartMachine extends TieredPartMachine implements IMaintenanceMachine { +import brachy.modularui.factory.PosGuiData; +import brachy.modularui.screen.UISettings; +import brachy.modularui.value.sync.PanelSyncManager; +import brachy.modularui.widget.ParentWidget; + +public class AutoMaintenanceHatchPartMachine extends MaintenanceHatchPartMachine { public AutoMaintenanceHatchPartMachine(BlockEntityCreationInfo info) { - super(info, GTValues.HV); + super(info, GTValues.HV, false); + } + + @Override + protected NotifiableItemStackHandler createInventory() { + return new NotifiableItemStackHandler(0, IO.NONE, IO.NONE); } @Override @@ -44,4 +54,8 @@ public int getTimeActive() { @Override public void setTimeActive(int time) {} + + @Override + public void buildMainUI(ParentWidget mainWidget, PosGuiData guiData, PanelSyncManager syncManager, + UISettings settings) {} } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/DataAccessHatchMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/DataAccessHatchMachine.java index e66d89d5ee0..d7008a74c91 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/DataAccessHatchMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/DataAccessHatchMachine.java @@ -10,7 +10,7 @@ import com.gregtechceu.gtceu.api.machine.feature.IMuiMachine; import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; import com.gregtechceu.gtceu.api.machine.multiblock.part.TieredPartMachine; -import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableItemStackHandler; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/DiodePartMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/DiodePartMachine.java index 8a76cafd6ba..c24bd3b359d 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/DiodePartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/DiodePartMachine.java @@ -5,7 +5,7 @@ import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.machine.multiblock.part.TieredIOPartMachine; import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; -import com.gregtechceu.gtceu.api.machine.trait.NotifiableEnergyContainer; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableEnergyContainer; import com.gregtechceu.gtceu.api.sync_system.annotations.ClientFieldChangeListener; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/DualHatchPartMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/DualHatchPartMachine.java index 4a89506a959..7128064ddcf 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/DualHatchPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/DualHatchPartMachine.java @@ -3,7 +3,8 @@ import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.machine.MachineDefinition; -import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableFluidTank; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableItemStackHandler; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.common.data.GTMachines; import com.gregtechceu.gtceu.common.mui.GTMuiMachineUtil; @@ -48,8 +49,9 @@ public class DualHatchPartMachine extends ItemBusPartMachine { private boolean hasItemHandler; public DualHatchPartMachine(BlockEntityCreationInfo info, int tier, IO io) { - super(info, tier, io); - this.tank = attachTrait(new NotifiableFluidTank((int) Math.sqrt(getInventorySize()), + super(info, tier, io, new NotifiableItemStackHandler(getDualHatchInventorySize(tier), io)); + + this.tank = attachTrait(new NotifiableFluidTank((int) Math.sqrt(getDualHatchInventorySize(tier)), getTankCapacity(INITIAL_TANK_CAPACITY, getTier()), io)); } @@ -61,9 +63,8 @@ public static int getTankCapacity(int initialCapacity, int tier) { return initialCapacity * (1 << (tier - 6)); } - @Override - public int getInventorySize() { - return (int) Math.pow((getTier() - 4), 2); + public static int getDualHatchInventorySize(int tier) { + return (int) Math.pow((tier - 4), 2); } @Override @@ -163,9 +164,9 @@ public boolean swapIO() { public void buildMainUI(ParentWidget mainWidget, PosGuiData guiData, PanelSyncManager syncManager, UISettings settings) { String slotGroupName = "inv_slot_group"; - SlotGroup slotGroup = new SlotGroup(slotGroupName, getInventorySize()); + SlotGroup slotGroup = new SlotGroup(slotGroupName, getDualHatchInventorySize(getTier())); mainWidget.child(SlotGroupWidget.builder() - .matrix(Arrays.stream(GTMuiMachineUtil.createSquareMatrix(getInventorySize(), 'I')) + .matrix(Arrays.stream(GTMuiMachineUtil.createSquareMatrix(getDualHatchInventorySize(getTier()), 'I')) .map(s -> s + 'F') .toArray(String[]::new)) .key('I', i -> { diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/EnergyHatchPartMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/EnergyHatchPartMachine.java index 5b7ef8abc8a..82a3075a05b 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/EnergyHatchPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/EnergyHatchPartMachine.java @@ -4,7 +4,7 @@ import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.machine.multiblock.part.TieredIOPartMachine; -import com.gregtechceu.gtceu.api.machine.trait.NotifiableEnergyContainer; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableEnergyContainer; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.common.machine.trait.EnvironmentalExplosionTrait; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/FluidHatchPartMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/FluidHatchPartMachine.java index 7c8f3c3e13c..e7b0e90bea1 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/FluidHatchPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/FluidHatchPartMachine.java @@ -5,20 +5,16 @@ import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.machine.MachineDefinition; import com.gregtechceu.gtceu.api.machine.TickableSubscription; -import com.gregtechceu.gtceu.api.machine.feature.IHasCircuitSlot; import com.gregtechceu.gtceu.api.machine.feature.IMuiMachine; import com.gregtechceu.gtceu.api.machine.mui.MachineUIPanel; -import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; import com.gregtechceu.gtceu.api.machine.multiblock.part.TieredIOPartMachine; -import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; -import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableFluidTank; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.common.data.GTMachines; -import com.gregtechceu.gtceu.common.item.behavior.IntCircuitBehaviour; +import com.gregtechceu.gtceu.common.machine.trait.ProgrammableCircuitSlotTrait; import com.gregtechceu.gtceu.common.mui.GTGuiTextures; import com.gregtechceu.gtceu.common.mui.GTMuiMachineUtil; -import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.utils.ExtendedUseOnContext; import com.gregtechceu.gtceu.utils.FormattingUtil; import com.gregtechceu.gtceu.utils.GTTransferUtils; @@ -29,7 +25,6 @@ import net.minecraft.core.Direction; import net.minecraft.network.chat.Component; import net.minecraft.world.InteractionResult; -import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; import net.minecraftforge.fluids.FluidStack; @@ -56,7 +51,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -public class FluidHatchPartMachine extends TieredIOPartMachine implements IMuiMachine, IHasCircuitSlot, IPaintable { +public class FluidHatchPartMachine extends TieredIOPartMachine implements IMuiMachine, IPaintable { public static final int INITIAL_TANK_CAPACITY_1X = 8 * FluidType.BUCKET_VOLUME; public static final int INITIAL_TANK_CAPACITY_4X = 2 * FluidType.BUCKET_VOLUME; @@ -73,24 +68,26 @@ public class FluidHatchPartMachine extends TieredIOPartMachine implements IMuiMa @SaveField @SyncToClient protected boolean circuitSlotEnabled; - @Getter + @SaveField - protected final NotifiableItemStackHandler circuitInventory; + protected final ProgrammableCircuitSlotTrait circuitSlot; public FluidHatchPartMachine(BlockEntityCreationInfo info, int tier, IO io, int initialCapacity, int slots) { super(info, tier, io); this.slots = slots; this.tank = attachTrait(createTank(initialCapacity, slots)); - if (io == IO.IN) { - this.circuitSlotEnabled = true; - this.circuitInventory = attachTrait(new NotifiableItemStackHandler(1, IO.IN, IO.NONE)) - .setFilter(IntCircuitBehaviour::isIntegratedCircuit).shouldSearchContent(false) - .shouldDropInventoryInWorld(!ConfigHolder.INSTANCE.machines.ghostCircuit); - } else { - this.circuitSlotEnabled = false; - this.circuitInventory = attachTrait(new NotifiableItemStackHandler(0, IO.NONE)).shouldSearchContent(false); - } + this.circuitSlot = attachTrait(new ProgrammableCircuitSlotTrait()); + circuitSlot.setEnabled(io == IO.IN); + } + + public FluidHatchPartMachine(BlockEntityCreationInfo info, int tier, IO io, NotifiableFluidTank fluidTank) { + super(info, tier, io); + this.slots = fluidTank.getTanks(); + this.tank = attachTrait(fluidTank); + + this.circuitSlot = attachTrait(new ProgrammableCircuitSlotTrait()); + circuitSlot.setEnabled(io == IO.IN); } ////////////////////////////////////// @@ -127,30 +124,6 @@ public void onPaintingColorChanged(int color) { getHandlerList().setColor(color, true); } - @Override - public void addedToController(MultiblockControllerMachine controller, String substructureName) { - if (!controller.allowCircuitSlots()) { - if (!ConfigHolder.INSTANCE.machines.ghostCircuit) { - circuitInventory.dropInventoryInWorld(); - } else { - circuitInventory.setStackInSlot(0, ItemStack.EMPTY); - } - setCircuitSlotEnabled(false); - } - super.addedToController(controller, substructureName); - } - - @Override - public void removedFromController(MultiblockControllerMachine controller) { - super.removedFromController(controller); - for (var c : controllers) { - if (!c.allowCircuitSlots()) { - return; - } - } - setCircuitSlotEnabled(true); - } - @Override public int tintColor(int index) { if (index == 9) return getRealColor(); diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/ItemBusPartMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/ItemBusPartMachine.java index cb6190e3f54..3f640ce4e0d 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/ItemBusPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/ItemBusPartMachine.java @@ -8,22 +8,18 @@ import com.gregtechceu.gtceu.api.cover.filter.ItemFilter; import com.gregtechceu.gtceu.api.machine.MachineDefinition; import com.gregtechceu.gtceu.api.machine.TickableSubscription; -import com.gregtechceu.gtceu.api.machine.feature.IHasCircuitSlot; import com.gregtechceu.gtceu.api.machine.feature.IMuiMachine; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IDistinctPart; -import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; import com.gregtechceu.gtceu.api.machine.multiblock.part.TieredIOPartMachine; -import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableItemStackHandler; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.common.data.GTMachines; -import com.gregtechceu.gtceu.common.item.behavior.IntCircuitBehaviour; -import com.gregtechceu.gtceu.config.ConfigHolder; +import com.gregtechceu.gtceu.common.machine.trait.ProgrammableCircuitSlotTrait; import com.gregtechceu.gtceu.utils.ExtendedUseOnContext; import com.gregtechceu.gtceu.utils.GTTransferUtils; import com.gregtechceu.gtceu.utils.ISubscription; -import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; import net.minecraft.world.InteractionResult; @@ -39,16 +35,11 @@ import brachy.modularui.widgets.layout.Grid; import brachy.modularui.widgets.slot.ItemSlot; import brachy.modularui.widgets.slot.SlotGroup; -import lombok.AccessLevel; import lombok.Getter; import org.jetbrains.annotations.Nullable; -import javax.annotation.ParametersAreNonnullByDefault; - -@ParametersAreNonnullByDefault -@MethodsReturnNonnullByDefault public class ItemBusPartMachine extends TieredIOPartMachine - implements IDistinctPart, IHasCircuitSlot, IPaintable, IMuiMachine { + implements IDistinctPart, IMuiMachine, IPaintable { @Getter @SaveField @@ -57,15 +48,6 @@ public class ItemBusPartMachine extends TieredIOPartMachine protected TickableSubscription autoIOSubs; @Nullable protected ISubscription inventorySubs; - @Getter(AccessLevel.PROTECTED) - private boolean hasCircuitSlot = true; - @Getter - @SaveField - @SyncToClient - protected boolean circuitSlotEnabled; - @Getter - @SaveField - protected final NotifiableItemStackHandler circuitInventory; @Getter @SaveField @SyncToClient @@ -75,11 +57,34 @@ public class ItemBusPartMachine extends TieredIOPartMachine @Getter protected final FilterHandler filterHandler; + @Getter + @SaveField + protected final ProgrammableCircuitSlotTrait circuitSlot; + + /** + * Creates an item bus with the default number of slots + * + * @param info {@link BlockEntityCreationInfo} + * @param tier Machine tier. + * @param io IO mode of this item bus. + */ public ItemBusPartMachine(BlockEntityCreationInfo info, int tier, IO io) { + this(info, tier, io, + new NotifiableItemStackHandler(getInventorySize(tier), io, io.support(IO.IN) ? IO.BOTH : io)); + } + + /** + * Creates an item bus with a custom {@link NotifiableItemStackHandler}. + * + * @param info {@link BlockEntityCreationInfo} + * @param tier Machine tier. + * @param io IO mode of this item bus. + * @param inventory The {@link NotifiableItemStackHandler} to attach + */ + public ItemBusPartMachine(BlockEntityCreationInfo info, int tier, IO io, NotifiableItemStackHandler inventory) { super(info, tier, io); - this.inventory = attachTrait(createInventory()); - this.circuitSlotEnabled = true; - this.circuitInventory = attachTrait(createCircuitItemHandler(io)).shouldSearchContent(false); + this.inventory = attachTrait(inventory); + this.circuitSlot = attachTrait(new ProgrammableCircuitSlotTrait()); filterHandler = FilterHandlers.item(this); inventory.setFilter(this::matchesFilter); @@ -89,33 +94,17 @@ public ItemBusPartMachine(BlockEntityCreationInfo info, int tier, IO io) { // ***** Initialization ******// ////////////////////////////////////// - protected int getInventorySize() { - int sizeRoot = 1 + Math.min(9, getTier()); + protected static int getInventorySize(int tier) { + int sizeRoot = 1 + Math.min(9, tier); return sizeRoot * sizeRoot; } - protected NotifiableItemStackHandler createInventory() { - return new NotifiableItemStackHandler(getInventorySize(), io, io.support(IO.IN) ? IO.BOTH : io); - } - protected boolean matchesFilter(ItemStack stack) { if (filterHandler.isFilterPresent()) return filterHandler.getFilter().test(stack); return true; } - protected NotifiableItemStackHandler createCircuitItemHandler(IO io) { - if (io == IO.IN) { - return new NotifiableItemStackHandler(1, IO.IN, IO.NONE) - .setFilter(IntCircuitBehaviour::isIntegratedCircuit) - .shouldDropInventoryInWorld(!ConfigHolder.INSTANCE.machines.ghostCircuit); - } else { - hasCircuitSlot = false; - setCircuitSlotEnabled(false); - return new NotifiableItemStackHandler(0, IO.NONE); - } - } - @Override public void onLoad() { super.onLoad(); @@ -146,42 +135,12 @@ public void setDistinct(boolean distinct) { getHandlerList().setDistinctAndNotify(isDistinct); } - @Override - public void addedToController(MultiblockControllerMachine controller, String substructureName) { - if (hasCircuitSlot && !controller.allowCircuitSlots()) { - if (!ConfigHolder.INSTANCE.machines.ghostCircuit) { - circuitInventory.dropInventoryInWorld(); - } else { - circuitInventory.setStackInSlot(0, ItemStack.EMPTY); - } - setCircuitSlotEnabled(false); - } - super.addedToController(controller, substructureName); - } - - @Override - public void removedFromController(MultiblockControllerMachine controller) { - super.removedFromController(controller); - if (!hasCircuitSlot) return; - for (var c : controllers) { - if (!c.allowCircuitSlots()) { - return; - } - } - setCircuitSlotEnabled(true); - } - @Override public int tintColor(int index) { if (index == 9) return getRealColor(); return -1; } - public void setCircuitSlotEnabled(boolean enabled) { - circuitSlotEnabled = enabled; - syncDataHolder.markClientSyncFieldDirty("circuitSlotEnabled"); - } - ////////////////////////////////////// // ******** Auto IO *********// ////////////////////////////////////// @@ -280,7 +239,7 @@ public boolean swapIO() { @Override public void buildMainUI(ParentWidget mainWidget, PosGuiData guiData, PanelSyncManager syncManager, UISettings settings) { - int rowSize = (int) Math.sqrt(getInventorySize()); + int rowSize = (int) Math.sqrt(getInventorySize(tier)); SlotGroup group = new SlotGroup("item_inv", rowSize, 0, true); mainWidget.child(new Grid() diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/LaserHatchPartMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/LaserHatchPartMachine.java index 9b1445fb7af..3879609e4d5 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/LaserHatchPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/LaserHatchPartMachine.java @@ -6,7 +6,7 @@ import com.gregtechceu.gtceu.api.machine.feature.IDataInfoProvider; import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; import com.gregtechceu.gtceu.api.machine.multiblock.part.TieredIOPartMachine; -import com.gregtechceu.gtceu.api.machine.trait.NotifiableLaserContainer; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableLaserContainer; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.common.item.behavior.PortableScannerBehavior; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/MaintenanceHatchPartMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/MaintenanceHatchPartMachine.java index ca39e7cbbcd..258feeedf89 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/MaintenanceHatchPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/MaintenanceHatchPartMachine.java @@ -7,16 +7,19 @@ import com.gregtechceu.gtceu.api.item.tool.ToolHelper; import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.feature.IMuiMachine; -import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMaintenanceMachine; import com.gregtechceu.gtceu.api.machine.mui.MachineUIPanel; +import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableMultiblockMachine; import com.gregtechceu.gtceu.api.machine.multiblock.part.TieredPartMachine; import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; -import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableItemStackHandler; +import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.client.model.machine.MachineRenderState; import com.gregtechceu.gtceu.common.data.GTItems; import com.gregtechceu.gtceu.common.mui.GTGuiTextures; +import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.utils.ExtendedUseOnContext; import com.gregtechceu.gtceu.utils.GTUtil; @@ -63,12 +66,15 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class MaintenanceHatchPartMachine extends TieredPartMachine - implements IMuiMachine, IMaintenanceMachine { + implements IMuiMachine { private static final float MAX_DURATION_MULTIPLIER = 1.1f; private static final float MIN_DURATION_MULTIPLIER = 0.9f; private static final float DURATION_ACTION_AMOUNT = 0.01f; + public static final byte ALL_PROBLEMS = 0; + public static final byte NO_PROBLEMS = 0b111111; + @Getter private final boolean isConfigurable; @SaveField @@ -85,18 +91,31 @@ public class MaintenanceHatchPartMachine extends TieredPartMachine @SaveField @SyncToClient protected byte maintenanceProblems = startProblems(); + /** + * Duration modifier for recipe. + * It's configurable in the Configurable Maintenance Part. + */ + @Getter @SaveField private float durationMultiplier = 1f; @Nullable protected TickableSubscription maintenanceSubs; - public MaintenanceHatchPartMachine(BlockEntityCreationInfo info, boolean isConfigurable) { - super(info, isConfigurable ? GTValues.HV : GTValues.LV); + public MaintenanceHatchPartMachine(BlockEntityCreationInfo info, int tier, boolean isConfigurable) { + super(info, tier); this.isConfigurable = isConfigurable; this.itemStackHandler = attachTrait(createInventory()); this.itemStackHandler.setFilter(itemStack -> itemStack.is(GTItems.DUCT_TAPE.get())); } + public MaintenanceHatchPartMachine(BlockEntityCreationInfo info, boolean isConfigurable) { + this(info, isConfigurable ? GTValues.HV : GTValues.LV, isConfigurable); + } + + public boolean canShared(MultiblockControllerMachine controller, String substructureName) { + return false; + } + ////////////////////////////////////// // ****** Initialization ******// ////////////////////////////////////// @@ -104,7 +123,6 @@ protected NotifiableItemStackHandler createInventory() { return new NotifiableItemStackHandler(1, IO.BOTH, IO.BOTH); } - @Override public byte startProblems() { return ALL_PROBLEMS; } @@ -117,7 +135,76 @@ public void setDurationMultiplier(float durationMultiplier) { ////////////////////////////////////// // ********* Logic **********// ////////////////////////////////////// + + /** + * Used to calculate whether a maintenance problem should happen based on machine time active + * + * @param duration in ticks to add to the counter of active time + */ + public void calculateMaintenance(int duration) { + if (!ConfigHolder.INSTANCE.machines.enableMaintenance || isFullAuto()) { + return; + } + + setTimeActive(getTimeActive() + duration); + float rate = ConfigHolder.INSTANCE.machines.maintenanceCheckRate / getTimeMultiplier(); + if (getTimeActive() >= rate) { + setTimeActive(0); + if (GTValues.RNG.nextInt(6000) == 0) { + causeRandomMaintenanceProblems(); + setTaped(false); + } + } + } + + /** + * Used to calculate whether a maintenance problem should happen based on machine time active + */ + public void calculateMaintenance() { + calculateMaintenance(1); + } + + public int getNumMaintenanceProblems() { + return ConfigHolder.INSTANCE.machines.enableMaintenance ? 6 - Integer.bitCount(getMaintenanceProblems()) : 0; + } + + public boolean hasMaintenanceProblems() { + return ConfigHolder.INSTANCE.machines.enableMaintenance && this.getMaintenanceProblems() < 63; + } + + public void setMaintenanceFixed(int index) { + setMaintenanceProblems((byte) (getMaintenanceProblems() | (byte) (1 << index))); + } + + public void causeRandomMaintenanceProblems() { + setMaintenanceProblems( + (byte) (getMaintenanceProblems() & (byte) ~(1 << GTValues.RNG.nextInt(6)))); + } + @Override + public boolean onWorking(WorkableMultiblockMachine controller) { + calculateMaintenance(); + if (hasMaintenanceProblems()) { + controller.getRecipeLogic().markLastRecipeDirty(); + } + return true; + } + + @Override + public @Nullable GTRecipe modifyRecipe(GTRecipe recipe) { + if (ConfigHolder.INSTANCE.machines.enableMaintenance) { + if (hasMaintenanceProblems()) { + return null; + } + var durationMultiplier = getDurationMultiplier(); + if (durationMultiplier != 1) { + recipe = recipe.copy(); + recipe.duration = Math.max(1, Math.round(recipe.duration * durationMultiplier)); + } + } + return recipe; + } + public void setMaintenanceProblems(byte problems) { this.maintenanceProblems = problems; updateMaintenanceSubscription(); @@ -298,12 +385,10 @@ public void fixAllMaintenanceProblems() { for (int i = 0; i < 6; i++) setMaintenanceFixed(i); } - @Override public boolean isFullAuto() { return false; } - @Override public void setTaped(boolean isTaped) { if (this.isTaped != isTaped) { this.isTaped = isTaped; @@ -311,7 +396,10 @@ public void setTaped(boolean isTaped) { } } - @Override + /** + * Higher {@link #getDurationMultiplier()} refers to a lower time multiplier. + * The lower time multiplier means more likely causing problems. + */ public float getTimeMultiplier() { var result = 1f; if (durationMultiplier < 1.0) diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/MufflerPartMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/MufflerPartMachine.java index 25d8bb0fa4d..9d685f6910b 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/MufflerPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/MufflerPartMachine.java @@ -7,8 +7,8 @@ import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.feature.IMuiMachine; import com.gregtechceu.gtceu.api.machine.feature.IRecipeLogicMachine; -import com.gregtechceu.gtceu.api.machine.feature.multiblock.IWorkableMultiController; import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableMultiblockMachine; import com.gregtechceu.gtceu.api.machine.multiblock.part.TieredPartMachine; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; @@ -49,7 +49,7 @@ public class MufflerPartMachine extends TieredPartMachine implements IMuiMachine @SaveField private final CustomItemStackHandler inventory; - private TickableSubscription snowSubscription; + private @Nullable TickableSubscription snowSubscription; @Getter private final EnvironmentalHazardEmitterTrait hazardEmitter; @@ -98,13 +98,12 @@ public void clientTick() { } @Override - public boolean afterWorking(IWorkableMultiController controller) { + public void afterWorking(WorkableMultiblockMachine controller) { hazardEmitter.emitHazard(); var supplier = controller.self().getDefinition().getRecoveryItems(); if (supplier != null) { recoverItemsTable(supplier.get()); } - return super.afterWorking(controller); } @Override diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/ObjectHolderMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/ObjectHolderMachine.java index 07cbbb3f1b6..b8ba0e857de 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/ObjectHolderMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/ObjectHolderMachine.java @@ -8,7 +8,7 @@ import com.gregtechceu.gtceu.api.machine.feature.IMuiMachine; import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; import com.gregtechceu.gtceu.api.machine.multiblock.part.MultiblockPartMachine; -import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableItemStackHandler; import com.gregtechceu.gtceu.api.multiblock.pattern.PatternState; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/OpticalComputationHatchMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/OpticalComputationHatchMachine.java index 7dcecde3e66..14d1a6f39eb 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/OpticalComputationHatchMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/OpticalComputationHatchMachine.java @@ -4,7 +4,7 @@ import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; import com.gregtechceu.gtceu.api.machine.multiblock.part.MultiblockPartMachine; -import com.gregtechceu.gtceu.api.machine.trait.NotifiableComputationContainer; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableComputationContainer; import net.minecraft.MethodsReturnNonnullByDefault; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/OpticalDataHatchMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/OpticalDataHatchMachine.java index 8a789f6bea5..95886ee5213 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/OpticalDataHatchMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/OpticalDataHatchMachine.java @@ -4,9 +4,9 @@ import com.gregtechceu.gtceu.api.capability.GTCapability; import com.gregtechceu.gtceu.api.capability.IDataAccessHatch; import com.gregtechceu.gtceu.api.capability.IOpticalDataAccessHatch; -import com.gregtechceu.gtceu.api.machine.feature.multiblock.IWorkableMultiController; import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableMultiblockMachine; import com.gregtechceu.gtceu.api.machine.multiblock.part.MultiblockPartMachine; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.common.blockentity.OpticalPipeBlockEntity; @@ -37,7 +37,7 @@ public OpticalDataHatchMachine(BlockEntityCreationInfo info, boolean isTransmitt } @Override - public boolean isRecipeAvailable(@NotNull GTRecipe recipe, @NotNull Collection seen) { + public boolean isRecipeAvailable(GTRecipe recipe, Collection seen) { seen.add(this); if (!isFormed()) { return false; @@ -45,7 +45,7 @@ public boolean isRecipeAvailable(@NotNull GTRecipe recipe, @NotNull Collection dataAccesses = new ArrayList<>(); diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/PumpHatchPartMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/PumpHatchPartMachine.java index 2d1ca82fe38..e22f2ecc39a 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/PumpHatchPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/PumpHatchPartMachine.java @@ -2,7 +2,7 @@ import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.recipe.IO; -import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableFluidTank; import com.gregtechceu.gtceu.common.data.GTMaterials; import net.minecraft.MethodsReturnNonnullByDefault; @@ -15,35 +15,10 @@ public class PumpHatchPartMachine extends FluidHatchPartMachine { public PumpHatchPartMachine(BlockEntityCreationInfo info) { - super(info, 0, IO.OUT, FluidType.BUCKET_VOLUME, 1); + super(info, 0, IO.OUT, new NotifiableFluidTank(1, FluidType.BUCKET_VOLUME, IO.OUT)); + tank.setFilter(fluidStack -> fluidStack.getFluid().is(GTMaterials.Water.getFluidTag())); } - @Override - protected NotifiableFluidTank createTank(int initialCapacity, int slots) { - return super.createTank(initialCapacity, slots) - .setFilter(fluidStack -> fluidStack.getFluid().is(GTMaterials.Water.getFluidTag())); - } - - /* - * @Override - * public ModularUI createUI(Player entityPlayer) { - * return new ModularUI(176, 166, this, entityPlayer) - * .background(GuiTextures.BACKGROUND) - * .widget(new ImageWidget(7, 16, 81, 55, GuiTextures.DISPLAY)) - * .widget(new LabelWidget(11, 20, "gtceu.gui.fluid_amount")) - * .widget(new LabelWidget(11, 30, () -> String.valueOf(tank.getFluidInTank(0).getAmount())) - * .setTextColor(-1).setDropShadow(true)) - * .widget(new LabelWidget(6, 6, getBlockState().getBlock().getDescriptionId())) - * .widget(new TankWidget(tank.getStorages()[0], 90, 35, true, io.support(IO.IN)) - * .setBackground(GuiTextures.FLUID_SLOT)) - * .widget(new ToggleButtonWidget(7, 53, 18, 18, - * GuiTextures.BUTTON_FLUID_OUTPUT, this::isWorkingEnabled, this::setWorkingEnabled) - * .setShouldUseBaseBackground() - * .setTooltipText("gtceu.gui.fluid_auto_input.tooltip")) - * .widget(UITemplate.bindPlayerInventory(entityPlayer.getInventory(), GuiTextures.SLOT, 7, 84, true)); - * } - */ - // By returning false here, we don't allow shift-clicking // with a screwdriver to swap the IO. @Override diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/ReservoirHatchPartMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/ReservoirHatchPartMachine.java index fd9d4026875..6f9e3837971 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/ReservoirHatchPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/ReservoirHatchPartMachine.java @@ -3,7 +3,7 @@ import com.gregtechceu.gtceu.api.GTValues; import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.recipe.IO; -import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableFluidTank; import com.gregtechceu.gtceu.api.transfer.fluid.CustomFluidTank; import net.minecraft.MethodsReturnNonnullByDefault; @@ -24,18 +24,9 @@ public class ReservoirHatchPartMachine extends FluidHatchPartMachine { public static final int FLUID_AMOUNT = 2_000_000_000; public ReservoirHatchPartMachine(BlockEntityCreationInfo info) { - super(info, GTValues.EV, IO.IN, FLUID_AMOUNT, 1); - } - - ////////////////////////////////// - // ****** Initialization ****** // - ////////////////////////////////// - - @Override - protected NotifiableFluidTank createTank(int initialCapacity, int slots) { - this.waterTank = new InfiniteWaterTank(initialCapacity); - // allow both importing and exporting from the tank - return new NotifiableFluidTank(Collections.singletonList(waterTank), io, IO.BOTH); + super(info, GTValues.EV, IO.IN, new NotifiableFluidTank( + Collections.singletonList(new InfiniteWaterTank(FLUID_AMOUNT)), IO.IN, IO.BOTH)); + waterTank = (InfiniteWaterTank) tank.getStorages()[0]; } ////////////////////////////////// diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/RotorHolderPartMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/RotorHolderPartMachine.java index e0c59222c6a..706d9de7b60 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/RotorHolderPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/RotorHolderPartMachine.java @@ -7,10 +7,10 @@ import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.feature.IMuiMachine; import com.gregtechceu.gtceu.api.machine.feature.ITieredMachine; -import com.gregtechceu.gtceu.api.machine.feature.multiblock.*; import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; +import com.gregtechceu.gtceu.api.machine.multiblock.WorkableMultiblockMachine; import com.gregtechceu.gtceu.api.machine.multiblock.part.TieredPartMachine; -import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableItemStackHandler; import com.gregtechceu.gtceu.api.multiblock.util.RelativeDirection; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; @@ -160,7 +160,7 @@ protected void updateRotorSubscription() { } private void updateRotorSpeed() { - if (isFormed() && getControllers().first() instanceof IWorkableMultiController workable) { + if (isFormed() && getControllers().first() instanceof WorkableMultiblockMachine workable) { if (workable.getRecipeLogic().isWorking()) return; } if (!hasRotor()) { @@ -180,15 +180,17 @@ public void setRotorSpeed(int rotorSpeed) { } @Override - public boolean onWorking(IWorkableMultiController controller) { + public boolean onWorking(WorkableMultiblockMachine controller) { if (getRotorSpeed() < getMaxRotorHolderSpeed()) { setRotorSpeed(getRotorSpeed() + SPEED_INCREMENT); updateRotorSubscription(); } if (self().getOffsetTimer() % 20 == 0) { var numMaintenanceProblems = 0; - if (isFormed() && getControllers().first() instanceof IMaintenanceMachine maintenance) { - numMaintenanceProblems = maintenance.getNumMaintenanceProblems(); + + for (var part : getControllers().first().getParts()) { + if (part instanceof MaintenanceHatchPartMachine maintenance) + numMaintenanceProblems = maintenance.getNumMaintenanceProblems(); } damageRotor(1 + numMaintenanceProblems); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/SteamHatchPartMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/SteamHatchPartMachine.java index ed684a53e79..ce0297cbe9d 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/SteamHatchPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/SteamHatchPartMachine.java @@ -2,9 +2,8 @@ import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.recipe.IO; -import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableFluidTank; import com.gregtechceu.gtceu.common.data.GTMaterials; -import com.gregtechceu.gtceu.config.ConfigHolder; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraftforge.fluids.FluidType; @@ -16,35 +15,14 @@ public class SteamHatchPartMachine extends FluidHatchPartMachine { public static final int INITIAL_TANK_CAPACITY = 64 * FluidType.BUCKET_VOLUME; - public static final boolean IS_STEEL = ConfigHolder.INSTANCE.machines.steelSteamMultiblocks; public SteamHatchPartMachine(BlockEntityCreationInfo info) { - super(info, 0, IO.IN, SteamHatchPartMachine.INITIAL_TANK_CAPACITY, 1); - } + super(info, 0, IO.IN, new NotifiableFluidTank(1, INITIAL_TANK_CAPACITY, IO.IN)); - @Override - protected NotifiableFluidTank createTank(int initialCapacity, int slots) { - return super.createTank(initialCapacity, slots) - .setFilter(fluidStack -> fluidStack.getFluid().is(GTMaterials.Steam.getFluidTag())); + tank.setFilter(fluidStack -> fluidStack.getFluid().is(GTMaterials.Steam.getFluidTag())); + circuitSlot.setEnabled(false); } - /* - * @Override - * public ModularUI createUI(Player entityPlayer) { - * return new ModularUI(176, 166, this, entityPlayer) - * .background(GuiTextures.BACKGROUND_STEAM.get(IS_STEEL)) - * .widget(new ImageWidget(7, 16, 81, 55, GuiTextures.DISPLAY_STEAM.get(IS_STEEL))) - * .widget(new LabelWidget(11, 20, "gtceu.gui.fluid_amount")) - * .widget(new LabelWidget(11, 30, () -> tank.getFluidInTank(0).getAmount() + "").setTextColor(-1) - * .setDropShadow(true)) - * .widget(new LabelWidget(6, 6, getBlockState().getBlock().getDescriptionId())) - * .widget(new TankWidget(tank.getStorages()[0], 90, 35, true, true) - * .setBackground(GuiTextures.FLUID_SLOT)) - * .widget(UITemplate.bindPlayerInventory(entityPlayer.getInventory(), - * GuiTextures.SLOT_STEAM.get(IS_STEEL), 7, 84, true)); - * } - */ - // By returning false here, we don't allow shift-clicking // with a screwdriver to swap the IO, since this is a // hatch that only allows steam in, not @@ -53,9 +31,4 @@ protected NotifiableFluidTank createTank(int initialCapacity, int slots) { public boolean swapIO() { return false; } - - @Override - public boolean isCircuitSlotEnabled() { - return false; - } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/SteamItemBusPartMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/SteamItemBusPartMachine.java index b0babdf61d0..c0075572bc8 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/SteamItemBusPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/SteamItemBusPartMachine.java @@ -10,11 +10,9 @@ public class SteamItemBusPartMachine extends ItemBusPartMachine { - private final String autoTooltipKey; - public SteamItemBusPartMachine(BlockEntityCreationInfo info, IO io) { super(info, 1, io); - autoTooltipKey = io == IO.IN ? "gtceu.gui.item_auto_input.tooltip" : "gtceu.gui.item_auto_output.tooltip"; + circuitSlot.setEnabled(false); } @Override @@ -42,9 +40,4 @@ public boolean swapIO() { } return true; } - - @Override - public boolean isCircuitSlotEnabled() { - return false; - } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/hpca/HPCABridgePartMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/hpca/HPCABridgePartMachine.java deleted file mode 100644 index 0faf181fb67..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/hpca/HPCABridgePartMachine.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.gregtechceu.gtceu.common.machine.multiblock.part.hpca; - -import com.gregtechceu.gtceu.api.GTValues; -import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; -import com.gregtechceu.gtceu.common.machine.trait.hpca.HPCAComponentTrait; -import com.gregtechceu.gtceu.common.mui.GTGuiTextures; - -import net.minecraft.MethodsReturnNonnullByDefault; - -import brachy.modularui.api.drawable.IDrawable; - -import javax.annotation.ParametersAreNonnullByDefault; - -@MethodsReturnNonnullByDefault -@ParametersAreNonnullByDefault -public class HPCABridgePartMachine extends HPCAComponentPartMachine { - - public HPCABridgePartMachine(BlockEntityCreationInfo info) { - super(info, new HPCAComponentTrait(GTValues.VA[GTValues.IV], GTValues.VA[GTValues.IV], false, true)); - } - - @Override - public boolean isAdvanced() { - return true; - } - - @Override - public IDrawable getComponentIcon() { - return GTGuiTextures.HPCA_BRIDGE_COMPONENT; - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/hpca/HPCAComponentPartMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/hpca/HPCAComponentPartMachine.java index 5abcd6b1345..b771c1aa115 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/hpca/HPCAComponentPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/hpca/HPCAComponentPartMachine.java @@ -1,10 +1,13 @@ package com.gregtechceu.gtceu.common.machine.multiblock.part.hpca; +import com.gregtechceu.gtceu.api.GTValues; import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; import com.gregtechceu.gtceu.api.machine.multiblock.part.MultiblockPartMachine; import com.gregtechceu.gtceu.common.data.GTBlocks; import com.gregtechceu.gtceu.common.machine.trait.hpca.HPCAComponentTrait; +import com.gregtechceu.gtceu.common.machine.trait.hpca.HPCAComputationProviderTrait; +import com.gregtechceu.gtceu.common.machine.trait.hpca.HPCACoolantProviderTrait; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.world.item.ItemStack; @@ -18,20 +21,44 @@ @MethodsReturnNonnullByDefault @ParametersAreNonnullByDefault -public abstract class HPCAComponentPartMachine extends MultiblockPartMachine { +public class HPCAComponentPartMachine extends MultiblockPartMachine { @Getter protected final HPCAComponentTrait hpcaComponentTrait; + @Getter + protected final boolean isAdvanced; + protected final IDrawable componentIcon; + protected final IDrawable damagedComponentIcon; - public HPCAComponentPartMachine(BlockEntityCreationInfo info, + public HPCAComponentPartMachine(BlockEntityCreationInfo info, boolean isAdvanced, IDrawable hpcaComponentIcon, + IDrawable hpcaComponentIconDamaged, HPCAComponentTrait hpcaTrait) { super(info); + this.isAdvanced = isAdvanced; + this.componentIcon = hpcaComponentIcon; + this.damagedComponentIcon = hpcaComponentIconDamaged; this.hpcaComponentTrait = attachTrait(hpcaTrait); } - public abstract boolean isAdvanced(); + public static HPCAComputationProviderTrait createHPCAComputationTrait(boolean isAdvanced) { + int upkeepEUt = GTValues.VA[isAdvanced ? GTValues.IV : GTValues.EV]; + int maxEUt = GTValues.VA[isAdvanced ? GTValues.ZPM : GTValues.LuV]; + int cooling = isAdvanced ? 4 : 2; + int cwu = isAdvanced ? 16 : 4; + return new HPCAComputationProviderTrait(upkeepEUt, maxEUt, true, false, cwu, cooling); + } - public abstract IDrawable getComponentIcon(); + public static HPCAComponentTrait createHPCACoolerTrait(boolean isAdvanced) { + int upkeepEU = isAdvanced ? GTValues.VA[GTValues.IV] : 0; + int coolingAmount = isAdvanced ? 2 : 1; + int maxCoolant = isAdvanced ? 8 : 0; + return new HPCACoolantProviderTrait(upkeepEU, upkeepEU, false, false, coolingAmount, maxCoolant, + isAdvanced); + } + + public IDrawable getComponentIcon() { + return hpcaComponentTrait.isDamaged() ? damagedComponentIcon : componentIcon; + } @Override public int getDefaultPaintingColor() { diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/hpca/HPCAComputationPartMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/hpca/HPCAComputationPartMachine.java deleted file mode 100644 index c4c12d679e3..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/hpca/HPCAComputationPartMachine.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.gregtechceu.gtceu.common.machine.multiblock.part.hpca; - -import com.gregtechceu.gtceu.api.GTValues; -import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; -import com.gregtechceu.gtceu.common.machine.trait.hpca.HPCAComponentTrait; -import com.gregtechceu.gtceu.common.machine.trait.hpca.HPCAComputationProviderTrait; -import com.gregtechceu.gtceu.common.mui.GTGuiTextures; - -import net.minecraft.MethodsReturnNonnullByDefault; - -import brachy.modularui.api.drawable.IDrawable; -import lombok.Getter; - -import javax.annotation.ParametersAreNonnullByDefault; - -@MethodsReturnNonnullByDefault -@ParametersAreNonnullByDefault -public class HPCAComputationPartMachine extends HPCAComponentPartMachine { - - @Getter - private final boolean advanced; - - public HPCAComputationPartMachine(BlockEntityCreationInfo info, boolean advanced) { - super(info, createHPCATrait(advanced)); - this.advanced = advanced; - } - - public static HPCAComponentTrait createHPCATrait(boolean isAdvanced) { - int upkeepEUt = GTValues.VA[isAdvanced ? GTValues.IV : GTValues.EV]; - int maxEUt = GTValues.VA[isAdvanced ? GTValues.ZPM : GTValues.LuV]; - int cooling = isAdvanced ? 4 : 2; - int cwu = isAdvanced ? 16 : 4; - return new HPCAComputationProviderTrait(upkeepEUt, maxEUt, true, false, cwu, cooling); - } - - @Override - public IDrawable getComponentIcon() { - if (hpcaComponentTrait.isDamaged()) { - return advanced ? GTGuiTextures.HPCA_DAMAGED_ADVANCED_COMPUTATION_COMPONENT : - GTGuiTextures.HPCA_DAMAGED_COMPUTATION_COMPONENT; - } - return advanced ? GTGuiTextures.HPCA_ADVANCED_COMPUTATION_COMPONENT : - GTGuiTextures.HPCA_COMPUTATION_COMPONENT; - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/hpca/HPCACoolerPartMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/hpca/HPCACoolerPartMachine.java deleted file mode 100644 index 87bd24e861f..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/hpca/HPCACoolerPartMachine.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.gregtechceu.gtceu.common.machine.multiblock.part.hpca; - -import com.gregtechceu.gtceu.api.GTValues; -import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; -import com.gregtechceu.gtceu.common.machine.trait.hpca.HPCAComponentTrait; -import com.gregtechceu.gtceu.common.machine.trait.hpca.HPCACoolantProviderTrait; -import com.gregtechceu.gtceu.common.mui.GTGuiTextures; - -import net.minecraft.MethodsReturnNonnullByDefault; - -import brachy.modularui.api.drawable.IDrawable; -import lombok.Getter; - -import javax.annotation.ParametersAreNonnullByDefault; - -@MethodsReturnNonnullByDefault -@ParametersAreNonnullByDefault -public class HPCACoolerPartMachine extends HPCAComponentPartMachine { - - @Getter - private final boolean advanced; - - public HPCACoolerPartMachine(BlockEntityCreationInfo info, boolean advanced) { - super(info, createHPCATrait(advanced)); - this.advanced = advanced; - } - - public static HPCAComponentTrait createHPCATrait(boolean isAdvanced) { - int upkeepEU = isAdvanced ? GTValues.VA[GTValues.IV] : 0; - int coolingAmount = isAdvanced ? 2 : 1; - int maxCoolant = isAdvanced ? 8 : 0; - return new HPCACoolantProviderTrait(upkeepEU, upkeepEU, false, false, coolingAmount, maxCoolant, - isAdvanced); - } - - @Override - public IDrawable getComponentIcon() { - return advanced ? GTGuiTextures.HPCA_ACTIVE_COOLER_COMPONENT : GTGuiTextures.HPCA_HEAT_SINK_COMPONENT; - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/hpca/HPCAEmptyPartMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/hpca/HPCAEmptyPartMachine.java deleted file mode 100644 index 543fa4a166b..00000000000 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/part/hpca/HPCAEmptyPartMachine.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.gregtechceu.gtceu.common.machine.multiblock.part.hpca; - -import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; -import com.gregtechceu.gtceu.common.machine.trait.hpca.HPCAComponentTrait; -import com.gregtechceu.gtceu.common.mui.GTGuiTextures; - -import net.minecraft.MethodsReturnNonnullByDefault; - -import brachy.modularui.api.drawable.IDrawable; - -import javax.annotation.ParametersAreNonnullByDefault; - -@MethodsReturnNonnullByDefault -@ParametersAreNonnullByDefault -public class HPCAEmptyPartMachine extends HPCAComponentPartMachine { - - public HPCAEmptyPartMachine(BlockEntityCreationInfo info) { - super(info, new HPCAComponentTrait(0, 0, false, false)); - } - - @Override - public boolean isAdvanced() { - return false; - } - - @Override - public IDrawable getComponentIcon() { - return GTGuiTextures.HPCA_EMPTY_COMPONENT; - } -} diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/primitive/CharcoalPileIgniterMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/primitive/CharcoalPileIgniterMachine.java index 00c76bd2b00..93f18d17715 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/primitive/CharcoalPileIgniterMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/primitive/CharcoalPileIgniterMachine.java @@ -6,7 +6,7 @@ import com.gregtechceu.gtceu.api.item.ComponentItem; import com.gregtechceu.gtceu.api.machine.MultiblockMachineDefinition; import com.gregtechceu.gtceu.api.machine.multiblock.WorkableMultiblockMachine; -import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeLogic; import com.gregtechceu.gtceu.api.multiblock.PatternPredicate; import com.gregtechceu.gtceu.api.multiblock.Predicates; import com.gregtechceu.gtceu.api.multiblock.error.PatternStringError; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/primitive/CokeOvenMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/primitive/CokeOvenMachine.java index 1c85d044272..0fcde6f21d0 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/primitive/CokeOvenMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/primitive/CokeOvenMachine.java @@ -61,10 +61,7 @@ public void buildMainUI(ParentWidget mainWidget, PosGuiData guiData, PanelSyn ITheme uiTheme = ThemeAPI.INSTANCE.getTheme(getDefinition().getThemeId()); DoubleSyncValue progressPercent = syncManager.getOrCreateSyncHandler("progressPercent", DoubleSyncValue.class, - () -> new DoubleSyncValue(() -> { - if (recipeLogic == null) return -1f; - return recipeLogic.getProgressPercent(); - })); + () -> new DoubleSyncValue(recipeLogic::getProgressPercent)); Flow row = Flow.row().coverChildren(); diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/primitive/PrimitiveBlastFurnaceMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/primitive/PrimitiveBlastFurnaceMachine.java index 65bef24f996..bb9dc33836c 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/primitive/PrimitiveBlastFurnaceMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/primitive/PrimitiveBlastFurnaceMachine.java @@ -2,13 +2,10 @@ import com.gregtechceu.gtceu.api.GTValues; import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; -import com.gregtechceu.gtceu.api.capability.recipe.IO; -import com.gregtechceu.gtceu.api.capability.recipe.ItemRecipeCapability; import com.gregtechceu.gtceu.api.machine.TickableSubscription; import com.gregtechceu.gtceu.api.machine.feature.IMuiMachine; import com.gregtechceu.gtceu.api.machine.mui.MachineUIPanelBuilder; -import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; -import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeLogic; import com.gregtechceu.gtceu.api.multiblock.util.RelativeDirection; import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; @@ -73,18 +70,6 @@ public PrimitiveBlastFurnaceMachine(BlockEntityCreationInfo info) { fluidRendererTrait = attachTrait(new MultiblockFluidRendererTrait(this::saveOffsets)); } - @Override - protected NotifiableItemStackHandler createImportItemHandler() { - return new NotifiableItemStackHandler(getRecipeType().getMaxInputs(ItemRecipeCapability.CAP), IO.IN, - IO.NONE); - } - - @Override - protected NotifiableItemStackHandler createExportItemHandler() { - return new NotifiableItemStackHandler(getRecipeType().getMaxOutputs(ItemRecipeCapability.CAP), IO.OUT, - IO.NONE); - } - @Override public void onUnload() { super.onUnload(); @@ -93,8 +78,8 @@ public void onUnload() { } @Override - public void notifyStatusChanged(RecipeLogic.Status oldStatus, RecipeLogic.Status newStatus) { - super.notifyStatusChanged(oldStatus, newStatus); + public void recipeLogicStatusChanged(RecipeLogic.Status oldStatus, RecipeLogic.Status newStatus) { + super.recipeLogicStatusChanged(oldStatus, newStatus); if (newStatus == RecipeLogic.Status.WORKING) { this.hurtSubscription = subscribeServerTick(this.hurtSubscription, this::hurtEntitiesAndBreakSnow); } else if (oldStatus == RecipeLogic.Status.WORKING && hurtSubscription != null) { @@ -254,7 +239,7 @@ public void animateTick(RandomSource random) { } private void hurtEntitiesAndBreakSnow() { - BlockPos middlePos = self().getBlockPos().offset(getFrontFacing().getOpposite().getNormal()); + BlockPos middlePos = getBlockPos().offset(getFrontFacing().getOpposite().getNormal()); getLevel().getEntities(null, new AABB(middlePos)).forEach(e -> e.hurt(e.damageSources().lava(), 3.0f)); if (getOffsetTimer() % 10 == 0) { diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/primitive/PrimitivePumpMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/primitive/PrimitivePumpMachine.java index cea6edc03c7..4a1fbc9c000 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/primitive/PrimitivePumpMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/primitive/PrimitivePumpMachine.java @@ -4,9 +4,9 @@ import com.gregtechceu.gtceu.api.capability.recipe.FluidRecipeCapability; import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.machine.TickableSubscription; -import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; -import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; +import com.gregtechceu.gtceu.api.machine.multiblock.part.MultiblockPartMachine; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableFluidTank; import com.gregtechceu.gtceu.api.recipe.ingredient.FluidIngredient; import com.gregtechceu.gtceu.common.data.GTMaterials; import com.gregtechceu.gtceu.utils.GTUtil; @@ -42,7 +42,7 @@ public void formStructure(@NotNull String name) { } private void initializeTank() { - for (IMultiPart part : getParts()) { + for (MultiblockPartMachine part : getParts()) { var handlerLists = part.getRecipeHandlers(); for (var handlerList : handlerLists) { diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/primitive/PrimitiveWorkableMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/primitive/PrimitiveWorkableMachine.java index 16c6e40d80a..3f71b290289 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/primitive/PrimitiveWorkableMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/primitive/PrimitiveWorkableMachine.java @@ -4,9 +4,11 @@ import com.gregtechceu.gtceu.api.capability.recipe.FluidRecipeCapability; import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.capability.recipe.ItemRecipeCapability; +import com.gregtechceu.gtceu.api.machine.WorkableTieredMachine; import com.gregtechceu.gtceu.api.machine.multiblock.WorkableMultiblockMachine; -import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; -import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableFluidTank; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableItemStackHandler; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeLogic; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.common.data.GTMedicalConditions; import com.gregtechceu.gtceu.common.machine.trait.hazard.EnvironmentalHazardEmitterTrait; @@ -34,42 +36,50 @@ public class PrimitiveWorkableMachine extends WorkableMultiblockMachine { @Getter private final EnvironmentalHazardEmitterTrait hazardEmitter; - public PrimitiveWorkableMachine(BlockEntityCreationInfo info) { - super(info); - this.importItems = attachTrait(createImportItemHandler()); - this.exportItems = attachTrait(createExportItemHandler()); - this.importFluids = attachTrait(createImportFluidHandler()); - this.exportFluids = attachTrait(createExportFluidHandler()); + /** + * Creates a {@link PrimitiveWorkableMachine}. + * + * @param info {@link BlockEntityCreationInfo} + * @param recipeLogic The recipe logic to use. + * @param importSlots The amount of item input slots this machine should have (can be 0). + * @param exportSlots The amount of item output slots this machine should have (can be 0). + * @param fluidImportSlots The amount of fluid input slots this machine should have (can be 0). + * @param fluidExportSlots The amount of fluid output slots this machine should have (can be 0). + * @param tankCapacity The fluid tank capacity. + */ + public PrimitiveWorkableMachine(BlockEntityCreationInfo info, RecipeLogic recipeLogic, int importSlots, + int exportSlots, + int fluidImportSlots, int fluidExportSlots, + int tankCapacity) { + super(info, recipeLogic); + this.importItems = attachTrait(new NotifiableItemStackHandler(importSlots, IO.IN, IO.BOTH)); + this.exportItems = attachTrait(new NotifiableItemStackHandler(exportSlots, IO.OUT)); + this.importFluids = attachTrait(new NotifiableFluidTank(fluidImportSlots, tankCapacity, IO.IN, IO.BOTH)); + this.exportFluids = attachTrait(new NotifiableFluidTank(fluidExportSlots, tankCapacity, IO.OUT)); this.hazardEmitter = attachTrait( new EnvironmentalHazardEmitterTrait(GTMedicalConditions.CARBON_MONOXIDE_POISONING, 0.1f)); } - ////////////////////////////////////// - // ***** Initialization ******// - ////////////////////////////////////// - - protected NotifiableItemStackHandler createImportItemHandler() { - return new NotifiableItemStackHandler(getRecipeType().getMaxInputs(ItemRecipeCapability.CAP), IO.IN); - } - - protected NotifiableItemStackHandler createExportItemHandler() { - return new NotifiableItemStackHandler(getRecipeType().getMaxOutputs(ItemRecipeCapability.CAP), IO.OUT); - } - - protected NotifiableFluidTank createImportFluidHandler() { - return new NotifiableFluidTank(getRecipeType().getMaxInputs(FluidRecipeCapability.CAP), - 32 * FluidType.BUCKET_VOLUME, IO.IN); - } - - protected NotifiableFluidTank createExportFluidHandler() { - return new NotifiableFluidTank(getRecipeType().getMaxOutputs(FluidRecipeCapability.CAP), - 32 * FluidType.BUCKET_VOLUME, IO.OUT); - } - - @Override - public void afterWorking() { - super.afterWorking(); - hazardEmitter.emitHazard(); + /** + * Creates a {@link WorkableTieredMachine} with default settings.
+ * The amount of item and fluid input and output slots is determined by the machine's recipe type. + * + * @param info {@link BlockEntityCreationInfo} + */ + public PrimitiveWorkableMachine(BlockEntityCreationInfo info) { + super(info); + this.importItems = attachTrait( + new NotifiableItemStackHandler(getRecipeType().getMaxInputs(ItemRecipeCapability.CAP), IO.IN)); + this.exportItems = attachTrait( + new NotifiableItemStackHandler(getRecipeType().getMaxOutputs(ItemRecipeCapability.CAP), IO.OUT)); + this.importFluids = attachTrait(new NotifiableFluidTank(getRecipeType().getMaxInputs(FluidRecipeCapability.CAP), + 32 * FluidType.BUCKET_VOLUME, IO.IN)); + this.exportFluids = attachTrait( + new NotifiableFluidTank(getRecipeType().getMaxOutputs(FluidRecipeCapability.CAP), + 32 * FluidType.BUCKET_VOLUME, IO.OUT)); + this.hazardEmitter = attachTrait( + new EnvironmentalHazardEmitterTrait(GTMedicalConditions.CARBON_MONOXIDE_POISONING, + 0.1f)); } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/steam/LargeBoilerMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/steam/LargeBoilerMachine.java index 7bb4116c737..1305d2d917a 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/steam/LargeBoilerMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/steam/LargeBoilerMachine.java @@ -8,7 +8,7 @@ import com.gregtechceu.gtceu.api.machine.feature.IMuiMachine; import com.gregtechceu.gtceu.api.machine.feature.IVoidable; import com.gregtechceu.gtceu.api.machine.multiblock.WorkableMultiblockMachine; -import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeLogic; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.ingredient.FluidIngredient; import com.gregtechceu.gtceu.api.recipe.modifier.ModifierFunction; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/steam/SteamParallelMultiblockMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/steam/SteamParallelMultiblockMachine.java index c493361682f..3399382265c 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/steam/SteamParallelMultiblockMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/multiblock/steam/SteamParallelMultiblockMachine.java @@ -9,8 +9,8 @@ import com.gregtechceu.gtceu.api.machine.multiblock.PartAbility; import com.gregtechceu.gtceu.api.machine.multiblock.WorkableMultiblockMachine; import com.gregtechceu.gtceu.api.machine.steam.SteamEnergyRecipeHandler; -import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; -import com.gregtechceu.gtceu.api.machine.trait.RecipeHandlerList; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableFluidTank; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeHandlerList; import com.gregtechceu.gtceu.api.multiblock.error.PatternStringError; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.RecipeHelper; @@ -36,7 +36,6 @@ import brachy.modularui.widgets.ListWidget; import lombok.Getter; import lombok.Setter; -import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import javax.annotation.ParametersAreNonnullByDefault; @@ -72,7 +71,7 @@ public void invalidateStructure(String name) { } @Override - public void formStructure(@NotNull String substructureName) { + public void formStructure(String substructureName) { super.formStructure(substructureName); var pState = patternStates.get(substructureName); for (var part : getParts()) { diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/steam/SteamLiquidBoilerMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/steam/SteamLiquidBoilerMachine.java index 63fbae3a930..d169c11c31d 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/steam/SteamLiquidBoilerMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/steam/SteamLiquidBoilerMachine.java @@ -4,7 +4,7 @@ import com.gregtechceu.gtceu.api.capability.recipe.FluidRecipeCapability; import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.machine.steam.SteamBoilerMachine; -import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableFluidTank; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.common.mui.GTGuiTextures; import com.gregtechceu.gtceu.config.ConfigHolder; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/steam/SteamMinerMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/steam/SteamMinerMachine.java index ab74fb2d6b8..98b43acf5af 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/steam/SteamMinerMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/steam/SteamMinerMachine.java @@ -8,7 +8,7 @@ import com.gregtechceu.gtceu.api.machine.feature.*; import com.gregtechceu.gtceu.api.machine.mui.MachineUIPanelBuilder; import com.gregtechceu.gtceu.api.machine.steam.SteamWorkableMachine; -import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableItemStackHandler; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.common.item.behavior.PortableScannerBehavior; import com.gregtechceu.gtceu.common.machine.trait.ExhaustVentMachineTrait; @@ -72,8 +72,8 @@ public SteamMinerMachine(BlockEntityCreationInfo info, boolean isHighPressure, i this.inventorySize = 4; this.energyPerTick = energyPerTick; - this.importItems = attachTrait(createImportItemHandler()); - this.exportItems = attachTrait(createExportItemHandler()); + this.importItems = attachTrait(new NotifiableItemStackHandler(0, IO.IN)); + this.exportItems = attachTrait(new NotifiableItemStackHandler(inventorySize, IO.OUT)); this.exhaustVentTrait = attachTrait(new ExhaustVentMachineTrait()); exhaustVentTrait.setVentingDirection(Direction.UP); exhaustVentTrait.setVentingDamageAmount(isHighPressure() ? 12F : 6F); @@ -85,14 +85,6 @@ public SteamMinerLogic getRecipeLogic() { return (SteamMinerLogic) super.getRecipeLogic(); } - protected NotifiableItemStackHandler createImportItemHandler() { - return new NotifiableItemStackHandler(0, IO.IN); - } - - protected NotifiableItemStackHandler createExportItemHandler() { - return new NotifiableItemStackHandler(inventorySize, IO.OUT); - } - @Override public void onNeighborChanged(Block block, BlockPos fromPos, boolean isMoving) { super.onNeighborChanged(block, fromPos, isMoving); diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/steam/SteamSolarBoiler.java b/src/main/java/com/gregtechceu/gtceu/common/machine/steam/SteamSolarBoiler.java index 82fb6c3b668..bb58d1bf296 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/steam/SteamSolarBoiler.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/steam/SteamSolarBoiler.java @@ -2,7 +2,7 @@ import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.machine.steam.SteamBoilerMachine; -import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeLogic; import com.gregtechceu.gtceu.common.mui.GTGuiTextures; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.utils.GTUtil; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/steam/SteamSolidBoilerMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/steam/SteamSolidBoilerMachine.java index b7ea4f2f473..5c2a1960652 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/steam/SteamSolidBoilerMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/steam/SteamSolidBoilerMachine.java @@ -7,7 +7,7 @@ import com.gregtechceu.gtceu.api.data.chemical.ChemicalHelper; import com.gregtechceu.gtceu.api.data.tag.TagPrefix; import com.gregtechceu.gtceu.api.machine.steam.SteamBoilerMachine; -import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableItemStackHandler; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.common.data.GTMaterials; import com.gregtechceu.gtceu.common.mui.GTGuiTextures; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/BufferMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/BufferMachine.java index 23f93c7517e..ddb811b4418 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/BufferMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/BufferMachine.java @@ -4,8 +4,8 @@ import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.machine.TieredMachine; import com.gregtechceu.gtceu.api.machine.feature.IMuiMachine; -import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; -import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableFluidTank; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableItemStackHandler; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.common.machine.trait.AutoOutputTrait; @@ -37,7 +37,6 @@ public class BufferMachine extends TieredMachine implements IMuiMachine { protected final NotifiableFluidTank tank; @SaveField @SyncToClient - public final AutoOutputTrait autoOutput; public BufferMachine(BlockEntityCreationInfo info, int tier) { diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CrateMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CrateMachine.java index a58e2e150a3..733a824484c 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CrateMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CrateMachine.java @@ -7,7 +7,7 @@ import com.gregtechceu.gtceu.api.machine.feature.*; import com.gregtechceu.gtceu.api.machine.mui.MachineUIPanelBuilder; import com.gregtechceu.gtceu.api.machine.property.GTMachineModelProperties; -import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableItemStackHandler; import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; @@ -27,8 +27,7 @@ import brachy.modularui.widgets.slot.ItemSlot; import lombok.Getter; -public class CrateMachine extends MetaMachine implements IMuiMachine, - IDropSaveMachine { +public class CrateMachine extends MetaMachine implements IMuiMachine { @Getter private final Material material; @@ -105,8 +104,8 @@ public InteractionResult onUseWithItem(ExtendedUseOnContext context) { } @Override - public void saveToItem(CompoundTag tag) { - if (isTaped) tag.put("inventory", inventory.storage.serializeNBT()); + public void saveToItem(CompoundTag tag, boolean clone) { + if (isTaped && !clone) tag.put("inventory", inventory.storage.serializeNBT()); } @Override @@ -115,9 +114,4 @@ public void loadFromItem(CompoundTag tag) { this.inventory.storage.deserializeNBT(tag.getCompound("inventory")); } } - - @Override - public boolean saveBreak() { - return isTaped; - } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CreativeChestMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CreativeChestMachine.java index 2b00a9aea46..f55af986048 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CreativeChestMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CreativeChestMachine.java @@ -68,7 +68,7 @@ private void setItemsPerCycle(int value) { } @Override - public void saveToItem(CompoundTag tag) { + public void saveToItem(CompoundTag tag, boolean clone) { tag.putInt("itemsPerCycle", itemsPerCycle); tag.putInt("ticksPerCycle", ticksPerCycle); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CreativeTankMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CreativeTankMachine.java index 2c32a039a74..dc802193928 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CreativeTankMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/CreativeTankMachine.java @@ -74,7 +74,7 @@ private void setmBPerCycle(int value) { } @Override - public void saveToItem(CompoundTag tag) { + public void saveToItem(CompoundTag tag, boolean clone) { tag.putInt("mBPerCycle", mBPerCycle); tag.putInt("ticksPerCycle", ticksPerCycle); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/DrumMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/DrumMachine.java index f9e3dded3ec..e673374858c 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/DrumMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/DrumMachine.java @@ -5,8 +5,7 @@ import com.gregtechceu.gtceu.api.data.chemical.material.Material; import com.gregtechceu.gtceu.api.data.chemical.material.properties.PropertyKey; import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.api.machine.feature.IDropSaveMachine; -import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableFluidTank; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.common.machine.trait.AutoOutputTrait; @@ -29,7 +28,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault -public class DrumMachine extends MetaMachine implements IDropSaveMachine { +public class DrumMachine extends MetaMachine { @Getter private final int maxStoredFluids; @@ -96,7 +95,8 @@ public void onUnload() { ////////////////////////////////////// @Override - public void saveToItem(CompoundTag tag) { + public void saveToItem(CompoundTag tag, boolean clone) { + if (clone || stored.isEmpty()) return; tag.put("Fluid", stored.writeToNBT(new CompoundTag())); } @@ -109,11 +109,6 @@ public void loadFromItem(CompoundTag tag) { cache.getStorages()[0].setFluid(stored.copy()); } - @Override - public boolean savePickClone() { - return false; - } - @Override public InteractionResult onUseWithItem(ExtendedUseOnContext context) { if (!isRemote()) { @@ -129,9 +124,4 @@ protected InteractionResult onScrewdriverClick(ExtendedUseOnContext context) { autoOutput.setAllowAutoOutputItems(!autoOutput.isAutoOutputItems()); return InteractionResult.SUCCESS; } - - @Override - public boolean saveBreak() { - return !stored.isEmpty(); - } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumChestMachine.java b/src/main/java/com/gregtechceu/gtceu/common/machine/storage/QuantumChestMachine.java index a758496f203..5bcff46d657 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 @@ -5,7 +5,6 @@ import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.item.tool.GTToolType; import com.gregtechceu.gtceu.api.machine.TieredMachine; -import com.gregtechceu.gtceu.api.machine.feature.IDropSaveMachine; import com.gregtechceu.gtceu.api.machine.feature.IMuiMachine; import com.gregtechceu.gtceu.api.machine.trait.MachineTrait; import com.gregtechceu.gtceu.api.machine.trait.MachineTraitType; @@ -55,7 +54,7 @@ import java.util.function.Predicate; public class QuantumChestMachine extends TieredMachine implements IControllable, - IDropSaveMachine, IMuiMachine { + IMuiMachine { /** * Sourced from FunctionalStorage's @@ -114,17 +113,8 @@ protected void onItemChanged() { } @Override - public boolean savePickClone() { - return false; - } - - @Override - public boolean saveBreak() { - return !stored.isEmpty(); - } - - @Override - public void saveToItem(CompoundTag tag) { + public void saveToItem(CompoundTag tag, boolean clone) { + if (clone || stored.isEmpty()) return; tag.put("stored", stored.save(new CompoundTag())); tag.putLong("storedAmount", storedAmount); } @@ -307,11 +297,11 @@ private IWidget createPhantomLockeditemSlot(PanelSyncManager syncManager) { ////////////////////////////////////// @Override public @Nullable UITexture sideTips(Player player, BlockPos pos, BlockState state, Set toolTypes, - Direction side) { + ItemStack held, Direction side) { if (toolTypes.contains(GTToolType.SOFT_MALLET)) { if (side == getFrontFacing()) return null; } - return super.sideTips(player, pos, state, toolTypes, side); + return super.sideTips(player, pos, state, toolTypes, held, side); } protected class ItemCache extends MachineTrait implements IItemHandlerModifiable { 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 57e405f6ce6..582841974a5 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 @@ -4,7 +4,6 @@ import com.gregtechceu.gtceu.api.capability.IControllable; import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.machine.*; -import com.gregtechceu.gtceu.api.machine.feature.IDropSaveMachine; import com.gregtechceu.gtceu.api.machine.feature.IMuiMachine; import com.gregtechceu.gtceu.api.machine.trait.MachineTrait; import com.gregtechceu.gtceu.api.machine.trait.MachineTraitType; @@ -51,7 +50,7 @@ import java.util.function.Predicate; public class QuantumTankMachine extends TieredMachine implements IControllable, - IDropSaveMachine, IMuiMachine { + IMuiMachine { public static Object2LongMap TANK_CAPACITY = new Object2LongArrayMap<>(); @@ -108,16 +107,6 @@ protected void onFluidChanged() { } } - @Override - public boolean savePickClone() { - return false; - } - - @Override - public boolean saveBreak() { - return !stored.isEmpty(); - } - ////////////////////////////////////// // ****** Capability ********// ////////////////////////////////////// @@ -188,7 +177,8 @@ public FluidStack getLockedFluid() { } @Override - public void saveToItem(CompoundTag tag) { + public void saveToItem(CompoundTag tag, boolean clone) { + if (clone || stored.isEmpty()) return; tag.put("stored", stored.writeToNBT(new CompoundTag())); tag.putLong("storedAmount", storedAmount); } diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/trait/AutoOutputTrait.java b/src/main/java/com/gregtechceu/gtceu/common/machine/trait/AutoOutputTrait.java index 1a9cb3d5aa8..186bd33a9f1 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/trait/AutoOutputTrait.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/trait/AutoOutputTrait.java @@ -8,6 +8,8 @@ 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.machine.trait.notifiable.NotifiableFluidTank; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableItemStackHandler; import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; @@ -46,6 +48,9 @@ import static com.gregtechceu.gtceu.api.item.tool.ToolHelper.getBehaviorsTag; +/** + * A machine trait which handles the auto output behaviour that most singleblock machines use. + */ public class AutoOutputTrait extends MachineTrait implements IRenderingTrait, IInteractionTrait, IFrontFacingTrait, IAttachConfiguratorsTrait { @@ -233,18 +238,14 @@ public void setItemOutputDirection(@Nullable Direction outputFacing) { private boolean shouldKeepItemSubscription() { if (!supportsAutoOutputItems()) return false; - if (!isAutoOutputItems() || getItemOutputDirection() == null || - !GTTransferUtils.hasAdjacentItemHandler(getLevel(), getBlockPos(), getItemOutputDirection())) - return false; - return true; + return isAutoOutputItems() && getItemOutputDirection() != null && + GTTransferUtils.hasAdjacentItemHandler(getLevel(), getBlockPos(), getItemOutputDirection()); } private boolean shouldKeepFluidSubscription() { if (!supportsAutoOutputFluids()) return false; - if (!isAutoOutputFluids() || getFluidOutputDirection() == null || - !GTTransferUtils.hasAdjacentFluidHandler(getLevel(), getBlockPos(), getFluidOutputDirection())) - return false; - return true; + return isAutoOutputFluids() && getFluidOutputDirection() != null && + GTTransferUtils.hasAdjacentFluidHandler(getLevel(), getBlockPos(), getFluidOutputDirection()); } protected void updateItemOutputSubscription() { @@ -312,7 +313,7 @@ public void attachRightConfigurators(Flow flow, ModularPanel panel, PanelSync @Override public @Nullable UITexture getGridOverlayIcon(Player player, BlockPos pos, BlockState state, - Set toolTypes, Direction side) { + Set toolTypes, ItemStack held, Direction side) { if (toolTypes.contains(GTToolType.WRENCH)) { if (!player.isShiftKeyDown()) { if (!getMachine().hasFrontFacing() || side != getMachine().getFrontFacing()) { diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/trait/BatterySlotTrait.java b/src/main/java/com/gregtechceu/gtceu/common/machine/trait/BatterySlotTrait.java new file mode 100644 index 00000000000..87075457557 --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/trait/BatterySlotTrait.java @@ -0,0 +1,97 @@ +package com.gregtechceu.gtceu.common.machine.trait; + +import com.gregtechceu.gtceu.api.capability.GTCapabilityHelper; +import com.gregtechceu.gtceu.api.machine.TickableSubscription; +import com.gregtechceu.gtceu.api.machine.trait.MachineTrait; +import com.gregtechceu.gtceu.api.machine.trait.MachineTraitType; +import com.gregtechceu.gtceu.api.machine.trait.feature.IAttachConfiguratorsTrait; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableEnergyContainer; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; +import com.gregtechceu.gtceu.common.mui.GTMuiWidgets; +import com.gregtechceu.gtceu.config.ConfigHolder; +import com.gregtechceu.gtceu.utils.ISubscription; + +import brachy.modularui.screen.ModularPanel; +import brachy.modularui.value.sync.PanelSyncManager; +import brachy.modularui.widgets.layout.Flow; +import lombok.Getter; +import org.jetbrains.annotations.Nullable; + +/** + * Machine trait that adds a battery charger slot to the side of the machine UI + */ +public class BatterySlotTrait extends MachineTrait implements IAttachConfiguratorsTrait { + + public static final MachineTraitType TYPE = new MachineTraitType<>(BatterySlotTrait.class); + @SaveField + @Getter + private final CustomItemStackHandler storage; + + @Nullable + protected TickableSubscription batterySubs; + @Nullable + protected ISubscription energySubs; + + private final NotifiableEnergyContainer energyContainer; + + /** + * Creates a battery charger slot trait + * + * @param energyContainerToUse The energy container which the battery should draw energy from/push energy to. + */ + public BatterySlotTrait(NotifiableEnergyContainer energyContainerToUse) { + energyContainer = energyContainerToUse; + storage = new CustomItemStackHandler(1); + storage.setFilter(item -> GTCapabilityHelper.getElectricItem(item) != null || + (ConfigHolder.INSTANCE.compat.energy.nativeEUToFE && + GTCapabilityHelper.getForgeEnergyItem(item) != null)); + } + + @Override + public MachineTraitType getTraitType() { + return TYPE; + } + + @Override + public void onMachineLoad() { + if (!isRemote()) { + updateBatterySubscription(); + energySubs = energyContainer.addChangedListener(this::updateBatterySubscription); + storage.setOnContentsChanged(this::updateBatterySubscription); + } + } + + @Override + public void onMachineUnload() { + if (energySubs != null) { + energySubs.unsubscribe(); + energySubs = null; + } + } + + protected void updateBatterySubscription() { + if (energyContainer.dischargeOrRechargeEnergyContainers(storage, 0, true)) { + batterySubs = subscribeServerTick(batterySubs, this::chargeBattery); + } else if (batterySubs != null) { + batterySubs.unsubscribe(); + batterySubs = null; + } + } + + protected void chargeBattery() { + if (!energyContainer.dischargeOrRechargeEnergyContainers(storage, 0, false)) { + updateBatterySubscription(); + } + } + + @Override + public void onMachineDestroyed() { + storage.dropInventoryInWorld(getLevel(), getBlockPos()); + } + + @Override + public void attachRightConfigurators(Flow flow, ModularPanel panel, PanelSyncManager syncManager) { + flow.child(GTMuiWidgets.createBatterySlot(this, syncManager)); + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/trait/BedrockOreMinerLogic.java b/src/main/java/com/gregtechceu/gtceu/common/machine/trait/BedrockOreMinerLogic.java index 963ac93d9cf..cca21fc33bf 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/trait/BedrockOreMinerLogic.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/trait/BedrockOreMinerLogic.java @@ -8,7 +8,7 @@ import com.gregtechceu.gtceu.api.data.worldgen.bedrockore.BedrockOreVeinSavedData; import com.gregtechceu.gtceu.api.data.worldgen.bedrockore.OreVeinWorldEntry; import com.gregtechceu.gtceu.api.data.worldgen.bedrockore.WeightedMaterial; -import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeLogic; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.RecipeHelper; import com.gregtechceu.gtceu.common.machine.multiblock.electric.BedrockOreMinerMachine; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/trait/CentralMonitorLogic.java b/src/main/java/com/gregtechceu/gtceu/common/machine/trait/CentralMonitorLogic.java index 1e848526069..34002f4b7d3 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/trait/CentralMonitorLogic.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/trait/CentralMonitorLogic.java @@ -2,7 +2,7 @@ import com.gregtechceu.gtceu.api.GTValues; import com.gregtechceu.gtceu.api.capability.IWorkable; -import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeLogic; import com.gregtechceu.gtceu.api.misc.EnergyContainerList; import com.gregtechceu.gtceu.common.machine.multiblock.electric.CentralMonitorMachine; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/trait/CleanroomLogic.java b/src/main/java/com/gregtechceu/gtceu/common/machine/trait/CleanroomLogic.java index 541ab99d1d1..d90787ff4a5 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/trait/CleanroomLogic.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/trait/CleanroomLogic.java @@ -4,11 +4,11 @@ import com.gregtechceu.gtceu.api.capability.IEnergyContainer; import com.gregtechceu.gtceu.api.capability.IWorkable; import com.gregtechceu.gtceu.api.capability.recipe.EURecipeCapability; -import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMaintenanceMachine; -import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeLogic; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.common.capability.EnvironmentalHazardSavedData; import com.gregtechceu.gtceu.common.machine.multiblock.electric.CleanroomMachine; +import com.gregtechceu.gtceu.common.machine.multiblock.part.MaintenanceHatchPartMachine; import net.minecraft.network.chat.Component; import net.minecraft.server.level.ServerLevel; @@ -25,7 +25,7 @@ public class CleanroomLogic extends RecipeLogic implements IWorkable { public static final int BASE_CLEAN_AMOUNT = 2; @Setter @Nullable - private IMaintenanceMachine maintenanceMachine; + private MaintenanceHatchPartMachine maintenanceMachine; @Setter @Nullable private IEnergyContainer energyContainer; @@ -66,7 +66,7 @@ public void serverTick() { if (maintenanceMachine == null || maintenanceMachine.getNumMaintenanceProblems() < 6 || zone != null) { // drain the energy if (!consumeEnergy()) { - if (progress > 0 && getMachine().regressWhenWaiting()) { + if (progress > 0 && regressWhenWaiting) { this.progress = 1; } 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 0c455fbe89e..a2ec49acf62 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,7 +6,7 @@ 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.api.machine.trait.notifiable.NotifiableEnergyContainer; import com.gregtechceu.gtceu.api.sync_system.annotations.RerenderOnChanged; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/trait/EnvironmentalExplosionTrait.java b/src/main/java/com/gregtechceu/gtceu/common/machine/trait/EnvironmentalExplosionTrait.java index 2ed00fce29c..0c8413405db 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/trait/EnvironmentalExplosionTrait.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/trait/EnvironmentalExplosionTrait.java @@ -15,6 +15,9 @@ import java.util.function.BooleanSupplier; +/** + * Machine trait that makes a machine explode when exposed to weather. + */ public class EnvironmentalExplosionTrait extends MachineTrait { public static final MachineTraitType TYPE = new MachineTraitType<>( diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/trait/ExhaustVentMachineTrait.java b/src/main/java/com/gregtechceu/gtceu/common/machine/trait/ExhaustVentMachineTrait.java index b4e413eb320..2b8d90ef0d9 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/trait/ExhaustVentMachineTrait.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/trait/ExhaustVentMachineTrait.java @@ -3,8 +3,10 @@ import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.machine.trait.MachineTrait; import com.gregtechceu.gtceu.api.machine.trait.MachineTraitType; +import com.gregtechceu.gtceu.api.machine.trait.feature.IRecipeLogicModifierTrait; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.common.data.GTDamageTypes; +import com.gregtechceu.gtceu.common.recipe.condition.VentCondition; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.utils.GTUtil; @@ -23,7 +25,12 @@ import lombok.Getter; import lombok.Setter; -public class ExhaustVentMachineTrait extends MachineTrait { +/** + * Machine trait that adds an exhaust vent to a specific side of a machine. + * + * @see VentCondition + */ +public class ExhaustVentMachineTrait extends MachineTrait implements IRecipeLogicModifierTrait { public static final MachineTraitType TYPE = new MachineTraitType<>( ExhaustVentMachineTrait.class, false); @@ -56,6 +63,12 @@ public void onMachineLoad() { this.ventingDirection = getMachine().getFrontFacing().getOpposite(); } + @Override + public void afterWorking() { + needsVenting = true; + checkVenting(); + } + public boolean isVentingBlocked() { BlockPos ventingBlockPos = getBlockPos().relative(getVentingDirection()); BlockState state = getLevel().getBlockState(ventingBlockPos); diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/trait/FluidDrillLogic.java b/src/main/java/com/gregtechceu/gtceu/common/machine/trait/FluidDrillLogic.java index 2d4c5da5625..45be3c18f15 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/trait/FluidDrillLogic.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/trait/FluidDrillLogic.java @@ -4,7 +4,7 @@ import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.data.worldgen.bedrockfluid.BedrockFluidVeinSavedData; import com.gregtechceu.gtceu.api.data.worldgen.bedrockfluid.FluidVeinWorldEntry; -import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeLogic; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.RecipeHelper; import com.gregtechceu.gtceu.common.machine.multiblock.electric.FluidDrillMachine; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/trait/ProgrammableCircuitSlotTrait.java b/src/main/java/com/gregtechceu/gtceu/common/machine/trait/ProgrammableCircuitSlotTrait.java new file mode 100644 index 00000000000..2418ff6af9d --- /dev/null +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/trait/ProgrammableCircuitSlotTrait.java @@ -0,0 +1,120 @@ +package com.gregtechceu.gtceu.common.machine.trait; + +import com.gregtechceu.gtceu.api.capability.recipe.IO; +import com.gregtechceu.gtceu.api.capability.recipe.ItemRecipeCapability; +import com.gregtechceu.gtceu.api.capability.recipe.RecipeCapability; +import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; +import com.gregtechceu.gtceu.api.machine.multiblock.part.MultiblockPartMachine; +import com.gregtechceu.gtceu.api.machine.trait.ICapabilityTrait; +import com.gregtechceu.gtceu.api.machine.trait.MachineTraitType; +import com.gregtechceu.gtceu.api.machine.trait.feature.IAttachConfiguratorsTrait; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableItemStackHandler; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableRecipeHandlerTrait; +import com.gregtechceu.gtceu.api.recipe.GTRecipe; +import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; +import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; +import com.gregtechceu.gtceu.common.item.behavior.IntCircuitBehaviour; +import com.gregtechceu.gtceu.common.mui.GTMuiWidgets; + +import net.minecraft.world.item.crafting.Ingredient; + +import brachy.modularui.screen.ModularPanel; +import brachy.modularui.value.sync.PanelSyncManager; +import brachy.modularui.widgets.layout.Flow; +import lombok.Getter; +import lombok.Setter; + +import java.util.List; + +/** + * Machine trait which adds a programmable circuit input slot to the side of a machine. + */ +public class ProgrammableCircuitSlotTrait extends NotifiableRecipeHandlerTrait + implements IAttachConfiguratorsTrait, ICapabilityTrait { + + public static final MachineTraitType TYPE = new MachineTraitType<>( + ProgrammableCircuitSlotTrait.class); + + @SaveField + public final CustomItemStackHandler storage; + + @Getter + @Setter + private boolean enabled = true; + + public ProgrammableCircuitSlotTrait() { + storage = new CustomItemStackHandler(1); + storage.setFilter(IntCircuitBehaviour::isIntegratedCircuit); + } + + @Override + public MachineTraitType getTraitType() { + return TYPE; + } + + // Returns the current circuit value + public int getCurrentCircuit() { + return IntCircuitBehaviour.getCircuitConfiguration(storage.getStackInSlot(0)); + } + + public void setCurrentCircuit(int circuit) { + storage.setStackInSlot(0, IntCircuitBehaviour.stack(circuit)); + } + + @Override + public void attachLeftConfigurators(Flow flow, ModularPanel panel, PanelSyncManager syncManager) { + if (!enabled) return; + flow.child(GTMuiWidgets.createCircuitSlotPanel(this, panel, syncManager)); + } + + @Override + public void addedToController(MultiblockControllerMachine controller) { + if (!controller.allowCircuitSlots()) setEnabled(false); + } + + @Override + public void removedFromController(MultiblockControllerMachine controller) { + var allControllersAllowCircuits = true; + for (var c : ((MultiblockPartMachine) getMachine()).getControllers()) { + if (!c.allowCircuitSlots()) { + allControllersAllowCircuits = false; + break; + } + } + setEnabled(allControllersAllowCircuits); + } + + // Capability handler stuff + + @Override + public IO getHandlerIO() { + return enabled ? IO.IN : IO.NONE; + } + + @Override + public IO getCapabilityIO() { + return IO.NONE; + } + + @Override + public List handleRecipeInner(IO io, GTRecipe recipe, List left, + boolean simulate) { + if (!enabled) return left; + return NotifiableItemStackHandler.handleRecipe(io, recipe, left, simulate, getHandlerIO(), storage); + } + + @Override + public List getContents() { + return List.of(storage.getStackInSlot(0)); + } + + @Override + public double getTotalContentAmount() { + return 1; + } + + @Override + public RecipeCapability getCapability() { + return ItemRecipeCapability.CAP; + } +} diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/trait/customlogic/BreweryLogic.java b/src/main/java/com/gregtechceu/gtceu/common/machine/trait/customlogic/BreweryLogic.java index 065d89b49ee..777dbd11b77 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/trait/customlogic/BreweryLogic.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/trait/customlogic/BreweryLogic.java @@ -6,7 +6,7 @@ import com.gregtechceu.gtceu.api.capability.recipe.IRecipeHandler; import com.gregtechceu.gtceu.api.capability.recipe.ItemRecipeCapability; import com.gregtechceu.gtceu.api.data.tag.TagUtil; -import com.gregtechceu.gtceu.api.machine.trait.RecipeHandlerList; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeHandlerList; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.GTRecipeType; import com.gregtechceu.gtceu.api.recipe.ingredient.FluidIngredient; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/trait/customlogic/CannerLogic.java b/src/main/java/com/gregtechceu/gtceu/common/machine/trait/customlogic/CannerLogic.java index d39b156683e..81ad185ffbd 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/trait/customlogic/CannerLogic.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/trait/customlogic/CannerLogic.java @@ -5,7 +5,7 @@ import com.gregtechceu.gtceu.api.capability.recipe.IRecipeCapabilityHolder; import com.gregtechceu.gtceu.api.capability.recipe.IRecipeHandler; import com.gregtechceu.gtceu.api.capability.recipe.ItemRecipeCapability; -import com.gregtechceu.gtceu.api.machine.trait.RecipeHandlerList; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeHandlerList; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.GTRecipeType; import com.gregtechceu.gtceu.common.data.GTRecipeTypes; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/trait/customlogic/FormingPressLogic.java b/src/main/java/com/gregtechceu/gtceu/common/machine/trait/customlogic/FormingPressLogic.java index 65d8577b859..1b76a7f60ff 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/trait/customlogic/FormingPressLogic.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/trait/customlogic/FormingPressLogic.java @@ -4,7 +4,7 @@ import com.gregtechceu.gtceu.api.capability.recipe.IRecipeCapabilityHolder; import com.gregtechceu.gtceu.api.capability.recipe.IRecipeHandler; import com.gregtechceu.gtceu.api.capability.recipe.ItemRecipeCapability; -import com.gregtechceu.gtceu.api.machine.trait.RecipeHandlerList; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeHandlerList; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.GTRecipeType; import com.gregtechceu.gtceu.common.data.GTItems; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/trait/hazard/EnvironmentalHazardCleanerTrait.java b/src/main/java/com/gregtechceu/gtceu/common/machine/trait/hazard/EnvironmentalHazardCleanerTrait.java index 3d6ee0b10aa..ff184710736 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/trait/hazard/EnvironmentalHazardCleanerTrait.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/trait/hazard/EnvironmentalHazardCleanerTrait.java @@ -4,6 +4,7 @@ import com.gregtechceu.gtceu.api.data.medicalcondition.MedicalCondition; import com.gregtechceu.gtceu.api.machine.trait.MachineTrait; import com.gregtechceu.gtceu.api.machine.trait.MachineTraitType; +import com.gregtechceu.gtceu.api.machine.trait.feature.IRecipeLogicModifierTrait; import com.gregtechceu.gtceu.common.blockentity.DuctPipeBlockEntity; import com.gregtechceu.gtceu.common.capability.EnvironmentalHazardSavedData; import com.gregtechceu.gtceu.common.network.GTNetwork; @@ -24,7 +25,7 @@ import java.util.function.BiPredicate; -public class EnvironmentalHazardCleanerTrait extends MachineTrait { +public class EnvironmentalHazardCleanerTrait extends MachineTrait implements IRecipeLogicModifierTrait { public static final MachineTraitType TYPE = new MachineTraitType<>( EnvironmentalHazardCleanerTrait.class); @@ -55,6 +56,17 @@ public MachineTraitType getTraitType() { return TYPE; } + @Override + public boolean onWorking() { + cleanHazard(); + return true; + } + + @Override + public void afterWorking() { + endCleaningOperation(); + } + public boolean cleanHazard(MedicalCondition condition, float totalAmountToRemove) { if (cleaningHandler == null) return beginCleaningOperation(condition, totalAmountToRemove); return cleaningHandler.test(condition, totalAmountToRemove); diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/trait/hazard/EnvironmentalHazardEmitterTrait.java b/src/main/java/com/gregtechceu/gtceu/common/machine/trait/hazard/EnvironmentalHazardEmitterTrait.java index ec5805eca16..c3f230482b6 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/trait/hazard/EnvironmentalHazardEmitterTrait.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/trait/hazard/EnvironmentalHazardEmitterTrait.java @@ -6,6 +6,7 @@ import com.gregtechceu.gtceu.api.data.medicalcondition.MedicalCondition; import com.gregtechceu.gtceu.api.machine.trait.MachineTrait; import com.gregtechceu.gtceu.api.machine.trait.MachineTraitType; +import com.gregtechceu.gtceu.api.machine.trait.feature.IRecipeLogicModifierTrait; import com.gregtechceu.gtceu.common.capability.EnvironmentalHazardSavedData; import com.gregtechceu.gtceu.config.ConfigHolder; @@ -17,7 +18,7 @@ /** * trait for environmental hazard (e.g. pollution) emitters like mufflers. */ -public class EnvironmentalHazardEmitterTrait extends MachineTrait { +public class EnvironmentalHazardEmitterTrait extends MachineTrait implements IRecipeLogicModifierTrait { public static final MachineTraitType TYPE = new MachineTraitType<>( EnvironmentalHazardEmitterTrait.class); @@ -28,6 +29,9 @@ public class EnvironmentalHazardEmitterTrait extends MachineTrait { @Getter @Setter protected MedicalCondition conditionToEmit; + @Getter + @Setter + protected boolean emitHazardOnRecipeFinished = true; public EnvironmentalHazardEmitterTrait(MedicalCondition conditionToEmit, float emissionStrength) { @@ -41,6 +45,11 @@ public MachineTraitType getTraitType() { return TYPE; } + @Override + public void afterWorking() { + if (emitHazardOnRecipeFinished) emitHazard(); + } + public void emitHazard() { if (!ConfigHolder.INSTANCE.gameplay.environmentalHazards) { return; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/trait/miner/MinerLogic.java b/src/main/java/com/gregtechceu/gtceu/common/machine/trait/miner/MinerLogic.java index ec7dc1a3fa8..231d901d961 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/trait/miner/MinerLogic.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/trait/miner/MinerLogic.java @@ -5,8 +5,8 @@ import com.gregtechceu.gtceu.api.capability.recipe.*; import com.gregtechceu.gtceu.api.item.MaterialBlockItem; import com.gregtechceu.gtceu.api.item.tool.GTToolType; -import com.gregtechceu.gtceu.api.machine.trait.RecipeHandlerList; -import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeHandlerList; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeLogic; import com.gregtechceu.gtceu.api.misc.IgnoreEnergyRecipeHandler; import com.gregtechceu.gtceu.api.misc.ItemRecipeHandler; import com.gregtechceu.gtceu.api.recipe.GTRecipe; diff --git a/src/main/java/com/gregtechceu/gtceu/common/machine/trait/multiblock/MultiblockFluidRendererTrait.java b/src/main/java/com/gregtechceu/gtceu/common/machine/trait/multiblock/MultiblockFluidRendererTrait.java index bbcfd108ed2..c8aaaa035c6 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/machine/trait/multiblock/MultiblockFluidRendererTrait.java +++ b/src/main/java/com/gregtechceu/gtceu/common/machine/trait/multiblock/MultiblockFluidRendererTrait.java @@ -45,7 +45,7 @@ public void onStructureInvalid(String name) { } @Override - public MachineTraitType getTraitType() { + public MachineTraitType getTraitType() { return TYPE; } } diff --git a/src/main/java/com/gregtechceu/gtceu/common/mui/GTMuiMachineUtil.java b/src/main/java/com/gregtechceu/gtceu/common/mui/GTMuiMachineUtil.java index 4869b361dc5..f17360df03a 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/mui/GTMuiMachineUtil.java +++ b/src/main/java/com/gregtechceu/gtceu/common/mui/GTMuiMachineUtil.java @@ -1,6 +1,6 @@ package com.gregtechceu.gtceu.common.mui; -import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableFluidTank; import net.minecraftforge.items.IItemHandler; diff --git a/src/main/java/com/gregtechceu/gtceu/common/mui/GTMuiWidgets.java b/src/main/java/com/gregtechceu/gtceu/common/mui/GTMuiWidgets.java index b16337d8614..bae5eb53e54 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/mui/GTMuiWidgets.java +++ b/src/main/java/com/gregtechceu/gtceu/common/mui/GTMuiWidgets.java @@ -6,15 +6,14 @@ import com.gregtechceu.gtceu.api.cover.filter.Filter; import com.gregtechceu.gtceu.api.cover.filter.FilterHandler; import com.gregtechceu.gtceu.api.machine.MachineDefinition; -import com.gregtechceu.gtceu.api.machine.feature.IHasBatterySlot; -import com.gregtechceu.gtceu.api.machine.feature.IHasCircuitSlot; import com.gregtechceu.gtceu.api.machine.feature.IRecipeLogicMachine; import com.gregtechceu.gtceu.api.machine.feature.IVoidable; import com.gregtechceu.gtceu.api.machine.feature.multiblock.IDistinctPart; import com.gregtechceu.gtceu.common.cover.data.BucketMode; import com.gregtechceu.gtceu.common.item.behavior.IntCircuitBehaviour; import com.gregtechceu.gtceu.common.machine.trait.AutoOutputTrait; -import com.gregtechceu.gtceu.config.ConfigHolder; +import com.gregtechceu.gtceu.common.machine.trait.BatterySlotTrait; +import com.gregtechceu.gtceu.common.machine.trait.ProgrammableCircuitSlotTrait; import com.gregtechceu.gtceu.utils.GTMath; import net.minecraft.network.chat.Component; @@ -155,8 +154,8 @@ public static FluidSlot createTankWidget() { return new FluidSlot().size(20, 58).alwaysShowFull(false); } - public static ItemSlot createBatterySlot(IHasBatterySlot batterySlot, PanelSyncManager syncManager) { - ItemSlotSyncHandler battery = new ItemSlotSyncHandler(new ModularSlot(batterySlot.getChargerInventory(), 0)); + public static ItemSlot createBatterySlot(BatterySlotTrait batterySlot, PanelSyncManager syncManager) { + ItemSlotSyncHandler battery = new ItemSlotSyncHandler(new ModularSlot(batterySlot.getStorage(), 0)); syncManager.syncValue("battery", battery); return new ItemSlot().syncHandler("battery").background(GTGuiTextures.SLOT, GTGuiTextures.CHARGER_OVERLAY); } @@ -247,11 +246,12 @@ public static ModularPanel createCircuitSlotPanel(Consumer circuit return createCircuitSlotPanel(circuitSyncValue, syncManager); } - public static ButtonWidget createCircuitSlotPanel(IHasCircuitSlot machine, ModularPanel parentPanel, + public static ButtonWidget createCircuitSlotPanel(ProgrammableCircuitSlotTrait circuitTrait, + ModularPanel parentPanel, PanelSyncManager syncManager) { IntSyncValue circuitSyncValue = createCircuitSlotSyncValue( - i -> machine.getCircuitInventory().setStackInSlot(0, i), - () -> machine.getCircuitInventory().getStackInSlot(0)); + i -> circuitTrait.storage.setStackInSlot(0, i), + () -> circuitTrait.storage.getStackInSlot(0)); syncManager.syncValue("circuit_slot", circuitSyncValue); IPanelHandler circuitPanelHandler = syncManager.syncedPanel("circuit_panel", true, @@ -270,24 +270,22 @@ public static ButtonWidget createCircuitSlotPanel(IHasCircuitSlot machine, Mo return true; }) .onMouseScrolled((context, delta) -> { - int newValue = nextCircuitValue(machine.getCircuitInventory().getStackInSlot(0), + int newValue = nextCircuitValue(circuitTrait.storage.getStackInSlot(0), circuitSyncValue.getIntValue(), delta); circuitSyncValue.setValue(newValue); return true; }) .overlay(new DynamicDrawable(() -> { - if (machine.getCircuitInventory().getStackInSlot(0).isEmpty()) { + if (circuitTrait.storage.getStackInSlot(0).isEmpty()) { return new DrawableStack(new ItemDrawable(IntCircuitBehaviour.stack(0)), new ItemDrawable(Items.BARRIER)).asIcon().size(16); } - return new ItemDrawable(machine.getCircuitInventory().getStackInSlot(0)) + return new ItemDrawable(circuitTrait.storage.getStackInSlot(0)) .asIcon().size(16); })) .tooltipAutoUpdate(true) - .tooltipBuilder((r) -> r.addLine(Text.lang("metaitem.int_circuit.configuration", - (machine.getCircuitInventory().getStackInSlot(0).isEmpty() ? 0 : - IntCircuitBehaviour - .getCircuitConfiguration(machine.getCircuitInventory().getStackInSlot(0)))))); + .tooltipBuilder((r) -> r + .addLine(Text.lang("metaitem.int_circuit.configuration", circuitTrait.getCurrentCircuit()))); } private static int nextCircuitValue(ItemStack stack, int current, double delta) { @@ -304,10 +302,10 @@ private static int nextCircuitValue(ItemStack stack, int current, double delta) } } else { if (stack.isEmpty() || - (current == 0 && !ConfigHolder.INSTANCE.machines.ghostCircuit)) { + (current == 0)) { // if at no circuit, loop around to max return IntCircuitBehaviour.CIRCUIT_MAX; - } else if (current == 1 && ConfigHolder.INSTANCE.machines.ghostCircuit) { + } else if (current == 1) { // if at 1, skip 0 and return no circuit return -1; } else { diff --git a/src/main/java/com/gregtechceu/gtceu/common/mui/GTSingleblockMachinePanels.java b/src/main/java/com/gregtechceu/gtceu/common/mui/GTSingleblockMachinePanels.java index c33b570cf87..5e53a85ddb1 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/mui/GTSingleblockMachinePanels.java +++ b/src/main/java/com/gregtechceu/gtceu/common/mui/GTSingleblockMachinePanels.java @@ -6,7 +6,7 @@ import com.gregtechceu.gtceu.api.machine.SimpleTieredMachine; import com.gregtechceu.gtceu.api.machine.mui.MachineUIPanelBuilder; import com.gregtechceu.gtceu.api.machine.steam.SimpleSteamMachine; -import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeLogic; import com.gregtechceu.gtceu.api.mui.factory.PanelFactory; import com.gregtechceu.gtceu.api.recipe.GTRecipeType; import com.gregtechceu.gtceu.api.recipe.gui.GTRecipeTypeMachineWidget; diff --git a/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/AdjacentBlockCondition.java b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/AdjacentBlockCondition.java index bf5c11bacd4..8641992b2e9 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/AdjacentBlockCondition.java +++ b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/AdjacentBlockCondition.java @@ -1,6 +1,6 @@ package com.gregtechceu.gtceu.common.recipe.condition; -import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeLogic; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.RecipeCondition; import com.gregtechceu.gtceu.api.recipe.condition.RecipeConditionType; diff --git a/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/AdjacentFluidCondition.java b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/AdjacentFluidCondition.java index fa33a2e1344..aa30306905c 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/AdjacentFluidCondition.java +++ b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/AdjacentFluidCondition.java @@ -1,6 +1,6 @@ package com.gregtechceu.gtceu.common.recipe.condition; -import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeLogic; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.RecipeCondition; import com.gregtechceu.gtceu.api.recipe.condition.RecipeConditionType; diff --git a/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/BiomeCondition.java b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/BiomeCondition.java index bc5d111d7be..40f9c7a3c40 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/BiomeCondition.java +++ b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/BiomeCondition.java @@ -1,6 +1,6 @@ package com.gregtechceu.gtceu.common.recipe.condition; -import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeLogic; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.RecipeCondition; import com.gregtechceu.gtceu.api.recipe.condition.RecipeConditionType; diff --git a/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/BiomeTagCondition.java b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/BiomeTagCondition.java index ee222756789..034b231e5f2 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/BiomeTagCondition.java +++ b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/BiomeTagCondition.java @@ -1,6 +1,6 @@ package com.gregtechceu.gtceu.common.recipe.condition; -import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeLogic; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.RecipeCondition; import com.gregtechceu.gtceu.api.recipe.condition.RecipeConditionType; diff --git a/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/CleanroomCondition.java b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/CleanroomCondition.java index 1f145a383d3..489ac310c8c 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/CleanroomCondition.java +++ b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/CleanroomCondition.java @@ -3,7 +3,7 @@ import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.multiblock.CleanroomType; import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; -import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeLogic; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.RecipeCondition; import com.gregtechceu.gtceu.api.recipe.condition.RecipeConditionType; diff --git a/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/DaytimeCondition.java b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/DaytimeCondition.java index 73e2e41f4f0..0e900af748a 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/DaytimeCondition.java +++ b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/DaytimeCondition.java @@ -1,6 +1,6 @@ package com.gregtechceu.gtceu.common.recipe.condition; -import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeLogic; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.RecipeCondition; import com.gregtechceu.gtceu.api.recipe.condition.RecipeConditionType; diff --git a/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/DimensionCondition.java b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/DimensionCondition.java index d733acb6857..7324916428b 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/DimensionCondition.java +++ b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/DimensionCondition.java @@ -1,7 +1,7 @@ package com.gregtechceu.gtceu.common.recipe.condition; import com.gregtechceu.gtceu.api.data.DimensionMarker; -import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeLogic; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.RecipeCondition; import com.gregtechceu.gtceu.api.recipe.condition.RecipeConditionType; 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 2a9ca61e351..d40e456e2fe 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 @@ -1,7 +1,7 @@ package com.gregtechceu.gtceu.common.recipe.condition; import com.gregtechceu.gtceu.api.capability.IEnergyContainer; -import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeLogic; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.RecipeCondition; import com.gregtechceu.gtceu.api.recipe.condition.RecipeConditionType; diff --git a/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/EnvironmentalHazardCondition.java b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/EnvironmentalHazardCondition.java index c92075cb13e..fd6975014c5 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/EnvironmentalHazardCondition.java +++ b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/EnvironmentalHazardCondition.java @@ -1,7 +1,7 @@ package com.gregtechceu.gtceu.common.recipe.condition; import com.gregtechceu.gtceu.api.data.medicalcondition.MedicalCondition; -import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeLogic; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.RecipeCondition; import com.gregtechceu.gtceu.api.recipe.condition.RecipeConditionType; diff --git a/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/FTBQuestCondition.java b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/FTBQuestCondition.java index 47d917bc2fa..06102f58e4e 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/FTBQuestCondition.java +++ b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/FTBQuestCondition.java @@ -1,6 +1,6 @@ package com.gregtechceu.gtceu.common.recipe.condition; -import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeLogic; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.RecipeCondition; import com.gregtechceu.gtceu.api.recipe.condition.RecipeConditionType; diff --git a/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/GameStageCondition.java b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/GameStageCondition.java index e39fb1f1ae9..4bd84307fbb 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/GameStageCondition.java +++ b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/GameStageCondition.java @@ -1,6 +1,6 @@ package com.gregtechceu.gtceu.common.recipe.condition; -import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeLogic; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.RecipeCondition; import com.gregtechceu.gtceu.api.recipe.condition.RecipeConditionType; diff --git a/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/HeraclesQuestCondition.java b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/HeraclesQuestCondition.java index 75225f99bf8..e94eeed136a 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/HeraclesQuestCondition.java +++ b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/HeraclesQuestCondition.java @@ -1,6 +1,6 @@ package com.gregtechceu.gtceu.common.recipe.condition; -import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeLogic; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.RecipeCondition; import com.gregtechceu.gtceu.api.recipe.condition.RecipeConditionType; diff --git a/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/PositionYCondition.java b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/PositionYCondition.java index c167aaf2a4d..bcdd9aa2348 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/PositionYCondition.java +++ b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/PositionYCondition.java @@ -1,6 +1,6 @@ package com.gregtechceu.gtceu.common.recipe.condition; -import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeLogic; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.RecipeCondition; import com.gregtechceu.gtceu.api.recipe.condition.RecipeConditionType; diff --git a/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/RainingCondition.java b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/RainingCondition.java index 29a34d79784..26b488c93a9 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/RainingCondition.java +++ b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/RainingCondition.java @@ -1,6 +1,6 @@ package com.gregtechceu.gtceu.common.recipe.condition; -import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeLogic; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.RecipeCondition; import com.gregtechceu.gtceu.api.recipe.condition.RecipeConditionType; diff --git a/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/ResearchCondition.java b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/ResearchCondition.java index 27f1cbfc6f3..bd8c6e90e3f 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/ResearchCondition.java +++ b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/ResearchCondition.java @@ -1,6 +1,6 @@ package com.gregtechceu.gtceu.common.recipe.condition; -import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeLogic; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.RecipeCondition; import com.gregtechceu.gtceu.api.recipe.ResearchData; diff --git a/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/ThunderCondition.java b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/ThunderCondition.java index 72dd134679a..e60e9ee06f8 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/ThunderCondition.java +++ b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/ThunderCondition.java @@ -1,6 +1,6 @@ package com.gregtechceu.gtceu.common.recipe.condition; -import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeLogic; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.RecipeCondition; import com.gregtechceu.gtceu.api.recipe.condition.RecipeConditionType; diff --git a/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/VentCondition.java b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/VentCondition.java index 653e1f56b11..ca334c70b03 100644 --- a/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/VentCondition.java +++ b/src/main/java/com/gregtechceu/gtceu/common/recipe/condition/VentCondition.java @@ -1,6 +1,6 @@ package com.gregtechceu.gtceu.common.recipe.condition; -import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeLogic; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.RecipeCondition; import com.gregtechceu.gtceu.api.recipe.condition.RecipeConditionType; diff --git a/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java b/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java index 01e5666052c..9b846bd39fc 100644 --- a/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java +++ b/src/main/java/com/gregtechceu/gtceu/config/ConfigHolder.java @@ -573,10 +573,6 @@ public static class MachineConfigs { @Configurable.Synchronized public boolean gt6StylePipesCables = true; @Configurable - @Configurable.Comment({ "Whether the machine's circuit slot need to be inserted a real circuit." }) - @Configurable.Synchronized - public boolean ghostCircuit = true; - @Configurable @Configurable.Comment({ "Whether to add a \"Bedrock Ore Miner\" (also enables bedrock ore generation)", "Default: false" }) @Configurable.UpdateRestriction(UpdateRestrictions.GAME_RESTART) diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEBusPartMachine.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEBusPartMachine.java index f1c3ece8b61..03db5e7f4a1 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEBusPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEBusPartMachine.java @@ -3,6 +3,7 @@ import com.gregtechceu.gtceu.api.GTValues; import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.recipe.IO; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableItemStackHandler; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.common.machine.multiblock.part.ItemBusPartMachine; @@ -34,8 +35,8 @@ public abstract class MEBusPartMachine extends ItemBusPartMachine implements IGr protected final IActionSource actionSource; - public MEBusPartMachine(BlockEntityCreationInfo info, IO io) { - super(info, GTValues.LuV, io); + public MEBusPartMachine(BlockEntityCreationInfo info, IO io, NotifiableItemStackHandler inventory) { + super(info, GTValues.LuV, io, inventory); this.nodeHolder = attachTrait(new GridNodeHolder(this)); this.actionSource = IActionSource.ofMachine(nodeHolder.getMainNode()::getNode); } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEInputBusPartMachine.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEInputBusPartMachine.java index 9dc9630a05c..913cf13ccb2 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEInputBusPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEInputBusPartMachine.java @@ -3,9 +3,7 @@ import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.machine.feature.IDataStickInteractable; -import com.gregtechceu.gtceu.api.machine.feature.IHasCircuitSlot; -import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; -import com.gregtechceu.gtceu.common.item.behavior.IntCircuitBehaviour; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableItemStackHandler; import com.gregtechceu.gtceu.integration.ae2.gui.AEConfigWidget; import com.gregtechceu.gtceu.integration.ae2.slot.ExportOnlyAEItemList; import com.gregtechceu.gtceu.integration.ae2.slot.ExportOnlyAEItemSlot; @@ -36,14 +34,19 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class MEInputBusPartMachine extends MEBusPartMachine - implements IDataStickInteractable, IHasCircuitSlot { + implements IDataStickInteractable { protected final static int CONFIG_SIZE = 16; protected ExportOnlyAEItemList aeItemHandler; public MEInputBusPartMachine(BlockEntityCreationInfo info) { - super(info, IO.IN); + super(info, IO.IN, new ExportOnlyAEItemList(CONFIG_SIZE)); + aeItemHandler = (ExportOnlyAEItemList) getInventory(); + } + + public MEInputBusPartMachine(BlockEntityCreationInfo info, NotifiableItemStackHandler inventory) { + super(info, IO.IN, inventory); } ///////////////////////////////// @@ -55,12 +58,6 @@ public void onMachineDestroyed() { flushInventory(); } - @Override - protected NotifiableItemStackHandler createInventory() { - this.aeItemHandler = new ExportOnlyAEItemList(CONFIG_SIZE); - return this.aeItemHandler; - } - ///////////////////////////////// // ********** Sync ME *********// ///////////////////////////////// @@ -250,7 +247,7 @@ protected CompoundTag writeConfigToTag() { configStacks.put(Integer.toString(i), stackTag); } tag.putByte("GhostCircuit", - (byte) IntCircuitBehaviour.getCircuitConfiguration(circuitInventory.getStackInSlot(0))); + (byte) circuitSlot.getCurrentCircuit()); tag.putBoolean("DistinctBuses", isDistinct()); return tag; } @@ -269,7 +266,7 @@ protected void readConfigFromTag(CompoundTag tag) { } } if (tag.contains("GhostCircuit")) { - circuitInventory.setStackInSlot(0, IntCircuitBehaviour.stack(tag.getByte("GhostCircuit"))); + circuitSlot.setCurrentCircuit(tag.getByte("GhostCircuit")); } if (tag.contains("DistinctBuses")) { setDistinct(tag.getBoolean("DistinctBuses")); diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEInputHatchPartMachine.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEInputHatchPartMachine.java index 02ad4789c0b..18734efa196 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEInputHatchPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEInputHatchPartMachine.java @@ -3,9 +3,7 @@ import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.machine.feature.IDataStickInteractable; -import com.gregtechceu.gtceu.api.machine.feature.IHasCircuitSlot; -import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; -import com.gregtechceu.gtceu.common.item.behavior.IntCircuitBehaviour; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableFluidTank; import com.gregtechceu.gtceu.integration.ae2.gui.AEConfigWidget; import com.gregtechceu.gtceu.integration.ae2.slot.ExportOnlyAEFluidList; import com.gregtechceu.gtceu.integration.ae2.slot.ExportOnlyAEFluidSlot; @@ -39,7 +37,7 @@ @ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault public class MEInputHatchPartMachine extends MEHatchPartMachine - implements IDataStickInteractable, IHasCircuitSlot { + implements IDataStickInteractable { protected ExportOnlyAEFluidList aeFluidHandler; @@ -234,8 +232,7 @@ protected CompoundTag writeConfigToTag() { CompoundTag stackTag = GenericStack.writeTag(config); configStacks.put(Integer.toString(i), stackTag); } - tag.putByte("GhostCircuit", - (byte) IntCircuitBehaviour.getCircuitConfiguration(circuitInventory.getStackInSlot(0))); + tag.putByte("GhostCircuit", (byte) circuitSlot.getCurrentCircuit()); return tag; } @@ -253,7 +250,7 @@ protected void readConfigFromTag(CompoundTag tag) { } } if (tag.contains("GhostCircuit")) { - circuitInventory.setStackInSlot(0, IntCircuitBehaviour.stack(tag.getByte("GhostCircuit"))); + circuitSlot.setCurrentCircuit(tag.getByte("GhostCircuit")); } } } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEOutputBusPartMachine.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEOutputBusPartMachine.java index c4e65bc6760..cb694fece73 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEOutputBusPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEOutputBusPartMachine.java @@ -2,7 +2,7 @@ import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.recipe.IO; -import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableItemStackHandler; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; import com.gregtechceu.gtceu.integration.ae2.gui.AEKeyStorageSyncHandler; @@ -27,7 +27,10 @@ import brachy.modularui.widgets.DynamicSyncedWidget; import brachy.modularui.widgets.TextWidget; import brachy.modularui.widgets.layout.Flow; +import lombok.Getter; import lombok.NoArgsConstructor; +import lombok.Setter; +import org.jetbrains.annotations.Nullable; import java.util.Collections; import java.util.List; @@ -45,19 +48,14 @@ public class MEOutputBusPartMachine extends MEBusPartMachine { private KeyStorage internalBuffer; // Do not use KeyCounter, use our simple implementation public MEOutputBusPartMachine(BlockEntityCreationInfo info) { - super(info, IO.OUT); + super(info, IO.OUT, new InaccessibleInfiniteHandler()); + internalBuffer = ((InaccessibleInfiniteHandler) getInventory()).getInternalBuffer(); } ///////////////////////////////// // ***** Machine LifeCycle ****// ///////////////////////////////// - @Override - protected NotifiableItemStackHandler createInventory() { - this.internalBuffer = new KeyStorage(); - return new InaccessibleInfiniteHandler(); - } - @Override public void onMachineDestroyed() { var grid = getMainNode().getGrid(); @@ -131,10 +129,15 @@ public void buildMainUI(ParentWidget mainWidget, PosGuiData guiData, PanelSyn mainWidget.child(flow); } - private class InaccessibleInfiniteHandler extends NotifiableItemStackHandler { + private static class InaccessibleInfiniteHandler extends NotifiableItemStackHandler { + + @Getter + private KeyStorage internalBuffer; public InaccessibleInfiniteHandler() { super(1, IO.OUT, IO.NONE, ItemStackHandlerDelegate::new); + internalBuffer = new KeyStorage(); + ((ItemStackHandlerDelegate) storage).setKeyStorage(internalBuffer); internalBuffer.setOnContentsChanged(this::onContentsChanged); } @@ -155,7 +158,12 @@ public boolean isEmpty() { } @NoArgsConstructor - private class ItemStackHandlerDelegate extends CustomItemStackHandler { + private static class ItemStackHandlerDelegate extends CustomItemStackHandler { + + @Getter + @Setter + @Nullable + KeyStorage keyStorage = null; // Necessary for InaccessibleInfiniteHandler public ItemStackHandlerDelegate(Integer integer) { @@ -184,14 +192,16 @@ public void setStackInSlot(int slot, ItemStack stack) { @Override public ItemStack insertItem(int slot, ItemStack stack, boolean simulate) { + if (keyStorage == null) return stack; + var key = AEItemKey.of(stack); int count = stack.getCount(); - long oldValue = internalBuffer.storage.getOrDefault(key, 0); + long oldValue = keyStorage.storage.getOrDefault(key, 0); long changeValue = Math.min(Long.MAX_VALUE - oldValue, count); if (changeValue > 0) { if (!simulate) { - internalBuffer.storage.put(key, oldValue + changeValue); - internalBuffer.onChanged(); + keyStorage.storage.put(key, oldValue + changeValue); + keyStorage.onChanged(); } return stack.copyWithCount((int) (count - changeValue)); } else { diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEOutputHatchPartMachine.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEOutputHatchPartMachine.java index 5b6cd1339e4..64a83b2dfae 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEOutputHatchPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEOutputHatchPartMachine.java @@ -3,7 +3,7 @@ import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableFluidTank; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.ingredient.FluidIngredient; import com.gregtechceu.gtceu.api.recipe.ingredient.IntProviderFluidIngredient; diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEPatternBufferPartMachine.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEPatternBufferPartMachine.java index 5d641bfec27..9b48c14a4fd 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEPatternBufferPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEPatternBufferPartMachine.java @@ -8,9 +8,9 @@ import com.gregtechceu.gtceu.api.machine.feature.IDataStickInteractable; import com.gregtechceu.gtceu.api.machine.mui.MachineUIPanelBuilder; import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; -import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; -import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; -import com.gregtechceu.gtceu.api.machine.trait.RecipeHandlerList; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableFluidTank; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableItemStackHandler; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeHandlerList; import com.gregtechceu.gtceu.api.recipe.ingredient.FluidIngredient; import com.gregtechceu.gtceu.api.recipe.ingredient.SizedIngredient; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; @@ -149,7 +149,7 @@ public void setItemDirect(int slotIndex, ItemStack stack) { protected TickableSubscription updateSubs; public MEPatternBufferPartMachine(BlockEntityCreationInfo info) { - super(info, IO.IN); + super(info, IO.IN, new NotifiableItemStackHandler(9, IO.IN, IO.NONE)); patternInventory.setOnContentsChanged(() -> getSyncDataHolder().markClientSyncFieldDirty("patternInventory")); this.patternInventory.setFilter(stack -> stack.getItem() instanceof ProcessingPatternItem); for (int i = 0; i < this.internalInventory.length; i++) { @@ -479,7 +479,7 @@ public PatternContainerGroup getTerminalGroup() { Component.literal(customName), Collections.emptyList()); } else { - ItemStack circuitStack = isHasCircuitSlot() ? circuitInventory.storage.getStackInSlot(0) : + ItemStack circuitStack = circuitSlot.isEnabled() ? circuitSlot.storage.getStackInSlot(0) : ItemStack.EMPTY; int circuitConfiguration = circuitStack.isEmpty() ? -1 : IntCircuitBehaviour.getCircuitConfiguration(circuitStack); diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEPatternBufferProxyPartMachine.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEPatternBufferProxyPartMachine.java index ba45c56af45..cf7681d3da8 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEPatternBufferProxyPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEPatternBufferProxyPartMachine.java @@ -8,7 +8,7 @@ import com.gregtechceu.gtceu.api.machine.feature.IMuiMachine; import com.gregtechceu.gtceu.api.machine.mui.MachineUIPanelBuilder; import com.gregtechceu.gtceu.api.machine.multiblock.part.TieredIOPartMachine; -import com.gregtechceu.gtceu.api.machine.trait.RecipeHandlerList; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeHandlerList; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; import com.gregtechceu.gtceu.integration.ae2.machine.trait.ProxySlotRecipeHandler; diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEStockingBusPartMachine.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEStockingBusPartMachine.java index 6ea17c9dc85..02d5395a278 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEStockingBusPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEStockingBusPartMachine.java @@ -1,12 +1,10 @@ package com.gregtechceu.gtceu.integration.ae2.machine; import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; -import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; -import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; +import com.gregtechceu.gtceu.api.machine.multiblock.part.MultiblockPartMachine; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; -import com.gregtechceu.gtceu.common.item.behavior.IntCircuitBehaviour; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.integration.ae2.machine.feature.multiblock.IMEStockingPart; import com.gregtechceu.gtceu.integration.ae2.slot.ExportOnlyAEItemList; @@ -33,6 +31,7 @@ import org.jetbrains.annotations.Nullable; import java.util.Comparator; +import java.util.Objects; import java.util.PriorityQueue; import java.util.function.Predicate; @@ -59,9 +58,11 @@ public class MEStockingBusPartMachine extends MEInputBusPartMachine implements I private Predicate autoPullTest; public MEStockingBusPartMachine(BlockEntityCreationInfo info) { - super(info); + super(info, new ExportOnlyAEStockingItemList(CONFIG_SIZE)); this.autoPullTest = $ -> false; setOffsetBound(ticksPerCycle); + this.aeItemHandler = (ExportOnlyAEItemList) getInventory(); + ((ExportOnlyAEStockingItemList) getInventory()).setStockingBusPartMachine(this); } ///////////////////////////////// @@ -80,12 +81,6 @@ public void removedFromController(MultiblockControllerMachine controller) { super.removedFromController(controller); } - @Override - protected NotifiableItemStackHandler createInventory() { - this.aeItemHandler = new ExportOnlyAEStockingItemList(CONFIG_SIZE); - return this.aeItemHandler; - } - ///////////////////////////////// // ********** Sync ME *********// ///////////////////////////////// @@ -159,7 +154,7 @@ public boolean testConfiguredInOtherPart(@Nullable GenericStack config) { // Otherwise, we need to test for if the item is configured // in any stocking bus in the multi (besides ourselves). for (MultiblockControllerMachine controller : getControllers()) { - for (IMultiPart part : controller.getParts()) { + for (MultiblockPartMachine part : controller.getParts()) { if (part instanceof MEStockingBusPartMachine bus) { // We don't need to check for ourselves, as this case is handled elsewhere. if (bus == this || bus.isDistinct()) continue; @@ -285,7 +280,7 @@ protected CompoundTag writeConfigToTag() { CompoundTag tag = new CompoundTag(); tag.putBoolean("AutoPull", true); tag.putByte("GhostCircuit", - (byte) IntCircuitBehaviour.getCircuitConfiguration(circuitInventory.getStackInSlot(0))); + (byte) circuitSlot.getCurrentCircuit()); return tag; } @@ -294,7 +289,7 @@ protected void readConfigFromTag(CompoundTag tag) { if (tag.getBoolean("AutoPull")) { // if being set to auto-pull, no need to read the configured slots this.setAutoPull(true); - circuitInventory.setStackInSlot(0, IntCircuitBehaviour.stack(tag.getByte("GhostCircuit"))); + circuitSlot.setCurrentCircuit(tag.getByte("GhostCircuit")); return; } // set auto pull first to avoid issues with clearing the config after reading from the data stick @@ -302,15 +297,26 @@ protected void readConfigFromTag(CompoundTag tag) { super.readConfigFromTag(tag); } - private class ExportOnlyAEStockingItemList extends ExportOnlyAEItemList { + private static class ExportOnlyAEStockingItemList extends ExportOnlyAEItemList { + + @Getter + @Nullable + MEStockingBusPartMachine stockingBusPartMachine; public ExportOnlyAEStockingItemList(int slots) { super(slots, ExportOnlyAEStockingItemSlot::new); } + public void setStockingBusPartMachine(@Nullable MEStockingBusPartMachine stockingBusPartMachine) { + this.stockingBusPartMachine = stockingBusPartMachine; + for (var slot : ((ExportOnlyAEStockingItemSlot[]) inventory)) { + slot.setStockingBusPartMachine(stockingBusPartMachine); + } + } + @Override public boolean isAutoPull() { - return autoPull; + return Objects.requireNonNull(getStockingBusPartMachine()).isAutoPull(); } @Override @@ -323,13 +329,18 @@ public boolean hasStackInConfig(GenericStack stack, boolean checkExternal) { boolean inThisBus = super.hasStackInConfig(stack, false); if (inThisBus) return true; if (checkExternal) { - return testConfiguredInOtherPart(stack); + return Objects.requireNonNull(getStockingBusPartMachine()).testConfiguredInOtherPart(stack); } return false; } } - private class ExportOnlyAEStockingItemSlot extends ExportOnlyAEItemSlot { + private static class ExportOnlyAEStockingItemSlot extends ExportOnlyAEItemSlot { + + @Getter + @Setter + @Nullable + MEStockingBusPartMachine stockingBusPartMachine; public ExportOnlyAEStockingItemSlot() { super(); @@ -341,16 +352,17 @@ public ExportOnlyAEStockingItemSlot(@Nullable GenericStack config, @Nullable Gen @Override public ItemStack extractItem(int slot, int amount, boolean simulate) { - if (slot == 0 && this.stock != null) { + if (slot == 0 && this.stock != null && stockingBusPartMachine != null) { if (this.config != null) { // Extract the items from the real net to either validate (simulate) // or extract (modulate) when this is called - if (!isOnline()) return ItemStack.EMPTY; - MEStorage aeNetwork = getMainNode().getGrid().getStorageService().getInventory(); + if (!stockingBusPartMachine.isOnline()) return ItemStack.EMPTY; + MEStorage aeNetwork = stockingBusPartMachine.getMainNode().getGrid().getStorageService() + .getInventory(); Actionable action = simulate ? Actionable.SIMULATE : Actionable.MODULATE; var key = config.what(); - long extracted = aeNetwork.extract(key, amount, action, actionSource); + long extracted = aeNetwork.extract(key, amount, action, stockingBusPartMachine.actionSource); if (extracted > 0) { ItemStack resultStack = key instanceof AEItemKey itemKey ? diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEStockingHatchPartMachine.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEStockingHatchPartMachine.java index 59b41c04c80..8f7096600f0 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEStockingHatchPartMachine.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/MEStockingHatchPartMachine.java @@ -2,12 +2,11 @@ import com.gregtechceu.gtceu.api.blockentity.BlockEntityCreationInfo; import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; -import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; +import com.gregtechceu.gtceu.api.machine.multiblock.part.MultiblockPartMachine; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableFluidTank; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.sync_system.annotations.SyncToClient; -import com.gregtechceu.gtceu.common.item.behavior.IntCircuitBehaviour; import com.gregtechceu.gtceu.config.ConfigHolder; import com.gregtechceu.gtceu.integration.ae2.machine.feature.multiblock.IMEStockingPart; import com.gregtechceu.gtceu.integration.ae2.slot.ExportOnlyAEFluidList; @@ -149,7 +148,7 @@ public boolean testConfiguredInOtherPart(@Nullable GenericStack config) { if (!isFormed()) return false; for (MultiblockControllerMachine controller : getControllers()) { - for (IMultiPart part : controller.getParts()) { + for (MultiblockPartMachine part : controller.getParts()) { if (part instanceof MEStockingHatchPartMachine hatch) { if (hatch == this) continue; if (hatch.aeFluidHandler.hasStackInConfig(config, false)) { @@ -273,7 +272,7 @@ protected CompoundTag writeConfigToTag() { CompoundTag tag = new CompoundTag(); tag.putBoolean("AutoPull", true); tag.putByte("GhostCircuit", - (byte) IntCircuitBehaviour.getCircuitConfiguration(circuitInventory.getStackInSlot(0))); + (byte) circuitSlot.getCurrentCircuit()); return tag; } @@ -282,7 +281,7 @@ protected void readConfigFromTag(CompoundTag tag) { if (tag.getBoolean("AutoPull")) { // if being set to auto-pull, no need to read the configured slots this.setAutoPull(true); - circuitInventory.setStackInSlot(0, IntCircuitBehaviour.stack(tag.getByte("GhostCircuit"))); + circuitSlot.setCurrentCircuit(tag.getByte("GhostCircuit")); return; } // set auto pull first to avoid issues with clearing the config after reading from the data stick diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/feature/multiblock/IAutoPullPart.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/feature/multiblock/IAutoPullPart.java index 9b95de5957e..da33db72353 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/feature/multiblock/IAutoPullPart.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/feature/multiblock/IAutoPullPart.java @@ -1,28 +1,14 @@ package com.gregtechceu.gtceu.integration.ae2.machine.feature.multiblock; -import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMultiPart; - import appeng.api.stacks.GenericStack; import java.util.function.Predicate; -public interface IAutoPullPart extends IMultiPart { +public interface IAutoPullPart { boolean isAutoPull(); void setAutoPull(boolean autoPull); void setAutoPullTest(Predicate test); - - /* - * @Override - * default void attachConfigurators(ConfiguratorPanel configuratorPanel) { - * configuratorPanel.attachConfigurators(new IFancyConfiguratorButton.Toggle( - * GuiTextures.BUTTON_AUTO_PULL.getSubTexture(0, 0, 1, 0.5), - * GuiTextures.BUTTON_AUTO_PULL.getSubTexture(0, 0.5, 1, 0.5), - * this::isAutoPull, - * (clickData, pressed) -> setAutoPull(pressed)) - * .setTooltipsSupplier(pressed -> List.of(Component.translatable("gtceu.gui.me_bus.auto_pull_button")))); - * } - */ } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/feature/multiblock/IMEStockingPart.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/feature/multiblock/IMEStockingPart.java index dd2dc88e7f7..b596d329f54 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/feature/multiblock/IMEStockingPart.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/machine/feature/multiblock/IMEStockingPart.java @@ -26,7 +26,6 @@ public interface IMEStockingPart extends IAutoPullPart, IMuiMachine { - @Override default void addedToController(MultiblockControllerMachine controller, String name) { // ensure that no other stocking bus on this multiblock is configured to hold the same item. // that we have in our own bus. @@ -37,7 +36,6 @@ default void addedToController(MultiblockControllerMachine controller, String na controller.scheduleForNextServerTick(this::validateConfig); } - @Override default void removedFromController(MultiblockControllerMachine controller) { setAutoPullTest($ -> false); if (isAutoPull()) { 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 c7a6169d9f5..27abf49cae5 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 @@ -2,9 +2,9 @@ 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; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableRecipeHandlerTrait; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeHandlerGroupDistinctness; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeHandlerList; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.ingredient.FluidIngredient; import com.gregtechceu.gtceu.integration.ae2.machine.MEPatternBufferPartMachine; @@ -43,7 +43,7 @@ public SlotRHL(MEPatternBufferPartMachine buffer, InternalSlot slot, int idx) { super(IO.IN); itemRecipeHandler = buffer.attachTrait(new SlotItemRecipeHandler(slot, idx)); fluidRecipeHandler = buffer.attachTrait(new SlotFluidRecipeHandler(slot, idx)); - addHandlers(buffer.getCircuitInventory(), buffer.getShareInventory(), buffer.getShareTank(), + addHandlers(buffer.getCircuitSlot(), buffer.getShareInventory(), buffer.getShareTank(), itemRecipeHandler, fluidRecipeHandler); this.setGroup(RecipeHandlerGroupDistinctness.BUS_DISTINCT); } 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 26d69ee6867..b37f092ba87 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,6 +2,9 @@ import com.gregtechceu.gtceu.api.capability.recipe.*; import com.gregtechceu.gtceu.api.machine.trait.*; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableRecipeHandlerTrait; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeHandlerGroupDistinctness; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeHandlerList; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.ingredient.FluidIngredient; import com.gregtechceu.gtceu.integration.ae2.machine.MEPatternBufferPartMachine; @@ -66,7 +69,7 @@ public ProxyRHL(MEPatternBufferProxyPartMachine machine) { } public void setBuffer(MEPatternBufferPartMachine buffer, SlotRHL slotRHL) { - circuit.setProxy(buffer.getCircuitInventory()); + circuit.setProxy(buffer.getCircuitSlot()); sharedItem.setProxy(buffer.getShareInventory()); sharedFluid.setProxy(buffer.getShareTank()); slotItem.setProxy(slotRHL.getItemRecipeHandler()); diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/slot/ExportOnlyAEFluidList.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/slot/ExportOnlyAEFluidList.java index 9b7495268d2..3c9c2882546 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/slot/ExportOnlyAEFluidList.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/slot/ExportOnlyAEFluidList.java @@ -2,7 +2,7 @@ import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableFluidTank; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.transfer.fluid.CustomFluidTank; diff --git a/src/main/java/com/gregtechceu/gtceu/integration/ae2/slot/ExportOnlyAEItemList.java b/src/main/java/com/gregtechceu/gtceu/integration/ae2/slot/ExportOnlyAEItemList.java index b7672f118a1..2588d65fa06 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/ae2/slot/ExportOnlyAEItemList.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/ae2/slot/ExportOnlyAEItemList.java @@ -1,7 +1,7 @@ package com.gregtechceu.gtceu.integration.ae2.slot; import com.gregtechceu.gtceu.api.capability.recipe.IO; -import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableItemStackHandler; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.sync_system.annotations.SaveField; import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler; diff --git a/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/MaintenanceBlockProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/MaintenanceBlockProvider.java index dc3c1ca2c2c..49bf51f33ae 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/MaintenanceBlockProvider.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/MaintenanceBlockProvider.java @@ -1,10 +1,9 @@ package com.gregtechceu.gtceu.integration.jade.provider; import com.gregtechceu.gtceu.GTCEu; -import com.gregtechceu.gtceu.api.capability.GTCapabilityHelper; import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.api.machine.feature.multiblock.IMaintenanceMachine; import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; +import com.gregtechceu.gtceu.common.machine.multiblock.part.MaintenanceHatchPartMachine; import com.gregtechceu.gtceu.utils.GTUtil; import net.minecraft.ChatFormatting; @@ -23,7 +22,7 @@ import snownee.jade.api.config.IPluginConfig; import snownee.jade.api.ui.IElementHelper; -public class MaintenanceBlockProvider extends CapabilityBlockProvider { +public class MaintenanceBlockProvider extends CapabilityBlockProvider { public MaintenanceBlockProvider() { super(GTCEu.id("maintenance_info")); @@ -31,14 +30,12 @@ public MaintenanceBlockProvider() { @Nullable @Override - protected IMaintenanceMachine getCapability(Level level, BlockPos blockPos, @Nullable Direction direction) { - var cap = GTCapabilityHelper.getMaintenanceMachine(level, blockPos, direction); - if (cap != null) { - return cap; - } + protected MaintenanceHatchPartMachine getCapability(Level level, BlockPos blockPos, @Nullable Direction direction) { + if (level.getBlockEntity(blockPos) instanceof MaintenanceHatchPartMachine maintenanceHatchPartMachine) + return maintenanceHatchPartMachine; if (MetaMachine.getMachine(level, blockPos) instanceof MultiblockControllerMachine controller) { for (var part : controller.getParts()) { - if (part instanceof IMaintenanceMachine maintenanceMachine) { + if (part instanceof MaintenanceHatchPartMachine maintenanceMachine) { return maintenanceMachine; } } @@ -47,7 +44,7 @@ protected IMaintenanceMachine getCapability(Level level, BlockPos blockPos, @Nul } @Override - protected void write(CompoundTag compoundTag, IMaintenanceMachine maintenanceMachine) { + protected void write(CompoundTag compoundTag, MaintenanceHatchPartMachine maintenanceMachine) { compoundTag.putBoolean("hasProblems", maintenanceMachine.hasMaintenanceProblems()); if (maintenanceMachine.hasMaintenanceProblems()) { compoundTag.putInt("maintenanceProblems", maintenanceMachine.getMaintenanceProblems()); diff --git a/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/ParallelProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/ParallelProvider.java index 63ecc9a3358..2807c02d2e7 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/ParallelProvider.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/ParallelProvider.java @@ -2,8 +2,8 @@ import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.machine.MetaMachine; -import com.gregtechceu.gtceu.api.machine.feature.IRecipeLogicMachine; import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeLogic; import com.gregtechceu.gtceu.common.machine.multiblock.part.ParallelHatchPartMachine; import com.gregtechceu.gtceu.utils.FormattingUtil; @@ -29,12 +29,11 @@ protected CompoundTag write(MetaMachine machine) { if (machine instanceof ParallelHatchPartMachine parallelHatch) { compoundTag.putInt("parallel", parallelHatch.getCurrentParallel()); } else if (machine instanceof MultiblockControllerMachine controller) { - if (controller instanceof IRecipeLogicMachine rlm && - rlm.getRecipeLogic().isActive() && - rlm.getRecipeLogic().getLastRecipe() != null) { - compoundTag.putInt("parallel", rlm.getRecipeLogic().getLastRecipe().parallels); - compoundTag.putInt("batch", rlm.getRecipeLogic().getLastRecipe().batchParallels); - compoundTag.putInt("subtickParallel", rlm.getRecipeLogic().getLastRecipe().subtickParallels); + var recipeLogic = controller.getTrait(RecipeLogic.TYPE); + if (recipeLogic != null && recipeLogic.isActive() && recipeLogic.getLastRecipe() != null) { + compoundTag.putInt("parallel", recipeLogic.getLastRecipe().parallels); + compoundTag.putInt("batch", recipeLogic.getLastRecipe().batchParallels); + compoundTag.putInt("subtickParallel", recipeLogic.getLastRecipe().subtickParallels); compoundTag.putBoolean("exact", true); } else { controller.getParallelHatch() diff --git a/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/RecipeLogicProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/RecipeLogicProvider.java index 0868ace35ac..118e7db1953 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/RecipeLogicProvider.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/RecipeLogicProvider.java @@ -4,7 +4,7 @@ import com.gregtechceu.gtceu.api.GTValues; import com.gregtechceu.gtceu.api.machine.feature.IRecipeLogicMachine; import com.gregtechceu.gtceu.api.machine.steam.SimpleSteamMachine; -import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeLogic; import com.gregtechceu.gtceu.api.recipe.RecipeHelper; import com.gregtechceu.gtceu.client.util.TooltipHelper; import com.gregtechceu.gtceu.common.machine.multiblock.steam.SteamParallelMultiblockMachine; diff --git a/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/RecipeOutputProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/RecipeOutputProvider.java index 82be11a07ae..4d307e8d6e1 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/RecipeOutputProvider.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/RecipeOutputProvider.java @@ -3,7 +3,7 @@ import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.capability.recipe.FluidRecipeCapability; import com.gregtechceu.gtceu.api.capability.recipe.ItemRecipeCapability; -import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeLogic; import com.gregtechceu.gtceu.api.recipe.RecipeHelper; import com.gregtechceu.gtceu.api.recipe.content.ContentModifier; import com.gregtechceu.gtceu.api.recipe.ingredient.FluidIngredient; diff --git a/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/SteamBoilerBlockProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/SteamBoilerBlockProvider.java index 63c1685645e..84ba5cef922 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/SteamBoilerBlockProvider.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/SteamBoilerBlockProvider.java @@ -2,6 +2,7 @@ import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.machine.steam.SteamBoilerMachine; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeLogic; import com.gregtechceu.gtceu.utils.FormattingUtil; import net.minecraft.ChatFormatting; @@ -24,7 +25,7 @@ public SteamBoilerBlockProvider() { @Override protected CompoundTag write(SteamBoilerMachine machine) { CompoundTag data = new CompoundTag(); - data.putBoolean("isBurning", machine.getRecipeLogic().isWorking()); + data.putBoolean("isBurning", machine.getTraitOptional(RecipeLogic.TYPE).orElseThrow().isWorking()); data.putBoolean("hasWater", !machine.isHasNoWater()); data.putLong("steamProduction", machine.getTotalSteamOutput()); data.putInt("currentTemperature", machine.getCurrentTemperature()); diff --git a/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/TransformerBlockProvider.java b/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/TransformerBlockProvider.java index 603c2fe12c6..de6cd07f784 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/TransformerBlockProvider.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/jade/provider/TransformerBlockProvider.java @@ -26,7 +26,7 @@ protected CompoundTag write(TransformerMachine transformer) { tag.putInt("side", transformer.getFrontFacing().get3DDataValue()); tag.putBoolean("transformUp", transformer.isTransformUp()); tag.putInt("baseAmp", transformer.getBaseAmp()); - tag.putInt("baseVoltage", transformer.getTier()); + tag.putInt("baseVoltage", transformer.getDefinition().getTier()); return tag; } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/machine/KJSSteamMachineBuilder.java b/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/machine/KJSSteamMachineBuilder.java index 16d21bd0a9b..b16dee0e5df 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/machine/KJSSteamMachineBuilder.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/machine/KJSSteamMachineBuilder.java @@ -30,7 +30,7 @@ public class KJSSteamMachineBuilder extends BuilderBase { @Setter public transient SteamDefinitionFunction definition = (isHP, def) -> def.tier(isHP ? 1 : 0); - private transient MachineBuilder lowPressureBuilder = null, highPressureBuilder = null; + private transient MachineBuilder lowPressureBuilder = null, highPressureBuilder = null; private transient MachineDefinition hpValue = null; public KJSSteamMachineBuilder(ResourceLocation id) { @@ -104,6 +104,6 @@ public interface SteamCreationFunction { @FunctionalInterface public interface SteamDefinitionFunction { - void apply(boolean isHighPressure, MachineBuilder builder); + void apply(boolean isHighPressure, MachineBuilder builder); } } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/machine/KJSTieredMachineBuilder.java b/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/machine/KJSTieredMachineBuilder.java index ac1fa4bd609..9c0a5ef5962 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/machine/KJSTieredMachineBuilder.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/machine/KJSTieredMachineBuilder.java @@ -29,7 +29,7 @@ @Accessors(fluent = true, chain = true) public class KJSTieredMachineBuilder extends BuilderBase { - private final MachineBuilder[] builders = new MachineBuilder[TIER_COUNT]; + private final MachineBuilder[] builders = new MachineBuilder[TIER_COUNT]; @Setter public transient int[] tiers = GTMachineUtils.ELECTRIC_TIERS; @@ -63,7 +63,7 @@ public KJSTieredMachineBuilder(ResourceLocation id, TieredCreationFunction machi public void generateAssetJsons(@Nullable AssetJsonGenerator generator) { super.generateAssetJsons(generator); for (int tier : this.tiers) { - MachineBuilder builder = this.builders[tier]; + MachineBuilder builder = this.builders[tier]; if (builder != null) { builder.generateAssetJsons(generator); } @@ -71,10 +71,10 @@ public void generateAssetJsons(@Nullable AssetJsonGenerator generator) { } @Override - public void generateLang(@NotNull LangEventJS lang) { + public void generateLang(LangEventJS lang) { super.generateLang(lang); for (int tier : this.tiers) { - MachineBuilder builder = this.builders[tier]; + MachineBuilder builder = this.builders[tier]; if (builder != null) { builder.generateLang(lang); } @@ -92,7 +92,7 @@ public void generateLang(@NotNull LangEventJS lang) { MachineDefinition[] definitions = new MachineDefinition[TIER_COUNT]; for (final int tier : tiers) { String tierName = VN[tier].toLowerCase(Locale.ROOT); - MachineBuilder builder = GTRegistration.REGISTRATE.machine( + MachineBuilder builder = GTRegistration.REGISTRATE.machine( String.format("%s_%s", tierName, this.id.getPath()), holder -> machine.create(holder, tier, tankScalingFunction)); @@ -133,6 +133,6 @@ public interface CreationFunction { @FunctionalInterface public interface DefinitionFunction { - void apply(int tier, MachineBuilder builder); + void apply(int tier, MachineBuilder builder); } } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/machine/KJSTieredMultiblockBuilder.java b/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/machine/KJSTieredMultiblockBuilder.java index 4961497b932..30752a84860 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/machine/KJSTieredMultiblockBuilder.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/machine/KJSTieredMultiblockBuilder.java @@ -26,7 +26,7 @@ @Accessors(fluent = true, chain = true) public class KJSTieredMultiblockBuilder extends BuilderBase { - private final MultiblockMachineBuilder[] builders = new MultiblockMachineBuilder[TIER_COUNT]; + private final MultiblockMachineBuilder[] builders = new MultiblockMachineBuilder[TIER_COUNT]; @Setter public transient int[] tiers = GTMachineUtils.ELECTRIC_TIERS; @@ -48,7 +48,7 @@ public KJSTieredMultiblockBuilder(ResourceLocation id, TieredCreationFunction ma public void generateAssetJsons(@Nullable AssetJsonGenerator generator) { super.generateAssetJsons(generator); for (int tier : this.tiers) { - MultiblockMachineBuilder builder = this.builders[tier]; + MultiblockMachineBuilder builder = this.builders[tier]; if (builder != null) { builder.generateAssetJsons(generator); } @@ -59,7 +59,7 @@ public void generateAssetJsons(@Nullable AssetJsonGenerator generator) { public void generateLang(LangEventJS lang) { super.generateLang(lang); for (int tier : tiers) { - MultiblockMachineBuilder builder = this.builders[tier]; + MultiblockMachineBuilder builder = this.builders[tier]; if (builder != null) { builder.generateLang(lang); } @@ -77,7 +77,7 @@ public void generateLang(LangEventJS lang) { MultiblockMachineDefinition[] definitions = new MultiblockMachineDefinition[TIER_COUNT]; for (final int tier : tiers) { String tierName = VN[tier].toLowerCase(Locale.ROOT); - MultiblockMachineBuilder builder = GTRegistration.REGISTRATE.multiblock( + MultiblockMachineBuilder builder = GTRegistration.REGISTRATE.multiblock( String.format("%s_%s", tierName, this.id.getPath()), holder -> machine.create(holder, tier)); @@ -99,6 +99,6 @@ public interface TieredCreationFunction { @FunctionalInterface public interface DefinitionFunction { - void apply(int tier, MachineBuilder builder); + void apply(int tier, MachineBuilder builder); } } diff --git a/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/machine/KJSWrappingMultiblockBuilder.java b/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/machine/KJSWrappingMultiblockBuilder.java index dd460fae0e3..563b94492e8 100644 --- a/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/machine/KJSWrappingMultiblockBuilder.java +++ b/src/main/java/com/gregtechceu/gtceu/integration/kjs/builders/machine/KJSWrappingMultiblockBuilder.java @@ -74,15 +74,15 @@ public MultiblockMachineDefinition register() { " With id " + tieredBuilder.id); } - public static MultiblockMachineBuilder createKJSMulti(ResourceLocation id) { + public static MultiblockMachineBuilder createKJSMulti(ResourceLocation id) { return new MultiblockMachineBuilder<>(GTRegistration.REGISTRATE, id.getPath(), MetaMachineBlock::new, MetaMachineItem::new, WorkableElectricMultiblockMachine::new); } - public static MultiblockMachineBuilder createKJSMulti(ResourceLocation id, - KJSTieredMachineBuilder.CreationFunction machine) { + public static MultiblockMachineBuilder createKJSMulti(ResourceLocation id, + KJSTieredMachineBuilder.CreationFunction machine) { return new MultiblockMachineBuilder<>(GTRegistration.REGISTRATE, id.getPath(), MetaMachineBlock::new, MetaMachineItem::new, diff --git a/src/main/java/com/gregtechceu/gtceu/utils/DummyRecipeUtils.java b/src/main/java/com/gregtechceu/gtceu/utils/DummyRecipeUtils.java index a2ff8c937ee..65f49b0f944 100644 --- a/src/main/java/com/gregtechceu/gtceu/utils/DummyRecipeUtils.java +++ b/src/main/java/com/gregtechceu/gtceu/utils/DummyRecipeUtils.java @@ -1,8 +1,8 @@ package com.gregtechceu.gtceu.utils; import com.gregtechceu.gtceu.api.capability.recipe.*; -import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; -import com.gregtechceu.gtceu.api.machine.trait.RecipeHandlerList; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableItemStackHandler; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeHandlerList; import com.gregtechceu.gtceu.api.misc.EnergyContainerList; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.ingredient.EnergyStack; diff --git a/src/main/java/com/gregtechceu/gtceu/utils/GTStringUtils.java b/src/main/java/com/gregtechceu/gtceu/utils/GTStringUtils.java index 68918384ff4..f4c556d9dac 100644 --- a/src/main/java/com/gregtechceu/gtceu/utils/GTStringUtils.java +++ b/src/main/java/com/gregtechceu/gtceu/utils/GTStringUtils.java @@ -32,6 +32,7 @@ public class GTStringUtils { * @return the string form of the stack */ @NotNull + @SuppressWarnings("deprecation") public static String itemStackToString(@NotNull ItemStack stack) { ResourceLocation itemId = BuiltInRegistries.ITEM.getKey(stack.getItem()); return stack.getCount() + "x_" + itemId.getNamespace() + "_" + itemId.getPath(); @@ -50,6 +51,7 @@ public static int parseInt(String s) { } @NotNull + @SuppressWarnings("deprecation") public static String fluidStackToString(@NotNull FluidStack stack) { ResourceLocation fluidId = BuiltInRegistries.FLUID.getKey(stack.getFluid()); return stack.getAmount() + "x_" + fluidId.getNamespace() + "_" + fluidId.getPath(); diff --git a/src/main/java/com/gregtechceu/gtceu/utils/GTTransferUtils.java b/src/main/java/com/gregtechceu/gtceu/utils/GTTransferUtils.java index 643d173da1b..6e856220aa2 100644 --- a/src/main/java/com/gregtechceu/gtceu/utils/GTTransferUtils.java +++ b/src/main/java/com/gregtechceu/gtceu/utils/GTTransferUtils.java @@ -1,6 +1,6 @@ package com.gregtechceu.gtceu.utils; -import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableFluidTank; import com.gregtechceu.gtceu.api.transfer.fluid.FluidHandlerList; import net.minecraft.core.BlockPos; diff --git a/src/main/java/com/gregtechceu/gtceu/utils/InfiniteEnergyContainer.java b/src/main/java/com/gregtechceu/gtceu/utils/InfiniteEnergyContainer.java index 3885e7ed8f4..018f8ef71e8 100644 --- a/src/main/java/com/gregtechceu/gtceu/utils/InfiniteEnergyContainer.java +++ b/src/main/java/com/gregtechceu/gtceu/utils/InfiniteEnergyContainer.java @@ -1,6 +1,6 @@ package com.gregtechceu.gtceu.utils; -import com.gregtechceu.gtceu.api.machine.trait.NotifiableEnergyContainer; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableEnergyContainer; public class InfiniteEnergyContainer extends NotifiableEnergyContainer { diff --git a/src/main/java/com/gregtechceu/gtceu/utils/OverlayedTankHandler.java b/src/main/java/com/gregtechceu/gtceu/utils/OverlayedTankHandler.java index bbc473061e4..25a65e38c19 100644 --- a/src/main/java/com/gregtechceu/gtceu/utils/OverlayedTankHandler.java +++ b/src/main/java/com/gregtechceu/gtceu/utils/OverlayedTankHandler.java @@ -1,7 +1,7 @@ package com.gregtechceu.gtceu.utils; import com.gregtechceu.gtceu.api.capability.recipe.IRecipeHandler; -import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableFluidTank; import net.minecraftforge.fluids.FluidStack; diff --git a/src/main/java/com/gregtechceu/gtceu/utils/data/TagCompatibilityFixer.java b/src/main/java/com/gregtechceu/gtceu/utils/data/TagCompatibilityFixer.java index aa3acd8cdba..4e8f600a200 100644 --- a/src/main/java/com/gregtechceu/gtceu/utils/data/TagCompatibilityFixer.java +++ b/src/main/java/com/gregtechceu/gtceu/utils/data/TagCompatibilityFixer.java @@ -1,5 +1,11 @@ package com.gregtechceu.gtceu.utils.data; +import com.gregtechceu.gtceu.api.machine.MetaMachine; +import com.gregtechceu.gtceu.api.machine.trait.MachineTraitType; +import com.gregtechceu.gtceu.common.machine.trait.AutoOutputTrait; +import com.gregtechceu.gtceu.common.machine.trait.BatterySlotTrait; +import com.gregtechceu.gtceu.common.machine.trait.ProgrammableCircuitSlotTrait; + import net.minecraft.core.Direction; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.Tag; @@ -7,28 +13,70 @@ import lombok.AccessLevel; import lombok.NoArgsConstructor; +import java.util.Objects; + @NoArgsConstructor(access = AccessLevel.PRIVATE) public final class TagCompatibilityFixer { - public static void fixMachineAutoOutputTag(CompoundTag machineTag) { - if (!machineTag.contains("autoOutput")) { - var outputTag = new CompoundTag(); - Tag itemOutputDirection = machineTag.get("outputFacingItems"); - Tag fluidOutputDirection = machineTag.get("outputFacingFluids"); - Tag autoOutputItems = machineTag.get("autoOutputItems"); - Tag autoOutputFluids = machineTag.get("autoOutputFluids"); - Tag allowInputItems = machineTag.get("allowInputFromOutputSideItems"); - Tag allowInputFluids = machineTag.get("allowInputFromOutputSideFluids"); - if (itemOutputDirection != null) outputTag.put("itemOutputDirection", itemOutputDirection); - if (fluidOutputDirection != null) outputTag.put("fluidOutputDirection", fluidOutputDirection); - if (autoOutputItems != null) outputTag.put("autoOutputItems", autoOutputItems); - if (autoOutputFluids != null) outputTag.put("autoOutputFluids", autoOutputFluids); - if (allowInputItems != null) outputTag.put("allowItemInputFromOutputSide", allowInputItems); - if (allowInputFluids != null) outputTag.put("allowFluidInputFromOutputSide", allowInputFluids); - machineTag.put("autoOutput", outputTag); + public static void putTraitTag(MetaMachine machine, CompoundTag machineTag, + MachineTraitType type, String defaultName, + CompoundTag data) { + var traits = machine.getTraits(type); + + if (traits.size() != 1 || traits.get(0).getTraitName() == null) { + machineTag.put(defaultName, data); + return; + } + + var persistent = traits.get(0).getTraitName(); + machineTag.getCompound("traitHolder").put(Objects.requireNonNull(persistent), data); + } + + public static void fixTraitTags(MetaMachine machine, CompoundTag tag) { + if (!tag.contains("traitHolder")) { + tag.put("traitHolder", new CompoundTag()); + + fixBatterySlotTag(machine, tag); + fixProgrammedCircutTag(machine, tag); + fixMachineAutoOutputTag(machine, tag); } } + public static void fixBatterySlotTag(MetaMachine machine, CompoundTag tag) { + if (tag.contains("chargerInventory")) { + var newTag = new CompoundTag(); + newTag.put("storage", Objects.requireNonNull(tag.get("chargerInventory"))); + + putTraitTag(machine, tag, BatterySlotTrait.TYPE, "batterySlot", newTag); + } + } + + public static void fixProgrammedCircutTag(MetaMachine machine, CompoundTag tag) { + if (tag.contains("circuitInventory")) { + var oldData = tag.getCompound("circuitInventory"); + + putTraitTag(machine, tag, ProgrammableCircuitSlotTrait.TYPE, "circuitSlot", oldData); + } + } + + public static void fixMachineAutoOutputTag(MetaMachine machine, CompoundTag machineTag) { + var outputTag = new CompoundTag(); + Tag itemOutputDirection = machineTag.get("outputFacingItems"); + Tag fluidOutputDirection = machineTag.get("outputFacingFluids"); + Tag autoOutputItems = machineTag.get("autoOutputItems"); + Tag autoOutputFluids = machineTag.get("autoOutputFluids"); + Tag allowInputItems = machineTag.get("allowInputFromOutputSideItems"); + Tag allowInputFluids = machineTag.get("allowInputFromOutputSideFluids"); + if (itemOutputDirection != null) outputTag.put("itemOutputDirection", itemOutputDirection); + if (fluidOutputDirection != null) outputTag.put("fluidOutputDirection", fluidOutputDirection); + if (autoOutputItems != null) outputTag.put("autoOutputItems", autoOutputItems); + if (autoOutputFluids != null) outputTag.put("autoOutputFluids", autoOutputFluids); + if (allowInputItems != null) outputTag.put("allowItemInputFromOutputSide", allowInputItems); + if (allowInputFluids != null) outputTag.put("allowFluidInputFromOutputSide", allowInputFluids); + + putTraitTag(machine, machineTag, AutoOutputTrait.TYPE, "autoOutput", outputTag); + } + public static Direction fixUpwardsFacing(Direction frontfacing, Direction upwardsFacing) { Direction newUpwards; switch (frontfacing) { diff --git a/src/test/java/com/gregtechceu/gtceu/api/machine/trait/RecipeLogicTest.java b/src/test/java/com/gregtechceu/gtceu/api/machine/trait/RecipeLogicTest.java index ee805409491..35153cca056 100644 --- a/src/test/java/com/gregtechceu/gtceu/api/machine/trait/RecipeLogicTest.java +++ b/src/test/java/com/gregtechceu/gtceu/api/machine/trait/RecipeLogicTest.java @@ -3,6 +3,8 @@ import com.gregtechceu.gtceu.GTCEu; import com.gregtechceu.gtceu.api.GTValues; import com.gregtechceu.gtceu.api.machine.multiblock.WorkableMultiblockMachine; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableItemStackHandler; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeLogic; import com.gregtechceu.gtceu.api.recipe.GTRecipe; import com.gregtechceu.gtceu.api.recipe.GTRecipeType; import com.gregtechceu.gtceu.common.data.GTRecipeTypes; diff --git a/src/test/java/com/gregtechceu/gtceu/api/recipe/OverclockLogicTest.java b/src/test/java/com/gregtechceu/gtceu/api/recipe/OverclockLogicTest.java index d7f08579e89..4e0e17bceb2 100644 --- a/src/test/java/com/gregtechceu/gtceu/api/recipe/OverclockLogicTest.java +++ b/src/test/java/com/gregtechceu/gtceu/api/recipe/OverclockLogicTest.java @@ -7,8 +7,8 @@ import com.gregtechceu.gtceu.api.capability.recipe.ItemRecipeCapability; import com.gregtechceu.gtceu.api.machine.SimpleTieredMachine; import com.gregtechceu.gtceu.api.machine.multiblock.WorkableMultiblockMachine; -import com.gregtechceu.gtceu.api.machine.trait.NotifiableEnergyContainer; -import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableEnergyContainer; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableItemStackHandler; import com.gregtechceu.gtceu.common.data.GTRecipeTypes; import com.gregtechceu.gtceu.common.machine.multiblock.part.ItemBusPartMachine; import com.gregtechceu.gtceu.gametest.util.TestUtils; diff --git a/src/test/java/com/gregtechceu/gtceu/api/recipe/ingredient/IntProviderFluidIngredientTest.java b/src/test/java/com/gregtechceu/gtceu/api/recipe/ingredient/IntProviderFluidIngredientTest.java index 3f28d1e1d55..5bd6f396e7d 100644 --- a/src/test/java/com/gregtechceu/gtceu/api/recipe/ingredient/IntProviderFluidIngredientTest.java +++ b/src/test/java/com/gregtechceu/gtceu/api/recipe/ingredient/IntProviderFluidIngredientTest.java @@ -9,8 +9,8 @@ import com.gregtechceu.gtceu.api.machine.SimpleTieredMachine; import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; import com.gregtechceu.gtceu.api.machine.multiblock.WorkableMultiblockMachine; -import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; -import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableFluidTank; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableItemStackHandler; import com.gregtechceu.gtceu.api.recipe.GTRecipeType; import com.gregtechceu.gtceu.common.data.GTMaterials; import com.gregtechceu.gtceu.common.data.GTRecipeTypes; diff --git a/src/test/java/com/gregtechceu/gtceu/api/recipe/ingredient/IntProviderIngredientTest.java b/src/test/java/com/gregtechceu/gtceu/api/recipe/ingredient/IntProviderIngredientTest.java index 964ca0a02a6..0749e30ea37 100644 --- a/src/test/java/com/gregtechceu/gtceu/api/recipe/ingredient/IntProviderIngredientTest.java +++ b/src/test/java/com/gregtechceu/gtceu/api/recipe/ingredient/IntProviderIngredientTest.java @@ -8,7 +8,7 @@ import com.gregtechceu.gtceu.api.machine.SimpleTieredMachine; import com.gregtechceu.gtceu.api.machine.multiblock.WorkableElectricMultiblockMachine; import com.gregtechceu.gtceu.api.machine.multiblock.WorkableMultiblockMachine; -import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableItemStackHandler; import com.gregtechceu.gtceu.api.recipe.GTRecipeType; import com.gregtechceu.gtceu.common.data.GTRecipeTypes; import com.gregtechceu.gtceu.common.machine.multiblock.part.FluidHatchPartMachine; diff --git a/src/test/java/com/gregtechceu/gtceu/api/recipe/ingredient/NBTPredicateTest.java b/src/test/java/com/gregtechceu/gtceu/api/recipe/ingredient/NBTPredicateTest.java index 0a3e68518a4..b93a10287dc 100644 --- a/src/test/java/com/gregtechceu/gtceu/api/recipe/ingredient/NBTPredicateTest.java +++ b/src/test/java/com/gregtechceu/gtceu/api/recipe/ingredient/NBTPredicateTest.java @@ -5,7 +5,7 @@ import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.capability.recipe.ItemRecipeCapability; import com.gregtechceu.gtceu.api.machine.SimpleTieredMachine; -import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableItemStackHandler; import com.gregtechceu.gtceu.api.recipe.GTRecipeType; import com.gregtechceu.gtceu.api.recipe.ingredient.nbtpredicate.NBTPredicate; import com.gregtechceu.gtceu.gametest.util.TestUtils; diff --git a/src/test/java/com/gregtechceu/gtceu/common/cover/AdvancedDetectorCoverTest.java b/src/test/java/com/gregtechceu/gtceu/common/cover/AdvancedDetectorCoverTest.java index 3ea3611e07b..115bbfadb8a 100644 --- a/src/test/java/com/gregtechceu/gtceu/common/cover/AdvancedDetectorCoverTest.java +++ b/src/test/java/com/gregtechceu/gtceu/common/cover/AdvancedDetectorCoverTest.java @@ -6,7 +6,7 @@ import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.SimpleTieredMachine; -import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableFluidTank; import com.gregtechceu.gtceu.common.cover.detector.AdvancedFluidDetectorCover; import com.gregtechceu.gtceu.common.cover.detector.AdvancedItemDetectorCover; import com.gregtechceu.gtceu.common.data.GTItems; diff --git a/src/test/java/com/gregtechceu/gtceu/common/recipe/condition/AdjacentFluidConditionTest.java b/src/test/java/com/gregtechceu/gtceu/common/recipe/condition/AdjacentFluidConditionTest.java index cc67d2c6f7d..59bdb67ef21 100644 --- a/src/test/java/com/gregtechceu/gtceu/common/recipe/condition/AdjacentFluidConditionTest.java +++ b/src/test/java/com/gregtechceu/gtceu/common/recipe/condition/AdjacentFluidConditionTest.java @@ -5,7 +5,7 @@ import com.gregtechceu.gtceu.api.capability.recipe.IO; import com.gregtechceu.gtceu.api.capability.recipe.ItemRecipeCapability; import com.gregtechceu.gtceu.api.machine.SimpleTieredMachine; -import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler; +import com.gregtechceu.gtceu.api.machine.trait.notifiable.NotifiableItemStackHandler; import com.gregtechceu.gtceu.api.recipe.GTRecipeType; import com.gregtechceu.gtceu.common.data.GTRecipeTypes; import com.gregtechceu.gtceu.gametest.util.TestUtils; diff --git a/src/test/java/com/gregtechceu/gtceu/gametest/util/TestUtils.java b/src/test/java/com/gregtechceu/gtceu/gametest/util/TestUtils.java index 76a6fd2904f..f40502836eb 100644 --- a/src/test/java/com/gregtechceu/gtceu/gametest/util/TestUtils.java +++ b/src/test/java/com/gregtechceu/gtceu/gametest/util/TestUtils.java @@ -12,7 +12,7 @@ import com.gregtechceu.gtceu.api.machine.MachineDefinition; import com.gregtechceu.gtceu.api.machine.MetaMachine; import com.gregtechceu.gtceu.api.machine.multiblock.MultiblockControllerMachine; -import com.gregtechceu.gtceu.api.machine.trait.RecipeLogic; +import com.gregtechceu.gtceu.api.machine.trait.recipe.RecipeLogic; import com.gregtechceu.gtceu.api.placeholder.MultiLineComponent; import com.gregtechceu.gtceu.api.recipe.GTRecipeType; import com.gregtechceu.gtceu.api.registry.GTRegistries;